@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.
- package/CHANGELOG.md +44 -0
- package/README.md +63 -17
- package/dist/account-signer/types.d.ts.map +1 -1
- package/dist/account-signer/types.js +6 -3
- package/dist/account-signer/types.js.map +1 -1
- package/dist/browser-client.d.ts +4 -2
- package/dist/browser-client.d.ts.map +1 -1
- package/dist/browser-client.js +3 -4
- package/dist/browser-client.js.map +1 -1
- package/dist/catalogs/client-catalog.d.ts.map +1 -1
- package/dist/catalogs/client-catalog.js +11 -4
- package/dist/catalogs/client-catalog.js.map +1 -1
- package/dist/catalogs/index.js +1 -1
- package/dist/catalogs/readers.d.ts.map +1 -1
- package/dist/catalogs/readers.js +3 -1
- package/dist/catalogs/readers.js.map +1 -1
- package/dist/catalogs/snapshot-validation.js +132 -0
- package/dist/catalogs/snapshot-validation.js.map +1 -0
- package/dist/catalogs/snapshot.d.ts.map +1 -1
- package/dist/catalogs/snapshot.js +16 -7
- package/dist/catalogs/snapshot.js.map +1 -1
- package/dist/catalogs/zipper-supply.d.ts.map +1 -1
- package/dist/catalogs/zipper-supply.js +10 -7
- package/dist/catalogs/zipper-supply.js.map +1 -1
- package/dist/core-client.d.ts +24 -17
- package/dist/core-client.d.ts.map +1 -1
- package/dist/core-client.js +21 -3
- package/dist/core-client.js.map +1 -1
- package/dist/environment.d.ts.map +1 -1
- package/dist/environment.js +32 -1
- package/dist/environment.js.map +1 -1
- package/dist/index.js +3 -3
- package/dist/realtime/client.js +13 -2
- package/dist/realtime/client.js.map +1 -1
- package/dist/realtime/snapshot-then-stream.js +1 -1
- package/dist/realtime/snapshot-then-stream.js.map +1 -1
- package/dist/realtime/types.d.ts +2 -0
- package/dist/realtime/types.d.ts.map +1 -1
- package/dist/server-client.d.ts +17 -8
- package/dist/server-client.d.ts.map +1 -1
- package/dist/server-client.js +8 -11
- package/dist/server-client.js.map +1 -1
- package/dist/services/accounts/accounts.js +3 -3
- package/dist/services/accounts/accounts.js.map +1 -1
- package/dist/services/address-book/address-book.js +28 -28
- package/dist/services/address-book/address-book.js.map +1 -1
- package/dist/services/address-book/address-book.schemas.d.ts.map +1 -1
- package/dist/services/address-book/address-book.schemas.js +2 -1
- package/dist/services/address-book/address-book.schemas.js.map +1 -1
- package/dist/services/api-keys/api-keys.d.ts.map +1 -1
- package/dist/services/api-keys/api-keys.js +12 -12
- package/dist/services/api-keys/api-keys.js.map +1 -1
- package/dist/services/auth/auth.d.ts +9 -3
- package/dist/services/auth/auth.d.ts.map +1 -1
- package/dist/services/auth/auth.js +11 -7
- package/dist/services/auth/auth.js.map +1 -1
- package/dist/services/auth/profile/profile.d.ts.map +1 -1
- package/dist/services/auth/profile/profile.js +7 -6
- package/dist/services/auth/profile/profile.js.map +1 -1
- package/dist/services/auth/session.d.ts +1 -1
- package/dist/services/auth/session.d.ts.map +1 -1
- package/dist/services/auth/session.js +6 -2
- package/dist/services/auth/session.js.map +1 -1
- package/dist/services/auth/session.types.d.ts +3 -2
- package/dist/services/auth/session.types.d.ts.map +1 -1
- package/dist/services/balances/balances.d.ts +1 -1
- package/dist/services/balances/balances.d.ts.map +1 -1
- package/dist/services/balances/balances.js +9 -8
- package/dist/services/balances/balances.js.map +1 -1
- package/dist/services/balances/balances.schemas.d.ts +1 -1
- package/dist/services/balances/balances.schemas.d.ts.map +1 -1
- package/dist/services/balances/balances.schemas.js +1 -1
- package/dist/services/balances/balances.schemas.js.map +1 -1
- package/dist/services/candles/candles.d.ts.map +1 -1
- package/dist/services/candles/candles.js +10 -9
- package/dist/services/candles/candles.js.map +1 -1
- package/dist/services/candles/candles.schemas.d.ts +11 -11
- package/dist/services/candles/candles.schemas.d.ts.map +1 -1
- package/dist/services/candles/candles.schemas.js +1 -2
- package/dist/services/candles/candles.schemas.js.map +1 -1
- package/dist/services/chain-analytics/chain-analytics.js +7 -7
- package/dist/services/chain-analytics/chain-analytics.js.map +1 -1
- package/dist/services/deposit/deposit.js +5 -5
- package/dist/services/deposit/deposit.js.map +1 -1
- package/dist/services/guard-signer/guard-signer.js +13 -13
- package/dist/services/guard-signer/guard-signer.js.map +1 -1
- package/dist/services/heatmap/heatmap.d.ts.map +1 -1
- package/dist/services/heatmap/heatmap.js +6 -5
- package/dist/services/heatmap/heatmap.js.map +1 -1
- package/dist/services/heatmap/heatmap.schemas.d.ts +17 -17
- package/dist/services/heatmap/heatmap.schemas.js +1 -1
- package/dist/services/heatmap/heatmap.schemas.js.map +1 -1
- package/dist/services/internal-transfers/internal-transfers.js +3 -3
- package/dist/services/internal-transfers/internal-transfers.js.map +1 -1
- package/dist/services/lifecycle/lifecycle.d.ts.map +1 -1
- package/dist/services/lifecycle/lifecycle.js +9 -8
- package/dist/services/lifecycle/lifecycle.js.map +1 -1
- package/dist/services/market-data/market-data.d.ts.map +1 -1
- package/dist/services/market-data/market-data.js +6 -5
- package/dist/services/market-data/market-data.js.map +1 -1
- package/dist/services/market-data/market-data.schemas.d.ts +2 -2
- package/dist/services/market-data/market-data.schemas.d.ts.map +1 -1
- package/dist/services/market-data/market-data.schemas.js +2 -6
- package/dist/services/market-data/market-data.schemas.js.map +1 -1
- package/dist/services/market-overview/market-overview.d.ts.map +1 -1
- package/dist/services/market-overview/market-overview.js +4 -3
- package/dist/services/market-overview/market-overview.js.map +1 -1
- package/dist/services/market-overview/market-overview.schemas.d.ts +3 -3
- package/dist/services/mfa/mfa.js +27 -27
- package/dist/services/mfa/mfa.js.map +1 -1
- package/dist/services/orderbook/orderbook.d.ts.map +1 -1
- package/dist/services/orderbook/orderbook.js +5 -4
- package/dist/services/orderbook/orderbook.js.map +1 -1
- package/dist/services/orderbook/orderbook.schemas.d.ts +1 -1
- package/dist/services/orders/orders-batch.schemas.d.ts +14 -14
- package/dist/services/orders/orders-batch.schemas.js +1 -1
- package/dist/services/orders/orders-input.schemas.d.ts +13 -4
- package/dist/services/orders/orders-input.schemas.d.ts.map +1 -1
- package/dist/services/orders/orders-input.schemas.js +8 -4
- package/dist/services/orders/orders-input.schemas.js.map +1 -1
- package/dist/services/orders/orders-modify.schemas.d.ts +22 -3
- package/dist/services/orders/orders-modify.schemas.d.ts.map +1 -1
- package/dist/services/orders/orders-modify.schemas.js +7 -3
- package/dist/services/orders/orders-modify.schemas.js.map +1 -1
- package/dist/services/orders/orders-output.schemas.d.ts +12 -12
- package/dist/services/orders/orders.d.ts +2 -2
- package/dist/services/orders/orders.d.ts.map +1 -1
- package/dist/services/orders/orders.js +44 -31
- package/dist/services/orders/orders.js.map +1 -1
- package/dist/services/policies/api-key-policies/api-key-policies.d.ts.map +1 -1
- package/dist/services/policies/api-key-policies/api-key-policies.js +11 -11
- package/dist/services/policies/api-key-policies/api-key-policies.js.map +1 -1
- package/dist/services/policies/subaccount-policies/subaccount-policies.d.ts.map +1 -1
- package/dist/services/policies/subaccount-policies/subaccount-policies.js +13 -12
- package/dist/services/policies/subaccount-policies/subaccount-policies.js.map +1 -1
- package/dist/services/social-verification/social-verification.d.ts.map +1 -1
- package/dist/services/social-verification/social-verification.js +7 -7
- package/dist/services/social-verification/social-verification.js.map +1 -1
- package/dist/services/subaccount-resolver.js +5 -3
- package/dist/services/subaccount-resolver.js.map +1 -1
- package/dist/services/subaccounts/subaccounts.d.ts +1 -1
- package/dist/services/subaccounts/subaccounts.d.ts.map +1 -1
- package/dist/services/subaccounts/subaccounts.js +34 -33
- package/dist/services/subaccounts/subaccounts.js.map +1 -1
- package/dist/services/subaccounts/subaccounts.schemas.d.ts +2 -2
- package/dist/services/subaccounts/subaccounts.schemas.js +1 -1
- package/dist/services/subaccounts/subaccounts.schemas.js.map +1 -1
- package/dist/services/trades/trades.d.ts.map +1 -1
- package/dist/services/trades/trades.js +5 -4
- package/dist/services/trades/trades.js.map +1 -1
- package/dist/services/trading-withdraws/trading-withdraws.js +8 -8
- package/dist/services/trading-withdraws/trading-withdraws.js.map +1 -1
- package/dist/services/transfers/transfers.d.ts +1 -1
- package/dist/services/transfers/transfers.d.ts.map +1 -1
- package/dist/services/transfers/transfers.js +5 -4
- package/dist/services/transfers/transfers.js.map +1 -1
- package/dist/services/triggers/trigger-input.schemas.d.ts +1 -1
- package/dist/services/triggers/triggers-output.schemas.d.ts +1 -1
- package/dist/services/triggers/triggers.d.ts.map +1 -1
- package/dist/services/triggers/triggers.js +21 -20
- package/dist/services/triggers/triggers.js.map +1 -1
- package/dist/services/whiteboard/whiteboard.js +15 -15
- package/dist/services/whiteboard/whiteboard.js.map +1 -1
- package/dist/services/zipper/zipper.js +3 -3
- package/dist/services/zipper/zipper.js.map +1 -1
- package/dist/shared/connect-error-mapping.d.ts +1 -1
- package/dist/shared/connect-error-mapping.js +27 -1
- package/dist/shared/connect-error-mapping.js.map +1 -1
- package/dist/shared/transports.js +7 -12
- package/dist/shared/transports.js.map +1 -1
- package/dist/shared/types.d.ts +12 -0
- package/dist/shared/types.d.ts.map +1 -1
- package/dist/shared/validation.js +19 -0
- package/dist/shared/validation.js.map +1 -0
- package/dist/utils/cookies.d.ts +8 -3
- package/dist/utils/cookies.d.ts.map +1 -1
- package/dist/utils/cookies.js +7 -1
- package/dist/utils/cookies.js.map +1 -1
- package/dist/utils/event-emitter.d.ts +1 -1
- package/dist/utils/event-emitter.d.ts.map +1 -1
- package/dist/utils/event-emitter.js +4 -2
- package/dist/utils/event-emitter.js.map +1 -1
- package/dist/utils/evm.js +2 -2
- package/dist/utils/evm.js.map +1 -1
- package/dist/utils/jwt.d.ts +2 -2
- package/dist/utils/jwt.d.ts.map +1 -1
- package/dist/utils/jwt.js +2 -2
- package/dist/utils/jwt.js.map +1 -1
- 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":";;;;
|
|
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
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
|
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":";;
|
|
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
|
-
|
|
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
|
|
8
|
+
for (const update of parsedUpdates) supplyByZippedAssetId.set(update.zippedAssetId, update.supply);
|
|
6
9
|
let changed = false;
|
|
7
|
-
const assets =
|
|
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
|
|
27
|
+
if (!changed) return parsedSnapshot;
|
|
25
28
|
const nowMs = Date.now();
|
|
26
29
|
return {
|
|
27
|
-
...
|
|
30
|
+
...parsedSnapshot,
|
|
28
31
|
tsMs: nowMs,
|
|
29
|
-
version:
|
|
32
|
+
version: parsedSnapshot.version + 1,
|
|
30
33
|
zipper: {
|
|
31
|
-
...
|
|
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 (
|
|
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"}
|
package/dist/core-client.d.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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;
|
|
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"}
|
package/dist/core-client.js
CHANGED
|
@@ -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
|
package/dist/core-client.js.map
CHANGED
|
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,SAAS,yBACL,MACkD;CAClD,IAAI,CAAC,MAAM,OAAO,CAAC;CACnB,IAAI,KAAK,SAAS,OACd,OAAO;EACH,gBAAgB,YAAY;GACxB,MAAM,QAAQ,MAAM,KAAK,SAAS;GAClC,MAAM,UAAkC,CAAC;GACzC,IAAI,OAAO,QAAQ,gBAAgB,UAAU;GAC7C,OAAO;EACX;EACA,eAAe;GAGX,MAAM,QAAQ,KAAK,SAAS;GAC5B,IAAI,iBAAiB,SAAS,OAAO;GACrC,OAAO,OAAO,UAAU,YAAY,MAAM,SAAS;EACvD;CACJ;CAEJ,OAAO;EACH,iBAAiB,YACb,+BAA+B,MAAM;GACjC,KAAK,QAAQ;GACb,QAAQ,QAAQ;EACpB,CAAC;EACL,eAAe;CACnB;AACJ;;AA0DA,SAAgB,2BACZ,QACsB;CACtB,OAAO,OAAO,YAAY,KAAA,IACpB;EACI,iBAAiB,OAAO;EACxB,aAAa,OAAO;CACxB,IACA,EAAE,SAAS,OAAO,QAAQ;AACpC;;;;AAgBA,SAAgB,2BACZ,QACO;CACP,IAAI,OAAO,WAAW,YAAY,WAAW,QAAQ,MAAM,QAAQ,MAAM,GACrE,MAAM,IAAI,mBAAmB,yCAAyC;CAE1E,MAAM,cAAc,0BAA0B,OAAO,WAAW;CAChE,IACI,OAAO,eAAe,KAAA,KACtB,OAAO,eAAe,YACtB,OAAO,eAAe,QAEtB,MAAM,IAAI,mBAAmB,mDAA+C;CAEhF,IAAI,OAAO,WAAW,OAAO,iBACzB,MAAM,IAAI,mBAAmB,sDAAsD;CAEvF,IAAI,OAAO,WAAW,OAAO,aACzB,MAAM,IAAI,mBAAmB,kDAAkD;CAGnF,OAAO,OAAO,OAAO,CAAC,GAAG,QAAQ,EAAE,YAAY,CAAC;AACpD;;;;;;;;AASA,IAAa,kBAAb,MAA6B;CACzB;CAEA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CACA;CACA,uBAAuB;CAEvB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA,YAAY,QAA+B,UAAwC,CAAC,GAAG;EAEnF,SADqB,2BAA2B,MAC5B;EACpB,MAAM,eAAe,OAAO,gBAAgB,CAAC;EAC7C,MAAM,EAAE,gBAAgB;EAExB,KAAK,aACD,OAAO,cACP,iBAAiB;GACb,QAAQ,YAAY;GACpB;GACA,MAAM,OAAO;GACb,YAAY,OAAO;EACvB,CAAC;EAEL,KAAKA,eAAe;EACpB,KAAKC,gBAAgB,OAAO;EAC5B,KAAKC,kBAAkB,OAAO;EAC9B,KAAKC,wBAAwB,OAAO;EACpC,KAAKC,iBAAiB,OAAO;EAC7B,KAAKC,yBAAyB,OAAO;EACrC,KAAKC,qBAAqB,OAAO;EACjC,KAAKC,cAAc,QAAQ;CAC/B;CAEA,IAAI,WAA8B;EAC9B,IAAI,CAAC,KAAKC,WACN,IAAI,KAAKL,uBACL,KAAKK,YAAY,KAAKL;OACnB;GACH,MAAM,cAAc,KAAKH;GACzB,MAAM,eAAe,yBAAyB,KAAKC,aAAa;GAChE,KAAKO,YAAY,IAAI,eAAe;IAChC,OAAO,YAAY;IACnB,eAAe,GAAG,YAAY,OAAO;IACrC,mBAAmB,GAAG,YAAY,OAAO;IACzC,gBACI,KAAKN,iBAAiB,kBAAkB,aAAa;IACzD,SAAS,KAAKA,iBAAiB,WAAW,aAAa;GAC3D,CAAC;EACL;EAEJ,OAAO,KAAKM;CAChB;CAEA,IAAI,UAAyB;EACzB,IAAI,CAAC,KAAKC,UACN,IAAI,KAAKL,gBACL,KAAKK,WAAW,KAAKL;OAClB;GACH,MAAM,2BAA2B,IAAI,kBACjC,KAAK,WAAW,WAChB,KAAK,UACL,KAAKM,WAAW,CACpB;GACA,MAAM,uBAAuB,IAAI,cAAc,KAAK,WAAW,SAAS;GACxE,KAAKD,WAAW,uBAAuB;IACnC,UAAU,KAAKJ;IACf,MAAM,KAAKC;IACX,SAAS;KACL,cAAc,yBAAyB,cAAc;KACrD,cAAc,qBAAqB,yBAAyB;IAChE;GACJ,CAAC;EACL;EAEJ,OAAO,KAAKG;CAChB;CAEA,aAAwB;EAIpB,KAAKE,YAAY,6BAA6B,KAAK,OAAO;EAC1D,OAAO,KAAKA;CAChB;CAEA,eAA+C;EAC3C,IAAI,CAAC,KAAKC,sBAAsB;GAC5B,KAAKA,uBAAuB;GAC5B,KAAKC,YAAY,KAAK,yBAAyB;EACnD;EACA,OAAO,KAAKA;CAChB;CAEA,IAAI,OAAoB;EACpB,IAAI,CAAC,KAAKC,OAAO;GACb,MAAM,EAAE,SAAS,cAAc,KAAK;GACpC,KAAKA,QACD,KAAKP,cAAc;IACf,YAAY;KAAE;KAAW;IAAQ;IACjC,UAAU,KAAK;IACf,aAAa,KAAK;IAClB,aAAa,KAAKP;GACtB,CAAC,KAAK,IAAI,YAAY;IAAE;IAAW;GAAQ,GAAG,KAAK,QAAQ;EACnE;EACA,OAAO,KAAKc;CAChB;CAEA,IAAI,WAA4B;EAC5B,OAAQ,KAAKC,cAAc,IAAI,gBAAgB,KAAK,WAAW,OAAO;CAC1E;CAEA,IAAI,UAA0B;EAC1B,OAAQ,KAAKC,aAAa,IAAI,eAC1B,KAAK,WAAW,SAChB,KAAK,UACL,KAAKC,aAAa,CACtB;CACJ;CAEA,IAAI,cAAkC;EAClC,OAAQ,KAAKC,iBAAiB,IAAI,mBAC9B,KAAK,WAAW,SAChB,KAAK,UACL,KAAKD,aAAa,CACtB;CACJ;CAEA,IAAI,UAA0B;EAC1B,OAAQ,KAAKE,aAAa,IAAI,eAC1B,KAAK,WAAW,WAChB,KAAK,UACL,KAAKT,WAAW,CACpB;CACJ;CAEA,IAAI,iBAAwC;EACxC,OAAQ,KAAKU,oBAAoB,IAAI,sBACjC,KAAK,WAAW,WAChB,KAAKV,WAAW,CACpB;CACJ;CAEA,IAAI,aAAgC;EAChC,OAAQ,KAAKW,gBAAgB,IAAI,kBAC7B,KAAK,WAAW,WAChB,KAAK,UACL,KAAKX,WAAW,CACpB;CACJ;CAEA,IAAI,iBAAwC;EACxC,OAAQ,KAAKY,oBAAoB,IAAI,sBACjC,KAAK,WAAW,WAChB,KAAK,UACL,KAAKZ,WAAW,CACpB;CACJ;CAEA,IAAI,YAA8B;EAC9B,OAAQ,KAAKa,eAAe,IAAI,iBAC5B,KAAK,WAAW,WAChB,KAAK,UACL,KAAKb,WAAW,CACpB;CACJ;CAEA,IAAI,UAA0B;EAC1B,OAAQ,KAAKc,aAAa,IAAI,eAC1B,KAAK,WAAW,WAChB,KAAK,UACL,KAAKd,WAAW,CACpB;CACJ;CAEA,IAAI,YAA8B;EAC9B,OAAQ,KAAKe,eAAe,IAAI,iBAAiB,KAAK,WAAW,WAAW,KAAK,QAAQ;CAC7F;CAEA,IAAI,SAAwB;EACxB,OAAQ,KAAKC,YAAY,IAAI,cACzB,KAAK,WAAW,SAChB,KAAK,UACL,KAAKT,aAAa,GAClB,KAAKP,WAAW,CACpB;CACJ;CAEA,IAAI,SAAwB;EACxB,OAAQ,KAAKiB,YAAY,IAAI,cACzB,KAAK,WAAW,SAChB,KAAK,UACL,KAAKV,aAAa,GAClB,KAAKP,WAAW,CACpB;CACJ;CAEA,IAAI,WAA4B;EAC5B,OAAQ,KAAKkB,cAAc,IAAI,gBAC3B,KAAK,WAAW,SAChB,KAAK,UACL,KAAKX,aAAa,GAClB,KAAKP,WAAW,CACpB;CACJ;CAEA,IAAI,WAA4B;EAC5B,OAAQ,KAAKmB,cAAc,IAAI,gBAC3B,KAAK,WAAW,SAChB,KAAK,UACL,KAAKZ,aAAa,GAClB,KAAKP,WAAW,CACpB;CACJ;CAEA,IAAI,YAA8B;EAC9B,OAAQ,KAAKoB,eAAe,IAAI,iBAC5B,KAAK,WAAW,SAChB,KAAK,UACL,KAAKb,aAAa,GAClB,KAAKP,WAAW,CACpB;CACJ;CAEA,IAAI,oBAA8C;EAC9C,OAAQ,KAAKqB,uBAAuB,IAAI,yBACpC,KAAK,WAAW,SAChB,KAAKd,aAAa,GAClB,KAAKP,WAAW,CACpB;CACJ;CAEA,IAAI,mBAA4C;EAC5C,OAAQ,KAAKsB,sBAAsB,IAAI,wBACnC,KAAK,WAAW,SAChB,KAAKf,aAAa,GAClB;GACI,SAAS,KAAKjB,aAAa,MAAM;GACjC,uBAAuB,KAAKA,aAAa,UAAU;EACvD,GACA,KAAKU,WAAW,GAChB,KAAK,OACT;CACJ;CAEA,IAAI,UAA0B;EAC1B,OAAQ,KAAKuB,aAAa,IAAI,eAAe,KAAK,WAAW,SAAS,KAAKhB,aAAa,CAAC;CAC7F;CAEA,IAAI,cAAkC;EAClC,OAAQ,KAAKiB,iBAAiB,IAAI,mBAC9B,KAAK,WAAW,SAChB,KAAK,UACL,KAAKjB,aAAa,CACtB;CACJ;CAEA,IAAI,cAAkC;EAClC,OAAQ,KAAKkB,iBAAiB,IAAI,mBAC9B,KAAK,WAAW,SAChB,KAAKlB,aAAa,CACtB;CACJ;CAEA,IAAI,qBAAgD;EAChD,OAAQ,KAAKmB,wBAAwB,IAAI,0BACrC,KAAK,WAAW,OACpB;CACJ;CAEA,IAAI,aAAgC;EAChC,OAAQ,KAAKC,gBAAgB,IAAI,kBAAkB,KAAK,WAAW,OAAO;CAC9E;CAEA,IAAI,SAAwB;EACxB,OAAQ,KAAKC,YAAY,IAAI,cACzB,KAAK,WAAW,WAChB,KAAK,UACL,KAAK5B,WAAW,CACpB;CACJ;CAEA,IAAI,MAAkB;EAClB,OAAQ,KAAK6B,SAAS,IAAI,WAAW,KAAK,WAAW,OAAO;CAChE;;;;;CAMA,2BAAqE,CAErE;AACJ"}
|
|
@@ -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;;;;;
|
|
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"}
|
package/dist/environment.js
CHANGED
|
@@ -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
|