@polyester/sdk 0.3.1 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (189) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +63 -17
  3. package/dist/account-signer/types.d.ts.map +1 -1
  4. package/dist/account-signer/types.js +6 -3
  5. package/dist/account-signer/types.js.map +1 -1
  6. package/dist/browser-client.d.ts +4 -2
  7. package/dist/browser-client.d.ts.map +1 -1
  8. package/dist/browser-client.js +3 -4
  9. package/dist/browser-client.js.map +1 -1
  10. package/dist/catalogs/client-catalog.d.ts.map +1 -1
  11. package/dist/catalogs/client-catalog.js +11 -4
  12. package/dist/catalogs/client-catalog.js.map +1 -1
  13. package/dist/catalogs/index.js +1 -1
  14. package/dist/catalogs/readers.d.ts.map +1 -1
  15. package/dist/catalogs/readers.js +3 -1
  16. package/dist/catalogs/readers.js.map +1 -1
  17. package/dist/catalogs/snapshot-validation.js +132 -0
  18. package/dist/catalogs/snapshot-validation.js.map +1 -0
  19. package/dist/catalogs/snapshot.d.ts.map +1 -1
  20. package/dist/catalogs/snapshot.js +16 -7
  21. package/dist/catalogs/snapshot.js.map +1 -1
  22. package/dist/catalogs/zipper-supply.d.ts.map +1 -1
  23. package/dist/catalogs/zipper-supply.js +10 -7
  24. package/dist/catalogs/zipper-supply.js.map +1 -1
  25. package/dist/core-client.d.ts +24 -17
  26. package/dist/core-client.d.ts.map +1 -1
  27. package/dist/core-client.js +21 -3
  28. package/dist/core-client.js.map +1 -1
  29. package/dist/environment.d.ts.map +1 -1
  30. package/dist/environment.js +32 -1
  31. package/dist/environment.js.map +1 -1
  32. package/dist/index.js +3 -3
  33. package/dist/realtime/client.js +13 -2
  34. package/dist/realtime/client.js.map +1 -1
  35. package/dist/realtime/snapshot-then-stream.js +1 -1
  36. package/dist/realtime/snapshot-then-stream.js.map +1 -1
  37. package/dist/realtime/types.d.ts +2 -0
  38. package/dist/realtime/types.d.ts.map +1 -1
  39. package/dist/server-client.d.ts +17 -8
  40. package/dist/server-client.d.ts.map +1 -1
  41. package/dist/server-client.js +8 -11
  42. package/dist/server-client.js.map +1 -1
  43. package/dist/services/accounts/accounts.js +3 -3
  44. package/dist/services/accounts/accounts.js.map +1 -1
  45. package/dist/services/address-book/address-book.js +28 -28
  46. package/dist/services/address-book/address-book.js.map +1 -1
  47. package/dist/services/address-book/address-book.schemas.d.ts.map +1 -1
  48. package/dist/services/address-book/address-book.schemas.js +2 -1
  49. package/dist/services/address-book/address-book.schemas.js.map +1 -1
  50. package/dist/services/api-keys/api-keys.d.ts.map +1 -1
  51. package/dist/services/api-keys/api-keys.js +12 -12
  52. package/dist/services/api-keys/api-keys.js.map +1 -1
  53. package/dist/services/auth/auth.d.ts +9 -3
  54. package/dist/services/auth/auth.d.ts.map +1 -1
  55. package/dist/services/auth/auth.js +11 -7
  56. package/dist/services/auth/auth.js.map +1 -1
  57. package/dist/services/auth/profile/profile.d.ts.map +1 -1
  58. package/dist/services/auth/profile/profile.js +7 -6
  59. package/dist/services/auth/profile/profile.js.map +1 -1
  60. package/dist/services/auth/session.d.ts +1 -1
  61. package/dist/services/auth/session.d.ts.map +1 -1
  62. package/dist/services/auth/session.js +6 -2
  63. package/dist/services/auth/session.js.map +1 -1
  64. package/dist/services/auth/session.types.d.ts +3 -2
  65. package/dist/services/auth/session.types.d.ts.map +1 -1
  66. package/dist/services/balances/balances.d.ts +1 -1
  67. package/dist/services/balances/balances.d.ts.map +1 -1
  68. package/dist/services/balances/balances.js +9 -8
  69. package/dist/services/balances/balances.js.map +1 -1
  70. package/dist/services/balances/balances.schemas.d.ts +1 -1
  71. package/dist/services/balances/balances.schemas.d.ts.map +1 -1
  72. package/dist/services/balances/balances.schemas.js +1 -1
  73. package/dist/services/balances/balances.schemas.js.map +1 -1
  74. package/dist/services/candles/candles.d.ts.map +1 -1
  75. package/dist/services/candles/candles.js +10 -9
  76. package/dist/services/candles/candles.js.map +1 -1
  77. package/dist/services/candles/candles.schemas.d.ts +11 -11
  78. package/dist/services/candles/candles.schemas.d.ts.map +1 -1
  79. package/dist/services/candles/candles.schemas.js +1 -2
  80. package/dist/services/candles/candles.schemas.js.map +1 -1
  81. package/dist/services/chain-analytics/chain-analytics.js +7 -7
  82. package/dist/services/chain-analytics/chain-analytics.js.map +1 -1
  83. package/dist/services/deposit/deposit.js +5 -5
  84. package/dist/services/deposit/deposit.js.map +1 -1
  85. package/dist/services/guard-signer/guard-signer.js +13 -13
  86. package/dist/services/guard-signer/guard-signer.js.map +1 -1
  87. package/dist/services/heatmap/heatmap.d.ts.map +1 -1
  88. package/dist/services/heatmap/heatmap.js +6 -5
  89. package/dist/services/heatmap/heatmap.js.map +1 -1
  90. package/dist/services/heatmap/heatmap.schemas.d.ts +17 -17
  91. package/dist/services/heatmap/heatmap.schemas.js +1 -1
  92. package/dist/services/heatmap/heatmap.schemas.js.map +1 -1
  93. package/dist/services/internal-transfers/internal-transfers.js +3 -3
  94. package/dist/services/internal-transfers/internal-transfers.js.map +1 -1
  95. package/dist/services/lifecycle/lifecycle.d.ts.map +1 -1
  96. package/dist/services/lifecycle/lifecycle.js +9 -8
  97. package/dist/services/lifecycle/lifecycle.js.map +1 -1
  98. package/dist/services/market-data/market-data.d.ts.map +1 -1
  99. package/dist/services/market-data/market-data.js +6 -5
  100. package/dist/services/market-data/market-data.js.map +1 -1
  101. package/dist/services/market-data/market-data.schemas.d.ts +2 -2
  102. package/dist/services/market-data/market-data.schemas.d.ts.map +1 -1
  103. package/dist/services/market-data/market-data.schemas.js +2 -6
  104. package/dist/services/market-data/market-data.schemas.js.map +1 -1
  105. package/dist/services/market-overview/market-overview.d.ts.map +1 -1
  106. package/dist/services/market-overview/market-overview.js +4 -3
  107. package/dist/services/market-overview/market-overview.js.map +1 -1
  108. package/dist/services/market-overview/market-overview.schemas.d.ts +3 -3
  109. package/dist/services/mfa/mfa.js +27 -27
  110. package/dist/services/mfa/mfa.js.map +1 -1
  111. package/dist/services/orderbook/orderbook.d.ts.map +1 -1
  112. package/dist/services/orderbook/orderbook.js +5 -4
  113. package/dist/services/orderbook/orderbook.js.map +1 -1
  114. package/dist/services/orderbook/orderbook.schemas.d.ts +1 -1
  115. package/dist/services/orders/orders-batch.schemas.d.ts +14 -14
  116. package/dist/services/orders/orders-batch.schemas.js +1 -1
  117. package/dist/services/orders/orders-input.schemas.d.ts +13 -4
  118. package/dist/services/orders/orders-input.schemas.d.ts.map +1 -1
  119. package/dist/services/orders/orders-input.schemas.js +8 -4
  120. package/dist/services/orders/orders-input.schemas.js.map +1 -1
  121. package/dist/services/orders/orders-modify.schemas.d.ts +22 -3
  122. package/dist/services/orders/orders-modify.schemas.d.ts.map +1 -1
  123. package/dist/services/orders/orders-modify.schemas.js +7 -3
  124. package/dist/services/orders/orders-modify.schemas.js.map +1 -1
  125. package/dist/services/orders/orders-output.schemas.d.ts +12 -12
  126. package/dist/services/orders/orders.d.ts +2 -2
  127. package/dist/services/orders/orders.d.ts.map +1 -1
  128. package/dist/services/orders/orders.js +44 -31
  129. package/dist/services/orders/orders.js.map +1 -1
  130. package/dist/services/policies/api-key-policies/api-key-policies.d.ts.map +1 -1
  131. package/dist/services/policies/api-key-policies/api-key-policies.js +11 -11
  132. package/dist/services/policies/api-key-policies/api-key-policies.js.map +1 -1
  133. package/dist/services/policies/subaccount-policies/subaccount-policies.d.ts.map +1 -1
  134. package/dist/services/policies/subaccount-policies/subaccount-policies.js +13 -12
  135. package/dist/services/policies/subaccount-policies/subaccount-policies.js.map +1 -1
  136. package/dist/services/social-verification/social-verification.d.ts.map +1 -1
  137. package/dist/services/social-verification/social-verification.js +7 -7
  138. package/dist/services/social-verification/social-verification.js.map +1 -1
  139. package/dist/services/subaccount-resolver.js +5 -3
  140. package/dist/services/subaccount-resolver.js.map +1 -1
  141. package/dist/services/subaccounts/subaccounts.d.ts +1 -1
  142. package/dist/services/subaccounts/subaccounts.d.ts.map +1 -1
  143. package/dist/services/subaccounts/subaccounts.js +34 -33
  144. package/dist/services/subaccounts/subaccounts.js.map +1 -1
  145. package/dist/services/subaccounts/subaccounts.schemas.d.ts +2 -2
  146. package/dist/services/subaccounts/subaccounts.schemas.js +1 -1
  147. package/dist/services/subaccounts/subaccounts.schemas.js.map +1 -1
  148. package/dist/services/trades/trades.d.ts.map +1 -1
  149. package/dist/services/trades/trades.js +5 -4
  150. package/dist/services/trades/trades.js.map +1 -1
  151. package/dist/services/trading-withdraws/trading-withdraws.js +8 -8
  152. package/dist/services/trading-withdraws/trading-withdraws.js.map +1 -1
  153. package/dist/services/transfers/transfers.d.ts +1 -1
  154. package/dist/services/transfers/transfers.d.ts.map +1 -1
  155. package/dist/services/transfers/transfers.js +5 -4
  156. package/dist/services/transfers/transfers.js.map +1 -1
  157. package/dist/services/triggers/trigger-input.schemas.d.ts +1 -1
  158. package/dist/services/triggers/triggers-output.schemas.d.ts +1 -1
  159. package/dist/services/triggers/triggers.d.ts.map +1 -1
  160. package/dist/services/triggers/triggers.js +21 -20
  161. package/dist/services/triggers/triggers.js.map +1 -1
  162. package/dist/services/whiteboard/whiteboard.js +15 -15
  163. package/dist/services/whiteboard/whiteboard.js.map +1 -1
  164. package/dist/services/zipper/zipper.js +3 -3
  165. package/dist/services/zipper/zipper.js.map +1 -1
  166. package/dist/shared/connect-error-mapping.d.ts +1 -1
  167. package/dist/shared/connect-error-mapping.js +27 -1
  168. package/dist/shared/connect-error-mapping.js.map +1 -1
  169. package/dist/shared/transports.js +7 -12
  170. package/dist/shared/transports.js.map +1 -1
  171. package/dist/shared/types.d.ts +12 -0
  172. package/dist/shared/types.d.ts.map +1 -1
  173. package/dist/shared/validation.js +19 -0
  174. package/dist/shared/validation.js.map +1 -0
  175. package/dist/utils/cookies.d.ts +8 -3
  176. package/dist/utils/cookies.d.ts.map +1 -1
  177. package/dist/utils/cookies.js +7 -1
  178. package/dist/utils/cookies.js.map +1 -1
  179. package/dist/utils/event-emitter.d.ts +1 -1
  180. package/dist/utils/event-emitter.d.ts.map +1 -1
  181. package/dist/utils/event-emitter.js +4 -2
  182. package/dist/utils/event-emitter.js.map +1 -1
  183. package/dist/utils/evm.js +2 -2
  184. package/dist/utils/evm.js.map +1 -1
  185. package/dist/utils/jwt.d.ts +2 -2
  186. package/dist/utils/jwt.d.ts.map +1 -1
  187. package/dist/utils/jwt.js +2 -2
  188. package/dist/utils/jwt.js.map +1 -1
  189. package/package.json +3 -3
@@ -0,0 +1,132 @@
1
+ import { ValidationError } from "../shared/errors.js";
2
+ import { PAIR_STATUSES } from "../shared/catalog-config.js";
3
+ import * as v from "valibot";
4
+ //#region src/catalogs/snapshot-validation.ts
5
+ const FiniteNumberSchema = v.pipe(v.number(), v.finite());
6
+ const IntegerSchema = v.pipe(FiniteNumberSchema, v.safeInteger());
7
+ const AssetConfigSchema = v.object({
8
+ symbol: v.string(),
9
+ ledgerId: IntegerSchema,
10
+ name: v.string(),
11
+ quantityDisplayDecimals: IntegerSchema,
12
+ quantityScale: IntegerSchema
13
+ });
14
+ const PairMarketDataConfigSchema = v.object({ orderbookPriceBuckets: v.array(FiniteNumberSchema) });
15
+ const EnrichedPairConfigSchema = v.object({
16
+ symbolId: IntegerSchema,
17
+ symbol: v.string(),
18
+ baseAsset: AssetConfigSchema,
19
+ quoteAsset: AssetConfigSchema,
20
+ tickSize: v.string(),
21
+ stepSize: v.string(),
22
+ minNotionalQuote: v.string(),
23
+ minQtyBase: v.string(),
24
+ allowBuyFeeFromBase: v.boolean(),
25
+ defaultMarketSlippagePctBuy: FiniteNumberSchema,
26
+ defaultMarketSlippagePctSell: FiniteNumberSchema,
27
+ maxClientRefDriftPct: FiniteNumberSchema,
28
+ marketdata: v.optional(PairMarketDataConfigSchema),
29
+ listingAt: v.nullable(FiniteNumberSchema),
30
+ delistingAt: v.nullable(FiniteNumberSchema),
31
+ status: v.picklist([...PAIR_STATUSES, "unknown"])
32
+ });
33
+ const ZipperChainConfigSchema = v.object({
34
+ chainId: IntegerSchema,
35
+ code: v.string(),
36
+ name: v.string(),
37
+ nativeChainId: v.string(),
38
+ nativeCurrencySymbol: v.string(),
39
+ explorerUrl: v.string(),
40
+ icon: v.string(),
41
+ requiredConfirmations: IntegerSchema,
42
+ confirmationTimeSeconds: IntegerSchema,
43
+ isCaseSensitive: v.boolean(),
44
+ minAddressLength: IntegerSchema,
45
+ maxAddressLength: IntegerSchema
46
+ });
47
+ const ZipperTokenConfigSchema = v.object({
48
+ address: v.string(),
49
+ decimals: IntegerSchema
50
+ });
51
+ const ZipperEnrichedAssetChainSchema = v.object({
52
+ ...ZipperChainConfigSchema.entries,
53
+ zippedAssetId: IntegerSchema,
54
+ isNativeAsset: v.boolean(),
55
+ networkFee: v.optional(v.string()),
56
+ networkFeeTsSec: v.optional(FiniteNumberSchema),
57
+ depositMinAmount: v.optional(v.string()),
58
+ withdrawMinAmount: v.optional(v.string()),
59
+ supply: v.optional(v.string()),
60
+ sourceToken: ZipperTokenConfigSchema,
61
+ zToken: ZipperTokenConfigSchema
62
+ });
63
+ const ZipperEnrichedAssetConfigSchema = v.object({
64
+ asset: v.string(),
65
+ ledgerId: IntegerSchema,
66
+ name: v.string(),
67
+ icon: v.string(),
68
+ quantityScale: IntegerSchema,
69
+ quantityDisplayDecimals: IntegerSchema,
70
+ uAssetId: v.string(),
71
+ chains: v.array(ZipperEnrichedAssetChainSchema)
72
+ });
73
+ const ZipperChainContractConfigSchema = v.object({
74
+ name: v.string(),
75
+ address: v.string(),
76
+ type: v.string(),
77
+ description: v.string(),
78
+ version: IntegerSchema
79
+ });
80
+ const CatalogSnapshotShapeSchema = v.object({
81
+ source: v.picklist(["api", "snapshot"]),
82
+ tsMs: FiniteNumberSchema,
83
+ version: IntegerSchema,
84
+ market: v.object({
85
+ assets: v.array(AssetConfigSchema),
86
+ pairs: v.array(EnrichedPairConfigSchema),
87
+ tsSec: v.optional(FiniteNumberSchema)
88
+ }),
89
+ zipper: v.object({
90
+ chains: v.array(ZipperChainConfigSchema),
91
+ assets: v.array(ZipperEnrichedAssetConfigSchema),
92
+ contracts: v.array(ZipperChainContractConfigSchema),
93
+ tsMs: v.optional(FiniteNumberSchema)
94
+ })
95
+ });
96
+ const ZippedAssetSupplyCatalogUpdatesSchema = v.array(v.object({
97
+ zippedAssetId: IntegerSchema,
98
+ supply: v.string()
99
+ }));
100
+ const parsedSnapshots = /* @__PURE__ */ new WeakMap();
101
+ function hasValidRelationships(snapshot) {
102
+ const assetSymbols = new Set(snapshot.market.assets.map((asset) => asset.symbol));
103
+ if (snapshot.market.pairs.some((pair) => !assetSymbols.has(pair.baseAsset.symbol) || !assetSymbols.has(pair.quoteAsset.symbol))) return false;
104
+ const chainIds = new Set(snapshot.zipper.chains.map((chain) => chain.chainId));
105
+ return snapshot.zipper.assets.every((asset) => asset.chains.every((chain) => chainIds.has(chain.chainId)));
106
+ }
107
+ const CatalogSnapshotSchema = v.custom((value) => {
108
+ const result = v.safeParse(CatalogSnapshotShapeSchema, value);
109
+ return result.success && hasValidRelationships(result.output);
110
+ });
111
+ /** Parses and caches untrusted SSR or JavaScript input as a catalog snapshot. */
112
+ function parseCatalogSnapshot(value) {
113
+ if (typeof value !== "object" || value === null) throw new ValidationError("Catalog snapshot is malformed.");
114
+ const cached = parsedSnapshots.get(value);
115
+ if (cached) return cached;
116
+ const result = v.safeParse(CatalogSnapshotSchema, value);
117
+ if (!result.success) throw new ValidationError("Catalog snapshot is malformed.");
118
+ const snapshot = result.output;
119
+ parsedSnapshots.set(value, snapshot);
120
+ parsedSnapshots.set(snapshot, snapshot);
121
+ return snapshot;
122
+ }
123
+ /** Parses supply updates before they can advance a snapshot's version or timestamp. */
124
+ function parseZippedAssetSupplyCatalogUpdates(value) {
125
+ const result = v.safeParse(ZippedAssetSupplyCatalogUpdatesSchema, value);
126
+ if (!result.success) throw new ValidationError("Zipper catalog supply updates are malformed.");
127
+ return result.output;
128
+ }
129
+ //#endregion
130
+ export { parseCatalogSnapshot, parseZippedAssetSupplyCatalogUpdates };
131
+
132
+ //# sourceMappingURL=snapshot-validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-validation.js","names":[],"sources":["../../src/catalogs/snapshot-validation.ts"],"sourcesContent":["import * as v from \"valibot\";\nimport { ValidationError } from \"../shared/errors.js\";\nimport { PAIR_STATUSES } from \"../shared/catalog-config.js\";\nimport type { CatalogSnapshot } from \"./types.js\";\nimport type { ZippedAssetSupplyCatalogUpdate } from \"./zipper-supply.js\";\n\nconst FiniteNumberSchema = v.pipe(v.number(), v.finite());\nconst IntegerSchema = v.pipe(FiniteNumberSchema, v.safeInteger());\n\nconst AssetConfigSchema = v.object({\n symbol: v.string(),\n ledgerId: IntegerSchema,\n name: v.string(),\n quantityDisplayDecimals: IntegerSchema,\n quantityScale: IntegerSchema,\n});\n\nconst PairMarketDataConfigSchema = v.object({\n orderbookPriceBuckets: v.array(FiniteNumberSchema),\n});\n\nconst EnrichedPairConfigSchema = v.object({\n symbolId: IntegerSchema,\n symbol: v.string(),\n baseAsset: AssetConfigSchema,\n quoteAsset: AssetConfigSchema,\n tickSize: v.string(),\n stepSize: v.string(),\n minNotionalQuote: v.string(),\n minQtyBase: v.string(),\n allowBuyFeeFromBase: v.boolean(),\n defaultMarketSlippagePctBuy: FiniteNumberSchema,\n defaultMarketSlippagePctSell: FiniteNumberSchema,\n maxClientRefDriftPct: FiniteNumberSchema,\n marketdata: v.optional(PairMarketDataConfigSchema),\n listingAt: v.nullable(FiniteNumberSchema),\n delistingAt: v.nullable(FiniteNumberSchema),\n status: v.picklist([...PAIR_STATUSES, \"unknown\"]),\n});\n\nconst ZipperChainConfigSchema = v.object({\n chainId: IntegerSchema,\n code: v.string(),\n name: v.string(),\n nativeChainId: v.string(),\n nativeCurrencySymbol: v.string(),\n explorerUrl: v.string(),\n icon: v.string(),\n requiredConfirmations: IntegerSchema,\n confirmationTimeSeconds: IntegerSchema,\n isCaseSensitive: v.boolean(),\n minAddressLength: IntegerSchema,\n maxAddressLength: IntegerSchema,\n});\n\nconst ZipperTokenConfigSchema = v.object({\n address: v.string(),\n decimals: IntegerSchema,\n});\n\nconst ZipperEnrichedAssetChainSchema = v.object({\n ...ZipperChainConfigSchema.entries,\n zippedAssetId: IntegerSchema,\n isNativeAsset: v.boolean(),\n networkFee: v.optional(v.string()),\n networkFeeTsSec: v.optional(FiniteNumberSchema),\n depositMinAmount: v.optional(v.string()),\n withdrawMinAmount: v.optional(v.string()),\n supply: v.optional(v.string()),\n sourceToken: ZipperTokenConfigSchema,\n zToken: ZipperTokenConfigSchema,\n});\n\nconst ZipperEnrichedAssetConfigSchema = v.object({\n asset: v.string(),\n ledgerId: IntegerSchema,\n name: v.string(),\n icon: v.string(),\n quantityScale: IntegerSchema,\n quantityDisplayDecimals: IntegerSchema,\n uAssetId: v.string(),\n chains: v.array(ZipperEnrichedAssetChainSchema),\n});\n\nconst ZipperChainContractConfigSchema = v.object({\n name: v.string(),\n address: v.string(),\n type: v.string(),\n description: v.string(),\n version: IntegerSchema,\n});\n\nconst CatalogSnapshotShapeSchema = v.object({\n source: v.picklist([\"api\", \"snapshot\"]),\n tsMs: FiniteNumberSchema,\n version: IntegerSchema,\n market: v.object({\n assets: v.array(AssetConfigSchema),\n pairs: v.array(EnrichedPairConfigSchema),\n tsSec: v.optional(FiniteNumberSchema),\n }),\n zipper: v.object({\n chains: v.array(ZipperChainConfigSchema),\n assets: v.array(ZipperEnrichedAssetConfigSchema),\n contracts: v.array(ZipperChainContractConfigSchema),\n tsMs: v.optional(FiniteNumberSchema),\n }),\n});\n\nconst ZippedAssetSupplyCatalogUpdatesSchema = v.array(\n v.object({\n zippedAssetId: IntegerSchema,\n supply: v.string(),\n }),\n);\n\nconst parsedSnapshots = new WeakMap<object, CatalogSnapshot>();\n\nfunction hasValidRelationships(\n snapshot: v.InferOutput<typeof CatalogSnapshotShapeSchema>,\n): boolean {\n const assetSymbols = new Set(snapshot.market.assets.map((asset) => asset.symbol));\n if (\n snapshot.market.pairs.some(\n (pair) =>\n !assetSymbols.has(pair.baseAsset.symbol) ||\n !assetSymbols.has(pair.quoteAsset.symbol),\n )\n ) {\n return false;\n }\n\n const chainIds = new Set(snapshot.zipper.chains.map((chain) => chain.chainId));\n return snapshot.zipper.assets.every((asset) =>\n asset.chains.every((chain) => chainIds.has(chain.chainId)),\n );\n}\n\nconst CatalogSnapshotSchema = v.custom<CatalogSnapshot>((value) => {\n const result = v.safeParse(CatalogSnapshotShapeSchema, value);\n return result.success && hasValidRelationships(result.output);\n});\n\n/** Parses and caches untrusted SSR or JavaScript input as a catalog snapshot. */\nexport function parseCatalogSnapshot(value: unknown): CatalogSnapshot {\n if (typeof value !== \"object\" || value === null) {\n throw new ValidationError(\"Catalog snapshot is malformed.\");\n }\n\n const cached = parsedSnapshots.get(value);\n if (cached) return cached;\n\n const result = v.safeParse(CatalogSnapshotSchema, value);\n if (!result.success) {\n throw new ValidationError(\"Catalog snapshot is malformed.\");\n }\n\n const snapshot: CatalogSnapshot = result.output;\n parsedSnapshots.set(value, snapshot);\n parsedSnapshots.set(snapshot, snapshot);\n return snapshot;\n}\n\n/** Parses supply updates before they can advance a snapshot's version or timestamp. */\nexport function parseZippedAssetSupplyCatalogUpdates(\n value: unknown,\n): readonly ZippedAssetSupplyCatalogUpdate[] {\n const result = v.safeParse(ZippedAssetSupplyCatalogUpdatesSchema, value);\n if (!result.success) {\n throw new ValidationError(\"Zipper catalog supply updates are malformed.\");\n }\n return result.output;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.d.ts","names":[],"sources":["../../src/catalogs/snapshot.ts"],"mappings":";;;;KAIY;WACC,QAAQ;WACR,QAAQ;;iBAGL,qBAAqB;EACjC,QAAQ;EACR,QAAQ;EACR,SAAS;EACT;EACA;IACA"}
1
+ {"version":3,"file":"snapshot.d.ts","names":[],"sources":["../../src/catalogs/snapshot.ts"],"mappings":";;;;KAMY;WACC,QAAQ;WACR,QAAQ;;iBAGL,qBAAqB;EACjC,QAAQ;EACR,QAAQ;EACR,SAAS;EACT;EACA;IACA"}
@@ -1,14 +1,23 @@
1
+ import { ValidationError } from "../shared/errors.js";
2
+ import { parseCatalogSnapshot } from "./snapshot-validation.js";
1
3
  import { buildMarketCatalogData } from "./market-data-catalog.js";
2
4
  import { buildZipperCatalogData } from "./zipper-catalog.js";
3
5
  //#region src/catalogs/snapshot.ts
4
6
  function buildCatalogSnapshot(params) {
5
- return Object.freeze({
6
- source: params.source ?? "snapshot",
7
- tsMs: params.tsMs ?? Date.now(),
8
- version: params.version ?? 1,
9
- market: buildMarketCatalogData(params.market),
10
- zipper: buildZipperCatalogData(params.zipper)
11
- });
7
+ if (typeof params !== "object" || params === null || Array.isArray(params)) throw new ValidationError("Catalog snapshot input must be an object.");
8
+ if (typeof params.market !== "object" || params.market === null || !Array.isArray(params.market.assets) || !Array.isArray(params.market.pairs) || typeof params.zipper !== "object" || params.zipper === null || !Array.isArray(params.zipper.chains) || !Array.isArray(params.zipper.assets)) throw new ValidationError("Catalog snapshot input requires valid market and zipper seeds.");
9
+ try {
10
+ return parseCatalogSnapshot(Object.freeze({
11
+ source: params.source ?? "snapshot",
12
+ tsMs: params.tsMs ?? Date.now(),
13
+ version: params.version ?? 1,
14
+ market: buildMarketCatalogData(params.market),
15
+ zipper: buildZipperCatalogData(params.zipper)
16
+ }));
17
+ } catch (error) {
18
+ if (error instanceof ValidationError) throw error;
19
+ throw new ValidationError("Catalog snapshot input is malformed.", { cause: error });
20
+ }
12
21
  }
13
22
  //#endregion
14
23
  export { buildCatalogSnapshot };
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.js","names":[],"sources":["../../src/catalogs/snapshot.ts"],"sourcesContent":["import { buildMarketCatalogData, type MarketCatalogSeed } from \"./market-data-catalog.js\";\nimport type { CatalogSnapshot } from \"./types.js\";\nimport { buildZipperCatalogData, type ZipperCatalogSeed } from \"./zipper-catalog.js\";\n\nexport type CatalogSnapshotInput = {\n readonly market: MarketCatalogSeed;\n readonly zipper: ZipperCatalogSeed;\n};\n\nexport function buildCatalogSnapshot(params: {\n market: MarketCatalogSeed;\n zipper: ZipperCatalogSeed;\n source?: CatalogSnapshot[\"source\"];\n version?: number;\n tsMs?: number;\n}): CatalogSnapshot {\n return Object.freeze({\n source: params.source ?? \"snapshot\",\n tsMs: params.tsMs ?? Date.now(),\n version: params.version ?? 1,\n market: buildMarketCatalogData(params.market),\n zipper: buildZipperCatalogData(params.zipper),\n });\n}\n"],"mappings":";;;AASA,SAAgB,qBAAqB,QAMjB;CAChB,OAAO,OAAO,OAAO;EACjB,QAAQ,OAAO,UAAU;EACzB,MAAM,OAAO,QAAQ,KAAK,IAAI;EAC9B,SAAS,OAAO,WAAW;EAC3B,QAAQ,uBAAuB,OAAO,MAAM;EAC5C,QAAQ,uBAAuB,OAAO,MAAM;CAChD,CAAC;AACL"}
1
+ {"version":3,"file":"snapshot.js","names":[],"sources":["../../src/catalogs/snapshot.ts"],"sourcesContent":["import { buildMarketCatalogData, type MarketCatalogSeed } from \"./market-data-catalog.js\";\nimport type { CatalogSnapshot } from \"./types.js\";\nimport { buildZipperCatalogData, type ZipperCatalogSeed } from \"./zipper-catalog.js\";\nimport { ValidationError } from \"../shared/errors.js\";\nimport { parseCatalogSnapshot } from \"./snapshot-validation.js\";\n\nexport type CatalogSnapshotInput = {\n readonly market: MarketCatalogSeed;\n readonly zipper: ZipperCatalogSeed;\n};\n\nexport function buildCatalogSnapshot(params: {\n market: MarketCatalogSeed;\n zipper: ZipperCatalogSeed;\n source?: CatalogSnapshot[\"source\"];\n version?: number;\n tsMs?: number;\n}): CatalogSnapshot {\n if (typeof params !== \"object\" || params === null || Array.isArray(params)) {\n throw new ValidationError(\"Catalog snapshot input must be an object.\");\n }\n if (\n typeof params.market !== \"object\" ||\n params.market === null ||\n !Array.isArray(params.market.assets) ||\n !Array.isArray(params.market.pairs) ||\n typeof params.zipper !== \"object\" ||\n params.zipper === null ||\n !Array.isArray(params.zipper.chains) ||\n !Array.isArray(params.zipper.assets)\n ) {\n throw new ValidationError(\"Catalog snapshot input requires valid market and zipper seeds.\");\n }\n\n try {\n return parseCatalogSnapshot(\n Object.freeze({\n source: params.source ?? \"snapshot\",\n tsMs: params.tsMs ?? Date.now(),\n version: params.version ?? 1,\n market: buildMarketCatalogData(params.market),\n zipper: buildZipperCatalogData(params.zipper),\n }),\n );\n } catch (error) {\n if (error instanceof ValidationError) throw error;\n throw new ValidationError(\"Catalog snapshot input is malformed.\", { cause: error });\n }\n}\n"],"mappings":";;;;;AAWA,SAAgB,qBAAqB,QAMjB;CAChB,IAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAQ,MAAM,GACrE,MAAM,IAAI,gBAAgB,2CAA2C;CAEzE,IACI,OAAO,OAAO,WAAW,YACzB,OAAO,WAAW,QAClB,CAAC,MAAM,QAAQ,OAAO,OAAO,MAAM,KACnC,CAAC,MAAM,QAAQ,OAAO,OAAO,KAAK,KAClC,OAAO,OAAO,WAAW,YACzB,OAAO,WAAW,QAClB,CAAC,MAAM,QAAQ,OAAO,OAAO,MAAM,KACnC,CAAC,MAAM,QAAQ,OAAO,OAAO,MAAM,GAEnC,MAAM,IAAI,gBAAgB,gEAAgE;CAG9F,IAAI;EACA,OAAO,qBACH,OAAO,OAAO;GACV,QAAQ,OAAO,UAAU;GACzB,MAAM,OAAO,QAAQ,KAAK,IAAI;GAC9B,SAAS,OAAO,WAAW;GAC3B,QAAQ,uBAAuB,OAAO,MAAM;GAC5C,QAAQ,uBAAuB,OAAO,MAAM;EAChD,CAAC,CACL;CACJ,SAAS,OAAO;EACZ,IAAI,iBAAiB,iBAAiB,MAAM;EAC5C,MAAM,IAAI,gBAAgB,wCAAwC,EAAE,OAAO,MAAM,CAAC;CACtF;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"zipper-supply.d.ts","names":[],"sources":["../../src/catalogs/zipper-supply.ts"],"mappings":";;KAEY;EACR;EACA;;iBAGY,yBACZ,UAAU,iBACV,kBAAkB,mCACnB"}
1
+ {"version":3,"file":"zipper-supply.d.ts","names":[],"sources":["../../src/catalogs/zipper-supply.ts"],"mappings":";;KAMY;EACR;EACA;;iBAGY,yBACZ,UAAU,iBACV,kBAAkB,mCACnB"}
@@ -1,10 +1,13 @@
1
+ import { parseCatalogSnapshot, parseZippedAssetSupplyCatalogUpdates } from "./snapshot-validation.js";
1
2
  //#region src/catalogs/zipper-supply.ts
2
3
  function patchZipperCatalogSupply(snapshot, updates) {
3
- if (updates.length === 0) return snapshot;
4
+ const parsedSnapshot = parseCatalogSnapshot(snapshot);
5
+ const parsedUpdates = parseZippedAssetSupplyCatalogUpdates(updates);
6
+ if (parsedUpdates.length === 0) return parsedSnapshot;
4
7
  const supplyByZippedAssetId = /* @__PURE__ */ new Map();
5
- for (const update of updates) supplyByZippedAssetId.set(update.zippedAssetId, update.supply);
8
+ for (const update of parsedUpdates) supplyByZippedAssetId.set(update.zippedAssetId, update.supply);
6
9
  let changed = false;
7
- const assets = snapshot.zipper.assets.map((asset) => {
10
+ const assets = parsedSnapshot.zipper.assets.map((asset) => {
8
11
  let assetChanged = false;
9
12
  const chains = asset.chains.map((chain) => {
10
13
  const supply = supplyByZippedAssetId.get(chain.zippedAssetId);
@@ -21,14 +24,14 @@ function patchZipperCatalogSupply(snapshot, updates) {
21
24
  chains
22
25
  } : asset;
23
26
  });
24
- if (!changed) return snapshot;
27
+ if (!changed) return parsedSnapshot;
25
28
  const nowMs = Date.now();
26
29
  return {
27
- ...snapshot,
30
+ ...parsedSnapshot,
28
31
  tsMs: nowMs,
29
- version: snapshot.version + 1,
32
+ version: parsedSnapshot.version + 1,
30
33
  zipper: {
31
- ...snapshot.zipper,
34
+ ...parsedSnapshot.zipper,
32
35
  tsMs: nowMs,
33
36
  assets
34
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"zipper-supply.js","names":[],"sources":["../../src/catalogs/zipper-supply.ts"],"sourcesContent":["import type { CatalogSnapshot } from \"./types.js\";\n\nexport type ZippedAssetSupplyCatalogUpdate = {\n zippedAssetId: number;\n supply: string;\n};\n\nexport function patchZipperCatalogSupply(\n snapshot: CatalogSnapshot,\n updates: readonly ZippedAssetSupplyCatalogUpdate[],\n): CatalogSnapshot {\n if (updates.length === 0) return snapshot;\n\n const supplyByZippedAssetId = new Map<number, string>();\n for (const update of updates) {\n supplyByZippedAssetId.set(update.zippedAssetId, update.supply);\n }\n\n let changed = false;\n const assets = snapshot.zipper.assets.map((asset) => {\n let assetChanged = false;\n const chains = asset.chains.map((chain) => {\n const supply = supplyByZippedAssetId.get(chain.zippedAssetId);\n if (supply === undefined || supply === chain.supply) return chain;\n assetChanged = true;\n changed = true;\n return { ...chain, supply };\n });\n\n return assetChanged ? { ...asset, chains } : asset;\n });\n\n if (!changed) return snapshot;\n const nowMs = Date.now();\n\n return {\n ...snapshot,\n tsMs: nowMs,\n version: snapshot.version + 1,\n zipper: {\n ...snapshot.zipper,\n tsMs: nowMs,\n assets,\n },\n };\n}\n"],"mappings":";AAOA,SAAgB,yBACZ,UACA,SACe;CACf,IAAI,QAAQ,WAAW,GAAG,OAAO;CAEjC,MAAM,wCAAwB,IAAI,IAAoB;CACtD,KAAK,MAAM,UAAU,SACjB,sBAAsB,IAAI,OAAO,eAAe,OAAO,MAAM;CAGjE,IAAI,UAAU;CACd,MAAM,SAAS,SAAS,OAAO,OAAO,KAAK,UAAU;EACjD,IAAI,eAAe;EACnB,MAAM,SAAS,MAAM,OAAO,KAAK,UAAU;GACvC,MAAM,SAAS,sBAAsB,IAAI,MAAM,aAAa;GAC5D,IAAI,WAAW,KAAA,KAAa,WAAW,MAAM,QAAQ,OAAO;GAC5D,eAAe;GACf,UAAU;GACV,OAAO;IAAE,GAAG;IAAO;GAAO;EAC9B,CAAC;EAED,OAAO,eAAe;GAAE,GAAG;GAAO;EAAO,IAAI;CACjD,CAAC;CAED,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,QAAQ,KAAK,IAAI;CAEvB,OAAO;EACH,GAAG;EACH,MAAM;EACN,SAAS,SAAS,UAAU;EAC5B,QAAQ;GACJ,GAAG,SAAS;GACZ,MAAM;GACN;EACJ;CACJ;AACJ"}
1
+ {"version":3,"file":"zipper-supply.js","names":[],"sources":["../../src/catalogs/zipper-supply.ts"],"sourcesContent":["import type { CatalogSnapshot } from \"./types.js\";\nimport {\n parseCatalogSnapshot,\n parseZippedAssetSupplyCatalogUpdates,\n} from \"./snapshot-validation.js\";\n\nexport type ZippedAssetSupplyCatalogUpdate = {\n zippedAssetId: number;\n supply: string;\n};\n\nexport function patchZipperCatalogSupply(\n snapshot: CatalogSnapshot,\n updates: readonly ZippedAssetSupplyCatalogUpdate[],\n): CatalogSnapshot {\n const parsedSnapshot = parseCatalogSnapshot(snapshot);\n const parsedUpdates = parseZippedAssetSupplyCatalogUpdates(updates);\n if (parsedUpdates.length === 0) return parsedSnapshot;\n\n const supplyByZippedAssetId = new Map<number, string>();\n for (const update of parsedUpdates) {\n supplyByZippedAssetId.set(update.zippedAssetId, update.supply);\n }\n\n let changed = false;\n const assets = parsedSnapshot.zipper.assets.map((asset) => {\n let assetChanged = false;\n const chains = asset.chains.map((chain) => {\n const supply = supplyByZippedAssetId.get(chain.zippedAssetId);\n if (supply === undefined || supply === chain.supply) return chain;\n assetChanged = true;\n changed = true;\n return { ...chain, supply };\n });\n\n return assetChanged ? { ...asset, chains } : asset;\n });\n\n if (!changed) return parsedSnapshot;\n const nowMs = Date.now();\n\n return {\n ...parsedSnapshot,\n tsMs: nowMs,\n version: parsedSnapshot.version + 1,\n zipper: {\n ...parsedSnapshot.zipper,\n tsMs: nowMs,\n assets,\n },\n };\n}\n"],"mappings":";;AAWA,SAAgB,yBACZ,UACA,SACe;CACf,MAAM,iBAAiB,qBAAqB,QAAQ;CACpD,MAAM,gBAAgB,qCAAqC,OAAO;CAClE,IAAI,cAAc,WAAW,GAAG,OAAO;CAEvC,MAAM,wCAAwB,IAAI,IAAoB;CACtD,KAAK,MAAM,UAAU,eACjB,sBAAsB,IAAI,OAAO,eAAe,OAAO,MAAM;CAGjE,IAAI,UAAU;CACd,MAAM,SAAS,eAAe,OAAO,OAAO,KAAK,UAAU;EACvD,IAAI,eAAe;EACnB,MAAM,SAAS,MAAM,OAAO,KAAK,UAAU;GACvC,MAAM,SAAS,sBAAsB,IAAI,MAAM,aAAa;GAC5D,IAAI,WAAW,KAAA,KAAa,WAAW,MAAM,QAAQ,OAAO;GAC5D,eAAe;GACf,UAAU;GACV,OAAO;IAAE,GAAG;IAAO;GAAO;EAC9B,CAAC;EAED,OAAO,eAAe;GAAE,GAAG;GAAO;EAAO,IAAI;CACjD,CAAC;CAED,IAAI,CAAC,SAAS,OAAO;CACrB,MAAM,QAAQ,KAAK,IAAI;CAEvB,OAAO;EACH,GAAG;EACH,MAAM;EACN,SAAS,eAAe,UAAU;EAClC,QAAQ;GACJ,GAAG,eAAe;GAClB,MAAM;GACN;EACJ;CACJ;AACJ"}
@@ -58,7 +58,7 @@ import "./services/mfa/index.js";
58
58
  import { Interceptor } from "@connectrpc/connect";
59
59
  //#region src/core-client.d.ts
60
60
  type PolyesterRealtimeAuthConfig = Pick<RealtimeConfig, "getAuthHeaders" | "hasAuth">;
61
- interface PolyesterClientBaseConfig {
61
+ interface PolyesterClientCommonConfig {
62
62
  environment: PolyesterEnvironment;
63
63
  interceptors?: Interceptor[];
64
64
  auth?: JwtAuthProvider | ApiKeyEd25519AuthProvider;
@@ -68,21 +68,6 @@ interface PolyesterClientBaseConfig {
68
68
  * Use `json` for human-readable debugging.
69
69
  */
70
70
  wireFormat?: "binary" | "json";
71
- /**
72
- * Client-owned catalog store. Advanced callers can inject a fully managed catalog instance.
73
- */
74
- catalog?: ClientCatalog;
75
- /**
76
- * Explicit initial catalog snapshot, commonly hydrated from server-rendered data.
77
- * Combines with `catalogCell` as the cell's initial value (never clobbers a
78
- * pre-populated cell).
79
- */
80
- catalogSnapshot?: CatalogSnapshot;
81
- /**
82
- * External snapshot storage for the client-built catalog (mutually exclusive with
83
- * `catalog`). A cell backed by a reactive source makes every catalog read reactive.
84
- */
85
- catalogCell?: CatalogSnapshotCell;
86
71
  /**
87
72
  * Advanced: inject pre-built Connect transports (in-memory mocks, custom
88
73
  * stacks). When provided, the SDK does not build its own transports and the
@@ -97,7 +82,29 @@ interface PolyesterClientBaseConfig {
97
82
  */
98
83
  realtimeClient?: PolyesterRealtime;
99
84
  }
100
- interface PolyesterClientConfig extends PolyesterClientBaseConfig {}
85
+ type PolyesterCatalogConfig = {
86
+ /** Client-owned catalog store. */
87
+ catalog: ClientCatalog;
88
+ catalogSnapshot?: never;
89
+ catalogCell?: never;
90
+ } | {
91
+ catalog?: never;
92
+ /**
93
+ * Explicit initial catalog snapshot, commonly hydrated from server-rendered data.
94
+ * Combines with `catalogCell` as the cell's initial value without clobbering a
95
+ * pre-populated cell.
96
+ */
97
+ catalogSnapshot?: CatalogSnapshot;
98
+ /**
99
+ * External snapshot storage for the client-built catalog. A cell backed by a
100
+ * reactive source makes every catalog read reactive.
101
+ */
102
+ catalogCell?: CatalogSnapshotCell;
103
+ };
104
+ /** Configuration shared by every Polyester client. */
105
+ type PolyesterClientBaseConfig = PolyesterClientCommonConfig & PolyesterCatalogConfig;
106
+ /** Configuration for the base Polyester client. */
107
+ type PolyesterClientConfig = PolyesterClientBaseConfig;
101
108
  interface AuthServiceFactoryContext {
102
109
  transports: AuthServiceTransports;
103
110
  realtime: PolyesterRealtime;
@@ -1 +1 @@
1
- {"version":3,"file":"core-client.d.ts","names":[],"sources":["../src/core-client.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4EY,8BAA8B,KAAK;UAE9B;EACb,aAAa;EACb,eAAe;EACf,OAAO,kBAAkB;EACzB,WAAW;;;;;EAKX;;;;EAIA,UAAU;;;;;;EAMV,kBAAkB;;;;;EAKlB,cAAc;;;;;;;EAOd,aAAa;;;;;;EAMb,iBAAiB;;UAGJ,8BAA8B;UAErC;EACN,YAAY;EACZ,UAAU;EACV,aAAa;EACb,aAAa;;UAGP;EACN,cAAc,SAAS,8BAA8B;;;;;;;;;cAU5C;;qBACU,YAAY;EA2CnB,YAAA,QAAQ,uBAAuB,UAAS;MA6BhD,YAAY;MAoBZ,WAAW;MAwCX,QAAQ;MAcR,YAAY;MAIZ,WAAW;MAQX,eAAe;MAQf,WAAW;MAQX,kBAAkB;MAOlB,cAAc;MAQd,kBAAkB;MAQlB,aAAa;MAQb,WAAW;MAQX,aAAa;MAIb,UAAU;MASV,UAAU;MASV,YAAY;MASZ,YAAY;MASZ,aAAa;MASb,qBAAqB;MAQrB,oBAAoB;MAapB,WAAW;MAIX,eAAe;MAQf,eAAe;MAOf,sBAAsB;MAMtB,cAAc;MAId,UAAU;MAQV,OAAO;;;;;YAQD,4BAA4B"}
1
+ {"version":3,"file":"core-client.d.ts","names":[],"sources":["../src/core-client.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4EY,8BAA8B,KAAK;UAErC;EACN,aAAa;EACb,eAAe;EACf,OAAO,kBAAkB;EACzB,WAAW;;;;;EAKX;;;;;;;EAOA,aAAa;;;;;;EAMb,iBAAiB;;KAGhB;;EAGK,SAAS;EACT;EACA;;EAGA;;;;;;EAMA,kBAAkB;;;;;EAKlB,cAAc;;;KAIZ,4BAA4B,8BAA8B;;KAG1D,wBAAwB;UAc1B;EACN,YAAY;EACZ,UAAU;EACV,aAAa;EACb,aAAa;;UAGP;EACN,cAAc,SAAS,8BAA8B;;;;;;;;;cAqC5C;;qBACU,YAAY;EA2CnB,YAAA,QAAQ,uBAAuB,UAAS;MAyBhD,YAAY;MAoBZ,WAAW;MAwCX,QAAQ;MAcR,YAAY;MAIZ,WAAW;MAQX,eAAe;MAQf,WAAW;MAQX,kBAAkB;MAOlB,cAAc;MAQd,kBAAkB;MAQlB,aAAa;MAQb,WAAW;MAQX,aAAa;MAIb,UAAU;MASV,UAAU;MASV,YAAY;MASZ,YAAY;MASZ,aAAa;MASb,qBAAqB;MAQrB,oBAAoB;MAapB,WAAW;MAIX,eAAe;MAQf,eAAe;MAOf,sBAAsB;MAMtB,cAAc;MAId,UAAU;MAQV,OAAO;;;;;YAQD,4BAA4B"}
@@ -1,5 +1,6 @@
1
1
  import { ConfigurationError } from "./shared/errors.js";
2
2
  import { createApiKeyEd25519AuthHeaders, createTransports } from "./shared/transports.js";
3
+ import { parsePolyesterEnvironment } from "./environment.js";
3
4
  import { AccountsService } from "./services/accounts/accounts.js";
4
5
  import { ApiKeysService } from "./services/api-keys/api-keys.js";
5
6
  import { AuthService } from "./services/auth/auth.js";
@@ -52,6 +53,24 @@ function realtimeAuthFromProvider(auth) {
52
53
  hasAuth: () => true
53
54
  };
54
55
  }
56
+ /** Preserves the exclusive catalog configuration while projecting client config fields. */
57
+ function pickPolyesterCatalogConfig(config) {
58
+ return config.catalog === void 0 ? {
59
+ catalogSnapshot: config.catalogSnapshot,
60
+ catalogCell: config.catalogCell
61
+ } : { catalog: config.catalog };
62
+ }
63
+ /**
64
+ * Parses the configuration shared by every public client constructor.
65
+ */
66
+ function parsePolyesterClientConfig(config) {
67
+ if (typeof config !== "object" || config === null || Array.isArray(config)) throw new ConfigurationError("Client configuration must be an object.");
68
+ const environment = parsePolyesterEnvironment(config.environment);
69
+ if (config.wireFormat !== void 0 && config.wireFormat !== "binary" && config.wireFormat !== "json") throw new ConfigurationError("wireFormat must be either \"binary\" or \"json\".");
70
+ if (config.catalog && config.catalogSnapshot) throw new ConfigurationError("Provide either catalog or catalogSnapshot, not both.");
71
+ if (config.catalog && config.catalogCell) throw new ConfigurationError("Provide either catalog or catalogCell, not both.");
72
+ return Object.assign({}, config, { environment });
73
+ }
55
74
  /**
56
75
  * Base SDK client that wires transports, realtime, catalogs, and all public service clients for a Polyester environment.
57
76
  *
@@ -100,10 +119,9 @@ var PolyesterClient = class {
100
119
  #zipper;
101
120
  #mfa;
102
121
  constructor(config, runtime = {}) {
122
+ config = parsePolyesterClientConfig(config);
103
123
  const interceptors = config.interceptors ?? [];
104
124
  const { environment } = config;
105
- if (config.catalog && config.catalogSnapshot) throw new ConfigurationError("Provide either catalog or catalogSnapshot, not both.");
106
- if (config.catalog && config.catalogCell) throw new ConfigurationError("Provide either catalog or catalogCell, not both.");
107
125
  this.transports = config.transports ?? createTransports({
108
126
  apiUrl: environment.apiUrl,
109
127
  interceptors,
@@ -261,6 +279,6 @@ var PolyesterClient = class {
261
279
  createSubaccountResolver() {}
262
280
  };
263
281
  //#endregion
264
- export { PolyesterClient };
282
+ export { PolyesterClient, parsePolyesterClientConfig, pickPolyesterCatalogConfig };
265
283
 
266
284
  //# sourceMappingURL=core-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"core-client.js","names":["#environment","#authProvider","#realtimeConfig","#configRealtimeClient","#configCatalog","#configCatalogSnapshot","#configCatalogCell","#createAuth","#realtime","#catalog","#getScales","#scales","#resolverInitialized","#resolver","#auth","#accounts","#apiKeys","#getResolver","#subaccounts","#candles","#chainAnalytics","#marketData","#marketOverview","#orderbook","#heatmap","#lifecycle","#trades","#orders","#triggers","#balances","#transfers","#internalTransfers","#tradingWithdraws","#deposit","#addressBook","#guardSigner","#socialVerification","#whiteboard","#zipper","#mfa"],"sources":["../src/core-client.ts"],"sourcesContent":["import type { Interceptor } from \"@connectrpc/connect\";\nimport { ConfigurationError } from \"./shared/errors.js\";\nimport {\n createApiKeyEd25519AuthHeaders,\n createTransports,\n type Transports,\n type JwtAuthProvider,\n type ApiKeyEd25519AuthProvider,\n} from \"./shared/transports.js\";\nimport type { PolyesterEnvironment } from \"./environment.js\";\nimport { AccountsService } from \"./services/accounts/index.js\";\nimport { ApiKeysService } from \"./services/api-keys/index.js\";\nimport { AuthService, type AuthServiceTransports } from \"./services/auth/auth.js\";\nimport { SubaccountsService } from \"./services/subaccounts/index.js\";\nimport { CandlesService } from \"./services/candles/index.js\";\nimport { ChainAnalyticsService } from \"./services/chain-analytics/index.js\";\nimport { MarketDataService } from \"./services/market-data/index.js\";\nimport { MarketOverviewService } from \"./services/market-overview/index.js\";\nimport { OrderbookService } from \"./services/orderbook/index.js\";\nimport { HeatmapService } from \"./services/heatmap/index.js\";\nimport { LifecycleService } from \"./services/lifecycle/index.js\";\nimport { TradesService } from \"./services/trades/index.js\";\nimport { OrdersService } from \"./services/orders/index.js\";\nimport { TriggersService } from \"./services/triggers/index.js\";\nimport { BalancesService } from \"./services/balances/index.js\";\nimport { TransfersService } from \"./services/transfers/index.js\";\nimport { InternalTransfersService } from \"./services/internal-transfers/index.js\";\nimport { TradingWithdrawsService } from \"./services/trading-withdraws/index.js\";\nimport { DepositService } from \"./services/deposit/index.js\";\nimport { AddressBookService } from \"./services/address-book/index.js\";\nimport { GuardSignerService } from \"./services/guard-signer/index.js\";\nimport { SocialVerificationService } from \"./services/social-verification/index.js\";\nimport { WhiteboardService } from \"./services/whiteboard/index.js\";\nimport { ZipperService } from \"./services/zipper/index.js\";\nimport { MfaService } from \"./services/mfa/index.js\";\nimport type { SubaccountResolver } from \"./services/subaccount-resolver.js\";\nimport {\n createPolyesterCatalog,\n type CatalogSnapshot,\n type CatalogSnapshotCell,\n type ClientCatalog,\n} from \"./catalogs/index.js\";\nimport { createCatalogSdkScales, type SdkScales } from \"./shared/decimal-surface.js\";\nimport { RealtimeClient, type PolyesterRealtime, type RealtimeConfig } from \"./realtime/index.js\";\n\nfunction realtimeAuthFromProvider(\n auth: JwtAuthProvider | ApiKeyEd25519AuthProvider | undefined,\n): Pick<RealtimeConfig, \"getAuthHeaders\" | \"hasAuth\"> {\n if (!auth) return {};\n if (auth.kind === \"jwt\") {\n return {\n getAuthHeaders: async () => {\n const token = await auth.getToken();\n const headers: Record<string, string> = {};\n if (token) headers.authorization = `Bearer ${token}`;\n return headers;\n },\n hasAuth: () => {\n // Only token getters that resolve synchronously can be checked here;\n // async getters are assumed authenticated and fail at token fetch.\n const token = auth.getToken();\n if (token instanceof Promise) return true;\n return typeof token === \"string\" && token.length > 0;\n },\n };\n }\n return {\n getAuthHeaders: (request) =>\n createApiKeyEd25519AuthHeaders(auth, {\n url: request.url,\n method: request.method,\n }),\n hasAuth: () => true,\n };\n}\n\nexport type PolyesterRealtimeAuthConfig = Pick<RealtimeConfig, \"getAuthHeaders\" | \"hasAuth\">;\n\nexport interface PolyesterClientBaseConfig {\n environment: PolyesterEnvironment;\n interceptors?: Interceptor[];\n auth?: JwtAuthProvider | ApiKeyEd25519AuthProvider;\n realtime?: PolyesterRealtimeAuthConfig;\n /**\n * Connect wire format. Defaults to binary for production performance.\n * Use `json` for human-readable debugging.\n */\n wireFormat?: \"binary\" | \"json\";\n /**\n * Client-owned catalog store. Advanced callers can inject a fully managed catalog instance.\n */\n catalog?: ClientCatalog;\n /**\n * Explicit initial catalog snapshot, commonly hydrated from server-rendered data.\n * Combines with `catalogCell` as the cell's initial value (never clobbers a\n * pre-populated cell).\n */\n catalogSnapshot?: CatalogSnapshot;\n /**\n * External snapshot storage for the client-built catalog (mutually exclusive with\n * `catalog`). A cell backed by a reactive source makes every catalog read reactive.\n */\n catalogCell?: CatalogSnapshotCell;\n /**\n * Advanced: inject pre-built Connect transports (in-memory mocks, custom\n * stacks). When provided, the SDK does not build its own transports and the\n * built-in auth/error-mapping interceptors are NOT applied — the injected\n * transports own their full interceptor chain.\n */\n transports?: Transports;\n /**\n * Advanced: inject a realtime implementation (in-memory mocks, custom\n * stacks). When provided, the SDK skips constructing its Centrifuge-backed\n * realtime client and the `realtime` auth config is ignored.\n */\n realtimeClient?: PolyesterRealtime;\n}\n\nexport interface PolyesterClientConfig extends PolyesterClientBaseConfig {}\n\ninterface AuthServiceFactoryContext {\n transports: AuthServiceTransports;\n realtime: PolyesterRealtime;\n subaccounts: SubaccountsService;\n environment: PolyesterEnvironment;\n}\n\ninterface PolyesterClientRuntimeConfig {\n createAuth?: (context: AuthServiceFactoryContext) => AuthService;\n}\n\n/**\n * Base SDK client that wires transports, realtime, catalogs, and all public service clients for a Polyester environment.\n *\n * Services are constructed lazily on first property access (and memoized) so\n * that creating a client — which happens for every SSR request in server\n * hooks — only pays for the services the caller actually touches.\n */\nexport class PolyesterClient {\n protected readonly transports: Transports;\n\n readonly #environment: PolyesterEnvironment;\n readonly #authProvider: JwtAuthProvider | ApiKeyEd25519AuthProvider | undefined;\n readonly #realtimeConfig: PolyesterRealtimeAuthConfig | undefined;\n readonly #configRealtimeClient: PolyesterRealtime | undefined;\n readonly #configCatalog: ClientCatalog | undefined;\n readonly #configCatalogSnapshot: CatalogSnapshot | undefined;\n readonly #configCatalogCell: CatalogSnapshotCell | undefined;\n readonly #createAuth: PolyesterClientRuntimeConfig[\"createAuth\"];\n\n #realtime: PolyesterRealtime | undefined;\n #catalog: ClientCatalog | undefined;\n #scales: SdkScales | undefined;\n #resolver: SubaccountResolver | undefined;\n #resolverInitialized = false;\n\n #auth: AuthService | undefined;\n #accounts: AccountsService | undefined;\n #apiKeys: ApiKeysService | undefined;\n #subaccounts: SubaccountsService | undefined;\n #candles: CandlesService | undefined;\n #chainAnalytics: ChainAnalyticsService | undefined;\n #marketData: MarketDataService | undefined;\n #marketOverview: MarketOverviewService | undefined;\n #orderbook: OrderbookService | undefined;\n #heatmap: HeatmapService | undefined;\n #lifecycle: LifecycleService | undefined;\n #trades: TradesService | undefined;\n #orders: OrdersService | undefined;\n #triggers: TriggersService | undefined;\n #balances: BalancesService | undefined;\n #transfers: TransfersService | undefined;\n #internalTransfers: InternalTransfersService | undefined;\n #tradingWithdraws: TradingWithdrawsService | undefined;\n #deposit: DepositService | undefined;\n #addressBook: AddressBookService | undefined;\n #guardSigner: GuardSignerService | undefined;\n #socialVerification: SocialVerificationService | undefined;\n #whiteboard: WhiteboardService | undefined;\n #zipper: ZipperService | undefined;\n #mfa: MfaService | undefined;\n\n constructor(config: PolyesterClientConfig, runtime: PolyesterClientRuntimeConfig = {}) {\n const interceptors = config.interceptors ?? [];\n const { environment } = config;\n if (config.catalog && config.catalogSnapshot) {\n throw new ConfigurationError(\"Provide either catalog or catalogSnapshot, not both.\");\n }\n if (config.catalog && config.catalogCell) {\n throw new ConfigurationError(\"Provide either catalog or catalogCell, not both.\");\n }\n\n this.transports =\n config.transports ??\n createTransports({\n apiUrl: environment.apiUrl,\n interceptors,\n auth: config.auth,\n wireFormat: config.wireFormat,\n });\n\n this.#environment = environment;\n this.#authProvider = config.auth;\n this.#realtimeConfig = config.realtime;\n this.#configRealtimeClient = config.realtimeClient;\n this.#configCatalog = config.catalog;\n this.#configCatalogSnapshot = config.catalogSnapshot;\n this.#configCatalogCell = config.catalogCell;\n this.#createAuth = runtime.createAuth;\n }\n\n get realtime(): PolyesterRealtime {\n if (!this.#realtime) {\n if (this.#configRealtimeClient) {\n this.#realtime = this.#configRealtimeClient;\n } else {\n const environment = this.#environment;\n const realtimeAuth = realtimeAuthFromProvider(this.#authProvider);\n this.#realtime = new RealtimeClient({\n wsUrl: environment.websocketUrl,\n tokenEndpoint: `${environment.apiUrl}/v1/rt/token`,\n subscribeEndpoint: `${environment.apiUrl}/v1/rt/subscribe`,\n getAuthHeaders:\n this.#realtimeConfig?.getAuthHeaders ?? realtimeAuth.getAuthHeaders,\n hasAuth: this.#realtimeConfig?.hasAuth ?? realtimeAuth.hasAuth,\n });\n }\n }\n return this.#realtime;\n }\n\n get catalog(): ClientCatalog {\n if (!this.#catalog) {\n if (this.#configCatalog) {\n this.#catalog = this.#configCatalog;\n } else {\n const catalogRefreshMarketData = new MarketDataService(\n this.transports.publicApi,\n this.realtime,\n this.#getScales(),\n );\n const catalogRefreshZipper = new ZipperService(this.transports.publicApi);\n this.#catalog = createPolyesterCatalog({\n snapshot: this.#configCatalogSnapshot,\n cell: this.#configCatalogCell,\n refresh: {\n market: () => catalogRefreshMarketData.getSpotConfig(),\n zipper: () => catalogRefreshZipper.getDepositWithdrawConfig(),\n },\n });\n }\n }\n return this.#catalog;\n }\n\n #getScales(): SdkScales {\n // Lazy catalog binding: the resolver only dereferences `this.catalog` at\n // call time. getSpotConfig() (the catalog's own refresh source) never\n // awaits scale readiness.\n this.#scales ??= createCatalogSdkScales(() => this.catalog);\n return this.#scales;\n }\n\n #getResolver(): SubaccountResolver | undefined {\n if (!this.#resolverInitialized) {\n this.#resolverInitialized = true;\n this.#resolver = this.createSubaccountResolver();\n }\n return this.#resolver;\n }\n\n get auth(): AuthService {\n if (!this.#auth) {\n const { authApi, publicApi } = this.transports;\n this.#auth =\n this.#createAuth?.({\n transports: { publicApi, authApi },\n realtime: this.realtime,\n subaccounts: this.subaccounts,\n environment: this.#environment,\n }) ?? new AuthService({ publicApi, authApi }, this.realtime);\n }\n return this.#auth;\n }\n\n get accounts(): AccountsService {\n return (this.#accounts ??= new AccountsService(this.transports.authApi));\n }\n\n get apiKeys(): ApiKeysService {\n return (this.#apiKeys ??= new ApiKeysService(\n this.transports.authApi,\n this.realtime,\n this.#getResolver(),\n ));\n }\n\n get subaccounts(): SubaccountsService {\n return (this.#subaccounts ??= new SubaccountsService(\n this.transports.authApi,\n this.realtime,\n this.#getResolver(),\n ));\n }\n\n get candles(): CandlesService {\n return (this.#candles ??= new CandlesService(\n this.transports.publicApi,\n this.realtime,\n this.#getScales(),\n ));\n }\n\n get chainAnalytics(): ChainAnalyticsService {\n return (this.#chainAnalytics ??= new ChainAnalyticsService(\n this.transports.publicApi,\n this.#getScales(),\n ));\n }\n\n get marketData(): MarketDataService {\n return (this.#marketData ??= new MarketDataService(\n this.transports.publicApi,\n this.realtime,\n this.#getScales(),\n ));\n }\n\n get marketOverview(): MarketOverviewService {\n return (this.#marketOverview ??= new MarketOverviewService(\n this.transports.publicApi,\n this.realtime,\n this.#getScales(),\n ));\n }\n\n get orderbook(): OrderbookService {\n return (this.#orderbook ??= new OrderbookService(\n this.transports.publicApi,\n this.realtime,\n this.#getScales(),\n ));\n }\n\n get heatmap(): HeatmapService {\n return (this.#heatmap ??= new HeatmapService(\n this.transports.publicApi,\n this.realtime,\n this.#getScales(),\n ));\n }\n\n get lifecycle(): LifecycleService {\n return (this.#lifecycle ??= new LifecycleService(this.transports.publicApi, this.realtime));\n }\n\n get trades(): TradesService {\n return (this.#trades ??= new TradesService(\n this.transports.authApi,\n this.realtime,\n this.#getResolver(),\n this.#getScales(),\n ));\n }\n\n get orders(): OrdersService {\n return (this.#orders ??= new OrdersService(\n this.transports.authApi,\n this.realtime,\n this.#getResolver(),\n this.#getScales(),\n ));\n }\n\n get triggers(): TriggersService {\n return (this.#triggers ??= new TriggersService(\n this.transports.authApi,\n this.realtime,\n this.#getResolver(),\n this.#getScales(),\n ));\n }\n\n get balances(): BalancesService {\n return (this.#balances ??= new BalancesService(\n this.transports.authApi,\n this.realtime,\n this.#getResolver(),\n this.#getScales(),\n ));\n }\n\n get transfers(): TransfersService {\n return (this.#transfers ??= new TransfersService(\n this.transports.authApi,\n this.realtime,\n this.#getResolver(),\n this.#getScales(),\n ));\n }\n\n get internalTransfers(): InternalTransfersService {\n return (this.#internalTransfers ??= new InternalTransfersService(\n this.transports.authApi,\n this.#getResolver(),\n this.#getScales(),\n ));\n }\n\n get tradingWithdraws(): TradingWithdrawsService {\n return (this.#tradingWithdraws ??= new TradingWithdrawsService(\n this.transports.authApi,\n this.#getResolver(),\n {\n chainId: this.#environment.chain.id,\n tradingGatewayAddress: this.#environment.contracts.tradingGatewayAddress,\n },\n this.#getScales(),\n this.catalog,\n ));\n }\n\n get deposit(): DepositService {\n return (this.#deposit ??= new DepositService(this.transports.authApi, this.#getResolver()));\n }\n\n get addressBook(): AddressBookService {\n return (this.#addressBook ??= new AddressBookService(\n this.transports.authApi,\n this.realtime,\n this.#getResolver(),\n ));\n }\n\n get guardSigner(): GuardSignerService {\n return (this.#guardSigner ??= new GuardSignerService(\n this.transports.authApi,\n this.#getResolver(),\n ));\n }\n\n get socialVerification(): SocialVerificationService {\n return (this.#socialVerification ??= new SocialVerificationService(\n this.transports.authApi,\n ));\n }\n\n get whiteboard(): WhiteboardService {\n return (this.#whiteboard ??= new WhiteboardService(this.transports.authApi));\n }\n\n get zipper(): ZipperService {\n return (this.#zipper ??= new ZipperService(\n this.transports.publicApi,\n this.realtime,\n this.#getScales(),\n ));\n }\n\n get mfa(): MfaService {\n return (this.#mfa ??= new MfaService(this.transports.authApi));\n }\n\n /**\n * Override in subclasses to provide a subaccount resolver.\n * The resolver is called lazily when service methods are invoked.\n */\n protected createSubaccountResolver(): SubaccountResolver | undefined {\n return undefined;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"core-client.js","names":["#environment","#authProvider","#realtimeConfig","#configRealtimeClient","#configCatalog","#configCatalogSnapshot","#configCatalogCell","#createAuth","#realtime","#catalog","#getScales","#scales","#resolverInitialized","#resolver","#auth","#accounts","#apiKeys","#getResolver","#subaccounts","#candles","#chainAnalytics","#marketData","#marketOverview","#orderbook","#heatmap","#lifecycle","#trades","#orders","#triggers","#balances","#transfers","#internalTransfers","#tradingWithdraws","#deposit","#addressBook","#guardSigner","#socialVerification","#whiteboard","#zipper","#mfa"],"sources":["../src/core-client.ts"],"sourcesContent":["import type { Interceptor } from \"@connectrpc/connect\";\nimport { ConfigurationError } from \"./shared/errors.js\";\nimport {\n createApiKeyEd25519AuthHeaders,\n createTransports,\n type Transports,\n type JwtAuthProvider,\n type ApiKeyEd25519AuthProvider,\n} from \"./shared/transports.js\";\nimport { parsePolyesterEnvironment, type PolyesterEnvironment } from \"./environment.js\";\nimport { AccountsService } from \"./services/accounts/index.js\";\nimport { ApiKeysService } from \"./services/api-keys/index.js\";\nimport { AuthService, type AuthServiceTransports } from \"./services/auth/auth.js\";\nimport { SubaccountsService } from \"./services/subaccounts/index.js\";\nimport { CandlesService } from \"./services/candles/index.js\";\nimport { ChainAnalyticsService } from \"./services/chain-analytics/index.js\";\nimport { MarketDataService } from \"./services/market-data/index.js\";\nimport { MarketOverviewService } from \"./services/market-overview/index.js\";\nimport { OrderbookService } from \"./services/orderbook/index.js\";\nimport { HeatmapService } from \"./services/heatmap/index.js\";\nimport { LifecycleService } from \"./services/lifecycle/index.js\";\nimport { TradesService } from \"./services/trades/index.js\";\nimport { OrdersService } from \"./services/orders/index.js\";\nimport { TriggersService } from \"./services/triggers/index.js\";\nimport { BalancesService } from \"./services/balances/index.js\";\nimport { TransfersService } from \"./services/transfers/index.js\";\nimport { InternalTransfersService } from \"./services/internal-transfers/index.js\";\nimport { TradingWithdrawsService } from \"./services/trading-withdraws/index.js\";\nimport { DepositService } from \"./services/deposit/index.js\";\nimport { AddressBookService } from \"./services/address-book/index.js\";\nimport { GuardSignerService } from \"./services/guard-signer/index.js\";\nimport { SocialVerificationService } from \"./services/social-verification/index.js\";\nimport { WhiteboardService } from \"./services/whiteboard/index.js\";\nimport { ZipperService } from \"./services/zipper/index.js\";\nimport { MfaService } from \"./services/mfa/index.js\";\nimport type { SubaccountResolver } from \"./services/subaccount-resolver.js\";\nimport {\n createPolyesterCatalog,\n type CatalogSnapshot,\n type CatalogSnapshotCell,\n type ClientCatalog,\n} from \"./catalogs/index.js\";\nimport { createCatalogSdkScales, type SdkScales } from \"./shared/decimal-surface.js\";\nimport { RealtimeClient, type PolyesterRealtime, type RealtimeConfig } from \"./realtime/index.js\";\n\nfunction realtimeAuthFromProvider(\n auth: JwtAuthProvider | ApiKeyEd25519AuthProvider | undefined,\n): Pick<RealtimeConfig, \"getAuthHeaders\" | \"hasAuth\"> {\n if (!auth) return {};\n if (auth.kind === \"jwt\") {\n return {\n getAuthHeaders: async () => {\n const token = await auth.getToken();\n const headers: Record<string, string> = {};\n if (token) headers.authorization = `Bearer ${token}`;\n return headers;\n },\n hasAuth: () => {\n // Only token getters that resolve synchronously can be checked here;\n // async getters are assumed authenticated and fail at token fetch.\n const token = auth.getToken();\n if (token instanceof Promise) return true;\n return typeof token === \"string\" && token.length > 0;\n },\n };\n }\n return {\n getAuthHeaders: (request) =>\n createApiKeyEd25519AuthHeaders(auth, {\n url: request.url,\n method: request.method,\n }),\n hasAuth: () => true,\n };\n}\n\nexport type PolyesterRealtimeAuthConfig = Pick<RealtimeConfig, \"getAuthHeaders\" | \"hasAuth\">;\n\ninterface PolyesterClientCommonConfig {\n environment: PolyesterEnvironment;\n interceptors?: Interceptor[];\n auth?: JwtAuthProvider | ApiKeyEd25519AuthProvider;\n realtime?: PolyesterRealtimeAuthConfig;\n /**\n * Connect wire format. Defaults to binary for production performance.\n * Use `json` for human-readable debugging.\n */\n wireFormat?: \"binary\" | \"json\";\n /**\n * Advanced: inject pre-built Connect transports (in-memory mocks, custom\n * stacks). When provided, the SDK does not build its own transports and the\n * built-in auth/error-mapping interceptors are NOT applied — the injected\n * transports own their full interceptor chain.\n */\n transports?: Transports;\n /**\n * Advanced: inject a realtime implementation (in-memory mocks, custom\n * stacks). When provided, the SDK skips constructing its Centrifuge-backed\n * realtime client and the `realtime` auth config is ignored.\n */\n realtimeClient?: PolyesterRealtime;\n}\n\ntype PolyesterCatalogConfig =\n | {\n /** Client-owned catalog store. */\n catalog: ClientCatalog;\n catalogSnapshot?: never;\n catalogCell?: never;\n }\n | {\n catalog?: never;\n /**\n * Explicit initial catalog snapshot, commonly hydrated from server-rendered data.\n * Combines with `catalogCell` as the cell's initial value without clobbering a\n * pre-populated cell.\n */\n catalogSnapshot?: CatalogSnapshot;\n /**\n * External snapshot storage for the client-built catalog. A cell backed by a\n * reactive source makes every catalog read reactive.\n */\n catalogCell?: CatalogSnapshotCell;\n };\n\n/** Configuration shared by every Polyester client. */\nexport type PolyesterClientBaseConfig = PolyesterClientCommonConfig & PolyesterCatalogConfig;\n\n/** Configuration for the base Polyester client. */\nexport type PolyesterClientConfig = PolyesterClientBaseConfig;\n\n/** Preserves the exclusive catalog configuration while projecting client config fields. */\nexport function pickPolyesterCatalogConfig(\n config: PolyesterClientBaseConfig,\n): PolyesterCatalogConfig {\n return config.catalog === undefined\n ? {\n catalogSnapshot: config.catalogSnapshot,\n catalogCell: config.catalogCell,\n }\n : { catalog: config.catalog };\n}\n\ninterface AuthServiceFactoryContext {\n transports: AuthServiceTransports;\n realtime: PolyesterRealtime;\n subaccounts: SubaccountsService;\n environment: PolyesterEnvironment;\n}\n\ninterface PolyesterClientRuntimeConfig {\n createAuth?: (context: AuthServiceFactoryContext) => AuthService;\n}\n\n/**\n * Parses the configuration shared by every public client constructor.\n */\nexport function parsePolyesterClientConfig<TConfig extends PolyesterClientBaseConfig>(\n config: TConfig,\n): TConfig {\n if (typeof config !== \"object\" || config === null || Array.isArray(config)) {\n throw new ConfigurationError(\"Client configuration must be an object.\");\n }\n const environment = parsePolyesterEnvironment(config.environment);\n if (\n config.wireFormat !== undefined &&\n config.wireFormat !== \"binary\" &&\n config.wireFormat !== \"json\"\n ) {\n throw new ConfigurationError('wireFormat must be either \"binary\" or \"json\".');\n }\n if (config.catalog && config.catalogSnapshot) {\n throw new ConfigurationError(\"Provide either catalog or catalogSnapshot, not both.\");\n }\n if (config.catalog && config.catalogCell) {\n throw new ConfigurationError(\"Provide either catalog or catalogCell, not both.\");\n }\n\n return Object.assign({}, config, { environment });\n}\n\n/**\n * Base SDK client that wires transports, realtime, catalogs, and all public service clients for a Polyester environment.\n *\n * Services are constructed lazily on first property access (and memoized) so\n * that creating a client — which happens for every SSR request in server\n * hooks — only pays for the services the caller actually touches.\n */\nexport class PolyesterClient {\n protected readonly transports: Transports;\n\n readonly #environment: PolyesterEnvironment;\n readonly #authProvider: JwtAuthProvider | ApiKeyEd25519AuthProvider | undefined;\n readonly #realtimeConfig: PolyesterRealtimeAuthConfig | undefined;\n readonly #configRealtimeClient: PolyesterRealtime | undefined;\n readonly #configCatalog: ClientCatalog | undefined;\n readonly #configCatalogSnapshot: CatalogSnapshot | undefined;\n readonly #configCatalogCell: CatalogSnapshotCell | undefined;\n readonly #createAuth: PolyesterClientRuntimeConfig[\"createAuth\"];\n\n #realtime: PolyesterRealtime | undefined;\n #catalog: ClientCatalog | undefined;\n #scales: SdkScales | undefined;\n #resolver: SubaccountResolver | undefined;\n #resolverInitialized = false;\n\n #auth: AuthService | undefined;\n #accounts: AccountsService | undefined;\n #apiKeys: ApiKeysService | undefined;\n #subaccounts: SubaccountsService | undefined;\n #candles: CandlesService | undefined;\n #chainAnalytics: ChainAnalyticsService | undefined;\n #marketData: MarketDataService | undefined;\n #marketOverview: MarketOverviewService | undefined;\n #orderbook: OrderbookService | undefined;\n #heatmap: HeatmapService | undefined;\n #lifecycle: LifecycleService | undefined;\n #trades: TradesService | undefined;\n #orders: OrdersService | undefined;\n #triggers: TriggersService | undefined;\n #balances: BalancesService | undefined;\n #transfers: TransfersService | undefined;\n #internalTransfers: InternalTransfersService | undefined;\n #tradingWithdraws: TradingWithdrawsService | undefined;\n #deposit: DepositService | undefined;\n #addressBook: AddressBookService | undefined;\n #guardSigner: GuardSignerService | undefined;\n #socialVerification: SocialVerificationService | undefined;\n #whiteboard: WhiteboardService | undefined;\n #zipper: ZipperService | undefined;\n #mfa: MfaService | undefined;\n\n constructor(config: PolyesterClientConfig, runtime: PolyesterClientRuntimeConfig = {}) {\n const parsedConfig = parsePolyesterClientConfig(config);\n config = parsedConfig;\n const interceptors = config.interceptors ?? [];\n const { environment } = config;\n\n this.transports =\n config.transports ??\n createTransports({\n apiUrl: environment.apiUrl,\n interceptors,\n auth: config.auth,\n wireFormat: config.wireFormat,\n });\n\n this.#environment = environment;\n this.#authProvider = config.auth;\n this.#realtimeConfig = config.realtime;\n this.#configRealtimeClient = config.realtimeClient;\n this.#configCatalog = config.catalog;\n this.#configCatalogSnapshot = config.catalogSnapshot;\n this.#configCatalogCell = config.catalogCell;\n this.#createAuth = runtime.createAuth;\n }\n\n get realtime(): PolyesterRealtime {\n if (!this.#realtime) {\n if (this.#configRealtimeClient) {\n this.#realtime = this.#configRealtimeClient;\n } else {\n const environment = this.#environment;\n const realtimeAuth = realtimeAuthFromProvider(this.#authProvider);\n this.#realtime = new RealtimeClient({\n wsUrl: environment.websocketUrl,\n tokenEndpoint: `${environment.apiUrl}/v1/rt/token`,\n subscribeEndpoint: `${environment.apiUrl}/v1/rt/subscribe`,\n getAuthHeaders:\n this.#realtimeConfig?.getAuthHeaders ?? realtimeAuth.getAuthHeaders,\n hasAuth: this.#realtimeConfig?.hasAuth ?? realtimeAuth.hasAuth,\n });\n }\n }\n return this.#realtime;\n }\n\n get catalog(): ClientCatalog {\n if (!this.#catalog) {\n if (this.#configCatalog) {\n this.#catalog = this.#configCatalog;\n } else {\n const catalogRefreshMarketData = new MarketDataService(\n this.transports.publicApi,\n this.realtime,\n this.#getScales(),\n );\n const catalogRefreshZipper = new ZipperService(this.transports.publicApi);\n this.#catalog = createPolyesterCatalog({\n snapshot: this.#configCatalogSnapshot,\n cell: this.#configCatalogCell,\n refresh: {\n market: () => catalogRefreshMarketData.getSpotConfig(),\n zipper: () => catalogRefreshZipper.getDepositWithdrawConfig(),\n },\n });\n }\n }\n return this.#catalog;\n }\n\n #getScales(): SdkScales {\n // Lazy catalog binding: the resolver only dereferences `this.catalog` at\n // call time. getSpotConfig() (the catalog's own refresh source) never\n // awaits scale readiness.\n this.#scales ??= createCatalogSdkScales(() => this.catalog);\n return this.#scales;\n }\n\n #getResolver(): SubaccountResolver | undefined {\n if (!this.#resolverInitialized) {\n this.#resolverInitialized = true;\n this.#resolver = this.createSubaccountResolver();\n }\n return this.#resolver;\n }\n\n get auth(): AuthService {\n if (!this.#auth) {\n const { authApi, publicApi } = this.transports;\n this.#auth =\n this.#createAuth?.({\n transports: { publicApi, authApi },\n realtime: this.realtime,\n subaccounts: this.subaccounts,\n environment: this.#environment,\n }) ?? new AuthService({ publicApi, authApi }, this.realtime);\n }\n return this.#auth;\n }\n\n get accounts(): AccountsService {\n return (this.#accounts ??= new AccountsService(this.transports.authApi));\n }\n\n get apiKeys(): ApiKeysService {\n return (this.#apiKeys ??= new ApiKeysService(\n this.transports.authApi,\n this.realtime,\n this.#getResolver(),\n ));\n }\n\n get subaccounts(): SubaccountsService {\n return (this.#subaccounts ??= new SubaccountsService(\n this.transports.authApi,\n this.realtime,\n this.#getResolver(),\n ));\n }\n\n get candles(): CandlesService {\n return (this.#candles ??= new CandlesService(\n this.transports.publicApi,\n this.realtime,\n this.#getScales(),\n ));\n }\n\n get chainAnalytics(): ChainAnalyticsService {\n return (this.#chainAnalytics ??= new ChainAnalyticsService(\n this.transports.publicApi,\n this.#getScales(),\n ));\n }\n\n get marketData(): MarketDataService {\n return (this.#marketData ??= new MarketDataService(\n this.transports.publicApi,\n this.realtime,\n this.#getScales(),\n ));\n }\n\n get marketOverview(): MarketOverviewService {\n return (this.#marketOverview ??= new MarketOverviewService(\n this.transports.publicApi,\n this.realtime,\n this.#getScales(),\n ));\n }\n\n get orderbook(): OrderbookService {\n return (this.#orderbook ??= new OrderbookService(\n this.transports.publicApi,\n this.realtime,\n this.#getScales(),\n ));\n }\n\n get heatmap(): HeatmapService {\n return (this.#heatmap ??= new HeatmapService(\n this.transports.publicApi,\n this.realtime,\n this.#getScales(),\n ));\n }\n\n get lifecycle(): LifecycleService {\n return (this.#lifecycle ??= new LifecycleService(this.transports.publicApi, this.realtime));\n }\n\n get trades(): TradesService {\n return (this.#trades ??= new TradesService(\n this.transports.authApi,\n this.realtime,\n this.#getResolver(),\n this.#getScales(),\n ));\n }\n\n get orders(): OrdersService {\n return (this.#orders ??= new OrdersService(\n this.transports.authApi,\n this.realtime,\n this.#getResolver(),\n this.#getScales(),\n ));\n }\n\n get triggers(): TriggersService {\n return (this.#triggers ??= new TriggersService(\n this.transports.authApi,\n this.realtime,\n this.#getResolver(),\n this.#getScales(),\n ));\n }\n\n get balances(): BalancesService {\n return (this.#balances ??= new BalancesService(\n this.transports.authApi,\n this.realtime,\n this.#getResolver(),\n this.#getScales(),\n ));\n }\n\n get transfers(): TransfersService {\n return (this.#transfers ??= new TransfersService(\n this.transports.authApi,\n this.realtime,\n this.#getResolver(),\n this.#getScales(),\n ));\n }\n\n get internalTransfers(): InternalTransfersService {\n return (this.#internalTransfers ??= new InternalTransfersService(\n this.transports.authApi,\n this.#getResolver(),\n this.#getScales(),\n ));\n }\n\n get tradingWithdraws(): TradingWithdrawsService {\n return (this.#tradingWithdraws ??= new TradingWithdrawsService(\n this.transports.authApi,\n this.#getResolver(),\n {\n chainId: this.#environment.chain.id,\n tradingGatewayAddress: this.#environment.contracts.tradingGatewayAddress,\n },\n this.#getScales(),\n this.catalog,\n ));\n }\n\n get deposit(): DepositService {\n return (this.#deposit ??= new DepositService(this.transports.authApi, this.#getResolver()));\n }\n\n get addressBook(): AddressBookService {\n return (this.#addressBook ??= new AddressBookService(\n this.transports.authApi,\n this.realtime,\n this.#getResolver(),\n ));\n }\n\n get guardSigner(): GuardSignerService {\n return (this.#guardSigner ??= new GuardSignerService(\n this.transports.authApi,\n this.#getResolver(),\n ));\n }\n\n get socialVerification(): SocialVerificationService {\n return (this.#socialVerification ??= new SocialVerificationService(\n this.transports.authApi,\n ));\n }\n\n get whiteboard(): WhiteboardService {\n return (this.#whiteboard ??= new WhiteboardService(this.transports.authApi));\n }\n\n get zipper(): ZipperService {\n return (this.#zipper ??= new ZipperService(\n this.transports.publicApi,\n this.realtime,\n this.#getScales(),\n ));\n }\n\n get mfa(): MfaService {\n return (this.#mfa ??= new MfaService(this.transports.authApi));\n }\n\n /**\n * Override in subclasses to provide a subaccount resolver.\n * The resolver is called lazily when service methods are invoked.\n */\n protected createSubaccountResolver(): SubaccountResolver | undefined {\n return undefined;\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"environment.d.ts","names":[],"sources":["../src/environment.ts"],"mappings":";;;UAKiB;WACJ,SAAS;WACT;;UAGI;WACJ,SAAS;WACT,wBAAwB;WACxB,uBAAuB;WACvB,yBAAyB;WACzB,sBAAsB;WACtB,kBAAkB;WAClB,2BAA2B;;UAGvB;WACJ;WACA;WACA,YAAY;WACZ,MAAM;;UAGF;WACJ,uBAAuB;;UAGnB;WACJ;WACA;WACA;WACA;WACA;WACA,OAAO;WACP,oBAAoB;WACpB,WAAW;;UAGP;WACJ;WACA;WACA;WACA;WACA,OAAO;WACP;aACI;aACA;aACA,YAAY;aACZ,MAAM;;WAEV,WAAW;;;;;iBAiIR,2BACZ,QAAQ,mCACT;cA8CU,+BAA6B"}
1
+ {"version":3,"file":"environment.d.ts","names":[],"sources":["../src/environment.ts"],"mappings":";;;UAKiB;WACJ,SAAS;WACT;;UAGI;WACJ,SAAS;WACT,wBAAwB;WACxB,uBAAuB;WACvB,yBAAyB;WACzB,sBAAsB;WACtB,kBAAkB;WAClB,2BAA2B;;UAGvB;WACJ;WACA;WACA,YAAY;WACZ,MAAM;;UAGF;WACJ,uBAAuB;;UAGnB;WACJ;WACA;WACA;WACA;WACA;WACA,OAAO;WACP,oBAAoB;WACpB,WAAW;;UAGP;WACJ;WACA;WACA;WACA;WACA,OAAO;WACP;aACI;aACA;aACA,YAAY;aACZ,MAAM;;WAEV,WAAW;;;;;iBAmKR,2BACZ,QAAQ,mCACT;cAgEU,+BAA6B"}
@@ -7,6 +7,12 @@ const LOCAL_HOSTS = /* @__PURE__ */ new Set([
7
7
  "::1",
8
8
  "[::1]"
9
9
  ]);
10
+ function requireObject(value, label) {
11
+ if (typeof value !== "object" || value === null || Array.isArray(value)) throw new ConfigurationError(`${label} must be an object.`);
12
+ }
13
+ function requireNonEmptyString(value, label) {
14
+ if (typeof value !== "string" || value.trim().length === 0) throw new ConfigurationError(`${label} must be a non-empty string.`);
15
+ }
10
16
  function isLocalHost(hostname) {
11
17
  return LOCAL_HOSTS.has(hostname);
12
18
  }
@@ -27,6 +33,7 @@ function normalizeAddress(value, label) {
27
33
  return checksumEvmAddress(value);
28
34
  }
29
35
  function normalizeEntryPoint(entryPoint) {
36
+ requireObject(entryPoint, "accountAbstraction.entryPoint");
30
37
  if (entryPoint.version !== "0.7") throw new ConfigurationError("accountAbstraction.entryPoint.version must be 0.7.");
31
38
  return Object.freeze({
32
39
  address: normalizeAddress(entryPoint.address, "accountAbstraction.entryPoint.address"),
@@ -34,6 +41,8 @@ function normalizeEntryPoint(entryPoint) {
34
41
  });
35
42
  }
36
43
  function normalizeSafeConfig(safe) {
44
+ requireObject(safe, "accountAbstraction.safe");
45
+ if (safe.version !== "1.4.1" && safe.version !== "1.5.0") throw new ConfigurationError("accountAbstraction.safe.version must be either \"1.4.1\" or \"1.5.0\".");
37
46
  return Object.freeze({
38
47
  version: safe.version,
39
48
  safeModuleSetupAddress: normalizeAddress(safe.safeModuleSetupAddress, "accountAbstraction.safe.safeModuleSetupAddress"),
@@ -45,7 +54,16 @@ function normalizeSafeConfig(safe) {
45
54
  });
46
55
  }
47
56
  function normalizeChain(chain, rpcUrl) {
57
+ requireObject(chain, "chain");
48
58
  if (!Number.isInteger(chain.id) || chain.id <= 0) throw new ConfigurationError("chain.id must be a positive integer.");
59
+ requireNonEmptyString(chain.name, "chain.name");
60
+ requireObject(chain.nativeCurrency, "chain.nativeCurrency");
61
+ if (!Number.isInteger(chain.nativeCurrency.decimals) || chain.nativeCurrency.decimals < 0) throw new ConfigurationError("chain.nativeCurrency.decimals must be a non-negative integer.");
62
+ requireNonEmptyString(chain.nativeCurrency.name, "chain.nativeCurrency.name");
63
+ requireNonEmptyString(chain.nativeCurrency.symbol, "chain.nativeCurrency.symbol");
64
+ requireObject(chain.rpcUrls, "chain.rpcUrls");
65
+ requireObject(chain.rpcUrls.default, "chain.rpcUrls.default");
66
+ if (!Array.isArray(chain.rpcUrls.default.http)) throw new ConfigurationError("chain.rpcUrls.default.http must be an array.");
49
67
  return Object.freeze({
50
68
  formatters: void 0,
51
69
  fees: void 0,
@@ -77,6 +95,10 @@ function environmentFingerprint(input) {
77
95
  * Creates a complete SDK environment configuration from entrypoint and contract settings.
78
96
  */
79
97
  function createPolyesterEnvironment(params) {
98
+ requireObject(params, "Environment configuration");
99
+ requireNonEmptyString(params.name, "name");
100
+ requireObject(params.accountAbstraction, "accountAbstraction");
101
+ requireObject(params.contracts, "contracts");
80
102
  const apiUrl = normalizeUrl(params.apiUrl, "apiUrl", ["https:", "http:"]);
81
103
  const websocketUrl = normalizeUrl(params.websocketUrl, "websocketUrl", ["wss:", "ws:"]);
82
104
  const rpcUrl = normalizeUrl(params.rpcUrl, "rpcUrl", ["https:", "http:"]);
@@ -109,6 +131,15 @@ function createPolyesterEnvironment(params) {
109
131
  contracts
110
132
  });
111
133
  }
134
+ /**
135
+ * Parses a complete environment supplied to a public SDK client constructor.
136
+ */
137
+ function parsePolyesterEnvironment(environment) {
138
+ requireObject(environment, "environment");
139
+ const parsed = createPolyesterEnvironment(environment);
140
+ if (environment.fingerprint !== parsed.fingerprint) throw new ConfigurationError("environment.fingerprint must match the environment configuration.");
141
+ return parsed;
142
+ }
112
143
  const POLYESTER_TESTNET_ENVIRONMENT = createPolyesterEnvironment({
113
144
  name: "polyester-testnet",
114
145
  apiUrl: "https://api-devnet.polyester.ai",
@@ -148,6 +179,6 @@ const POLYESTER_TESTNET_ENVIRONMENT = createPolyesterEnvironment({
148
179
  contracts: { tradingGatewayAddress: "0xD3fecf5D39131e23b6B0f872cA0a21c8A5a30932" }
149
180
  });
150
181
  //#endregion
151
- export { POLYESTER_TESTNET_ENVIRONMENT, createPolyesterEnvironment };
182
+ export { POLYESTER_TESTNET_ENVIRONMENT, createPolyesterEnvironment, parsePolyesterEnvironment };
152
183
 
153
184
  //# sourceMappingURL=environment.js.map