@symmio/trading-core 3.1.0 → 3.2.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 (126) hide show
  1. package/dist/index.d.ts +4 -2
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +304 -298
  4. package/dist/quotes/get-quote-history/solver-fees.d.ts +39 -0
  5. package/dist/quotes/get-quote-history/solver-fees.d.ts.map +1 -0
  6. package/dist/quotes/get-quote-history/solver-fees.js +36 -0
  7. package/dist/quotes/get-quote-history/solver-fees.js.map +1 -0
  8. package/dist/quotes/get-quote-history/to-history-row.d.ts.map +1 -1
  9. package/dist/quotes/get-quote-history/to-history-row.js +34 -30
  10. package/dist/quotes/get-quote-history/to-history-row.js.map +1 -1
  11. package/dist/quotes/get-quote-history/types.d.ts +20 -0
  12. package/dist/quotes/get-quote-history/types.d.ts.map +1 -1
  13. package/dist/quotes/get-quote-history/types.js.map +1 -1
  14. package/dist/solvers/get-solver-info/get-solver-info.d.ts +36 -0
  15. package/dist/solvers/get-solver-info/get-solver-info.d.ts.map +1 -0
  16. package/dist/solvers/get-solver-info/get-solver-info.js +28 -0
  17. package/dist/solvers/get-solver-info/get-solver-info.js.map +1 -0
  18. package/dist/solvers/get-solver-info/index.d.ts +3 -0
  19. package/dist/solvers/get-solver-info/index.d.ts.map +1 -0
  20. package/dist/solvers/get-solver-info/query.d.ts +29 -0
  21. package/dist/solvers/get-solver-info/query.d.ts.map +1 -0
  22. package/dist/solvers/get-solver-info/query.js +24 -0
  23. package/dist/solvers/get-solver-info/query.js.map +1 -0
  24. package/dist/solvers/instant-close/get-instant-close-fees/get-instant-close-fees.d.ts +152 -0
  25. package/dist/solvers/instant-close/get-instant-close-fees/get-instant-close-fees.d.ts.map +1 -0
  26. package/dist/solvers/instant-close/get-instant-close-fees/get-instant-close-fees.js +82 -0
  27. package/dist/solvers/instant-close/get-instant-close-fees/get-instant-close-fees.js.map +1 -0
  28. package/dist/solvers/instant-close/get-instant-close-fees/index.d.ts +3 -0
  29. package/dist/solvers/instant-close/get-instant-close-fees/index.d.ts.map +1 -0
  30. package/dist/solvers/instant-close/get-instant-close-fees/query.d.ts +37 -0
  31. package/dist/solvers/instant-close/get-instant-close-fees/query.d.ts.map +1 -0
  32. package/dist/solvers/instant-close/get-instant-close-fees/query.js +32 -0
  33. package/dist/solvers/instant-close/get-instant-close-fees/query.js.map +1 -0
  34. package/dist/solvers/instant-close/index.d.ts +1 -0
  35. package/dist/solvers/instant-close/index.d.ts.map +1 -1
  36. package/dist/solvers/instant-close/instant-close/instant-close.d.ts +4 -3
  37. package/dist/solvers/instant-close/instant-close/instant-close.d.ts.map +1 -1
  38. package/dist/solvers/instant-close/instant-close/instant-close.js +26 -22
  39. package/dist/solvers/instant-close/instant-close/instant-close.js.map +1 -1
  40. package/dist/solvers/instant-close/instant-close-bulk/instant-close-bulk.d.ts +2 -0
  41. package/dist/solvers/instant-close/instant-close-bulk/instant-close-bulk.d.ts.map +1 -1
  42. package/dist/solvers/instant-close/instant-close-bulk/instant-close-bulk.js +26 -22
  43. package/dist/solvers/instant-close/instant-close-bulk/instant-close-bulk.js.map +1 -1
  44. package/dist/solvers/instant-close/shared/calldata.d.ts +1 -1
  45. package/dist/solvers/instant-close/shared/calldata.d.ts.map +1 -1
  46. package/dist/solvers/instant-close/shared/calldata.js.map +1 -1
  47. package/dist/solvers/instant-close/shared/resolve-close-order-type.d.ts +13 -0
  48. package/dist/solvers/instant-close/shared/resolve-close-order-type.d.ts.map +1 -0
  49. package/dist/solvers/instant-close/shared/resolve-close-order-type.js +9 -0
  50. package/dist/solvers/instant-close/shared/resolve-close-order-type.js.map +1 -0
  51. package/dist/solvers/instant-close/shared/types.d.ts +3 -3
  52. package/dist/solvers/instant-open/get-instant-open-fees/get-instant-open-fees.d.ts +111 -35
  53. package/dist/solvers/instant-open/get-instant-open-fees/get-instant-open-fees.d.ts.map +1 -1
  54. package/dist/solvers/instant-open/get-instant-open-fees/get-instant-open-fees.js +168 -91
  55. package/dist/solvers/instant-open/get-instant-open-fees/get-instant-open-fees.js.map +1 -1
  56. package/dist/solvers/instant-open/get-instant-open-fees/query.d.ts +3 -2
  57. package/dist/solvers/instant-open/get-instant-open-fees/query.d.ts.map +1 -1
  58. package/dist/solvers/instant-open/get-instant-open-fees/query.js +4 -15
  59. package/dist/solvers/instant-open/get-instant-open-fees/query.js.map +1 -1
  60. package/dist/solvers/instant-open/prepare-instant-open-params/index.d.ts +1 -0
  61. package/dist/solvers/instant-open/prepare-instant-open-params/index.d.ts.map +1 -1
  62. package/dist/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.d.ts +108 -12
  63. package/dist/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.d.ts.map +1 -1
  64. package/dist/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.js +169 -149
  65. package/dist/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.js.map +1 -1
  66. package/dist/solvers/instant-open/prepare-instant-open-params/query.d.ts +49 -0
  67. package/dist/solvers/instant-open/prepare-instant-open-params/query.d.ts.map +1 -0
  68. package/dist/solvers/instant-open/prepare-instant-open-params/query.js +24 -0
  69. package/dist/solvers/instant-open/prepare-instant-open-params/query.js.map +1 -0
  70. package/dist/solvers/instant-open/prepare-instant-open-params/resolvers/index.d.ts +0 -1
  71. package/dist/solvers/instant-open/prepare-instant-open-params/resolvers/index.d.ts.map +1 -1
  72. package/dist/solvers/instant-open/shared/full-balance-sizing.d.ts +164 -0
  73. package/dist/solvers/instant-open/shared/full-balance-sizing.d.ts.map +1 -0
  74. package/dist/solvers/instant-open/shared/full-balance-sizing.js +138 -0
  75. package/dist/solvers/instant-open/shared/full-balance-sizing.js.map +1 -0
  76. package/dist/solvers/instant-open/shared/index.d.ts +1 -0
  77. package/dist/solvers/instant-open/shared/index.d.ts.map +1 -1
  78. package/dist/solvers/instant-open/shared/resolve-instant-open-sizing.d.ts +46 -0
  79. package/dist/solvers/instant-open/shared/resolve-instant-open-sizing.d.ts.map +1 -0
  80. package/dist/solvers/instant-open/shared/resolve-instant-open-sizing.js +50 -0
  81. package/dist/solvers/instant-open/shared/resolve-instant-open-sizing.js.map +1 -0
  82. package/dist/solvers/instant-open/shared/trade-math.d.ts +73 -26
  83. package/dist/solvers/instant-open/shared/trade-math.d.ts.map +1 -1
  84. package/dist/solvers/instant-open/shared/trade-math.js +18 -13
  85. package/dist/solvers/instant-open/shared/trade-math.js.map +1 -1
  86. package/dist/solvers/instant-open/shared/types.d.ts +18 -1
  87. package/dist/solvers/instant-open/shared/types.d.ts.map +1 -1
  88. package/dist/solvers/instant-open/shared/types.js.map +1 -1
  89. package/dist/solvers/limit-open/prepare-limit-open-params.d.ts +3 -1
  90. package/dist/solvers/limit-open/prepare-limit-open-params.d.ts.map +1 -1
  91. package/dist/solvers/limit-open/prepare-limit-open-params.js.map +1 -1
  92. package/dist/solvers/shared/resolvers/index.d.ts +2 -0
  93. package/dist/solvers/shared/resolvers/index.d.ts.map +1 -1
  94. package/dist/solvers/{instant-open/prepare-instant-open-params → shared}/resolvers/resolve-fee-rates.d.ts +3 -3
  95. package/dist/solvers/shared/resolvers/resolve-fee-rates.d.ts.map +1 -0
  96. package/dist/solvers/{instant-open/prepare-instant-open-params → shared}/resolvers/resolve-fee-rates.js +2 -2
  97. package/dist/solvers/shared/resolvers/resolve-fee-rates.js.map +1 -0
  98. package/dist/solvers/shared/resolvers/resolve-market.d.ts +21 -0
  99. package/dist/solvers/shared/resolvers/resolve-market.d.ts.map +1 -1
  100. package/dist/solvers/shared/resolvers/resolve-market.js +34 -18
  101. package/dist/solvers/shared/resolvers/resolve-market.js.map +1 -1
  102. package/dist/solvers/shared/resolvers/resolve-solver-info.d.ts +29 -0
  103. package/dist/solvers/shared/resolvers/resolve-solver-info.d.ts.map +1 -0
  104. package/dist/solvers/shared/resolvers/resolve-solver-info.js +21 -0
  105. package/dist/solvers/shared/resolvers/resolve-solver-info.js.map +1 -0
  106. package/dist/solvers/shared/resolvers/types.d.ts +12 -0
  107. package/dist/solvers/shared/resolvers/types.d.ts.map +1 -1
  108. package/dist/solvers/types/generated/enigma-solver.d.ts +43 -82
  109. package/dist/solvers/types/generated/enigma-solver.d.ts.map +1 -1
  110. package/dist/solvers/types/generated/enigma-solver.js +6 -6
  111. package/dist/solvers/types/generated/enigma-solver.js.map +1 -1
  112. package/dist/symmio-contracts/abi/v0.8.6/account-layer.d.ts +696 -85
  113. package/dist/symmio-contracts/abi/v0.8.6/account-layer.d.ts.map +1 -1
  114. package/dist/symmio-contracts/abi/v0.8.6/account-layer.js +815 -116
  115. package/dist/symmio-contracts/abi/v0.8.6/account-layer.js.map +1 -1
  116. package/dist/symmio-contracts/abi/v0.8.6/symmio.d.ts +1044 -467
  117. package/dist/symmio-contracts/abi/v0.8.6/symmio.d.ts.map +1 -1
  118. package/dist/symmio-contracts/abi/v0.8.6/symmio.js +1183 -496
  119. package/dist/symmio-contracts/abi/v0.8.6/symmio.js.map +1 -1
  120. package/dist/symmio-contracts/symmio/types.d.ts +3 -1
  121. package/dist/symmio-contracts/symmio/types.d.ts.map +1 -1
  122. package/dist/symmio-contracts/symmio/types.js +1 -1
  123. package/dist/symmio-contracts/symmio/types.js.map +1 -1
  124. package/package.json +3 -3
  125. package/dist/solvers/instant-open/prepare-instant-open-params/resolvers/resolve-fee-rates.d.ts.map +0 -1
  126. package/dist/solvers/instant-open/prepare-instant-open-params/resolvers/resolve-fee-rates.js.map +0 -1
@@ -0,0 +1,82 @@
1
+ import { SymmError as e } from "../../../shared/errors/symm-error.js";
2
+ import { calculateSolverCloseFee as t, getSolverCloseFeeRate as n } from "../../shared/solver-close-fee.js";
3
+ import { computePlatformFeeLegs as r } from "../../instant-open/shared/trade-math.js";
4
+ import { resolveFeeRates as i } from "../../shared/resolvers/resolve-fee-rates.js";
5
+ import { resolveMarkPrice as a } from "../../shared/resolvers/resolve-mark-price.js";
6
+ import { resolveMarket as o } from "../../shared/resolvers/resolve-market.js";
7
+ import { resolveSolverInfo as s } from "../../shared/resolvers/resolve-solver-info.js";
8
+ import { toDecimal as c } from "@symmio/utils/decimal";
9
+ //#region src/solvers/instant-close/get-instant-close-fees/get-instant-close-fees.ts
10
+ async function l(l, u) {
11
+ let d = Number(u.quantity);
12
+ if (!Number.isFinite(d) || d <= 0) throw new e("validation", "INVALID_TRADE_PARAMETERS", "getInstantCloseFees: quantity must be a positive decimal string.");
13
+ let f = c(u.quantity), p = l.getSolver({
14
+ chainId: u.chainId,
15
+ solverId: u.solverId
16
+ }).id === "enigma", m = await o(l, {
17
+ chainId: u.chainId,
18
+ solverId: u.solverId,
19
+ marketId: u.market.id,
20
+ marketName: u.market.name,
21
+ pricePrecision: u.market.pricePrecision,
22
+ quantityPrecision: u.market.quantityPrecision,
23
+ hedgerFeeOpen: u.market.hedgerFeeOpen,
24
+ hedgerFeeClose: u.market.hedgerFeeClose,
25
+ hedgerFeeCloseEarlyRate: u.market.hedgerFeeCloseEarlyRate,
26
+ hedgerFeeCloseEarlyThreshold: u.market.hedgerFeeCloseEarlyThreshold,
27
+ hedgerFeeCloseStandardThreshold: u.market.hedgerFeeCloseStandardThreshold,
28
+ includeHedgerFees: p
29
+ }), [h, g, _] = await Promise.all([
30
+ a(l, {
31
+ chainId: u.chainId,
32
+ solverId: u.solverId,
33
+ marketName: m.name,
34
+ markPrice: u.markPrice
35
+ }),
36
+ i(l, {
37
+ chainId: u.chainId,
38
+ subAccountAddress: u.subAccountAddress,
39
+ marketId: u.market.id,
40
+ feeRates: u.feeRates
41
+ }),
42
+ p ? s(l, {
43
+ chainId: u.chainId,
44
+ solverId: u.solverId,
45
+ solverInfo: u.solverInfo
46
+ }) : Promise.resolve({
47
+ staticSolverFeeOpen: "0",
48
+ staticSolverFeeClose: "0"
49
+ })
50
+ ]), v = c(h);
51
+ if (v.isNaN() || v.lte(0)) throw new e("validation", "INVALID_TRADE_PARAMETERS", "getInstantCloseFees: the resolved mark price is zero or invalid.");
52
+ let y = f.times(v).toString(), { platformCloseFee: b } = r(g, y, y);
53
+ if (!p) return {
54
+ kind: "rasa",
55
+ platformCloseFee: b,
56
+ notional: y,
57
+ totalFee: b
58
+ };
59
+ let x = u.now ?? Math.floor(Date.now() / 1e3), S = u.openedAt === void 0 ? 0 : x - Number(u.openedAt), C = {
60
+ hedgerFeeClose: m.hedgerFeeClose ?? "0",
61
+ hedgerFeeCloseEarlyRate: m.hedgerFeeCloseEarlyRate ?? m.hedgerFeeClose ?? "0",
62
+ hedgerFeeCloseEarlyThreshold: m.hedgerFeeCloseEarlyThreshold ?? 0,
63
+ hedgerFeeCloseStandardThreshold: m.hedgerFeeCloseStandardThreshold ?? 0
64
+ }, w = n(C, S), T = t(C, {
65
+ notional: y,
66
+ holdingSeconds: S
67
+ }), E = _.staticSolverFeeClose;
68
+ return {
69
+ kind: "enigma",
70
+ platformCloseFee: b,
71
+ notional: y,
72
+ closeSolverFee: T,
73
+ closeSolverFeeRate: w,
74
+ holdingSeconds: Math.max(0, S),
75
+ staticSolverFeeClose: E,
76
+ totalFee: c(b).plus(T).plus(E).toString()
77
+ };
78
+ }
79
+ //#endregion
80
+ export { l as getInstantCloseFees };
81
+
82
+ //# sourceMappingURL=get-instant-close-fees.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-instant-close-fees.js","names":[],"sources":["../../../../src/solvers/instant-close/get-instant-close-fees/get-instant-close-fees.ts"],"sourcesContent":["import { toDecimal } from \"@symmio/utils/decimal\";\nimport type { Address } from \"viem\";\nimport type { Config } from \"../../../core/config\";\nimport { SymmError } from \"../../../shared/errors/symm-error\";\nimport type { Compute, ReadSolverParameter } from \"../../../shared/types/properties\";\nimport type { FeeForUser } from \"../../../symmio-contracts/symmio/actions/get-fee-for-user\";\nimport type { EnigmaSolverInfo } from \"../../get-solver-info\";\nimport { computePlatformFeeLegs } from \"../../instant-open/shared/trade-math\";\nimport { resolveFeeRates, resolveMarket, resolveMarkPrice, resolveSolverInfo } from \"../../shared/resolvers\";\nimport { calculateSolverCloseFee, getSolverCloseFeeRate } from \"../../shared/solver-close-fee\";\n\n/**\n * Market identification for {@link getInstantCloseFees} — the id plus optional\n * pre-fetched metadata; every pre-filled field skips part of the market fetch.\n */\nexport interface InstantCloseFeesMarketData {\n /** Market / symbol id. */\n id: number;\n /** Pre-fetched market name. */\n name?: string;\n /** Pre-fetched price precision (decimals). */\n pricePrecision?: number;\n /** Pre-fetched quantity precision (decimals). */\n quantityPrecision?: number;\n /** Pre-fetched solver open-fee rate — only consulted for the resolver short-circuit. */\n hedgerFeeOpen?: string;\n /** Pre-fetched solver standard (floor) close-fee rate (decimal fraction string). */\n hedgerFeeClose?: string;\n /** Pre-fetched early (peak) close-fee rate (decimal fraction string). */\n hedgerFeeCloseEarlyRate?: string;\n /** Pre-fetched early-window length in seconds. */\n hedgerFeeCloseEarlyThreshold?: number;\n /** Pre-fetched standard-rate threshold in seconds. */\n hedgerFeeCloseStandardThreshold?: number;\n}\n\n/**\n * Parameters for {@link getInstantCloseFees}.\n */\nexport type GetInstantCloseFeesParameters = Compute<\n ReadSolverParameter & {\n /** PartyA the platform close-fee rate is read for (`getFeeForUser`). */\n subAccountAddress: Address;\n /** Market identification + optional pre-fetched metadata. */\n market: InstantCloseFeesMarketData;\n /** Leveraged base-asset quantity being closed (decimal string). */\n quantity: string;\n /**\n * When the position opened, in unix seconds — the holding time the solver\n * close-fee schedule is priced at is `now − openedAt`. When omitted on a\n * lowcap solver the schedule is priced at holding time `0` (the early-rate\n * worst case) — the conservative default for an unknown age.\n */\n openedAt?: bigint | number;\n /**\n * Override for \"now\" in unix seconds. Defaults to the current clock at\n * call time; pass a fixed value for deterministic previews and tests.\n */\n now?: number;\n /** Pre-fetched mark price as decimal string. When omitted, fetched via the price service. */\n markPrice?: string;\n /** Pre-fetched on-chain fee rates (matches `getFeeForUser` return). When omitted, fetched. */\n feeRates?: FeeForUser;\n /**\n * Pre-fetched solver static fees (matches `getSolverInfo` return) —\n * **lowcap/Enigma only**; ignored on any other solver kind. When omitted on\n * a lowcap solver, fetched via `getSolverInfo` (fail-soft: an unreachable\n * `/info` prices the static close leg at `\"0\"`).\n */\n solverInfo?: EnigmaSolverInfo;\n }\n>;\n\n/**\n * Fee legs every solver kind charges **at close**.\n */\nexport interface BaseInstantCloseFees {\n /**\n * Platform close fee: `getFeeForUser.closeFee × notional / 1e18` (decimal\n * string). Charged on-chain from the allocated balance after PnL settlement.\n */\n platformCloseFee: string;\n /** Close notional the rates were applied to: `quantity × markPrice` (decimal string). */\n notional: string;\n /** Sum of every close leg this kind charges (decimal string). */\n totalFee: string;\n}\n\n/**\n * Fee breakdown for a **lowcap (Enigma)** instant close. Extends the platform\n * leg with the solver legs charged at close execution.\n */\nexport interface EnigmaInstantCloseFees extends BaseInstantCloseFees {\n /** Discriminant: these fees were priced for an Enigma (lowcap) solver. */\n kind: \"enigma\";\n /**\n * Solver close fee at the priced holding time (decimal string) — the\n * schedule decays from the early (peak) rate to the standard rate as the\n * position ages. Capped on-chain by the `closeRateCap` the open signed.\n */\n closeSolverFee: string;\n /** The close-fee rate the leg was priced at (decimal fraction string) — for rate displays. */\n closeSolverFeeRate: string;\n /** Holding time the schedule was evaluated at, in seconds. */\n holdingSeconds: number;\n /**\n * Static solver close fee — a flat USD amount from the solver's `/info`\n * config, independent of the notional (decimal string). `\"0\"` when the\n * solver publishes none.\n */\n staticSolverFeeClose: string;\n}\n\n/**\n * Fee breakdown for a **majors (Rasa)** instant close — the platform close leg\n * only.\n */\nexport interface RasaInstantCloseFees extends BaseInstantCloseFees {\n /** Discriminant: these fees were priced for a Rasa (majors) solver. */\n kind: \"rasa\";\n}\n\n/**\n * Return type of {@link getInstantCloseFees}. Narrow on `kind` to reach the\n * lowcap-only legs.\n */\nexport type GetInstantCloseFeesReturnType = EnigmaInstantCloseFees | RasaInstantCloseFees;\n\n/**\n * Preview every fee closing a position pays **right now** — priced from the\n * current mark price and the position's real holding time, without signing or\n * submitting anything. The open flow deliberately does not preview these legs\n * (`getInstantOpenFees` is open-side only): at open the close notional and the\n * holding-time rate are unknown, so the honest number only exists here.\n *\n * - **Both kinds**: `platformCloseFee` (on-chain `getFeeForUser.closeFee` ×\n * close notional) — the contract charges it from the allocated balance after\n * PnL settlement.\n * - **Lowcap (Enigma) only**: `closeSolverFee` — the close-fee schedule\n * (early → standard decay) evaluated at `now − openedAt` seconds, capped\n * on-chain by the `closeRateCap` the open signed — plus the flat\n * `staticSolverFeeClose` from the solver's `/info` config.\n *\n * The holding time is stamped at call time: `now` defaults to the current\n * clock; pass it explicitly for deterministic previews. An omitted `openedAt`\n * prices the worst case (holding time `0`, the peak rate).\n *\n * @throws {SymmError} `INVALID_TRADE_PARAMETERS` when `quantity` is not a\n * positive number or the mark price resolves to zero/NaN;\n * `RESOLVE_MARKET_NOT_FOUND` / `RESOLVE_MARK_PRICE_NOT_FOUND` for\n * unresolvable inputs.\n *\n * @example\n * ```ts\n * const fees = await getInstantCloseFees(config, {\n * subAccountAddress,\n * market: { id: 1 },\n * quantity: \"2.5\",\n * openedAt: position.createTimestamp,\n * });\n * if (fees.kind === \"enigma\") console.log(fees.closeSolverFee, fees.holdingSeconds);\n * console.log(fees.totalFee);\n * ```\n */\nexport async function getInstantCloseFees(\n config: Config,\n parameters: GetInstantCloseFeesParameters,\n): Promise<GetInstantCloseFeesReturnType> {\n // `Number` first: the decimal wrapper throws on a malformed string, and this\n // guard must reject with a typed SDK error instead.\n const quantityNumber = Number(parameters.quantity);\n if (!Number.isFinite(quantityNumber) || quantityNumber <= 0) {\n throw new SymmError(\n \"validation\",\n \"INVALID_TRADE_PARAMETERS\",\n \"getInstantCloseFees: quantity must be a positive decimal string.\",\n );\n }\n const quantityDec = toDecimal(parameters.quantity);\n\n /** The solver close-fee schedule and the static leg exist only on lowcap (Enigma) solvers. */\n const isLowcap = config.getSolver({ chainId: parameters.chainId, solverId: parameters.solverId }).id === \"enigma\";\n\n const market = await resolveMarket(config, {\n chainId: parameters.chainId,\n solverId: parameters.solverId,\n marketId: parameters.market.id,\n marketName: parameters.market.name,\n pricePrecision: parameters.market.pricePrecision,\n quantityPrecision: parameters.market.quantityPrecision,\n hedgerFeeOpen: parameters.market.hedgerFeeOpen,\n hedgerFeeClose: parameters.market.hedgerFeeClose,\n hedgerFeeCloseEarlyRate: parameters.market.hedgerFeeCloseEarlyRate,\n hedgerFeeCloseEarlyThreshold: parameters.market.hedgerFeeCloseEarlyThreshold,\n hedgerFeeCloseStandardThreshold: parameters.market.hedgerFeeCloseStandardThreshold,\n includeHedgerFees: isLowcap,\n });\n const [markPrice, feeRates, staticFees] = await Promise.all([\n resolveMarkPrice(config, {\n chainId: parameters.chainId,\n solverId: parameters.solverId,\n marketName: market.name,\n markPrice: parameters.markPrice,\n }),\n resolveFeeRates(config, {\n chainId: parameters.chainId,\n subAccountAddress: parameters.subAccountAddress,\n marketId: parameters.market.id,\n feeRates: parameters.feeRates,\n }),\n // The static close fee is a lowcap leg — majors previews never fetch it.\n isLowcap\n ? resolveSolverInfo(config, {\n chainId: parameters.chainId,\n solverId: parameters.solverId,\n solverInfo: parameters.solverInfo,\n })\n : Promise.resolve({ staticSolverFeeOpen: \"0\", staticSolverFeeClose: \"0\" }),\n ]);\n\n const markPriceDec = toDecimal(markPrice);\n if (markPriceDec.isNaN() || markPriceDec.lte(0)) {\n throw new SymmError(\n \"validation\",\n \"INVALID_TRADE_PARAMETERS\",\n \"getInstantCloseFees: the resolved mark price is zero or invalid.\",\n );\n }\n const notional = quantityDec.times(markPriceDec).toString();\n\n const { platformCloseFee } = computePlatformFeeLegs(feeRates, notional, notional);\n\n if (!isLowcap) {\n return {\n kind: \"rasa\",\n platformCloseFee,\n notional,\n totalFee: platformCloseFee,\n };\n }\n\n // Holding time stamped at call time: an omitted `openedAt` prices the peak\n // (holding 0); a future `openedAt` (clock skew) clamps to 0 inside the\n // schedule helper.\n const now = parameters.now ?? Math.floor(Date.now() / 1000);\n const holdingSeconds = parameters.openedAt === undefined ? 0 : now - Number(parameters.openedAt);\n\n const schedule = {\n hedgerFeeClose: market.hedgerFeeClose ?? \"0\",\n hedgerFeeCloseEarlyRate: market.hedgerFeeCloseEarlyRate ?? market.hedgerFeeClose ?? \"0\",\n hedgerFeeCloseEarlyThreshold: market.hedgerFeeCloseEarlyThreshold ?? 0,\n hedgerFeeCloseStandardThreshold: market.hedgerFeeCloseStandardThreshold ?? 0,\n };\n const closeSolverFeeRate = getSolverCloseFeeRate(schedule, holdingSeconds);\n const closeSolverFee = calculateSolverCloseFee(schedule, { notional, holdingSeconds });\n const staticSolverFeeClose = staticFees.staticSolverFeeClose;\n\n return {\n kind: \"enigma\",\n platformCloseFee,\n notional,\n closeSolverFee,\n closeSolverFeeRate,\n holdingSeconds: Math.max(0, holdingSeconds),\n staticSolverFeeClose,\n totalFee: toDecimal(platformCloseFee).plus(closeSolverFee).plus(staticSolverFeeClose).toString(),\n };\n}\n"],"mappings":";;;;;;;;;AAoKA,eAAsB,EACpB,GACA,GACwC;CAGxC,IAAM,IAAiB,OAAO,EAAW,QAAQ;CACjD,IAAI,CAAC,OAAO,SAAS,CAAc,KAAK,KAAkB,GACxD,MAAM,IAAI,EACR,cACA,4BACA,kEACF;CAEF,IAAM,IAAc,EAAU,EAAW,QAAQ,GAG3C,IAAW,EAAO,UAAU;EAAE,SAAS,EAAW;EAAS,UAAU,EAAW;CAAS,CAAC,EAAE,OAAO,UAEnG,IAAS,MAAM,EAAc,GAAQ;EACzC,SAAS,EAAW;EACpB,UAAU,EAAW;EACrB,UAAU,EAAW,OAAO;EAC5B,YAAY,EAAW,OAAO;EAC9B,gBAAgB,EAAW,OAAO;EAClC,mBAAmB,EAAW,OAAO;EACrC,eAAe,EAAW,OAAO;EACjC,gBAAgB,EAAW,OAAO;EAClC,yBAAyB,EAAW,OAAO;EAC3C,8BAA8B,EAAW,OAAO;EAChD,iCAAiC,EAAW,OAAO;EACnD,mBAAmB;CACrB,CAAC,GACK,CAAC,GAAW,GAAU,KAAc,MAAM,QAAQ,IAAI;EAC1D,EAAiB,GAAQ;GACvB,SAAS,EAAW;GACpB,UAAU,EAAW;GACrB,YAAY,EAAO;GACnB,WAAW,EAAW;EACxB,CAAC;EACD,EAAgB,GAAQ;GACtB,SAAS,EAAW;GACpB,mBAAmB,EAAW;GAC9B,UAAU,EAAW,OAAO;GAC5B,UAAU,EAAW;EACvB,CAAC;EAED,IACI,EAAkB,GAAQ;GACxB,SAAS,EAAW;GACpB,UAAU,EAAW;GACrB,YAAY,EAAW;EACzB,CAAC,IACD,QAAQ,QAAQ;GAAE,qBAAqB;GAAK,sBAAsB;EAAI,CAAC;CAC7E,CAAC,GAEK,IAAe,EAAU,CAAS;CACxC,IAAI,EAAa,MAAM,KAAK,EAAa,IAAI,CAAC,GAC5C,MAAM,IAAI,EACR,cACA,4BACA,kEACF;CAEF,IAAM,IAAW,EAAY,MAAM,CAAY,EAAE,SAAS,GAEpD,EAAE,wBAAqB,EAAuB,GAAU,GAAU,CAAQ;CAEhF,IAAI,CAAC,GACH,OAAO;EACL,MAAM;EACN;EACA;EACA,UAAU;CACZ;CAMF,IAAM,IAAM,EAAW,OAAO,KAAK,MAAM,KAAK,IAAI,IAAI,GAAI,GACpD,IAAiB,EAAW,aAAa,KAAA,IAAY,IAAI,IAAM,OAAO,EAAW,QAAQ,GAEzF,IAAW;EACf,gBAAgB,EAAO,kBAAkB;EACzC,yBAAyB,EAAO,2BAA2B,EAAO,kBAAkB;EACpF,8BAA8B,EAAO,gCAAgC;EACrE,iCAAiC,EAAO,mCAAmC;CAC7E,GACM,IAAqB,EAAsB,GAAU,CAAc,GACnE,IAAiB,EAAwB,GAAU;EAAE;EAAU;CAAe,CAAC,GAC/E,IAAuB,EAAW;CAExC,OAAO;EACL,MAAM;EACN;EACA;EACA;EACA;EACA,gBAAgB,KAAK,IAAI,GAAG,CAAc;EAC1C;EACA,UAAU,EAAU,CAAgB,EAAE,KAAK,CAAc,EAAE,KAAK,CAAoB,EAAE,SAAS;CACjG;AACF"}
@@ -0,0 +1,3 @@
1
+ export * from './get-instant-close-fees.js';
2
+ export * from './query.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/solvers/instant-close/get-instant-close-fees/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,SAAS,CAAC"}
@@ -0,0 +1,37 @@
1
+ import { Config } from '../../../core/config/index.js';
2
+ import { Compute, ConfigKeyParameter } from '../../../shared/types/properties.js';
3
+ import { QueryParameter, SymmioQueryOptions } from '../../../shared/types/query.js';
4
+ import { GetInstantCloseFeesParameters, GetInstantCloseFeesReturnType } from './get-instant-close-fees.js';
5
+ /** Data resolved by the {@link getInstantCloseFeesQueryOptions} query. */
6
+ export type GetInstantCloseFeesData = GetInstantCloseFeesReturnType;
7
+ /** Build the TanStack Query key for {@link getInstantCloseFeesQueryOptions}. */
8
+ export declare function getInstantCloseFeesQueryKey(options: Compute<GetInstantCloseFeesParameters & ConfigKeyParameter>): readonly ["getInstantCloseFees", Record<string, unknown>];
9
+ /** Query-key type produced by {@link getInstantCloseFeesQueryKey}. */
10
+ export type GetInstantCloseFeesQueryKey = ReturnType<typeof getInstantCloseFeesQueryKey>;
11
+ /** Options accepted by {@link getInstantCloseFeesQueryOptions}. */
12
+ export type GetInstantCloseFeesOptions = Compute<GetInstantCloseFeesParameters & QueryParameter<GetInstantCloseFeesData, Error, GetInstantCloseFeesData, GetInstantCloseFeesQueryKey>>;
13
+ /** TanStack Query options returned by {@link getInstantCloseFeesQueryOptions}. */
14
+ export type GetInstantCloseFeesQueryOptions = SymmioQueryOptions<GetInstantCloseFeesData, Error, GetInstantCloseFeesData, GetInstantCloseFeesQueryKey>;
15
+ /**
16
+ * Build TanStack Query options for {@link getInstantCloseFees}. Disabled until
17
+ * a non-empty `quantity` exists, so the close-fee preview does not fire on an
18
+ * empty amount input.
19
+ *
20
+ * The holding time is stamped when the query function runs (each fetch /
21
+ * refetch re-reads the clock), so a refetch after the position ages re-prices
22
+ * the decaying solver close fee.
23
+ *
24
+ * @example
25
+ * ```ts
26
+ * useQuery(
27
+ * getInstantCloseFeesQueryOptions(config, {
28
+ * subAccountAddress,
29
+ * market: { id: 1 },
30
+ * quantity: "2.5",
31
+ * openedAt: position.createTimestamp,
32
+ * }),
33
+ * );
34
+ * ```
35
+ */
36
+ export declare function getInstantCloseFeesQueryOptions(config: Config, options: GetInstantCloseFeesOptions): GetInstantCloseFeesQueryOptions;
37
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../../src/solvers/instant-close/get-instant-close-fees/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACpF,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEtF,OAAO,EAEL,KAAK,6BAA6B,EAClC,KAAK,6BAA6B,EACnC,MAAM,0BAA0B,CAAC;AAElC,0EAA0E;AAC1E,MAAM,MAAM,uBAAuB,GAAG,6BAA6B,CAAC;AAEpE,gFAAgF;AAChF,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,OAAO,CAAC,6BAA6B,GAAG,kBAAkB,CAAC,6DAE/G;AAED,sEAAsE;AACtE,MAAM,MAAM,2BAA2B,GAAG,UAAU,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEzF,mEAAmE;AACnE,MAAM,MAAM,0BAA0B,GAAG,OAAO,CAC9C,6BAA6B,GAC3B,cAAc,CAAC,uBAAuB,EAAE,KAAK,EAAE,uBAAuB,EAAE,2BAA2B,CAAC,CACvG,CAAC;AAEF,kFAAkF;AAClF,MAAM,MAAM,+BAA+B,GAAG,kBAAkB,CAC9D,uBAAuB,EACvB,KAAK,EACL,uBAAuB,EACvB,2BAA2B,CAC5B,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,+BAA+B,CAC7C,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,0BAA0B,GAClC,+BAA+B,CAsBjC"}
@@ -0,0 +1,32 @@
1
+ import { filterQueryOptions as e } from "../../../shared/utils/query.js";
2
+ import { getInstantCloseFees as t } from "./get-instant-close-fees.js";
3
+ //#region src/solvers/instant-close/get-instant-close-fees/query.ts
4
+ function n(t) {
5
+ return ["getInstantCloseFees", e(t)];
6
+ }
7
+ function r(e, r) {
8
+ return {
9
+ ...r.query,
10
+ queryKey: n({
11
+ ...r,
12
+ configKey: e.getChainConfigKey(r.chainId)
13
+ }),
14
+ enabled: (r.query?.enabled ?? !0) && r.quantity.length > 0,
15
+ queryFn: () => t(e, {
16
+ chainId: r.chainId,
17
+ solverId: r.solverId,
18
+ subAccountAddress: r.subAccountAddress,
19
+ market: r.market,
20
+ quantity: r.quantity,
21
+ openedAt: r.openedAt,
22
+ now: r.now,
23
+ markPrice: r.markPrice,
24
+ feeRates: r.feeRates,
25
+ solverInfo: r.solverInfo
26
+ })
27
+ };
28
+ }
29
+ //#endregion
30
+ export { n as getInstantCloseFeesQueryKey, r as getInstantCloseFeesQueryOptions };
31
+
32
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","names":[],"sources":["../../../../src/solvers/instant-close/get-instant-close-fees/query.ts"],"sourcesContent":["import type { Config } from \"../../../core/config\";\nimport type { Compute, ConfigKeyParameter } from \"../../../shared/types/properties\";\nimport type { QueryParameter, SymmioQueryOptions } from \"../../../shared/types/query\";\nimport { filterQueryOptions } from \"../../../shared/utils/query\";\nimport {\n getInstantCloseFees,\n type GetInstantCloseFeesParameters,\n type GetInstantCloseFeesReturnType,\n} from \"./get-instant-close-fees\";\n\n/** Data resolved by the {@link getInstantCloseFeesQueryOptions} query. */\nexport type GetInstantCloseFeesData = GetInstantCloseFeesReturnType;\n\n/** Build the TanStack Query key for {@link getInstantCloseFeesQueryOptions}. */\nexport function getInstantCloseFeesQueryKey(options: Compute<GetInstantCloseFeesParameters & ConfigKeyParameter>) {\n return [\"getInstantCloseFees\", filterQueryOptions(options)] as const;\n}\n\n/** Query-key type produced by {@link getInstantCloseFeesQueryKey}. */\nexport type GetInstantCloseFeesQueryKey = ReturnType<typeof getInstantCloseFeesQueryKey>;\n\n/** Options accepted by {@link getInstantCloseFeesQueryOptions}. */\nexport type GetInstantCloseFeesOptions = Compute<\n GetInstantCloseFeesParameters &\n QueryParameter<GetInstantCloseFeesData, Error, GetInstantCloseFeesData, GetInstantCloseFeesQueryKey>\n>;\n\n/** TanStack Query options returned by {@link getInstantCloseFeesQueryOptions}. */\nexport type GetInstantCloseFeesQueryOptions = SymmioQueryOptions<\n GetInstantCloseFeesData,\n Error,\n GetInstantCloseFeesData,\n GetInstantCloseFeesQueryKey\n>;\n\n/**\n * Build TanStack Query options for {@link getInstantCloseFees}. Disabled until\n * a non-empty `quantity` exists, so the close-fee preview does not fire on an\n * empty amount input.\n *\n * The holding time is stamped when the query function runs (each fetch /\n * refetch re-reads the clock), so a refetch after the position ages re-prices\n * the decaying solver close fee.\n *\n * @example\n * ```ts\n * useQuery(\n * getInstantCloseFeesQueryOptions(config, {\n * subAccountAddress,\n * market: { id: 1 },\n * quantity: \"2.5\",\n * openedAt: position.createTimestamp,\n * }),\n * );\n * ```\n */\nexport function getInstantCloseFeesQueryOptions(\n config: Config,\n options: GetInstantCloseFeesOptions,\n): GetInstantCloseFeesQueryOptions {\n return {\n ...options.query,\n queryKey: getInstantCloseFeesQueryKey({\n ...options,\n configKey: config.getChainConfigKey(options.chainId),\n }),\n enabled: (options.query?.enabled ?? true) && options.quantity.length > 0,\n queryFn: () =>\n getInstantCloseFees(config, {\n chainId: options.chainId,\n solverId: options.solverId,\n subAccountAddress: options.subAccountAddress,\n market: options.market,\n quantity: options.quantity,\n openedAt: options.openedAt,\n now: options.now,\n markPrice: options.markPrice,\n feeRates: options.feeRates,\n solverInfo: options.solverInfo,\n }),\n };\n}\n"],"mappings":";;;AAcA,SAAgB,EAA4B,GAAsE;CAChH,OAAO,CAAC,uBAAuB,EAAmB,CAAO,CAAC;AAC5D;AAwCA,SAAgB,EACd,GACA,GACiC;CACjC,OAAO;EACL,GAAG,EAAQ;EACX,UAAU,EAA4B;GACpC,GAAG;GACH,WAAW,EAAO,kBAAkB,EAAQ,OAAO;EACrD,CAAC;EACD,UAAU,EAAQ,OAAO,WAAW,OAAS,EAAQ,SAAS,SAAS;EACvE,eACE,EAAoB,GAAQ;GAC1B,SAAS,EAAQ;GACjB,UAAU,EAAQ;GAClB,mBAAmB,EAAQ;GAC3B,QAAQ,EAAQ;GAChB,UAAU,EAAQ;GAClB,UAAU,EAAQ;GAClB,KAAK,EAAQ;GACb,WAAW,EAAQ;GACnB,UAAU,EAAQ;GAClB,YAAY,EAAQ;EACtB,CAAC;CACL;AACF"}
@@ -1,3 +1,4 @@
1
+ export * from './get-instant-close-fees/index.js';
1
2
  export * from './get-instant-closes/index.js';
2
3
  export * from './instant-close/index.js';
3
4
  export * from './instant-close-auto/index.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/solvers/instant-close/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/solvers/instant-close/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,UAAU,CAAC"}
@@ -19,9 +19,10 @@ export type InstantCloseParameters = Compute<WriteSolverParameter & {
19
19
  /** Order-side values (`quoteId`, `closePrice`, `quantityToClose`). */
20
20
  order: InstantCloseOrder;
21
21
  /**
22
- * Close order type: `ORDER_TYPE_MARKET` (default, instant fill at
23
- * `closePrice`) or `ORDER_TYPE_LIMIT` (majors / rasa only — writes a
24
- * **pending close** that rests at `closePrice`). Defaults to MARKET.
22
+ * Requested close order type: `ORDER_TYPE_MARKET` (default) or
23
+ * `ORDER_TYPE_LIMIT` (majors / rasa only — writes a **pending close**
24
+ * that rests at `closePrice`). Enigma market closes encode
25
+ * `OrderType.MARKET_BEST_EFFORT` (2) before signing; Rasa encodes MARKET (1).
25
26
  */
26
27
  orderType?: SolverOrderType;
27
28
  /** Override the EIP-712 salt. Defaults to a random 32-byte salt. */
@@ -1 +1 @@
1
- {"version":3,"file":"instant-close.d.ts","sourceRoot":"","sources":["../../../../src/solvers/instant-close/instant-close/instant-close.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAKtF,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;GAMG;AACH,MAAM,MAAM,sBAAsB,GAAG,OAAO,CAC1C,oBAAoB,GAAG;IACrB;;;;OAIG;IACH,MAAM,EAAE,OAAO,CAAC;IAChB,sEAAsE;IACtE,KAAK,EAAE,iBAAiB,CAAC;IACzB;;;;OAIG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,oEAAoE;IACpE,IAAI,CAAC,EAAE,GAAG,CAAC;IACX;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CACF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,sBAAsB,GACjC,OAAO,CAAC,sBAAsB,CAAC,CAyCjC"}
1
+ {"version":3,"file":"instant-close.d.ts","sourceRoot":"","sources":["../../../../src/solvers/instant-close/instant-close/instant-close.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAMtF,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;GAMG;AACH,MAAM,MAAM,sBAAsB,GAAG,OAAO,CAC1C,oBAAoB,GAAG;IACrB;;;;OAIG;IACH,MAAM,EAAE,OAAO,CAAC;IAChB,sEAAsE;IACtE,KAAK,EAAE,iBAAiB,CAAC;IACzB;;;;;OAKG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,oEAAoE;IACpE,IAAI,CAAC,EAAE,GAAG,CAAC;IACX;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CACF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,sBAAsB,GACjC,OAAO,CAAC,sBAAsB,CAAC,CA0CjC"}
@@ -3,36 +3,40 @@ import "../../instant-open/shared/types.js";
3
3
  import { getLimitOrderDeadline as n, getMarketOrderDeadline as r } from "../../instant-open/shared/trade-math.js";
4
4
  import { encodeRequestToClosePosition as i } from "../shared/calldata.js";
5
5
  import { sendInstantClose as a } from "../shared/hedger-api.js";
6
+ import { resolveCloseOrderType as o } from "../shared/resolve-close-order-type.js";
6
7
  //#region src/solvers/instant-close/instant-close/instant-close.ts
7
- async function o(o, s) {
8
- let { symmioAddress: c } = o.getChainConfig(s.chainId).addresses, l = await o.getWalletClient({
9
- chainId: s.chainId,
10
- from: s.from
11
- }), u = l.account.address, d = s.orderType ?? 1, f = s.deadline ?? (d === 0 ? n() : r()), p = await t(o, {
8
+ async function s(s, c) {
9
+ let { symmioAddress: l } = s.getChainConfig(c.chainId).addresses, u = s.getSolver({
10
+ chainId: c.chainId,
11
+ solverId: c.solverId
12
+ }), d = await s.getWalletClient({
13
+ chainId: c.chainId,
14
+ from: c.from
15
+ }), f = d.account.address, p = o(u.id, c.orderType ?? 1), m = c.deadline ?? (p === 0 ? n() : r()), h = await t(s, {
12
16
  operation: e({
13
- signer: u,
14
- target: c,
17
+ signer: f,
18
+ target: l,
15
19
  callData: i({
16
- quoteId: s.order.quoteId,
17
- closePrice: s.order.closePrice,
18
- quantityToClose: s.order.quantityToClose,
19
- orderType: d,
20
- deadline: f
20
+ quoteId: c.order.quoteId,
21
+ closePrice: c.order.closePrice,
22
+ quantityToClose: c.order.quantityToClose,
23
+ orderType: p,
24
+ deadline: m
21
25
  }),
22
- signerAccount: s.partyA,
23
- deadline: f,
24
- salt: s.salt
26
+ signerAccount: c.partyA,
27
+ deadline: m,
28
+ salt: c.salt
25
29
  }),
26
- chainId: s.chainId,
27
- walletClient: l
30
+ chainId: c.chainId,
31
+ walletClient: d
28
32
  });
29
- return await a(o, {
30
- chainId: s.chainId,
31
- solverId: s.solverId,
32
- operations: [p]
33
+ return await a(s, {
34
+ chainId: c.chainId,
35
+ solverId: u.id,
36
+ operations: [h]
33
37
  }), { success: !0 };
34
38
  }
35
39
  //#endregion
36
- export { o as instantClose };
40
+ export { s as instantClose };
37
41
 
38
42
  //# sourceMappingURL=instant-close.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"instant-close.js","names":[],"sources":["../../../../src/solvers/instant-close/instant-close/instant-close.ts"],"sourcesContent":["import type { Address, Hex } from \"viem\";\nimport type { Config } from \"../../../core/config\";\nimport type { Compute, WriteSolverParameter } from \"../../../shared/types/properties\";\nimport { buildSignedOperation, signAndFormatInstantOperation } from \"../../instant-open/shared/operations\";\nimport { getLimitOrderDeadline, getMarketOrderDeadline } from \"../../instant-open/shared/trade-math\";\nimport { encodeRequestToClosePosition } from \"../shared/calldata\";\nimport { sendInstantClose } from \"../shared/hedger-api\";\nimport {\n ORDER_TYPE_LIMIT,\n ORDER_TYPE_MARKET,\n type InstantCloseOrder,\n type InstantCloseReturnType,\n type SolverOrderType,\n} from \"../shared/types\";\n\n/**\n * Parameters for the pure {@link instantClose} primitive.\n *\n * Every domain value is the **final** 18-decimal-wei `bigint` ready to feed\n * `requestToClosePosition`. The caller (or the `prepareInstantCloseParams`\n * wizard) is responsible for trade math.\n */\nexport type InstantCloseParameters = Compute<\n WriteSolverParameter & {\n /**\n * PartyA — the account that owns the position and signs the close\n * (EIP-712 `signerAccount`). The VA address on Enigma (lowcap); the\n * sub-account itself on Rasa (cross-margin, no VA).\n */\n partyA: Address;\n /** Order-side values (`quoteId`, `closePrice`, `quantityToClose`). */\n order: InstantCloseOrder;\n /**\n * Close order type: `ORDER_TYPE_MARKET` (default, instant fill at\n * `closePrice`) or `ORDER_TYPE_LIMIT` (majors / rasa only — writes a\n * **pending close** that rests at `closePrice`). Defaults to MARKET.\n */\n orderType?: SolverOrderType;\n /** Override the EIP-712 salt. Defaults to a random 32-byte salt. */\n salt?: Hex;\n /**\n * Override the unix-seconds deadline. Defaults to `now + 300s` for a market\n * close, `now + 900s` (15 min) for a limit close.\n */\n deadline?: bigint;\n }\n>;\n\n/**\n * Close (or partially close) a lowcap instant position via the InstantLayer\n * v2 flow.\n *\n * Pure primitive — every domain value is already final wei. Builds calldata\n * for one `requestToClosePosition`, signs an EIP-712 `SignedOperation`, and\n * submits it to the chain's solver/hedger `/instant_trade/instant_close`\n * endpoint. Does no math, no fetching.\n *\n * Use `prepareInstantCloseParams` to derive this shape from UI-shape inputs,\n * or `instantCloseAuto` for the combined convenience.\n *\n * @throws {SymmApiError} when the hedger request fails.\n *\n * @example\n * ```ts\n * const { success } = await instantClose(config, {\n * partyA,\n * order: {\n * quoteId: 42n,\n * closePrice: 50_000_000_000_000_000_000n,\n * quantityToClose: 1_000_000_000_000_000_000n,\n * },\n * });\n * ```\n */\nexport async function instantClose(\n config: Config,\n parameters: InstantCloseParameters,\n): Promise<InstantCloseReturnType> {\n const chainConfig = config.getChainConfig(parameters.chainId);\n const { symmioAddress } = chainConfig.addresses;\n\n const walletClient = await config.getWalletClient({ chainId: parameters.chainId, from: parameters.from });\n const signerAddress = walletClient.account.address;\n\n const orderType = parameters.orderType ?? ORDER_TYPE_MARKET;\n const deadline =\n parameters.deadline ?? (orderType === ORDER_TYPE_LIMIT ? getLimitOrderDeadline() : getMarketOrderDeadline());\n\n const callData = encodeRequestToClosePosition({\n quoteId: parameters.order.quoteId,\n closePrice: parameters.order.closePrice,\n quantityToClose: parameters.order.quantityToClose,\n orderType,\n deadline,\n });\n\n const operation = buildSignedOperation({\n signer: signerAddress,\n target: symmioAddress,\n callData,\n signerAccount: parameters.partyA,\n deadline,\n salt: parameters.salt,\n });\n\n const signed = await signAndFormatInstantOperation(config, {\n operation,\n chainId: parameters.chainId,\n walletClient,\n });\n\n await sendInstantClose(config, {\n chainId: parameters.chainId,\n solverId: parameters.solverId,\n operations: [signed],\n });\n\n return { success: true };\n}\n"],"mappings":";;;;;;AA0EA,eAAsB,EACpB,GACA,GACiC;CAEjC,IAAM,EAAE,qBADY,EAAO,eAAe,EAAW,OAC3B,EAAY,WAEhC,IAAe,MAAM,EAAO,gBAAgB;EAAE,SAAS,EAAW;EAAS,MAAM,EAAW;CAAK,CAAC,GAClG,IAAgB,EAAa,QAAQ,SAErC,IAAY,EAAW,aAAA,GACvB,IACJ,EAAW,aAAa,MAAA,IAAiC,EAAsB,IAAI,EAAuB,IAmBtG,IAAS,MAAM,EAA8B,GAAQ;EACzD,WAVgB,EAAqB;GACrC,QAAQ;GACR,QAAQ;GACR,UAXe,EAA6B;IAC5C,SAAS,EAAW,MAAM;IAC1B,YAAY,EAAW,MAAM;IAC7B,iBAAiB,EAAW,MAAM;IAClC;IACA;GACF,CAKE;GACA,eAAe,EAAW;GAC1B;GACA,MAAM,EAAW;EACnB,CAGE;EACA,SAAS,EAAW;EACpB;CACF,CAAC;CAQD,OANA,MAAM,EAAiB,GAAQ;EAC7B,SAAS,EAAW;EACpB,UAAU,EAAW;EACrB,YAAY,CAAC,CAAM;CACrB,CAAC,GAEM,EAAE,SAAS,GAAK;AACzB"}
1
+ {"version":3,"file":"instant-close.js","names":[],"sources":["../../../../src/solvers/instant-close/instant-close/instant-close.ts"],"sourcesContent":["import type { Address, Hex } from \"viem\";\nimport type { Config } from \"../../../core/config\";\nimport type { Compute, WriteSolverParameter } from \"../../../shared/types/properties\";\nimport { buildSignedOperation, signAndFormatInstantOperation } from \"../../instant-open/shared/operations\";\nimport { getLimitOrderDeadline, getMarketOrderDeadline } from \"../../instant-open/shared/trade-math\";\nimport { encodeRequestToClosePosition } from \"../shared/calldata\";\nimport { sendInstantClose } from \"../shared/hedger-api\";\nimport { resolveCloseOrderType } from \"../shared/resolve-close-order-type\";\nimport {\n ORDER_TYPE_LIMIT,\n ORDER_TYPE_MARKET,\n type InstantCloseOrder,\n type InstantCloseReturnType,\n type SolverOrderType,\n} from \"../shared/types\";\n\n/**\n * Parameters for the pure {@link instantClose} primitive.\n *\n * Every domain value is the **final** 18-decimal-wei `bigint` ready to feed\n * `requestToClosePosition`. The caller (or the `prepareInstantCloseParams`\n * wizard) is responsible for trade math.\n */\nexport type InstantCloseParameters = Compute<\n WriteSolverParameter & {\n /**\n * PartyA — the account that owns the position and signs the close\n * (EIP-712 `signerAccount`). The VA address on Enigma (lowcap); the\n * sub-account itself on Rasa (cross-margin, no VA).\n */\n partyA: Address;\n /** Order-side values (`quoteId`, `closePrice`, `quantityToClose`). */\n order: InstantCloseOrder;\n /**\n * Requested close order type: `ORDER_TYPE_MARKET` (default) or\n * `ORDER_TYPE_LIMIT` (majors / rasa only — writes a **pending close**\n * that rests at `closePrice`). Enigma market closes encode\n * `OrderType.MARKET_BEST_EFFORT` (2) before signing; Rasa encodes MARKET (1).\n */\n orderType?: SolverOrderType;\n /** Override the EIP-712 salt. Defaults to a random 32-byte salt. */\n salt?: Hex;\n /**\n * Override the unix-seconds deadline. Defaults to `now + 300s` for a market\n * close, `now + 900s` (15 min) for a limit close.\n */\n deadline?: bigint;\n }\n>;\n\n/**\n * Close (or partially close) a lowcap instant position via the InstantLayer\n * v2 flow.\n *\n * Pure primitive — every domain value is already final wei. Builds calldata\n * for one `requestToClosePosition`, signs an EIP-712 `SignedOperation`, and\n * submits it to the chain's solver/hedger `/instant_trade/instant_close`\n * endpoint. Does no math, no fetching.\n *\n * Use `prepareInstantCloseParams` to derive this shape from UI-shape inputs,\n * or `instantCloseAuto` for the combined convenience.\n *\n * @throws {SymmApiError} when the hedger request fails.\n *\n * @example\n * ```ts\n * const { success } = await instantClose(config, {\n * partyA,\n * order: {\n * quoteId: 42n,\n * closePrice: 50_000_000_000_000_000_000n,\n * quantityToClose: 1_000_000_000_000_000_000n,\n * },\n * });\n * ```\n */\nexport async function instantClose(\n config: Config,\n parameters: InstantCloseParameters,\n): Promise<InstantCloseReturnType> {\n const chainConfig = config.getChainConfig(parameters.chainId);\n const { symmioAddress } = chainConfig.addresses;\n const solver = config.getSolver({ chainId: parameters.chainId, solverId: parameters.solverId });\n\n const walletClient = await config.getWalletClient({ chainId: parameters.chainId, from: parameters.from });\n const signerAddress = walletClient.account.address;\n\n const orderType = resolveCloseOrderType(solver.id, parameters.orderType ?? ORDER_TYPE_MARKET);\n const deadline =\n parameters.deadline ?? (orderType === ORDER_TYPE_LIMIT ? getLimitOrderDeadline() : getMarketOrderDeadline());\n\n const callData = encodeRequestToClosePosition({\n quoteId: parameters.order.quoteId,\n closePrice: parameters.order.closePrice,\n quantityToClose: parameters.order.quantityToClose,\n orderType,\n deadline,\n });\n\n const operation = buildSignedOperation({\n signer: signerAddress,\n target: symmioAddress,\n callData,\n signerAccount: parameters.partyA,\n deadline,\n salt: parameters.salt,\n });\n\n const signed = await signAndFormatInstantOperation(config, {\n operation,\n chainId: parameters.chainId,\n walletClient,\n });\n\n await sendInstantClose(config, {\n chainId: parameters.chainId,\n solverId: solver.id,\n operations: [signed],\n });\n\n return { success: true };\n}\n"],"mappings":";;;;;;;AA4EA,eAAsB,EACpB,GACA,GACiC;CAEjC,IAAM,EAAE,qBADY,EAAO,eAAe,EAAW,OAC3B,EAAY,WAChC,IAAS,EAAO,UAAU;EAAE,SAAS,EAAW;EAAS,UAAU,EAAW;CAAS,CAAC,GAExF,IAAe,MAAM,EAAO,gBAAgB;EAAE,SAAS,EAAW;EAAS,MAAM,EAAW;CAAK,CAAC,GAClG,IAAgB,EAAa,QAAQ,SAErC,IAAY,EAAsB,EAAO,IAAI,EAAW,aAAA,CAA8B,GACtF,IACJ,EAAW,aAAa,MAAA,IAAiC,EAAsB,IAAI,EAAuB,IAmBtG,IAAS,MAAM,EAA8B,GAAQ;EACzD,WAVgB,EAAqB;GACrC,QAAQ;GACR,QAAQ;GACR,UAXe,EAA6B;IAC5C,SAAS,EAAW,MAAM;IAC1B,YAAY,EAAW,MAAM;IAC7B,iBAAiB,EAAW,MAAM;IAClC;IACA;GACF,CAKE;GACA,eAAe,EAAW;GAC1B;GACA,MAAM,EAAW;EACnB,CAGE;EACA,SAAS,EAAW;EACpB;CACF,CAAC;CAQD,OANA,MAAM,EAAiB,GAAQ;EAC7B,SAAS,EAAW;EACpB,UAAU,EAAO;EACjB,YAAY,CAAC,CAAM;CACrB,CAAC,GAEM,EAAE,SAAS,GAAK;AACzB"}
@@ -50,6 +50,8 @@ export interface InstantCloseBulkReturnType {
50
50
  *
51
51
  * Pure primitive — every domain value is already final wei. Use
52
52
  * `instantCloseBulkAuto` to derive these inputs from UI-shape parameters.
53
+ * Enigma market closes encode `OrderType.MARKET_BEST_EFFORT` (2) before
54
+ * signing; Rasa market closes encode MARKET (1).
53
55
  *
54
56
  * @throws {SymmError} `INSTANT_CLOSE_BULK_INVALID_ORDERS` when the batch is
55
57
  * empty or exceeds {@link MAX_INSTANT_CLOSE_BULK_ORDERS}.
@@ -1 +1 @@
1
- {"version":3,"file":"instant-close-bulk.d.ts","sourceRoot":"","sources":["../../../../src/solvers/instant-close/instant-close-bulk/instant-close-bulk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAKtF,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE5E,8FAA8F;AAC9F,eAAO,MAAM,6BAA6B,MAAM,CAAC;AAEjD;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,wEAAwE;IACxE,MAAM,EAAE,OAAO,CAAC;IAChB,4EAA4E;IAC5E,KAAK,EAAE,iBAAiB,CAAC;IACzB,mFAAmF;IACnF,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,0BAA0B,GAAG,OAAO,CAC9C,oBAAoB,GAAG;IACrB,gFAAgF;IAChF,MAAM,EAAE,SAAS,qBAAqB,EAAE,CAAC;CAC1C,CACF,CAAC;AAEF,+CAA+C;AAC/C,MAAM,WAAW,0BAA0B;IACzC,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,OAAO,EAAE,IAAI,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,0BAA0B,GACrC,OAAO,CAAC,0BAA0B,CAAC,CA4DrC"}
1
+ {"version":3,"file":"instant-close-bulk.d.ts","sourceRoot":"","sources":["../../../../src/solvers/instant-close/instant-close-bulk/instant-close-bulk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAEnD,OAAO,KAAK,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAMtF,OAAO,EAAqB,KAAK,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAE5E,8FAA8F;AAC9F,eAAO,MAAM,6BAA6B,MAAM,CAAC;AAEjD;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC,wEAAwE;IACxE,MAAM,EAAE,OAAO,CAAC;IAChB,4EAA4E;IAC5E,KAAK,EAAE,iBAAiB,CAAC;IACzB,mFAAmF;IACnF,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,0BAA0B,GAAG,OAAO,CAC9C,oBAAoB,GAAG;IACrB,gFAAgF;IAChF,MAAM,EAAE,SAAS,qBAAqB,EAAE,CAAC;CAC1C,CACF,CAAC;AAEF,+CAA+C;AAC/C,MAAM,WAAW,0BAA0B;IACzC,kCAAkC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,uEAAuE;IACvE,OAAO,EAAE,IAAI,CAAC;CACf;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,0BAA0B,GACrC,OAAO,CAAC,0BAA0B,CAAC,CA4DrC"}
@@ -4,46 +4,50 @@ import "../../instant-open/shared/types.js";
4
4
  import { getMarketOrderDeadline as r } from "../../instant-open/shared/trade-math.js";
5
5
  import { encodeRequestToClosePosition as i } from "../shared/calldata.js";
6
6
  import { sendInstantClose as a } from "../shared/hedger-api.js";
7
+ import { resolveCloseOrderType as o } from "../shared/resolve-close-order-type.js";
7
8
  //#region src/solvers/instant-close/instant-close-bulk/instant-close-bulk.ts
8
- var o = 100;
9
- async function s(o, s) {
10
- if (s.orders.length === 0) throw new e("validation", "INSTANT_CLOSE_BULK_INVALID_ORDERS", "instantCloseBulk: at least one order is required.");
11
- if (s.orders.length > 100) throw new e("validation", "INSTANT_CLOSE_BULK_INVALID_ORDERS", `instantCloseBulk: at most 100 orders per call; received ${s.orders.length}.`);
12
- let { symmioAddress: c } = o.getChainConfig(s.chainId).addresses, l = await o.getWalletClient({
13
- chainId: s.chainId,
14
- from: s.from
15
- }), u = l.account.address, d = [];
16
- for (let e of s.orders) {
17
- let a = e.deadline ?? r(), f = await n(o, {
9
+ var s = 100;
10
+ async function c(s, c) {
11
+ if (c.orders.length === 0) throw new e("validation", "INSTANT_CLOSE_BULK_INVALID_ORDERS", "instantCloseBulk: at least one order is required.");
12
+ if (c.orders.length > 100) throw new e("validation", "INSTANT_CLOSE_BULK_INVALID_ORDERS", `instantCloseBulk: at most 100 orders per call; received ${c.orders.length}.`);
13
+ let { symmioAddress: l } = s.getChainConfig(c.chainId).addresses, u = s.getSolver({
14
+ chainId: c.chainId,
15
+ solverId: c.solverId
16
+ }), d = o(u.id, 1), f = await s.getWalletClient({
17
+ chainId: c.chainId,
18
+ from: c.from
19
+ }), p = f.account.address, m = [];
20
+ for (let e of c.orders) {
21
+ let a = e.deadline ?? r(), o = await n(s, {
18
22
  operation: t({
19
- signer: u,
20
- target: c,
23
+ signer: p,
24
+ target: l,
21
25
  callData: i({
22
26
  quoteId: e.order.quoteId,
23
27
  closePrice: e.order.closePrice,
24
28
  quantityToClose: e.order.quantityToClose,
25
- orderType: 1,
29
+ orderType: d,
26
30
  deadline: a
27
31
  }),
28
32
  signerAccount: e.partyA,
29
33
  deadline: a,
30
34
  salt: e.salt
31
35
  }),
32
- chainId: s.chainId,
33
- walletClient: l
36
+ chainId: c.chainId,
37
+ walletClient: f
34
38
  });
35
- d.push(f);
39
+ m.push(o);
36
40
  }
37
- return await a(o, {
38
- chainId: s.chainId,
39
- solverId: s.solverId,
40
- operations: d
41
+ return await a(s, {
42
+ chainId: c.chainId,
43
+ solverId: u.id,
44
+ operations: m
41
45
  }), {
42
- count: d.length,
46
+ count: m.length,
43
47
  success: !0
44
48
  };
45
49
  }
46
50
  //#endregion
47
- export { o as MAX_INSTANT_CLOSE_BULK_ORDERS, s as instantCloseBulk };
51
+ export { s as MAX_INSTANT_CLOSE_BULK_ORDERS, c as instantCloseBulk };
48
52
 
49
53
  //# sourceMappingURL=instant-close-bulk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"instant-close-bulk.js","names":[],"sources":["../../../../src/solvers/instant-close/instant-close-bulk/instant-close-bulk.ts"],"sourcesContent":["import type { Address, Hex } from \"viem\";\nimport type { Config } from \"../../../core/config\";\nimport { SymmError } from \"../../../shared/errors/symm-error\";\nimport type { Compute, WriteSolverParameter } from \"../../../shared/types/properties\";\nimport { buildSignedOperation, signAndFormatInstantOperation } from \"../../instant-open/shared/operations\";\nimport { getMarketOrderDeadline } from \"../../instant-open/shared/trade-math\";\nimport { encodeRequestToClosePosition } from \"../shared/calldata\";\nimport { sendInstantClose } from \"../shared/hedger-api\";\nimport { ORDER_TYPE_MARKET, type InstantCloseOrder } from \"../shared/types\";\n\n/** Maximum orders per {@link instantCloseBulk} call (matches the hedger's `1–100` window). */\nexport const MAX_INSTANT_CLOSE_BULK_ORDERS = 100;\n\n/**\n * One position contributing to a {@link instantCloseBulk} batch. Each entry is\n * already fully-resolved: a VA address, the wei-shape order, and optional\n * per-order salt / deadline overrides.\n */\nexport interface InstantCloseBulkOrder {\n /** PartyA — the VA that owns the position (EIP-712 `signerAccount`). */\n partyA: Address;\n /** Already-final wei order (`quoteId`, `closePrice`, `quantityToClose`). */\n order: InstantCloseOrder;\n /** Override the EIP-712 salt for this order. Defaults to a random 32-byte salt. */\n salt?: Hex;\n /** Override the unix-seconds deadline for this order. Defaults to `now + 300s`. */\n deadline?: bigint;\n}\n\n/**\n * Parameters for {@link instantCloseBulk}.\n *\n * The wallet client identified by `from` is reused to sign every order, so all\n * orders in a batch share the same signer (the subaccount-level session key).\n * Each order may still target a different VA via its own `partyA` — the\n * delegation lives on the subaccount and is inherited by every owned VA.\n */\nexport type InstantCloseBulkParameters = Compute<\n WriteSolverParameter & {\n /** Orders to submit. Length must be in `[1, MAX_INSTANT_CLOSE_BULK_ORDERS]`. */\n orders: readonly InstantCloseBulkOrder[];\n }\n>;\n\n/** Return type of {@link instantCloseBulk}. */\nexport interface InstantCloseBulkReturnType {\n /** Number of orders submitted. */\n count: number;\n /** Always `true` on success — the hedger returns no per-order body. */\n success: true;\n}\n\n/**\n * Close multiple lowcap positions in one solver round-trip via the InstantLayer\n * v2 `/instant_trade/instant_close` endpoint, which natively accepts 1–100\n * signed operations per request.\n *\n * Each order is signed with the same wallet client (the session key bound to\n * `from`), so the caller must hold a `requestToClosePosition` delegation on\n * the owning subaccount. The delegation is inherited by every owned VA, so\n * orders across different VAs in the same subaccount sign with one key.\n *\n * Pure primitive — every domain value is already final wei. Use\n * `instantCloseBulkAuto` to derive these inputs from UI-shape parameters.\n *\n * @throws {SymmError} `INSTANT_CLOSE_BULK_INVALID_ORDERS` when the batch is\n * empty or exceeds {@link MAX_INSTANT_CLOSE_BULK_ORDERS}.\n * @throws {SymmApiError} when the hedger request fails — the whole batch is\n * rejected; the caller should retry with fewer orders.\n *\n * @example\n * ```ts\n * await instantCloseBulk(config, {\n * from: sessionKey,\n * orders: [\n * { partyA: vaA, order: { quoteId: 1n, closePrice: …, quantityToClose: … } },\n * { partyA: vaB, order: { quoteId: 2n, closePrice: …, quantityToClose: … } },\n * ],\n * });\n * ```\n */\nexport async function instantCloseBulk(\n config: Config,\n parameters: InstantCloseBulkParameters,\n): Promise<InstantCloseBulkReturnType> {\n if (parameters.orders.length === 0) {\n throw new SymmError(\n \"validation\",\n \"INSTANT_CLOSE_BULK_INVALID_ORDERS\",\n \"instantCloseBulk: at least one order is required.\",\n );\n }\n if (parameters.orders.length > MAX_INSTANT_CLOSE_BULK_ORDERS) {\n throw new SymmError(\n \"validation\",\n \"INSTANT_CLOSE_BULK_INVALID_ORDERS\",\n `instantCloseBulk: at most ${MAX_INSTANT_CLOSE_BULK_ORDERS} orders per call; received ${parameters.orders.length}.`,\n );\n }\n\n const chainConfig = config.getChainConfig(parameters.chainId);\n const { symmioAddress } = chainConfig.addresses;\n\n const walletClient = await config.getWalletClient({ chainId: parameters.chainId, from: parameters.from });\n const signerAddress = walletClient.account.address;\n\n const signedOperations = [] as Awaited<ReturnType<typeof signAndFormatInstantOperation>>[];\n for (const entry of parameters.orders) {\n const deadline = entry.deadline ?? getMarketOrderDeadline();\n\n const callData = encodeRequestToClosePosition({\n quoteId: entry.order.quoteId,\n closePrice: entry.order.closePrice,\n quantityToClose: entry.order.quantityToClose,\n orderType: ORDER_TYPE_MARKET,\n deadline,\n });\n\n const operation = buildSignedOperation({\n signer: signerAddress,\n target: symmioAddress,\n callData,\n signerAccount: entry.partyA,\n deadline,\n salt: entry.salt,\n });\n\n const signed = await signAndFormatInstantOperation(config, {\n operation,\n chainId: parameters.chainId,\n walletClient,\n });\n signedOperations.push(signed);\n }\n\n await sendInstantClose(config, {\n chainId: parameters.chainId,\n // Forward the resolved solver so a bulk close on a rasa chain hits its own\n // endpoint instead of falling back to the chain default.\n solverId: parameters.solverId,\n operations: signedOperations,\n });\n\n return { count: signedOperations.length, success: true };\n}\n"],"mappings":";;;;;;;AAWA,IAAa,IAAgC;AAsE7C,eAAsB,EACpB,GACA,GACqC;CACrC,IAAI,EAAW,OAAO,WAAW,GAC/B,MAAM,IAAI,EACR,cACA,qCACA,mDACF;CAEF,IAAI,EAAW,OAAO,SAAA,KACpB,MAAM,IAAI,EACR,cACA,qCACA,2DAAwF,EAAW,OAAO,OAAO,EACnH;CAIF,IAAM,EAAE,qBADY,EAAO,eAAe,EAAW,OAC3B,EAAY,WAEhC,IAAe,MAAM,EAAO,gBAAgB;EAAE,SAAS,EAAW;EAAS,MAAM,EAAW;CAAK,CAAC,GAClG,IAAgB,EAAa,QAAQ,SAErC,IAAmB,CAAC;CAC1B,KAAK,IAAM,KAAS,EAAW,QAAQ;EACrC,IAAM,IAAW,EAAM,YAAY,EAAuB,GAmBpD,IAAS,MAAM,EAA8B,GAAQ;GACzD,WAVgB,EAAqB;IACrC,QAAQ;IACR,QAAQ;IACR,UAXe,EAA6B;KAC5C,SAAS,EAAM,MAAM;KACrB,YAAY,EAAM,MAAM;KACxB,iBAAiB,EAAM,MAAM;KAC7B,WAAA;KACA;IACF,CAKE;IACA,eAAe,EAAM;IACrB;IACA,MAAM,EAAM;GACd,CAGE;GACA,SAAS,EAAW;GACpB;EACF,CAAC;EACD,EAAiB,KAAK,CAAM;CAC9B;CAUA,OARA,MAAM,EAAiB,GAAQ;EAC7B,SAAS,EAAW;EAGpB,UAAU,EAAW;EACrB,YAAY;CACd,CAAC,GAEM;EAAE,OAAO,EAAiB;EAAQ,SAAS;CAAK;AACzD"}
1
+ {"version":3,"file":"instant-close-bulk.js","names":[],"sources":["../../../../src/solvers/instant-close/instant-close-bulk/instant-close-bulk.ts"],"sourcesContent":["import type { Address, Hex } from \"viem\";\nimport type { Config } from \"../../../core/config\";\nimport { SymmError } from \"../../../shared/errors/symm-error\";\nimport type { Compute, WriteSolverParameter } from \"../../../shared/types/properties\";\nimport { buildSignedOperation, signAndFormatInstantOperation } from \"../../instant-open/shared/operations\";\nimport { getMarketOrderDeadline } from \"../../instant-open/shared/trade-math\";\nimport { encodeRequestToClosePosition } from \"../shared/calldata\";\nimport { sendInstantClose } from \"../shared/hedger-api\";\nimport { resolveCloseOrderType } from \"../shared/resolve-close-order-type\";\nimport { ORDER_TYPE_MARKET, type InstantCloseOrder } from \"../shared/types\";\n\n/** Maximum orders per {@link instantCloseBulk} call (matches the hedger's `1–100` window). */\nexport const MAX_INSTANT_CLOSE_BULK_ORDERS = 100;\n\n/**\n * One position contributing to a {@link instantCloseBulk} batch. Each entry is\n * already fully-resolved: a VA address, the wei-shape order, and optional\n * per-order salt / deadline overrides.\n */\nexport interface InstantCloseBulkOrder {\n /** PartyA — the VA that owns the position (EIP-712 `signerAccount`). */\n partyA: Address;\n /** Already-final wei order (`quoteId`, `closePrice`, `quantityToClose`). */\n order: InstantCloseOrder;\n /** Override the EIP-712 salt for this order. Defaults to a random 32-byte salt. */\n salt?: Hex;\n /** Override the unix-seconds deadline for this order. Defaults to `now + 300s`. */\n deadline?: bigint;\n}\n\n/**\n * Parameters for {@link instantCloseBulk}.\n *\n * The wallet client identified by `from` is reused to sign every order, so all\n * orders in a batch share the same signer (the subaccount-level session key).\n * Each order may still target a different VA via its own `partyA` — the\n * delegation lives on the subaccount and is inherited by every owned VA.\n */\nexport type InstantCloseBulkParameters = Compute<\n WriteSolverParameter & {\n /** Orders to submit. Length must be in `[1, MAX_INSTANT_CLOSE_BULK_ORDERS]`. */\n orders: readonly InstantCloseBulkOrder[];\n }\n>;\n\n/** Return type of {@link instantCloseBulk}. */\nexport interface InstantCloseBulkReturnType {\n /** Number of orders submitted. */\n count: number;\n /** Always `true` on success — the hedger returns no per-order body. */\n success: true;\n}\n\n/**\n * Close multiple lowcap positions in one solver round-trip via the InstantLayer\n * v2 `/instant_trade/instant_close` endpoint, which natively accepts 1–100\n * signed operations per request.\n *\n * Each order is signed with the same wallet client (the session key bound to\n * `from`), so the caller must hold a `requestToClosePosition` delegation on\n * the owning subaccount. The delegation is inherited by every owned VA, so\n * orders across different VAs in the same subaccount sign with one key.\n *\n * Pure primitive — every domain value is already final wei. Use\n * `instantCloseBulkAuto` to derive these inputs from UI-shape parameters.\n * Enigma market closes encode `OrderType.MARKET_BEST_EFFORT` (2) before\n * signing; Rasa market closes encode MARKET (1).\n *\n * @throws {SymmError} `INSTANT_CLOSE_BULK_INVALID_ORDERS` when the batch is\n * empty or exceeds {@link MAX_INSTANT_CLOSE_BULK_ORDERS}.\n * @throws {SymmApiError} when the hedger request fails — the whole batch is\n * rejected; the caller should retry with fewer orders.\n *\n * @example\n * ```ts\n * await instantCloseBulk(config, {\n * from: sessionKey,\n * orders: [\n * { partyA: vaA, order: { quoteId: 1n, closePrice: …, quantityToClose: … } },\n * { partyA: vaB, order: { quoteId: 2n, closePrice: …, quantityToClose: … } },\n * ],\n * });\n * ```\n */\nexport async function instantCloseBulk(\n config: Config,\n parameters: InstantCloseBulkParameters,\n): Promise<InstantCloseBulkReturnType> {\n if (parameters.orders.length === 0) {\n throw new SymmError(\n \"validation\",\n \"INSTANT_CLOSE_BULK_INVALID_ORDERS\",\n \"instantCloseBulk: at least one order is required.\",\n );\n }\n if (parameters.orders.length > MAX_INSTANT_CLOSE_BULK_ORDERS) {\n throw new SymmError(\n \"validation\",\n \"INSTANT_CLOSE_BULK_INVALID_ORDERS\",\n `instantCloseBulk: at most ${MAX_INSTANT_CLOSE_BULK_ORDERS} orders per call; received ${parameters.orders.length}.`,\n );\n }\n\n const chainConfig = config.getChainConfig(parameters.chainId);\n const { symmioAddress } = chainConfig.addresses;\n const solver = config.getSolver({ chainId: parameters.chainId, solverId: parameters.solverId });\n const orderType = resolveCloseOrderType(solver.id, ORDER_TYPE_MARKET);\n\n const walletClient = await config.getWalletClient({ chainId: parameters.chainId, from: parameters.from });\n const signerAddress = walletClient.account.address;\n\n const signedOperations = [] as Awaited<ReturnType<typeof signAndFormatInstantOperation>>[];\n for (const entry of parameters.orders) {\n const deadline = entry.deadline ?? getMarketOrderDeadline();\n\n const callData = encodeRequestToClosePosition({\n quoteId: entry.order.quoteId,\n closePrice: entry.order.closePrice,\n quantityToClose: entry.order.quantityToClose,\n orderType,\n deadline,\n });\n\n const operation = buildSignedOperation({\n signer: signerAddress,\n target: symmioAddress,\n callData,\n signerAccount: entry.partyA,\n deadline,\n salt: entry.salt,\n });\n\n const signed = await signAndFormatInstantOperation(config, {\n operation,\n chainId: parameters.chainId,\n walletClient,\n });\n signedOperations.push(signed);\n }\n\n await sendInstantClose(config, {\n chainId: parameters.chainId,\n solverId: solver.id,\n operations: signedOperations,\n });\n\n return { count: signedOperations.length, success: true };\n}\n"],"mappings":";;;;;;;;AAYA,IAAa,IAAgC;AAwE7C,eAAsB,EACpB,GACA,GACqC;CACrC,IAAI,EAAW,OAAO,WAAW,GAC/B,MAAM,IAAI,EACR,cACA,qCACA,mDACF;CAEF,IAAI,EAAW,OAAO,SAAA,KACpB,MAAM,IAAI,EACR,cACA,qCACA,2DAAwF,EAAW,OAAO,OAAO,EACnH;CAIF,IAAM,EAAE,qBADY,EAAO,eAAe,EAAW,OAC3B,EAAY,WAChC,IAAS,EAAO,UAAU;EAAE,SAAS,EAAW;EAAS,UAAU,EAAW;CAAS,CAAC,GACxF,IAAY,EAAsB,EAAO,IAAA,CAAqB,GAE9D,IAAe,MAAM,EAAO,gBAAgB;EAAE,SAAS,EAAW;EAAS,MAAM,EAAW;CAAK,CAAC,GAClG,IAAgB,EAAa,QAAQ,SAErC,IAAmB,CAAC;CAC1B,KAAK,IAAM,KAAS,EAAW,QAAQ;EACrC,IAAM,IAAW,EAAM,YAAY,EAAuB,GAmBpD,IAAS,MAAM,EAA8B,GAAQ;GACzD,WAVgB,EAAqB;IACrC,QAAQ;IACR,QAAQ;IACR,UAXe,EAA6B;KAC5C,SAAS,EAAM,MAAM;KACrB,YAAY,EAAM,MAAM;KACxB,iBAAiB,EAAM,MAAM;KAC7B;KACA;IACF,CAKE;IACA,eAAe,EAAM;IACrB;IACA,MAAM,EAAM;GACd,CAGE;GACA,SAAS,EAAW;GACpB;EACF,CAAC;EACD,EAAiB,KAAK,CAAM;CAC9B;CAQA,OANA,MAAM,EAAiB,GAAQ;EAC7B,SAAS,EAAW;EACpB,UAAU,EAAO;EACjB,YAAY;CACd,CAAC,GAEM;EAAE,OAAO,EAAiB;EAAQ,SAAS;CAAK;AACzD"}
@@ -9,7 +9,7 @@ export interface EncodeRequestToClosePositionParameters {
9
9
  closePrice: bigint;
10
10
  /** Quantity to close (wei, 1e18 fixed-point). */
11
11
  quantityToClose: bigint;
12
- /** Order type contract value (1 = MARKET). */
12
+ /** Order type contract value: 0 = LIMIT, 1 = MARKET, 2 = MARKET_BEST_EFFORT (close-only). */
13
13
  orderType: number;
14
14
  /** Unix-seconds deadline. */
15
15
  deadline: bigint;
@@ -1 +1 @@
1
- {"version":3,"file":"calldata.d.ts","sourceRoot":"","sources":["../../../../src/solvers/instant-close/shared/calldata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAGpD;;GAEG;AACH,MAAM,WAAW,sCAAsC;IACrD,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,eAAe,EAAE,MAAM,CAAC;IACxB,8CAA8C;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,sCAAsC,GAAG,GAAG,CAYpG"}
1
+ {"version":3,"file":"calldata.d.ts","sourceRoot":"","sources":["../../../../src/solvers/instant-close/shared/calldata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,GAAG,EAAE,MAAM,MAAM,CAAC;AAGpD;;GAEG;AACH,MAAM,WAAW,sCAAsC;IACrD,qCAAqC;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,6DAA6D;IAC7D,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,eAAe,EAAE,MAAM,CAAC;IACxB,6FAA6F;IAC7F,SAAS,EAAE,MAAM,CAAC;IAClB,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAAE,sCAAsC,GAAG,GAAG,CAYpG"}
@@ -1 +1 @@
1
- {"version":3,"file":"calldata.js","names":[],"sources":["../../../../src/solvers/instant-close/shared/calldata.ts"],"sourcesContent":["import { encodeFunctionData, type Hex } from \"viem\";\nimport { symmioAbi } from \"../../../symmio-contracts/abi/v0.8.6/symmio\";\n\n/**\n * Parameters for {@link encodeRequestToClosePosition}.\n */\nexport interface EncodeRequestToClosePositionParameters {\n /** Quote id of the open position. */\n quoteId: bigint;\n /** Slippage-adjusted close price (wei, 1e18 fixed-point). */\n closePrice: bigint;\n /** Quantity to close (wei, 1e18 fixed-point). */\n quantityToClose: bigint;\n /** Order type contract value (1 = MARKET). */\n orderType: number;\n /** Unix-seconds deadline. */\n deadline: bigint;\n}\n\n/**\n * Encode calldata for `Symmio.requestToClosePosition(quoteId, closePrice,\n * quantityToClose, orderType, deadline)`.\n */\nexport function encodeRequestToClosePosition(parameters: EncodeRequestToClosePositionParameters): Hex {\n return encodeFunctionData({\n abi: symmioAbi,\n functionName: \"requestToClosePosition\",\n args: [\n parameters.quoteId,\n parameters.closePrice,\n parameters.quantityToClose,\n parameters.orderType,\n parameters.deadline,\n ],\n });\n}\n"],"mappings":";;;AAuBA,SAAgB,EAA6B,GAAyD;CACpG,OAAO,EAAmB;EACxB,KAAK;EACL,cAAc;EACd,MAAM;GACJ,EAAW;GACX,EAAW;GACX,EAAW;GACX,EAAW;GACX,EAAW;EACb;CACF,CAAC;AACH"}
1
+ {"version":3,"file":"calldata.js","names":[],"sources":["../../../../src/solvers/instant-close/shared/calldata.ts"],"sourcesContent":["import { encodeFunctionData, type Hex } from \"viem\";\nimport { symmioAbi } from \"../../../symmio-contracts/abi/v0.8.6/symmio\";\n\n/**\n * Parameters for {@link encodeRequestToClosePosition}.\n */\nexport interface EncodeRequestToClosePositionParameters {\n /** Quote id of the open position. */\n quoteId: bigint;\n /** Slippage-adjusted close price (wei, 1e18 fixed-point). */\n closePrice: bigint;\n /** Quantity to close (wei, 1e18 fixed-point). */\n quantityToClose: bigint;\n /** Order type contract value: 0 = LIMIT, 1 = MARKET, 2 = MARKET_BEST_EFFORT (close-only). */\n orderType: number;\n /** Unix-seconds deadline. */\n deadline: bigint;\n}\n\n/**\n * Encode calldata for `Symmio.requestToClosePosition(quoteId, closePrice,\n * quantityToClose, orderType, deadline)`.\n */\nexport function encodeRequestToClosePosition(parameters: EncodeRequestToClosePositionParameters): Hex {\n return encodeFunctionData({\n abi: symmioAbi,\n functionName: \"requestToClosePosition\",\n args: [\n parameters.quoteId,\n parameters.closePrice,\n parameters.quantityToClose,\n parameters.orderType,\n parameters.deadline,\n ],\n });\n}\n"],"mappings":";;;AAuBA,SAAgB,EAA6B,GAAyD;CACpG,OAAO,EAAmB;EACxB,KAAK;EACL,cAAc;EACd,MAAM;GACJ,EAAW;GACX,EAAW;GACX,EAAW;GACX,EAAW;GACX,EAAW;EACb;CACF,CAAC;AACH"}
@@ -0,0 +1,13 @@
1
+ import { SolverId } from '../../../core/chains/index.js';
2
+ import { OrderType } from '../../../symmio-contracts/symmio/types.js';
3
+ import { SolverOrderType } from './types.js';
4
+ /**
5
+ * Resolve the contract order type before signing a close operation.
6
+ *
7
+ * @param solverId - Solver selected for this close request.
8
+ * @param orderType - Requested market or limit order.
9
+ * @returns Best-effort market for Enigma market closes; otherwise the requested type.
10
+ * @internal
11
+ */
12
+ export declare function resolveCloseOrderType(solverId: SolverId, orderType: SolverOrderType): OrderType;
13
+ //# sourceMappingURL=resolve-close-order-type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-close-order-type.d.ts","sourceRoot":"","sources":["../../../../src/solvers/instant-close/shared/resolve-close-order-type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;AACnE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE/C;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,GAAG,SAAS,CAE/F"}
@@ -0,0 +1,9 @@
1
+ import { OrderType as e } from "../../../symmio-contracts/symmio/types.js";
2
+ //#region src/solvers/instant-close/shared/resolve-close-order-type.ts
3
+ function t(t, n) {
4
+ return t === "enigma" && n === e.MARKET ? e.MARKET_BEST_EFFORT : n;
5
+ }
6
+ //#endregion
7
+ export { t as resolveCloseOrderType };
8
+
9
+ //# sourceMappingURL=resolve-close-order-type.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-close-order-type.js","names":[],"sources":["../../../../src/solvers/instant-close/shared/resolve-close-order-type.ts"],"sourcesContent":["import type { SolverId } from \"../../../core/chains\";\nimport { OrderType } from \"../../../symmio-contracts/symmio/types\";\nimport type { SolverOrderType } from \"./types\";\n\n/**\n * Resolve the contract order type before signing a close operation.\n *\n * @param solverId - Solver selected for this close request.\n * @param orderType - Requested market or limit order.\n * @returns Best-effort market for Enigma market closes; otherwise the requested type.\n * @internal\n */\nexport function resolveCloseOrderType(solverId: SolverId, orderType: SolverOrderType): OrderType {\n return solverId === \"enigma\" && orderType === OrderType.MARKET ? OrderType.MARKET_BEST_EFFORT : orderType;\n}\n"],"mappings":";;AAYA,SAAgB,EAAsB,GAAoB,GAAuC;CAC/F,OAAO,MAAa,YAAY,MAAc,EAAU,SAAS,EAAU,qBAAqB;AAClG"}
@@ -6,9 +6,9 @@ import { Hex } from 'viem';
6
6
  */
7
7
  export { PositionType } from '../../../symmio-contracts/symmio/types.js';
8
8
  /**
9
- * Re-export the canonical order-type constants + union from the open slice.
10
- * Single source of truth — both instant-open and instant-close encode the
11
- * same on-chain enum values (`MARKET = 1`, `LIMIT = 0`).
9
+ * Re-export the requested order-type constants + union from the open slice.
10
+ * Callers request MARKET (1) or LIMIT (0). Before signing, Enigma market
11
+ * closes resolve to MARKET_BEST_EFFORT (2); opening orders retain MARKET (1).
12
12
  */
13
13
  export { ORDER_TYPE_LIMIT, ORDER_TYPE_MARKET, type SolverOrderType } from '../../instant-open/shared/types.js';
14
14
  /**