@dimes-dot-fi/sdk 1.3.0 → 1.4.0

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.
Files changed (49) hide show
  1. package/dist/{aliases-DzVxkXtK.d.cts → aliases-C-B9O2AE.d.cts} +107 -2
  2. package/dist/{aliases-DzVxkXtK.d.ts → aliases-C-B9O2AE.d.ts} +107 -2
  3. package/dist/{chunk-YUCGNELT.mjs → chunk-4MO3HKMS.mjs} +7 -1
  4. package/dist/chunk-4MO3HKMS.mjs.map +1 -0
  5. package/dist/{chunk-S65RABUT.mjs → chunk-BVILILIV.mjs} +13 -1
  6. package/dist/chunk-BVILILIV.mjs.map +1 -0
  7. package/dist/{chunk-JWAPH4GD.cjs → chunk-COSLZ5TM.cjs} +36 -11
  8. package/dist/chunk-COSLZ5TM.cjs.map +1 -0
  9. package/dist/{chunk-UUE4HG2H.cjs → chunk-DYPABUKC.cjs} +13 -1
  10. package/dist/chunk-DYPABUKC.cjs.map +1 -0
  11. package/dist/{chunk-EI5V5Z6G.mjs → chunk-SGA6OZEU.mjs} +33 -8
  12. package/dist/chunk-SGA6OZEU.mjs.map +1 -0
  13. package/dist/{chunk-ZK56XS4X.cjs → chunk-UHQZSMUD.cjs} +8 -2
  14. package/dist/chunk-UHQZSMUD.cjs.map +1 -0
  15. package/dist/contract/index.cjs +13 -13
  16. package/dist/contract/index.d.cts +3 -3
  17. package/dist/contract/index.d.ts +3 -3
  18. package/dist/contract/index.mjs +1 -1
  19. package/dist/{dimes-client-D88pW-Lm.d.ts → dimes-client-B0w_Ppd9.d.cts} +13 -3
  20. package/dist/{dimes-client-Bs6eTIvn.d.cts → dimes-client-uKVU4nq_.d.ts} +13 -3
  21. package/dist/{dimes-error-DxIoHQzj.d.cts → dimes-error-C7MRTq2N.d.cts} +1 -1
  22. package/dist/{dimes-error-BHVY6vDv.d.ts → dimes-error-y7fP6jqH.d.ts} +1 -1
  23. package/dist/index.cjs +12 -7
  24. package/dist/index.cjs.map +1 -1
  25. package/dist/index.d.cts +7 -7
  26. package/dist/index.d.ts +7 -7
  27. package/dist/index.mjs +8 -3
  28. package/dist/index.mjs.map +1 -1
  29. package/dist/{quote-CZqCqt8R.d.cts → quote-JAvWCzWa.d.cts} +2 -2
  30. package/dist/{quote-Cy7ie8yT.d.ts → quote-skfPSk-e.d.ts} +2 -2
  31. package/dist/react/index.cjs +4 -4
  32. package/dist/react/index.d.cts +3 -3
  33. package/dist/react/index.d.ts +3 -3
  34. package/dist/react/index.mjs +2 -2
  35. package/dist/{types--ysRe5Os.d.cts → types-BSBGUKeJ.d.ts} +20 -2
  36. package/dist/{types-BcUKsoEs.d.ts → types-opXc4MmU.d.cts} +20 -2
  37. package/dist/ws/index.cjs +115 -5
  38. package/dist/ws/index.cjs.map +1 -1
  39. package/dist/ws/index.d.cts +36 -9
  40. package/dist/ws/index.d.ts +36 -9
  41. package/dist/ws/index.mjs +112 -2
  42. package/dist/ws/index.mjs.map +1 -1
  43. package/package.json +1 -1
  44. package/dist/chunk-EI5V5Z6G.mjs.map +0 -1
  45. package/dist/chunk-JWAPH4GD.cjs.map +0 -1
  46. package/dist/chunk-S65RABUT.mjs.map +0 -1
  47. package/dist/chunk-UUE4HG2H.cjs.map +0 -1
  48. package/dist/chunk-YUCGNELT.mjs.map +0 -1
  49. package/dist/chunk-ZK56XS4X.cjs.map +0 -1
@@ -154,6 +154,28 @@ interface components {
154
154
  */
155
155
  step_bps: number;
156
156
  };
157
+ CustomerMarketPolymarket: {
158
+ /**
159
+ * @description Polymarket market slug, matching the slug in Polymarket URLs and Gamma API responses.
160
+ * @example will-trump-win-the-2024-election
161
+ */
162
+ slug: string;
163
+ /**
164
+ * @description Polymarket CTF condition ID for this market. Use it to look the market up on Polymarket's CLOB and Gamma APIs. Null for the small number of markets where Polymarket has not exposed a condition ID.
165
+ * @example 0xabc123def4567890abc123def4567890abc123def4567890abc123def4567890
166
+ */
167
+ condition_id?: string | null;
168
+ /**
169
+ * @description Polymarket CLOB token ID for the NO outcome (the ERC1155 position token ID).
170
+ * @example 71321045679252212594626385532706912750332728571942532289631379312455583992563
171
+ */
172
+ no_token_id: string;
173
+ /**
174
+ * @description Polymarket CLOB token ID for the YES outcome (the ERC1155 position token ID).
175
+ * @example 21742633143463906290569050155826241533067272736897614950488156847949938836455
176
+ */
177
+ yes_token_id: string;
178
+ };
157
179
  CustomerSideEligibility: {
158
180
  /**
159
181
  * @description Whether this market is accepting new positions on this side
@@ -247,8 +269,11 @@ interface components {
247
269
  * ]
248
270
  */
249
271
  tags: string[];
272
+ /** @description Polymarket identifiers for this market, for mapping our markets onto Polymarket data feeds. Always present (all live markets are Polymarket-sourced). */
273
+ polymarket: components["schemas"]["CustomerMarketPolymarket"];
250
274
  /**
251
- * @description Market ticker sourced from the upstream trading venue (e.g. the Polymarket slug)
275
+ * @deprecated
276
+ * @description Deprecated: use `polymarket.slug`. Market ticker sourced from the upstream trading venue.
252
277
  * @example will-trump-win-the-2024-election
253
278
  */
254
279
  ticker: string;
@@ -271,6 +296,16 @@ interface components {
271
296
  * @example 2025-01-20T11:30:00.000Z
272
297
  */
273
298
  latest_enter_at?: string;
299
+ /**
300
+ * @description Minimum collateral amount formatted as USD
301
+ * @example 0.02
302
+ */
303
+ min_collateral_usd: string;
304
+ /**
305
+ * @description Minimum collateral amount in USD pips (10000 pips = $1)
306
+ * @example 200000
307
+ */
308
+ min_collateral_usd_pips: string;
274
309
  /**
275
310
  * @description Minimum notional amount formatted as USD
276
311
  * @example 5.00
@@ -930,6 +965,49 @@ interface components {
930
965
  * @enum {string}
931
966
  */
932
967
  close_reason: "closed" | "liquidated" | "reverted" | "settled";
968
+ /**
969
+ * @description Why the position was reverted before it opened. Non-null only when `close_reason` is `reverted`: `exchange_unavailable` (the prediction-market venue was temporarily unavailable — safe to retry), `slippage_exceeded` (price moved beyond tolerance before the order filled), or `unknown`.
970
+ * @enum {string|null}
971
+ */
972
+ revert_reason?: "exchange_unavailable" | "slippage_exceeded" | "unknown" | null;
973
+ };
974
+ PositionTransactionEntry: {
975
+ /**
976
+ * @description On-chain hashes of the exchange (CLOB/DEX) fills nested under this transaction. Present only for transaction types that route through an exchange (open, close, liquidation, settle, force_unwind).
977
+ * @example [
978
+ * "0xddc31a8f7d2e4c0b9a1e5f3c8b6d4a2e0f9c7b5a3d1e8f6c4b2a0d9e7f5c3b1a"
979
+ * ]
980
+ */
981
+ exchange_transaction_hashes?: string[];
982
+ /**
983
+ * @description On-chain transaction hash (EVM transaction hash or Solana signature).
984
+ * @example 0xffe5e3d042e9bf100fd01ad7a8d4de5d7fd20632df62e319d50275673e42e410
985
+ */
986
+ transaction_hash: string;
987
+ };
988
+ PositionTransactionGroup: {
989
+ /** @description The on-chain transactions in this group, in execution order. */
990
+ transactions: components["schemas"]["PositionTransactionEntry"][];
991
+ };
992
+ PositionTransactions: {
993
+ /** @description Transactions that cancelled the position before it opened. */
994
+ cancel: components["schemas"]["PositionTransactionGroup"];
995
+ /** @description Transactions that closed the position on chain, including the finalize-close transaction. */
996
+ close: components["schemas"]["PositionTransactionGroup"];
997
+ /** @description Transactions that liquidated the position on chain, including the finalize-liquidation transaction. */
998
+ liquidation: components["schemas"]["PositionTransactionGroup"];
999
+ /** @description Transactions that opened the position on chain, including the finalize-open transaction. */
1000
+ open: components["schemas"]["PositionTransactionGroup"];
1001
+ /** @description Transactions that redeemed settled position tokens on chain. */
1002
+ redemption: components["schemas"]["PositionTransactionGroup"];
1003
+ /** @description Transactions that reverted a failed open back to the protocol. */
1004
+ revert: components["schemas"]["PositionTransactionGroup"];
1005
+ /** @description Transactions that settled the position on chain, including the finalize-settle transaction. */
1006
+ settle: components["schemas"]["PositionTransactionGroup"];
1007
+ /** @description The close request transaction the position owner submitted on chain. */
1008
+ cancel_request: components["schemas"]["PositionTransactionGroup"];
1009
+ /** @description Transactions that force-unwound (deleveraged) the position on chain, including the finalize-unwind transaction. */
1010
+ force_unwind: components["schemas"]["PositionTransactionGroup"];
933
1011
  };
934
1012
  CreateOfferBody: {
935
1013
  /**
@@ -1153,6 +1231,26 @@ interface components {
1153
1231
  * @example 100
1154
1232
  */
1155
1233
  polymarket_trading_fee_bps: number;
1234
+ /**
1235
+ * @description Partner trading fee rate in basis points — the partner's Polymarket builder fee, a flat percentage of the traded notional included in expectedOpenTradingFeeUsdcUnits. `0` when the partner has no builder fee.
1236
+ * @example 100
1237
+ */
1238
+ partner_trading_fee_bps: number;
1239
+ /**
1240
+ * @description Partner trading fee formatted as USD
1241
+ * @example 0.50
1242
+ */
1243
+ partner_trading_fee_usd: string;
1244
+ /**
1245
+ * @description Partner trading fee in USD pips (10000 pips = $1)
1246
+ * @example 5000
1247
+ */
1248
+ partner_trading_fee_usd_pips: string;
1249
+ /**
1250
+ * @description Partner trading fee in USDC units (1,000,000 units = 1 USDC), included in expectedOpenTradingFeeUsdcUnits.
1251
+ * @example 500000
1252
+ */
1253
+ partner_trading_fee_usdc_units: string;
1156
1254
  /**
1157
1255
  * @description Position seed for on-chain account derivation
1158
1256
  * @example abc123
@@ -1214,6 +1312,12 @@ type MarketSidedMaxLeveragePerNotional = CamelizeKeys<Raw["CustomerSidedMaxMarke
1214
1312
  type MarketSidedEligibility = CamelizeKeys<Raw["CustomerSidedEligibility"]>;
1215
1313
  type MarketFees = CamelizeKeys<Raw["CustomerFees"]>;
1216
1314
  type MarketPrices = CamelizeKeys<Raw["CustomerMarketPrices"]>;
1315
+ interface MarketPolymarket {
1316
+ conditionId: string | null;
1317
+ noTokenId: string;
1318
+ slug: string;
1319
+ yesTokenId: string;
1320
+ }
1217
1321
  type OriginationTier = CamelizeKeys<Raw["CustomerOriginationTier"]>;
1218
1322
  type Offer = CamelizeKeys<Raw["CustomerOffer"]>;
1219
1323
  type OpenPosition = CamelizeKeys<Raw["CustomerOpenPosition"]>;
@@ -1229,6 +1333,7 @@ type PositionTiming = CamelizeKeys<Raw["CustomerPositionTiming"]>;
1229
1333
  type PositionFailure = CamelizeKeys<Raw["CustomerPositionFailure"]>;
1230
1334
  type PositionUnwind = CamelizeKeys<Raw["CustomerPositionUnwind"]>;
1231
1335
  type PositionUnwindList = CamelizeKeys<Raw["CustomerPositionUnwindList"]>;
1336
+ type PositionTransactions = CamelizeKeys<Raw["PositionTransactions"]>;
1232
1337
  type ContractInfo = CamelizeKeys<Raw["CustomerContractInfo"]>;
1233
1338
  type CustomerLimit = CamelizeKeys<Raw["CustomerLimit"]>;
1234
1339
  type CreateTokenResult = CamelizeKeys<Raw["CreateTokenResult"]>;
@@ -1244,4 +1349,4 @@ declare function isOpenPosition(p: Position): p is OpenPosition;
1244
1349
  declare function isClosedPosition(p: Position): p is ClosedPosition;
1245
1350
  declare function leverageMaxBps(lev: MarketLeverage, side: "yes" | "no"): number;
1246
1351
 
1247
- export { type CreateOfferParams as C, type Market as M, type Offer as O, type Position as P, type CamelizeKeys as a, type ClosedPosition as b, type ContractInfo as c, type CreateTokenResult as d, type CustomerLimit as e, type MarketFees as f, type MarketLeverage as g, type MarketMaxLeveragePerNotional as h, type MarketPrices as i, type MarketSidedEligibility as j, type MarketSidedMaxLeveragePerNotional as k, type OpenPosition as l, type OriginationTier as m, type PositionClosedFees as n, type PositionCurrent as o, type PositionEntry as p, type PositionFailure as q, type PositionOpenFees as r, type PositionResult as s, type PositionRisk as t, type PositionTiming as u, type PositionUnwind as v, type PositionUnwindList as w, isClosedPosition as x, isOpenPosition as y, leverageMaxBps as z };
1352
+ export { type PositionTransactions as A, type MarketPolymarket as B, type CreateOfferParams as C, type Market as M, type Offer as O, type Position as P, type CamelizeKeys as a, type ClosedPosition as b, type ContractInfo as c, type CreateTokenResult as d, type CustomerLimit as e, type MarketFees as f, type MarketLeverage as g, type MarketMaxLeveragePerNotional as h, type MarketPrices as i, type MarketSidedEligibility as j, type MarketSidedMaxLeveragePerNotional as k, type OpenPosition as l, type OriginationTier as m, type PositionClosedFees as n, type PositionCurrent as o, type PositionEntry as p, type PositionFailure as q, type PositionOpenFees as r, type PositionResult as s, type PositionRisk as t, type PositionTiming as u, type PositionUnwind as v, type PositionUnwindList as w, isClosedPosition as x, isOpenPosition as y, leverageMaxBps as z };
@@ -154,6 +154,28 @@ interface components {
154
154
  */
155
155
  step_bps: number;
156
156
  };
157
+ CustomerMarketPolymarket: {
158
+ /**
159
+ * @description Polymarket market slug, matching the slug in Polymarket URLs and Gamma API responses.
160
+ * @example will-trump-win-the-2024-election
161
+ */
162
+ slug: string;
163
+ /**
164
+ * @description Polymarket CTF condition ID for this market. Use it to look the market up on Polymarket's CLOB and Gamma APIs. Null for the small number of markets where Polymarket has not exposed a condition ID.
165
+ * @example 0xabc123def4567890abc123def4567890abc123def4567890abc123def4567890
166
+ */
167
+ condition_id?: string | null;
168
+ /**
169
+ * @description Polymarket CLOB token ID for the NO outcome (the ERC1155 position token ID).
170
+ * @example 71321045679252212594626385532706912750332728571942532289631379312455583992563
171
+ */
172
+ no_token_id: string;
173
+ /**
174
+ * @description Polymarket CLOB token ID for the YES outcome (the ERC1155 position token ID).
175
+ * @example 21742633143463906290569050155826241533067272736897614950488156847949938836455
176
+ */
177
+ yes_token_id: string;
178
+ };
157
179
  CustomerSideEligibility: {
158
180
  /**
159
181
  * @description Whether this market is accepting new positions on this side
@@ -247,8 +269,11 @@ interface components {
247
269
  * ]
248
270
  */
249
271
  tags: string[];
272
+ /** @description Polymarket identifiers for this market, for mapping our markets onto Polymarket data feeds. Always present (all live markets are Polymarket-sourced). */
273
+ polymarket: components["schemas"]["CustomerMarketPolymarket"];
250
274
  /**
251
- * @description Market ticker sourced from the upstream trading venue (e.g. the Polymarket slug)
275
+ * @deprecated
276
+ * @description Deprecated: use `polymarket.slug`. Market ticker sourced from the upstream trading venue.
252
277
  * @example will-trump-win-the-2024-election
253
278
  */
254
279
  ticker: string;
@@ -271,6 +296,16 @@ interface components {
271
296
  * @example 2025-01-20T11:30:00.000Z
272
297
  */
273
298
  latest_enter_at?: string;
299
+ /**
300
+ * @description Minimum collateral amount formatted as USD
301
+ * @example 0.02
302
+ */
303
+ min_collateral_usd: string;
304
+ /**
305
+ * @description Minimum collateral amount in USD pips (10000 pips = $1)
306
+ * @example 200000
307
+ */
308
+ min_collateral_usd_pips: string;
274
309
  /**
275
310
  * @description Minimum notional amount formatted as USD
276
311
  * @example 5.00
@@ -930,6 +965,49 @@ interface components {
930
965
  * @enum {string}
931
966
  */
932
967
  close_reason: "closed" | "liquidated" | "reverted" | "settled";
968
+ /**
969
+ * @description Why the position was reverted before it opened. Non-null only when `close_reason` is `reverted`: `exchange_unavailable` (the prediction-market venue was temporarily unavailable — safe to retry), `slippage_exceeded` (price moved beyond tolerance before the order filled), or `unknown`.
970
+ * @enum {string|null}
971
+ */
972
+ revert_reason?: "exchange_unavailable" | "slippage_exceeded" | "unknown" | null;
973
+ };
974
+ PositionTransactionEntry: {
975
+ /**
976
+ * @description On-chain hashes of the exchange (CLOB/DEX) fills nested under this transaction. Present only for transaction types that route through an exchange (open, close, liquidation, settle, force_unwind).
977
+ * @example [
978
+ * "0xddc31a8f7d2e4c0b9a1e5f3c8b6d4a2e0f9c7b5a3d1e8f6c4b2a0d9e7f5c3b1a"
979
+ * ]
980
+ */
981
+ exchange_transaction_hashes?: string[];
982
+ /**
983
+ * @description On-chain transaction hash (EVM transaction hash or Solana signature).
984
+ * @example 0xffe5e3d042e9bf100fd01ad7a8d4de5d7fd20632df62e319d50275673e42e410
985
+ */
986
+ transaction_hash: string;
987
+ };
988
+ PositionTransactionGroup: {
989
+ /** @description The on-chain transactions in this group, in execution order. */
990
+ transactions: components["schemas"]["PositionTransactionEntry"][];
991
+ };
992
+ PositionTransactions: {
993
+ /** @description Transactions that cancelled the position before it opened. */
994
+ cancel: components["schemas"]["PositionTransactionGroup"];
995
+ /** @description Transactions that closed the position on chain, including the finalize-close transaction. */
996
+ close: components["schemas"]["PositionTransactionGroup"];
997
+ /** @description Transactions that liquidated the position on chain, including the finalize-liquidation transaction. */
998
+ liquidation: components["schemas"]["PositionTransactionGroup"];
999
+ /** @description Transactions that opened the position on chain, including the finalize-open transaction. */
1000
+ open: components["schemas"]["PositionTransactionGroup"];
1001
+ /** @description Transactions that redeemed settled position tokens on chain. */
1002
+ redemption: components["schemas"]["PositionTransactionGroup"];
1003
+ /** @description Transactions that reverted a failed open back to the protocol. */
1004
+ revert: components["schemas"]["PositionTransactionGroup"];
1005
+ /** @description Transactions that settled the position on chain, including the finalize-settle transaction. */
1006
+ settle: components["schemas"]["PositionTransactionGroup"];
1007
+ /** @description The close request transaction the position owner submitted on chain. */
1008
+ cancel_request: components["schemas"]["PositionTransactionGroup"];
1009
+ /** @description Transactions that force-unwound (deleveraged) the position on chain, including the finalize-unwind transaction. */
1010
+ force_unwind: components["schemas"]["PositionTransactionGroup"];
933
1011
  };
934
1012
  CreateOfferBody: {
935
1013
  /**
@@ -1153,6 +1231,26 @@ interface components {
1153
1231
  * @example 100
1154
1232
  */
1155
1233
  polymarket_trading_fee_bps: number;
1234
+ /**
1235
+ * @description Partner trading fee rate in basis points — the partner's Polymarket builder fee, a flat percentage of the traded notional included in expectedOpenTradingFeeUsdcUnits. `0` when the partner has no builder fee.
1236
+ * @example 100
1237
+ */
1238
+ partner_trading_fee_bps: number;
1239
+ /**
1240
+ * @description Partner trading fee formatted as USD
1241
+ * @example 0.50
1242
+ */
1243
+ partner_trading_fee_usd: string;
1244
+ /**
1245
+ * @description Partner trading fee in USD pips (10000 pips = $1)
1246
+ * @example 5000
1247
+ */
1248
+ partner_trading_fee_usd_pips: string;
1249
+ /**
1250
+ * @description Partner trading fee in USDC units (1,000,000 units = 1 USDC), included in expectedOpenTradingFeeUsdcUnits.
1251
+ * @example 500000
1252
+ */
1253
+ partner_trading_fee_usdc_units: string;
1156
1254
  /**
1157
1255
  * @description Position seed for on-chain account derivation
1158
1256
  * @example abc123
@@ -1214,6 +1312,12 @@ type MarketSidedMaxLeveragePerNotional = CamelizeKeys<Raw["CustomerSidedMaxMarke
1214
1312
  type MarketSidedEligibility = CamelizeKeys<Raw["CustomerSidedEligibility"]>;
1215
1313
  type MarketFees = CamelizeKeys<Raw["CustomerFees"]>;
1216
1314
  type MarketPrices = CamelizeKeys<Raw["CustomerMarketPrices"]>;
1315
+ interface MarketPolymarket {
1316
+ conditionId: string | null;
1317
+ noTokenId: string;
1318
+ slug: string;
1319
+ yesTokenId: string;
1320
+ }
1217
1321
  type OriginationTier = CamelizeKeys<Raw["CustomerOriginationTier"]>;
1218
1322
  type Offer = CamelizeKeys<Raw["CustomerOffer"]>;
1219
1323
  type OpenPosition = CamelizeKeys<Raw["CustomerOpenPosition"]>;
@@ -1229,6 +1333,7 @@ type PositionTiming = CamelizeKeys<Raw["CustomerPositionTiming"]>;
1229
1333
  type PositionFailure = CamelizeKeys<Raw["CustomerPositionFailure"]>;
1230
1334
  type PositionUnwind = CamelizeKeys<Raw["CustomerPositionUnwind"]>;
1231
1335
  type PositionUnwindList = CamelizeKeys<Raw["CustomerPositionUnwindList"]>;
1336
+ type PositionTransactions = CamelizeKeys<Raw["PositionTransactions"]>;
1232
1337
  type ContractInfo = CamelizeKeys<Raw["CustomerContractInfo"]>;
1233
1338
  type CustomerLimit = CamelizeKeys<Raw["CustomerLimit"]>;
1234
1339
  type CreateTokenResult = CamelizeKeys<Raw["CreateTokenResult"]>;
@@ -1244,4 +1349,4 @@ declare function isOpenPosition(p: Position): p is OpenPosition;
1244
1349
  declare function isClosedPosition(p: Position): p is ClosedPosition;
1245
1350
  declare function leverageMaxBps(lev: MarketLeverage, side: "yes" | "no"): number;
1246
1351
 
1247
- export { type CreateOfferParams as C, type Market as M, type Offer as O, type Position as P, type CamelizeKeys as a, type ClosedPosition as b, type ContractInfo as c, type CreateTokenResult as d, type CustomerLimit as e, type MarketFees as f, type MarketLeverage as g, type MarketMaxLeveragePerNotional as h, type MarketPrices as i, type MarketSidedEligibility as j, type MarketSidedMaxLeveragePerNotional as k, type OpenPosition as l, type OriginationTier as m, type PositionClosedFees as n, type PositionCurrent as o, type PositionEntry as p, type PositionFailure as q, type PositionOpenFees as r, type PositionResult as s, type PositionRisk as t, type PositionTiming as u, type PositionUnwind as v, type PositionUnwindList as w, isClosedPosition as x, isOpenPosition as y, leverageMaxBps as z };
1352
+ export { type PositionTransactions as A, type MarketPolymarket as B, type CreateOfferParams as C, type Market as M, type Offer as O, type Position as P, type CamelizeKeys as a, type ClosedPosition as b, type ContractInfo as c, type CreateTokenResult as d, type CustomerLimit as e, type MarketFees as f, type MarketLeverage as g, type MarketMaxLeveragePerNotional as h, type MarketPrices as i, type MarketSidedEligibility as j, type MarketSidedMaxLeveragePerNotional as k, type OpenPosition as l, type OriginationTier as m, type PositionClosedFees as n, type PositionCurrent as o, type PositionEntry as p, type PositionFailure as q, type PositionOpenFees as r, type PositionResult as s, type PositionRisk as t, type PositionTiming as u, type PositionUnwind as v, type PositionUnwindList as w, isClosedPosition as x, isOpenPosition as y, leverageMaxBps as z };
@@ -11,12 +11,18 @@ var positionEventTypes = [
11
11
  "position.reverted",
12
12
  "position.settled"
13
13
  ];
14
+ var marketEventTypes = [
15
+ "market.discovered",
16
+ "market.eligibility_changed",
17
+ "market.max_leverage_changed"
18
+ ];
14
19
  var notificationCodes = {
15
20
  orderFulfillmentRetrying: "ORDER_FULFILLMENT_RETRYING"
16
21
  };
17
22
 
18
23
  export {
19
24
  positionEventTypes,
25
+ marketEventTypes,
20
26
  notificationCodes
21
27
  };
22
- //# sourceMappingURL=chunk-YUCGNELT.mjs.map
28
+ //# sourceMappingURL=chunk-4MO3HKMS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/ws/types.ts"],"sourcesContent":["import type { Market, MarketLeverage, MarketPolymarket, Position } from \"../types\";\n\nexport const positionEventTypes = [\n \"position.cancelled\",\n \"position.close_requested\",\n \"position.closed\",\n \"position.created\",\n \"position.force_unwound\",\n \"position.liquidated\",\n \"position.opened\",\n \"position.opening\",\n \"position.reverted\",\n \"position.settled\",\n] as const;\n\nexport type PositionEventType = (typeof positionEventTypes)[number];\n\nexport interface PositionEventEnvelope {\n id: string;\n type: PositionEventType;\n created_at: string;\n data: Record<string, unknown>;\n}\n\nexport interface PositionEvent {\n id: string;\n type: PositionEventType;\n createdAt: string;\n data: Position;\n}\n\nexport const marketEventTypes = [\n \"market.discovered\",\n \"market.eligibility_changed\",\n \"market.max_leverage_changed\",\n] as const;\n\nexport type MarketEventType = (typeof marketEventTypes)[number];\n\nexport type MarketDelta = Pick<Market, \"id\"> & {\n polymarket: MarketPolymarket;\n leverage?: MarketLeverage;\n} & Partial<Omit<Market, \"id\" | \"leverage\">>;\n\nexport interface MarketEventEnvelope {\n id: string;\n type: MarketEventType;\n created_at: string;\n data: Record<string, unknown>[];\n}\n\nexport interface MarketEvent {\n id: string;\n type: MarketEventType;\n createdAt: string;\n data: Market[] | MarketDelta[];\n}\n\nexport interface NotificationEventEnvelope {\n id: string;\n type: \"notification\";\n created_at: string;\n data: {\n code: string;\n message: string;\n params?: Record<string, unknown>;\n };\n}\n\nexport interface NotificationEvent {\n id: string;\n type: \"notification\";\n createdAt: string;\n data: {\n code: string;\n message: string;\n params?: Record<string, unknown>;\n };\n}\n\nexport const notificationCodes = {\n orderFulfillmentRetrying: \"ORDER_FULFILLMENT_RETRYING\",\n} as const;\n\nexport type NotificationCode = (typeof notificationCodes)[keyof typeof notificationCodes];\n"],"mappings":";AAEO,IAAM,qBAAqB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAkBO,IAAM,mBAAmB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF;AA6CO,IAAM,oBAAoB;AAAA,EAC/B,0BAA0B;AAC5B;","names":[]}
@@ -101,6 +101,7 @@ var friendlyByCode = {
101
101
  circuit_breaker_price_divergence_tripped: "Trading is temporarily paused due to price divergence. Try again shortly.",
102
102
  customer_market_not_found: "Market not found.",
103
103
  customer_position_not_found: "Position not found.",
104
+ customer_position_transactions_not_found: "Position not found.",
104
105
  close_position_transaction_failed: "Close transaction failed on-chain.",
105
106
  close_position_transaction_not_found: "Close transaction not found.",
106
107
  finalize_close_transaction_failed: "Finalising the close transaction failed.",
@@ -197,6 +198,17 @@ var friendlyByCode = {
197
198
  }
198
199
  return "Leverage is above the maximum allowed for this market.";
199
200
  },
201
+ quote_leverage_exceeds_collateral_floor: (params) => {
202
+ const min = formatPipsUsd(getParam(params, "minCollateralUsdPips"));
203
+ const current = formatPipsUsd(getParam(params, "currentCollateralUsdPips"));
204
+ if (min && current) {
205
+ return `Collateral ${current} is below the minimum ${min} required at this leverage. Raise collateral to at least ${min}.`;
206
+ }
207
+ if (min) {
208
+ return `Collateral is below the minimum ${min} required at this leverage. Raise collateral to at least ${min}.`;
209
+ }
210
+ return "Collateral is below the minimum required at this leverage. Raise collateral.";
211
+ },
200
212
  quote_leverage_exceeds_model_max: (params) => {
201
213
  const max = formatLeverage(getParam(params, "maxLeverageBps"));
202
214
  const current = formatLeverage(getParam(params, "currentLeverageBps"));
@@ -310,4 +322,4 @@ export {
310
322
  DimesApiError,
311
323
  DimesContractError
312
324
  };
313
- //# sourceMappingURL=chunk-S65RABUT.mjs.map
325
+ //# sourceMappingURL=chunk-BVILILIV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/parse.ts","../src/utils/format.ts","../src/errors/error-messages.ts","../src/errors/dimes-error.ts"],"sourcesContent":["export type Params = Record<string, unknown> | null;\n\nexport function asNumber(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\" && value.trim() !== \"\") {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return null;\n}\n\nexport function asBigInt(value: unknown): bigint | null {\n if (typeof value === \"bigint\") {\n return value;\n }\n if (typeof value === \"string\" && /^-?\\d+$/.test(value.trim())) {\n return BigInt(value.trim());\n }\n if (typeof value === \"number\" && Number.isInteger(value)) {\n return BigInt(value);\n }\n return null;\n}\n\nexport function getParam(params: Params, key: string): unknown {\n return params ? params[key] : undefined;\n}\n","import { asNumber, asBigInt } from \"./parse\";\n\nconst BPS_PER_UNIT = 10_000;\nconst BPS_PER_PCT = 100;\nconst FRACTION_TO_PCT = 100;\nconst PIPS_PER_USD = 1_000_000n;\nconst ROUNDING_OFFSET = 5_000n;\nconst CENTS_DIVISOR = 10_000n;\nconst CENTS_PAD = 2;\n\nexport function formatLeverage(value: unknown): string | null {\n const n = asNumber(value);\n if (n === null) {\n return null;\n }\n return `${(n / BPS_PER_UNIT).toLocaleString(undefined, { maximumFractionDigits: 2 })}x`;\n}\n\nexport function formatBpsPct(value: unknown): string | null {\n const n = asNumber(value);\n if (n === null) {\n return null;\n }\n return `${(n / BPS_PER_PCT).toLocaleString(undefined, { maximumFractionDigits: 2 })}%`;\n}\n\nexport function formatFractionPct(value: unknown): string | null {\n const n = asNumber(value);\n if (n === null) {\n return null;\n }\n return `${(n * FRACTION_TO_PCT).toLocaleString(undefined, { maximumFractionDigits: 1 })}%`;\n}\n\nexport function formatPipsUsd(value: unknown): string | null {\n const big = asBigInt(value);\n if (big === null) {\n return null;\n }\n const negative = big < 0n;\n const absUnits = negative ? -big : big;\n const whole = absUnits / PIPS_PER_USD;\n const frac = absUnits % PIPS_PER_USD;\n const cents = (frac + ROUNDING_OFFSET) / CENTS_DIVISOR;\n const formatted = `$${whole.toLocaleString()}.${cents.toString().padStart(CENTS_PAD, \"0\")}`;\n return negative ? `-${formatted}` : formatted;\n}\n","import { formatLeverage, formatBpsPct, formatFractionPct, formatPipsUsd } from \"../utils/format\";\nimport { type Params, getParam } from \"../utils/parse\";\n\ntype FriendlyEntry = string | ((params: Params) => string);\n\nconst friendlyByCode: Record<string, FriendlyEntry> = {\n invalid_evm_address: \"Invalid EVM address.\",\n invalid_solana_address: \"Invalid Solana address.\",\n invalid_string_for_chain_address: \"Invalid wallet address for the selected chain.\",\n invalid_wallet_address: \"Invalid wallet address.\",\n customer_auth_invalid_wallet_address: \"Invalid wallet address.\",\n\n unauthorized: \"Session expired. Please reconnect your wallet.\",\n forbidden: \"You do not have access to this resource.\",\n\n array_out_of_bounds: \"Internal indexing error. Please try again.\",\n batch_compute_not_available: \"Cached pricing is temporarily unavailable. Try again shortly.\",\n internal_server_error: \"Something went wrong on our side. Please try again.\",\n unexpected_error: \"Something went wrong. Please try again.\",\n provider_not_available: \"Upstream provider is unavailable. Try again shortly.\",\n request_already_in_progress: \"A previous request is still in flight. Wait for it to complete and try again.\",\n math_error: \"A numeric calculation failed. Please try again.\",\n invalid_number: \"Invalid numeric value in request.\",\n invalid_message: \"Received an invalid upstream message.\",\n invalid_filter_combination: \"That combination of filters is not supported.\",\n\n cancel_position_delay_not_elapsed: \"Cancel delay has not elapsed yet. Try again shortly.\",\n cancel_position_transaction_failed: \"Cancel transaction failed on-chain.\",\n cancel_position_not_found: \"Position not found.\",\n cancel_position_not_in_created_state: \"This position can only be cancelled before it has filled.\",\n cancel_position_not_on_polygon: \"Cancel is only supported for Polygon positions.\",\n customer_cancel_position_evm_only: \"Cancel is only supported for EVM positions.\",\n customer_cancel_position_not_cancellable: \"This position can no longer be cancelled.\",\n customer_cancel_position_not_owner: \"You do not own this position.\",\n customer_cancel_position_not_found: \"Position not found.\",\n\n circuit_breaker_price_divergence_tripped: \"Trading is temporarily paused due to price divergence. Try again shortly.\",\n\n customer_market_not_found: \"Market not found.\",\n customer_position_not_found: \"Position not found.\",\n customer_position_transactions_not_found: \"Position not found.\",\n\n close_position_transaction_failed: \"Close transaction failed on-chain.\",\n close_position_transaction_not_found: \"Close transaction not found.\",\n finalize_close_transaction_failed: \"Finalising the close transaction failed.\",\n close_no_open_position_transaction: \"No open transaction found for this position.\",\n close_no_request_close_transaction: \"No close request found for this position.\",\n close_polymarket_order_failed: \"Polymarket close order failed.\",\n close_polymarket_order_retry_failed: \"Polymarket close order failed after retries.\",\n close_position_already_closed: \"This position is already closed.\",\n close_position_has_no_tokens: \"This position has no tokens to close.\",\n close_position_not_found: \"Position not found.\",\n close_position_not_originated: \"Position has not been originated yet — nothing to close.\",\n\n exchange_order_submission_locked: \"Order submission is temporarily locked. Try again shortly.\",\n\n quote_partner_position_limit_exceeded: (params) => {\n const available = formatPipsUsd(getParam(params, \"availableCapacityUsdPips\"));\n return available\n ? `Partner position limit reached. Remaining capacity: ${available}.`\n : \"Partner position limit reached. Try a smaller size.\";\n },\n quote_user_position_limit_exceeded: (params) => {\n const available = formatPipsUsd(getParam(params, \"availableCapacityUsdPips\"));\n return available\n ? `You have reached your position limit on this market. Remaining capacity: ${available}.`\n : \"You have reached your position limit on this market.\";\n },\n quote_market_position_limit_exceeded: (params) => {\n const available = formatPipsUsd(getParam(params, \"availableCapacityUsdPips\"));\n return available\n ? `This market has reached its open-interest cap. Remaining capacity: ${available}.`\n : \"This market has reached its open-interest cap. Try a smaller size or another market.\";\n },\n quote_global_position_limit_exceeded: (params) => {\n const available = formatPipsUsd(getParam(params, \"availableCapacityUsdPips\"));\n return available\n ? `Global position limit reached. Remaining capacity: ${available}.`\n : \"Global position limit reached. Try again shortly.\";\n },\n quote_side_position_limit_exceeded: (params) => {\n const available = formatPipsUsd(getParam(params, \"availableCapacityUsdPips\"));\n return available\n ? `This side of the market is at its position limit. Remaining capacity: ${available}.`\n : \"This side of the market is at its position limit. Try the other side or a smaller size.\";\n },\n quote_side_capacity_exceeded: (params) => {\n const maxCollateral = formatPipsUsd(getParam(params, \"maxSupportedCollateralUsdPips\"));\n return maxCollateral\n ? `Not enough capacity on this side of the market. Max supported collateral at this size: ${maxCollateral}.`\n : \"Not enough capacity on this side of the market for that size.\";\n },\n quote_position_limit_exceeded: \"Position limit reached for this request.\",\n\n quote_insufficient_liquidity: \"Not enough liquidity on the order book to fill this size.\",\n quote_slippage_too_high: (params) => {\n const max = formatBpsPct(getParam(params, \"maxSlippageBps\"));\n const current = formatBpsPct(getParam(params, \"currentSlippageBps\"));\n if (max && current) {\n return `Required slippage ${current} exceeds your tolerance (${max}). Reduce size or raise tolerance.`;\n }\n if (max) {\n return `Required slippage exceeds your tolerance (${max}). Reduce size or raise tolerance.`;\n }\n return \"Price would move too far to fill this order. Reduce size or raise your slippage tolerance.\";\n },\n quote_event_not_started: \"This event has not started yet. Trading opens at the scheduled start time.\",\n quote_entry_bid_depth_too_low: \"Order book depth on the entry side is too thin to open this position safely.\",\n quote_entry_capacity_exceeded: \"Entry size exceeds the market's available capacity.\",\n quote_entry_depth_too_low: \"Order book depth is too thin to open this position safely.\",\n quote_entry_spread_too_wide: \"Bid/ask spread is too wide to open right now. Try again shortly.\",\n quote_entry_order_book_stale: \"Order book data is stale. Refresh and try again.\",\n quote_entry_price_stale: \"Price data is stale. Refresh and try again.\",\n quote_entry_crypto_price_stale: \"Crypto price data is stale. Refresh and try again.\",\n quote_entry_sport_data_stale: \"Sport event data is stale. Refresh and try again.\",\n quote_entry_volume_too_low: \"Recent traded volume on this market is too low to open new positions.\",\n quote_entry_top_holder_too_high: \"A single trader holds too much of this market. Opening here is restricted.\",\n quote_entry_price_out_of_range: \"Current price is outside the range we can open at. Try again shortly.\",\n quote_entry_exit_drop_too_high: \"Exit liquidity is too thin to safely open this size.\",\n quote_entry_market_too_elapsed: (params) => {\n const elapsed = formatFractionPct(getParam(params, \"pctElapsed\"));\n const max = formatFractionPct(getParam(params, \"maxPctElapsed\"));\n if (elapsed && max) {\n return `Market is ${elapsed} elapsed (max ${max}). Too close to resolution to open new positions.`;\n }\n return \"Market is too close to resolution to open new positions.\";\n },\n quote_entry_excluded_market_type: \"This market type is not supported for leveraged positions.\",\n quote_entry_excluded_sport: \"This sport is not supported for leveraged positions.\",\n quote_price_too_low: \"Underlying price is too low to open a leveraged position.\",\n quote_open_interest_unavailable: \"Open-interest data is unavailable right now. Try again shortly.\",\n\n quote_leverage_below_minimum: (params) => {\n const min = formatLeverage(getParam(params, \"minLeverageBps\"));\n const current = formatLeverage(getParam(params, \"currentLeverageBps\"));\n if (min && current) {\n return `Leverage ${current} is below the minimum allowed (${min}).`;\n }\n if (min) {\n return `Leverage is below the minimum allowed (${min}).`;\n }\n return \"Leverage is below the minimum allowed for this market.\";\n },\n quote_leverage_exceeds_maximum: (params) => {\n const max = formatLeverage(getParam(params, \"maxLeverageBps\"));\n const current = formatLeverage(getParam(params, \"currentLeverageBps\"));\n if (max && current) {\n return `Leverage ${current} is above the maximum allowed (${max}).`;\n }\n if (max) {\n return `Leverage is above the maximum allowed (${max}).`;\n }\n return \"Leverage is above the maximum allowed for this market.\";\n },\n quote_leverage_exceeds_collateral_floor: (params) => {\n const min = formatPipsUsd(getParam(params, \"minCollateralUsdPips\"));\n const current = formatPipsUsd(getParam(params, \"currentCollateralUsdPips\"));\n if (min && current) {\n return `Collateral ${current} is below the minimum ${min} required at this leverage. Raise collateral to at least ${min}.`;\n }\n if (min) {\n return `Collateral is below the minimum ${min} required at this leverage. Raise collateral to at least ${min}.`;\n }\n return \"Collateral is below the minimum required at this leverage. Raise collateral.\";\n },\n quote_leverage_exceeds_model_max: (params) => {\n const max = formatLeverage(getParam(params, \"maxLeverageBps\"));\n const current = formatLeverage(getParam(params, \"currentLeverageBps\"));\n if (max && current) {\n return `Leverage ${current} exceeds the risk-model limit (${max}) for this market.`;\n }\n if (max) {\n return `Leverage exceeds the risk-model limit (${max}) for this market.`;\n }\n return \"Leverage exceeds the risk-model limit for this market.\";\n },\n quote_leverage_too_high_for_price: (params) => {\n const current = formatLeverage(getParam(params, \"currentLeverageBps\"));\n const max = formatLeverage(getParam(params, \"maxAcceptableLeverageBps\"));\n if (current && max) {\n return `Leverage ${current} is too high for the current price. Maximum is ${max}.`;\n }\n if (current) {\n return `Leverage ${current} is too high for the current price. Reduce leverage.`;\n }\n return \"Leverage is too high for the current price. Reduce leverage.\";\n },\n quote_trading_window_closing: \"Trading window is closing. Reduce leverage.\",\n quote_hard_exit_too_close: \"Trading window is closing. Reduce leverage.\",\n quote_liquidation_not_viable: (params) => {\n const tolerance = formatBpsPct(getParam(params, \"minTolerancePctBps\"));\n return tolerance\n ? `Liquidation price is too close to entry (minimum buffer ${tolerance}). Reduce leverage.`\n : \"Liquidation price is not viable at this leverage. Reduce leverage.\";\n },\n\n quote_market_not_active: \"Market is not active.\",\n quote_market_not_eligible: \"Market is not eligible for leveraged trading.\",\n quote_market_not_ready: \"Market is not ready yet. Try again shortly.\",\n quote_market_not_found: \"Market not found.\",\n quote_market_risk_too_high: \"Market risk is too high right now. Try again later.\",\n quote_market_unsupported_category: \"This market category is not supported.\",\n quote_market_no_prices: \"No price data available for this market.\",\n quote_market_missing_polymarket_condition_id: \"This market is missing required Polymarket data.\",\n\n quote_polymarket_market_closed: \"This Polymarket market is closed and not accepting new positions.\",\n quote_polymarket_market_inactive: \"This Polymarket market is inactive and not accepting new positions.\",\n quote_polymarket_market_not_accepting_orders:\n \"Polymarket is not accepting orders on this market right now. Try again shortly or pick another market.\",\n quote_polymarket_missing_token: \"This Polymarket market is missing a tradable outcome token.\",\n quote_invalid_polymarket_wallet_address: \"Invalid Polymarket wallet address.\",\n quote_invalid_kalshi_wallet_address: \"Invalid Kalshi wallet address.\",\n\n kalshi_quote_market_closed: \"This Kalshi market is closed.\",\n\n quote_draft_not_found: \"This quote has expired or does not exist. Please request a new quote.\",\n\n quote_twap_data_stale: \"Reference price (TWAP) is stale. Try again shortly.\",\n quote_twap_data_unavailable: \"Reference price (TWAP) is unavailable for this market.\",\n quote_revision_required: \"Quote needs to be refreshed before submitting.\",\n quote_price_provider_not_found: \"No price provider configured for this market.\",\n\n notional_selector_insufficient_liquidity: \"Not enough liquidity at the selected size.\",\n\n evm_gas_price_circuit_breaker: \"EVM gas price is too high — trading is temporarily paused.\",\n evm_gas_price_spike: \"EVM gas price spiked. Try again shortly.\",\n evm_simulation_failed: \"Transaction simulation failed. The transaction would revert on-chain.\",\n evm_receipt_timeout: \"Transaction confirmation timed out. Check status before retrying.\",\n evm_transaction_failed: \"EVM transaction failed.\",\n\n position_transition_conflicting_operation: \"Another operation on this position is in progress. Try again shortly.\",\n position_transition_invalid_state: \"Position is not in a state that allows this action.\",\n\n quote_creation_disabled: \"Quote creation is temporarily disabled. Try again shortly.\",\n};\n\nfunction humanizeCode(code: string): string {\n const spaced = code.replace(/_/g, \" \");\n return spaced.charAt(0).toUpperCase() + spaced.slice(1);\n}\n\nexport function resolveFriendlyMessage(code: string, params: Params): string | null {\n const entry = friendlyByCode[code];\n if (entry === undefined) {\n return null;\n }\n return typeof entry === \"function\" ? entry(params) : entry;\n}\n\nexport function formatErrorMessage(code: string, params: Params): string {\n return resolveFriendlyMessage(code, params) ?? humanizeCode(code);\n}\n","import type { QuoteHint } from \"../quote/quote-error-hints\";\nimport { resolveFriendlyMessage } from \"./error-messages\";\n\nexport class DimesError extends Error {\n public readonly code: string;\n\n constructor(code: string, message: string) {\n super(message);\n this.name = \"DimesError\";\n this.code = code;\n }\n}\n\nexport class DimesApiError extends DimesError {\n public readonly status: number;\n\n public readonly type: string | null;\n\n public readonly rawMessage: string;\n\n public readonly params: Record<string, unknown> | null;\n\n public readonly hint: QuoteHint | null;\n\n constructor(options: {\n status: number;\n code: string;\n type: string | null;\n message: string;\n params: Record<string, unknown> | null;\n hint?: QuoteHint | null;\n }) {\n const friendly = resolveFriendlyMessage(options.code, options.params) ?? options.message;\n super(options.code, friendly);\n this.name = \"DimesApiError\";\n this.status = options.status;\n this.type = options.type;\n this.rawMessage = options.message;\n this.params = options.params;\n this.hint = options.hint ?? null;\n }\n}\n\nexport class DimesContractError extends DimesError {\n constructor(code: string, message: string) {\n super(code, message);\n this.name = \"DimesContractError\";\n }\n}\n"],"mappings":";AAEO,SAAS,SAAS,OAA+B;AACtD,MAAI,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,GAAG;AACvD,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,MAAM,IAAI;AACpD,UAAM,SAAS,OAAO,KAAK;AAC3B,QAAI,OAAO,SAAS,MAAM,GAAG;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,SAAS,OAA+B;AACtD,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,YAAY,UAAU,KAAK,MAAM,KAAK,CAAC,GAAG;AAC7D,WAAO,OAAO,MAAM,KAAK,CAAC;AAAA,EAC5B;AACA,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,KAAK,GAAG;AACxD,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,SAAO;AACT;AAEO,SAAS,SAAS,QAAgB,KAAsB;AAC7D,SAAO,SAAS,OAAO,GAAG,IAAI;AAChC;;;AC5BA,IAAM,eAAe;AACrB,IAAM,cAAc;AACpB,IAAM,kBAAkB;AACxB,IAAM,eAAe;AACrB,IAAM,kBAAkB;AACxB,IAAM,gBAAgB;AACtB,IAAM,YAAY;AAEX,SAAS,eAAe,OAA+B;AAC5D,QAAM,IAAI,SAAS,KAAK;AACxB,MAAI,MAAM,MAAM;AACd,WAAO;AAAA,EACT;AACA,SAAO,IAAI,IAAI,cAAc,eAAe,QAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC;AACtF;AAEO,SAAS,aAAa,OAA+B;AAC1D,QAAM,IAAI,SAAS,KAAK;AACxB,MAAI,MAAM,MAAM;AACd,WAAO;AAAA,EACT;AACA,SAAO,IAAI,IAAI,aAAa,eAAe,QAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC;AACrF;AAEO,SAAS,kBAAkB,OAA+B;AAC/D,QAAM,IAAI,SAAS,KAAK;AACxB,MAAI,MAAM,MAAM;AACd,WAAO;AAAA,EACT;AACA,SAAO,IAAI,IAAI,iBAAiB,eAAe,QAAW,EAAE,uBAAuB,EAAE,CAAC,CAAC;AACzF;AAEO,SAAS,cAAc,OAA+B;AAC3D,QAAM,MAAM,SAAS,KAAK;AAC1B,MAAI,QAAQ,MAAM;AAChB,WAAO;AAAA,EACT;AACA,QAAM,WAAW,MAAM;AACvB,QAAM,WAAW,WAAW,CAAC,MAAM;AACnC,QAAM,QAAQ,WAAW;AACzB,QAAM,OAAO,WAAW;AACxB,QAAM,SAAS,OAAO,mBAAmB;AACzC,QAAM,YAAY,IAAI,MAAM,eAAe,CAAC,IAAI,MAAM,SAAS,EAAE,SAAS,WAAW,GAAG,CAAC;AACzF,SAAO,WAAW,IAAI,SAAS,KAAK;AACtC;;;ACzCA,IAAM,iBAAgD;AAAA,EACpD,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,kCAAkC;AAAA,EAClC,wBAAwB;AAAA,EACxB,sCAAsC;AAAA,EAEtC,cAAc;AAAA,EACd,WAAW;AAAA,EAEX,qBAAqB;AAAA,EACrB,6BAA6B;AAAA,EAC7B,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,wBAAwB;AAAA,EACxB,6BAA6B;AAAA,EAC7B,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,iBAAiB;AAAA,EACjB,4BAA4B;AAAA,EAE5B,mCAAmC;AAAA,EACnC,oCAAoC;AAAA,EACpC,2BAA2B;AAAA,EAC3B,sCAAsC;AAAA,EACtC,gCAAgC;AAAA,EAChC,mCAAmC;AAAA,EACnC,0CAA0C;AAAA,EAC1C,oCAAoC;AAAA,EACpC,oCAAoC;AAAA,EAEpC,0CAA0C;AAAA,EAE1C,2BAA2B;AAAA,EAC3B,6BAA6B;AAAA,EAC7B,0CAA0C;AAAA,EAE1C,mCAAmC;AAAA,EACnC,sCAAsC;AAAA,EACtC,mCAAmC;AAAA,EACnC,oCAAoC;AAAA,EACpC,oCAAoC;AAAA,EACpC,+BAA+B;AAAA,EAC/B,qCAAqC;AAAA,EACrC,+BAA+B;AAAA,EAC/B,8BAA8B;AAAA,EAC9B,0BAA0B;AAAA,EAC1B,+BAA+B;AAAA,EAE/B,kCAAkC;AAAA,EAElC,uCAAuC,CAAC,WAAW;AACjD,UAAM,YAAY,cAAc,SAAS,QAAQ,0BAA0B,CAAC;AAC5E,WAAO,YACH,uDAAuD,SAAS,MAChE;AAAA,EACN;AAAA,EACA,oCAAoC,CAAC,WAAW;AAC9C,UAAM,YAAY,cAAc,SAAS,QAAQ,0BAA0B,CAAC;AAC5E,WAAO,YACH,4EAA4E,SAAS,MACrF;AAAA,EACN;AAAA,EACA,sCAAsC,CAAC,WAAW;AAChD,UAAM,YAAY,cAAc,SAAS,QAAQ,0BAA0B,CAAC;AAC5E,WAAO,YACH,sEAAsE,SAAS,MAC/E;AAAA,EACN;AAAA,EACA,sCAAsC,CAAC,WAAW;AAChD,UAAM,YAAY,cAAc,SAAS,QAAQ,0BAA0B,CAAC;AAC5E,WAAO,YACH,sDAAsD,SAAS,MAC/D;AAAA,EACN;AAAA,EACA,oCAAoC,CAAC,WAAW;AAC9C,UAAM,YAAY,cAAc,SAAS,QAAQ,0BAA0B,CAAC;AAC5E,WAAO,YACH,yEAAyE,SAAS,MAClF;AAAA,EACN;AAAA,EACA,8BAA8B,CAAC,WAAW;AACxC,UAAM,gBAAgB,cAAc,SAAS,QAAQ,+BAA+B,CAAC;AACrF,WAAO,gBACH,0FAA0F,aAAa,MACvG;AAAA,EACN;AAAA,EACA,+BAA+B;AAAA,EAE/B,8BAA8B;AAAA,EAC9B,yBAAyB,CAAC,WAAW;AACnC,UAAM,MAAM,aAAa,SAAS,QAAQ,gBAAgB,CAAC;AAC3D,UAAM,UAAU,aAAa,SAAS,QAAQ,oBAAoB,CAAC;AACnE,QAAI,OAAO,SAAS;AAClB,aAAO,qBAAqB,OAAO,4BAA4B,GAAG;AAAA,IACpE;AACA,QAAI,KAAK;AACP,aAAO,6CAA6C,GAAG;AAAA,IACzD;AACA,WAAO;AAAA,EACT;AAAA,EACA,yBAAyB;AAAA,EACzB,+BAA+B;AAAA,EAC/B,+BAA+B;AAAA,EAC/B,2BAA2B;AAAA,EAC3B,6BAA6B;AAAA,EAC7B,8BAA8B;AAAA,EAC9B,yBAAyB;AAAA,EACzB,gCAAgC;AAAA,EAChC,8BAA8B;AAAA,EAC9B,4BAA4B;AAAA,EAC5B,iCAAiC;AAAA,EACjC,gCAAgC;AAAA,EAChC,gCAAgC;AAAA,EAChC,gCAAgC,CAAC,WAAW;AAC1C,UAAM,UAAU,kBAAkB,SAAS,QAAQ,YAAY,CAAC;AAChE,UAAM,MAAM,kBAAkB,SAAS,QAAQ,eAAe,CAAC;AAC/D,QAAI,WAAW,KAAK;AAClB,aAAO,aAAa,OAAO,iBAAiB,GAAG;AAAA,IACjD;AACA,WAAO;AAAA,EACT;AAAA,EACA,kCAAkC;AAAA,EAClC,4BAA4B;AAAA,EAC5B,qBAAqB;AAAA,EACrB,iCAAiC;AAAA,EAEjC,8BAA8B,CAAC,WAAW;AACxC,UAAM,MAAM,eAAe,SAAS,QAAQ,gBAAgB,CAAC;AAC7D,UAAM,UAAU,eAAe,SAAS,QAAQ,oBAAoB,CAAC;AACrE,QAAI,OAAO,SAAS;AAClB,aAAO,YAAY,OAAO,kCAAkC,GAAG;AAAA,IACjE;AACA,QAAI,KAAK;AACP,aAAO,0CAA0C,GAAG;AAAA,IACtD;AACA,WAAO;AAAA,EACT;AAAA,EACA,gCAAgC,CAAC,WAAW;AAC1C,UAAM,MAAM,eAAe,SAAS,QAAQ,gBAAgB,CAAC;AAC7D,UAAM,UAAU,eAAe,SAAS,QAAQ,oBAAoB,CAAC;AACrE,QAAI,OAAO,SAAS;AAClB,aAAO,YAAY,OAAO,kCAAkC,GAAG;AAAA,IACjE;AACA,QAAI,KAAK;AACP,aAAO,0CAA0C,GAAG;AAAA,IACtD;AACA,WAAO;AAAA,EACT;AAAA,EACA,yCAAyC,CAAC,WAAW;AACnD,UAAM,MAAM,cAAc,SAAS,QAAQ,sBAAsB,CAAC;AAClE,UAAM,UAAU,cAAc,SAAS,QAAQ,0BAA0B,CAAC;AAC1E,QAAI,OAAO,SAAS;AAClB,aAAO,cAAc,OAAO,yBAAyB,GAAG,4DAA4D,GAAG;AAAA,IACzH;AACA,QAAI,KAAK;AACP,aAAO,mCAAmC,GAAG,4DAA4D,GAAG;AAAA,IAC9G;AACA,WAAO;AAAA,EACT;AAAA,EACA,kCAAkC,CAAC,WAAW;AAC5C,UAAM,MAAM,eAAe,SAAS,QAAQ,gBAAgB,CAAC;AAC7D,UAAM,UAAU,eAAe,SAAS,QAAQ,oBAAoB,CAAC;AACrE,QAAI,OAAO,SAAS;AAClB,aAAO,YAAY,OAAO,kCAAkC,GAAG;AAAA,IACjE;AACA,QAAI,KAAK;AACP,aAAO,0CAA0C,GAAG;AAAA,IACtD;AACA,WAAO;AAAA,EACT;AAAA,EACA,mCAAmC,CAAC,WAAW;AAC7C,UAAM,UAAU,eAAe,SAAS,QAAQ,oBAAoB,CAAC;AACrE,UAAM,MAAM,eAAe,SAAS,QAAQ,0BAA0B,CAAC;AACvE,QAAI,WAAW,KAAK;AAClB,aAAO,YAAY,OAAO,kDAAkD,GAAG;AAAA,IACjF;AACA,QAAI,SAAS;AACX,aAAO,YAAY,OAAO;AAAA,IAC5B;AACA,WAAO;AAAA,EACT;AAAA,EACA,8BAA8B;AAAA,EAC9B,2BAA2B;AAAA,EAC3B,8BAA8B,CAAC,WAAW;AACxC,UAAM,YAAY,aAAa,SAAS,QAAQ,oBAAoB,CAAC;AACrE,WAAO,YACH,2DAA2D,SAAS,wBACpE;AAAA,EACN;AAAA,EAEA,yBAAyB;AAAA,EACzB,2BAA2B;AAAA,EAC3B,wBAAwB;AAAA,EACxB,wBAAwB;AAAA,EACxB,4BAA4B;AAAA,EAC5B,mCAAmC;AAAA,EACnC,wBAAwB;AAAA,EACxB,8CAA8C;AAAA,EAE9C,gCAAgC;AAAA,EAChC,kCAAkC;AAAA,EAClC,8CACE;AAAA,EACF,gCAAgC;AAAA,EAChC,yCAAyC;AAAA,EACzC,qCAAqC;AAAA,EAErC,4BAA4B;AAAA,EAE5B,uBAAuB;AAAA,EAEvB,uBAAuB;AAAA,EACvB,6BAA6B;AAAA,EAC7B,yBAAyB;AAAA,EACzB,gCAAgC;AAAA,EAEhC,0CAA0C;AAAA,EAE1C,+BAA+B;AAAA,EAC/B,qBAAqB;AAAA,EACrB,uBAAuB;AAAA,EACvB,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EAExB,2CAA2C;AAAA,EAC3C,mCAAmC;AAAA,EAEnC,yBAAyB;AAC3B;AAEA,SAAS,aAAa,MAAsB;AAC1C,QAAM,SAAS,KAAK,QAAQ,MAAM,GAAG;AACrC,SAAO,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC;AACxD;AAEO,SAAS,uBAAuB,MAAc,QAA+B;AAClF,QAAM,QAAQ,eAAe,IAAI;AACjC,MAAI,UAAU,QAAW;AACvB,WAAO;AAAA,EACT;AACA,SAAO,OAAO,UAAU,aAAa,MAAM,MAAM,IAAI;AACvD;AAEO,SAAS,mBAAmB,MAAc,QAAwB;AACvE,SAAO,uBAAuB,MAAM,MAAM,KAAK,aAAa,IAAI;AAClE;;;ACxPO,IAAM,aAAN,cAAyB,MAAM;AAAA,EACpB;AAAA,EAEhB,YAAY,MAAc,SAAiB;AACzC,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,gBAAN,cAA4B,WAAW;AAAA,EAC5B;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEA;AAAA,EAEhB,YAAY,SAOT;AACD,UAAM,WAAW,uBAAuB,QAAQ,MAAM,QAAQ,MAAM,KAAK,QAAQ;AACjF,UAAM,QAAQ,MAAM,QAAQ;AAC5B,SAAK,OAAO;AACZ,SAAK,SAAS,QAAQ;AACtB,SAAK,OAAO,QAAQ;AACpB,SAAK,aAAa,QAAQ;AAC1B,SAAK,SAAS,QAAQ;AACtB,SAAK,OAAO,QAAQ,QAAQ;AAAA,EAC9B;AACF;AAEO,IAAM,qBAAN,cAAiC,WAAW;AAAA,EACjD,YAAY,MAAc,SAAiB;AACzC,UAAM,MAAM,OAAO;AACnB,SAAK,OAAO;AAAA,EACd;AACF;","names":[]}
@@ -1,7 +1,7 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
3
 
4
- var _chunkUUE4HG2Hcjs = require('./chunk-UUE4HG2H.cjs');
4
+ var _chunkDYPABUKCcjs = require('./chunk-DYPABUKC.cjs');
5
5
 
6
6
  // src/quote/build-quote-params.ts
7
7
  var DEFAULT_LEVERAGE_STEP_BPS = 2500;
@@ -51,7 +51,13 @@ function notionalPipsToCollateralUsd(notionalPips, leverageBps) {
51
51
  }
52
52
  return notionalPips * bpsPerUnit / leverageBps / pipsPerUsd;
53
53
  }
54
- function resolveMaxCollateralHint(params, context, capacityKey) {
54
+ function buildExhaustedHint(exhaustedKind, maxCollateralUsd, minCollateralUsd) {
55
+ if (exhaustedKind === "insufficient-liquidity") {
56
+ return { kind: "insufficient-liquidity", maxCollateralUsd, minCollateralUsd };
57
+ }
58
+ return { kind: "market-full" };
59
+ }
60
+ function resolveMaxCollateralHint(params, context, capacityKey, exhaustedKind) {
55
61
  const serverMaxCollateralPips = num(params, "maxSupportedCollateralUsdPips");
56
62
  const capacityPips = num(params, capacityKey);
57
63
  const minNotionalPips = num(params, "minNotionalUsdPips");
@@ -63,7 +69,7 @@ function resolveMaxCollateralHint(params, context, capacityKey) {
63
69
  return null;
64
70
  }
65
71
  if (maxCollateralUsd < minCollateralUsd) {
66
- return { kind: "market-full" };
72
+ return buildExhaustedHint(exhaustedKind, maxCollateralUsd, minCollateralUsd);
67
73
  }
68
74
  return { kind: "use-max-collateral", maxCollateralUsd, minCollateralUsd };
69
75
  }
@@ -78,10 +84,18 @@ function quoteErrorHint(code, params, context) {
78
84
  case "quote_side_position_limit_exceeded":
79
85
  case "quote_global_position_limit_exceeded":
80
86
  case "quote_partner_position_limit_exceeded":
81
- return resolveMaxCollateralHint(params, context, "availableCapacityUsdPips");
87
+ return resolveMaxCollateralHint(params, context, "availableCapacityUsdPips", "market-full");
82
88
  case "quote_insufficient_liquidity":
89
+ return resolveMaxCollateralHint(params, context, "slippageMaxUsdPips", "market-full");
83
90
  case "notional_selector_insufficient_liquidity":
84
- return resolveMaxCollateralHint(params, context, "slippageMaxUsdPips");
91
+ return resolveMaxCollateralHint(params, context, "slippageMaxUsdPips", "insufficient-liquidity");
92
+ case "quote_leverage_exceeds_collateral_floor": {
93
+ const minCollateralPips = num(params, "minCollateralUsdPips");
94
+ if (minCollateralPips === null) {
95
+ return null;
96
+ }
97
+ return { kind: "raise-collateral", minCollateralUsd: pipsToUsd(minCollateralPips) };
98
+ }
85
99
  case "quote_leverage_exceeds_maximum":
86
100
  case "quote_leverage_exceeds_model_max": {
87
101
  const maxLeverageBps = num(params, "maxLeverageBps");
@@ -145,6 +159,19 @@ function hintAdjustment(hint, current) {
145
159
  reason: "max-collateral"
146
160
  };
147
161
  }
162
+ case "raise-collateral": {
163
+ const to = Math.ceil(hint.minCollateralUsd * centsFactor) / centsFactor;
164
+ if (to <= 0) {
165
+ return null;
166
+ }
167
+ return {
168
+ field: "collateral",
169
+ fromValue: current.collateralUsd,
170
+ toValue: to,
171
+ toLabel: formatUsd(to),
172
+ reason: "min-collateral"
173
+ };
174
+ }
148
175
  case "clamp-leverage": {
149
176
  if (hint.maxLeverageBps === void 0) {
150
177
  return null;
@@ -173,8 +200,6 @@ function hintAdjustment(hint, current) {
173
200
  toLabel: `${(hint.maxSlippageBps / bpsPerPct).toFixed(decimalPlaces).replace(/\.?0+$/, "")}%`,
174
201
  reason: "raise-slippage"
175
202
  };
176
- case "market-full":
177
- return null;
178
203
  default:
179
204
  return null;
180
205
  }
@@ -183,7 +208,7 @@ function hintAdjustment(hint, current) {
183
208
  // src/quote/quote.ts
184
209
  var DEFAULT_MAX_RETRIES = 3;
185
210
  function isMarketMovedError(err) {
186
- return err instanceof _chunkUUE4HG2Hcjs.DimesApiError && marketMovedCodes.has(err.code);
211
+ return err instanceof _chunkDYPABUKCcjs.DimesApiError && marketMovedCodes.has(err.code);
187
212
  }
188
213
  function applyAdjustment(params, adj, currentParams) {
189
214
  switch (adj.field) {
@@ -209,7 +234,7 @@ function handleMarketMoved(err, attempt, maxRetries) {
209
234
  return isMarketMovedError(err) && attempt < maxRetries;
210
235
  }
211
236
  function handleCorrection(err, currentParams) {
212
- if (!(err instanceof _chunkUUE4HG2Hcjs.DimesApiError)) {
237
+ if (!(err instanceof _chunkDYPABUKCcjs.DimesApiError)) {
213
238
  return null;
214
239
  }
215
240
  const hint = quoteErrorHint(err.code, err.params, {
@@ -270,7 +295,7 @@ async function executeQuote(client, params, options) {
270
295
  throw err;
271
296
  }
272
297
  }
273
- throw new (0, _chunkUUE4HG2Hcjs.DimesError)("market_moved_retries_exhausted", "Exhausted market-moved retries");
298
+ throw new (0, _chunkDYPABUKCcjs.DimesError)("market_moved_retries_exhausted", "Exhausted market-moved retries");
274
299
  }
275
300
 
276
301
 
@@ -280,4 +305,4 @@ async function executeQuote(client, params, options) {
280
305
 
281
306
 
282
307
  exports.buildQuoteParams = buildQuoteParams; exports.marketMovedCodes = marketMovedCodes; exports.quoteErrorHint = quoteErrorHint; exports.hintAdjustment = hintAdjustment; exports.executeQuote = executeQuote;
283
- //# sourceMappingURL=chunk-JWAPH4GD.cjs.map
308
+ //# sourceMappingURL=chunk-COSLZ5TM.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/alexemery/bl/dimes-sdk/dist/chunk-COSLZ5TM.cjs","../src/quote/build-quote-params.ts","../src/quote/quote-error-hints.ts","../src/quote/quote.ts"],"names":[],"mappings":"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","file":"/Users/alexemery/bl/dimes-sdk/dist/chunk-COSLZ5TM.cjs","sourcesContent":[null,"import type { CreateOfferParams } from \"../types\";\nimport type { QuoteParams } from \"../types/quote\";\n\nconst DEFAULT_LEVERAGE_STEP_BPS = 2500;\n\nexport function buildQuoteParams(params: QuoteParams, stepBps: number = DEFAULT_LEVERAGE_STEP_BPS): CreateOfferParams {\n const leverageBps = Math.round(params.leverageBps / stepBps) * stepBps;\n const notionalUsdPips = Math.round(params.collateralUsd * leverageBps);\n\n return {\n marketTicker: params.marketTicker,\n effectiveSide: params.side,\n leverageBps,\n notionalAmountUsdPips: notionalUsdPips.toString(),\n slippageBps: params.slippageBps,\n };\n}\n","const pipsPerUsd = 10_000;\nconst bpsPerUnit = 10_000;\nconst bpsPerPct = 100;\nconst centsFactor = 100;\nconst decimalPlaces = 2;\n\nexport const marketMovedCodes = new Set([\n \"quote_slippage_too_high\",\n \"quote_insufficient_liquidity\",\n \"quote_entry_price_out_of_range\",\n \"quote_entry_bid_depth_too_low\",\n \"quote_entry_depth_too_low\",\n \"quote_entry_spread_too_wide\",\n]);\n\nexport type QuoteHint =\n | { kind: \"use-max-collateral\"; maxCollateralUsd: number; minCollateralUsd: number }\n | { kind: \"raise-collateral\"; minCollateralUsd: number }\n | { kind: \"clamp-leverage\"; maxLeverageBps?: number }\n | { kind: \"raise-leverage\"; minLeverageBps: number }\n | { kind: \"raise-slippage\"; currentSlippageBps: number; maxSlippageBps: number }\n | { kind: \"market-full\" }\n | { kind: \"insufficient-liquidity\"; maxCollateralUsd: number; minCollateralUsd: number }\n | null;\n\ntype Params = Record<string, unknown> | null | undefined;\n\nfunction num(params: Params, key: string): number | null {\n if (!params) {\n return null;\n }\n const raw = params[key];\n if (raw === null || raw === undefined) {\n return null;\n }\n // eslint-disable-next-line no-restricted-syntax\n const n = typeof raw === \"string\" ? Number(raw) : typeof raw === \"number\" ? raw : NaN;\n return Number.isFinite(n) ? n : null;\n}\n\nfunction pipsToUsd(pips: number): number {\n return pips / pipsPerUsd;\n}\n\nfunction notionalPipsToCollateralUsd(notionalPips: number, leverageBps: number): number | null {\n if (!Number.isFinite(leverageBps) || leverageBps <= 0) {\n return null;\n }\n return (notionalPips * bpsPerUnit) / leverageBps / pipsPerUsd;\n}\n\nfunction buildExhaustedHint(\n exhaustedKind: \"market-full\" | \"insufficient-liquidity\",\n maxCollateralUsd: number,\n minCollateralUsd: number,\n): QuoteHint {\n if (exhaustedKind === \"insufficient-liquidity\") {\n return { kind: \"insufficient-liquidity\", maxCollateralUsd, minCollateralUsd };\n }\n return { kind: \"market-full\" };\n}\n\nfunction resolveMaxCollateralHint(\n params: Params,\n context: { leverageBps: number },\n capacityKey: string,\n exhaustedKind: \"market-full\" | \"insufficient-liquidity\",\n): QuoteHint {\n const serverMaxCollateralPips = num(params, \"maxSupportedCollateralUsdPips\");\n const capacityPips = num(params, capacityKey);\n const minNotionalPips = num(params, \"minNotionalUsdPips\");\n\n const fromServer = serverMaxCollateralPips !== null ? pipsToUsd(serverMaxCollateralPips) : null;\n const fromCapacity = capacityPips !== null ? notionalPipsToCollateralUsd(capacityPips, context.leverageBps) : null;\n const maxCollateralUsd =\n fromServer !== null && fromCapacity !== null ? Math.min(fromServer, fromCapacity) : (fromServer ?? fromCapacity);\n\n const minCollateralUsd =\n minNotionalPips !== null ? notionalPipsToCollateralUsd(minNotionalPips, context.leverageBps) : null;\n\n if (maxCollateralUsd === null || minCollateralUsd === null) {\n return null;\n }\n if (maxCollateralUsd < minCollateralUsd) {\n return buildExhaustedHint(exhaustedKind, maxCollateralUsd, minCollateralUsd);\n }\n return { kind: \"use-max-collateral\", maxCollateralUsd, minCollateralUsd };\n}\n\n// eslint-disable-next-line complexity\nexport function quoteErrorHint(code: string | null, params: Params, context: { leverageBps: number }): QuoteHint {\n if (!code) {\n return null;\n }\n\n switch (code) {\n case \"quote_side_capacity_exceeded\":\n case \"quote_user_position_limit_exceeded\":\n case \"quote_market_position_limit_exceeded\":\n case \"quote_side_position_limit_exceeded\":\n case \"quote_global_position_limit_exceeded\":\n case \"quote_partner_position_limit_exceeded\":\n return resolveMaxCollateralHint(params, context, \"availableCapacityUsdPips\", \"market-full\");\n\n case \"quote_insufficient_liquidity\":\n return resolveMaxCollateralHint(params, context, \"slippageMaxUsdPips\", \"market-full\");\n\n case \"notional_selector_insufficient_liquidity\":\n return resolveMaxCollateralHint(params, context, \"slippageMaxUsdPips\", \"insufficient-liquidity\");\n\n case \"quote_leverage_exceeds_collateral_floor\": {\n const minCollateralPips = num(params, \"minCollateralUsdPips\");\n if (minCollateralPips === null) {\n return null;\n }\n return { kind: \"raise-collateral\", minCollateralUsd: pipsToUsd(minCollateralPips) };\n }\n\n case \"quote_leverage_exceeds_maximum\":\n case \"quote_leverage_exceeds_model_max\": {\n const maxLeverageBps = num(params, \"maxLeverageBps\");\n if (maxLeverageBps === null) {\n return null;\n }\n return { kind: \"clamp-leverage\", maxLeverageBps };\n }\n\n case \"quote_leverage_too_high_for_price\": {\n const maxLeverageBps = num(params, \"maxAcceptableLeverageBps\");\n if (maxLeverageBps === null) {\n return null;\n }\n return { kind: \"clamp-leverage\", maxLeverageBps };\n }\n\n case \"quote_leverage_below_minimum\": {\n const minLeverageBps = num(params, \"minLeverageBps\");\n if (minLeverageBps === null) {\n return null;\n }\n return { kind: \"raise-leverage\", minLeverageBps };\n }\n\n case \"quote_slippage_too_high\": {\n const currentSlippageBps = num(params, \"currentSlippageBps\");\n const maxSlippageBps = num(params, \"maxSlippageBps\");\n if (currentSlippageBps === null || maxSlippageBps === null) {\n return null;\n }\n return { kind: \"raise-slippage\", currentSlippageBps, maxSlippageBps };\n }\n\n default:\n return null;\n }\n}\n\nexport type CorrectedField = \"collateral\" | \"leverage\" | \"slippage\";\n\nexport type HintAdjustment =\n | {\n field: \"collateral\";\n fromValue: number;\n toValue: number;\n toLabel: string;\n reason: \"max-collateral\" | \"min-collateral\";\n }\n | {\n field: \"leverage\";\n fromValue: number;\n toValue: number;\n toLabel: string;\n reason: \"clamp-max\" | \"raise-min\";\n }\n | {\n field: \"slippage\";\n fromValue: number;\n toValue: number;\n toLabel: string;\n reason: \"raise-slippage\";\n }\n | null;\n\nfunction formatUsd(value: number): string {\n return new Intl.NumberFormat(\"en-US\", {\n style: \"currency\",\n currency: \"USD\",\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(value);\n}\n\nfunction bpsToMultiplier(bps: number): string {\n return `${(bps / bpsPerUnit).toFixed(1).replace(/\\.0$/, \"\")}x`;\n}\n\nexport function hintAdjustment(\n hint: QuoteHint,\n current: { collateralUsd: number; leverageBps: number; slippageBps: number },\n): HintAdjustment {\n if (!hint) {\n return null;\n }\n\n switch (hint.kind) {\n case \"use-max-collateral\": {\n const to = Math.max(0, Math.floor(hint.maxCollateralUsd * centsFactor) / centsFactor);\n if (to <= 0) {\n return null;\n }\n return {\n field: \"collateral\",\n fromValue: current.collateralUsd,\n toValue: to,\n toLabel: formatUsd(to),\n reason: \"max-collateral\",\n };\n }\n case \"raise-collateral\": {\n const to = Math.ceil(hint.minCollateralUsd * centsFactor) / centsFactor;\n if (to <= 0) {\n return null;\n }\n return {\n field: \"collateral\",\n fromValue: current.collateralUsd,\n toValue: to,\n toLabel: formatUsd(to),\n reason: \"min-collateral\",\n };\n }\n case \"clamp-leverage\": {\n if (hint.maxLeverageBps === undefined) {\n return null;\n }\n return {\n field: \"leverage\",\n fromValue: current.leverageBps,\n toValue: hint.maxLeverageBps,\n toLabel: bpsToMultiplier(hint.maxLeverageBps),\n reason: \"clamp-max\",\n };\n }\n case \"raise-leverage\":\n return {\n field: \"leverage\",\n fromValue: current.leverageBps,\n toValue: hint.minLeverageBps,\n toLabel: bpsToMultiplier(hint.minLeverageBps),\n reason: \"raise-min\",\n };\n case \"raise-slippage\":\n return {\n field: \"slippage\",\n fromValue: hint.currentSlippageBps,\n toValue: hint.maxSlippageBps,\n toLabel: `${(hint.maxSlippageBps / bpsPerPct).toFixed(decimalPlaces).replace(/\\.?0+$/, \"\")}%`,\n reason: \"raise-slippage\",\n };\n default:\n return null;\n }\n}\n","import { DimesApiError, DimesError } from \"../errors/dimes-error\";\nimport type { CreateOfferParams, Offer } from \"../types\";\nimport type { QuoteOptions, QuoteParams, QuoteResult } from \"../types/quote\";\nimport { buildQuoteParams } from \"./build-quote-params\";\nimport { type HintAdjustment, hintAdjustment, marketMovedCodes, quoteErrorHint } from \"./quote-error-hints\";\n\nexport interface QuoteClient {\n createDraftQuote(params: CreateOfferParams): Promise<Offer>;\n promoteDraftQuote(draftId: string): Promise<Offer>;\n createQuote(params: CreateOfferParams): Promise<Offer>;\n}\n\nconst DEFAULT_MAX_RETRIES = 3;\n\nfunction isMarketMovedError(err: unknown): boolean {\n return err instanceof DimesApiError && marketMovedCodes.has(err.code);\n}\n\nfunction applyAdjustment(\n params: CreateOfferParams,\n adj: NonNullable<HintAdjustment>,\n currentParams: QuoteParams,\n): CreateOfferParams {\n switch (adj.field) {\n case \"collateral\": {\n const notionalUsdPips = Math.round(adj.toValue * params.leverageBps);\n return { ...params, notionalAmountUsdPips: notionalUsdPips.toString() };\n }\n case \"leverage\": {\n const notionalUsdPips = Math.round(currentParams.collateralUsd * adj.toValue);\n return {\n ...params,\n leverageBps: adj.toValue,\n notionalAmountUsdPips: notionalUsdPips.toString(),\n };\n }\n case \"slippage\":\n return { ...params, slippageBps: adj.toValue };\n default:\n return params;\n }\n}\n\nfunction handleMarketMoved(err: unknown, attempt: number, maxRetries: number): boolean {\n return isMarketMovedError(err) && attempt < maxRetries;\n}\n\nfunction handleCorrection(err: unknown, currentParams: QuoteParams): { adj: NonNullable<HintAdjustment> } | null {\n if (!(err instanceof DimesApiError)) {\n return null;\n }\n\n const hint = quoteErrorHint(err.code, err.params, {\n leverageBps: currentParams.leverageBps,\n });\n\n const adj = hintAdjustment(hint, {\n collateralUsd: currentParams.collateralUsd,\n leverageBps: currentParams.leverageBps,\n slippageBps: currentParams.slippageBps,\n });\n\n if (!adj) {\n return null;\n }\n\n return { adj };\n}\n\n// eslint-disable-next-line complexity\nexport async function executeQuote(\n client: QuoteClient,\n params: QuoteParams,\n options?: QuoteOptions,\n): Promise<QuoteResult> {\n const maxRetries = options?.maxRetries ?? DEFAULT_MAX_RETRIES;\n const autoCorrect = options?.autoCorrect ?? true;\n const corrections: NonNullable<HintAdjustment>[] = [];\n let retries = 0;\n\n let offerParams = buildQuoteParams(params);\n const currentParams = { ...params };\n\n const draft = await client.createDraftQuote(offerParams);\n options?.onDraftReady?.(draft);\n\n let currentDraft: Offer = draft;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const promotedOffer = await client.promoteDraftQuote(currentDraft.id);\n return { offer: promotedOffer, corrections, retries };\n } catch (err) {\n if (handleMarketMoved(err, attempt, maxRetries)) {\n const newDraft = await client.createDraftQuote(offerParams);\n retries++;\n\n const callbackResult = options?.onMarketMoved?.({\n originalDraft: currentDraft,\n newDraft,\n retryCount: retries,\n });\n\n if (callbackResult === false) {\n throw err;\n }\n\n currentDraft = newDraft;\n continue;\n }\n\n if (autoCorrect) {\n const correction = handleCorrection(err, currentParams);\n\n if (correction) {\n const callbackResult = options?.onCorrection?.(correction.adj);\n if (callbackResult === false) {\n throw err;\n }\n\n offerParams = applyAdjustment(offerParams, correction.adj, currentParams);\n corrections.push(correction.adj);\n\n const correctedOffer = await client.createQuote(offerParams);\n return { offer: correctedOffer, corrections, retries };\n }\n }\n\n throw err;\n }\n }\n\n throw new DimesError(\"market_moved_retries_exhausted\", \"Exhausted market-moved retries\");\n}\n"]}