@polyester/sdk 0.27.2 → 0.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/catalogs/readers.js +6 -6
  3. package/dist/catalogs/readers.js.map +1 -1
  4. package/dist/gen/ledger/read/v1/ledger_read_pb.d.ts +3 -3
  5. package/dist/gen/ledger/read/v1/ledger_read_pb.js.map +1 -1
  6. package/dist/gen/marketdata/v1/heatmap_pb.d.ts +6 -6
  7. package/dist/gen/marketdata/v1/heatmap_pb.js.map +1 -1
  8. package/dist/gen/marketdata/v1/marketdata_pb.d.ts +13 -13
  9. package/dist/gen/marketdata/v1/marketdata_pb.js.map +1 -1
  10. package/dist/gen/marketoverview/v1/marketoverview_pb.d.ts +8 -8
  11. package/dist/gen/marketoverview/v1/marketoverview_pb.js +1 -1
  12. package/dist/gen/marketoverview/v1/marketoverview_pb.js.map +1 -1
  13. package/dist/gen/orderbook/v1/orderbook_pb.d.ts +1 -1
  14. package/dist/gen/orderbook/v1/orderbook_pb.js.map +1 -1
  15. package/dist/gen/orders/v1/orders_pb.d.ts +38 -24
  16. package/dist/gen/orders/v1/orders_pb.d.ts.map +1 -1
  17. package/dist/gen/orders/v1/orders_pb.js +3 -3
  18. package/dist/gen/orders/v1/orders_pb.js.map +1 -1
  19. package/dist/gen/orders/v1/orders_read_pb.d.ts +17 -10
  20. package/dist/gen/orders/v1/orders_read_pb.d.ts.map +1 -1
  21. package/dist/gen/orders/v1/orders_read_pb.js +3 -3
  22. package/dist/gen/orders/v1/orders_read_pb.js.map +1 -1
  23. package/dist/gen/triggers/v1/triggers_pb.d.ts +40 -26
  24. package/dist/gen/triggers/v1/triggers_pb.d.ts.map +1 -1
  25. package/dist/gen/triggers/v1/triggers_pb.js +7 -1
  26. package/dist/gen/triggers/v1/triggers_pb.js.map +1 -1
  27. package/dist/index.d.ts +2 -2
  28. package/dist/index.js +2 -2
  29. package/dist/services/heatmap/heatmap.schemas.d.ts +4 -4
  30. package/dist/services/market-data/market-data.schemas.js +1 -1
  31. package/dist/services/market-data/market-data.schemas.js.map +1 -1
  32. package/dist/services/orderbook/orderbook.schemas.d.ts +1 -1
  33. package/dist/services/orders/orders-batch.schemas.d.ts +17 -0
  34. package/dist/services/orders/orders-batch.schemas.d.ts.map +1 -1
  35. package/dist/services/orders/orders-batch.schemas.js +3 -1
  36. package/dist/services/orders/orders-batch.schemas.js.map +1 -1
  37. package/dist/services/orders/orders.d.ts +4 -4
  38. package/dist/services/orders/orders.js +4 -4
  39. package/dist/services/orders/orders.js.map +1 -1
  40. package/dist/services/subaccounts/subaccounts.schemas.d.ts +2 -2
  41. package/dist/services/triggers/trigger-input.schemas.d.ts +3 -3
  42. package/dist/services/triggers/triggers-output.schemas.d.ts +7 -3
  43. package/dist/services/triggers/triggers-output.schemas.d.ts.map +1 -1
  44. package/dist/services/triggers/triggers-output.schemas.js +4 -2
  45. package/dist/services/triggers/triggers-output.schemas.js.map +1 -1
  46. package/dist/services/triggers/triggers.codecs.js +6 -3
  47. package/dist/services/triggers/triggers.codecs.js.map +1 -1
  48. package/dist/shared/connect-error-mapping.d.ts.map +1 -1
  49. package/dist/shared/connect-error-mapping.js +7 -1
  50. package/dist/shared/connect-error-mapping.js.map +1 -1
  51. package/dist/shared/decimal-surface.js +2 -2
  52. package/dist/shared/errors.d.ts +9 -3
  53. package/dist/shared/errors.d.ts.map +1 -1
  54. package/dist/shared/errors.js +12 -1
  55. package/dist/shared/errors.js.map +1 -1
  56. package/dist/utils/numbers.js.map +1 -1
  57. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @polyester/sdk
2
2
 
3
+ ## 0.28.0
4
+
5
+ ### Minor Changes
6
+
7
+ - Map HTTP 501 and Connect `unimplemented` to the new `NotImplementedError` instead of `InternalServerError`. Bare HTTP error responses without a Connect body now map by their status code instead of collapsing to `InternalServerError`. ([#171](https://github.com/Fabric-Labs/polyester-sdk-typescript/pull/171))
8
+
9
+ ## 0.27.3
10
+
11
+ ### Patch Changes
12
+
13
+ - Expose `actionTaken` on batch replacement admission and status items so callers can distinguish successor replacements from cancel-only outcomes. Clarify single-order timeout reconciliation and the 15-minute batch-create replay window. ([#168](https://github.com/Fabric-Labs/polyester-sdk-typescript/pull/168))
14
+
15
+ - Encode and decode trading prices, price deltas, and slippage ticks at scale 9 instead of 6. Price inputs now accept up to nine decimal places, and absolute max-slippage values are capped at `2.147483647` quote units by the int32 wire field. ([#170](https://github.com/Fabric-Labs/polyester-sdk-typescript/pull/170))
16
+
17
+ - Expose the current trailing threshold as `triggerPrice` on trailing trigger runtime details, and add the `activated` trigger event type for list filters and event output. ([#170](https://github.com/Fabric-Labs/polyester-sdk-typescript/pull/170))
18
+
3
19
  ## 0.27.2
4
20
 
5
21
  ### Patch Changes
@@ -118,7 +118,7 @@ var DecimalConverter = class {
118
118
  };
119
119
  function priceConverter(pair) {
120
120
  const tickDecimals = significantDecimalPlaces(pair.tickSize);
121
- return new DecimalConverter("price", 6, tickDecimals > 0 ? tickDecimals : 6);
121
+ return new DecimalConverter("price", 9, tickDecimals > 0 ? tickDecimals : 9);
122
122
  }
123
123
  function quantityConverter(pair) {
124
124
  return new DecimalConverter("quantity", pair.baseAsset.quantityScale, pair.baseAsset.quantityDisplayDecimals);
@@ -307,7 +307,7 @@ var OrdersReader = class {
307
307
  }
308
308
  getSpotOrderConstraints(pair) {
309
309
  const config = this.market.requirePair(pair);
310
- const priceScale = 6;
310
+ const priceScale = 9;
311
311
  const quantityScale = config.baseAsset.quantityScale;
312
312
  const quoteAmountScale = config.quoteAsset.quantityScale;
313
313
  return {
@@ -387,7 +387,7 @@ var OrdersReader = class {
387
387
  return parsed.scaled;
388
388
  }
389
389
  validatePrice(pair, price, errors) {
390
- const parsed = tryDecimalToScaled(price, 6);
390
+ const parsed = tryDecimalToScaled(price, 9);
391
391
  if (!parsed.ok) {
392
392
  errors.push({
393
393
  field: "price",
@@ -398,7 +398,7 @@ var OrdersReader = class {
398
398
  return null;
399
399
  }
400
400
  if (parsed.scaled > 9223372036854775807n) {
401
- const maximum = scaledToDecimal(PROTOBUF_INT64_MAX, 6);
401
+ const maximum = scaledToDecimal(PROTOBUF_INT64_MAX, 9);
402
402
  errors.push({
403
403
  field: "price",
404
404
  rule: "maxPrice",
@@ -408,7 +408,7 @@ var OrdersReader = class {
408
408
  });
409
409
  return null;
410
410
  }
411
- const tick = this.requireConstraintScaled(pair.tickSize, 6, "tickSize");
411
+ const tick = this.requireConstraintScaled(pair.tickSize, 9, "tickSize");
412
412
  if (tick > 0n && parsed.scaled % tick !== 0n) errors.push({
413
413
  field: "price",
414
414
  rule: "tickSize",
@@ -419,7 +419,7 @@ var OrdersReader = class {
419
419
  return parsed.scaled;
420
420
  }
421
421
  validateMinNotional(pair, quantityScaled, priceTicks, errors) {
422
- const notionalScale = pair.baseAsset.quantityScale + 6;
422
+ const notionalScale = pair.baseAsset.quantityScale + 9;
423
423
  const minNotional = this.requireConstraintScaled(pair.minNotionalQuote, notionalScale, "minNotionalQuote");
424
424
  const notional = quantityScaled * priceTicks;
425
425
  if (notional < minNotional) errors.push({
@@ -1 +1 @@
1
- {"version":3,"file":"readers.js","names":[],"sources":["../../src/catalogs/readers.ts"],"sourcesContent":["import type {\n AssetConfig,\n ZipperChainConfig,\n ZipperChainContractConfig,\n} from \"../shared/catalog-config.js\";\nimport {\n scaledToDecimal,\n scaledToDisplay,\n significantDecimalPlaces,\n tryDecimalToScaled,\n tryNormalizeDecimalInput,\n tryToScaledBigInt,\n type DecimalToScaledFailure,\n type ScaledIntegerLike,\n} from \"./decimal.js\";\nimport { indexesFor } from \"./indexes.js\";\nimport type { EnrichedPairConfig } from \"./market-data-catalog.js\";\nimport {\n resolveLedgerAssetByLedgerId,\n resolveZipperAssetByLedgerId,\n UNKNOWN_LEDGER_ASSET_ID,\n} from \"./unknown-asset.js\";\nimport type { ZipperContractName, ZipperEnrichedAssetConfig } from \"./zipper-catalog.js\";\nimport {\n CatalogConversionError,\n CatalogLookupError,\n CatalogValidationFailedError,\n type AssetCatalogKey,\n type CatalogLookupDomain,\n type CatalogReader,\n type CatalogSnapshot,\n type CatalogValidationError,\n type CatalogValidationResult,\n type ChainCatalogKey,\n type LedgerCatalogReader,\n type MarketCatalogReader,\n type OrdersCatalogReader,\n type PairCatalogKey,\n type ParsedCatalogAmount,\n type SpotOrderConstraints,\n type SpotOrderDecimalInput,\n type ZipperAssetChainRoute,\n type ZipperCatalogReader,\n} from \"./types.js\";\nimport { parseCatalogSnapshot } from \"./snapshot-validation.js\";\nimport { PROTOBUF_INT32_MAX, PROTOBUF_INT64_MAX } from \"../shared/wire-bounds.js\";\n\n/** Price ticks are always quoted at 6 decimal places. */\nexport const PRICE_SCALE = 6;\n\ntype SnapshotGetter = () => CatalogSnapshot;\n\nfunction isListed(pair: EnrichedPairConfig, nowMs: number): boolean {\n if (pair.listingAt === null || pair.listingAt > nowMs) return false;\n if (pair.status === \"disabled\") return false;\n if (pair.delistingAt !== null && pair.delistingAt < nowMs) return false;\n return true;\n}\n\nfunction isEverListed(pair: EnrichedPairConfig, nowMs: number): boolean {\n return pair.listingAt !== null && pair.listingAt < nowMs;\n}\n\nfunction requireFound<T>(\n domain: CatalogLookupDomain,\n lookup: string,\n value: string | number,\n found: T | null,\n): T {\n if (found === null) throw new CatalogLookupError(domain, lookup, value);\n return found;\n}\n\ntype ResolvedKey<TByName extends string, TById extends string> =\n | { lookup: TByName; value: string }\n | { lookup: TById; value: number };\n\nfunction resolvePairKey(key: PairCatalogKey): ResolvedKey<\"symbol\", \"symbolId\"> {\n if (typeof key === \"string\") return { lookup: \"symbol\", value: key };\n if (typeof key === \"number\") return { lookup: \"symbolId\", value: key };\n if (\"symbol\" in key) return { lookup: \"symbol\", value: key.symbol };\n return { lookup: \"symbolId\", value: key.symbolId };\n}\n\nfunction resolveAssetKey(key: AssetCatalogKey): ResolvedKey<\"symbol\", \"ledgerId\"> {\n if (typeof key === \"string\") return { lookup: \"symbol\", value: key };\n if (typeof key === \"number\") return { lookup: \"ledgerId\", value: key };\n if (\"symbol\" in key) return { lookup: \"symbol\", value: key.symbol };\n return { lookup: \"ledgerId\", value: key.ledgerId };\n}\n\nfunction resolveChainKey(key: ChainCatalogKey): ResolvedKey<\"chainCode\", \"chainId\"> {\n if (typeof key === \"string\") return { lookup: \"chainCode\", value: key };\n if (typeof key === \"number\") return { lookup: \"chainId\", value: key };\n if (\"code\" in key) return { lookup: \"chainCode\", value: key.code };\n return { lookup: \"chainId\", value: key.chainId };\n}\n\nfunction conversionFailureMessage(\n field: string,\n value: string,\n failure: DecimalToScaledFailure,\n): string {\n return failure.reason === \"precision\"\n ? `${field} supports at most ${failure.maxDecimals} decimal places: ${value}`\n : `${field} must be a non-negative decimal number: ${value}`;\n}\n\n/** Shared conversion core used by the market and ledger readers. */\nclass DecimalConverter {\n constructor(\n readonly field: string,\n readonly scale: number,\n readonly displayDecimals: number,\n ) {}\n\n parse(decimal: string): ParsedCatalogAmount {\n const result = tryDecimalToScaled(decimal, this.scale);\n if (!result.ok) {\n throw new CatalogConversionError(\n this.field,\n conversionFailureMessage(this.field, decimal, result.failure),\n );\n }\n return {\n scaledValue: result.scaled.toString(),\n decimal: scaledToDecimal(result.scaled, this.scale),\n display: scaledToDisplay(result.scaled, this.scale, this.displayDecimals),\n scale: this.scale,\n };\n }\n\n normalizeInput(raw: string): string {\n const normalized = tryNormalizeDecimalInput(raw, this.scale);\n if (normalized === null) {\n throw new CatalogConversionError(\n this.field,\n `${this.field} must be a non-negative decimal number: ${raw}`,\n );\n }\n return normalized;\n }\n\n toDecimalString(scaled: ScaledIntegerLike): string {\n return scaledToDecimal(this.toBigInt(scaled), this.scale);\n }\n\n toDisplayString(scaled: ScaledIntegerLike): string {\n return scaledToDisplay(this.toBigInt(scaled), this.scale, this.displayDecimals);\n }\n\n formatDecimal(decimal: string): string {\n const result = tryDecimalToScaled(decimal.trim(), this.scale);\n if (!result.ok) {\n throw new CatalogConversionError(\n this.field,\n conversionFailureMessage(this.field, decimal, result.failure),\n );\n }\n return scaledToDisplay(result.scaled, this.scale, this.displayDecimals);\n }\n\n private toBigInt(scaled: ScaledIntegerLike): bigint {\n const value = tryToScaledBigInt(scaled);\n if (value === null) {\n throw new CatalogConversionError(\n this.field,\n `${this.field} must be a raw scaled integer: ${String(scaled)}`,\n );\n }\n return value;\n }\n}\n\nfunction priceConverter(pair: EnrichedPairConfig): DecimalConverter {\n const tickDecimals = significantDecimalPlaces(pair.tickSize);\n const displayDecimals = tickDecimals > 0 ? tickDecimals : PRICE_SCALE;\n return new DecimalConverter(\"price\", PRICE_SCALE, displayDecimals);\n}\n\nfunction quantityConverter(pair: EnrichedPairConfig): DecimalConverter {\n return new DecimalConverter(\n \"quantity\",\n pair.baseAsset.quantityScale,\n pair.baseAsset.quantityDisplayDecimals,\n );\n}\n\nfunction quoteAmountConverter(pair: EnrichedPairConfig): DecimalConverter {\n return new DecimalConverter(\n \"quoteAmount\",\n pair.quoteAsset.quantityScale,\n pair.quoteAsset.quantityDisplayDecimals,\n );\n}\n\nfunction ledgerAmountConverter(asset: AssetConfig): DecimalConverter {\n return new DecimalConverter(\"amount\", asset.quantityScale, asset.quantityDisplayDecimals);\n}\n\nclass MarketReader implements MarketCatalogReader {\n constructor(private readonly getSnapshot: SnapshotGetter) {}\n\n listAssets(): readonly AssetConfig[] {\n return this.getSnapshot().market.assets;\n }\n\n getAsset(asset: AssetCatalogKey): AssetConfig | null {\n const key = resolveAssetKey(asset);\n return key.lookup === \"symbol\"\n ? this.getAssetBySymbol(key.value)\n : this.getAssetByLedgerId(key.value);\n }\n\n requireAsset(asset: AssetCatalogKey): AssetConfig {\n const key = resolveAssetKey(asset);\n return requireFound(\"market\", key.lookup, key.value, this.getAsset(asset));\n }\n\n getAssetBySymbol(assetSymbol: string): AssetConfig | null {\n return indexesFor(this.getSnapshot()).assetBySymbol.get(assetSymbol) ?? null;\n }\n\n requireAssetBySymbol(assetSymbol: string): AssetConfig {\n return requireFound(\"market\", \"symbol\", assetSymbol, this.getAssetBySymbol(assetSymbol));\n }\n\n getAssetByLedgerId(ledgerAssetId: number): AssetConfig {\n return resolveLedgerAssetByLedgerId(ledgerAssetId, (id) => this.lookupAssetByLedgerId(id));\n }\n\n lookupAssetByLedgerId(ledgerAssetId: number): AssetConfig | null {\n return indexesFor(this.getSnapshot()).assetByLedgerId.get(ledgerAssetId) ?? null;\n }\n\n requireAssetByLedgerId(ledgerAssetId: number): AssetConfig {\n return this.getAssetByLedgerId(ledgerAssetId);\n }\n\n listPairs(filter?: {\n listed?: boolean;\n everListed?: boolean;\n atMs?: number;\n }): readonly EnrichedPairConfig[] {\n const pairs = this.getSnapshot().market.pairs;\n if (!filter) return pairs;\n const nowMs = filter.atMs ?? Date.now();\n return pairs.filter((pair) => {\n if (filter.listed !== undefined && isListed(pair, nowMs) !== filter.listed)\n return false;\n if (filter.everListed !== undefined && isEverListed(pair, nowMs) !== filter.everListed)\n return false;\n return true;\n });\n }\n\n getPair(pair: PairCatalogKey): EnrichedPairConfig | null {\n const key = resolvePairKey(pair);\n return key.lookup === \"symbol\"\n ? this.getPairBySymbol(key.value)\n : this.getPairBySymbolId(key.value);\n }\n\n requirePair(pair: PairCatalogKey): EnrichedPairConfig {\n const key = resolvePairKey(pair);\n return requireFound(\"market\", key.lookup, key.value, this.getPair(pair));\n }\n\n getPairBySymbol(pairSymbol: string): EnrichedPairConfig | null {\n return indexesFor(this.getSnapshot()).pairBySymbol.get(pairSymbol) ?? null;\n }\n\n requirePairBySymbol(pairSymbol: string): EnrichedPairConfig {\n return requireFound(\"market\", \"symbol\", pairSymbol, this.getPairBySymbol(pairSymbol));\n }\n\n getPairBySymbolId(pairSymbolId: number): EnrichedPairConfig | null {\n return indexesFor(this.getSnapshot()).pairBySymbolId.get(pairSymbolId) ?? null;\n }\n\n requirePairBySymbolId(pairSymbolId: number): EnrichedPairConfig {\n return requireFound(\n \"market\",\n \"symbolId\",\n pairSymbolId,\n this.getPairBySymbolId(pairSymbolId),\n );\n }\n\n getSymbolIdByPairSymbol(pairSymbol: string): number | null {\n return this.getPairBySymbol(pairSymbol)?.symbolId ?? null;\n }\n\n requireSymbolIdByPairSymbol(pairSymbol: string): number {\n return this.requirePairBySymbol(pairSymbol).symbolId;\n }\n\n getPairSymbolBySymbolId(pairSymbolId: number): string | null {\n return this.getPairBySymbolId(pairSymbolId)?.symbol ?? null;\n }\n\n requirePairSymbolBySymbolId(pairSymbolId: number): string {\n return this.requirePairBySymbolId(pairSymbolId).symbol;\n }\n\n decimalPriceToTicks(price: string, pair: PairCatalogKey): ParsedCatalogAmount {\n return priceConverter(this.requirePair(pair)).parse(price);\n }\n\n normalizePriceInput(price: string, pair: PairCatalogKey): string {\n return priceConverter(this.requirePair(pair)).normalizeInput(price);\n }\n\n priceTicksToDecimalString(priceTicks: ScaledIntegerLike, pair: PairCatalogKey): string {\n return priceConverter(this.requirePair(pair)).toDecimalString(priceTicks);\n }\n\n priceTicksToDisplayString(priceTicks: ScaledIntegerLike, pair: PairCatalogKey): string {\n return priceConverter(this.requirePair(pair)).toDisplayString(priceTicks);\n }\n\n formatPrice(price: string, pair: PairCatalogKey): string {\n return priceConverter(this.requirePair(pair)).formatDecimal(price);\n }\n\n decimalQuantityToScaled(quantity: string, pair: PairCatalogKey): ParsedCatalogAmount {\n return quantityConverter(this.requirePair(pair)).parse(quantity);\n }\n\n normalizeQuantityInput(quantity: string, pair: PairCatalogKey): string {\n return quantityConverter(this.requirePair(pair)).normalizeInput(quantity);\n }\n\n quantityScaledToDecimalString(quantityScaled: ScaledIntegerLike, pair: PairCatalogKey): string {\n return quantityConverter(this.requirePair(pair)).toDecimalString(quantityScaled);\n }\n\n quantityScaledToDisplayString(quantityScaled: ScaledIntegerLike, pair: PairCatalogKey): string {\n return quantityConverter(this.requirePair(pair)).toDisplayString(quantityScaled);\n }\n\n formatQuantity(quantity: string, pair: PairCatalogKey): string {\n return quantityConverter(this.requirePair(pair)).formatDecimal(quantity);\n }\n\n decimalQuoteAmountToScaled(amount: string, pair: PairCatalogKey): ParsedCatalogAmount {\n return quoteAmountConverter(this.requirePair(pair)).parse(amount);\n }\n\n normalizeQuoteAmountInput(amount: string, pair: PairCatalogKey): string {\n return quoteAmountConverter(this.requirePair(pair)).normalizeInput(amount);\n }\n\n quoteAmountScaledToDecimalString(\n amountScaled: ScaledIntegerLike,\n pair: PairCatalogKey,\n ): string {\n return quoteAmountConverter(this.requirePair(pair)).toDecimalString(amountScaled);\n }\n\n quoteAmountScaledToDisplayString(\n amountScaled: ScaledIntegerLike,\n pair: PairCatalogKey,\n ): string {\n return quoteAmountConverter(this.requirePair(pair)).toDisplayString(amountScaled);\n }\n\n formatQuoteAmount(amount: string, pair: PairCatalogKey): string {\n return quoteAmountConverter(this.requirePair(pair)).formatDecimal(amount);\n }\n}\n\nclass LedgerReader implements LedgerCatalogReader {\n constructor(private readonly market: MarketReader) {}\n\n getAssetByLedgerId(ledgerAssetId: number): AssetConfig {\n return this.market.getAssetByLedgerId(ledgerAssetId);\n }\n\n requireAssetByLedgerId(ledgerAssetId: number): AssetConfig {\n return this.getAssetByLedgerId(ledgerAssetId);\n }\n\n getAssetBySymbol(assetSymbol: string): AssetConfig | null {\n return this.market.getAssetBySymbol(assetSymbol);\n }\n\n requireAssetBySymbol(assetSymbol: string): AssetConfig {\n return requireFound(\"ledger\", \"symbol\", assetSymbol, this.getAssetBySymbol(assetSymbol));\n }\n\n getLedgerIdBySymbol(assetSymbol: string): number | null {\n return this.getAssetBySymbol(assetSymbol)?.ledgerId ?? null;\n }\n\n requireLedgerIdBySymbol(assetSymbol: string): number {\n return this.requireAssetBySymbol(assetSymbol).ledgerId;\n }\n\n requireSymbolByLedgerId(ledgerAssetId: number): string {\n return this.requireAssetByLedgerId(ledgerAssetId).symbol;\n }\n\n isKnownAssetId(ledgerAssetId: number): boolean {\n if (!Number.isInteger(ledgerAssetId) || ledgerAssetId <= 0) return false;\n if (ledgerAssetId === UNKNOWN_LEDGER_ASSET_ID) return false;\n return this.market.lookupAssetByLedgerId(ledgerAssetId) !== null;\n }\n\n decimalAmountToScaled(amount: string, asset: AssetCatalogKey): ParsedCatalogAmount {\n return ledgerAmountConverter(this.requireAsset(asset)).parse(amount);\n }\n\n normalizeAmountInput(amount: string, asset: AssetCatalogKey): string {\n return ledgerAmountConverter(this.requireAsset(asset)).normalizeInput(amount);\n }\n\n amountScaledToDecimalString(amountScaled: ScaledIntegerLike, asset: AssetCatalogKey): string {\n return ledgerAmountConverter(this.requireAsset(asset)).toDecimalString(amountScaled);\n }\n\n amountScaledToDisplayString(amountScaled: ScaledIntegerLike, asset: AssetCatalogKey): string {\n return ledgerAmountConverter(this.requireAsset(asset)).toDisplayString(amountScaled);\n }\n\n formatAmount(amount: string, asset: AssetCatalogKey): string {\n return ledgerAmountConverter(this.requireAsset(asset)).formatDecimal(amount);\n }\n\n private requireAsset(asset: AssetCatalogKey): AssetConfig {\n const key = resolveAssetKey(asset);\n const found =\n key.lookup === \"symbol\"\n ? this.getAssetBySymbol(key.value)\n : this.getAssetByLedgerId(key.value);\n return requireFound(\"ledger\", key.lookup, key.value, found);\n }\n}\n\nclass OrdersReader implements OrdersCatalogReader {\n constructor(private readonly market: MarketReader) {}\n\n getSpotOrderConstraints(pair: PairCatalogKey): SpotOrderConstraints {\n const config = this.market.requirePair(pair);\n const priceScale = PRICE_SCALE;\n const quantityScale = config.baseAsset.quantityScale;\n const quoteAmountScale = config.quoteAsset.quantityScale;\n return {\n symbolId: config.symbolId,\n symbol: config.symbol,\n status: config.status,\n tickSize: config.tickSize,\n stepSize: config.stepSize,\n minQtyBase: config.minQtyBase,\n minNotionalQuote: config.minNotionalQuote,\n maxPrice: scaledToDecimal(PROTOBUF_INT64_MAX, priceScale),\n maxQtyBase: scaledToDecimal(PROTOBUF_INT64_MAX, quantityScale),\n maxNotionalQuote: scaledToDecimal(PROTOBUF_INT64_MAX, quoteAmountScale),\n maxQuoteSlippage: scaledToDecimal(PROTOBUF_INT32_MAX, priceScale),\n priceScale,\n quantityScale,\n quoteAmountScale,\n priceDisplayDecimals: priceConverter(config).displayDecimals,\n quantityDisplayDecimals: config.baseAsset.quantityDisplayDecimals,\n quoteAmountDisplayDecimals: config.quoteAsset.quantityDisplayDecimals,\n };\n }\n\n validateSpotOrderDecimalInput(input: SpotOrderDecimalInput): CatalogValidationResult {\n const pair = this.market.requirePair(input.pair);\n const errors: CatalogValidationError[] = [];\n\n const quantityScaled = this.validateQuantity(pair, input.quantity, errors);\n const priceTicks =\n input.price === undefined ? null : this.validatePrice(pair, input.price, errors);\n\n if (quantityScaled !== null && priceTicks !== null) {\n this.validateMinNotional(pair, quantityScaled, priceTicks, errors);\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n assertSpotOrderDecimalInput(input: SpotOrderDecimalInput): void {\n const result = this.validateSpotOrderDecimalInput(input);\n if (!result.valid) throw new CatalogValidationFailedError(result.errors);\n }\n\n private validateQuantity(\n pair: EnrichedPairConfig,\n quantity: string,\n errors: CatalogValidationError[],\n ): bigint | null {\n const scale = pair.baseAsset.quantityScale;\n const parsed = tryDecimalToScaled(quantity, scale);\n if (!parsed.ok) {\n errors.push({\n field: \"quantity\",\n rule: \"parse\",\n message: conversionFailureMessage(\"quantity\", quantity, parsed.failure),\n actual: quantity,\n });\n return null;\n }\n\n if (parsed.scaled > PROTOBUF_INT64_MAX) {\n const maximum = scaledToDecimal(PROTOBUF_INT64_MAX, scale);\n errors.push({\n field: \"quantity\",\n rule: \"maxQty\",\n message: `quantity exceeds the wire-format maximum of ${maximum}`,\n expected: maximum,\n actual: quantity,\n });\n return null;\n }\n\n const step = this.requireConstraintScaled(pair.stepSize, scale, \"stepSize\");\n if (step > 0n && parsed.scaled % step !== 0n) {\n errors.push({\n field: \"quantity\",\n rule: \"stepSize\",\n message: `quantity must be a multiple of the pair step size ${pair.stepSize}`,\n expected: pair.stepSize,\n actual: quantity,\n });\n }\n\n const minQty = this.requireConstraintScaled(pair.minQtyBase, scale, \"minQtyBase\");\n if (parsed.scaled < minQty || parsed.scaled === 0n) {\n errors.push({\n field: \"quantity\",\n rule: \"minQty\",\n message: `quantity is below the pair minimum of ${pair.minQtyBase}`,\n expected: pair.minQtyBase,\n actual: quantity,\n });\n }\n\n return parsed.scaled;\n }\n\n private validatePrice(\n pair: EnrichedPairConfig,\n price: string,\n errors: CatalogValidationError[],\n ): bigint | null {\n const parsed = tryDecimalToScaled(price, PRICE_SCALE);\n if (!parsed.ok) {\n errors.push({\n field: \"price\",\n rule: \"parse\",\n message: conversionFailureMessage(\"price\", price, parsed.failure),\n actual: price,\n });\n return null;\n }\n\n if (parsed.scaled > PROTOBUF_INT64_MAX) {\n const maximum = scaledToDecimal(PROTOBUF_INT64_MAX, PRICE_SCALE);\n errors.push({\n field: \"price\",\n rule: \"maxPrice\",\n message: `price exceeds the wire-format maximum of ${maximum}`,\n expected: maximum,\n actual: price,\n });\n return null;\n }\n\n const tick = this.requireConstraintScaled(pair.tickSize, PRICE_SCALE, \"tickSize\");\n if (tick > 0n && parsed.scaled % tick !== 0n) {\n errors.push({\n field: \"price\",\n rule: \"tickSize\",\n message: `price must be a multiple of the pair tick size ${pair.tickSize}`,\n expected: pair.tickSize,\n actual: price,\n });\n }\n\n return parsed.scaled;\n }\n\n private validateMinNotional(\n pair: EnrichedPairConfig,\n quantityScaled: bigint,\n priceTicks: bigint,\n errors: CatalogValidationError[],\n ): void {\n const notionalScale = pair.baseAsset.quantityScale + PRICE_SCALE;\n const minNotional = this.requireConstraintScaled(\n pair.minNotionalQuote,\n notionalScale,\n \"minNotionalQuote\",\n );\n const notional = quantityScaled * priceTicks;\n if (notional < minNotional) {\n errors.push({\n field: \"notional\",\n rule: \"minNotional\",\n message: `order notional is below the pair minimum of ${pair.minNotionalQuote}`,\n expected: pair.minNotionalQuote,\n actual: scaledToDecimal(notional, notionalScale),\n });\n }\n }\n\n /** Pair constraint strings come from the catalog itself, so failures are data bugs. */\n private requireConstraintScaled(decimal: string, scale: number, field: string): bigint {\n const result = tryDecimalToScaled(decimal, scale);\n if (!result.ok) {\n throw new CatalogConversionError(\n field,\n conversionFailureMessage(field, decimal, result.failure),\n );\n }\n return result.scaled;\n }\n}\n\nclass ZipperReader implements ZipperCatalogReader {\n constructor(private readonly getSnapshot: SnapshotGetter) {}\n\n listChains(): readonly ZipperChainConfig[] {\n return this.getSnapshot().zipper.chains;\n }\n\n getChain(chain: ChainCatalogKey): ZipperChainConfig | null {\n const key = resolveChainKey(chain);\n return key.lookup === \"chainCode\"\n ? this.getChainByCode(key.value)\n : this.getChainById(key.value);\n }\n\n requireChain(chain: ChainCatalogKey): ZipperChainConfig {\n const key = resolveChainKey(chain);\n return requireFound(\"zipper\", key.lookup, key.value, this.getChain(chain));\n }\n\n getChainByCode(chainCode: string): ZipperChainConfig | null {\n return indexesFor(this.getSnapshot()).zipperChainByCode.get(chainCode) ?? null;\n }\n\n requireChainByCode(chainCode: string): ZipperChainConfig {\n return requireFound(\"zipper\", \"chainCode\", chainCode, this.getChainByCode(chainCode));\n }\n\n getChainById(chainId: number): ZipperChainConfig | null {\n return indexesFor(this.getSnapshot()).zipperChainById.get(chainId) ?? null;\n }\n\n requireChainById(chainId: number): ZipperChainConfig {\n return requireFound(\"zipper\", \"chainId\", chainId, this.getChainById(chainId));\n }\n\n getChainIdByCode(chainCode: string): number | null {\n return this.getChainByCode(chainCode)?.chainId ?? null;\n }\n\n requireChainIdByCode(chainCode: string): number {\n return this.requireChainByCode(chainCode).chainId;\n }\n\n listAssets(): readonly ZipperEnrichedAssetConfig[] {\n return this.getSnapshot().zipper.assets;\n }\n\n getAsset(asset: AssetCatalogKey): ZipperEnrichedAssetConfig | null {\n const key = resolveAssetKey(asset);\n return key.lookup === \"symbol\"\n ? this.getAssetBySymbol(key.value)\n : this.getAssetByLedgerId(key.value);\n }\n\n requireAsset(asset: AssetCatalogKey): ZipperEnrichedAssetConfig {\n const key = resolveAssetKey(asset);\n return requireFound(\"zipper\", key.lookup, key.value, this.getAsset(asset));\n }\n\n getAssetBySymbol(assetSymbol: string): ZipperEnrichedAssetConfig | null {\n return indexesFor(this.getSnapshot()).zipperAssetBySymbol.get(assetSymbol) ?? null;\n }\n\n requireAssetBySymbol(assetSymbol: string): ZipperEnrichedAssetConfig {\n return requireFound(\"zipper\", \"symbol\", assetSymbol, this.getAssetBySymbol(assetSymbol));\n }\n\n getAssetByLedgerId(ledgerAssetId: number): ZipperEnrichedAssetConfig {\n return resolveZipperAssetByLedgerId(ledgerAssetId, (id) => this.lookupAssetByLedgerId(id));\n }\n\n lookupAssetByLedgerId(ledgerAssetId: number): ZipperEnrichedAssetConfig | null {\n return indexesFor(this.getSnapshot()).zipperAssetByLedgerId.get(ledgerAssetId) ?? null;\n }\n\n requireAssetByLedgerId(ledgerAssetId: number): ZipperEnrichedAssetConfig {\n return this.getAssetByLedgerId(ledgerAssetId);\n }\n\n getAssetByUAssetId(uAssetId: string): ZipperEnrichedAssetConfig | null {\n return indexesFor(this.getSnapshot()).zipperAssetByUAssetId.get(uAssetId) ?? null;\n }\n\n requireAssetByUAssetId(uAssetId: string): ZipperEnrichedAssetConfig {\n return requireFound(\"zipper\", \"uAssetId\", uAssetId, this.getAssetByUAssetId(uAssetId));\n }\n\n getAssetChain(asset: AssetCatalogKey, chain: ChainCatalogKey): ZipperAssetChainRoute | null {\n const zipperAsset = this.getAsset(asset);\n const zipperChain = this.getChain(chain);\n if (!zipperAsset || !zipperChain) return null;\n const route = zipperAsset.chains.find(\n (candidate) => candidate.chainId === zipperChain.chainId,\n );\n return route ? { asset: zipperAsset, chain: route } : null;\n }\n\n requireAssetChain(asset: AssetCatalogKey, chain: ChainCatalogKey): ZipperAssetChainRoute {\n const route = this.getAssetChain(asset, chain);\n if (!route) {\n throw new CatalogLookupError(\n \"zipper\",\n \"assetChain\",\n `${formatKey(resolveAssetKey(asset))}:${formatKey(resolveChainKey(chain))}`,\n );\n }\n return route;\n }\n\n getAssetChainByZippedAssetId(zippedAssetId: number): ZipperAssetChainRoute | null {\n return indexesFor(this.getSnapshot()).zipperRouteByZippedAssetId.get(zippedAssetId) ?? null;\n }\n\n requireAssetChainByZippedAssetId(zippedAssetId: number): ZipperAssetChainRoute {\n return requireFound(\n \"zipper\",\n \"zippedAssetId\",\n zippedAssetId,\n this.getAssetChainByZippedAssetId(zippedAssetId),\n );\n }\n\n getZippedAssetId(asset: AssetCatalogKey, chain: ChainCatalogKey): number | null {\n return this.getAssetChain(asset, chain)?.chain.zippedAssetId ?? null;\n }\n\n requireZippedAssetId(asset: AssetCatalogKey, chain: ChainCatalogKey): number {\n return this.requireAssetChain(asset, chain).chain.zippedAssetId;\n }\n\n listContracts(): readonly ZipperChainContractConfig[] {\n return this.getSnapshot().zipper.contracts;\n }\n\n getContract(contractName: ZipperContractName): ZipperChainContractConfig | null {\n return this.getContractByName(contractName);\n }\n\n requireContract(contractName: ZipperContractName): ZipperChainContractConfig {\n return this.requireContractByName(contractName);\n }\n\n getContractByName(contractName: ZipperContractName): ZipperChainContractConfig | null {\n return indexesFor(this.getSnapshot()).zipperContractByName.get(contractName) ?? null;\n }\n\n requireContractByName(contractName: ZipperContractName): ZipperChainContractConfig {\n return requireFound(\n \"zipper\",\n \"contractName\",\n contractName,\n this.getContractByName(contractName),\n );\n }\n}\n\nfunction formatKey(key: { lookup: string; value: string | number }): string {\n return String(key.value);\n}\n\nclass SnapshotCatalogReader implements CatalogReader {\n readonly market: MarketCatalogReader;\n readonly ledger: LedgerCatalogReader;\n readonly orders: OrdersCatalogReader;\n readonly zipper: ZipperCatalogReader;\n readonly snapshot: () => CatalogSnapshot;\n\n constructor(getSnapshot: SnapshotGetter) {\n const market = new MarketReader(getSnapshot);\n this.market = market;\n this.ledger = new LedgerReader(market);\n this.orders = new OrdersReader(market);\n this.zipper = new ZipperReader(getSnapshot);\n this.snapshot = () => getSnapshot();\n }\n}\n\nexport function createReader(getSnapshot: () => CatalogSnapshot): CatalogReader {\n return new SnapshotCatalogReader(getSnapshot);\n}\n\nexport function createCatalogSnapshotReader(snapshot: CatalogSnapshot): CatalogReader {\n const parsed = parseCatalogSnapshot(snapshot);\n return createReader(() => parsed);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"readers.js","names":[],"sources":["../../src/catalogs/readers.ts"],"sourcesContent":["import type {\n AssetConfig,\n ZipperChainConfig,\n ZipperChainContractConfig,\n} from \"../shared/catalog-config.js\";\nimport {\n scaledToDecimal,\n scaledToDisplay,\n significantDecimalPlaces,\n tryDecimalToScaled,\n tryNormalizeDecimalInput,\n tryToScaledBigInt,\n type DecimalToScaledFailure,\n type ScaledIntegerLike,\n} from \"./decimal.js\";\nimport { indexesFor } from \"./indexes.js\";\nimport type { EnrichedPairConfig } from \"./market-data-catalog.js\";\nimport {\n resolveLedgerAssetByLedgerId,\n resolveZipperAssetByLedgerId,\n UNKNOWN_LEDGER_ASSET_ID,\n} from \"./unknown-asset.js\";\nimport type { ZipperContractName, ZipperEnrichedAssetConfig } from \"./zipper-catalog.js\";\nimport {\n CatalogConversionError,\n CatalogLookupError,\n CatalogValidationFailedError,\n type AssetCatalogKey,\n type CatalogLookupDomain,\n type CatalogReader,\n type CatalogSnapshot,\n type CatalogValidationError,\n type CatalogValidationResult,\n type ChainCatalogKey,\n type LedgerCatalogReader,\n type MarketCatalogReader,\n type OrdersCatalogReader,\n type PairCatalogKey,\n type ParsedCatalogAmount,\n type SpotOrderConstraints,\n type SpotOrderDecimalInput,\n type ZipperAssetChainRoute,\n type ZipperCatalogReader,\n} from \"./types.js\";\nimport { parseCatalogSnapshot } from \"./snapshot-validation.js\";\nimport { PROTOBUF_INT32_MAX, PROTOBUF_INT64_MAX } from \"../shared/wire-bounds.js\";\n\n/** Price ticks are always quoted at 9 decimal places. */\nexport const PRICE_SCALE = 9;\n\ntype SnapshotGetter = () => CatalogSnapshot;\n\nfunction isListed(pair: EnrichedPairConfig, nowMs: number): boolean {\n if (pair.listingAt === null || pair.listingAt > nowMs) return false;\n if (pair.status === \"disabled\") return false;\n if (pair.delistingAt !== null && pair.delistingAt < nowMs) return false;\n return true;\n}\n\nfunction isEverListed(pair: EnrichedPairConfig, nowMs: number): boolean {\n return pair.listingAt !== null && pair.listingAt < nowMs;\n}\n\nfunction requireFound<T>(\n domain: CatalogLookupDomain,\n lookup: string,\n value: string | number,\n found: T | null,\n): T {\n if (found === null) throw new CatalogLookupError(domain, lookup, value);\n return found;\n}\n\ntype ResolvedKey<TByName extends string, TById extends string> =\n | { lookup: TByName; value: string }\n | { lookup: TById; value: number };\n\nfunction resolvePairKey(key: PairCatalogKey): ResolvedKey<\"symbol\", \"symbolId\"> {\n if (typeof key === \"string\") return { lookup: \"symbol\", value: key };\n if (typeof key === \"number\") return { lookup: \"symbolId\", value: key };\n if (\"symbol\" in key) return { lookup: \"symbol\", value: key.symbol };\n return { lookup: \"symbolId\", value: key.symbolId };\n}\n\nfunction resolveAssetKey(key: AssetCatalogKey): ResolvedKey<\"symbol\", \"ledgerId\"> {\n if (typeof key === \"string\") return { lookup: \"symbol\", value: key };\n if (typeof key === \"number\") return { lookup: \"ledgerId\", value: key };\n if (\"symbol\" in key) return { lookup: \"symbol\", value: key.symbol };\n return { lookup: \"ledgerId\", value: key.ledgerId };\n}\n\nfunction resolveChainKey(key: ChainCatalogKey): ResolvedKey<\"chainCode\", \"chainId\"> {\n if (typeof key === \"string\") return { lookup: \"chainCode\", value: key };\n if (typeof key === \"number\") return { lookup: \"chainId\", value: key };\n if (\"code\" in key) return { lookup: \"chainCode\", value: key.code };\n return { lookup: \"chainId\", value: key.chainId };\n}\n\nfunction conversionFailureMessage(\n field: string,\n value: string,\n failure: DecimalToScaledFailure,\n): string {\n return failure.reason === \"precision\"\n ? `${field} supports at most ${failure.maxDecimals} decimal places: ${value}`\n : `${field} must be a non-negative decimal number: ${value}`;\n}\n\n/** Shared conversion core used by the market and ledger readers. */\nclass DecimalConverter {\n constructor(\n readonly field: string,\n readonly scale: number,\n readonly displayDecimals: number,\n ) {}\n\n parse(decimal: string): ParsedCatalogAmount {\n const result = tryDecimalToScaled(decimal, this.scale);\n if (!result.ok) {\n throw new CatalogConversionError(\n this.field,\n conversionFailureMessage(this.field, decimal, result.failure),\n );\n }\n return {\n scaledValue: result.scaled.toString(),\n decimal: scaledToDecimal(result.scaled, this.scale),\n display: scaledToDisplay(result.scaled, this.scale, this.displayDecimals),\n scale: this.scale,\n };\n }\n\n normalizeInput(raw: string): string {\n const normalized = tryNormalizeDecimalInput(raw, this.scale);\n if (normalized === null) {\n throw new CatalogConversionError(\n this.field,\n `${this.field} must be a non-negative decimal number: ${raw}`,\n );\n }\n return normalized;\n }\n\n toDecimalString(scaled: ScaledIntegerLike): string {\n return scaledToDecimal(this.toBigInt(scaled), this.scale);\n }\n\n toDisplayString(scaled: ScaledIntegerLike): string {\n return scaledToDisplay(this.toBigInt(scaled), this.scale, this.displayDecimals);\n }\n\n formatDecimal(decimal: string): string {\n const result = tryDecimalToScaled(decimal.trim(), this.scale);\n if (!result.ok) {\n throw new CatalogConversionError(\n this.field,\n conversionFailureMessage(this.field, decimal, result.failure),\n );\n }\n return scaledToDisplay(result.scaled, this.scale, this.displayDecimals);\n }\n\n private toBigInt(scaled: ScaledIntegerLike): bigint {\n const value = tryToScaledBigInt(scaled);\n if (value === null) {\n throw new CatalogConversionError(\n this.field,\n `${this.field} must be a raw scaled integer: ${String(scaled)}`,\n );\n }\n return value;\n }\n}\n\nfunction priceConverter(pair: EnrichedPairConfig): DecimalConverter {\n const tickDecimals = significantDecimalPlaces(pair.tickSize);\n const displayDecimals = tickDecimals > 0 ? tickDecimals : PRICE_SCALE;\n return new DecimalConverter(\"price\", PRICE_SCALE, displayDecimals);\n}\n\nfunction quantityConverter(pair: EnrichedPairConfig): DecimalConverter {\n return new DecimalConverter(\n \"quantity\",\n pair.baseAsset.quantityScale,\n pair.baseAsset.quantityDisplayDecimals,\n );\n}\n\nfunction quoteAmountConverter(pair: EnrichedPairConfig): DecimalConverter {\n return new DecimalConverter(\n \"quoteAmount\",\n pair.quoteAsset.quantityScale,\n pair.quoteAsset.quantityDisplayDecimals,\n );\n}\n\nfunction ledgerAmountConverter(asset: AssetConfig): DecimalConverter {\n return new DecimalConverter(\"amount\", asset.quantityScale, asset.quantityDisplayDecimals);\n}\n\nclass MarketReader implements MarketCatalogReader {\n constructor(private readonly getSnapshot: SnapshotGetter) {}\n\n listAssets(): readonly AssetConfig[] {\n return this.getSnapshot().market.assets;\n }\n\n getAsset(asset: AssetCatalogKey): AssetConfig | null {\n const key = resolveAssetKey(asset);\n return key.lookup === \"symbol\"\n ? this.getAssetBySymbol(key.value)\n : this.getAssetByLedgerId(key.value);\n }\n\n requireAsset(asset: AssetCatalogKey): AssetConfig {\n const key = resolveAssetKey(asset);\n return requireFound(\"market\", key.lookup, key.value, this.getAsset(asset));\n }\n\n getAssetBySymbol(assetSymbol: string): AssetConfig | null {\n return indexesFor(this.getSnapshot()).assetBySymbol.get(assetSymbol) ?? null;\n }\n\n requireAssetBySymbol(assetSymbol: string): AssetConfig {\n return requireFound(\"market\", \"symbol\", assetSymbol, this.getAssetBySymbol(assetSymbol));\n }\n\n getAssetByLedgerId(ledgerAssetId: number): AssetConfig {\n return resolveLedgerAssetByLedgerId(ledgerAssetId, (id) => this.lookupAssetByLedgerId(id));\n }\n\n lookupAssetByLedgerId(ledgerAssetId: number): AssetConfig | null {\n return indexesFor(this.getSnapshot()).assetByLedgerId.get(ledgerAssetId) ?? null;\n }\n\n requireAssetByLedgerId(ledgerAssetId: number): AssetConfig {\n return this.getAssetByLedgerId(ledgerAssetId);\n }\n\n listPairs(filter?: {\n listed?: boolean;\n everListed?: boolean;\n atMs?: number;\n }): readonly EnrichedPairConfig[] {\n const pairs = this.getSnapshot().market.pairs;\n if (!filter) return pairs;\n const nowMs = filter.atMs ?? Date.now();\n return pairs.filter((pair) => {\n if (filter.listed !== undefined && isListed(pair, nowMs) !== filter.listed)\n return false;\n if (filter.everListed !== undefined && isEverListed(pair, nowMs) !== filter.everListed)\n return false;\n return true;\n });\n }\n\n getPair(pair: PairCatalogKey): EnrichedPairConfig | null {\n const key = resolvePairKey(pair);\n return key.lookup === \"symbol\"\n ? this.getPairBySymbol(key.value)\n : this.getPairBySymbolId(key.value);\n }\n\n requirePair(pair: PairCatalogKey): EnrichedPairConfig {\n const key = resolvePairKey(pair);\n return requireFound(\"market\", key.lookup, key.value, this.getPair(pair));\n }\n\n getPairBySymbol(pairSymbol: string): EnrichedPairConfig | null {\n return indexesFor(this.getSnapshot()).pairBySymbol.get(pairSymbol) ?? null;\n }\n\n requirePairBySymbol(pairSymbol: string): EnrichedPairConfig {\n return requireFound(\"market\", \"symbol\", pairSymbol, this.getPairBySymbol(pairSymbol));\n }\n\n getPairBySymbolId(pairSymbolId: number): EnrichedPairConfig | null {\n return indexesFor(this.getSnapshot()).pairBySymbolId.get(pairSymbolId) ?? null;\n }\n\n requirePairBySymbolId(pairSymbolId: number): EnrichedPairConfig {\n return requireFound(\n \"market\",\n \"symbolId\",\n pairSymbolId,\n this.getPairBySymbolId(pairSymbolId),\n );\n }\n\n getSymbolIdByPairSymbol(pairSymbol: string): number | null {\n return this.getPairBySymbol(pairSymbol)?.symbolId ?? null;\n }\n\n requireSymbolIdByPairSymbol(pairSymbol: string): number {\n return this.requirePairBySymbol(pairSymbol).symbolId;\n }\n\n getPairSymbolBySymbolId(pairSymbolId: number): string | null {\n return this.getPairBySymbolId(pairSymbolId)?.symbol ?? null;\n }\n\n requirePairSymbolBySymbolId(pairSymbolId: number): string {\n return this.requirePairBySymbolId(pairSymbolId).symbol;\n }\n\n decimalPriceToTicks(price: string, pair: PairCatalogKey): ParsedCatalogAmount {\n return priceConverter(this.requirePair(pair)).parse(price);\n }\n\n normalizePriceInput(price: string, pair: PairCatalogKey): string {\n return priceConverter(this.requirePair(pair)).normalizeInput(price);\n }\n\n priceTicksToDecimalString(priceTicks: ScaledIntegerLike, pair: PairCatalogKey): string {\n return priceConverter(this.requirePair(pair)).toDecimalString(priceTicks);\n }\n\n priceTicksToDisplayString(priceTicks: ScaledIntegerLike, pair: PairCatalogKey): string {\n return priceConverter(this.requirePair(pair)).toDisplayString(priceTicks);\n }\n\n formatPrice(price: string, pair: PairCatalogKey): string {\n return priceConverter(this.requirePair(pair)).formatDecimal(price);\n }\n\n decimalQuantityToScaled(quantity: string, pair: PairCatalogKey): ParsedCatalogAmount {\n return quantityConverter(this.requirePair(pair)).parse(quantity);\n }\n\n normalizeQuantityInput(quantity: string, pair: PairCatalogKey): string {\n return quantityConverter(this.requirePair(pair)).normalizeInput(quantity);\n }\n\n quantityScaledToDecimalString(quantityScaled: ScaledIntegerLike, pair: PairCatalogKey): string {\n return quantityConverter(this.requirePair(pair)).toDecimalString(quantityScaled);\n }\n\n quantityScaledToDisplayString(quantityScaled: ScaledIntegerLike, pair: PairCatalogKey): string {\n return quantityConverter(this.requirePair(pair)).toDisplayString(quantityScaled);\n }\n\n formatQuantity(quantity: string, pair: PairCatalogKey): string {\n return quantityConverter(this.requirePair(pair)).formatDecimal(quantity);\n }\n\n decimalQuoteAmountToScaled(amount: string, pair: PairCatalogKey): ParsedCatalogAmount {\n return quoteAmountConverter(this.requirePair(pair)).parse(amount);\n }\n\n normalizeQuoteAmountInput(amount: string, pair: PairCatalogKey): string {\n return quoteAmountConverter(this.requirePair(pair)).normalizeInput(amount);\n }\n\n quoteAmountScaledToDecimalString(\n amountScaled: ScaledIntegerLike,\n pair: PairCatalogKey,\n ): string {\n return quoteAmountConverter(this.requirePair(pair)).toDecimalString(amountScaled);\n }\n\n quoteAmountScaledToDisplayString(\n amountScaled: ScaledIntegerLike,\n pair: PairCatalogKey,\n ): string {\n return quoteAmountConverter(this.requirePair(pair)).toDisplayString(amountScaled);\n }\n\n formatQuoteAmount(amount: string, pair: PairCatalogKey): string {\n return quoteAmountConverter(this.requirePair(pair)).formatDecimal(amount);\n }\n}\n\nclass LedgerReader implements LedgerCatalogReader {\n constructor(private readonly market: MarketReader) {}\n\n getAssetByLedgerId(ledgerAssetId: number): AssetConfig {\n return this.market.getAssetByLedgerId(ledgerAssetId);\n }\n\n requireAssetByLedgerId(ledgerAssetId: number): AssetConfig {\n return this.getAssetByLedgerId(ledgerAssetId);\n }\n\n getAssetBySymbol(assetSymbol: string): AssetConfig | null {\n return this.market.getAssetBySymbol(assetSymbol);\n }\n\n requireAssetBySymbol(assetSymbol: string): AssetConfig {\n return requireFound(\"ledger\", \"symbol\", assetSymbol, this.getAssetBySymbol(assetSymbol));\n }\n\n getLedgerIdBySymbol(assetSymbol: string): number | null {\n return this.getAssetBySymbol(assetSymbol)?.ledgerId ?? null;\n }\n\n requireLedgerIdBySymbol(assetSymbol: string): number {\n return this.requireAssetBySymbol(assetSymbol).ledgerId;\n }\n\n requireSymbolByLedgerId(ledgerAssetId: number): string {\n return this.requireAssetByLedgerId(ledgerAssetId).symbol;\n }\n\n isKnownAssetId(ledgerAssetId: number): boolean {\n if (!Number.isInteger(ledgerAssetId) || ledgerAssetId <= 0) return false;\n if (ledgerAssetId === UNKNOWN_LEDGER_ASSET_ID) return false;\n return this.market.lookupAssetByLedgerId(ledgerAssetId) !== null;\n }\n\n decimalAmountToScaled(amount: string, asset: AssetCatalogKey): ParsedCatalogAmount {\n return ledgerAmountConverter(this.requireAsset(asset)).parse(amount);\n }\n\n normalizeAmountInput(amount: string, asset: AssetCatalogKey): string {\n return ledgerAmountConverter(this.requireAsset(asset)).normalizeInput(amount);\n }\n\n amountScaledToDecimalString(amountScaled: ScaledIntegerLike, asset: AssetCatalogKey): string {\n return ledgerAmountConverter(this.requireAsset(asset)).toDecimalString(amountScaled);\n }\n\n amountScaledToDisplayString(amountScaled: ScaledIntegerLike, asset: AssetCatalogKey): string {\n return ledgerAmountConverter(this.requireAsset(asset)).toDisplayString(amountScaled);\n }\n\n formatAmount(amount: string, asset: AssetCatalogKey): string {\n return ledgerAmountConverter(this.requireAsset(asset)).formatDecimal(amount);\n }\n\n private requireAsset(asset: AssetCatalogKey): AssetConfig {\n const key = resolveAssetKey(asset);\n const found =\n key.lookup === \"symbol\"\n ? this.getAssetBySymbol(key.value)\n : this.getAssetByLedgerId(key.value);\n return requireFound(\"ledger\", key.lookup, key.value, found);\n }\n}\n\nclass OrdersReader implements OrdersCatalogReader {\n constructor(private readonly market: MarketReader) {}\n\n getSpotOrderConstraints(pair: PairCatalogKey): SpotOrderConstraints {\n const config = this.market.requirePair(pair);\n const priceScale = PRICE_SCALE;\n const quantityScale = config.baseAsset.quantityScale;\n const quoteAmountScale = config.quoteAsset.quantityScale;\n return {\n symbolId: config.symbolId,\n symbol: config.symbol,\n status: config.status,\n tickSize: config.tickSize,\n stepSize: config.stepSize,\n minQtyBase: config.minQtyBase,\n minNotionalQuote: config.minNotionalQuote,\n maxPrice: scaledToDecimal(PROTOBUF_INT64_MAX, priceScale),\n maxQtyBase: scaledToDecimal(PROTOBUF_INT64_MAX, quantityScale),\n maxNotionalQuote: scaledToDecimal(PROTOBUF_INT64_MAX, quoteAmountScale),\n maxQuoteSlippage: scaledToDecimal(PROTOBUF_INT32_MAX, priceScale),\n priceScale,\n quantityScale,\n quoteAmountScale,\n priceDisplayDecimals: priceConverter(config).displayDecimals,\n quantityDisplayDecimals: config.baseAsset.quantityDisplayDecimals,\n quoteAmountDisplayDecimals: config.quoteAsset.quantityDisplayDecimals,\n };\n }\n\n validateSpotOrderDecimalInput(input: SpotOrderDecimalInput): CatalogValidationResult {\n const pair = this.market.requirePair(input.pair);\n const errors: CatalogValidationError[] = [];\n\n const quantityScaled = this.validateQuantity(pair, input.quantity, errors);\n const priceTicks =\n input.price === undefined ? null : this.validatePrice(pair, input.price, errors);\n\n if (quantityScaled !== null && priceTicks !== null) {\n this.validateMinNotional(pair, quantityScaled, priceTicks, errors);\n }\n\n return { valid: errors.length === 0, errors };\n }\n\n assertSpotOrderDecimalInput(input: SpotOrderDecimalInput): void {\n const result = this.validateSpotOrderDecimalInput(input);\n if (!result.valid) throw new CatalogValidationFailedError(result.errors);\n }\n\n private validateQuantity(\n pair: EnrichedPairConfig,\n quantity: string,\n errors: CatalogValidationError[],\n ): bigint | null {\n const scale = pair.baseAsset.quantityScale;\n const parsed = tryDecimalToScaled(quantity, scale);\n if (!parsed.ok) {\n errors.push({\n field: \"quantity\",\n rule: \"parse\",\n message: conversionFailureMessage(\"quantity\", quantity, parsed.failure),\n actual: quantity,\n });\n return null;\n }\n\n if (parsed.scaled > PROTOBUF_INT64_MAX) {\n const maximum = scaledToDecimal(PROTOBUF_INT64_MAX, scale);\n errors.push({\n field: \"quantity\",\n rule: \"maxQty\",\n message: `quantity exceeds the wire-format maximum of ${maximum}`,\n expected: maximum,\n actual: quantity,\n });\n return null;\n }\n\n const step = this.requireConstraintScaled(pair.stepSize, scale, \"stepSize\");\n if (step > 0n && parsed.scaled % step !== 0n) {\n errors.push({\n field: \"quantity\",\n rule: \"stepSize\",\n message: `quantity must be a multiple of the pair step size ${pair.stepSize}`,\n expected: pair.stepSize,\n actual: quantity,\n });\n }\n\n const minQty = this.requireConstraintScaled(pair.minQtyBase, scale, \"minQtyBase\");\n if (parsed.scaled < minQty || parsed.scaled === 0n) {\n errors.push({\n field: \"quantity\",\n rule: \"minQty\",\n message: `quantity is below the pair minimum of ${pair.minQtyBase}`,\n expected: pair.minQtyBase,\n actual: quantity,\n });\n }\n\n return parsed.scaled;\n }\n\n private validatePrice(\n pair: EnrichedPairConfig,\n price: string,\n errors: CatalogValidationError[],\n ): bigint | null {\n const parsed = tryDecimalToScaled(price, PRICE_SCALE);\n if (!parsed.ok) {\n errors.push({\n field: \"price\",\n rule: \"parse\",\n message: conversionFailureMessage(\"price\", price, parsed.failure),\n actual: price,\n });\n return null;\n }\n\n if (parsed.scaled > PROTOBUF_INT64_MAX) {\n const maximum = scaledToDecimal(PROTOBUF_INT64_MAX, PRICE_SCALE);\n errors.push({\n field: \"price\",\n rule: \"maxPrice\",\n message: `price exceeds the wire-format maximum of ${maximum}`,\n expected: maximum,\n actual: price,\n });\n return null;\n }\n\n const tick = this.requireConstraintScaled(pair.tickSize, PRICE_SCALE, \"tickSize\");\n if (tick > 0n && parsed.scaled % tick !== 0n) {\n errors.push({\n field: \"price\",\n rule: \"tickSize\",\n message: `price must be a multiple of the pair tick size ${pair.tickSize}`,\n expected: pair.tickSize,\n actual: price,\n });\n }\n\n return parsed.scaled;\n }\n\n private validateMinNotional(\n pair: EnrichedPairConfig,\n quantityScaled: bigint,\n priceTicks: bigint,\n errors: CatalogValidationError[],\n ): void {\n const notionalScale = pair.baseAsset.quantityScale + PRICE_SCALE;\n const minNotional = this.requireConstraintScaled(\n pair.minNotionalQuote,\n notionalScale,\n \"minNotionalQuote\",\n );\n const notional = quantityScaled * priceTicks;\n if (notional < minNotional) {\n errors.push({\n field: \"notional\",\n rule: \"minNotional\",\n message: `order notional is below the pair minimum of ${pair.minNotionalQuote}`,\n expected: pair.minNotionalQuote,\n actual: scaledToDecimal(notional, notionalScale),\n });\n }\n }\n\n /** Pair constraint strings come from the catalog itself, so failures are data bugs. */\n private requireConstraintScaled(decimal: string, scale: number, field: string): bigint {\n const result = tryDecimalToScaled(decimal, scale);\n if (!result.ok) {\n throw new CatalogConversionError(\n field,\n conversionFailureMessage(field, decimal, result.failure),\n );\n }\n return result.scaled;\n }\n}\n\nclass ZipperReader implements ZipperCatalogReader {\n constructor(private readonly getSnapshot: SnapshotGetter) {}\n\n listChains(): readonly ZipperChainConfig[] {\n return this.getSnapshot().zipper.chains;\n }\n\n getChain(chain: ChainCatalogKey): ZipperChainConfig | null {\n const key = resolveChainKey(chain);\n return key.lookup === \"chainCode\"\n ? this.getChainByCode(key.value)\n : this.getChainById(key.value);\n }\n\n requireChain(chain: ChainCatalogKey): ZipperChainConfig {\n const key = resolveChainKey(chain);\n return requireFound(\"zipper\", key.lookup, key.value, this.getChain(chain));\n }\n\n getChainByCode(chainCode: string): ZipperChainConfig | null {\n return indexesFor(this.getSnapshot()).zipperChainByCode.get(chainCode) ?? null;\n }\n\n requireChainByCode(chainCode: string): ZipperChainConfig {\n return requireFound(\"zipper\", \"chainCode\", chainCode, this.getChainByCode(chainCode));\n }\n\n getChainById(chainId: number): ZipperChainConfig | null {\n return indexesFor(this.getSnapshot()).zipperChainById.get(chainId) ?? null;\n }\n\n requireChainById(chainId: number): ZipperChainConfig {\n return requireFound(\"zipper\", \"chainId\", chainId, this.getChainById(chainId));\n }\n\n getChainIdByCode(chainCode: string): number | null {\n return this.getChainByCode(chainCode)?.chainId ?? null;\n }\n\n requireChainIdByCode(chainCode: string): number {\n return this.requireChainByCode(chainCode).chainId;\n }\n\n listAssets(): readonly ZipperEnrichedAssetConfig[] {\n return this.getSnapshot().zipper.assets;\n }\n\n getAsset(asset: AssetCatalogKey): ZipperEnrichedAssetConfig | null {\n const key = resolveAssetKey(asset);\n return key.lookup === \"symbol\"\n ? this.getAssetBySymbol(key.value)\n : this.getAssetByLedgerId(key.value);\n }\n\n requireAsset(asset: AssetCatalogKey): ZipperEnrichedAssetConfig {\n const key = resolveAssetKey(asset);\n return requireFound(\"zipper\", key.lookup, key.value, this.getAsset(asset));\n }\n\n getAssetBySymbol(assetSymbol: string): ZipperEnrichedAssetConfig | null {\n return indexesFor(this.getSnapshot()).zipperAssetBySymbol.get(assetSymbol) ?? null;\n }\n\n requireAssetBySymbol(assetSymbol: string): ZipperEnrichedAssetConfig {\n return requireFound(\"zipper\", \"symbol\", assetSymbol, this.getAssetBySymbol(assetSymbol));\n }\n\n getAssetByLedgerId(ledgerAssetId: number): ZipperEnrichedAssetConfig {\n return resolveZipperAssetByLedgerId(ledgerAssetId, (id) => this.lookupAssetByLedgerId(id));\n }\n\n lookupAssetByLedgerId(ledgerAssetId: number): ZipperEnrichedAssetConfig | null {\n return indexesFor(this.getSnapshot()).zipperAssetByLedgerId.get(ledgerAssetId) ?? null;\n }\n\n requireAssetByLedgerId(ledgerAssetId: number): ZipperEnrichedAssetConfig {\n return this.getAssetByLedgerId(ledgerAssetId);\n }\n\n getAssetByUAssetId(uAssetId: string): ZipperEnrichedAssetConfig | null {\n return indexesFor(this.getSnapshot()).zipperAssetByUAssetId.get(uAssetId) ?? null;\n }\n\n requireAssetByUAssetId(uAssetId: string): ZipperEnrichedAssetConfig {\n return requireFound(\"zipper\", \"uAssetId\", uAssetId, this.getAssetByUAssetId(uAssetId));\n }\n\n getAssetChain(asset: AssetCatalogKey, chain: ChainCatalogKey): ZipperAssetChainRoute | null {\n const zipperAsset = this.getAsset(asset);\n const zipperChain = this.getChain(chain);\n if (!zipperAsset || !zipperChain) return null;\n const route = zipperAsset.chains.find(\n (candidate) => candidate.chainId === zipperChain.chainId,\n );\n return route ? { asset: zipperAsset, chain: route } : null;\n }\n\n requireAssetChain(asset: AssetCatalogKey, chain: ChainCatalogKey): ZipperAssetChainRoute {\n const route = this.getAssetChain(asset, chain);\n if (!route) {\n throw new CatalogLookupError(\n \"zipper\",\n \"assetChain\",\n `${formatKey(resolveAssetKey(asset))}:${formatKey(resolveChainKey(chain))}`,\n );\n }\n return route;\n }\n\n getAssetChainByZippedAssetId(zippedAssetId: number): ZipperAssetChainRoute | null {\n return indexesFor(this.getSnapshot()).zipperRouteByZippedAssetId.get(zippedAssetId) ?? null;\n }\n\n requireAssetChainByZippedAssetId(zippedAssetId: number): ZipperAssetChainRoute {\n return requireFound(\n \"zipper\",\n \"zippedAssetId\",\n zippedAssetId,\n this.getAssetChainByZippedAssetId(zippedAssetId),\n );\n }\n\n getZippedAssetId(asset: AssetCatalogKey, chain: ChainCatalogKey): number | null {\n return this.getAssetChain(asset, chain)?.chain.zippedAssetId ?? null;\n }\n\n requireZippedAssetId(asset: AssetCatalogKey, chain: ChainCatalogKey): number {\n return this.requireAssetChain(asset, chain).chain.zippedAssetId;\n }\n\n listContracts(): readonly ZipperChainContractConfig[] {\n return this.getSnapshot().zipper.contracts;\n }\n\n getContract(contractName: ZipperContractName): ZipperChainContractConfig | null {\n return this.getContractByName(contractName);\n }\n\n requireContract(contractName: ZipperContractName): ZipperChainContractConfig {\n return this.requireContractByName(contractName);\n }\n\n getContractByName(contractName: ZipperContractName): ZipperChainContractConfig | null {\n return indexesFor(this.getSnapshot()).zipperContractByName.get(contractName) ?? null;\n }\n\n requireContractByName(contractName: ZipperContractName): ZipperChainContractConfig {\n return requireFound(\n \"zipper\",\n \"contractName\",\n contractName,\n this.getContractByName(contractName),\n );\n }\n}\n\nfunction formatKey(key: { lookup: string; value: string | number }): string {\n return String(key.value);\n}\n\nclass SnapshotCatalogReader implements CatalogReader {\n readonly market: MarketCatalogReader;\n readonly ledger: LedgerCatalogReader;\n readonly orders: OrdersCatalogReader;\n readonly zipper: ZipperCatalogReader;\n readonly snapshot: () => CatalogSnapshot;\n\n constructor(getSnapshot: SnapshotGetter) {\n const market = new MarketReader(getSnapshot);\n this.market = market;\n this.ledger = new LedgerReader(market);\n this.orders = new OrdersReader(market);\n this.zipper = new ZipperReader(getSnapshot);\n this.snapshot = () => getSnapshot();\n }\n}\n\nexport function createReader(getSnapshot: () => CatalogSnapshot): CatalogReader {\n return new SnapshotCatalogReader(getSnapshot);\n}\n\nexport function createCatalogSnapshotReader(snapshot: CatalogSnapshot): CatalogReader {\n const parsed = parseCatalogSnapshot(snapshot);\n return createReader(() => parsed);\n}\n"],"mappings":"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"}
@@ -439,7 +439,7 @@ type GetEquityHistorySeriesResponse = Message<"ledger.read.v1.GetEquityHistorySe
439
439
  */
440
440
  series: EquitySeries[];
441
441
  /**
442
- * BTC-USDT close price at each timestamp, scaled by 1e6 (same as price_ticks).
442
+ * BTC-USDT close price at each timestamp, scaled by 1e9 (same as price_ticks).
443
443
  * Enables client-side conversion to BTC denomination without refetch.
444
444
  *
445
445
  * @generated from field: repeated int64 btc_prices_q = 10;
@@ -519,7 +519,7 @@ type GetPortfolioEquityHistorySeriesResponse = Message<"ledger.read.v1.GetPortfo
519
519
  */
520
520
  series: EquitySeries[];
521
521
  /**
522
- * BTC-USDT close price at each timestamp, scaled by 1e6 (same as price_ticks).
522
+ * BTC-USDT close price at each timestamp, scaled by 1e9 (same as price_ticks).
523
523
  * Enables client-side conversion to BTC denomination without refetch.
524
524
  *
525
525
  * @generated from field: repeated int64 btc_prices_q = 8;
@@ -638,7 +638,7 @@ type GetPortfolioEquitySnapshotResponse = Message<"ledger.read.v1.GetPortfolioEq
638
638
  */
639
639
  assets: PortfolioAssetEquity[];
640
640
  /**
641
- * Current BTC-USDT price scaled by 1e6. Zero when unavailable.
641
+ * Current BTC-USDT price scaled by 1e9. Zero when unavailable.
642
642
  *
643
643
  * @generated from field: int64 btc_price_q = 5;
644
644
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ledger_read_pb.js","names":[],"sources":["../../../../../src/gen/ledger/read/v1/ledger_read_pb.ts"],"sourcesContent":["// @generated by protoc-gen-es v2.13.0 with parameter \"target=ts,import_extension=js\"\n// @generated from file ledger/read/v1/ledger_read.proto (package ledger.read.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenEnum, GenFile, GenMessage, GenService } from \"@bufbuild/protobuf/codegenv2\";\nimport { enumDesc, fileDesc, messageDesc, serviceDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { AccountCode, TransferCode } from \"../../v1/catalog_pb.js\";\nimport { file_ledger_v1_catalog } from \"../../v1/catalog_pb.js\";\nimport { file_polyester_api_options } from \"../../../polyester/api/options_pb.js\";\nimport type { U128 } from \"../../../polyester/type/v1/u128_pb.js\";\nimport { file_polyester_type_v1_u128 } from \"../../../polyester/type/v1/u128_pb.js\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file ledger/read/v1/ledger_read.proto.\n */\nexport const file_ledger_read_v1_ledger_read: GenFile = /*@__PURE__*/\n fileDesc(\"CiBsZWRnZXIvcmVhZC92MS9sZWRnZXJfcmVhZC5wcm90bxIObGVkZ2VyLnJlYWQudjEiQgoSR2V0QmFsYW5jZXNSZXF1ZXN0EhoKDXN1YmFjY291bnRfaWQYASABKAZIAIgBAUIQCg5fc3ViYWNjb3VudF9pZCL/AQoMQXNzZXRCYWxhbmNlEhAKCGFzc2V0X2lkGAEgASgNEigKB3RyYWRpbmcYAiABKAsyFy5wb2x5ZXN0ZXIudHlwZS52MS5VMTI4EigKB2Z1bmRpbmcYAyABKAsyFy5wb2x5ZXN0ZXIudHlwZS52MS5VMTI4EikKCHJlc2VydmVkGAQgASgLMhcucG9seWVzdGVyLnR5cGUudjEuVTEyOBIqCglhdmFpbGFibGUYBSABKAsyFy5wb2x5ZXN0ZXIudHlwZS52MS5VMTI4EhgKEHRyYWRpbmdfcmV2aXNpb24YBiABKAQSGAoQZnVuZGluZ19yZXZpc2lvbhgHIAEoBCJFChNHZXRCYWxhbmNlc1Jlc3BvbnNlEi4KCGJhbGFuY2VzGAEgAygLMhwubGVkZ2VyLnJlYWQudjEuQXNzZXRCYWxhbmNlIrYBChhHZXRCYWxhbmNlSGlzdG9yeVJlcXVlc3QSGgoNc3ViYWNjb3VudF9pZBgBIAEoBkgAiAEBEi0KBXJhbmdlGAIgASgOMhwubGVkZ2VyLnJlYWQudjEuQmFsYW5jZVJhbmdlQgASDgoGbGVkZ2VyGAMgASgNEi0KDWFjY291bnRfY29kZXMYBCADKA4yFi5sZWRnZXIudjEuQWNjb3VudENvZGVCEAoOX3N1YmFjY291bnRfaWQiYgoNQmFsYW5jZVNlcmllcxIQCghhc3NldF9pZBgBIAEoDRIsCgxhY2NvdW50X2NvZGUYAiABKA4yFi5sZWRnZXIudjEuQWNjb3VudENvZGUSEQoJYmFsYW5jZV9xGAMgAygEIsEBChlHZXRCYWxhbmNlSGlzdG9yeVJlc3BvbnNlEisKBXJhbmdlGAEgASgOMhwubGVkZ2VyLnJlYWQudjEuQmFsYW5jZVJhbmdlEg4KBmJ1Y2tldBgCIAEoCRIUCgxzdGFydF90c19zZWMYAyABKAcSEgoKZW5kX3RzX3NlYxgEIAEoBxIOCgZwb2ludHMYBSABKA0SLQoGc2VyaWVzGAYgAygLMh0ubGVkZ2VyLnJlYWQudjEuQmFsYW5jZVNlcmllcyI1Cg9BY2NvdW50R3JvdXBpbmcSFAoMYWNjb3VudF9jb2RlGAEgASgNEgwKBG5hbWUYAiABKAkiKwoNQXNzZXRHcm91cGluZxIKCgJpZBgBIAEoDRIOCgZzeW1ib2wYAiABKAkiVQoYUG9ydGZvbGlvQWNjb3VudEdyb3VwaW5nEhcKCmFjY291bnRfaWQYASABKAZIAIgBARIRCglyZW1haW5pbmcYAiABKAhCDQoLX2FjY291bnRfaWQi3AEKHUdldEVxdWl0eUhpc3RvcnlTZXJpZXNSZXF1ZXN0EhoKDXN1YmFjY291bnRfaWQYASABKAZIAIgBARItCgVyYW5nZRgCIAEoDjIcLmxlZGdlci5yZWFkLnYxLkJhbGFuY2VSYW5nZUIAEi0KDWFjY291bnRfY29kZXMYBCADKA4yFi5sZWRnZXIudjEuQWNjb3VudENvZGUSLwoIZ3JvdXBfYnkYBSABKA4yHS5sZWRnZXIucmVhZC52MS5FcXVpdHlHcm91cEJ5QhAKDl9zdWJhY2NvdW50X2lkItcBCgxFcXVpdHlTZXJpZXMSMgoHYWNjb3VudBgBIAEoCzIfLmxlZGdlci5yZWFkLnYxLkFjY291bnRHcm91cGluZ0gAEi4KBWFzc2V0GAMgASgLMh0ubGVkZ2VyLnJlYWQudjEuQXNzZXRHcm91cGluZ0gAEkUKEXBvcnRmb2xpb19hY2NvdW50GAQgASgLMigubGVkZ2VyLnJlYWQudjEuUG9ydGZvbGlvQWNjb3VudEdyb3VwaW5nSAASEAoIZXF1aXR5X3EYAiADKBJCCgoIZ3JvdXBpbmci8AEKHkdldEVxdWl0eUhpc3RvcnlTZXJpZXNSZXNwb25zZRIrCgVyYW5nZRgBIAEoDjIcLmxlZGdlci5yZWFkLnYxLkJhbGFuY2VSYW5nZRIOCgZidWNrZXQYAiABKAkSFAoMc3RhcnRfdHNfc2VjGAMgASgHEhIKCmVuZF90c19zZWMYBCABKAcSEwoLcXVvdGVfYXNzZXQYBiABKAkSDgoGcG9pbnRzGAcgASgNEiwKBnNlcmllcxgIIAMoCzIcLmxlZGdlci5yZWFkLnYxLkVxdWl0eVNlcmllcxIUCgxidGNfcHJpY2VzX3EYCiADKAMiVwomR2V0UG9ydGZvbGlvRXF1aXR5SGlzdG9yeVNlcmllc1JlcXVlc3QSLQoFcmFuZ2UYASABKA4yHC5sZWRnZXIucmVhZC52MS5CYWxhbmNlUmFuZ2VCACL5AQonR2V0UG9ydGZvbGlvRXF1aXR5SGlzdG9yeVNlcmllc1Jlc3BvbnNlEisKBXJhbmdlGAEgASgOMhwubGVkZ2VyLnJlYWQudjEuQmFsYW5jZVJhbmdlEg4KBmJ1Y2tldBgCIAEoCRIUCgxzdGFydF90c19zZWMYAyABKAcSEgoKZW5kX3RzX3NlYxgEIAEoBxITCgtxdW90ZV9hc3NldBgFIAEoCRIOCgZwb2ludHMYBiABKA0SLAoGc2VyaWVzGAcgAygLMhwubGVkZ2VyLnJlYWQudjEuRXF1aXR5U2VyaWVzEhQKDGJ0Y19wcmljZXNfcRgIIAMoAyJXChZQb3J0Zm9saW9BY2NvdW50RXF1aXR5EhIKCmFjY291bnRfaWQYASABKAYSEAoIZXF1aXR5X3EYAiABKBISFwoNdG9wX2Fzc2V0X2lkcxgDIAMoDUIAIk0KFFBvcnRmb2xpb0Fzc2V0RXF1aXR5EhAKCGFzc2V0X2lkGAEgASgNEhEKCWJhbGFuY2VfcRgCIAEoBBIQCghlcXVpdHlfcRgDIAEoEiIjCiFHZXRQb3J0Zm9saW9FcXVpdHlTbmFwc2hvdFJlcXVlc3Qi1gEKIkdldFBvcnRmb2xpb0VxdWl0eVNuYXBzaG90UmVzcG9uc2USEwoLcXVvdGVfYXNzZXQYASABKAkSFgoOdG90YWxfZXF1aXR5X3EYAiABKBISOAoIYWNjb3VudHMYAyADKAsyJi5sZWRnZXIucmVhZC52MS5Qb3J0Zm9saW9BY2NvdW50RXF1aXR5EjQKBmFzc2V0cxgEIAMoCzIkLmxlZGdlci5yZWFkLnYxLlBvcnRmb2xpb0Fzc2V0RXF1aXR5EhMKC2J0Y19wcmljZV9xGAUgASgDIucBChRMaXN0VHJhbnNmZXJzUmVxdWVzdBIaCg1zdWJhY2NvdW50X2lkGAEgASgGSACIAQESDwoFbGltaXQYAiABKA1CABIQCghyZXZlcnNlZBgDIAEoCBIRCgl0c19taW5fdXMYBCABKAQSEQoJdHNfbWF4X3VzGAUgASgEEjAKDXRyYW5zZmVyX2NvZGUYBiABKA4yFy5sZWRnZXIudjEuVHJhbnNmZXJDb2RlQgASDgoGbGVkZ2VyGAcgASgNEhQKCnBhZ2VfdG9rZW4YCSABKAlCADoAQhAKDl9zdWJhY2NvdW50X2lkIpsBCgxUcmFuc2ZlclNpZGUSLgoEa2luZBgBIAEoDjIgLmxlZGdlci5yZWFkLnYxLlRyYW5zZmVyU2lkZUtpbmQSFwoKYWNjb3VudF9pZBgCIAEoBkgAiAEBEg8KB2FkZHJlc3MYAyABKAkSFQoIY2hhaW5faWQYBCABKA1IAYgBAUINCgtfYWNjb3VudF9pZEILCglfY2hhaW5faWQiggMKC1RyYW5zZmVyUm93EhAKCGFzc2V0X2lkGAEgASgNEisKCmFtb3VudF9lMTgYAiABKAsyFy5wb2x5ZXN0ZXIudHlwZS52MS5VMTI4Ei4KDXRyYW5zZmVyX2NvZGUYAyABKA4yFy5sZWRnZXIudjEuVHJhbnNmZXJDb2RlEiwKDGFjY291bnRfY29kZRgEIAEoDjIWLmxlZGdlci52MS5BY2NvdW50Q29kZRINCgV0c191cxgFIAEoBBIyChFiYWxhbmNlX2FmdGVyX2UxOBgJIAEoCzIXLnBvbHllc3Rlci50eXBlLnYxLlUxMjgSEAoIaXNfZGViaXQYCiABKAgSDwoHbGlua19pZBgLIAEoBBIPCgdmbG93X2lkGAwgASgJEiwKBnNvdXJjZRgNIAEoCzIcLmxlZGdlci5yZWFkLnYxLlRyYW5zZmVyU2lkZRIxCgtkZXN0aW5hdGlvbhgOIAEoCzIcLmxlZGdlci5yZWFkLnYxLlRyYW5zZmVyU2lkZSJiChVMaXN0VHJhbnNmZXJzUmVzcG9uc2USLgoJdHJhbnNmZXJzGAEgAygLMhsubGVkZ2VyLnJlYWQudjEuVHJhbnNmZXJSb3cSGQoPbmV4dF9wYWdlX3Rva2VuGAMgASgJQgAieQoQTGlzdEhvbGRzUmVxdWVzdBIaCg1zdWJhY2NvdW50X2lkGAEgASgGSACIAQESDwoFbGltaXQYAiABKA1CABIQCghyZXZlcnNlZBgDIAEoCBIUCgpwYWdlX3Rva2VuGAQgASgJQgBCEAoOX3N1YmFjY291bnRfaWQieQoHSG9sZFJvdxIPCgdob2xkX2lkGAEgASgGEjQKE2Ftb3VudF9yZXNlcnZlZF9lMTgYAiABKAsyFy5wb2x5ZXN0ZXIudHlwZS52MS5VMTI4EhAKCGFzc2V0X2lkGAMgASgNEhUKDWV4cGlyZXNfYXRfbnMYBCABKAQiVgoRTGlzdEhvbGRzUmVzcG9uc2USJgoFaG9sZHMYASADKAsyFy5sZWRnZXIucmVhZC52MS5Ib2xkUm93EhkKD25leHRfcGFnZV90b2tlbhgCIAEoCUIAIjYKC0Vycm9yRGV0YWlsEicKBGNvZGUYASABKA4yGS5sZWRnZXIucmVhZC52MS5FcnJvckNvZGUqbQoMQmFsYW5jZVJhbmdlEhUKEVJBTkdFX1VOU1BFQ0lGSUVEEAASCQoFREFZXzEQARIJCgVEQVlfNxACEgoKBkRBWV8zMBADEgoKBkRBWV85MBAEEgsKB0RBWV8xODAQBRILCgdEQVlfMzY1EAYqUwoNRXF1aXR5R3JvdXBCeRIYChRHUk9VUF9CWV9VTlNQRUNJRklFRBAAEhQKEEdST1VQX0JZX0FDQ09VTlQQARISCg5HUk9VUF9CWV9BU1NFVBACKrUBChBUcmFuc2ZlclNpZGVLaW5kEiIKHlRSQU5TRkVSX1NJREVfS0lORF9VTlNQRUNJRklFRBAAEhMKD0ZVTkRJTkdfQUNDT1VOVBABEhMKD1RSQURJTkdfQUNDT1VOVBACEhQKEEVYVEVSTkFMX0FERFJFU1MQAxIYChRQUklWQVRFX0NPVU5URVJQQVJUWRAEEg8KC0ZFRV9BQ0NPVU5UEAUSEgoOU1lTVEVNX0FDQ09VTlQQBiryAgoJRXJyb3JDb2RlEhoKFkVSUk9SX0NPREVfVU5TUEVDSUZJRUQQABIaChZFUlJPUl9DT0RFX0JBRF9SRVFVRVNUEAESHgoaRVJST1JfQ09ERV9VTkFVVEhFTlRJQ0FURUQQAhIgChxFUlJPUl9DT0RFX1BFUk1JU1NJT05fREVOSUVEEAMSGAoURVJST1JfQ09ERV9OT1RfRk9VTkQQBBIhCh1FUlJPUl9DT0RFX01JU1NJTkdfQUNDT1VOVF9JRBAFEiEKHUVSUk9SX0NPREVfSU5WQUxJRF9BQ0NPVU5UX0lEEAYSHQoZRVJST1JfQ09ERV9NSVNTSU5HX1dBTExFVBAHEiwKKEVSUk9SX0NPREVfV0FMTEVUX1JFU09MVVRJT05fVU5BVkFJTEFCTEUQCBIfChtFUlJPUl9DT0RFX1dBTExFVF9OT1RfRk9VTkQQCRIdChlFUlJPUl9DT0RFX1VQU1RSRUFNX0VSUk9SEAoypwYKEUxlZGdlclJlYWRTZXJ2aWNlEmoKEUdldEJhbGFuY2VIaXN0b3J5EigubGVkZ2VyLnJlYWQudjEuR2V0QmFsYW5jZUhpc3RvcnlSZXF1ZXN0GikubGVkZ2VyLnJlYWQudjEuR2V0QmFsYW5jZUhpc3RvcnlSZXNwb25zZSIAEnkKFkdldEVxdWl0eUhpc3RvcnlTZXJpZXMSLS5sZWRnZXIucmVhZC52MS5HZXRFcXVpdHlIaXN0b3J5U2VyaWVzUmVxdWVzdBouLmxlZGdlci5yZWFkLnYxLkdldEVxdWl0eUhpc3RvcnlTZXJpZXNSZXNwb25zZSIAEpQBCh9HZXRQb3J0Zm9saW9FcXVpdHlIaXN0b3J5U2VyaWVzEjYubGVkZ2VyLnJlYWQudjEuR2V0UG9ydGZvbGlvRXF1aXR5SGlzdG9yeVNlcmllc1JlcXVlc3QaNy5sZWRnZXIucmVhZC52MS5HZXRQb3J0Zm9saW9FcXVpdHlIaXN0b3J5U2VyaWVzUmVzcG9uc2UiABKFAQoaR2V0UG9ydGZvbGlvRXF1aXR5U25hcHNob3QSMS5sZWRnZXIucmVhZC52MS5HZXRQb3J0Zm9saW9FcXVpdHlTbmFwc2hvdFJlcXVlc3QaMi5sZWRnZXIucmVhZC52MS5HZXRQb3J0Zm9saW9FcXVpdHlTbmFwc2hvdFJlc3BvbnNlIgASXgoNTGlzdFRyYW5zZmVycxIkLmxlZGdlci5yZWFkLnYxLkxpc3RUcmFuc2ZlcnNSZXF1ZXN0GiUubGVkZ2VyLnJlYWQudjEuTGlzdFRyYW5zZmVyc1Jlc3BvbnNlIgASUgoJTGlzdEhvbGRzEiAubGVkZ2VyLnJlYWQudjEuTGlzdEhvbGRzUmVxdWVzdBohLmxlZGdlci5yZWFkLnYxLkxpc3RIb2xkc1Jlc3BvbnNlIgASWAoLR2V0QmFsYW5jZXMSIi5sZWRnZXIucmVhZC52MS5HZXRCYWxhbmNlc1JlcXVlc3QaIy5sZWRnZXIucmVhZC52MS5HZXRCYWxhbmNlc1Jlc3BvbnNlIgBCR1pFZ2l0aHViLmNvbS9GYWJyaWMtTGFicy9wb2x5ZXN0ZXItc2RrLWdvL2dlbi9sZWRnZXIvcmVhZC92MTtsZWRnZXJyZHYxYgZwcm90bzM=\", [file_ledger_v1_catalog, file_polyester_api_options, file_polyester_type_v1_u128]);\n\n/**\n * @generated from message ledger.read.v1.GetBalancesRequest\n */\nexport type GetBalancesRequest = Message<\"ledger.read.v1.GetBalancesRequest\"> & {\n /**\n * Optional sub-account to scope balances to. If omitted, balances are\n * returned for the authenticated root account derived from the JWT or API\n * key. The logical account id itself is always derived from the caller's JWT\n * or API key, not from this payload.\n *\n * @generated from field: optional fixed64 subaccount_id = 1;\n */\n subaccountId?: bigint | undefined;\n};\n\n/**\n * Describes the message ledger.read.v1.GetBalancesRequest.\n * Use `create(GetBalancesRequestSchema)` to create a new message.\n */\nexport const GetBalancesRequestSchema: GenMessage<GetBalancesRequest> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 0);\n\n/**\n * Fixed-size representation for balances (for Protobuf/WS clients).\n * Uses common U128 messages for amounts to keep schema tidy and consistent.\n *\n * @generated from message ledger.read.v1.AssetBalance\n */\nexport type AssetBalance = Message<\"ledger.read.v1.AssetBalance\"> & {\n /**\n * Public unified asset id. Resolve symbol from SpotConfig; U128 amounts in\n * this message always use fixed 18-decimal ledger scale.\n *\n * @generated from field: uint32 asset_id = 1;\n */\n assetId: number;\n\n /**\n * Trading balance at fixed 18-decimal ledger scale.\n *\n * @generated from field: polyester.type.v1.U128 trading = 2;\n */\n trading?: U128 | undefined;\n\n /**\n * Funding balance at fixed 18-decimal ledger scale.\n *\n * @generated from field: polyester.type.v1.U128 funding = 3;\n */\n funding?: U128 | undefined;\n\n /**\n * Reserved amount in the trading bucket at fixed 18-decimal ledger scale.\n *\n * @generated from field: polyester.type.v1.U128 reserved = 4;\n */\n reserved?: U128 | undefined;\n\n /**\n * Amount currently available for new trading activity at fixed 18-decimal\n * ledger scale. This value already accounts for active reservations.\n *\n * @generated from field: polyester.type.v1.U128 available = 5;\n */\n available?: U128 | undefined;\n\n /**\n * Opaque monotonic revision for the atomic trading, reserved, and available\n * values. Higher means newer; zero means no trading state has been observed.\n *\n * @generated from field: uint64 trading_revision = 6;\n */\n tradingRevision: bigint;\n\n /**\n * Opaque monotonic revision for the funding value. Higher means newer; zero\n * means no funding state has been observed.\n *\n * @generated from field: uint64 funding_revision = 7;\n */\n fundingRevision: bigint;\n};\n\n/**\n * Describes the message ledger.read.v1.AssetBalance.\n * Use `create(AssetBalanceSchema)` to create a new message.\n */\nexport const AssetBalanceSchema: GenMessage<AssetBalance> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 1);\n\n/**\n * @generated from message ledger.read.v1.GetBalancesResponse\n */\nexport type GetBalancesResponse = Message<\"ledger.read.v1.GetBalancesResponse\"> & {\n /**\n * One entry for every supported unified asset, including assets with zero\n * balances. Sorted by available trading amount (highest first), then by\n * asset symbol alphabetically.\n *\n * @generated from field: repeated ledger.read.v1.AssetBalance balances = 1;\n */\n balances: AssetBalance[];\n};\n\n/**\n * Describes the message ledger.read.v1.GetBalancesResponse.\n * Use `create(GetBalancesResponseSchema)` to create a new message.\n */\nexport const GetBalancesResponseSchema: GenMessage<GetBalancesResponse> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 2);\n\n/**\n * @generated from message ledger.read.v1.GetBalanceHistoryRequest\n */\nexport type GetBalanceHistoryRequest = Message<\"ledger.read.v1.GetBalanceHistoryRequest\"> & {\n /**\n * Optional sub-account to scope balances to. If omitted, balances are\n * returned for the authenticated root account derived from the JWT or API\n * key. The logical account id itself is always derived from the caller's JWT\n * or API key, not from this payload.\n *\n * @generated from field: optional fixed64 subaccount_id = 1;\n */\n subaccountId?: bigint | undefined;\n\n /**\n * History window to return. When unset/UNSPECIFIED, defaults to 1D.\n *\n * @generated from field: ledger.read.v1.BalanceRange range = 2;\n */\n range: BalanceRange;\n\n /**\n * Optional public asset filter. When unset/0, returns all assets.\n *\n * @generated from field: uint32 ledger = 3;\n */\n ledger: number;\n\n /**\n * Optional subset of account buckets to return. When empty, returns all\n * account buckets.\n *\n * @generated from field: repeated ledger.v1.AccountCode account_codes = 4;\n */\n accountCodes: AccountCode[];\n};\n\n/**\n * Describes the message ledger.read.v1.GetBalanceHistoryRequest.\n * Use `create(GetBalanceHistoryRequestSchema)` to create a new message.\n */\nexport const GetBalanceHistoryRequestSchema: GenMessage<GetBalanceHistoryRequest> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 3);\n\n/**\n * Columnar balance series payload (scaled integers).\n * REST renders decimal strings from these values.\n *\n * @generated from message ledger.read.v1.BalanceSeries\n */\nexport type BalanceSeries = Message<\"ledger.read.v1.BalanceSeries\"> & {\n /**\n * public unified asset id\n *\n * @generated from field: uint32 asset_id = 1;\n */\n assetId: number;\n\n /**\n * account bucket\n *\n * @generated from field: ledger.v1.AccountCode account_code = 2;\n */\n accountCode: AccountCode;\n\n /**\n * Chart balance in asset units scaled by 1e7 (7 decimals).\n * Values are downscaled from 18-decimal ledger balances for compact charting\n * and align 1:1 with implicit timestamps.\n *\n * @generated from field: repeated uint64 balance_q = 3;\n */\n balanceQ: bigint[];\n};\n\n/**\n * Describes the message ledger.read.v1.BalanceSeries.\n * Use `create(BalanceSeriesSchema)` to create a new message.\n */\nexport const BalanceSeriesSchema: GenMessage<BalanceSeries> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 4);\n\n/**\n * GetBalanceHistoryResponse returns aligned balance chart series.\n *\n * @generated from message ledger.read.v1.GetBalanceHistoryResponse\n */\nexport type GetBalanceHistoryResponse = Message<\"ledger.read.v1.GetBalanceHistoryResponse\"> & {\n /**\n * Resolved history window.\n *\n * @generated from field: ledger.read.v1.BalanceRange range = 1;\n */\n range: BalanceRange;\n\n /**\n * Sampling interval between points, such as \"5m\" or \"1h\".\n *\n * @generated from field: string bucket = 2;\n */\n bucket: string;\n\n /**\n * First point timestamp in seconds since epoch (UTC).\n *\n * @generated from field: fixed32 start_ts_sec = 3;\n */\n startTsSec: number;\n\n /**\n * Last point timestamp in seconds since epoch (UTC).\n *\n * @generated from field: fixed32 end_ts_sec = 4;\n */\n endTsSec: number;\n\n /**\n * Number of aligned points in each returned series.\n *\n * @generated from field: uint32 points = 5;\n */\n points: number;\n\n /**\n * Balance series ordered by asset ID, then account bucket.\n *\n * @generated from field: repeated ledger.read.v1.BalanceSeries series = 6;\n */\n series: BalanceSeries[];\n};\n\n/**\n * Describes the message ledger.read.v1.GetBalanceHistoryResponse.\n * Use `create(GetBalanceHistoryResponseSchema)` to create a new message.\n */\nexport const GetBalanceHistoryResponseSchema: GenMessage<GetBalanceHistoryResponse> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 5);\n\n/**\n * Account grouping metadata (used when group_by = ACCOUNT).\n *\n * @generated from message ledger.read.v1.AccountGrouping\n */\nexport type AccountGrouping = Message<\"ledger.read.v1.AccountGrouping\"> & {\n /**\n * account bucket code\n *\n * @generated from field: uint32 account_code = 1;\n */\n accountCode: number;\n\n /**\n * human-readable name (\"funding\", \"trading\")\n *\n * @generated from field: string name = 2;\n */\n name: string;\n};\n\n/**\n * Describes the message ledger.read.v1.AccountGrouping.\n * Use `create(AccountGroupingSchema)` to create a new message.\n */\nexport const AccountGroupingSchema: GenMessage<AccountGrouping> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 6);\n\n/**\n * Asset grouping metadata (used when group_by = ASSET).\n *\n * @generated from message ledger.read.v1.AssetGrouping\n */\nexport type AssetGrouping = Message<\"ledger.read.v1.AssetGrouping\"> & {\n /**\n * public asset id (0 for \"OTHER\" bucket)\n *\n * @generated from field: uint32 id = 1;\n */\n id: number;\n\n /**\n * asset symbol (\"BTC\", \"ETH\", \"OTHER\")\n *\n * @generated from field: string symbol = 2;\n */\n symbol: string;\n};\n\n/**\n * Describes the message ledger.read.v1.AssetGrouping.\n * Use `create(AssetGroupingSchema)` to create a new message.\n */\nexport const AssetGroupingSchema: GenMessage<AssetGrouping> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 7);\n\n/**\n * Logical account grouping used by root portfolio equity history.\n *\n * @generated from message ledger.read.v1.PortfolioAccountGrouping\n */\nexport type PortfolioAccountGrouping = Message<\"ledger.read.v1.PortfolioAccountGrouping\"> & {\n /**\n * Public account or subaccount ID. Its encoded entity type distinguishes\n * the master account from an owned subaccount. Omitted for Remaining.\n *\n * @generated from field: optional fixed64 account_id = 1;\n */\n accountId?: bigint | undefined;\n\n /**\n * True when this series combines all non-selected owned subaccounts.\n *\n * @generated from field: bool remaining = 2;\n */\n remaining: boolean;\n};\n\n/**\n * Describes the message ledger.read.v1.PortfolioAccountGrouping.\n * Use `create(PortfolioAccountGroupingSchema)` to create a new message.\n */\nexport const PortfolioAccountGroupingSchema: GenMessage<PortfolioAccountGrouping> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 8);\n\n/**\n * Equity history in USDT (or BTC via client-side conversion using btc_prices).\n * Values are derived from per-asset balances and market prices (close ticks).\n *\n * @generated from message ledger.read.v1.GetEquityHistorySeriesRequest\n */\nexport type GetEquityHistorySeriesRequest = Message<\"ledger.read.v1.GetEquityHistorySeriesRequest\"> & {\n /**\n * Optional sub-account to scope equity to. If omitted, equity is returned for\n * the authenticated root account derived from the JWT or API key.\n *\n * @generated from field: optional fixed64 subaccount_id = 1;\n */\n subaccountId?: bigint | undefined;\n\n /**\n * History window to return. When unset/UNSPECIFIED, defaults to 1D.\n *\n * @generated from field: ledger.read.v1.BalanceRange range = 2;\n */\n range: BalanceRange;\n\n /**\n * Optional subset of account buckets.\n * When empty, server returns both funding and trading.\n * Only used when group_by = ACCOUNT.\n *\n * @generated from field: repeated ledger.v1.AccountCode account_codes = 4;\n */\n accountCodes: AccountCode[];\n\n /**\n * How to group the equity series. Defaults to ACCOUNT if unspecified.\n *\n * @generated from field: ledger.read.v1.EquityGroupBy group_by = 5;\n */\n groupBy: EquityGroupBy;\n};\n\n/**\n * Describes the message ledger.read.v1.GetEquityHistorySeriesRequest.\n * Use `create(GetEquityHistorySeriesRequestSchema)` to create a new message.\n */\nexport const GetEquityHistorySeriesRequestSchema: GenMessage<GetEquityHistorySeriesRequest> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 9);\n\n/**\n * Columnar equity series payload (scaled integers).\n * REST renders decimal strings from these values.\n *\n * @generated from message ledger.read.v1.EquitySeries\n */\nexport type EquitySeries = Message<\"ledger.read.v1.EquitySeries\"> & {\n /**\n * Grouping identifier. The serving RPC documents which grouping is returned.\n *\n * @generated from oneof ledger.read.v1.EquitySeries.grouping\n */\n grouping: {\n /**\n * set when group_by = ACCOUNT\n *\n * @generated from field: ledger.read.v1.AccountGrouping account = 1;\n */\n value: AccountGrouping;\n case: \"account\";\n } | {\n /**\n * set when group_by = ASSET\n *\n * @generated from field: ledger.read.v1.AssetGrouping asset = 3;\n */\n value: AssetGrouping;\n case: \"asset\";\n } | {\n /**\n * set for root portfolio history\n *\n * @generated from field: ledger.read.v1.PortfolioAccountGrouping portfolio_account = 4;\n */\n value: PortfolioAccountGrouping;\n case: \"portfolioAccount\";\n } | { case: undefined; value?: undefined };\n\n /**\n * Equity in quote currency (USDT) scaled by 1e4 (4 decimals).\n * Values align 1:1 with timestamps.\n *\n * @generated from field: repeated sint64 equity_q = 2;\n */\n equityQ: bigint[];\n};\n\n/**\n * Describes the message ledger.read.v1.EquitySeries.\n * Use `create(EquitySeriesSchema)` to create a new message.\n */\nexport const EquitySeriesSchema: GenMessage<EquitySeries> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 10);\n\n/**\n * GetEquityHistorySeriesResponse returns aligned equity chart series.\n *\n * @generated from message ledger.read.v1.GetEquityHistorySeriesResponse\n */\nexport type GetEquityHistorySeriesResponse = Message<\"ledger.read.v1.GetEquityHistorySeriesResponse\"> & {\n /**\n * Resolved history window.\n *\n * @generated from field: ledger.read.v1.BalanceRange range = 1;\n */\n range: BalanceRange;\n\n /**\n * Sampling interval between points, such as \"5m\" or \"1h\".\n *\n * @generated from field: string bucket = 2;\n */\n bucket: string;\n\n /**\n * First point timestamp in seconds since epoch (UTC).\n *\n * @generated from field: fixed32 start_ts_sec = 3;\n */\n startTsSec: number;\n\n /**\n * Last point timestamp in seconds since epoch (UTC).\n *\n * @generated from field: fixed32 end_ts_sec = 4;\n */\n endTsSec: number;\n\n /**\n * Human-readable quote asset symbol (always \"USDT\").\n *\n * @generated from field: string quote_asset = 6;\n */\n quoteAsset: string;\n\n /**\n * Number of aligned points in each returned series.\n *\n * @generated from field: uint32 points = 7;\n */\n points: number;\n\n /**\n * Equity series ordered by grouping identifier ascending.\n *\n * @generated from field: repeated ledger.read.v1.EquitySeries series = 8;\n */\n series: EquitySeries[];\n\n /**\n * BTC-USDT close price at each timestamp, scaled by 1e6 (same as price_ticks).\n * Enables client-side conversion to BTC denomination without refetch.\n *\n * @generated from field: repeated int64 btc_prices_q = 10;\n */\n btcPricesQ: bigint[];\n};\n\n/**\n * Describes the message ledger.read.v1.GetEquityHistorySeriesResponse.\n * Use `create(GetEquityHistorySeriesResponseSchema)` to create a new message.\n */\nexport const GetEquityHistorySeriesResponseSchema: GenMessage<GetEquityHistorySeriesResponse> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 11);\n\n/**\n * Requests root portfolio equity history.\n *\n * @generated from message ledger.read.v1.GetPortfolioEquityHistorySeriesRequest\n */\nexport type GetPortfolioEquityHistorySeriesRequest = Message<\"ledger.read.v1.GetPortfolioEquityHistorySeriesRequest\"> & {\n /**\n * History window to return. When unset/UNSPECIFIED, defaults to 1D.\n *\n * @generated from field: ledger.read.v1.BalanceRange range = 1;\n */\n range: BalanceRange;\n};\n\n/**\n * Describes the message ledger.read.v1.GetPortfolioEquityHistorySeriesRequest.\n * Use `create(GetPortfolioEquityHistorySeriesRequestSchema)` to create a new message.\n */\nexport const GetPortfolioEquityHistorySeriesRequestSchema: GenMessage<GetPortfolioEquityHistorySeriesRequest> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 12);\n\n/**\n * Root portfolio equity history with aligned, implicit timestamps.\n *\n * @generated from message ledger.read.v1.GetPortfolioEquityHistorySeriesResponse\n */\nexport type GetPortfolioEquityHistorySeriesResponse = Message<\"ledger.read.v1.GetPortfolioEquityHistorySeriesResponse\"> & {\n /**\n * Resolved history window.\n *\n * @generated from field: ledger.read.v1.BalanceRange range = 1;\n */\n range: BalanceRange;\n\n /**\n * Sampling interval between points, such as \"5m\" or \"1h\".\n *\n * @generated from field: string bucket = 2;\n */\n bucket: string;\n\n /**\n * First point timestamp in seconds since epoch (UTC).\n *\n * @generated from field: fixed32 start_ts_sec = 3;\n */\n startTsSec: number;\n\n /**\n * Last point timestamp in seconds since epoch (UTC).\n *\n * @generated from field: fixed32 end_ts_sec = 4;\n */\n endTsSec: number;\n\n /**\n * Human-readable quote asset symbol (always \"USDT\").\n *\n * @generated from field: string quote_asset = 5;\n */\n quoteAsset: string;\n\n /**\n * Number of aligned points in each returned series.\n *\n * @generated from field: uint32 points = 6;\n */\n points: number;\n\n /**\n * Master account first, followed by up to nine owned subaccounts ordered by\n * current equity descending, then Remaining when other subaccounts exist.\n *\n * @generated from field: repeated ledger.read.v1.EquitySeries series = 7;\n */\n series: EquitySeries[];\n\n /**\n * BTC-USDT close price at each timestamp, scaled by 1e6 (same as price_ticks).\n * Enables client-side conversion to BTC denomination without refetch.\n *\n * @generated from field: repeated int64 btc_prices_q = 8;\n */\n btcPricesQ: bigint[];\n};\n\n/**\n * Describes the message ledger.read.v1.GetPortfolioEquityHistorySeriesResponse.\n * Use `create(GetPortfolioEquityHistorySeriesResponseSchema)` to create a new message.\n */\nexport const GetPortfolioEquityHistorySeriesResponseSchema: GenMessage<GetPortfolioEquityHistorySeriesResponse> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 13);\n\n/**\n * Current equity for one logical account in the root portfolio.\n *\n * @generated from message ledger.read.v1.PortfolioAccountEquity\n */\nexport type PortfolioAccountEquity = Message<\"ledger.read.v1.PortfolioAccountEquity\"> & {\n /**\n * Public master-account or subaccount ID.\n *\n * @generated from field: fixed64 account_id = 1;\n */\n accountId: bigint;\n\n /**\n * Current equity in USDT scaled by 1e4 (4 decimals).\n *\n * @generated from field: sint64 equity_q = 2;\n */\n equityQ: bigint;\n\n /**\n * Up to three assets with the highest current equity value, ordered highest\n * first. Assets without a current value are omitted.\n *\n * @generated from field: repeated uint32 top_asset_ids = 3;\n */\n topAssetIds: number[];\n};\n\n/**\n * Describes the message ledger.read.v1.PortfolioAccountEquity.\n * Use `create(PortfolioAccountEquitySchema)` to create a new message.\n */\nexport const PortfolioAccountEquitySchema: GenMessage<PortfolioAccountEquity> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 14);\n\n/**\n * Current aggregate balance and equity for one asset in the root portfolio.\n *\n * @generated from message ledger.read.v1.PortfolioAssetEquity\n */\nexport type PortfolioAssetEquity = Message<\"ledger.read.v1.PortfolioAssetEquity\"> & {\n /**\n * Public unified asset ID.\n *\n * @generated from field: uint32 asset_id = 1;\n */\n assetId: number;\n\n /**\n * Combined Funding and Trading balance in asset units scaled by 1e7\n * (7 decimals).\n *\n * @generated from field: uint64 balance_q = 2;\n */\n balanceQ: bigint;\n\n /**\n * Current equity in USDT scaled by 1e4 (4 decimals).\n *\n * @generated from field: sint64 equity_q = 3;\n */\n equityQ: bigint;\n};\n\n/**\n * Describes the message ledger.read.v1.PortfolioAssetEquity.\n * Use `create(PortfolioAssetEquitySchema)` to create a new message.\n */\nexport const PortfolioAssetEquitySchema: GenMessage<PortfolioAssetEquity> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 15);\n\n/**\n * Requests a current root portfolio equity snapshot.\n *\n * @generated from message ledger.read.v1.GetPortfolioEquitySnapshotRequest\n */\nexport type GetPortfolioEquitySnapshotRequest = Message<\"ledger.read.v1.GetPortfolioEquitySnapshotRequest\"> & {\n};\n\n/**\n * Describes the message ledger.read.v1.GetPortfolioEquitySnapshotRequest.\n * Use `create(GetPortfolioEquitySnapshotRequestSchema)` to create a new message.\n */\nexport const GetPortfolioEquitySnapshotRequestSchema: GenMessage<GetPortfolioEquitySnapshotRequest> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 16);\n\n/**\n * Current root portfolio equity, grouped by logical account and asset.\n *\n * @generated from message ledger.read.v1.GetPortfolioEquitySnapshotResponse\n */\nexport type GetPortfolioEquitySnapshotResponse = Message<\"ledger.read.v1.GetPortfolioEquitySnapshotResponse\"> & {\n /**\n * Human-readable quote asset symbol (always \"USDT\").\n *\n * @generated from field: string quote_asset = 1;\n */\n quoteAsset: string;\n\n /**\n * Current equity across the master account and all owned subaccounts in USDT,\n * scaled by 1e4 (4 decimals).\n *\n * @generated from field: sint64 total_equity_q = 2;\n */\n totalEquityQ: bigint;\n\n /**\n * Master account first, followed by every owned subaccount ordered by current\n * equity descending and public ID ascending for ties.\n *\n * @generated from field: repeated ledger.read.v1.PortfolioAccountEquity accounts = 3;\n */\n accounts: PortfolioAccountEquity[];\n\n /**\n * Non-zero asset balances ordered by current equity descending and public\n * asset ID ascending for ties.\n *\n * @generated from field: repeated ledger.read.v1.PortfolioAssetEquity assets = 4;\n */\n assets: PortfolioAssetEquity[];\n\n /**\n * Current BTC-USDT price scaled by 1e6. Zero when unavailable.\n *\n * @generated from field: int64 btc_price_q = 5;\n */\n btcPriceQ: bigint;\n};\n\n/**\n * Describes the message ledger.read.v1.GetPortfolioEquitySnapshotResponse.\n * Use `create(GetPortfolioEquitySnapshotResponseSchema)` to create a new message.\n */\nexport const GetPortfolioEquitySnapshotResponseSchema: GenMessage<GetPortfolioEquitySnapshotResponse> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 17);\n\n/**\n * @generated from message ledger.read.v1.ListTransfersRequest\n */\nexport type ListTransfersRequest = Message<\"ledger.read.v1.ListTransfersRequest\"> & {\n /**\n * Optional sub-account to scope transfers to. If omitted, transfers are\n * listed for the authenticated root account derived from the JWT or API key.\n *\n * @generated from field: optional fixed64 subaccount_id = 1;\n */\n subaccountId?: bigint | undefined;\n\n /**\n * Maximum number of transfer rows to return. Defaults to 100 when omitted;\n * maximum is 1000.\n *\n * @generated from field: uint32 limit = 2;\n */\n limit: number;\n\n /**\n * Sort direction. When true, rows are returned newest first; when false,\n * rows are returned oldest first.\n *\n * @generated from field: bool reversed = 3;\n */\n reversed: boolean;\n\n /**\n * Optional lower transfer timestamp bound in microseconds since epoch (UTC),\n * inclusive.\n *\n * @generated from field: uint64 ts_min_us = 4;\n */\n tsMinUs: bigint;\n\n /**\n * Optional upper transfer timestamp bound in microseconds since epoch (UTC),\n * inclusive.\n *\n * @generated from field: uint64 ts_max_us = 5;\n */\n tsMaxUs: bigint;\n\n /**\n * Optional filter by transfer reason.\n *\n * @generated from field: ledger.v1.TransferCode transfer_code = 6;\n */\n transferCode: TransferCode;\n\n /**\n * Optional filter by asset ledger.\n *\n * @generated from field: uint32 ledger = 7;\n */\n ledger: number;\n\n /**\n * Opaque keyset cursor from a previous response. The cursor is exclusive and\n * bound to the authenticated account, sub-account scope, filters, timestamp\n * bounds, and sort direction.\n *\n * @generated from field: string page_token = 9;\n */\n pageToken: string;\n};\n\n/**\n * Describes the message ledger.read.v1.ListTransfersRequest.\n * Use `create(ListTransfersRequestSchema)` to create a new message.\n */\nexport const ListTransfersRequestSchema: GenMessage<ListTransfersRequest> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 18);\n\n/**\n * TransferSide describes one side of a ledger transfer for display.\n *\n * @generated from message ledger.read.v1.TransferSide\n */\nexport type TransferSide = Message<\"ledger.read.v1.TransferSide\"> & {\n /**\n * Display classification for this transfer side.\n *\n * @generated from field: ledger.read.v1.TransferSideKind kind = 1;\n */\n kind: TransferSideKind;\n\n /**\n * Public root account or subaccount ID when this side is safe to identify. Never\n * populated for private counterparties or non-user ledger accounts.\n *\n * @generated from field: optional fixed64 account_id = 2;\n */\n accountId?: bigint | undefined;\n\n /**\n * Address for this side when known. For EXTERNAL_ADDRESS this is an\n * external-chain wallet address from lifecycle correlation; for identifiable\n * Polyester accounts this is a Polyester smart-account address.\n * May be empty until the corresponding lifecycle details are available.\n *\n * @generated from field: string address = 3;\n */\n address: string;\n\n /**\n * PolyChain-registered external network identifier for EXTERNAL_ADDRESS.\n * This matches chain.zipper.v1.ChainConfig.chain_id and is not the chain's\n * native identifier (for example, an EIP-155 id) or the Polyester chain id.\n *\n * @generated from field: optional uint32 chain_id = 4;\n */\n chainId?: number | undefined;\n};\n\n/**\n * Describes the message ledger.read.v1.TransferSide.\n * Use `create(TransferSideSchema)` to create a new message.\n */\nexport const TransferSideSchema: GenMessage<TransferSide> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 19);\n\n/**\n * TransferRow describes one debit or credit leg of a ledger transfer.\n *\n * @generated from message ledger.read.v1.TransferRow\n */\nexport type TransferRow = Message<\"ledger.read.v1.TransferRow\"> & {\n /**\n * Public unified asset ID. Resolve its symbol through the spot configuration\n * API. U128 amounts in this row always use a fixed 18-decimal ledger scale.\n *\n * @generated from field: uint32 asset_id = 1;\n */\n assetId: number;\n\n /**\n * Transfer amount at fixed 18-decimal ledger scale.\n *\n * @generated from field: polyester.type.v1.U128 amount_e18 = 2;\n */\n amountE18?: U128 | undefined;\n\n /**\n * Product reason for this transfer.\n *\n * @generated from field: ledger.v1.TransferCode transfer_code = 3;\n */\n transferCode: TransferCode;\n\n /**\n * Account bucket affected by this transfer.\n *\n * @generated from field: ledger.v1.AccountCode account_code = 4;\n */\n accountCode: AccountCode;\n\n /**\n * Transfer timestamp in microseconds since epoch (UTC).\n *\n * @generated from field: uint64 ts_us = 5;\n */\n tsUs: bigint;\n\n /**\n * Post-transfer balance at fixed 18-decimal ledger scale.\n *\n * @generated from field: polyester.type.v1.U128 balance_after_e18 = 9;\n */\n balanceAfterE18?: U128 | undefined;\n\n /**\n * True when this row is the debit leg; false when it is the credit leg.\n *\n * @generated from field: bool is_debit = 10;\n */\n isDebit: boolean;\n\n /**\n * Correlation ID used to group related transfer legs. Zero when unavailable.\n *\n * @generated from field: uint64 link_id = 11;\n */\n linkId: bigint;\n\n /**\n * Public lifecycle flow ID when this transfer belongs to a chain lifecycle flow.\n *\n * @generated from field: string flow_id = 12;\n */\n flowId: string;\n\n /**\n * Debit side of the transfer. This relationship is debit-to-credit rather\n * than row-relative; use is_debit to determine whether this row is the debit leg.\n *\n * @generated from field: ledger.read.v1.TransferSide source = 13;\n */\n source?: TransferSide | undefined;\n\n /**\n * Credit side of the transfer. This relationship is debit-to-credit rather\n * than row-relative; use is_debit to determine whether this row is the credit leg.\n *\n * @generated from field: ledger.read.v1.TransferSide destination = 14;\n */\n destination?: TransferSide | undefined;\n};\n\n/**\n * Describes the message ledger.read.v1.TransferRow.\n * Use `create(TransferRowSchema)` to create a new message.\n */\nexport const TransferRowSchema: GenMessage<TransferRow> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 20);\n\n/**\n * ListTransfersResponse contains transfer rows and an optional continuation cursor.\n *\n * @generated from message ledger.read.v1.ListTransfersResponse\n */\nexport type ListTransfersResponse = Message<\"ledger.read.v1.ListTransfersResponse\"> & {\n /**\n * Transfer rows in requested order.\n *\n * @generated from field: repeated ledger.read.v1.TransferRow transfers = 1;\n */\n transfers: TransferRow[];\n\n /**\n * Opaque cursor for the next page. Empty when no more results exist.\n *\n * @generated from field: string next_page_token = 3;\n */\n nextPageToken: string;\n};\n\n/**\n * Describes the message ledger.read.v1.ListTransfersResponse.\n * Use `create(ListTransfersResponseSchema)` to create a new message.\n */\nexport const ListTransfersResponseSchema: GenMessage<ListTransfersResponse> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 21);\n\n/**\n * @generated from message ledger.read.v1.ListHoldsRequest\n */\nexport type ListHoldsRequest = Message<\"ledger.read.v1.ListHoldsRequest\"> & {\n /**\n * Optional sub-account to scope holds to. If omitted, holds are listed for\n * the authenticated root account derived from the JWT or API key.\n *\n * @generated from field: optional fixed64 subaccount_id = 1;\n */\n subaccountId?: bigint | undefined;\n\n /**\n * Maximum number of holds to return. Defaults to 100 when omitted; maximum is\n * 1000.\n *\n * @generated from field: uint32 limit = 2;\n */\n limit: number;\n\n /**\n * true=newest first; false=oldest first.\n *\n * @generated from field: bool reversed = 3;\n */\n reversed: boolean;\n\n /**\n * Opaque keyset cursor from a previous response. The cursor is exclusive and\n * bound to account, sub-account scope, and sort direction.\n *\n * @generated from field: string page_token = 4;\n */\n pageToken: string;\n};\n\n/**\n * Describes the message ledger.read.v1.ListHoldsRequest.\n * Use `create(ListHoldsRequestSchema)` to create a new message.\n */\nexport const ListHoldsRequestSchema: GenMessage<ListHoldsRequest> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 22);\n\n/**\n * Hold row with compact integers and client-side resolution.\n *\n * @generated from message ledger.read.v1.HoldRow\n */\nexport type HoldRow = Message<\"ledger.read.v1.HoldRow\"> & {\n /**\n * pending transfer id (numeric)\n *\n * @generated from field: fixed64 hold_id = 1;\n */\n holdId: bigint;\n\n /**\n * Reserved amount at fixed 18-decimal ledger scale.\n *\n * @generated from field: polyester.type.v1.U128 amount_reserved_e18 = 2;\n */\n amountReservedE18?: U128 | undefined;\n\n /**\n * Public unified asset id.\n *\n * @generated from field: uint32 asset_id = 3;\n */\n assetId: number;\n\n /**\n * Expiration time in nanoseconds since epoch (UTC).\n *\n * @generated from field: uint64 expires_at_ns = 4;\n */\n expiresAtNs: bigint;\n};\n\n/**\n * Describes the message ledger.read.v1.HoldRow.\n * Use `create(HoldRowSchema)` to create a new message.\n */\nexport const HoldRowSchema: GenMessage<HoldRow> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 23);\n\n/**\n * @generated from message ledger.read.v1.ListHoldsResponse\n */\nexport type ListHoldsResponse = Message<\"ledger.read.v1.ListHoldsResponse\"> & {\n /**\n * Hold rows in the sort direction requested by the caller.\n *\n * @generated from field: repeated ledger.read.v1.HoldRow holds = 1;\n */\n holds: HoldRow[];\n\n /**\n * Opaque cursor for the next page. Empty when no more results exist.\n *\n * @generated from field: string next_page_token = 2;\n */\n nextPageToken: string;\n};\n\n/**\n * Describes the message ledger.read.v1.ListHoldsResponse.\n * Use `create(ListHoldsResponseSchema)` to create a new message.\n */\nexport const ListHoldsResponseSchema: GenMessage<ListHoldsResponse> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 24);\n\n/**\n * ErrorDetail is attached to ConnectRPC errors for structured error handling.\n * Clients can inspect this to get a stable machine-readable error code.\n *\n * @generated from message ledger.read.v1.ErrorDetail\n */\nexport type ErrorDetail = Message<\"ledger.read.v1.ErrorDetail\"> & {\n /**\n * Stable error code matching the REST problem+json \"code\" field.\n *\n * @generated from field: ledger.read.v1.ErrorCode code = 1;\n */\n code: ErrorCode;\n};\n\n/**\n * Describes the message ledger.read.v1.ErrorDetail.\n * Use `create(ErrorDetailSchema)` to create a new message.\n */\nexport const ErrorDetailSchema: GenMessage<ErrorDetail> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 25);\n\n/**\n * Supported history windows for balance charts.\n *\n * @generated from enum ledger.read.v1.BalanceRange\n */\nexport enum BalanceRange {\n /**\n * @generated from enum value: RANGE_UNSPECIFIED = 0;\n */\n RANGE_UNSPECIFIED = 0,\n\n /**\n * 1 day\n *\n * @generated from enum value: DAY_1 = 1;\n */\n DAY_1 = 1,\n\n /**\n * 7 days\n *\n * @generated from enum value: DAY_7 = 2;\n */\n DAY_7 = 2,\n\n /**\n * 30 days\n *\n * @generated from enum value: DAY_30 = 3;\n */\n DAY_30 = 3,\n\n /**\n * 90 days\n *\n * @generated from enum value: DAY_90 = 4;\n */\n DAY_90 = 4,\n\n /**\n * 180 days\n *\n * @generated from enum value: DAY_180 = 5;\n */\n DAY_180 = 5,\n\n /**\n * 365 days\n *\n * @generated from enum value: DAY_365 = 6;\n */\n DAY_365 = 6,\n}\n\n/**\n * Describes the enum ledger.read.v1.BalanceRange.\n */\nexport const BalanceRangeSchema: GenEnum<BalanceRange> = /*@__PURE__*/\n enumDesc(file_ledger_read_v1_ledger_read, 0);\n\n/**\n * How to group equity series data.\n *\n * @generated from enum ledger.read.v1.EquityGroupBy\n */\nexport enum EquityGroupBy {\n /**\n * defaults to ACCOUNT\n *\n * @generated from enum value: GROUP_BY_UNSPECIFIED = 0;\n */\n GROUP_BY_UNSPECIFIED = 0,\n\n /**\n * group by account bucket\n *\n * @generated from enum value: GROUP_BY_ACCOUNT = 1;\n */\n GROUP_BY_ACCOUNT = 1,\n\n /**\n * group by asset (BTC, ETH, etc.)\n *\n * @generated from enum value: GROUP_BY_ASSET = 2;\n */\n GROUP_BY_ASSET = 2,\n}\n\n/**\n * Describes the enum ledger.read.v1.EquityGroupBy.\n */\nexport const EquityGroupBySchema: GenEnum<EquityGroupBy> = /*@__PURE__*/\n enumDesc(file_ledger_read_v1_ledger_read, 1);\n\n/**\n * TransferSideKind identifies the display class for one side of a transfer.\n *\n * @generated from enum ledger.read.v1.TransferSideKind\n */\nexport enum TransferSideKind {\n /**\n * Transfer side type was not specified.\n *\n * @generated from enum value: TRANSFER_SIDE_KIND_UNSPECIFIED = 0;\n */\n TRANSFER_SIDE_KIND_UNSPECIFIED = 0,\n\n /**\n * Polyester funding account.\n *\n * @generated from enum value: FUNDING_ACCOUNT = 1;\n */\n FUNDING_ACCOUNT = 1,\n\n /**\n * Polyester trading account.\n *\n * @generated from enum value: TRADING_ACCOUNT = 2;\n */\n TRADING_ACCOUNT = 2,\n\n /**\n * External wallet or chain address. The address is lifecycle-derived and may\n * be empty until ledger-to-lifecycle correlation is projected.\n *\n * @generated from enum value: EXTERNAL_ADDRESS = 3;\n */\n EXTERNAL_ADDRESS = 3,\n\n /**\n * Private off-chain counterparty that must not be identified to the caller.\n * account_id and address are intentionally omitted.\n *\n * @generated from enum value: PRIVATE_COUNTERPARTY = 4;\n */\n PRIVATE_COUNTERPARTY = 4,\n\n /**\n * Fee ledger side, for example spot or perp trading fees.\n *\n * @generated from enum value: FEE_ACCOUNT = 5;\n */\n FEE_ACCOUNT = 5,\n\n /**\n * System, operator, clearing, or other non-user side.\n *\n * @generated from enum value: SYSTEM_ACCOUNT = 6;\n */\n SYSTEM_ACCOUNT = 6,\n}\n\n/**\n * Describes the enum ledger.read.v1.TransferSideKind.\n */\nexport const TransferSideKindSchema: GenEnum<TransferSideKind> = /*@__PURE__*/\n enumDesc(file_ledger_read_v1_ledger_read, 2);\n\n/**\n * ErrorCode enumerates stable machine-readable error codes for the Ledger Read\n * API. These mirror the REST problem+json \"code\" field for parity between REST\n * and ConnectRPC clients.\n *\n * @generated from enum ledger.read.v1.ErrorCode\n */\nexport enum ErrorCode {\n /**\n * @generated from enum value: ERROR_CODE_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: ERROR_CODE_BAD_REQUEST = 1;\n */\n BAD_REQUEST = 1,\n\n /**\n * @generated from enum value: ERROR_CODE_UNAUTHENTICATED = 2;\n */\n UNAUTHENTICATED = 2,\n\n /**\n * @generated from enum value: ERROR_CODE_PERMISSION_DENIED = 3;\n */\n PERMISSION_DENIED = 3,\n\n /**\n * @generated from enum value: ERROR_CODE_NOT_FOUND = 4;\n */\n NOT_FOUND = 4,\n\n /**\n * Missing or invalid account identifier (legacy; used by older endpoints).\n *\n * @generated from enum value: ERROR_CODE_MISSING_ACCOUNT_ID = 5;\n */\n MISSING_ACCOUNT_ID = 5,\n\n /**\n * @generated from enum value: ERROR_CODE_INVALID_ACCOUNT_ID = 6;\n */\n INVALID_ACCOUNT_ID = 6,\n\n /**\n * Wallet-specific errors for balance lookups by wallet.\n *\n * @generated from enum value: ERROR_CODE_MISSING_WALLET = 7;\n */\n MISSING_WALLET = 7,\n\n /**\n * @generated from enum value: ERROR_CODE_WALLET_RESOLUTION_UNAVAILABLE = 8;\n */\n WALLET_RESOLUTION_UNAVAILABLE = 8,\n\n /**\n * @generated from enum value: ERROR_CODE_WALLET_NOT_FOUND = 9;\n */\n WALLET_NOT_FOUND = 9,\n\n /**\n * Upstream dependency error (e.g., transfers store, wallet resolver).\n *\n * @generated from enum value: ERROR_CODE_UPSTREAM_ERROR = 10;\n */\n UPSTREAM_ERROR = 10,\n}\n\n/**\n * Describes the enum ledger.read.v1.ErrorCode.\n */\nexport const ErrorCodeSchema: GenEnum<ErrorCode> = /*@__PURE__*/\n enumDesc(file_ledger_read_v1_ledger_read, 3);\n\n/**\n * LedgerReadService exposes read-only ledger endpoints (balances, history, transfers, holds).\n *\n * @generated from service ledger.read.v1.LedgerReadService\n */\nexport const LedgerReadService: GenService<{\n /**\n * Retrieve balance history buckets for an account.\n * Supports optional subaccount, range, asset, and account-code filters.\n *\n * @generated from rpc ledger.read.v1.LedgerReadService.GetBalanceHistory\n */\n getBalanceHistory: {\n methodKind: \"unary\";\n input: typeof GetBalanceHistoryRequestSchema;\n output: typeof GetBalanceHistoryResponseSchema;\n },\n /**\n * Retrieve equity history as columnar series data.\n * Supports optional subaccount, range, account-code filtering, and grouping by account or asset.\n *\n * @generated from rpc ledger.read.v1.LedgerReadService.GetEquityHistorySeries\n */\n getEquityHistorySeries: {\n methodKind: \"unary\";\n input: typeof GetEquityHistorySeriesRequestSchema;\n output: typeof GetEquityHistorySeriesResponseSchema;\n },\n /**\n * Retrieve root portfolio equity history as master, top owned subaccounts,\n * and an aggregate of the remaining owned subaccounts. Requires an\n * interactive root-account session; API keys are not supported.\n *\n * @generated from rpc ledger.read.v1.LedgerReadService.GetPortfolioEquityHistorySeries\n */\n getPortfolioEquityHistorySeries: {\n methodKind: \"unary\";\n input: typeof GetPortfolioEquityHistorySeriesRequestSchema;\n output: typeof GetPortfolioEquityHistorySeriesResponseSchema;\n },\n /**\n * Retrieve current root portfolio equity grouped by logical account and\n * asset. Requires an interactive root-account session; API keys are not\n * supported.\n *\n * @generated from rpc ledger.read.v1.LedgerReadService.GetPortfolioEquitySnapshot\n */\n getPortfolioEquitySnapshot: {\n methodKind: \"unary\";\n input: typeof GetPortfolioEquitySnapshotRequestSchema;\n output: typeof GetPortfolioEquitySnapshotResponseSchema;\n },\n /**\n * List finalized transfer history for an account.\n * Supports optional subaccount, asset, ordering, and cursor filters.\n *\n * @generated from rpc ledger.read.v1.LedgerReadService.ListTransfers\n */\n listTransfers: {\n methodKind: \"unary\";\n input: typeof ListTransfersRequestSchema;\n output: typeof ListTransfersResponseSchema;\n },\n /**\n * ListHolds returns pending holds with integer amounts (u128) and asset ids.\n *\n * @generated from rpc ledger.read.v1.LedgerReadService.ListHolds\n */\n listHolds: {\n methodKind: \"unary\";\n input: typeof ListHoldsRequestSchema;\n output: typeof ListHoldsResponseSchema;\n },\n /**\n * Retrieve the latest balances for an account.\n * Supports optional subaccount scoping and returns asset symbols with decimal amounts on REST.\n *\n * @generated from rpc ledger.read.v1.LedgerReadService.GetBalances\n */\n getBalances: {\n methodKind: \"unary\";\n input: typeof GetBalancesRequestSchema;\n output: typeof GetBalancesResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_ledger_read_v1_ledger_read, 0);\n\n"],"mappings":"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"}
1
+ {"version":3,"file":"ledger_read_pb.js","names":[],"sources":["../../../../../src/gen/ledger/read/v1/ledger_read_pb.ts"],"sourcesContent":["// @generated by protoc-gen-es v2.13.0 with parameter \"target=ts,import_extension=js\"\n// @generated from file ledger/read/v1/ledger_read.proto (package ledger.read.v1, syntax proto3)\n/* eslint-disable */\n\nimport type { GenEnum, GenFile, GenMessage, GenService } from \"@bufbuild/protobuf/codegenv2\";\nimport { enumDesc, fileDesc, messageDesc, serviceDesc } from \"@bufbuild/protobuf/codegenv2\";\nimport type { AccountCode, TransferCode } from \"../../v1/catalog_pb.js\";\nimport { file_ledger_v1_catalog } from \"../../v1/catalog_pb.js\";\nimport { file_polyester_api_options } from \"../../../polyester/api/options_pb.js\";\nimport type { U128 } from \"../../../polyester/type/v1/u128_pb.js\";\nimport { file_polyester_type_v1_u128 } from \"../../../polyester/type/v1/u128_pb.js\";\nimport type { Message } from \"@bufbuild/protobuf\";\n\n/**\n * Describes the file ledger/read/v1/ledger_read.proto.\n */\nexport const file_ledger_read_v1_ledger_read: GenFile = /*@__PURE__*/\n fileDesc(\"CiBsZWRnZXIvcmVhZC92MS9sZWRnZXJfcmVhZC5wcm90bxIObGVkZ2VyLnJlYWQudjEiQgoSR2V0QmFsYW5jZXNSZXF1ZXN0EhoKDXN1YmFjY291bnRfaWQYASABKAZIAIgBAUIQCg5fc3ViYWNjb3VudF9pZCL/AQoMQXNzZXRCYWxhbmNlEhAKCGFzc2V0X2lkGAEgASgNEigKB3RyYWRpbmcYAiABKAsyFy5wb2x5ZXN0ZXIudHlwZS52MS5VMTI4EigKB2Z1bmRpbmcYAyABKAsyFy5wb2x5ZXN0ZXIudHlwZS52MS5VMTI4EikKCHJlc2VydmVkGAQgASgLMhcucG9seWVzdGVyLnR5cGUudjEuVTEyOBIqCglhdmFpbGFibGUYBSABKAsyFy5wb2x5ZXN0ZXIudHlwZS52MS5VMTI4EhgKEHRyYWRpbmdfcmV2aXNpb24YBiABKAQSGAoQZnVuZGluZ19yZXZpc2lvbhgHIAEoBCJFChNHZXRCYWxhbmNlc1Jlc3BvbnNlEi4KCGJhbGFuY2VzGAEgAygLMhwubGVkZ2VyLnJlYWQudjEuQXNzZXRCYWxhbmNlIrYBChhHZXRCYWxhbmNlSGlzdG9yeVJlcXVlc3QSGgoNc3ViYWNjb3VudF9pZBgBIAEoBkgAiAEBEi0KBXJhbmdlGAIgASgOMhwubGVkZ2VyLnJlYWQudjEuQmFsYW5jZVJhbmdlQgASDgoGbGVkZ2VyGAMgASgNEi0KDWFjY291bnRfY29kZXMYBCADKA4yFi5sZWRnZXIudjEuQWNjb3VudENvZGVCEAoOX3N1YmFjY291bnRfaWQiYgoNQmFsYW5jZVNlcmllcxIQCghhc3NldF9pZBgBIAEoDRIsCgxhY2NvdW50X2NvZGUYAiABKA4yFi5sZWRnZXIudjEuQWNjb3VudENvZGUSEQoJYmFsYW5jZV9xGAMgAygEIsEBChlHZXRCYWxhbmNlSGlzdG9yeVJlc3BvbnNlEisKBXJhbmdlGAEgASgOMhwubGVkZ2VyLnJlYWQudjEuQmFsYW5jZVJhbmdlEg4KBmJ1Y2tldBgCIAEoCRIUCgxzdGFydF90c19zZWMYAyABKAcSEgoKZW5kX3RzX3NlYxgEIAEoBxIOCgZwb2ludHMYBSABKA0SLQoGc2VyaWVzGAYgAygLMh0ubGVkZ2VyLnJlYWQudjEuQmFsYW5jZVNlcmllcyI1Cg9BY2NvdW50R3JvdXBpbmcSFAoMYWNjb3VudF9jb2RlGAEgASgNEgwKBG5hbWUYAiABKAkiKwoNQXNzZXRHcm91cGluZxIKCgJpZBgBIAEoDRIOCgZzeW1ib2wYAiABKAkiVQoYUG9ydGZvbGlvQWNjb3VudEdyb3VwaW5nEhcKCmFjY291bnRfaWQYASABKAZIAIgBARIRCglyZW1haW5pbmcYAiABKAhCDQoLX2FjY291bnRfaWQi3AEKHUdldEVxdWl0eUhpc3RvcnlTZXJpZXNSZXF1ZXN0EhoKDXN1YmFjY291bnRfaWQYASABKAZIAIgBARItCgVyYW5nZRgCIAEoDjIcLmxlZGdlci5yZWFkLnYxLkJhbGFuY2VSYW5nZUIAEi0KDWFjY291bnRfY29kZXMYBCADKA4yFi5sZWRnZXIudjEuQWNjb3VudENvZGUSLwoIZ3JvdXBfYnkYBSABKA4yHS5sZWRnZXIucmVhZC52MS5FcXVpdHlHcm91cEJ5QhAKDl9zdWJhY2NvdW50X2lkItcBCgxFcXVpdHlTZXJpZXMSMgoHYWNjb3VudBgBIAEoCzIfLmxlZGdlci5yZWFkLnYxLkFjY291bnRHcm91cGluZ0gAEi4KBWFzc2V0GAMgASgLMh0ubGVkZ2VyLnJlYWQudjEuQXNzZXRHcm91cGluZ0gAEkUKEXBvcnRmb2xpb19hY2NvdW50GAQgASgLMigubGVkZ2VyLnJlYWQudjEuUG9ydGZvbGlvQWNjb3VudEdyb3VwaW5nSAASEAoIZXF1aXR5X3EYAiADKBJCCgoIZ3JvdXBpbmci8AEKHkdldEVxdWl0eUhpc3RvcnlTZXJpZXNSZXNwb25zZRIrCgVyYW5nZRgBIAEoDjIcLmxlZGdlci5yZWFkLnYxLkJhbGFuY2VSYW5nZRIOCgZidWNrZXQYAiABKAkSFAoMc3RhcnRfdHNfc2VjGAMgASgHEhIKCmVuZF90c19zZWMYBCABKAcSEwoLcXVvdGVfYXNzZXQYBiABKAkSDgoGcG9pbnRzGAcgASgNEiwKBnNlcmllcxgIIAMoCzIcLmxlZGdlci5yZWFkLnYxLkVxdWl0eVNlcmllcxIUCgxidGNfcHJpY2VzX3EYCiADKAMiVwomR2V0UG9ydGZvbGlvRXF1aXR5SGlzdG9yeVNlcmllc1JlcXVlc3QSLQoFcmFuZ2UYASABKA4yHC5sZWRnZXIucmVhZC52MS5CYWxhbmNlUmFuZ2VCACL5AQonR2V0UG9ydGZvbGlvRXF1aXR5SGlzdG9yeVNlcmllc1Jlc3BvbnNlEisKBXJhbmdlGAEgASgOMhwubGVkZ2VyLnJlYWQudjEuQmFsYW5jZVJhbmdlEg4KBmJ1Y2tldBgCIAEoCRIUCgxzdGFydF90c19zZWMYAyABKAcSEgoKZW5kX3RzX3NlYxgEIAEoBxITCgtxdW90ZV9hc3NldBgFIAEoCRIOCgZwb2ludHMYBiABKA0SLAoGc2VyaWVzGAcgAygLMhwubGVkZ2VyLnJlYWQudjEuRXF1aXR5U2VyaWVzEhQKDGJ0Y19wcmljZXNfcRgIIAMoAyJXChZQb3J0Zm9saW9BY2NvdW50RXF1aXR5EhIKCmFjY291bnRfaWQYASABKAYSEAoIZXF1aXR5X3EYAiABKBISFwoNdG9wX2Fzc2V0X2lkcxgDIAMoDUIAIk0KFFBvcnRmb2xpb0Fzc2V0RXF1aXR5EhAKCGFzc2V0X2lkGAEgASgNEhEKCWJhbGFuY2VfcRgCIAEoBBIQCghlcXVpdHlfcRgDIAEoEiIjCiFHZXRQb3J0Zm9saW9FcXVpdHlTbmFwc2hvdFJlcXVlc3Qi1gEKIkdldFBvcnRmb2xpb0VxdWl0eVNuYXBzaG90UmVzcG9uc2USEwoLcXVvdGVfYXNzZXQYASABKAkSFgoOdG90YWxfZXF1aXR5X3EYAiABKBISOAoIYWNjb3VudHMYAyADKAsyJi5sZWRnZXIucmVhZC52MS5Qb3J0Zm9saW9BY2NvdW50RXF1aXR5EjQKBmFzc2V0cxgEIAMoCzIkLmxlZGdlci5yZWFkLnYxLlBvcnRmb2xpb0Fzc2V0RXF1aXR5EhMKC2J0Y19wcmljZV9xGAUgASgDIucBChRMaXN0VHJhbnNmZXJzUmVxdWVzdBIaCg1zdWJhY2NvdW50X2lkGAEgASgGSACIAQESDwoFbGltaXQYAiABKA1CABIQCghyZXZlcnNlZBgDIAEoCBIRCgl0c19taW5fdXMYBCABKAQSEQoJdHNfbWF4X3VzGAUgASgEEjAKDXRyYW5zZmVyX2NvZGUYBiABKA4yFy5sZWRnZXIudjEuVHJhbnNmZXJDb2RlQgASDgoGbGVkZ2VyGAcgASgNEhQKCnBhZ2VfdG9rZW4YCSABKAlCADoAQhAKDl9zdWJhY2NvdW50X2lkIpsBCgxUcmFuc2ZlclNpZGUSLgoEa2luZBgBIAEoDjIgLmxlZGdlci5yZWFkLnYxLlRyYW5zZmVyU2lkZUtpbmQSFwoKYWNjb3VudF9pZBgCIAEoBkgAiAEBEg8KB2FkZHJlc3MYAyABKAkSFQoIY2hhaW5faWQYBCABKA1IAYgBAUINCgtfYWNjb3VudF9pZEILCglfY2hhaW5faWQiggMKC1RyYW5zZmVyUm93EhAKCGFzc2V0X2lkGAEgASgNEisKCmFtb3VudF9lMTgYAiABKAsyFy5wb2x5ZXN0ZXIudHlwZS52MS5VMTI4Ei4KDXRyYW5zZmVyX2NvZGUYAyABKA4yFy5sZWRnZXIudjEuVHJhbnNmZXJDb2RlEiwKDGFjY291bnRfY29kZRgEIAEoDjIWLmxlZGdlci52MS5BY2NvdW50Q29kZRINCgV0c191cxgFIAEoBBIyChFiYWxhbmNlX2FmdGVyX2UxOBgJIAEoCzIXLnBvbHllc3Rlci50eXBlLnYxLlUxMjgSEAoIaXNfZGViaXQYCiABKAgSDwoHbGlua19pZBgLIAEoBBIPCgdmbG93X2lkGAwgASgJEiwKBnNvdXJjZRgNIAEoCzIcLmxlZGdlci5yZWFkLnYxLlRyYW5zZmVyU2lkZRIxCgtkZXN0aW5hdGlvbhgOIAEoCzIcLmxlZGdlci5yZWFkLnYxLlRyYW5zZmVyU2lkZSJiChVMaXN0VHJhbnNmZXJzUmVzcG9uc2USLgoJdHJhbnNmZXJzGAEgAygLMhsubGVkZ2VyLnJlYWQudjEuVHJhbnNmZXJSb3cSGQoPbmV4dF9wYWdlX3Rva2VuGAMgASgJQgAieQoQTGlzdEhvbGRzUmVxdWVzdBIaCg1zdWJhY2NvdW50X2lkGAEgASgGSACIAQESDwoFbGltaXQYAiABKA1CABIQCghyZXZlcnNlZBgDIAEoCBIUCgpwYWdlX3Rva2VuGAQgASgJQgBCEAoOX3N1YmFjY291bnRfaWQieQoHSG9sZFJvdxIPCgdob2xkX2lkGAEgASgGEjQKE2Ftb3VudF9yZXNlcnZlZF9lMTgYAiABKAsyFy5wb2x5ZXN0ZXIudHlwZS52MS5VMTI4EhAKCGFzc2V0X2lkGAMgASgNEhUKDWV4cGlyZXNfYXRfbnMYBCABKAQiVgoRTGlzdEhvbGRzUmVzcG9uc2USJgoFaG9sZHMYASADKAsyFy5sZWRnZXIucmVhZC52MS5Ib2xkUm93EhkKD25leHRfcGFnZV90b2tlbhgCIAEoCUIAIjYKC0Vycm9yRGV0YWlsEicKBGNvZGUYASABKA4yGS5sZWRnZXIucmVhZC52MS5FcnJvckNvZGUqbQoMQmFsYW5jZVJhbmdlEhUKEVJBTkdFX1VOU1BFQ0lGSUVEEAASCQoFREFZXzEQARIJCgVEQVlfNxACEgoKBkRBWV8zMBADEgoKBkRBWV85MBAEEgsKB0RBWV8xODAQBRILCgdEQVlfMzY1EAYqUwoNRXF1aXR5R3JvdXBCeRIYChRHUk9VUF9CWV9VTlNQRUNJRklFRBAAEhQKEEdST1VQX0JZX0FDQ09VTlQQARISCg5HUk9VUF9CWV9BU1NFVBACKrUBChBUcmFuc2ZlclNpZGVLaW5kEiIKHlRSQU5TRkVSX1NJREVfS0lORF9VTlNQRUNJRklFRBAAEhMKD0ZVTkRJTkdfQUNDT1VOVBABEhMKD1RSQURJTkdfQUNDT1VOVBACEhQKEEVYVEVSTkFMX0FERFJFU1MQAxIYChRQUklWQVRFX0NPVU5URVJQQVJUWRAEEg8KC0ZFRV9BQ0NPVU5UEAUSEgoOU1lTVEVNX0FDQ09VTlQQBiryAgoJRXJyb3JDb2RlEhoKFkVSUk9SX0NPREVfVU5TUEVDSUZJRUQQABIaChZFUlJPUl9DT0RFX0JBRF9SRVFVRVNUEAESHgoaRVJST1JfQ09ERV9VTkFVVEhFTlRJQ0FURUQQAhIgChxFUlJPUl9DT0RFX1BFUk1JU1NJT05fREVOSUVEEAMSGAoURVJST1JfQ09ERV9OT1RfRk9VTkQQBBIhCh1FUlJPUl9DT0RFX01JU1NJTkdfQUNDT1VOVF9JRBAFEiEKHUVSUk9SX0NPREVfSU5WQUxJRF9BQ0NPVU5UX0lEEAYSHQoZRVJST1JfQ09ERV9NSVNTSU5HX1dBTExFVBAHEiwKKEVSUk9SX0NPREVfV0FMTEVUX1JFU09MVVRJT05fVU5BVkFJTEFCTEUQCBIfChtFUlJPUl9DT0RFX1dBTExFVF9OT1RfRk9VTkQQCRIdChlFUlJPUl9DT0RFX1VQU1RSRUFNX0VSUk9SEAoypwYKEUxlZGdlclJlYWRTZXJ2aWNlEmoKEUdldEJhbGFuY2VIaXN0b3J5EigubGVkZ2VyLnJlYWQudjEuR2V0QmFsYW5jZUhpc3RvcnlSZXF1ZXN0GikubGVkZ2VyLnJlYWQudjEuR2V0QmFsYW5jZUhpc3RvcnlSZXNwb25zZSIAEnkKFkdldEVxdWl0eUhpc3RvcnlTZXJpZXMSLS5sZWRnZXIucmVhZC52MS5HZXRFcXVpdHlIaXN0b3J5U2VyaWVzUmVxdWVzdBouLmxlZGdlci5yZWFkLnYxLkdldEVxdWl0eUhpc3RvcnlTZXJpZXNSZXNwb25zZSIAEpQBCh9HZXRQb3J0Zm9saW9FcXVpdHlIaXN0b3J5U2VyaWVzEjYubGVkZ2VyLnJlYWQudjEuR2V0UG9ydGZvbGlvRXF1aXR5SGlzdG9yeVNlcmllc1JlcXVlc3QaNy5sZWRnZXIucmVhZC52MS5HZXRQb3J0Zm9saW9FcXVpdHlIaXN0b3J5U2VyaWVzUmVzcG9uc2UiABKFAQoaR2V0UG9ydGZvbGlvRXF1aXR5U25hcHNob3QSMS5sZWRnZXIucmVhZC52MS5HZXRQb3J0Zm9saW9FcXVpdHlTbmFwc2hvdFJlcXVlc3QaMi5sZWRnZXIucmVhZC52MS5HZXRQb3J0Zm9saW9FcXVpdHlTbmFwc2hvdFJlc3BvbnNlIgASXgoNTGlzdFRyYW5zZmVycxIkLmxlZGdlci5yZWFkLnYxLkxpc3RUcmFuc2ZlcnNSZXF1ZXN0GiUubGVkZ2VyLnJlYWQudjEuTGlzdFRyYW5zZmVyc1Jlc3BvbnNlIgASUgoJTGlzdEhvbGRzEiAubGVkZ2VyLnJlYWQudjEuTGlzdEhvbGRzUmVxdWVzdBohLmxlZGdlci5yZWFkLnYxLkxpc3RIb2xkc1Jlc3BvbnNlIgASWAoLR2V0QmFsYW5jZXMSIi5sZWRnZXIucmVhZC52MS5HZXRCYWxhbmNlc1JlcXVlc3QaIy5sZWRnZXIucmVhZC52MS5HZXRCYWxhbmNlc1Jlc3BvbnNlIgBCR1pFZ2l0aHViLmNvbS9GYWJyaWMtTGFicy9wb2x5ZXN0ZXItc2RrLWdvL2dlbi9sZWRnZXIvcmVhZC92MTtsZWRnZXJyZHYxYgZwcm90bzM=\", [file_ledger_v1_catalog, file_polyester_api_options, file_polyester_type_v1_u128]);\n\n/**\n * @generated from message ledger.read.v1.GetBalancesRequest\n */\nexport type GetBalancesRequest = Message<\"ledger.read.v1.GetBalancesRequest\"> & {\n /**\n * Optional sub-account to scope balances to. If omitted, balances are\n * returned for the authenticated root account derived from the JWT or API\n * key. The logical account id itself is always derived from the caller's JWT\n * or API key, not from this payload.\n *\n * @generated from field: optional fixed64 subaccount_id = 1;\n */\n subaccountId?: bigint | undefined;\n};\n\n/**\n * Describes the message ledger.read.v1.GetBalancesRequest.\n * Use `create(GetBalancesRequestSchema)` to create a new message.\n */\nexport const GetBalancesRequestSchema: GenMessage<GetBalancesRequest> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 0);\n\n/**\n * Fixed-size representation for balances (for Protobuf/WS clients).\n * Uses common U128 messages for amounts to keep schema tidy and consistent.\n *\n * @generated from message ledger.read.v1.AssetBalance\n */\nexport type AssetBalance = Message<\"ledger.read.v1.AssetBalance\"> & {\n /**\n * Public unified asset id. Resolve symbol from SpotConfig; U128 amounts in\n * this message always use fixed 18-decimal ledger scale.\n *\n * @generated from field: uint32 asset_id = 1;\n */\n assetId: number;\n\n /**\n * Trading balance at fixed 18-decimal ledger scale.\n *\n * @generated from field: polyester.type.v1.U128 trading = 2;\n */\n trading?: U128 | undefined;\n\n /**\n * Funding balance at fixed 18-decimal ledger scale.\n *\n * @generated from field: polyester.type.v1.U128 funding = 3;\n */\n funding?: U128 | undefined;\n\n /**\n * Reserved amount in the trading bucket at fixed 18-decimal ledger scale.\n *\n * @generated from field: polyester.type.v1.U128 reserved = 4;\n */\n reserved?: U128 | undefined;\n\n /**\n * Amount currently available for new trading activity at fixed 18-decimal\n * ledger scale. This value already accounts for active reservations.\n *\n * @generated from field: polyester.type.v1.U128 available = 5;\n */\n available?: U128 | undefined;\n\n /**\n * Opaque monotonic revision for the atomic trading, reserved, and available\n * values. Higher means newer; zero means no trading state has been observed.\n *\n * @generated from field: uint64 trading_revision = 6;\n */\n tradingRevision: bigint;\n\n /**\n * Opaque monotonic revision for the funding value. Higher means newer; zero\n * means no funding state has been observed.\n *\n * @generated from field: uint64 funding_revision = 7;\n */\n fundingRevision: bigint;\n};\n\n/**\n * Describes the message ledger.read.v1.AssetBalance.\n * Use `create(AssetBalanceSchema)` to create a new message.\n */\nexport const AssetBalanceSchema: GenMessage<AssetBalance> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 1);\n\n/**\n * @generated from message ledger.read.v1.GetBalancesResponse\n */\nexport type GetBalancesResponse = Message<\"ledger.read.v1.GetBalancesResponse\"> & {\n /**\n * One entry for every supported unified asset, including assets with zero\n * balances. Sorted by available trading amount (highest first), then by\n * asset symbol alphabetically.\n *\n * @generated from field: repeated ledger.read.v1.AssetBalance balances = 1;\n */\n balances: AssetBalance[];\n};\n\n/**\n * Describes the message ledger.read.v1.GetBalancesResponse.\n * Use `create(GetBalancesResponseSchema)` to create a new message.\n */\nexport const GetBalancesResponseSchema: GenMessage<GetBalancesResponse> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 2);\n\n/**\n * @generated from message ledger.read.v1.GetBalanceHistoryRequest\n */\nexport type GetBalanceHistoryRequest = Message<\"ledger.read.v1.GetBalanceHistoryRequest\"> & {\n /**\n * Optional sub-account to scope balances to. If omitted, balances are\n * returned for the authenticated root account derived from the JWT or API\n * key. The logical account id itself is always derived from the caller's JWT\n * or API key, not from this payload.\n *\n * @generated from field: optional fixed64 subaccount_id = 1;\n */\n subaccountId?: bigint | undefined;\n\n /**\n * History window to return. When unset/UNSPECIFIED, defaults to 1D.\n *\n * @generated from field: ledger.read.v1.BalanceRange range = 2;\n */\n range: BalanceRange;\n\n /**\n * Optional public asset filter. When unset/0, returns all assets.\n *\n * @generated from field: uint32 ledger = 3;\n */\n ledger: number;\n\n /**\n * Optional subset of account buckets to return. When empty, returns all\n * account buckets.\n *\n * @generated from field: repeated ledger.v1.AccountCode account_codes = 4;\n */\n accountCodes: AccountCode[];\n};\n\n/**\n * Describes the message ledger.read.v1.GetBalanceHistoryRequest.\n * Use `create(GetBalanceHistoryRequestSchema)` to create a new message.\n */\nexport const GetBalanceHistoryRequestSchema: GenMessage<GetBalanceHistoryRequest> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 3);\n\n/**\n * Columnar balance series payload (scaled integers).\n * REST renders decimal strings from these values.\n *\n * @generated from message ledger.read.v1.BalanceSeries\n */\nexport type BalanceSeries = Message<\"ledger.read.v1.BalanceSeries\"> & {\n /**\n * public unified asset id\n *\n * @generated from field: uint32 asset_id = 1;\n */\n assetId: number;\n\n /**\n * account bucket\n *\n * @generated from field: ledger.v1.AccountCode account_code = 2;\n */\n accountCode: AccountCode;\n\n /**\n * Chart balance in asset units scaled by 1e7 (7 decimals).\n * Values are downscaled from 18-decimal ledger balances for compact charting\n * and align 1:1 with implicit timestamps.\n *\n * @generated from field: repeated uint64 balance_q = 3;\n */\n balanceQ: bigint[];\n};\n\n/**\n * Describes the message ledger.read.v1.BalanceSeries.\n * Use `create(BalanceSeriesSchema)` to create a new message.\n */\nexport const BalanceSeriesSchema: GenMessage<BalanceSeries> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 4);\n\n/**\n * GetBalanceHistoryResponse returns aligned balance chart series.\n *\n * @generated from message ledger.read.v1.GetBalanceHistoryResponse\n */\nexport type GetBalanceHistoryResponse = Message<\"ledger.read.v1.GetBalanceHistoryResponse\"> & {\n /**\n * Resolved history window.\n *\n * @generated from field: ledger.read.v1.BalanceRange range = 1;\n */\n range: BalanceRange;\n\n /**\n * Sampling interval between points, such as \"5m\" or \"1h\".\n *\n * @generated from field: string bucket = 2;\n */\n bucket: string;\n\n /**\n * First point timestamp in seconds since epoch (UTC).\n *\n * @generated from field: fixed32 start_ts_sec = 3;\n */\n startTsSec: number;\n\n /**\n * Last point timestamp in seconds since epoch (UTC).\n *\n * @generated from field: fixed32 end_ts_sec = 4;\n */\n endTsSec: number;\n\n /**\n * Number of aligned points in each returned series.\n *\n * @generated from field: uint32 points = 5;\n */\n points: number;\n\n /**\n * Balance series ordered by asset ID, then account bucket.\n *\n * @generated from field: repeated ledger.read.v1.BalanceSeries series = 6;\n */\n series: BalanceSeries[];\n};\n\n/**\n * Describes the message ledger.read.v1.GetBalanceHistoryResponse.\n * Use `create(GetBalanceHistoryResponseSchema)` to create a new message.\n */\nexport const GetBalanceHistoryResponseSchema: GenMessage<GetBalanceHistoryResponse> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 5);\n\n/**\n * Account grouping metadata (used when group_by = ACCOUNT).\n *\n * @generated from message ledger.read.v1.AccountGrouping\n */\nexport type AccountGrouping = Message<\"ledger.read.v1.AccountGrouping\"> & {\n /**\n * account bucket code\n *\n * @generated from field: uint32 account_code = 1;\n */\n accountCode: number;\n\n /**\n * human-readable name (\"funding\", \"trading\")\n *\n * @generated from field: string name = 2;\n */\n name: string;\n};\n\n/**\n * Describes the message ledger.read.v1.AccountGrouping.\n * Use `create(AccountGroupingSchema)` to create a new message.\n */\nexport const AccountGroupingSchema: GenMessage<AccountGrouping> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 6);\n\n/**\n * Asset grouping metadata (used when group_by = ASSET).\n *\n * @generated from message ledger.read.v1.AssetGrouping\n */\nexport type AssetGrouping = Message<\"ledger.read.v1.AssetGrouping\"> & {\n /**\n * public asset id (0 for \"OTHER\" bucket)\n *\n * @generated from field: uint32 id = 1;\n */\n id: number;\n\n /**\n * asset symbol (\"BTC\", \"ETH\", \"OTHER\")\n *\n * @generated from field: string symbol = 2;\n */\n symbol: string;\n};\n\n/**\n * Describes the message ledger.read.v1.AssetGrouping.\n * Use `create(AssetGroupingSchema)` to create a new message.\n */\nexport const AssetGroupingSchema: GenMessage<AssetGrouping> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 7);\n\n/**\n * Logical account grouping used by root portfolio equity history.\n *\n * @generated from message ledger.read.v1.PortfolioAccountGrouping\n */\nexport type PortfolioAccountGrouping = Message<\"ledger.read.v1.PortfolioAccountGrouping\"> & {\n /**\n * Public account or subaccount ID. Its encoded entity type distinguishes\n * the master account from an owned subaccount. Omitted for Remaining.\n *\n * @generated from field: optional fixed64 account_id = 1;\n */\n accountId?: bigint | undefined;\n\n /**\n * True when this series combines all non-selected owned subaccounts.\n *\n * @generated from field: bool remaining = 2;\n */\n remaining: boolean;\n};\n\n/**\n * Describes the message ledger.read.v1.PortfolioAccountGrouping.\n * Use `create(PortfolioAccountGroupingSchema)` to create a new message.\n */\nexport const PortfolioAccountGroupingSchema: GenMessage<PortfolioAccountGrouping> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 8);\n\n/**\n * Equity history in USDT (or BTC via client-side conversion using btc_prices).\n * Values are derived from per-asset balances and market prices (close ticks).\n *\n * @generated from message ledger.read.v1.GetEquityHistorySeriesRequest\n */\nexport type GetEquityHistorySeriesRequest = Message<\"ledger.read.v1.GetEquityHistorySeriesRequest\"> & {\n /**\n * Optional sub-account to scope equity to. If omitted, equity is returned for\n * the authenticated root account derived from the JWT or API key.\n *\n * @generated from field: optional fixed64 subaccount_id = 1;\n */\n subaccountId?: bigint | undefined;\n\n /**\n * History window to return. When unset/UNSPECIFIED, defaults to 1D.\n *\n * @generated from field: ledger.read.v1.BalanceRange range = 2;\n */\n range: BalanceRange;\n\n /**\n * Optional subset of account buckets.\n * When empty, server returns both funding and trading.\n * Only used when group_by = ACCOUNT.\n *\n * @generated from field: repeated ledger.v1.AccountCode account_codes = 4;\n */\n accountCodes: AccountCode[];\n\n /**\n * How to group the equity series. Defaults to ACCOUNT if unspecified.\n *\n * @generated from field: ledger.read.v1.EquityGroupBy group_by = 5;\n */\n groupBy: EquityGroupBy;\n};\n\n/**\n * Describes the message ledger.read.v1.GetEquityHistorySeriesRequest.\n * Use `create(GetEquityHistorySeriesRequestSchema)` to create a new message.\n */\nexport const GetEquityHistorySeriesRequestSchema: GenMessage<GetEquityHistorySeriesRequest> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 9);\n\n/**\n * Columnar equity series payload (scaled integers).\n * REST renders decimal strings from these values.\n *\n * @generated from message ledger.read.v1.EquitySeries\n */\nexport type EquitySeries = Message<\"ledger.read.v1.EquitySeries\"> & {\n /**\n * Grouping identifier. The serving RPC documents which grouping is returned.\n *\n * @generated from oneof ledger.read.v1.EquitySeries.grouping\n */\n grouping: {\n /**\n * set when group_by = ACCOUNT\n *\n * @generated from field: ledger.read.v1.AccountGrouping account = 1;\n */\n value: AccountGrouping;\n case: \"account\";\n } | {\n /**\n * set when group_by = ASSET\n *\n * @generated from field: ledger.read.v1.AssetGrouping asset = 3;\n */\n value: AssetGrouping;\n case: \"asset\";\n } | {\n /**\n * set for root portfolio history\n *\n * @generated from field: ledger.read.v1.PortfolioAccountGrouping portfolio_account = 4;\n */\n value: PortfolioAccountGrouping;\n case: \"portfolioAccount\";\n } | { case: undefined; value?: undefined };\n\n /**\n * Equity in quote currency (USDT) scaled by 1e4 (4 decimals).\n * Values align 1:1 with timestamps.\n *\n * @generated from field: repeated sint64 equity_q = 2;\n */\n equityQ: bigint[];\n};\n\n/**\n * Describes the message ledger.read.v1.EquitySeries.\n * Use `create(EquitySeriesSchema)` to create a new message.\n */\nexport const EquitySeriesSchema: GenMessage<EquitySeries> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 10);\n\n/**\n * GetEquityHistorySeriesResponse returns aligned equity chart series.\n *\n * @generated from message ledger.read.v1.GetEquityHistorySeriesResponse\n */\nexport type GetEquityHistorySeriesResponse = Message<\"ledger.read.v1.GetEquityHistorySeriesResponse\"> & {\n /**\n * Resolved history window.\n *\n * @generated from field: ledger.read.v1.BalanceRange range = 1;\n */\n range: BalanceRange;\n\n /**\n * Sampling interval between points, such as \"5m\" or \"1h\".\n *\n * @generated from field: string bucket = 2;\n */\n bucket: string;\n\n /**\n * First point timestamp in seconds since epoch (UTC).\n *\n * @generated from field: fixed32 start_ts_sec = 3;\n */\n startTsSec: number;\n\n /**\n * Last point timestamp in seconds since epoch (UTC).\n *\n * @generated from field: fixed32 end_ts_sec = 4;\n */\n endTsSec: number;\n\n /**\n * Human-readable quote asset symbol (always \"USDT\").\n *\n * @generated from field: string quote_asset = 6;\n */\n quoteAsset: string;\n\n /**\n * Number of aligned points in each returned series.\n *\n * @generated from field: uint32 points = 7;\n */\n points: number;\n\n /**\n * Equity series ordered by grouping identifier ascending.\n *\n * @generated from field: repeated ledger.read.v1.EquitySeries series = 8;\n */\n series: EquitySeries[];\n\n /**\n * BTC-USDT close price at each timestamp, scaled by 1e9 (same as price_ticks).\n * Enables client-side conversion to BTC denomination without refetch.\n *\n * @generated from field: repeated int64 btc_prices_q = 10;\n */\n btcPricesQ: bigint[];\n};\n\n/**\n * Describes the message ledger.read.v1.GetEquityHistorySeriesResponse.\n * Use `create(GetEquityHistorySeriesResponseSchema)` to create a new message.\n */\nexport const GetEquityHistorySeriesResponseSchema: GenMessage<GetEquityHistorySeriesResponse> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 11);\n\n/**\n * Requests root portfolio equity history.\n *\n * @generated from message ledger.read.v1.GetPortfolioEquityHistorySeriesRequest\n */\nexport type GetPortfolioEquityHistorySeriesRequest = Message<\"ledger.read.v1.GetPortfolioEquityHistorySeriesRequest\"> & {\n /**\n * History window to return. When unset/UNSPECIFIED, defaults to 1D.\n *\n * @generated from field: ledger.read.v1.BalanceRange range = 1;\n */\n range: BalanceRange;\n};\n\n/**\n * Describes the message ledger.read.v1.GetPortfolioEquityHistorySeriesRequest.\n * Use `create(GetPortfolioEquityHistorySeriesRequestSchema)` to create a new message.\n */\nexport const GetPortfolioEquityHistorySeriesRequestSchema: GenMessage<GetPortfolioEquityHistorySeriesRequest> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 12);\n\n/**\n * Root portfolio equity history with aligned, implicit timestamps.\n *\n * @generated from message ledger.read.v1.GetPortfolioEquityHistorySeriesResponse\n */\nexport type GetPortfolioEquityHistorySeriesResponse = Message<\"ledger.read.v1.GetPortfolioEquityHistorySeriesResponse\"> & {\n /**\n * Resolved history window.\n *\n * @generated from field: ledger.read.v1.BalanceRange range = 1;\n */\n range: BalanceRange;\n\n /**\n * Sampling interval between points, such as \"5m\" or \"1h\".\n *\n * @generated from field: string bucket = 2;\n */\n bucket: string;\n\n /**\n * First point timestamp in seconds since epoch (UTC).\n *\n * @generated from field: fixed32 start_ts_sec = 3;\n */\n startTsSec: number;\n\n /**\n * Last point timestamp in seconds since epoch (UTC).\n *\n * @generated from field: fixed32 end_ts_sec = 4;\n */\n endTsSec: number;\n\n /**\n * Human-readable quote asset symbol (always \"USDT\").\n *\n * @generated from field: string quote_asset = 5;\n */\n quoteAsset: string;\n\n /**\n * Number of aligned points in each returned series.\n *\n * @generated from field: uint32 points = 6;\n */\n points: number;\n\n /**\n * Master account first, followed by up to nine owned subaccounts ordered by\n * current equity descending, then Remaining when other subaccounts exist.\n *\n * @generated from field: repeated ledger.read.v1.EquitySeries series = 7;\n */\n series: EquitySeries[];\n\n /**\n * BTC-USDT close price at each timestamp, scaled by 1e9 (same as price_ticks).\n * Enables client-side conversion to BTC denomination without refetch.\n *\n * @generated from field: repeated int64 btc_prices_q = 8;\n */\n btcPricesQ: bigint[];\n};\n\n/**\n * Describes the message ledger.read.v1.GetPortfolioEquityHistorySeriesResponse.\n * Use `create(GetPortfolioEquityHistorySeriesResponseSchema)` to create a new message.\n */\nexport const GetPortfolioEquityHistorySeriesResponseSchema: GenMessage<GetPortfolioEquityHistorySeriesResponse> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 13);\n\n/**\n * Current equity for one logical account in the root portfolio.\n *\n * @generated from message ledger.read.v1.PortfolioAccountEquity\n */\nexport type PortfolioAccountEquity = Message<\"ledger.read.v1.PortfolioAccountEquity\"> & {\n /**\n * Public master-account or subaccount ID.\n *\n * @generated from field: fixed64 account_id = 1;\n */\n accountId: bigint;\n\n /**\n * Current equity in USDT scaled by 1e4 (4 decimals).\n *\n * @generated from field: sint64 equity_q = 2;\n */\n equityQ: bigint;\n\n /**\n * Up to three assets with the highest current equity value, ordered highest\n * first. Assets without a current value are omitted.\n *\n * @generated from field: repeated uint32 top_asset_ids = 3;\n */\n topAssetIds: number[];\n};\n\n/**\n * Describes the message ledger.read.v1.PortfolioAccountEquity.\n * Use `create(PortfolioAccountEquitySchema)` to create a new message.\n */\nexport const PortfolioAccountEquitySchema: GenMessage<PortfolioAccountEquity> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 14);\n\n/**\n * Current aggregate balance and equity for one asset in the root portfolio.\n *\n * @generated from message ledger.read.v1.PortfolioAssetEquity\n */\nexport type PortfolioAssetEquity = Message<\"ledger.read.v1.PortfolioAssetEquity\"> & {\n /**\n * Public unified asset ID.\n *\n * @generated from field: uint32 asset_id = 1;\n */\n assetId: number;\n\n /**\n * Combined Funding and Trading balance in asset units scaled by 1e7\n * (7 decimals).\n *\n * @generated from field: uint64 balance_q = 2;\n */\n balanceQ: bigint;\n\n /**\n * Current equity in USDT scaled by 1e4 (4 decimals).\n *\n * @generated from field: sint64 equity_q = 3;\n */\n equityQ: bigint;\n};\n\n/**\n * Describes the message ledger.read.v1.PortfolioAssetEquity.\n * Use `create(PortfolioAssetEquitySchema)` to create a new message.\n */\nexport const PortfolioAssetEquitySchema: GenMessage<PortfolioAssetEquity> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 15);\n\n/**\n * Requests a current root portfolio equity snapshot.\n *\n * @generated from message ledger.read.v1.GetPortfolioEquitySnapshotRequest\n */\nexport type GetPortfolioEquitySnapshotRequest = Message<\"ledger.read.v1.GetPortfolioEquitySnapshotRequest\"> & {\n};\n\n/**\n * Describes the message ledger.read.v1.GetPortfolioEquitySnapshotRequest.\n * Use `create(GetPortfolioEquitySnapshotRequestSchema)` to create a new message.\n */\nexport const GetPortfolioEquitySnapshotRequestSchema: GenMessage<GetPortfolioEquitySnapshotRequest> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 16);\n\n/**\n * Current root portfolio equity, grouped by logical account and asset.\n *\n * @generated from message ledger.read.v1.GetPortfolioEquitySnapshotResponse\n */\nexport type GetPortfolioEquitySnapshotResponse = Message<\"ledger.read.v1.GetPortfolioEquitySnapshotResponse\"> & {\n /**\n * Human-readable quote asset symbol (always \"USDT\").\n *\n * @generated from field: string quote_asset = 1;\n */\n quoteAsset: string;\n\n /**\n * Current equity across the master account and all owned subaccounts in USDT,\n * scaled by 1e4 (4 decimals).\n *\n * @generated from field: sint64 total_equity_q = 2;\n */\n totalEquityQ: bigint;\n\n /**\n * Master account first, followed by every owned subaccount ordered by current\n * equity descending and public ID ascending for ties.\n *\n * @generated from field: repeated ledger.read.v1.PortfolioAccountEquity accounts = 3;\n */\n accounts: PortfolioAccountEquity[];\n\n /**\n * Non-zero asset balances ordered by current equity descending and public\n * asset ID ascending for ties.\n *\n * @generated from field: repeated ledger.read.v1.PortfolioAssetEquity assets = 4;\n */\n assets: PortfolioAssetEquity[];\n\n /**\n * Current BTC-USDT price scaled by 1e9. Zero when unavailable.\n *\n * @generated from field: int64 btc_price_q = 5;\n */\n btcPriceQ: bigint;\n};\n\n/**\n * Describes the message ledger.read.v1.GetPortfolioEquitySnapshotResponse.\n * Use `create(GetPortfolioEquitySnapshotResponseSchema)` to create a new message.\n */\nexport const GetPortfolioEquitySnapshotResponseSchema: GenMessage<GetPortfolioEquitySnapshotResponse> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 17);\n\n/**\n * @generated from message ledger.read.v1.ListTransfersRequest\n */\nexport type ListTransfersRequest = Message<\"ledger.read.v1.ListTransfersRequest\"> & {\n /**\n * Optional sub-account to scope transfers to. If omitted, transfers are\n * listed for the authenticated root account derived from the JWT or API key.\n *\n * @generated from field: optional fixed64 subaccount_id = 1;\n */\n subaccountId?: bigint | undefined;\n\n /**\n * Maximum number of transfer rows to return. Defaults to 100 when omitted;\n * maximum is 1000.\n *\n * @generated from field: uint32 limit = 2;\n */\n limit: number;\n\n /**\n * Sort direction. When true, rows are returned newest first; when false,\n * rows are returned oldest first.\n *\n * @generated from field: bool reversed = 3;\n */\n reversed: boolean;\n\n /**\n * Optional lower transfer timestamp bound in microseconds since epoch (UTC),\n * inclusive.\n *\n * @generated from field: uint64 ts_min_us = 4;\n */\n tsMinUs: bigint;\n\n /**\n * Optional upper transfer timestamp bound in microseconds since epoch (UTC),\n * inclusive.\n *\n * @generated from field: uint64 ts_max_us = 5;\n */\n tsMaxUs: bigint;\n\n /**\n * Optional filter by transfer reason.\n *\n * @generated from field: ledger.v1.TransferCode transfer_code = 6;\n */\n transferCode: TransferCode;\n\n /**\n * Optional filter by asset ledger.\n *\n * @generated from field: uint32 ledger = 7;\n */\n ledger: number;\n\n /**\n * Opaque keyset cursor from a previous response. The cursor is exclusive and\n * bound to the authenticated account, sub-account scope, filters, timestamp\n * bounds, and sort direction.\n *\n * @generated from field: string page_token = 9;\n */\n pageToken: string;\n};\n\n/**\n * Describes the message ledger.read.v1.ListTransfersRequest.\n * Use `create(ListTransfersRequestSchema)` to create a new message.\n */\nexport const ListTransfersRequestSchema: GenMessage<ListTransfersRequest> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 18);\n\n/**\n * TransferSide describes one side of a ledger transfer for display.\n *\n * @generated from message ledger.read.v1.TransferSide\n */\nexport type TransferSide = Message<\"ledger.read.v1.TransferSide\"> & {\n /**\n * Display classification for this transfer side.\n *\n * @generated from field: ledger.read.v1.TransferSideKind kind = 1;\n */\n kind: TransferSideKind;\n\n /**\n * Public root account or subaccount ID when this side is safe to identify. Never\n * populated for private counterparties or non-user ledger accounts.\n *\n * @generated from field: optional fixed64 account_id = 2;\n */\n accountId?: bigint | undefined;\n\n /**\n * Address for this side when known. For EXTERNAL_ADDRESS this is an\n * external-chain wallet address from lifecycle correlation; for identifiable\n * Polyester accounts this is a Polyester smart-account address.\n * May be empty until the corresponding lifecycle details are available.\n *\n * @generated from field: string address = 3;\n */\n address: string;\n\n /**\n * PolyChain-registered external network identifier for EXTERNAL_ADDRESS.\n * This matches chain.zipper.v1.ChainConfig.chain_id and is not the chain's\n * native identifier (for example, an EIP-155 id) or the Polyester chain id.\n *\n * @generated from field: optional uint32 chain_id = 4;\n */\n chainId?: number | undefined;\n};\n\n/**\n * Describes the message ledger.read.v1.TransferSide.\n * Use `create(TransferSideSchema)` to create a new message.\n */\nexport const TransferSideSchema: GenMessage<TransferSide> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 19);\n\n/**\n * TransferRow describes one debit or credit leg of a ledger transfer.\n *\n * @generated from message ledger.read.v1.TransferRow\n */\nexport type TransferRow = Message<\"ledger.read.v1.TransferRow\"> & {\n /**\n * Public unified asset ID. Resolve its symbol through the spot configuration\n * API. U128 amounts in this row always use a fixed 18-decimal ledger scale.\n *\n * @generated from field: uint32 asset_id = 1;\n */\n assetId: number;\n\n /**\n * Transfer amount at fixed 18-decimal ledger scale.\n *\n * @generated from field: polyester.type.v1.U128 amount_e18 = 2;\n */\n amountE18?: U128 | undefined;\n\n /**\n * Product reason for this transfer.\n *\n * @generated from field: ledger.v1.TransferCode transfer_code = 3;\n */\n transferCode: TransferCode;\n\n /**\n * Account bucket affected by this transfer.\n *\n * @generated from field: ledger.v1.AccountCode account_code = 4;\n */\n accountCode: AccountCode;\n\n /**\n * Transfer timestamp in microseconds since epoch (UTC).\n *\n * @generated from field: uint64 ts_us = 5;\n */\n tsUs: bigint;\n\n /**\n * Post-transfer balance at fixed 18-decimal ledger scale.\n *\n * @generated from field: polyester.type.v1.U128 balance_after_e18 = 9;\n */\n balanceAfterE18?: U128 | undefined;\n\n /**\n * True when this row is the debit leg; false when it is the credit leg.\n *\n * @generated from field: bool is_debit = 10;\n */\n isDebit: boolean;\n\n /**\n * Correlation ID used to group related transfer legs. Zero when unavailable.\n *\n * @generated from field: uint64 link_id = 11;\n */\n linkId: bigint;\n\n /**\n * Public lifecycle flow ID when this transfer belongs to a chain lifecycle flow.\n *\n * @generated from field: string flow_id = 12;\n */\n flowId: string;\n\n /**\n * Debit side of the transfer. This relationship is debit-to-credit rather\n * than row-relative; use is_debit to determine whether this row is the debit leg.\n *\n * @generated from field: ledger.read.v1.TransferSide source = 13;\n */\n source?: TransferSide | undefined;\n\n /**\n * Credit side of the transfer. This relationship is debit-to-credit rather\n * than row-relative; use is_debit to determine whether this row is the credit leg.\n *\n * @generated from field: ledger.read.v1.TransferSide destination = 14;\n */\n destination?: TransferSide | undefined;\n};\n\n/**\n * Describes the message ledger.read.v1.TransferRow.\n * Use `create(TransferRowSchema)` to create a new message.\n */\nexport const TransferRowSchema: GenMessage<TransferRow> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 20);\n\n/**\n * ListTransfersResponse contains transfer rows and an optional continuation cursor.\n *\n * @generated from message ledger.read.v1.ListTransfersResponse\n */\nexport type ListTransfersResponse = Message<\"ledger.read.v1.ListTransfersResponse\"> & {\n /**\n * Transfer rows in requested order.\n *\n * @generated from field: repeated ledger.read.v1.TransferRow transfers = 1;\n */\n transfers: TransferRow[];\n\n /**\n * Opaque cursor for the next page. Empty when no more results exist.\n *\n * @generated from field: string next_page_token = 3;\n */\n nextPageToken: string;\n};\n\n/**\n * Describes the message ledger.read.v1.ListTransfersResponse.\n * Use `create(ListTransfersResponseSchema)` to create a new message.\n */\nexport const ListTransfersResponseSchema: GenMessage<ListTransfersResponse> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 21);\n\n/**\n * @generated from message ledger.read.v1.ListHoldsRequest\n */\nexport type ListHoldsRequest = Message<\"ledger.read.v1.ListHoldsRequest\"> & {\n /**\n * Optional sub-account to scope holds to. If omitted, holds are listed for\n * the authenticated root account derived from the JWT or API key.\n *\n * @generated from field: optional fixed64 subaccount_id = 1;\n */\n subaccountId?: bigint | undefined;\n\n /**\n * Maximum number of holds to return. Defaults to 100 when omitted; maximum is\n * 1000.\n *\n * @generated from field: uint32 limit = 2;\n */\n limit: number;\n\n /**\n * true=newest first; false=oldest first.\n *\n * @generated from field: bool reversed = 3;\n */\n reversed: boolean;\n\n /**\n * Opaque keyset cursor from a previous response. The cursor is exclusive and\n * bound to account, sub-account scope, and sort direction.\n *\n * @generated from field: string page_token = 4;\n */\n pageToken: string;\n};\n\n/**\n * Describes the message ledger.read.v1.ListHoldsRequest.\n * Use `create(ListHoldsRequestSchema)` to create a new message.\n */\nexport const ListHoldsRequestSchema: GenMessage<ListHoldsRequest> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 22);\n\n/**\n * Hold row with compact integers and client-side resolution.\n *\n * @generated from message ledger.read.v1.HoldRow\n */\nexport type HoldRow = Message<\"ledger.read.v1.HoldRow\"> & {\n /**\n * pending transfer id (numeric)\n *\n * @generated from field: fixed64 hold_id = 1;\n */\n holdId: bigint;\n\n /**\n * Reserved amount at fixed 18-decimal ledger scale.\n *\n * @generated from field: polyester.type.v1.U128 amount_reserved_e18 = 2;\n */\n amountReservedE18?: U128 | undefined;\n\n /**\n * Public unified asset id.\n *\n * @generated from field: uint32 asset_id = 3;\n */\n assetId: number;\n\n /**\n * Expiration time in nanoseconds since epoch (UTC).\n *\n * @generated from field: uint64 expires_at_ns = 4;\n */\n expiresAtNs: bigint;\n};\n\n/**\n * Describes the message ledger.read.v1.HoldRow.\n * Use `create(HoldRowSchema)` to create a new message.\n */\nexport const HoldRowSchema: GenMessage<HoldRow> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 23);\n\n/**\n * @generated from message ledger.read.v1.ListHoldsResponse\n */\nexport type ListHoldsResponse = Message<\"ledger.read.v1.ListHoldsResponse\"> & {\n /**\n * Hold rows in the sort direction requested by the caller.\n *\n * @generated from field: repeated ledger.read.v1.HoldRow holds = 1;\n */\n holds: HoldRow[];\n\n /**\n * Opaque cursor for the next page. Empty when no more results exist.\n *\n * @generated from field: string next_page_token = 2;\n */\n nextPageToken: string;\n};\n\n/**\n * Describes the message ledger.read.v1.ListHoldsResponse.\n * Use `create(ListHoldsResponseSchema)` to create a new message.\n */\nexport const ListHoldsResponseSchema: GenMessage<ListHoldsResponse> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 24);\n\n/**\n * ErrorDetail is attached to ConnectRPC errors for structured error handling.\n * Clients can inspect this to get a stable machine-readable error code.\n *\n * @generated from message ledger.read.v1.ErrorDetail\n */\nexport type ErrorDetail = Message<\"ledger.read.v1.ErrorDetail\"> & {\n /**\n * Stable error code matching the REST problem+json \"code\" field.\n *\n * @generated from field: ledger.read.v1.ErrorCode code = 1;\n */\n code: ErrorCode;\n};\n\n/**\n * Describes the message ledger.read.v1.ErrorDetail.\n * Use `create(ErrorDetailSchema)` to create a new message.\n */\nexport const ErrorDetailSchema: GenMessage<ErrorDetail> = /*@__PURE__*/\n messageDesc(file_ledger_read_v1_ledger_read, 25);\n\n/**\n * Supported history windows for balance charts.\n *\n * @generated from enum ledger.read.v1.BalanceRange\n */\nexport enum BalanceRange {\n /**\n * @generated from enum value: RANGE_UNSPECIFIED = 0;\n */\n RANGE_UNSPECIFIED = 0,\n\n /**\n * 1 day\n *\n * @generated from enum value: DAY_1 = 1;\n */\n DAY_1 = 1,\n\n /**\n * 7 days\n *\n * @generated from enum value: DAY_7 = 2;\n */\n DAY_7 = 2,\n\n /**\n * 30 days\n *\n * @generated from enum value: DAY_30 = 3;\n */\n DAY_30 = 3,\n\n /**\n * 90 days\n *\n * @generated from enum value: DAY_90 = 4;\n */\n DAY_90 = 4,\n\n /**\n * 180 days\n *\n * @generated from enum value: DAY_180 = 5;\n */\n DAY_180 = 5,\n\n /**\n * 365 days\n *\n * @generated from enum value: DAY_365 = 6;\n */\n DAY_365 = 6,\n}\n\n/**\n * Describes the enum ledger.read.v1.BalanceRange.\n */\nexport const BalanceRangeSchema: GenEnum<BalanceRange> = /*@__PURE__*/\n enumDesc(file_ledger_read_v1_ledger_read, 0);\n\n/**\n * How to group equity series data.\n *\n * @generated from enum ledger.read.v1.EquityGroupBy\n */\nexport enum EquityGroupBy {\n /**\n * defaults to ACCOUNT\n *\n * @generated from enum value: GROUP_BY_UNSPECIFIED = 0;\n */\n GROUP_BY_UNSPECIFIED = 0,\n\n /**\n * group by account bucket\n *\n * @generated from enum value: GROUP_BY_ACCOUNT = 1;\n */\n GROUP_BY_ACCOUNT = 1,\n\n /**\n * group by asset (BTC, ETH, etc.)\n *\n * @generated from enum value: GROUP_BY_ASSET = 2;\n */\n GROUP_BY_ASSET = 2,\n}\n\n/**\n * Describes the enum ledger.read.v1.EquityGroupBy.\n */\nexport const EquityGroupBySchema: GenEnum<EquityGroupBy> = /*@__PURE__*/\n enumDesc(file_ledger_read_v1_ledger_read, 1);\n\n/**\n * TransferSideKind identifies the display class for one side of a transfer.\n *\n * @generated from enum ledger.read.v1.TransferSideKind\n */\nexport enum TransferSideKind {\n /**\n * Transfer side type was not specified.\n *\n * @generated from enum value: TRANSFER_SIDE_KIND_UNSPECIFIED = 0;\n */\n TRANSFER_SIDE_KIND_UNSPECIFIED = 0,\n\n /**\n * Polyester funding account.\n *\n * @generated from enum value: FUNDING_ACCOUNT = 1;\n */\n FUNDING_ACCOUNT = 1,\n\n /**\n * Polyester trading account.\n *\n * @generated from enum value: TRADING_ACCOUNT = 2;\n */\n TRADING_ACCOUNT = 2,\n\n /**\n * External wallet or chain address. The address is lifecycle-derived and may\n * be empty until ledger-to-lifecycle correlation is projected.\n *\n * @generated from enum value: EXTERNAL_ADDRESS = 3;\n */\n EXTERNAL_ADDRESS = 3,\n\n /**\n * Private off-chain counterparty that must not be identified to the caller.\n * account_id and address are intentionally omitted.\n *\n * @generated from enum value: PRIVATE_COUNTERPARTY = 4;\n */\n PRIVATE_COUNTERPARTY = 4,\n\n /**\n * Fee ledger side, for example spot or perp trading fees.\n *\n * @generated from enum value: FEE_ACCOUNT = 5;\n */\n FEE_ACCOUNT = 5,\n\n /**\n * System, operator, clearing, or other non-user side.\n *\n * @generated from enum value: SYSTEM_ACCOUNT = 6;\n */\n SYSTEM_ACCOUNT = 6,\n}\n\n/**\n * Describes the enum ledger.read.v1.TransferSideKind.\n */\nexport const TransferSideKindSchema: GenEnum<TransferSideKind> = /*@__PURE__*/\n enumDesc(file_ledger_read_v1_ledger_read, 2);\n\n/**\n * ErrorCode enumerates stable machine-readable error codes for the Ledger Read\n * API. These mirror the REST problem+json \"code\" field for parity between REST\n * and ConnectRPC clients.\n *\n * @generated from enum ledger.read.v1.ErrorCode\n */\nexport enum ErrorCode {\n /**\n * @generated from enum value: ERROR_CODE_UNSPECIFIED = 0;\n */\n UNSPECIFIED = 0,\n\n /**\n * @generated from enum value: ERROR_CODE_BAD_REQUEST = 1;\n */\n BAD_REQUEST = 1,\n\n /**\n * @generated from enum value: ERROR_CODE_UNAUTHENTICATED = 2;\n */\n UNAUTHENTICATED = 2,\n\n /**\n * @generated from enum value: ERROR_CODE_PERMISSION_DENIED = 3;\n */\n PERMISSION_DENIED = 3,\n\n /**\n * @generated from enum value: ERROR_CODE_NOT_FOUND = 4;\n */\n NOT_FOUND = 4,\n\n /**\n * Missing or invalid account identifier (legacy; used by older endpoints).\n *\n * @generated from enum value: ERROR_CODE_MISSING_ACCOUNT_ID = 5;\n */\n MISSING_ACCOUNT_ID = 5,\n\n /**\n * @generated from enum value: ERROR_CODE_INVALID_ACCOUNT_ID = 6;\n */\n INVALID_ACCOUNT_ID = 6,\n\n /**\n * Wallet-specific errors for balance lookups by wallet.\n *\n * @generated from enum value: ERROR_CODE_MISSING_WALLET = 7;\n */\n MISSING_WALLET = 7,\n\n /**\n * @generated from enum value: ERROR_CODE_WALLET_RESOLUTION_UNAVAILABLE = 8;\n */\n WALLET_RESOLUTION_UNAVAILABLE = 8,\n\n /**\n * @generated from enum value: ERROR_CODE_WALLET_NOT_FOUND = 9;\n */\n WALLET_NOT_FOUND = 9,\n\n /**\n * Upstream dependency error (e.g., transfers store, wallet resolver).\n *\n * @generated from enum value: ERROR_CODE_UPSTREAM_ERROR = 10;\n */\n UPSTREAM_ERROR = 10,\n}\n\n/**\n * Describes the enum ledger.read.v1.ErrorCode.\n */\nexport const ErrorCodeSchema: GenEnum<ErrorCode> = /*@__PURE__*/\n enumDesc(file_ledger_read_v1_ledger_read, 3);\n\n/**\n * LedgerReadService exposes read-only ledger endpoints (balances, history, transfers, holds).\n *\n * @generated from service ledger.read.v1.LedgerReadService\n */\nexport const LedgerReadService: GenService<{\n /**\n * Retrieve balance history buckets for an account.\n * Supports optional subaccount, range, asset, and account-code filters.\n *\n * @generated from rpc ledger.read.v1.LedgerReadService.GetBalanceHistory\n */\n getBalanceHistory: {\n methodKind: \"unary\";\n input: typeof GetBalanceHistoryRequestSchema;\n output: typeof GetBalanceHistoryResponseSchema;\n },\n /**\n * Retrieve equity history as columnar series data.\n * Supports optional subaccount, range, account-code filtering, and grouping by account or asset.\n *\n * @generated from rpc ledger.read.v1.LedgerReadService.GetEquityHistorySeries\n */\n getEquityHistorySeries: {\n methodKind: \"unary\";\n input: typeof GetEquityHistorySeriesRequestSchema;\n output: typeof GetEquityHistorySeriesResponseSchema;\n },\n /**\n * Retrieve root portfolio equity history as master, top owned subaccounts,\n * and an aggregate of the remaining owned subaccounts. Requires an\n * interactive root-account session; API keys are not supported.\n *\n * @generated from rpc ledger.read.v1.LedgerReadService.GetPortfolioEquityHistorySeries\n */\n getPortfolioEquityHistorySeries: {\n methodKind: \"unary\";\n input: typeof GetPortfolioEquityHistorySeriesRequestSchema;\n output: typeof GetPortfolioEquityHistorySeriesResponseSchema;\n },\n /**\n * Retrieve current root portfolio equity grouped by logical account and\n * asset. Requires an interactive root-account session; API keys are not\n * supported.\n *\n * @generated from rpc ledger.read.v1.LedgerReadService.GetPortfolioEquitySnapshot\n */\n getPortfolioEquitySnapshot: {\n methodKind: \"unary\";\n input: typeof GetPortfolioEquitySnapshotRequestSchema;\n output: typeof GetPortfolioEquitySnapshotResponseSchema;\n },\n /**\n * List finalized transfer history for an account.\n * Supports optional subaccount, asset, ordering, and cursor filters.\n *\n * @generated from rpc ledger.read.v1.LedgerReadService.ListTransfers\n */\n listTransfers: {\n methodKind: \"unary\";\n input: typeof ListTransfersRequestSchema;\n output: typeof ListTransfersResponseSchema;\n },\n /**\n * ListHolds returns pending holds with integer amounts (u128) and asset ids.\n *\n * @generated from rpc ledger.read.v1.LedgerReadService.ListHolds\n */\n listHolds: {\n methodKind: \"unary\";\n input: typeof ListHoldsRequestSchema;\n output: typeof ListHoldsResponseSchema;\n },\n /**\n * Retrieve the latest balances for an account.\n * Supports optional subaccount scoping and returns asset symbols with decimal amounts on REST.\n *\n * @generated from rpc ledger.read.v1.LedgerReadService.GetBalances\n */\n getBalances: {\n methodKind: \"unary\";\n input: typeof GetBalancesRequestSchema;\n output: typeof GetBalancesResponseSchema;\n },\n}> = /*@__PURE__*/\n serviceDesc(file_ledger_read_v1_ledger_read, 0);\n\n"],"mappings":"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"}