@symmio/trading-core 3.5.0 → 4.0.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 (161) hide show
  1. package/dist/gasless/delegation-preflight.d.ts +22 -0
  2. package/dist/gasless/delegation-preflight.d.ts.map +1 -1
  3. package/dist/gasless/delegation-preflight.js +34 -19
  4. package/dist/gasless/delegation-preflight.js.map +1 -1
  5. package/dist/index.d.ts +14 -4
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +248 -243
  8. package/dist/pools/index.d.ts +1 -0
  9. package/dist/pools/index.d.ts.map +1 -1
  10. package/dist/pools/markets/get-listing-markets.d.ts +2 -0
  11. package/dist/pools/markets/get-listing-markets.d.ts.map +1 -1
  12. package/dist/pools/markets/get-listing-markets.js +1 -0
  13. package/dist/pools/markets/get-listing-markets.js.map +1 -1
  14. package/dist/pools/markets/query.d.ts.map +1 -1
  15. package/dist/pools/markets/query.js +1 -0
  16. package/dist/pools/markets/query.js.map +1 -1
  17. package/dist/pools/markets/to-search-params.d.ts +1 -0
  18. package/dist/pools/markets/to-search-params.d.ts.map +1 -1
  19. package/dist/pools/markets/to-search-params.js +1 -1
  20. package/dist/pools/markets/to-search-params.js.map +1 -1
  21. package/dist/pools/token-price/get-token-price.d.ts +71 -0
  22. package/dist/pools/token-price/get-token-price.d.ts.map +1 -0
  23. package/dist/pools/token-price/get-token-price.js +30 -0
  24. package/dist/pools/token-price/get-token-price.js.map +1 -0
  25. package/dist/pools/token-price/index.d.ts +4 -0
  26. package/dist/pools/token-price/index.d.ts.map +1 -0
  27. package/dist/pools/token-price/query.d.ts +52 -0
  28. package/dist/pools/token-price/query.d.ts.map +1 -0
  29. package/dist/pools/token-price/query.js +29 -0
  30. package/dist/pools/token-price/query.js.map +1 -0
  31. package/dist/pools/token-price/to-token-price.d.ts +14 -0
  32. package/dist/pools/token-price/to-token-price.d.ts.map +1 -0
  33. package/dist/pools/token-price/to-token-price.js +8 -0
  34. package/dist/pools/token-price/to-token-price.js.map +1 -0
  35. package/dist/pools/transactions/get-pool-transactions.d.ts +59 -17
  36. package/dist/pools/transactions/get-pool-transactions.d.ts.map +1 -1
  37. package/dist/pools/transactions/get-pool-transactions.js +7 -4
  38. package/dist/pools/transactions/get-pool-transactions.js.map +1 -1
  39. package/dist/pools/transactions/query.d.ts +6 -2
  40. package/dist/pools/transactions/query.d.ts.map +1 -1
  41. package/dist/pools/transactions/query.js +12 -13
  42. package/dist/pools/transactions/query.js.map +1 -1
  43. package/dist/pools/transactions/to-pool-transaction.d.ts +7 -0
  44. package/dist/pools/transactions/to-pool-transaction.d.ts.map +1 -1
  45. package/dist/pools/transactions/to-pool-transaction.js +3 -1
  46. package/dist/pools/transactions/to-pool-transaction.js.map +1 -1
  47. package/dist/pools/types/generated/listing-backend.js +8 -8
  48. package/dist/pools/types/generated/listing-backend.js.map +1 -1
  49. package/dist/pools/types.d.ts +53 -10
  50. package/dist/pools/types.d.ts.map +1 -1
  51. package/dist/pools/types.js +6 -4
  52. package/dist/pools/types.js.map +1 -1
  53. package/dist/solvers/estimated-price/get-estimated-price.d.ts +2 -0
  54. package/dist/solvers/estimated-price/get-estimated-price.d.ts.map +1 -1
  55. package/dist/solvers/estimated-price/get-estimated-price.js +4 -1
  56. package/dist/solvers/estimated-price/get-estimated-price.js.map +1 -1
  57. package/dist/solvers/estimated-price/query.d.ts +6 -2
  58. package/dist/solvers/estimated-price/query.d.ts.map +1 -1
  59. package/dist/solvers/estimated-price/query.js +3 -2
  60. package/dist/solvers/estimated-price/query.js.map +1 -1
  61. package/dist/solvers/funding-info/adapters/enigma-funding-info.d.ts +4 -0
  62. package/dist/solvers/funding-info/adapters/enigma-funding-info.d.ts.map +1 -0
  63. package/dist/solvers/funding-info/adapters/enigma-funding-info.js +17 -0
  64. package/dist/solvers/funding-info/adapters/enigma-funding-info.js.map +1 -0
  65. package/dist/solvers/funding-info/adapters/rasa-funding-info.d.ts +4 -0
  66. package/dist/solvers/funding-info/adapters/rasa-funding-info.d.ts.map +1 -0
  67. package/dist/solvers/funding-info/adapters/rasa-funding-info.js +21 -0
  68. package/dist/solvers/funding-info/adapters/rasa-funding-info.js.map +1 -0
  69. package/dist/solvers/funding-info/get-funding-info.d.ts +22 -13
  70. package/dist/solvers/funding-info/get-funding-info.d.ts.map +1 -1
  71. package/dist/solvers/funding-info/get-funding-info.js +24 -12
  72. package/dist/solvers/funding-info/get-funding-info.js.map +1 -1
  73. package/dist/solvers/funding-info/query.d.ts +14 -6
  74. package/dist/solvers/funding-info/query.d.ts.map +1 -1
  75. package/dist/solvers/funding-info/query.js +1 -0
  76. package/dist/solvers/funding-info/query.js.map +1 -1
  77. package/dist/solvers/funding-info/to-funding-info.d.ts +8 -4
  78. package/dist/solvers/funding-info/to-funding-info.d.ts.map +1 -1
  79. package/dist/solvers/funding-info/to-funding-info.js +2 -1
  80. package/dist/solvers/funding-info/to-funding-info.js.map +1 -1
  81. package/dist/solvers/funding-info/types.d.ts +26 -4
  82. package/dist/solvers/funding-info/types.d.ts.map +1 -1
  83. package/dist/solvers/instant-close/instant-close/instant-close.d.ts +8 -1
  84. package/dist/solvers/instant-close/instant-close/instant-close.d.ts.map +1 -1
  85. package/dist/solvers/instant-close/instant-close/instant-close.js +40 -32
  86. package/dist/solvers/instant-close/instant-close/instant-close.js.map +1 -1
  87. package/dist/solvers/instant-close/instant-close-bulk/instant-close-bulk.d.ts +7 -1
  88. package/dist/solvers/instant-close/instant-close-bulk/instant-close-bulk.d.ts.map +1 -1
  89. package/dist/solvers/instant-close/instant-close-bulk/instant-close-bulk.js +48 -40
  90. package/dist/solvers/instant-close/instant-close-bulk/instant-close-bulk.js.map +1 -1
  91. package/dist/solvers/instant-close/instant-close-bulk-auto/instant-close-bulk-auto.d.ts +4 -2
  92. package/dist/solvers/instant-close/instant-close-bulk-auto/instant-close-bulk-auto.d.ts.map +1 -1
  93. package/dist/solvers/instant-close/instant-close-bulk-auto/instant-close-bulk-auto.js +1 -0
  94. package/dist/solvers/instant-close/instant-close-bulk-auto/instant-close-bulk-auto.js.map +1 -1
  95. package/dist/solvers/instant-close/prepare-instant-close-params/prepare-instant-close-params.d.ts +4 -2
  96. package/dist/solvers/instant-close/prepare-instant-close-params/prepare-instant-close-params.d.ts.map +1 -1
  97. package/dist/solvers/instant-close/prepare-instant-close-params/prepare-instant-close-params.js +2 -1
  98. package/dist/solvers/instant-close/prepare-instant-close-params/prepare-instant-close-params.js.map +1 -1
  99. package/dist/solvers/instant-open/instant-open/adapters/enigma-instant-open.d.ts +2 -0
  100. package/dist/solvers/instant-open/instant-open/adapters/enigma-instant-open.d.ts.map +1 -1
  101. package/dist/solvers/instant-open/instant-open/adapters/enigma-instant-open.js +64 -56
  102. package/dist/solvers/instant-open/instant-open/adapters/enigma-instant-open.js.map +1 -1
  103. package/dist/solvers/instant-open/instant-open/adapters/rasa-instant-open.d.ts +2 -0
  104. package/dist/solvers/instant-open/instant-open/adapters/rasa-instant-open.d.ts.map +1 -1
  105. package/dist/solvers/instant-open/instant-open/adapters/rasa-instant-open.js +51 -43
  106. package/dist/solvers/instant-open/instant-open/adapters/rasa-instant-open.js.map +1 -1
  107. package/dist/solvers/instant-open/instant-open/instant-open.d.ts +6 -0
  108. package/dist/solvers/instant-open/instant-open/instant-open.d.ts.map +1 -1
  109. package/dist/solvers/instant-open/instant-open/instant-open.js.map +1 -1
  110. package/dist/solvers/instant-open/instant-open/types.d.ts +2 -1
  111. package/dist/solvers/instant-open/instant-open/types.d.ts.map +1 -1
  112. package/dist/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.d.ts +3 -1
  113. package/dist/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.d.ts.map +1 -1
  114. package/dist/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.js +2 -1
  115. package/dist/solvers/instant-open/prepare-instant-open-params/prepare-instant-open-params.js.map +1 -1
  116. package/dist/solvers/market-info/adapters/enigma-market-info.d.ts +3 -3
  117. package/dist/solvers/market-info/adapters/enigma-market-info.d.ts.map +1 -1
  118. package/dist/solvers/market-info/adapters/enigma-market-info.js +7 -5
  119. package/dist/solvers/market-info/adapters/enigma-market-info.js.map +1 -1
  120. package/dist/solvers/market-info/get-market-info.d.ts +3 -2
  121. package/dist/solvers/market-info/get-market-info.d.ts.map +1 -1
  122. package/dist/solvers/market-info/get-market-info.js.map +1 -1
  123. package/dist/solvers/market-info/types.d.ts +4 -3
  124. package/dist/solvers/market-info/types.d.ts.map +1 -1
  125. package/dist/solvers/notional-cap/get-notional-cap-all.d.ts +10 -10
  126. package/dist/solvers/notional-cap/get-notional-cap-all.d.ts.map +1 -1
  127. package/dist/solvers/notional-cap/get-notional-cap-all.js +26 -23
  128. package/dist/solvers/notional-cap/get-notional-cap-all.js.map +1 -1
  129. package/dist/solvers/notional-cap/get-notional-cap-page.d.ts +49 -0
  130. package/dist/solvers/notional-cap/get-notional-cap-page.d.ts.map +1 -0
  131. package/dist/solvers/notional-cap/get-notional-cap-page.js +37 -0
  132. package/dist/solvers/notional-cap/get-notional-cap-page.js.map +1 -0
  133. package/dist/solvers/notional-cap/index.d.ts +2 -0
  134. package/dist/solvers/notional-cap/index.d.ts.map +1 -1
  135. package/dist/solvers/notional-cap/query-page.d.ts +45 -0
  136. package/dist/solvers/notional-cap/query-page.d.ts.map +1 -0
  137. package/dist/solvers/notional-cap/query-page.js +26 -0
  138. package/dist/solvers/notional-cap/query-page.js.map +1 -0
  139. package/dist/solvers/shared/index.d.ts +1 -0
  140. package/dist/solvers/shared/index.d.ts.map +1 -1
  141. package/dist/solvers/shared/instant-delegation-preflight.d.ts +65 -0
  142. package/dist/solvers/shared/instant-delegation-preflight.d.ts.map +1 -0
  143. package/dist/solvers/shared/instant-delegation-preflight.js +34 -0
  144. package/dist/solvers/shared/instant-delegation-preflight.js.map +1 -0
  145. package/dist/solvers/symbols/get-symbols.d.ts +3 -2
  146. package/dist/solvers/symbols/get-symbols.d.ts.map +1 -1
  147. package/dist/solvers/symbols/get-symbols.js +17 -3
  148. package/dist/solvers/symbols/get-symbols.js.map +1 -1
  149. package/dist/solvers/trade-volume/get-trade-volume.d.ts +2 -1
  150. package/dist/solvers/trade-volume/get-trade-volume.d.ts.map +1 -1
  151. package/dist/solvers/trade-volume/get-trade-volume.js +6 -1
  152. package/dist/solvers/trade-volume/get-trade-volume.js.map +1 -1
  153. package/dist/solvers/trade-volume/to-daily-volume.d.ts +6 -6
  154. package/dist/solvers/trade-volume/to-daily-volume.js.map +1 -1
  155. package/dist/solvers/trade-volume/types.d.ts +4 -3
  156. package/dist/solvers/trade-volume/types.d.ts.map +1 -1
  157. package/dist/solvers/types/generated/enigma-solver.js +3 -3
  158. package/dist/solvers/types/generated/enigma-solver.js.map +1 -1
  159. package/dist/solvers/types/generated/rasa-solver.js +8 -2
  160. package/dist/solvers/types/generated/rasa-solver.js.map +1 -1
  161. package/package.json +3 -3
@@ -1,19 +1,28 @@
1
+ import { SymmioSolverKind } from '../../core/chains/types.js';
1
2
  import { Config } from '../../core/config/index.js';
2
- import { Compute, ReadSolverParameter } from '../../shared/types/properties.js';
3
- import { MarketFundingInfo } from './types.js';
3
+ import { ChainIdParameter, Compute } from '../../shared/types/properties.js';
4
+ import { NormalizedFundingInfoByKind } from './types.js';
4
5
  /**
5
6
  * Parameters for {@link getFundingInfo}.
7
+ * @example const parameters: GetFundingInfoParameters = { chainId: 42161, symbolIds: [117, 185] };
6
8
  */
7
- export type GetFundingInfoParameters = Compute<ReadSolverParameter & {
8
- /** Restrict the result to these market names. Omit to fetch every market (the endpoint default). */
9
+ export type GetFundingInfoParameters<K extends SymmioSolverKind = SymmioSolverKind> = Compute<ChainIdParameter & {
10
+ /** Select a solver; a literal narrows the returned rows. */
11
+ solverId?: K;
12
+ /** Enigma only: restrict the result to these symbol IDs. Omit to fetch every market (the endpoint default). */
13
+ symbolIds?: readonly number[];
14
+ /** Rasa ticker filter. Only valid for a Rasa solver. */
9
15
  symbols?: readonly string[];
10
16
  }>;
11
- /** Return type of {@link getFundingInfo}: one entry per market. */
12
- export type GetFundingInfoReturnType = MarketFundingInfo[];
13
17
  /**
14
- * Fetch per-market funding rates from the chain's solver `/get_funding_info`
18
+ * Funding observations keyed by Enigma symbol ID or Rasa ticker, with per-epoch fractional rates.
19
+ * @example const rows: GetFundingInfoReturnType = await getFundingInfo(config, { symbolIds: [117] });
20
+ */
21
+ export type GetFundingInfoReturnType<K extends SymmioSolverKind = SymmioSolverKind> = NormalizedFundingInfoByKind[K][];
22
+ /**
23
+ * Fetch per-market funding rates from Enigma `/funding-info` or Rasa `/get_funding_info`
15
24
  * endpoint. Returns the next-epoch long/short funding rate, next funding time,
16
- * and epoch length for every market (or only the requested `symbols`). The
25
+ * and epoch length for every market (or only the requested Enigma `symbolIds` or Rasa `symbols`). The
17
26
  * solver base URL is resolved from `config` per call, so multiple chains never
18
27
  * clobber each other.
19
28
  *
@@ -21,17 +30,17 @@ export type GetFundingInfoReturnType = MarketFundingInfo[];
21
30
  * reports them (multiply by `100` for a percentage); no scaling is applied.
22
31
  *
23
32
  * @param config - The SDK config.
24
- * @param parameters - Optional chain id and `symbols` filter.
33
+ * @param parameters - Optional chain, solver and solver-specific filter.
25
34
  * @returns Normalized funding info, one {@link MarketFundingInfo} per market.
26
35
  * @throws {SymmApiError} when the API request fails.
27
- * @throws {SymmError} when the chain is unsupported.
36
+ * @throws {SymmError} when the chain is unsupported or a filter targets the wrong solver (INVALID_FUNDING_FILTER).
28
37
  *
29
38
  * @example
30
39
  * ```ts
31
- * const funding = await getFundingInfo(config);
32
- * const btc = funding.find((f) => f.symbol === "BTCUSDT");
40
+ * const funding = await getFundingInfo(config, { solverId: "enigma" });
41
+ * const btc = funding.find((f) => f.symbolId === 1);
33
42
  * console.log(btc?.nextFundingRateLong); // 0.0001 → 0.01%
34
43
  * ```
35
44
  */
36
- export declare function getFundingInfo(config: Config, parameters?: GetFundingInfoParameters): Promise<GetFundingInfoReturnType>;
45
+ export declare function getFundingInfo<K extends SymmioSolverKind = SymmioSolverKind>(config: Config, parameters?: GetFundingInfoParameters<K>): Promise<GetFundingInfoReturnType<K>>;
37
46
  //# sourceMappingURL=get-funding-info.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"get-funding-info.d.ts","sourceRoot":"","sources":["../../../src/solvers/funding-info/get-funding-info.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;AAGlF,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG,OAAO,CAC5C,mBAAmB,GAAG;IACpB,oGAAoG;IACpG,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B,CACF,CAAC;AAEF,mEAAmE;AACnE,MAAM,MAAM,wBAAwB,GAAG,iBAAiB,EAAE,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,wBAA6B,GACxC,OAAO,CAAC,wBAAwB,CAAC,CAGnC"}
1
+ {"version":3,"file":"get-funding-info.d.ts","sourceRoot":"","sources":["../../../src/solvers/funding-info/get-funding-info.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAG/E,OAAO,KAAK,EAAqB,2BAA2B,EAAE,MAAM,SAAS,CAAC;AAE9E;;;GAGG;AACH,MAAM,MAAM,wBAAwB,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,IAAI,OAAO,CAC3F,gBAAgB,GAAG;IACjB,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,CAAC,CAAC;IACb,+GAA+G;IAC/G,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC9B,wDAAwD;IACxD,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC7B,CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,wBAAwB,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,IAAI,2BAA2B,CAAC,CAAC,CAAC,EAAE,CAAC;AAEvH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,cAAc,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,EAChF,MAAM,EAAE,MAAM,EACd,UAAU,GAAE,wBAAwB,CAAC,CAAC,CAAM,GAC3C,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,CA4CtC"}
@@ -1,22 +1,34 @@
1
1
  import { SymmApiError as e, SymmError as t } from "../../shared/errors/symm-error.js";
2
- import { getGetFundingInfo as n } from "../types/generated/enigma-solver.js";
3
- import { toMarketFundingInfo as r } from "./to-funding-info.js";
2
+ import { fetchEnigmaFundingInfo as n } from "./adapters/enigma-funding-info.js";
3
+ import { fetchRasaFundingInfo as r } from "./adapters/rasa-funding-info.js";
4
4
  import { isAxiosError as i } from "axios";
5
5
  //#region src/solvers/funding-info/get-funding-info.ts
6
- async function a(e, t = {}) {
7
- return o(e.getSolver({
8
- chainId: t.chainId,
9
- solverId: t.solverId
10
- }).url, t.symbols);
11
- }
12
- async function o(a, o) {
6
+ async function a(a, o = {}) {
7
+ let s = a.getSolver({
8
+ chainId: o.chainId,
9
+ solverId: o.solverId
10
+ });
13
11
  try {
14
- let e = await n(o ? { symbols: [...o] } : void 0, { baseURL: a });
15
- return Object.entries(e.data).map(([e, t]) => r(e, t));
12
+ let e;
13
+ switch (s.id) {
14
+ case "enigma":
15
+ if (o.symbols !== void 0) throw new t("validation", "INVALID_FUNDING_FILTER", "Enigma funding accepts symbolIds, not ticker symbols.");
16
+ e = await n(s.url, o.symbolIds);
17
+ break;
18
+ case "rasa":
19
+ if (o.symbolIds !== void 0) throw new t("validation", "INVALID_FUNDING_FILTER", "Rasa funding accepts ticker symbols, not symbolIds.");
20
+ e = await r(s.url, o.symbols);
21
+ break;
22
+ default: {
23
+ let e = s.id;
24
+ throw new t("api", "UNSUPPORTED_BY_SOLVER", `Funding info is not supported by solver kind "${e}".`);
25
+ }
26
+ }
27
+ return e;
16
28
  } catch (n) {
17
29
  throw n instanceof t ? n : i(n) ? e.fromAxios(n, {
18
30
  code: "FETCH_FUNDING_INFO_FAILED",
19
- baseURL: a
31
+ baseURL: s.url
20
32
  }) : new t("api", "FETCH_FUNDING_INFO_FAILED", `Failed to fetch funding info: ${n instanceof Error ? n.message : String(n)}`, { cause: n instanceof Error ? n : void 0 });
21
33
  }
22
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"get-funding-info.js","names":[],"sources":["../../../src/solvers/funding-info/get-funding-info.ts"],"sourcesContent":["import { isAxiosError } from \"axios\";\nimport type { Config } from \"../../core/config\";\nimport { SymmApiError, SymmError } from \"../../shared/errors/symm-error\";\nimport type { Compute, ReadSolverParameter } from \"../../shared/types/properties\";\nimport { getGetFundingInfo } from \"../types/generated/enigma-solver\";\nimport { toMarketFundingInfo } from \"./to-funding-info\";\nimport type { MarketFundingInfo } from \"./types\";\n\n/**\n * Parameters for {@link getFundingInfo}.\n */\nexport type GetFundingInfoParameters = Compute<\n ReadSolverParameter & {\n /** Restrict the result to these market names. Omit to fetch every market (the endpoint default). */\n symbols?: readonly string[];\n }\n>;\n\n/** Return type of {@link getFundingInfo}: one entry per market. */\nexport type GetFundingInfoReturnType = MarketFundingInfo[];\n\n/**\n * Fetch per-market funding rates from the chain's solver `/get_funding_info`\n * endpoint. Returns the next-epoch long/short funding rate, next funding time,\n * and epoch length for every market (or only the requested `symbols`). The\n * solver base URL is resolved from `config` per call, so multiple chains never\n * clobber each other.\n *\n * Rates are surfaced as plain per-epoch decimal fractions exactly as the solver\n * reports them (multiply by `100` for a percentage); no scaling is applied.\n *\n * @param config - The SDK config.\n * @param parameters - Optional chain id and `symbols` filter.\n * @returns Normalized funding info, one {@link MarketFundingInfo} per market.\n * @throws {SymmApiError} when the API request fails.\n * @throws {SymmError} when the chain is unsupported.\n *\n * @example\n * ```ts\n * const funding = await getFundingInfo(config);\n * const btc = funding.find((f) => f.symbol === \"BTCUSDT\");\n * console.log(btc?.nextFundingRateLong); // 0.0001 → 0.01%\n * ```\n */\nexport async function getFundingInfo(\n config: Config,\n parameters: GetFundingInfoParameters = {},\n): Promise<GetFundingInfoReturnType> {\n const solver = config.getSolver({ chainId: parameters.chainId, solverId: parameters.solverId });\n return fetchFundingInfo(solver.url, parameters.symbols);\n}\n\n/**\n * Call the solver's `/get_funding_info` endpoint with a per-call base URL and\n * map the market-keyed response into the SDK's normalized array.\n *\n * @internal\n */\nasync function fetchFundingInfo(baseURL: string, symbols?: readonly string[]): Promise<MarketFundingInfo[]> {\n try {\n const response = await getGetFundingInfo(symbols ? { symbols: [...symbols] } : undefined, { baseURL });\n return Object.entries(response.data).map(([symbol, raw]) => toMarketFundingInfo(symbol, raw));\n } catch (err) {\n if (err instanceof SymmError) throw err;\n\n if (isAxiosError(err)) {\n throw SymmApiError.fromAxios(err, { code: \"FETCH_FUNDING_INFO_FAILED\", baseURL });\n }\n\n throw new SymmError(\n \"api\",\n \"FETCH_FUNDING_INFO_FAILED\",\n `Failed to fetch funding info: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err instanceof Error ? err : undefined },\n );\n }\n}\n"],"mappings":";;;;;AA4CA,eAAsB,EACpB,GACA,IAAuC,CAAC,GACL;CAEnC,OAAO,EADQ,EAAO,UAAU;EAAE,SAAS,EAAW;EAAS,UAAU,EAAW;CAAS,CACrE,EAAO,KAAK,EAAW,OAAO;AACxD;AAQA,eAAe,EAAiB,GAAiB,GAA2D;CAC1G,IAAI;EACF,IAAM,IAAW,MAAM,EAAkB,IAAU,EAAE,SAAS,CAAC,GAAG,CAAO,EAAE,IAAI,KAAA,GAAW,EAAE,WAAQ,CAAC;EACrG,OAAO,OAAO,QAAQ,EAAS,IAAI,EAAE,KAAK,CAAC,GAAQ,OAAS,EAAoB,GAAQ,CAAG,CAAC;CAC9F,SAAS,GAAK;EAOZ,MANI,aAAe,IAAiB,IAEhC,EAAa,CAAG,IACZ,EAAa,UAAU,GAAK;GAAE,MAAM;GAA6B;EAAQ,CAAC,IAG5E,IAAI,EACR,OACA,6BACA,iCAAiC,aAAe,QAAQ,EAAI,UAAU,OAAO,CAAG,KAChF,EAAE,OAAO,aAAe,QAAQ,IAAM,KAAA,EAAU,CAClD;CACF;AACF"}
1
+ {"version":3,"file":"get-funding-info.js","names":[],"sources":["../../../src/solvers/funding-info/get-funding-info.ts"],"sourcesContent":["import { isAxiosError } from \"axios\";\nimport type { SymmioSolverKind } from \"../../core/chains/types\";\nimport type { Config } from \"../../core/config\";\nimport { SymmApiError, SymmError } from \"../../shared/errors/symm-error\";\nimport type { ChainIdParameter, Compute } from \"../../shared/types/properties\";\nimport { fetchEnigmaFundingInfo } from \"./adapters/enigma-funding-info\";\nimport { fetchRasaFundingInfo } from \"./adapters/rasa-funding-info\";\nimport type { MarketFundingInfo, NormalizedFundingInfoByKind } from \"./types\";\n\n/**\n * Parameters for {@link getFundingInfo}.\n * @example const parameters: GetFundingInfoParameters = { chainId: 42161, symbolIds: [117, 185] };\n */\nexport type GetFundingInfoParameters<K extends SymmioSolverKind = SymmioSolverKind> = Compute<\n ChainIdParameter & {\n /** Select a solver; a literal narrows the returned rows. */\n solverId?: K;\n /** Enigma only: restrict the result to these symbol IDs. Omit to fetch every market (the endpoint default). */\n symbolIds?: readonly number[];\n /** Rasa ticker filter. Only valid for a Rasa solver. */\n symbols?: readonly string[];\n }\n>;\n\n/**\n * Funding observations keyed by Enigma symbol ID or Rasa ticker, with per-epoch fractional rates.\n * @example const rows: GetFundingInfoReturnType = await getFundingInfo(config, { symbolIds: [117] });\n */\nexport type GetFundingInfoReturnType<K extends SymmioSolverKind = SymmioSolverKind> = NormalizedFundingInfoByKind[K][];\n\n/**\n * Fetch per-market funding rates from Enigma `/funding-info` or Rasa `/get_funding_info`\n * endpoint. Returns the next-epoch long/short funding rate, next funding time,\n * and epoch length for every market (or only the requested Enigma `symbolIds` or Rasa `symbols`). The\n * solver base URL is resolved from `config` per call, so multiple chains never\n * clobber each other.\n *\n * Rates are surfaced as plain per-epoch decimal fractions exactly as the solver\n * reports them (multiply by `100` for a percentage); no scaling is applied.\n *\n * @param config - The SDK config.\n * @param parameters - Optional chain, solver and solver-specific filter.\n * @returns Normalized funding info, one {@link MarketFundingInfo} per market.\n * @throws {SymmApiError} when the API request fails.\n * @throws {SymmError} when the chain is unsupported or a filter targets the wrong solver (INVALID_FUNDING_FILTER).\n *\n * @example\n * ```ts\n * const funding = await getFundingInfo(config, { solverId: \"enigma\" });\n * const btc = funding.find((f) => f.symbolId === 1);\n * console.log(btc?.nextFundingRateLong); // 0.0001 → 0.01%\n * ```\n */\nexport async function getFundingInfo<K extends SymmioSolverKind = SymmioSolverKind>(\n config: Config,\n parameters: GetFundingInfoParameters<K> = {},\n): Promise<GetFundingInfoReturnType<K>> {\n const solver = config.getSolver({ chainId: parameters.chainId, solverId: parameters.solverId });\n try {\n let rows: MarketFundingInfo[];\n switch (solver.id) {\n case \"enigma\":\n if (parameters.symbols !== undefined)\n throw new SymmError(\n \"validation\",\n \"INVALID_FUNDING_FILTER\",\n \"Enigma funding accepts symbolIds, not ticker symbols.\",\n );\n rows = await fetchEnigmaFundingInfo(solver.url, parameters.symbolIds);\n break;\n case \"rasa\":\n if (parameters.symbolIds !== undefined)\n throw new SymmError(\n \"validation\",\n \"INVALID_FUNDING_FILTER\",\n \"Rasa funding accepts ticker symbols, not symbolIds.\",\n );\n rows = await fetchRasaFundingInfo(solver.url, parameters.symbols);\n break;\n default: {\n const unreachable: never = solver.id;\n throw new SymmError(\n \"api\",\n \"UNSUPPORTED_BY_SOLVER\",\n `Funding info is not supported by solver kind \"${unreachable}\".`,\n );\n }\n }\n return rows as GetFundingInfoReturnType<K>;\n } catch (err) {\n if (err instanceof SymmError) throw err;\n if (isAxiosError(err))\n throw SymmApiError.fromAxios(err, { code: \"FETCH_FUNDING_INFO_FAILED\", baseURL: solver.url });\n throw new SymmError(\n \"api\",\n \"FETCH_FUNDING_INFO_FAILED\",\n `Failed to fetch funding info: ${err instanceof Error ? err.message : String(err)}`,\n { cause: err instanceof Error ? err : undefined },\n );\n }\n}\n"],"mappings":";;;;;AAqDA,eAAsB,EACpB,GACA,IAA0C,CAAC,GACL;CACtC,IAAM,IAAS,EAAO,UAAU;EAAE,SAAS,EAAW;EAAS,UAAU,EAAW;CAAS,CAAC;CAC9F,IAAI;EACF,IAAI;EACJ,QAAQ,EAAO,IAAf;GACE,KAAK;IACH,IAAI,EAAW,YAAY,KAAA,GACzB,MAAM,IAAI,EACR,cACA,0BACA,uDACF;IACF,IAAO,MAAM,EAAuB,EAAO,KAAK,EAAW,SAAS;IACpE;GACF,KAAK;IACH,IAAI,EAAW,cAAc,KAAA,GAC3B,MAAM,IAAI,EACR,cACA,0BACA,qDACF;IACF,IAAO,MAAM,EAAqB,EAAO,KAAK,EAAW,OAAO;IAChE;GACF,SAAS;IACP,IAAM,IAAqB,EAAO;IAClC,MAAM,IAAI,EACR,OACA,yBACA,iDAAiD,EAAY,GAC/D;GACF;EACF;EACA,OAAO;CACT,SAAS,GAAK;EAIZ,MAHI,aAAe,IAAiB,IAChC,EAAa,CAAG,IACZ,EAAa,UAAU,GAAK;GAAE,MAAM;GAA6B,SAAS,EAAO;EAAI,CAAC,IACxF,IAAI,EACR,OACA,6BACA,iCAAiC,aAAe,QAAQ,EAAI,UAAU,OAAO,CAAG,KAChF,EAAE,OAAO,aAAe,QAAQ,IAAM,KAAA,EAAU,CAClD;CACF;AACF"}
@@ -1,22 +1,30 @@
1
+ import { SymmioSolverKind } from '../../core/chains/types.js';
1
2
  import { Config } from '../../core/config/index.js';
2
3
  import { Compute, ConfigKeyParameter } from '../../shared/types/properties.js';
3
4
  import { QueryParameter, SymmioQueryOptions } from '../../shared/types/query.js';
4
5
  import { GetFundingInfoParameters, GetFundingInfoReturnType } from './get-funding-info.js';
5
6
  /** Data resolved by the {@link getFundingInfoQueryOptions} query. */
6
- export type GetFundingInfoData = GetFundingInfoReturnType;
7
- /** Build the TanStack Query key for {@link getFundingInfoQueryOptions}. */
7
+ export type GetFundingInfoData<K extends SymmioSolverKind = SymmioSolverKind> = GetFundingInfoReturnType<K>;
8
+ /**
9
+ * Build a funding cache key including the solver-specific filter and deployment identity.
10
+ * @param options - Optional deployment, solver and symbol IDs/tickers; query overrides are excluded.
11
+ * @returns A stable query-key tuple.
12
+ * @throws Does not throw for valid options.
13
+ * @example getFundingInfoQueryKey({ symbolIds: [117, 185] });
14
+ */
8
15
  export declare function getFundingInfoQueryKey(options?: Compute<GetFundingInfoParameters & ConfigKeyParameter>): readonly ["getFundingInfo", Record<string, unknown>];
9
16
  /** Query-key type produced by {@link getFundingInfoQueryKey}. */
10
17
  export type GetFundingInfoQueryKey = ReturnType<typeof getFundingInfoQueryKey>;
11
18
  /** Options accepted by {@link getFundingInfoQueryOptions}. */
12
- export type GetFundingInfoOptions = Compute<GetFundingInfoParameters & QueryParameter<GetFundingInfoData, Error, GetFundingInfoData, GetFundingInfoQueryKey>>;
19
+ export type GetFundingInfoOptions<K extends SymmioSolverKind = SymmioSolverKind> = Compute<GetFundingInfoParameters<K> & QueryParameter<GetFundingInfoData<K>, Error, GetFundingInfoData<K>, GetFundingInfoQueryKey>>;
13
20
  /** TanStack Query options returned by {@link getFundingInfoQueryOptions}. */
14
- export type GetFundingInfoQueryOptions = SymmioQueryOptions<GetFundingInfoData, Error, GetFundingInfoData, GetFundingInfoQueryKey>;
21
+ export type GetFundingInfoQueryOptions<K extends SymmioSolverKind = SymmioSolverKind> = SymmioQueryOptions<GetFundingInfoData<K>, Error, GetFundingInfoData<K>, GetFundingInfoQueryKey>;
15
22
  /**
16
23
  * Build TanStack Query options for {@link getFundingInfo}.
17
24
  *
18
25
  * @param config - The SDK config.
19
- * @param options - Query parameters (optional `chainId` / `symbols`) and TanStack overrides.
26
+ * @param options - Query parameters (optional `chainId`, `solverId`, `symbolIds` / `symbols`) and TanStack overrides.
27
+ * @throws {SymmError} When configuration cannot be resolved; the query function propagates action errors.
20
28
  * @returns Options to pass to `useQuery` / `queryClient.fetchQuery`.
21
29
  *
22
30
  * @example
@@ -24,5 +32,5 @@ export type GetFundingInfoQueryOptions = SymmioQueryOptions<GetFundingInfoData,
24
32
  * useQuery(getFundingInfoQueryOptions(config, {}));
25
33
  * ```
26
34
  */
27
- export declare function getFundingInfoQueryOptions(config: Config, options?: GetFundingInfoOptions): GetFundingInfoQueryOptions;
35
+ export declare function getFundingInfoQueryOptions<K extends SymmioSolverKind = SymmioSolverKind>(config: Config, options?: GetFundingInfoOptions<K>): GetFundingInfoQueryOptions<K>;
28
36
  //# sourceMappingURL=query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/solvers/funding-info/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnF,OAAO,EAAkB,KAAK,wBAAwB,EAAE,KAAK,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAElH,qEAAqE;AACrE,MAAM,MAAM,kBAAkB,GAAG,wBAAwB,CAAC;AAE1D,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,OAAO,CAAC,wBAAwB,GAAG,kBAAkB,CAAM,wDAE1G;AAED,iEAAiE;AACjE,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE/E,8DAA8D;AAC9D,MAAM,MAAM,qBAAqB,GAAG,OAAO,CACzC,wBAAwB,GAAG,cAAc,CAAC,kBAAkB,EAAE,KAAK,EAAE,kBAAkB,EAAE,sBAAsB,CAAC,CACjH,CAAC;AAEF,6EAA6E;AAC7E,MAAM,MAAM,0BAA0B,GAAG,kBAAkB,CACzD,kBAAkB,EAClB,KAAK,EACL,kBAAkB,EAClB,sBAAsB,CACvB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,qBAA0B,GAClC,0BAA0B,CAW5B"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/solvers/funding-info/query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAEnF,OAAO,EAAkB,KAAK,wBAAwB,EAAE,KAAK,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAElH,qEAAqE;AACrE,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,IAAI,wBAAwB,CAAC,CAAC,CAAC,CAAC;AAE5G;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,OAAO,CAAC,wBAAwB,GAAG,kBAAkB,CAAM,wDAE1G;AAED,iEAAiE;AACjE,MAAM,MAAM,sBAAsB,GAAG,UAAU,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAE/E,8DAA8D;AAC9D,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,IAAI,OAAO,CACxF,wBAAwB,CAAC,CAAC,CAAC,GACzB,cAAc,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,sBAAsB,CAAC,CAC9F,CAAC;AAEF,6EAA6E;AAC7E,MAAM,MAAM,0BAA0B,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,IAAI,kBAAkB,CACxG,kBAAkB,CAAC,CAAC,CAAC,EACrB,KAAK,EACL,kBAAkB,CAAC,CAAC,CAAC,EACrB,sBAAsB,CACvB,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,EACtF,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,qBAAqB,CAAC,CAAC,CAAM,GACrC,0BAA0B,CAAC,CAAC,CAAC,CAgB/B"}
@@ -15,6 +15,7 @@ function r(e, r = {}) {
15
15
  queryFn: () => t(e, {
16
16
  chainId: r.chainId,
17
17
  solverId: r.solverId,
18
+ symbolIds: r.symbolIds,
18
19
  symbols: r.symbols
19
20
  })
20
21
  };
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","names":[],"sources":["../../../src/solvers/funding-info/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 { getFundingInfo, type GetFundingInfoParameters, type GetFundingInfoReturnType } from \"./get-funding-info\";\n\n/** Data resolved by the {@link getFundingInfoQueryOptions} query. */\nexport type GetFundingInfoData = GetFundingInfoReturnType;\n\n/** Build the TanStack Query key for {@link getFundingInfoQueryOptions}. */\nexport function getFundingInfoQueryKey(options: Compute<GetFundingInfoParameters & ConfigKeyParameter> = {}) {\n return [\"getFundingInfo\", filterQueryOptions(options)] as const;\n}\n\n/** Query-key type produced by {@link getFundingInfoQueryKey}. */\nexport type GetFundingInfoQueryKey = ReturnType<typeof getFundingInfoQueryKey>;\n\n/** Options accepted by {@link getFundingInfoQueryOptions}. */\nexport type GetFundingInfoOptions = Compute<\n GetFundingInfoParameters & QueryParameter<GetFundingInfoData, Error, GetFundingInfoData, GetFundingInfoQueryKey>\n>;\n\n/** TanStack Query options returned by {@link getFundingInfoQueryOptions}. */\nexport type GetFundingInfoQueryOptions = SymmioQueryOptions<\n GetFundingInfoData,\n Error,\n GetFundingInfoData,\n GetFundingInfoQueryKey\n>;\n\n/**\n * Build TanStack Query options for {@link getFundingInfo}.\n *\n * @param config - The SDK config.\n * @param options - Query parameters (optional `chainId` / `symbols`) and TanStack overrides.\n * @returns Options to pass to `useQuery` / `queryClient.fetchQuery`.\n *\n * @example\n * ```ts\n * useQuery(getFundingInfoQueryOptions(config, {}));\n * ```\n */\nexport function getFundingInfoQueryOptions(\n config: Config,\n options: GetFundingInfoOptions = {},\n): GetFundingInfoQueryOptions {\n return {\n ...options.query,\n queryKey: getFundingInfoQueryKey({\n ...options,\n configKey: config.getChainConfigKey(options.chainId),\n }),\n enabled: options.query?.enabled ?? true,\n queryFn: () =>\n getFundingInfo(config, { chainId: options.chainId, solverId: options.solverId, symbols: options.symbols }),\n };\n}\n"],"mappings":";;;AAUA,SAAgB,EAAuB,IAAkE,CAAC,GAAG;CAC3G,OAAO,CAAC,kBAAkB,EAAmB,CAAO,CAAC;AACvD;AA8BA,SAAgB,EACd,GACA,IAAiC,CAAC,GACN;CAC5B,OAAO;EACL,GAAG,EAAQ;EACX,UAAU,EAAuB;GAC/B,GAAG;GACH,WAAW,EAAO,kBAAkB,EAAQ,OAAO;EACrD,CAAC;EACD,SAAS,EAAQ,OAAO,WAAW;EACnC,eACE,EAAe,GAAQ;GAAE,SAAS,EAAQ;GAAS,UAAU,EAAQ;GAAU,SAAS,EAAQ;EAAQ,CAAC;CAC7G;AACF"}
1
+ {"version":3,"file":"query.js","names":[],"sources":["../../../src/solvers/funding-info/query.ts"],"sourcesContent":["import type { SymmioSolverKind } from \"../../core/chains/types\";\nimport 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 { getFundingInfo, type GetFundingInfoParameters, type GetFundingInfoReturnType } from \"./get-funding-info\";\n\n/** Data resolved by the {@link getFundingInfoQueryOptions} query. */\nexport type GetFundingInfoData<K extends SymmioSolverKind = SymmioSolverKind> = GetFundingInfoReturnType<K>;\n\n/**\n * Build a funding cache key including the solver-specific filter and deployment identity.\n * @param options - Optional deployment, solver and symbol IDs/tickers; query overrides are excluded.\n * @returns A stable query-key tuple.\n * @throws Does not throw for valid options.\n * @example getFundingInfoQueryKey({ symbolIds: [117, 185] });\n */\nexport function getFundingInfoQueryKey(options: Compute<GetFundingInfoParameters & ConfigKeyParameter> = {}) {\n return [\"getFundingInfo\", filterQueryOptions(options)] as const;\n}\n\n/** Query-key type produced by {@link getFundingInfoQueryKey}. */\nexport type GetFundingInfoQueryKey = ReturnType<typeof getFundingInfoQueryKey>;\n\n/** Options accepted by {@link getFundingInfoQueryOptions}. */\nexport type GetFundingInfoOptions<K extends SymmioSolverKind = SymmioSolverKind> = Compute<\n GetFundingInfoParameters<K> &\n QueryParameter<GetFundingInfoData<K>, Error, GetFundingInfoData<K>, GetFundingInfoQueryKey>\n>;\n\n/** TanStack Query options returned by {@link getFundingInfoQueryOptions}. */\nexport type GetFundingInfoQueryOptions<K extends SymmioSolverKind = SymmioSolverKind> = SymmioQueryOptions<\n GetFundingInfoData<K>,\n Error,\n GetFundingInfoData<K>,\n GetFundingInfoQueryKey\n>;\n\n/**\n * Build TanStack Query options for {@link getFundingInfo}.\n *\n * @param config - The SDK config.\n * @param options - Query parameters (optional `chainId`, `solverId`, `symbolIds` / `symbols`) and TanStack overrides.\n * @throws {SymmError} When configuration cannot be resolved; the query function propagates action errors.\n * @returns Options to pass to `useQuery` / `queryClient.fetchQuery`.\n *\n * @example\n * ```ts\n * useQuery(getFundingInfoQueryOptions(config, {}));\n * ```\n */\nexport function getFundingInfoQueryOptions<K extends SymmioSolverKind = SymmioSolverKind>(\n config: Config,\n options: GetFundingInfoOptions<K> = {},\n): GetFundingInfoQueryOptions<K> {\n return {\n ...options.query,\n queryKey: getFundingInfoQueryKey({\n ...options,\n configKey: config.getChainConfigKey(options.chainId),\n }),\n enabled: options.query?.enabled ?? true,\n queryFn: () =>\n getFundingInfo<K>(config, {\n chainId: options.chainId,\n solverId: options.solverId,\n symbolIds: options.symbolIds,\n symbols: options.symbols,\n }),\n };\n}\n"],"mappings":";;;AAiBA,SAAgB,EAAuB,IAAkE,CAAC,GAAG;CAC3G,OAAO,CAAC,kBAAkB,EAAmB,CAAO,CAAC;AACvD;AAgCA,SAAgB,EACd,GACA,IAAoC,CAAC,GACN;CAC/B,OAAO;EACL,GAAG,EAAQ;EACX,UAAU,EAAuB;GAC/B,GAAG;GACH,WAAW,EAAO,kBAAkB,EAAQ,OAAO;EACrD,CAAC;EACD,SAAS,EAAQ,OAAO,WAAW;EACnC,eACE,EAAkB,GAAQ;GACxB,SAAS,EAAQ;GACjB,UAAU,EAAQ;GAClB,WAAW,EAAQ;GACnB,SAAS,EAAQ;EACnB,CAAC;CACL;AACF"}
@@ -1,14 +1,18 @@
1
1
  import { ApiFundingInfoResponse } from '../types/generated/enigma-solver.js';
2
- import { MarketFundingInfo } from './types.js';
2
+ import { EnigmaMarketFundingInfo } from './types.js';
3
3
  /** One market's raw entry from `ApiFundingInfoResponse` (the map value). */
4
4
  type RawFundingInfo = ApiFundingInfoResponse[string];
5
5
  /**
6
- * Map one `ApiFundingInfoResponse` entry (keyed by market name) into the SDK's
6
+ * Map one `ApiFundingInfoResponse` entry (keyed by symbol ID) into the SDK's
7
7
  * {@link MarketFundingInfo}. Missing numeric fields default to `0`.
8
8
  *
9
- * @param symbol - The market name (the response map key).
9
+ * @param symbolId - The market ID (the response map key).
10
10
  * @param raw - The raw funding entry for that market.
11
+ * @returns Funding figures identified by symbol ID, with unchanged rate/time units.
12
+ * @throws Does not throw for a valid funding entry.
13
+ * @example
14
+ * toMarketFundingInfo(12, { next_funding_rate_long: "0.001", next_funding_time: 1783209600000 });
11
15
  */
12
- export declare function toMarketFundingInfo(symbol: string, raw: RawFundingInfo): MarketFundingInfo;
16
+ export declare function toMarketFundingInfo(symbolId: number, raw: RawFundingInfo): EnigmaMarketFundingInfo;
13
17
  export {};
14
18
  //# sourceMappingURL=to-funding-info.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"to-funding-info.d.ts","sourceRoot":"","sources":["../../../src/solvers/funding-info/to-funding-info.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAEjD,4EAA4E;AAC5E,KAAK,cAAc,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAErD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,iBAAiB,CAQ1F"}
1
+ {"version":3,"file":"to-funding-info.d.ts","sourceRoot":"","sources":["../../../src/solvers/funding-info/to-funding-info.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAEvD,4EAA4E;AAC5E,KAAK,cAAc,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAErD;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,GAAG,uBAAuB,CASlG"}
@@ -2,7 +2,8 @@ import { toFiniteNumber as e } from "@symmio/utils/number";
2
2
  //#region src/solvers/funding-info/to-funding-info.ts
3
3
  function t(t, n) {
4
4
  return {
5
- symbol: t,
5
+ kind: "enigma",
6
+ symbolId: t,
6
7
  nextFundingRateLong: e(n.next_funding_rate_long),
7
8
  nextFundingRateShort: e(n.next_funding_rate_short),
8
9
  nextFundingTime: e(n.next_funding_time),
@@ -1 +1 @@
1
- {"version":3,"file":"to-funding-info.js","names":[],"sources":["../../../src/solvers/funding-info/to-funding-info.ts"],"sourcesContent":["import { toFiniteNumber } from \"@symmio/utils/number\";\nimport type { ApiFundingInfoResponse } from \"../types/generated/enigma-solver\";\nimport type { MarketFundingInfo } from \"./types\";\n\n/** One market's raw entry from `ApiFundingInfoResponse` (the map value). */\ntype RawFundingInfo = ApiFundingInfoResponse[string];\n\n/**\n * Map one `ApiFundingInfoResponse` entry (keyed by market name) into the SDK's\n * {@link MarketFundingInfo}. Missing numeric fields default to `0`.\n *\n * @param symbol - The market name (the response map key).\n * @param raw - The raw funding entry for that market.\n */\nexport function toMarketFundingInfo(symbol: string, raw: RawFundingInfo): MarketFundingInfo {\n return {\n symbol,\n nextFundingRateLong: toFiniteNumber(raw.next_funding_rate_long),\n nextFundingRateShort: toFiniteNumber(raw.next_funding_rate_short),\n nextFundingTime: toFiniteNumber(raw.next_funding_time),\n epochDurationSeconds: toFiniteNumber(raw.funding_rate_epoch_duration),\n };\n}\n"],"mappings":";;AAcA,SAAgB,EAAoB,GAAgB,GAAwC;CAC1F,OAAO;EACL;EACA,qBAAqB,EAAe,EAAI,sBAAsB;EAC9D,sBAAsB,EAAe,EAAI,uBAAuB;EAChE,iBAAiB,EAAe,EAAI,iBAAiB;EACrD,sBAAsB,EAAe,EAAI,2BAA2B;CACtE;AACF"}
1
+ {"version":3,"file":"to-funding-info.js","names":[],"sources":["../../../src/solvers/funding-info/to-funding-info.ts"],"sourcesContent":["import { toFiniteNumber } from \"@symmio/utils/number\";\nimport type { ApiFundingInfoResponse } from \"../types/generated/enigma-solver\";\nimport type { EnigmaMarketFundingInfo } from \"./types\";\n\n/** One market's raw entry from `ApiFundingInfoResponse` (the map value). */\ntype RawFundingInfo = ApiFundingInfoResponse[string];\n\n/**\n * Map one `ApiFundingInfoResponse` entry (keyed by symbol ID) into the SDK's\n * {@link MarketFundingInfo}. Missing numeric fields default to `0`.\n *\n * @param symbolId - The market ID (the response map key).\n * @param raw - The raw funding entry for that market.\n * @returns Funding figures identified by symbol ID, with unchanged rate/time units.\n * @throws Does not throw for a valid funding entry.\n * @example\n * toMarketFundingInfo(12, { next_funding_rate_long: \"0.001\", next_funding_time: 1783209600000 });\n */\nexport function toMarketFundingInfo(symbolId: number, raw: RawFundingInfo): EnigmaMarketFundingInfo {\n return {\n kind: \"enigma\",\n symbolId,\n nextFundingRateLong: toFiniteNumber(raw.next_funding_rate_long),\n nextFundingRateShort: toFiniteNumber(raw.next_funding_rate_short),\n nextFundingTime: toFiniteNumber(raw.next_funding_time),\n epochDurationSeconds: toFiniteNumber(raw.funding_rate_epoch_duration),\n };\n}\n"],"mappings":";;AAkBA,SAAgB,EAAoB,GAAkB,GAA8C;CAClG,OAAO;EACL,MAAM;EACN;EACA,qBAAqB,EAAe,EAAI,sBAAsB;EAC9D,sBAAsB,EAAe,EAAI,uBAAuB;EAChE,iBAAiB,EAAe,EAAI,iBAAiB;EACrD,sBAAsB,EAAe,EAAI,2BAA2B;CACtE;AACF"}
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Next-epoch funding figures for one solver market, normalized from the
3
- * generated `/get_funding_info` response.
3
+ * generated `/funding-info` response.
4
4
  *
5
5
  * Funding is charged per epoch: the long side pays (or receives) at
6
6
  * {@link MarketFundingInfo.nextFundingRateLong} and the short side at
@@ -8,10 +8,10 @@
8
8
  * per-epoch decimal fractions the solver reports — multiply by `100` for a
9
9
  * percentage. A **positive** rate means that side *receives* funding; a
10
10
  * **negative** rate means it *pays*.
11
+ * @example
12
+ * const row: MarketFundingInfo = { kind: "enigma", symbolId: 117, nextFundingRateLong: 0.0001, nextFundingRateShort: -0.0001, nextFundingTime: 1783209600000, epochDurationSeconds: 43200 };
11
13
  */
12
- export interface MarketFundingInfo {
13
- /** Market ticker and solver map key (e.g. `"BTCUSDT"`). */
14
- symbol: string;
14
+ interface BaseMarketFundingInfo {
15
15
  /**
16
16
  * Next funding rate for the long side, as a per-epoch decimal fraction
17
17
  * (`0.0001` = `0.01%`). Positive receives, negative pays.
@@ -32,4 +32,26 @@ export interface MarketFundingInfo {
32
32
  /** Length of one funding epoch, in seconds (e.g. `43200` = 12h). `0` when absent. */
33
33
  epochDurationSeconds: number;
34
34
  }
35
+ /** Funding from Enigma's symbol-ID endpoint. */
36
+ export interface EnigmaMarketFundingInfo extends BaseMarketFundingInfo {
37
+ /** Discriminant identifying the solver response. */
38
+ kind: "enigma";
39
+ /** Stable solver symbol ID; join with getSymbols for names. */
40
+ symbolId: number;
41
+ }
42
+ /** Funding from Rasa's existing ticker endpoint. */
43
+ export interface RasaMarketFundingInfo extends BaseMarketFundingInfo {
44
+ /** Discriminant identifying the solver response. */
45
+ kind: "rasa";
46
+ /** Market ticker from the response map key. */
47
+ symbol: string;
48
+ }
49
+ /** Solver funding row. Narrow on kind before reading symbolId or symbol. */
50
+ export type MarketFundingInfo = EnigmaMarketFundingInfo | RasaMarketFundingInfo;
51
+ /** Maps each solver kind to its funding row, used to narrow actions and hooks. */
52
+ export interface NormalizedFundingInfoByKind {
53
+ enigma: EnigmaMarketFundingInfo;
54
+ rasa: RasaMarketFundingInfo;
55
+ }
56
+ export {};
35
57
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/solvers/funding-info/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;;;;OAKG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB,qFAAqF;IACrF,oBAAoB,EAAE,MAAM,CAAC;CAC9B"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/solvers/funding-info/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,UAAU,qBAAqB;IAC7B;;;OAGG;IACH,mBAAmB,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAC7B;;;;;OAKG;IACH,eAAe,EAAE,MAAM,CAAC;IACxB,qFAAqF;IACrF,oBAAoB,EAAE,MAAM,CAAC;CAC9B;AAED,gDAAgD;AAChD,MAAM,WAAW,uBAAwB,SAAQ,qBAAqB;IACpE,oDAAoD;IACpD,IAAI,EAAE,QAAQ,CAAC;IACf,+DAA+D;IAC/D,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,oDAAoD;AACpD,MAAM,WAAW,qBAAsB,SAAQ,qBAAqB;IAClE,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,+CAA+C;IAC/C,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,4EAA4E;AAC5E,MAAM,MAAM,iBAAiB,GAAG,uBAAuB,GAAG,qBAAqB,CAAC;AAChF,kFAAkF;AAClF,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,uBAAuB,CAAC;IAChC,IAAI,EAAE,qBAAqB,CAAC;CAC7B"}
@@ -1,6 +1,7 @@
1
1
  import { Address, Hex } from 'viem';
2
2
  import { Config } from '../../../core/config/index.js';
3
3
  import { Compute, WriteSolverParameter } from '../../../shared/types/properties.js';
4
+ import { InstantDelegationPreflightParameter } from '../../shared/instant-delegation-preflight.js';
4
5
  import { InstantCloseOrder, InstantCloseReturnType, SolverOrderType } from '../shared/types.js';
5
6
  /**
6
7
  * Parameters for the pure {@link instantClose} primitive.
@@ -9,7 +10,7 @@ import { InstantCloseOrder, InstantCloseReturnType, SolverOrderType } from '../s
9
10
  * `requestToClosePosition`. The caller (or the `prepareInstantCloseParams`
10
11
  * wizard) is responsible for trade math.
11
12
  */
12
- export type InstantCloseParameters = Compute<WriteSolverParameter & {
13
+ export type InstantCloseParameters = Compute<WriteSolverParameter & InstantDelegationPreflightParameter & {
13
14
  /**
14
15
  * PartyA — the account that owns the position and signs the close
15
16
  * (EIP-712 `signerAccount`). The VA address on Enigma (lowcap); the
@@ -45,6 +46,12 @@ export type InstantCloseParameters = Compute<WriteSolverParameter & {
45
46
  * Use `prepareInstantCloseParams` to derive this shape from UI-shape inputs,
46
47
  * or `instantCloseAuto` for the combined convenience.
47
48
  *
49
+ * Before signing, it checks that the signer holds the `requestToClosePosition`
50
+ * delegation — on the VA's parent sub-account when `partyA` is a VA (skip it
51
+ * with `preflightDelegation: false`). The sub-account's owner needs none.
52
+ *
53
+ * @throws {SymmError} `INSTANT_SIGNER_NOT_DELEGATED` when the signer lacks the
54
+ * delegation, before anything is signed.
48
55
  * @throws {SymmApiError} when the hedger request fails.
49
56
  *
50
57
  * @example
@@ -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;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"}
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;AAGtF,OAAO,EAEL,KAAK,mCAAmC,EACzC,MAAM,2CAA2C,CAAC;AAInD,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,eAAe,EACrB,MAAM,iBAAiB,CAAC;AAEzB;;;;;;GAMG;AACH,MAAM,MAAM,sBAAsB,GAAG,OAAO,CAC1C,oBAAoB,GAClB,mCAAmC,GAAG;IACpC;;;;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,CACJ,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,sBAAsB,GACjC,OAAO,CAAC,sBAAsB,CAAC,CAiDjC"}
@@ -1,42 +1,50 @@
1
1
  import { buildSignedOperation as e, signAndFormatInstantOperation as t } from "../../instant-open/shared/operations.js";
2
+ import { assertInstantSignerDelegated as n } from "../../shared/instant-delegation-preflight.js";
2
3
  import "../../instant-open/shared/types.js";
3
- import { getLimitOrderDeadline as n, getMarketOrderDeadline as r } from "../../instant-open/shared/trade-math.js";
4
- import { encodeRequestToClosePosition as i } from "../shared/calldata.js";
5
- import { sendInstantClose as a } from "../shared/hedger-api.js";
6
- import { resolveCloseOrderType as o } from "../shared/resolve-close-order-type.js";
4
+ import { getLimitOrderDeadline as r, getMarketOrderDeadline as i } from "../../instant-open/shared/trade-math.js";
5
+ import { encodeRequestToClosePosition as a } from "../shared/calldata.js";
6
+ import { sendInstantClose as o } from "../shared/hedger-api.js";
7
+ import { resolveCloseOrderType as s } from "../shared/resolve-close-order-type.js";
7
8
  //#region src/solvers/instant-close/instant-close/instant-close.ts
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, {
16
- operation: e({
17
- signer: f,
18
- target: l,
19
- callData: i({
20
- quoteId: c.order.quoteId,
21
- closePrice: c.order.closePrice,
22
- quantityToClose: c.order.quantityToClose,
23
- orderType: p,
24
- deadline: m
25
- }),
26
- signerAccount: c.partyA,
27
- deadline: m,
28
- salt: c.salt
9
+ async function c(c, l) {
10
+ let { symmioAddress: u } = c.getChainConfig(l.chainId).addresses, d = c.getSolver({
11
+ chainId: l.chainId,
12
+ solverId: l.solverId
13
+ }), f = await c.getWalletClient({
14
+ chainId: l.chainId,
15
+ from: l.from
16
+ }), p = f.account.address, m = s(d.id, l.orderType ?? 1), h = l.deadline ?? (m === 0 ? r() : i()), g = e({
17
+ signer: p,
18
+ target: u,
19
+ callData: a({
20
+ quoteId: l.order.quoteId,
21
+ closePrice: l.order.closePrice,
22
+ quantityToClose: l.order.quantityToClose,
23
+ orderType: m,
24
+ deadline: h
29
25
  }),
30
- chainId: c.chainId,
31
- walletClient: d
26
+ signerAccount: l.partyA,
27
+ deadline: h,
28
+ salt: l.salt
32
29
  });
33
- return await a(s, {
34
- chainId: c.chainId,
35
- solverId: u.id,
36
- operations: [h]
30
+ await n(c, {
31
+ chainId: l.chainId,
32
+ action: "instantClose",
33
+ operations: [g],
34
+ enabled: l.preflightDelegation
35
+ });
36
+ let _ = await t(c, {
37
+ operation: g,
38
+ chainId: l.chainId,
39
+ walletClient: f
40
+ });
41
+ return await o(c, {
42
+ chainId: l.chainId,
43
+ solverId: d.id,
44
+ operations: [_]
37
45
  }), { success: !0 };
38
46
  }
39
47
  //#endregion
40
- export { s as instantClose };
48
+ export { c as instantClose };
41
49
 
42
50
  //# 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 { 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"}
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 {\n assertInstantSignerDelegated,\n type InstantDelegationPreflightParameter,\n} from \"../../shared/instant-delegation-preflight\";\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 InstantDelegationPreflightParameter & {\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 * Before signing, it checks that the signer holds the `requestToClosePosition`\n * delegation — on the VA's parent sub-account when `partyA` is a VA (skip it\n * with `preflightDelegation: false`). The sub-account's owner needs none.\n *\n * @throws {SymmError} `INSTANT_SIGNER_NOT_DELEGATED` when the signer lacks the\n * delegation, before anything is signed.\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 await assertInstantSignerDelegated(config, {\n chainId: parameters.chainId,\n action: \"instantClose\",\n operations: [operation],\n enabled: parameters.preflightDelegation,\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":";;;;;;;;AAuFA,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,IAUtG,IAAY,EAAqB;EACrC,QAAQ;EACR,QAAQ;EACR,UAXe,EAA6B;GAC5C,SAAS,EAAW,MAAM;GAC1B,YAAY,EAAW,MAAM;GAC7B,iBAAiB,EAAW,MAAM;GAClC;GACA;EACF,CAKE;EACA,eAAe,EAAW;EAC1B;EACA,MAAM,EAAW;CACnB,CAAC;CAED,MAAM,EAA6B,GAAQ;EACzC,SAAS,EAAW;EACpB,QAAQ;EACR,YAAY,CAAC,CAAS;EACtB,SAAS,EAAW;CACtB,CAAC;CAED,IAAM,IAAS,MAAM,EAA8B,GAAQ;EACzD;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"}
@@ -1,6 +1,7 @@
1
1
  import { Address, Hex } from 'viem';
2
2
  import { Config } from '../../../core/config/index.js';
3
3
  import { Compute, WriteSolverParameter } from '../../../shared/types/properties.js';
4
+ import { InstantDelegationPreflightParameter } from '../../shared/instant-delegation-preflight.js';
4
5
  import { InstantCloseOrder } from '../shared/types.js';
5
6
  /** Maximum orders per {@link instantCloseBulk} call (matches the hedger's `1–100` window). */
6
7
  export declare const MAX_INSTANT_CLOSE_BULK_ORDERS = 100;
@@ -27,7 +28,7 @@ export interface InstantCloseBulkOrder {
27
28
  * Each order may still target a different VA via its own `partyA` — the
28
29
  * delegation lives on the subaccount and is inherited by every owned VA.
29
30
  */
30
- export type InstantCloseBulkParameters = Compute<WriteSolverParameter & {
31
+ export type InstantCloseBulkParameters = Compute<WriteSolverParameter & InstantDelegationPreflightParameter & {
31
32
  /** Orders to submit. Length must be in `[1, MAX_INSTANT_CLOSE_BULK_ORDERS]`. */
32
33
  orders: readonly InstantCloseBulkOrder[];
33
34
  }>;
@@ -47,6 +48,9 @@ export interface InstantCloseBulkReturnType {
47
48
  * `from`), so the caller must hold a `requestToClosePosition` delegation on
48
49
  * the owning subaccount. The delegation is inherited by every owned VA, so
49
50
  * orders across different VAs in the same subaccount sign with one key.
51
+ * Every order is built first and that delegation is checked once per
52
+ * sub-account before any order is signed (skip it with
53
+ * `preflightDelegation: false`); the sub-account's owner needs none.
50
54
  *
51
55
  * Pure primitive — every domain value is already final wei. Use
52
56
  * `instantCloseBulkAuto` to derive these inputs from UI-shape parameters.
@@ -55,6 +59,8 @@ export interface InstantCloseBulkReturnType {
55
59
  *
56
60
  * @throws {SymmError} `INSTANT_CLOSE_BULK_INVALID_ORDERS` when the batch is
57
61
  * empty or exceeds {@link MAX_INSTANT_CLOSE_BULK_ORDERS}.
62
+ * @throws {SymmError} `INSTANT_SIGNER_NOT_DELEGATED` when the signer lacks the
63
+ * delegation for any order, before anything is signed.
58
64
  * @throws {SymmApiError} when the hedger request fails — the whole batch is
59
65
  * rejected; the caller should retry with fewer orders.
60
66
  *
@@ -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;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"}
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;AAGtF,OAAO,EAEL,KAAK,mCAAmC,EACzC,MAAM,2CAA2C,CAAC;AAInD,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,GAClB,mCAAmC,GAAG;IACpC,gFAAgF;IAChF,MAAM,EAAE,SAAS,qBAAqB,EAAE,CAAC;CAC1C,CACJ,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,0BAA0B,GACrC,OAAO,CAAC,0BAA0B,CAAC,CAuErC"}