@polyester/sdk 0.14.2 → 0.15.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/dist/core-client.js +1 -1
- package/dist/gen/ledger/read/v1/ledger_read_pb.d.ts +8 -0
- package/dist/gen/ledger/read/v1/ledger_read_pb.d.ts.map +1 -1
- package/dist/gen/ledger/read/v1/ledger_read_pb.js +1 -1
- package/dist/gen/ledger/read/v1/ledger_read_pb.js.map +1 -1
- package/dist/services/address-book/address-book.schemas.d.ts +1 -1
- package/dist/services/address-book/address-book.schemas.d.ts.map +1 -1
- package/dist/services/address-book/address-book.schemas.js +2 -1
- package/dist/services/address-book/address-book.schemas.js.map +1 -1
- package/dist/services/candles/candles.d.ts.map +1 -1
- package/dist/services/candles/candles.js +2 -1
- package/dist/services/candles/candles.js.map +1 -1
- package/dist/services/candles/candles.schemas.d.ts +1 -1
- package/dist/services/candles/candles.schemas.d.ts.map +1 -1
- package/dist/services/candles/candles.schemas.js +3 -2
- package/dist/services/candles/candles.schemas.js.map +1 -1
- package/dist/services/chain-analytics/chain-analytics.schemas.d.ts.map +1 -1
- package/dist/services/chain-analytics/chain-analytics.schemas.js +5 -5
- package/dist/services/chain-analytics/chain-analytics.schemas.js.map +1 -1
- package/dist/services/deposit/deposit.schemas.d.ts +3 -3
- package/dist/services/deposit/deposit.schemas.d.ts.map +1 -1
- package/dist/services/deposit/deposit.schemas.js +4 -4
- package/dist/services/deposit/deposit.schemas.js.map +1 -1
- package/dist/services/guard-signer/guard-signer.schemas.d.ts +2 -2
- package/dist/services/guard-signer/guard-signer.schemas.d.ts.map +1 -1
- package/dist/services/guard-signer/guard-signer.schemas.js +2 -1
- package/dist/services/guard-signer/guard-signer.schemas.js.map +1 -1
- package/dist/services/heatmap/heatmap.d.ts.map +1 -1
- package/dist/services/heatmap/heatmap.js +2 -1
- package/dist/services/heatmap/heatmap.js.map +1 -1
- package/dist/services/heatmap/heatmap.schemas.d.ts +1 -1
- package/dist/services/heatmap/heatmap.schemas.d.ts.map +1 -1
- package/dist/services/heatmap/heatmap.schemas.js +2 -1
- package/dist/services/heatmap/heatmap.schemas.js.map +1 -1
- package/dist/services/internal-transfers/internal-transfers.schemas.d.ts +2 -2
- package/dist/services/internal-transfers/internal-transfers.schemas.d.ts.map +1 -1
- package/dist/services/internal-transfers/internal-transfers.schemas.js +3 -2
- package/dist/services/internal-transfers/internal-transfers.schemas.js.map +1 -1
- package/dist/services/lifecycle/lifecycle.schemas.d.ts +42 -42
- package/dist/services/market-data/market-data.d.ts.map +1 -1
- package/dist/services/market-data/market-data.js +2 -1
- package/dist/services/market-data/market-data.js.map +1 -1
- package/dist/services/market-data/market-data.schemas.d.ts +1 -1
- package/dist/services/market-data/market-data.schemas.js +2 -2
- package/dist/services/market-data/market-data.schemas.js.map +1 -1
- package/dist/services/market-overview/market-overview.schemas.d.ts +1 -1
- package/dist/services/market-overview/market-overview.schemas.js +2 -2
- package/dist/services/market-overview/market-overview.schemas.js.map +1 -1
- package/dist/services/orders/orders-input.schemas.d.ts +1 -1
- package/dist/services/orders/orders-modify.schemas.js +1 -1
- package/dist/services/orders/orders-output.schemas.d.ts +6 -6
- package/dist/services/orders/orders-risk.schemas.d.ts.map +1 -1
- package/dist/services/orders/orders-risk.schemas.js +3 -4
- package/dist/services/orders/orders-risk.schemas.js.map +1 -1
- package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.d.ts +9 -9
- package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.d.ts.map +1 -1
- package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.js +17 -8
- package/dist/services/policies/subaccount-policies/subaccount-policies.schemas.js.map +1 -1
- package/dist/services/shared.js +4 -2
- package/dist/services/shared.js.map +1 -1
- package/dist/services/subaccounts/subaccounts.schemas.d.ts +5 -5
- package/dist/services/trading-withdraws/trading-withdraws.schemas.d.ts +2 -2
- package/dist/services/trading-withdraws/trading-withdraws.schemas.d.ts.map +1 -1
- package/dist/services/trading-withdraws/trading-withdraws.schemas.js +3 -2
- package/dist/services/trading-withdraws/trading-withdraws.schemas.js.map +1 -1
- package/dist/services/trailing-oneof-inputs.js +3 -1
- package/dist/services/trailing-oneof-inputs.js.map +1 -1
- package/dist/services/transfers/transfers.schemas.d.ts +7 -0
- package/dist/services/transfers/transfers.schemas.d.ts.map +1 -1
- package/dist/services/transfers/transfers.schemas.js +2 -1
- package/dist/services/transfers/transfers.schemas.js.map +1 -1
- package/dist/services/triggers/trigger-input.schemas.d.ts +2 -2
- package/dist/services/triggers/trigger-input.schemas.d.ts.map +1 -1
- package/dist/services/triggers/trigger-input.schemas.js +3 -3
- package/dist/services/triggers/trigger-input.schemas.js.map +1 -1
- package/dist/services/triggers/triggers-output.schemas.d.ts +18 -18
- package/dist/shared/decimal-surface.d.ts.map +1 -1
- package/dist/shared/decimal-surface.js.map +1 -1
- package/dist/shared/schemas.js +4 -4
- package/dist/shared/schemas.js.map +1 -1
- package/dist/utils/numbers.js +1 -10
- package/dist/utils/numbers.js.map +1 -1
- package/package.json +1 -1
|
@@ -31,62 +31,62 @@ declare const CreateTriggerResultSchema: v.SchemaWithPipe<readonly [v.ObjectSche
|
|
|
31
31
|
type CreateTriggerResult = v.InferOutput<typeof CreateTriggerResultSchema>;
|
|
32
32
|
declare const CancelTriggerResultSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
|
|
33
33
|
readonly triggerId: v.SchemaWithPipe<readonly [v.BigintSchema<undefined>, v.TransformAction<bigint, string>]>;
|
|
34
|
-
readonly status: v.SchemaWithPipe<readonly [v.EnumSchema<typeof TriggerStatus, undefined>, v.TransformAction<TriggerStatus, "unspecified" | "
|
|
34
|
+
readonly status: v.SchemaWithPipe<readonly [v.EnumSchema<typeof TriggerStatus, undefined>, v.TransformAction<TriggerStatus, "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused">]>;
|
|
35
35
|
readonly tsNs: v.BigintSchema<undefined>;
|
|
36
36
|
}, undefined>, v.TransformAction<{
|
|
37
37
|
triggerId: string;
|
|
38
|
-
status: "unspecified" | "
|
|
38
|
+
status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
|
|
39
39
|
tsNs: bigint;
|
|
40
40
|
}, {
|
|
41
41
|
ts: number;
|
|
42
42
|
tsNs: string;
|
|
43
43
|
triggerId: string;
|
|
44
|
-
status: "unspecified" | "
|
|
44
|
+
status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
|
|
45
45
|
}>]>;
|
|
46
46
|
type CancelTriggerResult = v.InferOutput<typeof CancelTriggerResultSchema>;
|
|
47
47
|
declare const ModifyTriggerResultSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
|
|
48
48
|
readonly triggerId: v.SchemaWithPipe<readonly [v.BigintSchema<undefined>, v.TransformAction<bigint, string>]>;
|
|
49
|
-
readonly status: v.SchemaWithPipe<readonly [v.EnumSchema<typeof TriggerStatus, undefined>, v.TransformAction<TriggerStatus, "unspecified" | "
|
|
49
|
+
readonly status: v.SchemaWithPipe<readonly [v.EnumSchema<typeof TriggerStatus, undefined>, v.TransformAction<TriggerStatus, "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused">]>;
|
|
50
50
|
readonly tsNs: v.BigintSchema<undefined>;
|
|
51
51
|
}, undefined>, v.TransformAction<{
|
|
52
52
|
triggerId: string;
|
|
53
|
-
status: "unspecified" | "
|
|
53
|
+
status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
|
|
54
54
|
tsNs: bigint;
|
|
55
55
|
}, {
|
|
56
56
|
ts: number;
|
|
57
57
|
tsNs: string;
|
|
58
58
|
triggerId: string;
|
|
59
|
-
status: "unspecified" | "
|
|
59
|
+
status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
|
|
60
60
|
}>]>;
|
|
61
61
|
type ModifyTriggerResult = v.InferOutput<typeof ModifyTriggerResultSchema>;
|
|
62
62
|
declare const PauseTriggerResultSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
|
|
63
63
|
readonly triggerId: v.SchemaWithPipe<readonly [v.BigintSchema<undefined>, v.TransformAction<bigint, string>]>;
|
|
64
|
-
readonly status: v.SchemaWithPipe<readonly [v.EnumSchema<typeof TriggerStatus, undefined>, v.TransformAction<TriggerStatus, "unspecified" | "
|
|
64
|
+
readonly status: v.SchemaWithPipe<readonly [v.EnumSchema<typeof TriggerStatus, undefined>, v.TransformAction<TriggerStatus, "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused">]>;
|
|
65
65
|
readonly tsNs: v.BigintSchema<undefined>;
|
|
66
66
|
}, undefined>, v.TransformAction<{
|
|
67
67
|
triggerId: string;
|
|
68
|
-
status: "unspecified" | "
|
|
68
|
+
status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
|
|
69
69
|
tsNs: bigint;
|
|
70
70
|
}, {
|
|
71
71
|
ts: number;
|
|
72
72
|
tsNs: string;
|
|
73
73
|
triggerId: string;
|
|
74
|
-
status: "unspecified" | "
|
|
74
|
+
status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
|
|
75
75
|
}>]>;
|
|
76
76
|
type PauseTriggerResult = v.InferOutput<typeof PauseTriggerResultSchema>;
|
|
77
77
|
declare const ResumeTriggerResultSchema: v.SchemaWithPipe<readonly [v.ObjectSchema<{
|
|
78
78
|
readonly triggerId: v.SchemaWithPipe<readonly [v.BigintSchema<undefined>, v.TransformAction<bigint, string>]>;
|
|
79
|
-
readonly status: v.SchemaWithPipe<readonly [v.EnumSchema<typeof TriggerStatus, undefined>, v.TransformAction<TriggerStatus, "unspecified" | "
|
|
79
|
+
readonly status: v.SchemaWithPipe<readonly [v.EnumSchema<typeof TriggerStatus, undefined>, v.TransformAction<TriggerStatus, "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused">]>;
|
|
80
80
|
readonly tsNs: v.BigintSchema<undefined>;
|
|
81
81
|
}, undefined>, v.TransformAction<{
|
|
82
82
|
triggerId: string;
|
|
83
|
-
status: "unspecified" | "
|
|
83
|
+
status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
|
|
84
84
|
tsNs: bigint;
|
|
85
85
|
}, {
|
|
86
86
|
ts: number;
|
|
87
87
|
tsNs: string;
|
|
88
88
|
triggerId: string;
|
|
89
|
-
status: "unspecified" | "
|
|
89
|
+
status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
|
|
90
90
|
}>]>;
|
|
91
91
|
type ResumeTriggerResult = v.InferOutput<typeof ResumeTriggerResultSchema>;
|
|
92
92
|
type StopDetailsOutput = {
|
|
@@ -528,7 +528,7 @@ declare function createTriggerSchema(scales: SdkScales): v.SchemaWithPipe<readon
|
|
|
528
528
|
triggerId: string;
|
|
529
529
|
subaccountId: string;
|
|
530
530
|
symbolId: number;
|
|
531
|
-
status: "unspecified" | "
|
|
531
|
+
status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
|
|
532
532
|
parentOrderId: string | undefined;
|
|
533
533
|
qty: string;
|
|
534
534
|
feeAsset: "unspecified" | "quote" | "base";
|
|
@@ -669,7 +669,7 @@ declare function createTriggerSchema(scales: SdkScales): v.SchemaWithPipe<readon
|
|
|
669
669
|
triggerId: string;
|
|
670
670
|
subaccountId: string;
|
|
671
671
|
symbolId: number;
|
|
672
|
-
status: "unspecified" | "
|
|
672
|
+
status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
|
|
673
673
|
parentOrderId: string | undefined;
|
|
674
674
|
qty: string;
|
|
675
675
|
feeAsset: "unspecified" | "quote" | "base";
|
|
@@ -810,7 +810,7 @@ declare function createTriggerSchema(scales: SdkScales): v.SchemaWithPipe<readon
|
|
|
810
810
|
triggerId: string;
|
|
811
811
|
subaccountId: string;
|
|
812
812
|
symbolId: number;
|
|
813
|
-
status: "unspecified" | "
|
|
813
|
+
status: "unspecified" | "completed" | "failed" | "cancelled" | "created" | "armed" | "running" | "paused";
|
|
814
814
|
parentOrderId: string | undefined;
|
|
815
815
|
qty: string;
|
|
816
816
|
feeAsset: "unspecified" | "quote" | "base";
|
|
@@ -994,7 +994,7 @@ declare function createTriggerEventSchema(scales: SdkScales): v.SchemaWithPipe<r
|
|
|
994
994
|
subaccountId: string;
|
|
995
995
|
symbolId: number;
|
|
996
996
|
triggerType: "unspecified" | "twap" | "ladder" | "stop_loss" | "take_profit" | "trailing_stop";
|
|
997
|
-
eventType: "unspecified" | "
|
|
997
|
+
eventType: "unspecified" | "failed" | "updated" | "fired" | "canceled";
|
|
998
998
|
ts: number;
|
|
999
999
|
childSeq: number;
|
|
1000
1000
|
childOrderId: string | undefined;
|
|
@@ -1006,7 +1006,7 @@ declare function createTriggerEventSchema(scales: SdkScales): v.SchemaWithPipe<r
|
|
|
1006
1006
|
subaccountId: string;
|
|
1007
1007
|
symbolId: number;
|
|
1008
1008
|
triggerType: "unspecified" | "twap" | "ladder" | "stop_loss" | "take_profit" | "trailing_stop";
|
|
1009
|
-
eventType: "unspecified" | "
|
|
1009
|
+
eventType: "unspecified" | "failed" | "updated" | "fired" | "canceled";
|
|
1010
1010
|
ts: number;
|
|
1011
1011
|
childSeq: number;
|
|
1012
1012
|
childOrderId: string | undefined;
|
|
@@ -1018,7 +1018,7 @@ declare function createTriggerEventSchema(scales: SdkScales): v.SchemaWithPipe<r
|
|
|
1018
1018
|
subaccountId: string;
|
|
1019
1019
|
symbolId: number;
|
|
1020
1020
|
triggerType: "unspecified" | "twap" | "ladder" | "stop_loss" | "take_profit" | "trailing_stop";
|
|
1021
|
-
eventType: "unspecified" | "
|
|
1021
|
+
eventType: "unspecified" | "failed" | "updated" | "fired" | "canceled";
|
|
1022
1022
|
ts: number;
|
|
1023
1023
|
childSeq: number;
|
|
1024
1024
|
childOrderId: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decimal-surface.d.ts","names":[],"sources":["../../src/shared/decimal-surface.ts"],"mappings":";;;;;;;
|
|
1
|
+
{"version":3,"file":"decimal-surface.d.ts","names":[],"sources":["../../src/shared/decimal-surface.ts"],"mappings":";;;;;;;UAwCiB;EACb,SAAS;EACT;EACA,QAAQ,MAAM;EACd,YAAY,MAAM;EAClB,aAAa;EACb,kBAAkB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decimal-surface.js","names":[],"sources":["../../src/shared/decimal-surface.ts"],"sourcesContent":["/**\n * Internal scaled⇄decimal bridge for the SDK's public decimal-string surface.\n *\n * The wire protocol carries scaled integers (price ticks, per-asset scaled\n * quantities); the public SDK surface carries plain decimal strings. Output\n * schemas convert exactly (no rounding, trailing zeros trimmed); input schemas\n * accept zero padding but reject fractional precision that remains above the\n * scale after trailing zeros are removed. Scaled integers must not escape\n * through any service input or output.\n */\nimport {\n scaledToDecimal,\n tryDecimalToScaled,\n type DecimalToScaledFailure,\n} from \"../catalogs/decimal.js\";\nimport {\n CatalogConversionError,\n CatalogLookupError,\n CatalogNotReadyError,\n type ClientCatalog,\n type PairCatalogKey,\n} from \"../catalogs/types.js\";\nimport { PRICE_SCALE } from \"../catalogs/readers.js\";\nimport { PROTOBUF_INT64_MAX } from \"./wire-bounds.js\";\n\n/** On-chain unified-asset amounts (`amountE18`) are always 18-decimal scaled. */\nexport const E18_SCALE = 18;\n\n/**\n * Resolves wire scales for the SDK's internal decimal conversion. Backed by\n * the client catalog; `ready()` must be awaited before the synchronous lookups\n * are used so the catalog can answer them.\n */\nexport interface SdkScales {\n ready(): Promise<void>;\n price(): number;\n baseQty(pair: PairCatalogKey): number;\n quoteAmount(pair: PairCatalogKey): number;\n ledgerAmount(ledgerAssetId: number): number;\n zippedAssetAmount(zippedAssetId: number): number;\n}\n\n/**\n * Catalog-backed scale resolver. Takes a getter so it can be constructed\n * before the owning client has assigned its catalog.\n */\nexport function createCatalogSdkScales(getCatalog: () => ClientCatalog): SdkScales {\n return {\n ready: async () => {\n await getCatalog().ensureReady();\n },\n price: () => PRICE_SCALE,\n baseQty: (pair) => requirePair(getCatalog(), pair).baseAsset.quantityScale,\n quoteAmount: (pair) => requirePair(getCatalog(), pair).quoteAsset.quantityScale,\n ledgerAmount: (ledgerAssetId) => {\n const ledger = getCatalog().ledger;\n if (!ledger.isKnownAssetId(ledgerAssetId)) {\n throw new CatalogLookupError(\"ledger\", \"ledgerId\", ledgerAssetId);\n }\n return ledger.requireAssetByLedgerId(ledgerAssetId).quantityScale;\n },\n zippedAssetAmount: (zippedAssetId) =>\n getCatalog().zipper.requireAssetChainByZippedAssetId(zippedAssetId).asset.quantityScale,\n };\n}\n\nfunction requirePair(catalog: ClientCatalog, pair: PairCatalogKey) {\n return typeof pair === \"string\" || (typeof pair === \"object\" && \"symbol\" in pair)\n ? catalog.market.requirePairBySymbol(typeof pair === \"string\" ? pair : pair.symbol)\n : catalog.market.requirePairBySymbolId(typeof pair === \"number\" ? pair : pair.symbolId);\n}\n\n/** Output direction: exact scaled→decimal conversion (`1500000n`@6 → `\"1.5\"`). */\nexport function scaledToDecimalOutput(value: bigint, scale: number): string {\n return scaledToDecimal(value, scale);\n}\n\nfunction conversionFailureMessage(\n field: string,\n value: string,\n failure: DecimalToScaledFailure,\n): string {\n return failure.reason === \"precision\"\n ? `${field} supports at most ${failure.maxDecimals} decimal places: ${value}`\n : `${field} must be a non-negative decimal number: ${value}`;\n}\n\n/**\n * Input direction: strict decimal→scaled conversion. Throws\n * CatalogConversionError for non-decimal input or inexact excess precision.\n */\nexport function decimalInputToScaled(field: string, value: string, scale: number): bigint {\n const result = tryDecimalToScaled(value.trim(), scale);\n if (!result.ok) {\n throw new CatalogConversionError(\n field,\n conversionFailureMessage(field, value, result.failure),\n );\n }\n return result.scaled;\n}\n\nfunction unboundedPositiveDecimalInputToScaled(\n field: string,\n value: string,\n scale: number,\n): bigint {\n const scaled = decimalInputToScaled(field, value, scale);\n if (scaled <= 0n) {\n throw new CatalogConversionError(field, `${field} must be greater than 0: ${value}`);\n }\n return scaled;\n}\n\n/**\n * Converts a positive decimal input to a scaled protobuf `int64` value.\n * Rejects values above the wire-format ceiling before serialization.\n */\nexport function positiveDecimalInputToScaled(field: string, value: string, scale: number): bigint {\n const scaled = unboundedPositiveDecimalInputToScaled(field, value, scale);\n if (scaled > PROTOBUF_INT64_MAX) {\n throw new CatalogConversionError(\n field,\n `${field} exceeds the maximum supported value: ${value}`,\n );\n }\n return scaled;\n}\n\n/**\n * Decimal quantity → PolyesterChain E18 ledger units.\n * Input precision is capped at the asset's quantityScale; the wire value is\n * always upscaled to E18 (trading balances / amount_e18 convention).\n */\nexport function quantityInputToE18(params: {\n scales: SdkScales;\n assetId: number;\n quantity: string;\n field?: string;\n}): bigint {\n const field = params.field ?? \"quantity\";\n const assetScale = params.scales.ledgerAmount(params.assetId);\n if (assetScale > E18_SCALE) {\n throw new CatalogConversionError(\n field,\n `${field} asset quantityScale ${assetScale} exceeds E18 ledger scale`,\n );\n }\n return (\n unboundedPositiveDecimalInputToScaled(field, params.quantity, assetScale) *\n 10n ** BigInt(E18_SCALE - assetScale)\n );\n}\n\nexport interface ReadyGate {\n /** Queues or delivers one transition while the gate remains active. */\n run(deliver: () => void): void;\n /** Drops pending transitions and permanently prevents future delivery. */\n close(): void;\n}\n\ninterface ReadyGateHandlers {\n onDeliveryError?: (error: unknown) => void;\n onTerminalError: (error: unknown) => void;\n}\n\nconst READY_GATE_MAX_PENDING_DELIVERIES = 1_024;\n\n/**\n * Transition event delivery behind catalog readiness. Events arriving before the\n * catalog can resolve scales are queued and flushed in arrival order once it\n * is ready. Delivery errors are isolated from the transport. Readiness failure\n * or queue overflow is terminal because dropping an event would break stream\n * continuity; the owning subscription must visibly terminate when notified.\n */\nexport function createReadyGate(\n ready: () => Promise<void>,\n handlers: ReadyGateHandlers,\n): ReadyGate {\n let state: \"pending\" | \"open\" | \"closed\" = \"pending\";\n const queue: Array<() => void> = [];\n\n const deliverIsolated = (deliver: () => void) => {\n try {\n deliver();\n } catch (error) {\n handlers.onDeliveryError?.(error);\n }\n };\n\n const closeWithError = (error: unknown) => {\n if (state === \"closed\") return;\n state = \"closed\";\n queue.length = 0;\n handlers.onTerminalError(error);\n };\n\n Promise.resolve()\n .then(ready)\n .then(\n () => {\n if (state !== \"pending\") return;\n state = \"open\";\n for (const deliver of queue.splice(0)) deliverIsolated(deliver);\n },\n (error) => {\n if (state !== \"pending\") return;\n closeWithError(error);\n },\n );\n\n return {\n run(deliver) {\n if (state === \"open\") deliverIsolated(deliver);\n else if (state === \"pending\") {\n if (queue.length === READY_GATE_MAX_PENDING_DELIVERIES) {\n closeWithError(new CatalogNotReadyError());\n return;\n }\n queue.push(deliver);\n }\n },\n close() {\n if (state === \"closed\") return;\n state = \"closed\";\n queue.length = 0;\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"decimal-surface.js","names":[],"sources":["../../src/shared/decimal-surface.ts"],"sourcesContent":["/**\n * Internal scaled⇄decimal bridge for the SDK's public decimal-string surface.\n *\n * The wire protocol carries scaled integers (price ticks, per-asset scaled\n * quantities); the public SDK surface carries plain decimal strings. Output\n * schemas convert exactly (no rounding, trailing zeros trimmed); input schemas\n * accept zero padding but reject fractional precision that remains above the\n * scale after trailing zeros are removed. Scaled integers must not escape\n * through any service input or output.\n */\nimport {\n scaledToDecimal,\n tryDecimalToScaled,\n type DecimalToScaledFailure,\n} from \"../catalogs/decimal.js\";\nimport {\n CatalogConversionError,\n CatalogLookupError,\n CatalogNotReadyError,\n type ClientCatalog,\n type PairCatalogKey,\n} from \"../catalogs/types.js\";\nimport { PRICE_SCALE } from \"../catalogs/readers.js\";\nimport { PROTOBUF_INT64_MAX } from \"./wire-bounds.js\";\n\n/** On-chain unified-asset amounts (`amountE18`) are always 18-decimal scaled. */\nexport const E18_SCALE = 18;\n\n/**\n * Policy notional caps (`max_order_notional`) are canonical quote microunits:\n * one unit is 0.000001 USDT, per the `auth.v1` policy contract. Fixed by the\n * protocol rather than per-pair, so it needs no catalog lookup.\n */\nexport const QUOTE_NOTIONAL_SCALE = 6;\n\n/**\n * Resolves wire scales for the SDK's internal decimal conversion. Backed by\n * the client catalog; `ready()` must be awaited before the synchronous lookups\n * are used so the catalog can answer them.\n */\nexport interface SdkScales {\n ready(): Promise<void>;\n price(): number;\n baseQty(pair: PairCatalogKey): number;\n quoteAmount(pair: PairCatalogKey): number;\n ledgerAmount(ledgerAssetId: number): number;\n zippedAssetAmount(zippedAssetId: number): number;\n}\n\n/**\n * Catalog-backed scale resolver. Takes a getter so it can be constructed\n * before the owning client has assigned its catalog.\n */\nexport function createCatalogSdkScales(getCatalog: () => ClientCatalog): SdkScales {\n return {\n ready: async () => {\n await getCatalog().ensureReady();\n },\n price: () => PRICE_SCALE,\n baseQty: (pair) => requirePair(getCatalog(), pair).baseAsset.quantityScale,\n quoteAmount: (pair) => requirePair(getCatalog(), pair).quoteAsset.quantityScale,\n ledgerAmount: (ledgerAssetId) => {\n const ledger = getCatalog().ledger;\n if (!ledger.isKnownAssetId(ledgerAssetId)) {\n throw new CatalogLookupError(\"ledger\", \"ledgerId\", ledgerAssetId);\n }\n return ledger.requireAssetByLedgerId(ledgerAssetId).quantityScale;\n },\n zippedAssetAmount: (zippedAssetId) =>\n getCatalog().zipper.requireAssetChainByZippedAssetId(zippedAssetId).asset.quantityScale,\n };\n}\n\nfunction requirePair(catalog: ClientCatalog, pair: PairCatalogKey) {\n return typeof pair === \"string\" || (typeof pair === \"object\" && \"symbol\" in pair)\n ? catalog.market.requirePairBySymbol(typeof pair === \"string\" ? pair : pair.symbol)\n : catalog.market.requirePairBySymbolId(typeof pair === \"number\" ? pair : pair.symbolId);\n}\n\n/** Output direction: exact scaled→decimal conversion (`1500000n`@6 → `\"1.5\"`). */\nexport function scaledToDecimalOutput(value: bigint, scale: number): string {\n return scaledToDecimal(value, scale);\n}\n\nfunction conversionFailureMessage(\n field: string,\n value: string,\n failure: DecimalToScaledFailure,\n): string {\n return failure.reason === \"precision\"\n ? `${field} supports at most ${failure.maxDecimals} decimal places: ${value}`\n : `${field} must be a non-negative decimal number: ${value}`;\n}\n\n/**\n * Input direction: strict decimal→scaled conversion. Throws\n * CatalogConversionError for non-decimal input or inexact excess precision.\n */\nexport function decimalInputToScaled(field: string, value: string, scale: number): bigint {\n const result = tryDecimalToScaled(value.trim(), scale);\n if (!result.ok) {\n throw new CatalogConversionError(\n field,\n conversionFailureMessage(field, value, result.failure),\n );\n }\n return result.scaled;\n}\n\nfunction unboundedPositiveDecimalInputToScaled(\n field: string,\n value: string,\n scale: number,\n): bigint {\n const scaled = decimalInputToScaled(field, value, scale);\n if (scaled <= 0n) {\n throw new CatalogConversionError(field, `${field} must be greater than 0: ${value}`);\n }\n return scaled;\n}\n\n/**\n * Converts a positive decimal input to a scaled protobuf `int64` value.\n * Rejects values above the wire-format ceiling before serialization.\n */\nexport function positiveDecimalInputToScaled(field: string, value: string, scale: number): bigint {\n const scaled = unboundedPositiveDecimalInputToScaled(field, value, scale);\n if (scaled > PROTOBUF_INT64_MAX) {\n throw new CatalogConversionError(\n field,\n `${field} exceeds the maximum supported value: ${value}`,\n );\n }\n return scaled;\n}\n\n/**\n * Decimal quantity → PolyesterChain E18 ledger units.\n * Input precision is capped at the asset's quantityScale; the wire value is\n * always upscaled to E18 (trading balances / amount_e18 convention).\n */\nexport function quantityInputToE18(params: {\n scales: SdkScales;\n assetId: number;\n quantity: string;\n field?: string;\n}): bigint {\n const field = params.field ?? \"quantity\";\n const assetScale = params.scales.ledgerAmount(params.assetId);\n if (assetScale > E18_SCALE) {\n throw new CatalogConversionError(\n field,\n `${field} asset quantityScale ${assetScale} exceeds E18 ledger scale`,\n );\n }\n return (\n unboundedPositiveDecimalInputToScaled(field, params.quantity, assetScale) *\n 10n ** BigInt(E18_SCALE - assetScale)\n );\n}\n\nexport interface ReadyGate {\n /** Queues or delivers one transition while the gate remains active. */\n run(deliver: () => void): void;\n /** Drops pending transitions and permanently prevents future delivery. */\n close(): void;\n}\n\ninterface ReadyGateHandlers {\n onDeliveryError?: (error: unknown) => void;\n onTerminalError: (error: unknown) => void;\n}\n\nconst READY_GATE_MAX_PENDING_DELIVERIES = 1_024;\n\n/**\n * Transition event delivery behind catalog readiness. Events arriving before the\n * catalog can resolve scales are queued and flushed in arrival order once it\n * is ready. Delivery errors are isolated from the transport. Readiness failure\n * or queue overflow is terminal because dropping an event would break stream\n * continuity; the owning subscription must visibly terminate when notified.\n */\nexport function createReadyGate(\n ready: () => Promise<void>,\n handlers: ReadyGateHandlers,\n): ReadyGate {\n let state: \"pending\" | \"open\" | \"closed\" = \"pending\";\n const queue: Array<() => void> = [];\n\n const deliverIsolated = (deliver: () => void) => {\n try {\n deliver();\n } catch (error) {\n handlers.onDeliveryError?.(error);\n }\n };\n\n const closeWithError = (error: unknown) => {\n if (state === \"closed\") return;\n state = \"closed\";\n queue.length = 0;\n handlers.onTerminalError(error);\n };\n\n Promise.resolve()\n .then(ready)\n .then(\n () => {\n if (state !== \"pending\") return;\n state = \"open\";\n for (const deliver of queue.splice(0)) deliverIsolated(deliver);\n },\n (error) => {\n if (state !== \"pending\") return;\n closeWithError(error);\n },\n );\n\n return {\n run(deliver) {\n if (state === \"open\") deliverIsolated(deliver);\n else if (state === \"pending\") {\n if (queue.length === READY_GATE_MAX_PENDING_DELIVERIES) {\n closeWithError(new CatalogNotReadyError());\n return;\n }\n queue.push(deliver);\n }\n },\n close() {\n if (state === \"closed\") return;\n state = \"closed\";\n queue.length = 0;\n },\n };\n}\n"],"mappings":"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"}
|
package/dist/shared/schemas.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { formatId, idToBigInt } from "../utils/base58-id.js";
|
|
2
|
-
import { parseOptionalUint64DecimalStrict,
|
|
2
|
+
import { parseOptionalUint64DecimalStrict, toBpsOrZero, toIntOrZero } from "../utils/numbers.js";
|
|
3
3
|
import { tsNsToMs, tsObjToMs } from "../utils/time.js";
|
|
4
|
+
import { PROTOBUF_UINT32_MAX } from "./wire-bounds.js";
|
|
4
5
|
import * as v from "valibot";
|
|
5
6
|
//#region src/shared/schemas.ts
|
|
6
7
|
const UINT64_MAX = (1n << 64n) - 1n;
|
|
@@ -15,8 +16,7 @@ const TimestampSchema = v.object({
|
|
|
15
16
|
const TimestampMsSchema = v.pipe(TimestampSchema, v.transform((value) => tsObjToMs(value)));
|
|
16
17
|
const OptionalTimestampMsSchema = v.pipe(v.optional(TimestampSchema), v.transform((value) => tsObjToMs(value)));
|
|
17
18
|
const OptionalNumberDefaultNullSchema = v.optional(v.nullable(v.number()), null);
|
|
18
|
-
const
|
|
19
|
-
const OptionalNumberToIntOrZeroSchema = v.pipe(OptionalNumberDefaultNullSchema, v.transform((value) => toIntOrZero(value)));
|
|
19
|
+
const OptionalNumberToIntOrZeroSchema = v.pipe(v.optional(v.nullable(v.pipe(v.number(), v.maxValue(PROTOBUF_UINT32_MAX))), null), v.transform((value) => toIntOrZero(value)));
|
|
20
20
|
v.pipe(OptionalNumberDefaultNullSchema, v.transform((value) => toBpsOrZero(value)));
|
|
21
21
|
v.pipe(v.bigint(), v.transform((value) => tsNsToMs(value)));
|
|
22
22
|
const BigIntStringSchema = v.pipe(v.bigint(), v.transform((value) => value.toString()));
|
|
@@ -60,6 +60,6 @@ function positiveBigintStringInputSchema(fieldName) {
|
|
|
60
60
|
}
|
|
61
61
|
const JsonObjectSchema = v.custom((input) => typeof input === "object" && input !== null && !Array.isArray(input));
|
|
62
62
|
//#endregion
|
|
63
|
-
export { BigIntStringSchema, JsonObjectSchema, OptionalBigIntStringSchema, OptionalNumberDefaultNullSchema,
|
|
63
|
+
export { BigIntStringSchema, JsonObjectSchema, OptionalBigIntStringSchema, OptionalNumberDefaultNullSchema, OptionalNumberToIntOrZeroSchema, OptionalPublicIdSchema, OptionalTimestampMsSchema, OptionalTimestampMsToUsInputSchema, OptionalTimestampSecondsInputSchema, PublicIdSchema, TimestampMsSchema, TimestampSchema, bigintStringInputSchema, idInputSchema, optionalIdInputSchema, optionalSubaccountIdInputSchema, optionalUint64DecimalFilterSchema, positiveBigintStringInputSchema };
|
|
64
64
|
|
|
65
65
|
//# sourceMappingURL=schemas.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","names":[],"sources":["../../src/shared/schemas.ts"],"sourcesContent":["import * as v from \"valibot\";\nimport { formatId, idToBigInt } from \"../utils/base58-id.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"schemas.js","names":[],"sources":["../../src/shared/schemas.ts"],"sourcesContent":["import * as v from \"valibot\";\nimport { formatId, idToBigInt } from \"../utils/base58-id.js\";\nimport { parseOptionalUint64DecimalStrict, toBpsOrZero, toIntOrZero } from \"../utils/numbers.js\";\nimport { tsNsToMs, tsObjToMs } from \"../utils/time.js\";\nimport type { JsonObject } from \"@bufbuild/protobuf\";\nimport { PROTOBUF_UINT32_MAX } from \"./wire-bounds.js\";\n\nconst UINT64_MAX = (1n << 64n) - 1n;\nconst MS_TO_US = 1_000n;\nconst MS_TO_NS = 1_000_000n;\nconst MAX_UINT64_TIMESTAMP_MS_US = Number(UINT64_MAX / MS_TO_US);\nconst MAX_UINT64_TIMESTAMP_MS = Number(UINT64_MAX / MS_TO_NS);\n\nexport const TimestampSchema = v.object({\n seconds: v.bigint(),\n nanos: v.optional(v.number(), 0),\n});\n\nexport const TimestampMsSchema = v.pipe(\n TimestampSchema,\n v.transform((value) => tsObjToMs(value)),\n);\n\nexport const OptionalTimestampMsSchema = v.pipe(\n v.optional(TimestampSchema),\n v.transform((value) => tsObjToMs(value)),\n);\n\nexport const OptionalNumberDefaultNullSchema = v.optional(v.nullable(v.number()), null);\n\nexport const OptionalNumberToIntOrZeroSchema = v.pipe(\n v.optional(v.nullable(v.pipe(v.number(), v.maxValue(PROTOBUF_UINT32_MAX))), null),\n v.transform((value) => toIntOrZero(value)),\n);\n\nexport const OptionalNumberToBpsOrZeroSchema = v.pipe(\n OptionalNumberDefaultNullSchema,\n v.transform((value) => toBpsOrZero(value)),\n);\n\nexport const TimestampNsMsSchema = v.pipe(\n v.bigint(),\n v.transform((value) => tsNsToMs(value)),\n);\n\nexport const BigIntStringSchema = v.pipe(\n v.bigint(),\n v.transform((value) => value.toString()),\n);\n\nexport const OptionalBigIntStringSchema = v.pipe(\n v.optional(v.bigint()),\n v.transform((value) => (value === undefined ? undefined : value.toString())),\n);\n\nexport const OptionalTimestampMsToNsInputSchema = v.optional(\n v.pipe(\n v.number(),\n v.integer(),\n v.minValue(0),\n v.maxValue(MAX_UINT64_TIMESTAMP_MS),\n v.transform((value) => BigInt(value) * MS_TO_NS),\n ),\n);\n\nexport const OptionalTimestampMsToUsInputSchema = v.optional(\n v.pipe(\n v.number(),\n v.integer(),\n v.minValue(0),\n v.maxValue(MAX_UINT64_TIMESTAMP_MS_US),\n v.transform((value) => BigInt(value) * MS_TO_US),\n ),\n);\n\nexport const OptionalTimestampSecondsInputSchema = v.optional(\n v.pipe(\n v.number(),\n v.integer(),\n v.minValue(0),\n v.maxValue(Number.MAX_SAFE_INTEGER),\n v.transform((value) => BigInt(value)),\n ),\n);\n\nexport const PublicIdSchema = v.pipe(\n v.bigint(),\n v.transform((value) => formatId(value)),\n);\n\nexport const OptionalPublicIdSchema = v.pipe(\n v.optional(v.bigint()),\n v.transform((value) => (value ? formatId(value) : undefined)),\n);\n\nconst TrimmedStringSchema = v.pipe(v.string(), v.trim());\n\nconst OptionalTrimmedStringSchema = v.optional(TrimmedStringSchema);\n\n/**\n * Creates a schema for required public id input.\n */\nexport function idInputSchema(fieldName: string) {\n return v.pipe(\n v.string(),\n v.trim(),\n v.minLength(1),\n v.transform((value) => idToBigInt(value, fieldName)),\n );\n}\n\n/**\n * Creates a schema for optional public id input.\n */\nexport function optionalIdInputSchema(fieldName: string) {\n return v.pipe(\n OptionalTrimmedStringSchema,\n v.transform((value) => (value ? idToBigInt(value, fieldName) : undefined)),\n );\n}\n\n/**\n * Creates a schema for optional subaccount id input.\n */\nexport function optionalSubaccountIdInputSchema() {\n return optionalIdInputSchema(\"subaccountId\");\n}\n\n/**\n * Creates a schema for optional uint64 decimal filter input.\n */\nexport function optionalUint64DecimalFilterSchema(fieldName: string) {\n return v.pipe(\n OptionalTrimmedStringSchema,\n v.transform((value) => parseOptionalUint64DecimalStrict(value, fieldName)),\n );\n}\n\n/**\n * Creates a schema for positive bigint-like input.\n */\nexport function positiveBigintLikeSchema(message: string) {\n return v.pipe(\n v.union([\n v.bigint(),\n v.pipe(\n TrimmedStringSchema,\n v.regex(/^\\d+$/),\n v.transform((value) => BigInt(value)),\n ),\n ]),\n v.check((value) => value > 0n, message),\n );\n}\n\nexport function bigintStringInputSchema(fieldName: string) {\n return v.pipe(\n TrimmedStringSchema,\n v.regex(/^\\d+$/, `${fieldName} must be a decimal integer`),\n v.transform((value) => BigInt(value)),\n );\n}\n\nexport function positiveBigintStringInputSchema(fieldName: string) {\n return v.pipe(\n bigintStringInputSchema(fieldName),\n v.check((value) => value > 0n, `${fieldName} must be greater than 0`),\n );\n}\n\nexport const JsonObjectSchema = v.custom<JsonObject>(\n (input): input is JsonObject =>\n typeof input === \"object\" && input !== null && !Array.isArray(input),\n);\n"],"mappings":"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"}
|
package/dist/utils/numbers.js
CHANGED
|
@@ -36,15 +36,6 @@ function parseOptionalPositiveBigIntLike(value) {
|
|
|
36
36
|
return parsed > 0n ? parsed : void 0;
|
|
37
37
|
}
|
|
38
38
|
/**
|
|
39
|
-
* Coerce optional UI number into non-negative bigint (e.g. caps, limits).
|
|
40
|
-
* @param value - The value to coerce.
|
|
41
|
-
* @returns The coerced bigint.
|
|
42
|
-
*/
|
|
43
|
-
function toBigIntOrZero(value) {
|
|
44
|
-
if (value == null || Number.isNaN(value)) return 0n;
|
|
45
|
-
return BigInt(Math.max(0, Math.trunc(value)));
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
39
|
* Coerce optional UI number into non-negative integer.
|
|
49
40
|
* @param value - The value to coerce.
|
|
50
41
|
* @returns The coerced integer.
|
|
@@ -63,6 +54,6 @@ function toBpsOrZero(value) {
|
|
|
63
54
|
return Math.max(0, Math.trunc(value * 100));
|
|
64
55
|
}
|
|
65
56
|
//#endregion
|
|
66
|
-
export { parseOptionalPositiveBigIntLike, parseOptionalPositiveIntLike, parseOptionalUint64DecimalStrict,
|
|
57
|
+
export { parseOptionalPositiveBigIntLike, parseOptionalPositiveIntLike, parseOptionalUint64DecimalStrict, toBpsOrZero, toIntOrZero };
|
|
67
58
|
|
|
68
59
|
//# sourceMappingURL=numbers.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"numbers.js","names":[],"sources":["../../src/utils/numbers.ts"],"sourcesContent":["// Shared numeric helpers for gRPC/Connect clients.\n\n/**\n * Parse a required uint64 encoded as a base-10 string into bigint.\n * @param raw - The raw string to parse.\n * @param fieldName - The name of the field to parse.\n * @returns The parsed bigint.\n * @throws An error if the field is required and not provided.\n * @throws An error if the field is not a positive integer.\n */\nexport function parseRequiredUint64Decimal(raw: string, fieldName: string): bigint {\n const s = (raw ?? \"\").trim();\n if (!s) throw new Error(`${fieldName} is required`);\n if (!/^[0-9]+$/.test(s)) throw new Error(`${fieldName} must be a positive integer`);\n return BigInt(s);\n}\n\n/**\n * Parse an optional uint64 encoded as a base-10 string into bigint, or undefined on invalid/empty.\n * @param raw - The raw string to parse.\n * @returns The parsed bigint, or undefined if the field is invalid or empty.\n */\nexport function parseOptionalUint64Decimal(raw: string | undefined): bigint | undefined {\n const s = (raw ?? \"\").trim();\n if (!s) return;\n // For optional filters, treat invalid input as \"unset\" rather than surfacing an error.\n if (!/^[0-9]+$/.test(s)) return;\n return BigInt(s);\n}\n\n/**\n * Parse an optional uint64 encoded as a base-10 string into bigint.\n * Empty values are omitted, but supplied invalid values are rejected.\n */\nexport function parseOptionalUint64DecimalStrict(\n raw: string | undefined,\n fieldName: string,\n): bigint | undefined {\n const s = (raw ?? \"\").trim();\n if (!s) return;\n if (!/^[0-9]+$/.test(s)) throw new Error(`${fieldName} must be a positive integer`);\n return BigInt(s);\n}\n\n/**\n * Parse an optional uint64-ish value (string/number/bigint) into bigint, or undefined on invalid/empty.\n * Accepts base-10 strings, numeric inputs (truncated), and bigint inputs.\n */\nexport function parseOptionalUint64Like(\n value: string | number | bigint | undefined | null,\n): bigint | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"bigint\") return value >= 0n ? value : undefined;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) return undefined;\n const n = Math.trunc(value);\n return n >= 0 ? BigInt(n) : undefined;\n }\n return parseOptionalUint64Decimal(value);\n}\n\n/**\n * Parse an optional positive integer-ish value (string/number) into a number, or undefined on invalid/empty.\n * Useful for common \"limit\" fields coming from UI inputs.\n */\nexport function parseOptionalPositiveIntLike(\n value: string | number | undefined | null,\n): number | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"string\") {\n const decimal = value.trim();\n if (!/^\\d+$/.test(decimal)) return undefined;\n const parsed = Number(decimal);\n return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined;\n }\n return Number.isSafeInteger(value) && value > 0 ? value : undefined;\n}\n\n/**\n * Parse a positive integer-like value without losing precision.\n * Decimal strings may exceed JavaScript's safe-integer range; number inputs may not.\n */\nexport function parseOptionalPositiveBigIntLike(\n value: string | number | undefined | null,\n): bigint | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"number\") {\n return Number.isSafeInteger(value) && value > 0 ? BigInt(value) : undefined;\n }\n const decimal = value.trim();\n if (!/^\\d+$/.test(decimal)) return undefined;\n const parsed = BigInt(decimal);\n return parsed > 0n ? parsed : undefined;\n}\n\n/**\n * Convert a decimal string into a scaled bigint (e.g. 18dp quantity, 6dp price).\n * @param raw - The raw string to parse.\n * @param scale - The scale of the number.\n * @param fieldName - The name of the field to parse.\n * @returns The parsed bigint.\n * @throws An error if the field is required and not provided.\n * @throws An error if the field is not a positive number.\n */\nexport function decimalToScaledInt(raw: string, scale: number, fieldName: string): bigint {\n const s = (raw ?? \"\").trim();\n if (!s) throw new Error(`${fieldName} is required`);\n if (!/^[0-9]+(\\.[0-9]+)?$/.test(s)) throw new Error(`${fieldName} must be a positive number`);\n const [intPartRaw, fracRaw = \"\"] = s.split(\".\");\n if (fracRaw.length > scale) {\n throw new Error(`${fieldName} supports at most ${scale} decimal places`);\n }\n const intPart = intPartRaw?.replace(/^0+/, \"\") ?? \"0\";\n const fracPart = fracRaw.padEnd(scale, \"0\");\n const combined = `${intPart}${fracPart}`;\n return BigInt(combined ?? \"0\");\n}\n\n/**\n * Parse a quantity scaled to the given number of decimal places.\n * @param raw - The raw string to parse.\n * @param scale - The number of decimal places to scale to.\n * @param fieldName - The name of the field to parse.\n * @returns The parsed bigint.\n * @throws An error if the field is required and not provided.\n * @throws An error if the field is not a positive number.\n */\nexport function parseQtyScaled(raw: string, scale: number, fieldName: string): bigint {\n return decimalToScaledInt(raw, scale, fieldName);\n}\n\n/**\n * Parse a price scaled to 6 decimal places.\n * @param raw - The raw string to parse.\n * @param fieldName - The name of the field to parse.\n * @returns The parsed bigint.\n * @throws An error if the field is required and not provided.\n * @throws An error if the field is not a positive number.\n */\nexport function parsePriceTicks(raw: string, fieldName: string): bigint {\n return decimalToScaledInt(raw, 6, fieldName);\n}\n\n/**\n * Coerce optional UI number into non-negative
|
|
1
|
+
{"version":3,"file":"numbers.js","names":[],"sources":["../../src/utils/numbers.ts"],"sourcesContent":["// Shared numeric helpers for gRPC/Connect clients.\n\n/**\n * Parse a required uint64 encoded as a base-10 string into bigint.\n * @param raw - The raw string to parse.\n * @param fieldName - The name of the field to parse.\n * @returns The parsed bigint.\n * @throws An error if the field is required and not provided.\n * @throws An error if the field is not a positive integer.\n */\nexport function parseRequiredUint64Decimal(raw: string, fieldName: string): bigint {\n const s = (raw ?? \"\").trim();\n if (!s) throw new Error(`${fieldName} is required`);\n if (!/^[0-9]+$/.test(s)) throw new Error(`${fieldName} must be a positive integer`);\n return BigInt(s);\n}\n\n/**\n * Parse an optional uint64 encoded as a base-10 string into bigint, or undefined on invalid/empty.\n * @param raw - The raw string to parse.\n * @returns The parsed bigint, or undefined if the field is invalid or empty.\n */\nexport function parseOptionalUint64Decimal(raw: string | undefined): bigint | undefined {\n const s = (raw ?? \"\").trim();\n if (!s) return;\n // For optional filters, treat invalid input as \"unset\" rather than surfacing an error.\n if (!/^[0-9]+$/.test(s)) return;\n return BigInt(s);\n}\n\n/**\n * Parse an optional uint64 encoded as a base-10 string into bigint.\n * Empty values are omitted, but supplied invalid values are rejected.\n */\nexport function parseOptionalUint64DecimalStrict(\n raw: string | undefined,\n fieldName: string,\n): bigint | undefined {\n const s = (raw ?? \"\").trim();\n if (!s) return;\n if (!/^[0-9]+$/.test(s)) throw new Error(`${fieldName} must be a positive integer`);\n return BigInt(s);\n}\n\n/**\n * Parse an optional uint64-ish value (string/number/bigint) into bigint, or undefined on invalid/empty.\n * Accepts base-10 strings, numeric inputs (truncated), and bigint inputs.\n */\nexport function parseOptionalUint64Like(\n value: string | number | bigint | undefined | null,\n): bigint | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"bigint\") return value >= 0n ? value : undefined;\n if (typeof value === \"number\") {\n if (!Number.isFinite(value)) return undefined;\n const n = Math.trunc(value);\n return n >= 0 ? BigInt(n) : undefined;\n }\n return parseOptionalUint64Decimal(value);\n}\n\n/**\n * Parse an optional positive integer-ish value (string/number) into a number, or undefined on invalid/empty.\n * Useful for common \"limit\" fields coming from UI inputs.\n */\nexport function parseOptionalPositiveIntLike(\n value: string | number | undefined | null,\n): number | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"string\") {\n const decimal = value.trim();\n if (!/^\\d+$/.test(decimal)) return undefined;\n const parsed = Number(decimal);\n return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : undefined;\n }\n return Number.isSafeInteger(value) && value > 0 ? value : undefined;\n}\n\n/**\n * Parse a positive integer-like value without losing precision.\n * Decimal strings may exceed JavaScript's safe-integer range; number inputs may not.\n */\nexport function parseOptionalPositiveBigIntLike(\n value: string | number | undefined | null,\n): bigint | undefined {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"number\") {\n return Number.isSafeInteger(value) && value > 0 ? BigInt(value) : undefined;\n }\n const decimal = value.trim();\n if (!/^\\d+$/.test(decimal)) return undefined;\n const parsed = BigInt(decimal);\n return parsed > 0n ? parsed : undefined;\n}\n\n/**\n * Convert a decimal string into a scaled bigint (e.g. 18dp quantity, 6dp price).\n * @param raw - The raw string to parse.\n * @param scale - The scale of the number.\n * @param fieldName - The name of the field to parse.\n * @returns The parsed bigint.\n * @throws An error if the field is required and not provided.\n * @throws An error if the field is not a positive number.\n */\nexport function decimalToScaledInt(raw: string, scale: number, fieldName: string): bigint {\n const s = (raw ?? \"\").trim();\n if (!s) throw new Error(`${fieldName} is required`);\n if (!/^[0-9]+(\\.[0-9]+)?$/.test(s)) throw new Error(`${fieldName} must be a positive number`);\n const [intPartRaw, fracRaw = \"\"] = s.split(\".\");\n if (fracRaw.length > scale) {\n throw new Error(`${fieldName} supports at most ${scale} decimal places`);\n }\n const intPart = intPartRaw?.replace(/^0+/, \"\") ?? \"0\";\n const fracPart = fracRaw.padEnd(scale, \"0\");\n const combined = `${intPart}${fracPart}`;\n return BigInt(combined ?? \"0\");\n}\n\n/**\n * Parse a quantity scaled to the given number of decimal places.\n * @param raw - The raw string to parse.\n * @param scale - The number of decimal places to scale to.\n * @param fieldName - The name of the field to parse.\n * @returns The parsed bigint.\n * @throws An error if the field is required and not provided.\n * @throws An error if the field is not a positive number.\n */\nexport function parseQtyScaled(raw: string, scale: number, fieldName: string): bigint {\n return decimalToScaledInt(raw, scale, fieldName);\n}\n\n/**\n * Parse a price scaled to 6 decimal places.\n * @param raw - The raw string to parse.\n * @param fieldName - The name of the field to parse.\n * @returns The parsed bigint.\n * @throws An error if the field is required and not provided.\n * @throws An error if the field is not a positive number.\n */\nexport function parsePriceTicks(raw: string, fieldName: string): bigint {\n return decimalToScaledInt(raw, 6, fieldName);\n}\n\n/**\n * Coerce optional UI number into non-negative integer.\n * @param value - The value to coerce.\n * @returns The coerced integer.\n */\nexport function toIntOrZero(value?: number | null): number {\n if (value == null || Number.isNaN(value)) return 0;\n return Math.max(0, Math.trunc(value));\n}\n\n/**\n * Coerce optional UI percentage into non-negative basis points integer.\n * @param value - The value to coerce.\n * @returns The coerced integer.\n */\nexport function toBpsOrZero(value?: number | null): number {\n if (value == null || Number.isNaN(value)) return 0;\n return Math.max(0, Math.trunc(value * 100));\n}\n\n/**\n * Convert basis points to percentage.\n * @param value - The value to convert.\n * @returns The converted percentage.\n */\nexport function bpsToPct(value?: number | null): number {\n if (value == null || Number.isNaN(value)) return 0;\n return value / 100;\n}\n"],"mappings":";;;;;AAkCA,SAAgB,iCACZ,KACA,WACkB;CAClB,MAAM,KAAK,OAAO,GAAA,CAAI,KAAK;CAC3B,IAAI,CAAC,GAAG;CACR,IAAI,CAAC,WAAW,KAAK,CAAC,GAAG,MAAM,IAAI,MAAM,GAAG,UAAU,4BAA4B;CAClF,OAAO,OAAO,CAAC;AACnB;;;;;AAuBA,SAAgB,6BACZ,OACkB;CAClB,IAAI,UAAU,KAAA,KAAa,UAAU,MAAM,OAAO,KAAA;CAClD,IAAI,OAAO,UAAU,UAAU;EAC3B,MAAM,UAAU,MAAM,KAAK;EAC3B,IAAI,CAAC,QAAQ,KAAK,OAAO,GAAG,OAAO,KAAA;EACnC,MAAM,SAAS,OAAO,OAAO;EAC7B,OAAO,OAAO,cAAc,MAAM,KAAK,SAAS,IAAI,SAAS,KAAA;CACjE;CACA,OAAO,OAAO,cAAc,KAAK,KAAK,QAAQ,IAAI,QAAQ,KAAA;AAC9D;;;;;AAMA,SAAgB,gCACZ,OACkB;CAClB,IAAI,UAAU,KAAA,KAAa,UAAU,MAAM,OAAO,KAAA;CAClD,IAAI,OAAO,UAAU,UACjB,OAAO,OAAO,cAAc,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,KAAA;CAEtE,MAAM,UAAU,MAAM,KAAK;CAC3B,IAAI,CAAC,QAAQ,KAAK,OAAO,GAAG,OAAO,KAAA;CACnC,MAAM,SAAS,OAAO,OAAO;CAC7B,OAAO,SAAS,KAAK,SAAS,KAAA;AAClC;;;;;;AAuDA,SAAgB,YAAY,OAA+B;CACvD,IAAI,SAAS,QAAQ,OAAO,MAAM,KAAK,GAAG,OAAO;CACjD,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC;AACxC;;;;;;AAOA,SAAgB,YAAY,OAA+B;CACvD,IAAI,SAAS,QAAQ,OAAO,MAAM,KAAK,GAAG,OAAO;CACjD,OAAO,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,GAAG,CAAC;AAC9C"}
|
package/package.json
CHANGED