@polyester/sdk 0.5.0 → 0.7.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.
- package/CHANGELOG.md +18 -0
- package/dist/catalogs/readers.d.ts.map +1 -1
- package/dist/catalogs/readers.js +11 -3
- package/dist/catalogs/readers.js.map +1 -1
- package/dist/catalogs/types.d.ts +8 -0
- package/dist/catalogs/types.d.ts.map +1 -1
- package/dist/catalogs/types.js.map +1 -1
- package/dist/gen/auth/v1/address_book_pb.d.ts +8 -0
- package/dist/gen/auth/v1/address_book_pb.d.ts.map +1 -1
- package/dist/gen/auth/v1/address_book_pb.js +1 -1
- package/dist/gen/auth/v1/address_book_pb.js.map +1 -1
- package/dist/gen/auth/v1/auth_pb.d.ts +7 -1
- package/dist/gen/auth/v1/auth_pb.d.ts.map +1 -1
- package/dist/gen/auth/v1/auth_pb.js +7 -1
- package/dist/gen/auth/v1/auth_pb.js.map +1 -1
- package/dist/services/address-book/address-book.d.ts +1 -1
- package/dist/services/address-book/address-book.js +1 -1
- package/dist/services/address-book/address-book.js.map +1 -1
- package/dist/services/address-book/address-book.schemas.d.ts +27 -4
- package/dist/services/address-book/address-book.schemas.d.ts.map +1 -1
- package/dist/services/address-book/address-book.schemas.js +11 -5
- package/dist/services/address-book/address-book.schemas.js.map +1 -1
- package/dist/services/candles/candles.schemas.d.ts +10 -10
- package/dist/services/heatmap/heatmap.schemas.d.ts +13 -13
- package/dist/services/market-overview/market-overview.schemas.d.ts +3 -3
- package/dist/services/orderbook/orderbook.schemas.d.ts +1 -1
- package/dist/services/social-verification/social-verification.schemas.d.ts +10 -2
- package/dist/services/social-verification/social-verification.schemas.d.ts.map +1 -1
- package/dist/services/social-verification/social-verification.schemas.js +4 -2
- package/dist/services/social-verification/social-verification.schemas.js.map +1 -1
- package/dist/services/subaccounts/subaccounts.schemas.d.ts +1 -1
- package/dist/services/trailing-oneof-inputs.js +2 -3
- package/dist/services/trailing-oneof-inputs.js.map +1 -1
- package/dist/services/triggers/trigger-input.schemas.d.ts.map +1 -1
- package/dist/services/triggers/trigger-input.schemas.js +2 -2
- package/dist/services/triggers/trigger-input.schemas.js.map +1 -1
- package/dist/shared/connect-error-mapping.d.ts.map +1 -1
- package/dist/shared/connect-error-mapping.js +1 -0
- package/dist/shared/connect-error-mapping.js.map +1 -1
- package/dist/shared/decimal-surface.d.ts.map +1 -1
- package/dist/shared/decimal-surface.js +12 -3
- package/dist/shared/decimal-surface.js.map +1 -1
- package/dist/shared/wire-bounds.js +9 -0
- package/dist/shared/wire-bounds.js.map +1 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# @polyester/sdk
|
|
2
2
|
|
|
3
|
+
## 0.7.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#70](https://github.com/Fabric-Labs/polyester-sdk-typescript/pull/70) [`a198991`](https://github.com/Fabric-Labs/polyester-sdk-typescript/commit/a1989916b770136e38c9b9dc368f40e0a60a8856) Thanks [@aiiven](https://github.com/aiiven)! - fix(social-verification): align provider handle validation with backend limits and forbidden characters.
|
|
8
|
+
|
|
9
|
+
### Patch Changes
|
|
10
|
+
|
|
11
|
+
- [#70](https://github.com/Fabric-Labs/polyester-sdk-typescript/pull/70) [`a198991`](https://github.com/Fabric-Labs/polyester-sdk-typescript/commit/a1989916b770136e38c9b9dc368f40e0a60a8856) Thanks [@aiiven](https://github.com/aiiven)! - feat(address-book): add atomic tag creation to address-book entry updates.
|
|
12
|
+
|
|
13
|
+
- [#70](https://github.com/Fabric-Labs/polyester-sdk-typescript/pull/70) [`a198991`](https://github.com/Fabric-Labs/polyester-sdk-typescript/commit/a1989916b770136e38c9b9dc368f40e0a60a8856) Thanks [@aiiven](https://github.com/aiiven)! - feat(auth): map structured internal authentication failures to the SDK internal-server error.
|
|
14
|
+
|
|
15
|
+
## 0.6.0
|
|
16
|
+
|
|
17
|
+
### Minor Changes
|
|
18
|
+
|
|
19
|
+
- [#68](https://github.com/Fabric-Labs/polyester-sdk-typescript/pull/68) [`a1a35ec`](https://github.com/Fabric-Labs/polyester-sdk-typescript/commit/a1a35ecaa2948bfd6c9f0a392426ea83fadc166f) Thanks [@huntabyte](https://github.com/huntabyte)! - Reject decimal order and trigger inputs that exceed protobuf signed-integer bounds with `CatalogConversionError`. `getSpotOrderConstraints()` now exposes the derived `maxPrice`, `maxQtyBase`, `maxNotionalQuote`, and `maxQuoteSlippage` wire ceilings.
|
|
20
|
+
|
|
3
21
|
## 0.5.0
|
|
4
22
|
|
|
5
23
|
### Minor Changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readers.d.ts","names":[],"sources":["../../src/catalogs/readers.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"readers.d.ts","names":[],"sources":["../../src/catalogs/readers.ts"],"mappings":";;iBA0wBgB,4BAA4B,UAAU,kBAAkB"}
|
package/dist/catalogs/readers.js
CHANGED
|
@@ -3,6 +3,7 @@ import { CatalogConversionError, CatalogLookupError, CatalogValidationFailedErro
|
|
|
3
3
|
import { indexesFor } from "./indexes.js";
|
|
4
4
|
import { resolveLedgerAssetByLedgerId, resolveZipperAssetByLedgerId } from "./unknown-asset.js";
|
|
5
5
|
import { parseCatalogSnapshot } from "./snapshot-validation.js";
|
|
6
|
+
import { PROTOBUF_INT32_MAX, PROTOBUF_INT64_MAX } from "../shared/wire-bounds.js";
|
|
6
7
|
function isListed(pair, nowMs) {
|
|
7
8
|
if (pair.listingAt === null || pair.listingAt > nowMs) return false;
|
|
8
9
|
if (pair.status === "disabled") return false;
|
|
@@ -306,6 +307,9 @@ var OrdersReader = class {
|
|
|
306
307
|
}
|
|
307
308
|
getSpotOrderConstraints(pair) {
|
|
308
309
|
const config = this.market.requirePair(pair);
|
|
310
|
+
const priceScale = 6;
|
|
311
|
+
const quantityScale = config.baseAsset.quantityScale;
|
|
312
|
+
const quoteAmountScale = config.quoteAsset.quantityScale;
|
|
309
313
|
return {
|
|
310
314
|
symbolId: config.symbolId,
|
|
311
315
|
symbol: config.symbol,
|
|
@@ -314,9 +318,13 @@ var OrdersReader = class {
|
|
|
314
318
|
stepSize: config.stepSize,
|
|
315
319
|
minQtyBase: config.minQtyBase,
|
|
316
320
|
minNotionalQuote: config.minNotionalQuote,
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
321
|
+
maxPrice: scaledToDecimal(PROTOBUF_INT64_MAX, priceScale),
|
|
322
|
+
maxQtyBase: scaledToDecimal(PROTOBUF_INT64_MAX, quantityScale),
|
|
323
|
+
maxNotionalQuote: scaledToDecimal(PROTOBUF_INT64_MAX, quoteAmountScale),
|
|
324
|
+
maxQuoteSlippage: scaledToDecimal(PROTOBUF_INT32_MAX, priceScale),
|
|
325
|
+
priceScale,
|
|
326
|
+
quantityScale,
|
|
327
|
+
quoteAmountScale,
|
|
320
328
|
priceDisplayDecimals: priceConverter(config).displayDecimals,
|
|
321
329
|
quantityDisplayDecimals: config.baseAsset.quantityDisplayDecimals,
|
|
322
330
|
quoteAmountDisplayDecimals: config.quoteAsset.quantityDisplayDecimals
|
|
@@ -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\";\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 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 priceScale: PRICE_SCALE,\n quantityScale: config.baseAsset.quantityScale,\n quoteAmountScale: config.quoteAsset.quantityScale,\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 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 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 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 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 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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"}
|
package/dist/catalogs/types.d.ts
CHANGED
|
@@ -82,6 +82,14 @@ interface SpotOrderConstraints {
|
|
|
82
82
|
readonly stepSize: string;
|
|
83
83
|
readonly minQtyBase: string;
|
|
84
84
|
readonly minNotionalQuote: string;
|
|
85
|
+
/** Price wire-format ceiling. This is not an exchange trading limit. */
|
|
86
|
+
readonly maxPrice: string;
|
|
87
|
+
/** Base-quantity wire-format ceiling. This is not an exchange trading limit. */
|
|
88
|
+
readonly maxQtyBase: string;
|
|
89
|
+
/** Quote-amount wire-format ceiling. This is not an exchange trading limit. */
|
|
90
|
+
readonly maxNotionalQuote: string;
|
|
91
|
+
/** Quote-denominated slippage wire-format ceiling. This is not an exchange trading limit. */
|
|
92
|
+
readonly maxQuoteSlippage: string;
|
|
85
93
|
readonly priceScale: number;
|
|
86
94
|
readonly quantityScale: number;
|
|
87
95
|
readonly quoteAmountScale: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","names":[],"sources":["../../src/catalogs/types.ts"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","names":[],"sources":["../../src/catalogs/types.ts"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../src/catalogs/types.ts"],"sourcesContent":["import type {\n AssetConfig,\n DepositWithdrawConfig,\n PairStatus,\n SpotConfig,\n ZipperChainConfig,\n ZipperChainContractConfig,\n} from \"../shared/catalog-config.js\";\nimport { RequestError, ValidationError } from \"../shared/errors.js\";\nimport type { EnrichedPairConfig, MarketCatalogData } from \"./market-data-catalog.js\";\nimport type {\n ZipperCatalogData,\n ZipperContractName,\n ZipperEnrichedAssetChain,\n ZipperEnrichedAssetConfig,\n} from \"./zipper-catalog.js\";\n\n/** Pair lookup key: symbol, symbolId, or an explicit object form. */\nexport type PairCatalogKey = string | number | { symbol: string } | { symbolId: number };\n/** Asset lookup key: symbol, ledger id, or an explicit object form. */\nexport type AssetCatalogKey = string | number | { symbol: string } | { ledgerId: number };\n/** Chain lookup key: chain code, chain id, or an explicit object form. */\nexport type ChainCatalogKey = string | number | { code: string } | { chainId: number };\n\n/** Raw scaled integer accepted on the SDK side of catalog conversions. */\nexport type ScaledIntegerLike = bigint | number | string;\n\nexport type CatalogLookupDomain = \"market\" | \"ledger\" | \"orders\" | \"zipper\";\nexport type CatalogSnapshotSource = \"api\" | \"snapshot\";\nexport type CatalogStateSource = CatalogSnapshotSource | \"empty\";\n\n/** A catalog lookup key (pair, asset, chain, …) did not match any entry. */\nexport class CatalogLookupError extends RequestError {\n override readonly code = \"CATALOG_LOOKUP_MISS\";\n\n constructor(\n readonly domain: CatalogLookupDomain,\n readonly lookup: string,\n readonly value: string | number,\n ) {\n super(`[catalog] ${domain} ${lookup} not found: ${String(value)}`);\n this.name = \"CatalogLookupError\";\n }\n}\n\n/** The catalog has no snapshot yet — call `catalog.ensureReady()` first. */\nexport class CatalogNotReadyError extends RequestError {\n override readonly code = \"CATALOG_NOT_READY\";\n\n constructor() {\n super(\"[catalog] no catalog snapshot has been loaded\");\n this.name = \"CatalogNotReadyError\";\n }\n}\n\n/** A decimal/scaled conversion failed (bad input or excess precision). */\nexport class CatalogConversionError extends ValidationError {\n override readonly code = \"CATALOG_CONVERSION_INVALID\";\n\n constructor(\n readonly field: string,\n message: string,\n ) {\n super(`[catalog] ${message}`);\n this.name = \"CatalogConversionError\";\n }\n}\n\n/** Order input failed validation against pair constraints. */\nexport class CatalogValidationFailedError extends ValidationError {\n override readonly code = \"CATALOG_VALIDATION_FAILED\";\n\n constructor(readonly errors: readonly CatalogValidationError[]) {\n super(\n `[catalog] order input validation failed: ${errors\n .map((error) => error.message)\n .join(\"; \")}`,\n );\n this.name = \"CatalogValidationFailedError\";\n }\n}\n\n/**\n * Result of a strict decimal-to-SDK conversion. `scaledValue` is the raw\n * JSON-safe integer string for service calls; `decimal` is the exact decimal\n * string; `display` is the display-normalized decimal string.\n */\nexport interface ParsedCatalogAmount {\n readonly scaledValue: string;\n readonly decimal: string;\n readonly display: string;\n readonly scale: number;\n}\n\nexport interface CatalogValidationError {\n readonly field: string;\n readonly rule: string;\n readonly message: string;\n readonly expected?: string;\n readonly actual?: string;\n}\n\nexport interface CatalogValidationResult {\n readonly valid: boolean;\n readonly errors: readonly CatalogValidationError[];\n}\n\n/** Trading constraints for a spot pair, for UI decisions and input validation. */\nexport interface SpotOrderConstraints {\n readonly symbolId: number;\n readonly symbol: string;\n readonly status: PairStatus;\n readonly tickSize: string;\n readonly stepSize: string;\n readonly minQtyBase: string;\n readonly minNotionalQuote: string;\n readonly priceScale: number;\n readonly quantityScale: number;\n readonly quoteAmountScale: number;\n readonly priceDisplayDecimals: number;\n readonly quantityDisplayDecimals: number;\n readonly quoteAmountDisplayDecimals: number;\n}\n\nexport interface SpotOrderDecimalInput {\n readonly pair: PairCatalogKey;\n readonly quantity: string;\n readonly price?: string;\n}\n\nexport interface ZipperAssetChainRoute {\n readonly asset: ZipperEnrichedAssetConfig;\n readonly chain: ZipperEnrichedAssetChain;\n}\n\nexport interface CatalogReader {\n readonly market: MarketCatalogReader;\n readonly ledger: LedgerCatalogReader;\n readonly orders: OrdersCatalogReader;\n readonly zipper: ZipperCatalogReader;\n snapshot(): CatalogSnapshot;\n}\n\nexport interface ClientCatalog extends CatalogReader {\n state(): CatalogState;\n /** Passive: resolves the current snapshot or in-flight refresh; never starts one. */\n ready(): Promise<CatalogSnapshot | null>;\n /** Resolves the current snapshot, starting a refresh when the catalog is empty. */\n ensureReady(): Promise<CatalogSnapshot>;\n refresh(): Promise<CatalogSnapshot>;\n setSnapshot(snapshot: CatalogSnapshot): void;\n}\n\nexport interface CatalogSnapshot {\n readonly source: CatalogSnapshotSource;\n readonly tsMs: number;\n readonly version: number;\n readonly market: MarketCatalogData;\n readonly zipper: ZipperCatalogData;\n}\n\nexport type CatalogState =\n | { status: \"empty\" }\n | { status: \"refreshing\"; previousSource: CatalogStateSource }\n | { status: \"fresh\"; source: CatalogSnapshotSource }\n | { status: \"stale\"; source: CatalogStateSource; error: unknown };\n\nexport interface CatalogRefreshSource {\n market(): Promise<SpotConfig>;\n zipper(): Promise<DepositWithdrawConfig>;\n}\n\n/**\n * External storage for the catalog's current snapshot. Injecting a cell lets the host\n * own where the snapshot lives (e.g. a reactive signal) while the catalog keeps owning\n * all logic — refresh, dedup, state, readers. Every reader lookup goes through\n * `get()`, so a host whose `get()` reads a reactive source makes every catalog read\n * reactive by construction.\n */\nexport interface CatalogSnapshotCell {\n get(): CatalogSnapshot | undefined;\n set(snapshot: CatalogSnapshot): void;\n}\n\nexport interface CreatePolyesterCatalogOptions {\n snapshot?: CatalogSnapshot;\n refresh?: false | CatalogRefreshSource;\n /** When provided, the catalog reads/writes its snapshot through this cell. */\n cell?: CatalogSnapshotCell;\n}\n\nexport interface MarketCatalogReader {\n listAssets(): readonly AssetConfig[];\n getAsset(asset: AssetCatalogKey): AssetConfig | null;\n requireAsset(asset: AssetCatalogKey): AssetConfig;\n getAssetBySymbol(assetSymbol: string): AssetConfig | null;\n requireAssetBySymbol(assetSymbol: string): AssetConfig;\n getAssetByLedgerId(ledgerAssetId: number): AssetConfig;\n requireAssetByLedgerId(ledgerAssetId: number): AssetConfig;\n\n listPairs(filter?: {\n listed?: boolean;\n everListed?: boolean;\n atMs?: number;\n }): readonly EnrichedPairConfig[];\n getPair(pair: PairCatalogKey): EnrichedPairConfig | null;\n requirePair(pair: PairCatalogKey): EnrichedPairConfig;\n getPairBySymbol(pairSymbol: string): EnrichedPairConfig | null;\n requirePairBySymbol(pairSymbol: string): EnrichedPairConfig;\n getPairBySymbolId(pairSymbolId: number): EnrichedPairConfig | null;\n requirePairBySymbolId(pairSymbolId: number): EnrichedPairConfig;\n getSymbolIdByPairSymbol(pairSymbol: string): number | null;\n requireSymbolIdByPairSymbol(pairSymbol: string): number;\n getPairSymbolBySymbolId(pairSymbolId: number): string | null;\n requirePairSymbolBySymbolId(pairSymbolId: number): string;\n\n /** Strictly converts a decimal price into raw price ticks. */\n decimalPriceToTicks(price: string, pair: PairCatalogKey): ParsedCatalogAmount;\n /** Truncates a raw price input to the pair's price precision. */\n normalizePriceInput(price: string, pair: PairCatalogKey): string;\n priceTicksToDecimalString(priceTicks: ScaledIntegerLike, pair: PairCatalogKey): string;\n priceTicksToDisplayString(priceTicks: ScaledIntegerLike, pair: PairCatalogKey): string;\n /** Display-rounds a decimal price string (grouping-free) for UI rendering. */\n formatPrice(price: string, pair: PairCatalogKey): string;\n\n /** Strictly converts a decimal base quantity into the pair's scaled quantity. */\n decimalQuantityToScaled(quantity: string, pair: PairCatalogKey): ParsedCatalogAmount;\n /** Truncates a raw quantity input to the base asset's quantity scale. */\n normalizeQuantityInput(quantity: string, pair: PairCatalogKey): string;\n quantityScaledToDecimalString(quantityScaled: ScaledIntegerLike, pair: PairCatalogKey): string;\n quantityScaledToDisplayString(quantityScaled: ScaledIntegerLike, pair: PairCatalogKey): string;\n /** Display-rounds a decimal base-quantity string for UI rendering. */\n formatQuantity(quantity: string, pair: PairCatalogKey): string;\n\n /** Strictly converts a decimal quote amount into the quote asset's scaled amount. */\n decimalQuoteAmountToScaled(amount: string, pair: PairCatalogKey): ParsedCatalogAmount;\n /** Truncates a raw quote amount input to the quote asset's quantity scale. */\n normalizeQuoteAmountInput(amount: string, pair: PairCatalogKey): string;\n quoteAmountScaledToDecimalString(amountScaled: ScaledIntegerLike, pair: PairCatalogKey): string;\n quoteAmountScaledToDisplayString(amountScaled: ScaledIntegerLike, pair: PairCatalogKey): string;\n /** Display-rounds a decimal quote-amount string for UI rendering. */\n formatQuoteAmount(amount: string, pair: PairCatalogKey): string;\n}\n\nexport interface LedgerCatalogReader {\n getAssetByLedgerId(ledgerAssetId: number): AssetConfig;\n requireAssetByLedgerId(ledgerAssetId: number): AssetConfig;\n getAssetBySymbol(assetSymbol: string): AssetConfig | null;\n requireAssetBySymbol(assetSymbol: string): AssetConfig;\n getLedgerIdBySymbol(assetSymbol: string): number | null;\n requireLedgerIdBySymbol(assetSymbol: string): number;\n requireSymbolByLedgerId(ledgerAssetId: number): string;\n isKnownAssetId(ledgerAssetId: number): boolean;\n\n /** Strictly converts a decimal amount into the asset's scaled amount. */\n decimalAmountToScaled(amount: string, asset: AssetCatalogKey): ParsedCatalogAmount;\n /** Truncates a raw amount input to the asset's quantity scale. */\n normalizeAmountInput(amount: string, asset: AssetCatalogKey): string;\n amountScaledToDecimalString(amountScaled: ScaledIntegerLike, asset: AssetCatalogKey): string;\n amountScaledToDisplayString(amountScaled: ScaledIntegerLike, asset: AssetCatalogKey): string;\n /** Display-rounds a decimal ledger-amount string for UI rendering. */\n formatAmount(amount: string, asset: AssetCatalogKey): string;\n}\n\nexport interface OrdersCatalogReader {\n getSpotOrderConstraints(pair: PairCatalogKey): SpotOrderConstraints;\n /**\n * Validates decimal order input against pair constraints: parseability,\n * tick size, step size, min quantity, and min notional when a price is\n * present. Pair status is exposed via constraints, not enforced here.\n */\n validateSpotOrderDecimalInput(input: SpotOrderDecimalInput): CatalogValidationResult;\n /** Like {@link validateSpotOrderDecimalInput} but throws {@link CatalogValidationFailedError}. */\n assertSpotOrderDecimalInput(input: SpotOrderDecimalInput): void;\n}\n\nexport interface ZipperCatalogReader {\n listChains(): readonly ZipperChainConfig[];\n getChain(chain: ChainCatalogKey): ZipperChainConfig | null;\n requireChain(chain: ChainCatalogKey): ZipperChainConfig;\n getChainByCode(chainCode: string): ZipperChainConfig | null;\n requireChainByCode(chainCode: string): ZipperChainConfig;\n getChainById(chainId: number): ZipperChainConfig | null;\n requireChainById(chainId: number): ZipperChainConfig;\n getChainIdByCode(chainCode: string): number | null;\n requireChainIdByCode(chainCode: string): number;\n\n listAssets(): readonly ZipperEnrichedAssetConfig[];\n getAsset(asset: AssetCatalogKey): ZipperEnrichedAssetConfig | null;\n requireAsset(asset: AssetCatalogKey): ZipperEnrichedAssetConfig;\n getAssetBySymbol(assetSymbol: string): ZipperEnrichedAssetConfig | null;\n requireAssetBySymbol(assetSymbol: string): ZipperEnrichedAssetConfig;\n getAssetByLedgerId(ledgerAssetId: number): ZipperEnrichedAssetConfig;\n requireAssetByLedgerId(ledgerAssetId: number): ZipperEnrichedAssetConfig;\n getAssetByUAssetId(uAssetId: string): ZipperEnrichedAssetConfig | null;\n requireAssetByUAssetId(uAssetId: string): ZipperEnrichedAssetConfig;\n\n getAssetChain(asset: AssetCatalogKey, chain: ChainCatalogKey): ZipperAssetChainRoute | null;\n requireAssetChain(asset: AssetCatalogKey, chain: ChainCatalogKey): ZipperAssetChainRoute;\n getAssetChainByZippedAssetId(zippedAssetId: number): ZipperAssetChainRoute | null;\n requireAssetChainByZippedAssetId(zippedAssetId: number): ZipperAssetChainRoute;\n getZippedAssetId(asset: AssetCatalogKey, chain: ChainCatalogKey): number | null;\n requireZippedAssetId(asset: AssetCatalogKey, chain: ChainCatalogKey): number;\n\n listContracts(): readonly ZipperChainContractConfig[];\n getContract(contractName: ZipperContractName): ZipperChainContractConfig | null;\n requireContract(contractName: ZipperContractName): ZipperChainContractConfig;\n getContractByName(contractName: ZipperContractName): ZipperChainContractConfig | null;\n requireContractByName(contractName: ZipperContractName): ZipperChainContractConfig;\n}\n"],"mappings":";;;AAgCA,IAAa,qBAAb,cAAwC,aAAa;CAIpC;CACA;CACA;CALb,OAAyB;CAEzB,YACI,QACA,QACA,OACF;EACE,MAAM,aAAa,OAAO,GAAG,OAAO,cAAc,OAAO,KAAK,GAAG;EAJxD,KAAA,SAAA;EACA,KAAA,SAAA;EACA,KAAA,QAAA;EAGT,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,uBAAb,cAA0C,aAAa;CACnD,OAAyB;CAEzB,cAAc;EACV,MAAM,+CAA+C;EACrD,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,yBAAb,cAA4C,gBAAgB;CAI3C;CAHb,OAAyB;CAEzB,YACI,OACA,SACF;EACE,MAAM,aAAa,SAAS;EAHnB,KAAA,QAAA;EAIT,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,+BAAb,cAAkD,gBAAgB;CAGzC;CAFrB,OAAyB;CAEzB,YAAY,QAAoD;EAC5D,MACI,4CAA4C,OACvC,KAAK,UAAU,MAAM,OAAO,CAAC,CAC7B,KAAK,IAAI,GAClB;EALiB,KAAA,SAAA;EAMjB,KAAK,OAAO;CAChB;AACJ"}
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../src/catalogs/types.ts"],"sourcesContent":["import type {\n AssetConfig,\n DepositWithdrawConfig,\n PairStatus,\n SpotConfig,\n ZipperChainConfig,\n ZipperChainContractConfig,\n} from \"../shared/catalog-config.js\";\nimport { RequestError, ValidationError } from \"../shared/errors.js\";\nimport type { EnrichedPairConfig, MarketCatalogData } from \"./market-data-catalog.js\";\nimport type {\n ZipperCatalogData,\n ZipperContractName,\n ZipperEnrichedAssetChain,\n ZipperEnrichedAssetConfig,\n} from \"./zipper-catalog.js\";\n\n/** Pair lookup key: symbol, symbolId, or an explicit object form. */\nexport type PairCatalogKey = string | number | { symbol: string } | { symbolId: number };\n/** Asset lookup key: symbol, ledger id, or an explicit object form. */\nexport type AssetCatalogKey = string | number | { symbol: string } | { ledgerId: number };\n/** Chain lookup key: chain code, chain id, or an explicit object form. */\nexport type ChainCatalogKey = string | number | { code: string } | { chainId: number };\n\n/** Raw scaled integer accepted on the SDK side of catalog conversions. */\nexport type ScaledIntegerLike = bigint | number | string;\n\nexport type CatalogLookupDomain = \"market\" | \"ledger\" | \"orders\" | \"zipper\";\nexport type CatalogSnapshotSource = \"api\" | \"snapshot\";\nexport type CatalogStateSource = CatalogSnapshotSource | \"empty\";\n\n/** A catalog lookup key (pair, asset, chain, …) did not match any entry. */\nexport class CatalogLookupError extends RequestError {\n override readonly code = \"CATALOG_LOOKUP_MISS\";\n\n constructor(\n readonly domain: CatalogLookupDomain,\n readonly lookup: string,\n readonly value: string | number,\n ) {\n super(`[catalog] ${domain} ${lookup} not found: ${String(value)}`);\n this.name = \"CatalogLookupError\";\n }\n}\n\n/** The catalog has no snapshot yet — call `catalog.ensureReady()` first. */\nexport class CatalogNotReadyError extends RequestError {\n override readonly code = \"CATALOG_NOT_READY\";\n\n constructor() {\n super(\"[catalog] no catalog snapshot has been loaded\");\n this.name = \"CatalogNotReadyError\";\n }\n}\n\n/** A decimal/scaled conversion failed (bad input or excess precision). */\nexport class CatalogConversionError extends ValidationError {\n override readonly code = \"CATALOG_CONVERSION_INVALID\";\n\n constructor(\n readonly field: string,\n message: string,\n ) {\n super(`[catalog] ${message}`);\n this.name = \"CatalogConversionError\";\n }\n}\n\n/** Order input failed validation against pair constraints. */\nexport class CatalogValidationFailedError extends ValidationError {\n override readonly code = \"CATALOG_VALIDATION_FAILED\";\n\n constructor(readonly errors: readonly CatalogValidationError[]) {\n super(\n `[catalog] order input validation failed: ${errors\n .map((error) => error.message)\n .join(\"; \")}`,\n );\n this.name = \"CatalogValidationFailedError\";\n }\n}\n\n/**\n * Result of a strict decimal-to-SDK conversion. `scaledValue` is the raw\n * JSON-safe integer string for service calls; `decimal` is the exact decimal\n * string; `display` is the display-normalized decimal string.\n */\nexport interface ParsedCatalogAmount {\n readonly scaledValue: string;\n readonly decimal: string;\n readonly display: string;\n readonly scale: number;\n}\n\nexport interface CatalogValidationError {\n readonly field: string;\n readonly rule: string;\n readonly message: string;\n readonly expected?: string;\n readonly actual?: string;\n}\n\nexport interface CatalogValidationResult {\n readonly valid: boolean;\n readonly errors: readonly CatalogValidationError[];\n}\n\n/** Trading constraints for a spot pair, for UI decisions and input validation. */\nexport interface SpotOrderConstraints {\n readonly symbolId: number;\n readonly symbol: string;\n readonly status: PairStatus;\n readonly tickSize: string;\n readonly stepSize: string;\n readonly minQtyBase: string;\n readonly minNotionalQuote: string;\n /** Price wire-format ceiling. This is not an exchange trading limit. */\n readonly maxPrice: string;\n /** Base-quantity wire-format ceiling. This is not an exchange trading limit. */\n readonly maxQtyBase: string;\n /** Quote-amount wire-format ceiling. This is not an exchange trading limit. */\n readonly maxNotionalQuote: string;\n /** Quote-denominated slippage wire-format ceiling. This is not an exchange trading limit. */\n readonly maxQuoteSlippage: string;\n readonly priceScale: number;\n readonly quantityScale: number;\n readonly quoteAmountScale: number;\n readonly priceDisplayDecimals: number;\n readonly quantityDisplayDecimals: number;\n readonly quoteAmountDisplayDecimals: number;\n}\n\nexport interface SpotOrderDecimalInput {\n readonly pair: PairCatalogKey;\n readonly quantity: string;\n readonly price?: string;\n}\n\nexport interface ZipperAssetChainRoute {\n readonly asset: ZipperEnrichedAssetConfig;\n readonly chain: ZipperEnrichedAssetChain;\n}\n\nexport interface CatalogReader {\n readonly market: MarketCatalogReader;\n readonly ledger: LedgerCatalogReader;\n readonly orders: OrdersCatalogReader;\n readonly zipper: ZipperCatalogReader;\n snapshot(): CatalogSnapshot;\n}\n\nexport interface ClientCatalog extends CatalogReader {\n state(): CatalogState;\n /** Passive: resolves the current snapshot or in-flight refresh; never starts one. */\n ready(): Promise<CatalogSnapshot | null>;\n /** Resolves the current snapshot, starting a refresh when the catalog is empty. */\n ensureReady(): Promise<CatalogSnapshot>;\n refresh(): Promise<CatalogSnapshot>;\n setSnapshot(snapshot: CatalogSnapshot): void;\n}\n\nexport interface CatalogSnapshot {\n readonly source: CatalogSnapshotSource;\n readonly tsMs: number;\n readonly version: number;\n readonly market: MarketCatalogData;\n readonly zipper: ZipperCatalogData;\n}\n\nexport type CatalogState =\n | { status: \"empty\" }\n | { status: \"refreshing\"; previousSource: CatalogStateSource }\n | { status: \"fresh\"; source: CatalogSnapshotSource }\n | { status: \"stale\"; source: CatalogStateSource; error: unknown };\n\nexport interface CatalogRefreshSource {\n market(): Promise<SpotConfig>;\n zipper(): Promise<DepositWithdrawConfig>;\n}\n\n/**\n * External storage for the catalog's current snapshot. Injecting a cell lets the host\n * own where the snapshot lives (e.g. a reactive signal) while the catalog keeps owning\n * all logic — refresh, dedup, state, readers. Every reader lookup goes through\n * `get()`, so a host whose `get()` reads a reactive source makes every catalog read\n * reactive by construction.\n */\nexport interface CatalogSnapshotCell {\n get(): CatalogSnapshot | undefined;\n set(snapshot: CatalogSnapshot): void;\n}\n\nexport interface CreatePolyesterCatalogOptions {\n snapshot?: CatalogSnapshot;\n refresh?: false | CatalogRefreshSource;\n /** When provided, the catalog reads/writes its snapshot through this cell. */\n cell?: CatalogSnapshotCell;\n}\n\nexport interface MarketCatalogReader {\n listAssets(): readonly AssetConfig[];\n getAsset(asset: AssetCatalogKey): AssetConfig | null;\n requireAsset(asset: AssetCatalogKey): AssetConfig;\n getAssetBySymbol(assetSymbol: string): AssetConfig | null;\n requireAssetBySymbol(assetSymbol: string): AssetConfig;\n getAssetByLedgerId(ledgerAssetId: number): AssetConfig;\n requireAssetByLedgerId(ledgerAssetId: number): AssetConfig;\n\n listPairs(filter?: {\n listed?: boolean;\n everListed?: boolean;\n atMs?: number;\n }): readonly EnrichedPairConfig[];\n getPair(pair: PairCatalogKey): EnrichedPairConfig | null;\n requirePair(pair: PairCatalogKey): EnrichedPairConfig;\n getPairBySymbol(pairSymbol: string): EnrichedPairConfig | null;\n requirePairBySymbol(pairSymbol: string): EnrichedPairConfig;\n getPairBySymbolId(pairSymbolId: number): EnrichedPairConfig | null;\n requirePairBySymbolId(pairSymbolId: number): EnrichedPairConfig;\n getSymbolIdByPairSymbol(pairSymbol: string): number | null;\n requireSymbolIdByPairSymbol(pairSymbol: string): number;\n getPairSymbolBySymbolId(pairSymbolId: number): string | null;\n requirePairSymbolBySymbolId(pairSymbolId: number): string;\n\n /** Strictly converts a decimal price into raw price ticks. */\n decimalPriceToTicks(price: string, pair: PairCatalogKey): ParsedCatalogAmount;\n /** Truncates a raw price input to the pair's price precision. */\n normalizePriceInput(price: string, pair: PairCatalogKey): string;\n priceTicksToDecimalString(priceTicks: ScaledIntegerLike, pair: PairCatalogKey): string;\n priceTicksToDisplayString(priceTicks: ScaledIntegerLike, pair: PairCatalogKey): string;\n /** Display-rounds a decimal price string (grouping-free) for UI rendering. */\n formatPrice(price: string, pair: PairCatalogKey): string;\n\n /** Strictly converts a decimal base quantity into the pair's scaled quantity. */\n decimalQuantityToScaled(quantity: string, pair: PairCatalogKey): ParsedCatalogAmount;\n /** Truncates a raw quantity input to the base asset's quantity scale. */\n normalizeQuantityInput(quantity: string, pair: PairCatalogKey): string;\n quantityScaledToDecimalString(quantityScaled: ScaledIntegerLike, pair: PairCatalogKey): string;\n quantityScaledToDisplayString(quantityScaled: ScaledIntegerLike, pair: PairCatalogKey): string;\n /** Display-rounds a decimal base-quantity string for UI rendering. */\n formatQuantity(quantity: string, pair: PairCatalogKey): string;\n\n /** Strictly converts a decimal quote amount into the quote asset's scaled amount. */\n decimalQuoteAmountToScaled(amount: string, pair: PairCatalogKey): ParsedCatalogAmount;\n /** Truncates a raw quote amount input to the quote asset's quantity scale. */\n normalizeQuoteAmountInput(amount: string, pair: PairCatalogKey): string;\n quoteAmountScaledToDecimalString(amountScaled: ScaledIntegerLike, pair: PairCatalogKey): string;\n quoteAmountScaledToDisplayString(amountScaled: ScaledIntegerLike, pair: PairCatalogKey): string;\n /** Display-rounds a decimal quote-amount string for UI rendering. */\n formatQuoteAmount(amount: string, pair: PairCatalogKey): string;\n}\n\nexport interface LedgerCatalogReader {\n getAssetByLedgerId(ledgerAssetId: number): AssetConfig;\n requireAssetByLedgerId(ledgerAssetId: number): AssetConfig;\n getAssetBySymbol(assetSymbol: string): AssetConfig | null;\n requireAssetBySymbol(assetSymbol: string): AssetConfig;\n getLedgerIdBySymbol(assetSymbol: string): number | null;\n requireLedgerIdBySymbol(assetSymbol: string): number;\n requireSymbolByLedgerId(ledgerAssetId: number): string;\n isKnownAssetId(ledgerAssetId: number): boolean;\n\n /** Strictly converts a decimal amount into the asset's scaled amount. */\n decimalAmountToScaled(amount: string, asset: AssetCatalogKey): ParsedCatalogAmount;\n /** Truncates a raw amount input to the asset's quantity scale. */\n normalizeAmountInput(amount: string, asset: AssetCatalogKey): string;\n amountScaledToDecimalString(amountScaled: ScaledIntegerLike, asset: AssetCatalogKey): string;\n amountScaledToDisplayString(amountScaled: ScaledIntegerLike, asset: AssetCatalogKey): string;\n /** Display-rounds a decimal ledger-amount string for UI rendering. */\n formatAmount(amount: string, asset: AssetCatalogKey): string;\n}\n\nexport interface OrdersCatalogReader {\n getSpotOrderConstraints(pair: PairCatalogKey): SpotOrderConstraints;\n /**\n * Validates decimal order input against pair constraints: parseability,\n * tick size, step size, min quantity, and min notional when a price is\n * present. Pair status is exposed via constraints, not enforced here.\n */\n validateSpotOrderDecimalInput(input: SpotOrderDecimalInput): CatalogValidationResult;\n /** Like {@link validateSpotOrderDecimalInput} but throws {@link CatalogValidationFailedError}. */\n assertSpotOrderDecimalInput(input: SpotOrderDecimalInput): void;\n}\n\nexport interface ZipperCatalogReader {\n listChains(): readonly ZipperChainConfig[];\n getChain(chain: ChainCatalogKey): ZipperChainConfig | null;\n requireChain(chain: ChainCatalogKey): ZipperChainConfig;\n getChainByCode(chainCode: string): ZipperChainConfig | null;\n requireChainByCode(chainCode: string): ZipperChainConfig;\n getChainById(chainId: number): ZipperChainConfig | null;\n requireChainById(chainId: number): ZipperChainConfig;\n getChainIdByCode(chainCode: string): number | null;\n requireChainIdByCode(chainCode: string): number;\n\n listAssets(): readonly ZipperEnrichedAssetConfig[];\n getAsset(asset: AssetCatalogKey): ZipperEnrichedAssetConfig | null;\n requireAsset(asset: AssetCatalogKey): ZipperEnrichedAssetConfig;\n getAssetBySymbol(assetSymbol: string): ZipperEnrichedAssetConfig | null;\n requireAssetBySymbol(assetSymbol: string): ZipperEnrichedAssetConfig;\n getAssetByLedgerId(ledgerAssetId: number): ZipperEnrichedAssetConfig;\n requireAssetByLedgerId(ledgerAssetId: number): ZipperEnrichedAssetConfig;\n getAssetByUAssetId(uAssetId: string): ZipperEnrichedAssetConfig | null;\n requireAssetByUAssetId(uAssetId: string): ZipperEnrichedAssetConfig;\n\n getAssetChain(asset: AssetCatalogKey, chain: ChainCatalogKey): ZipperAssetChainRoute | null;\n requireAssetChain(asset: AssetCatalogKey, chain: ChainCatalogKey): ZipperAssetChainRoute;\n getAssetChainByZippedAssetId(zippedAssetId: number): ZipperAssetChainRoute | null;\n requireAssetChainByZippedAssetId(zippedAssetId: number): ZipperAssetChainRoute;\n getZippedAssetId(asset: AssetCatalogKey, chain: ChainCatalogKey): number | null;\n requireZippedAssetId(asset: AssetCatalogKey, chain: ChainCatalogKey): number;\n\n listContracts(): readonly ZipperChainContractConfig[];\n getContract(contractName: ZipperContractName): ZipperChainContractConfig | null;\n requireContract(contractName: ZipperContractName): ZipperChainContractConfig;\n getContractByName(contractName: ZipperContractName): ZipperChainContractConfig | null;\n requireContractByName(contractName: ZipperContractName): ZipperChainContractConfig;\n}\n"],"mappings":";;;AAgCA,IAAa,qBAAb,cAAwC,aAAa;CAIpC;CACA;CACA;CALb,OAAyB;CAEzB,YACI,QACA,QACA,OACF;EACE,MAAM,aAAa,OAAO,GAAG,OAAO,cAAc,OAAO,KAAK,GAAG;EAJxD,KAAA,SAAA;EACA,KAAA,SAAA;EACA,KAAA,QAAA;EAGT,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,uBAAb,cAA0C,aAAa;CACnD,OAAyB;CAEzB,cAAc;EACV,MAAM,+CAA+C;EACrD,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,yBAAb,cAA4C,gBAAgB;CAI3C;CAHb,OAAyB;CAEzB,YACI,OACA,SACF;EACE,MAAM,aAAa,SAAS;EAHnB,KAAA,QAAA;EAIT,KAAK,OAAO;CAChB;AACJ;;AAGA,IAAa,+BAAb,cAAkD,gBAAgB;CAGzC;CAFrB,OAAyB;CAEzB,YAAY,QAAoD;EAC5D,MACI,4CAA4C,OACvC,KAAK,UAAU,MAAM,OAAO,CAAC,CAC7B,KAAK,IAAI,GAClB;EALiB,KAAA,SAAA;EAMjB,KAAK,OAAO;CAChB;AACJ"}
|
|
@@ -1175,6 +1175,14 @@ type AddressBookEntryUpdateSpec = Message<"auth.v1.AddressBookEntryUpdateSpec">
|
|
|
1175
1175
|
* @generated from field: repeated fixed64 tag_ids = 3;
|
|
1176
1176
|
*/
|
|
1177
1177
|
tagIds: bigint[];
|
|
1178
|
+
/**
|
|
1179
|
+
* New tags to create and attach in the same protected update. When tag_ids
|
|
1180
|
+
* is also selected, the resulting set is tag_ids plus these tags. Otherwise,
|
|
1181
|
+
* currently attached tags are preserved and these tags are appended.
|
|
1182
|
+
*
|
|
1183
|
+
* @generated from field: repeated auth.v1.AddressBookTagInput new_tags = 4;
|
|
1184
|
+
*/
|
|
1185
|
+
newTags: AddressBookTagInput[];
|
|
1178
1186
|
};
|
|
1179
1187
|
/**
|
|
1180
1188
|
* Describes the message auth.v1.AddressBookEntryUpdateSpec.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"address_book_pb.d.ts","names":[],"sources":["../../../../src/gen/auth/v1/address_book_pb.ts"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"address_book_pb.d.ts","names":[],"sources":["../../../../src/gen/auth/v1/address_book_pb.ts"],"mappings":";;;;;;;;;;cAgBa,2BAA2B;;;;KAM5B,kBAAkB;;;;;;EAM5B,WAAW;;;;;;EAOX;;;;;;EAOA;;;;;;cAOW,uBAAuB,WAAW;;;;KAMnC,cAAc;;;;;;EAMxB,QAAQ;;;;;;EAOR,YAAY;;;;;;EAOZ;;;;;;EAOA;;;;;;EAOA;;;;;;cAOW,mBAAmB,WAAW;;;;KAM/B,0BAA0B;;;;;;EAMpC;;;;;;EAOA;;;;;;cAOW,+BAA+B,WAAW;;;;KAM3C,0BAA0B;;;;;;EAMpC;;;;;;EAOA;;;;;;EAOA,iBAAiB;;;;;;EAOjB;;;;;;EAOA;;;;;;EAOA;;;;;;cAOW,+BAA+B,WAAW;;;;KAM3C,iBAAiB;;;;;;EAM3B;;;;;;EAOA,QAAQ;;;;;;EAOR;;;;;;EAOA;;;;;;EAOA,YAAY;;;;;;EAOZ,YAAY;;;;;;cAOD,sBAAsB,WAAW;;;;KAMlC,wBAAwB;;;;;;EAMlC;;;;;;EAOA;;;;;;EAOA;;;;;;cAOW,6BAA6B,WAAW;;;;KAMzC,mBAAmB;;;;;;EAM7B;;;;;;EAOA,QAAQ;;;;;;EAOR,MAAM;;;;;;EAON;;;;;;EAOA;;;;;;EAOA,YAAY;;;;;;EAOZ,YAAY;;;;EAKZ;;;;;;IAME,OAAO;IACP;;;;;;;IAOA,OAAO;IACP;;IACI;IAAiB;;;;;;;EAOvB,MAAM;;;;;;EAON;;;;;;cAOW,wBAAwB,WAAW;;;;KAMpC,yBAAyB;;;;;;EAMnC,UAAU;;;;;;EAOV,UAAU;;;;;;cAOC,8BAA8B,WAAW;;;;KAM1C,2BAA2B;;;;;;EAMrC;;;;;;EAOA,QAAQ;;;;;;EAOR;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA,iBAAiB;;;;;;EAOjB;;;;;;EAOA;;;;;;EAOA,YAAY;;;;;;EAOZ,YAAY;;;;;;EAOZ;;;;;;cAOW,gCAAgC,WAAW;;;;KAM5C,2BAA2B;;;;;;EAMrC;;;;;;EAOA,QAAQ;;;;;;EAOR;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA,iBAAiB;;;;;;EAOjB;;;;;;EAOA;;;;;;EAOA,iBAAiB;;;;;;EAOjB;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA,YAAY;;;;;;EAOZ,YAAY;;;;;;EAOZ;;;;;;cAOW,gCAAgC,WAAW;;;;KAM5C,uBAAuB;;;;;;EAMjC;;;;;;EAOA,QAAQ;;;;;;EAOR,WAAW;;;;;;EAOX,MAAM;;;;;;EAON;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA,cAAc;;;;;;EAOd,aAAa;;;;EAKb;;;;;;IAME,OAAO;IACP;;;;;;;IAOA,OAAO;IACP;;IACI;IAAiB;;;;;;;cAOZ,4BAA4B,WAAW;;;;KAMxC,oCAAoC;;;;;;EAM9C,UAAU;;;;;;EAOV,UAAU;;;;;;cAOC,yCAAyC,WAAW;;;;KAMrD,4BAA4B;;;;;;EAMtC,QAAQ;;;;;;EAOR,eAAe;;;;;;EAOf;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA,aAAa;;;;;;EAOb;;;;;;EAOA;;;;;;cAOW,iCAAiC,WAAW;;;;KAM7C,4BAA4B;;;;;;EAMtC,QAAQ;;;;;;EAOR,eAAe;;;;;;EAOf;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA,aAAa;;;;;;EAOb;;;;;;EAOA;;;;;;EAOA,iBAAiB;;;;;;EAOjB;;;;;;EAOA;;;;;;EAOA;;;;;;cAOW,iCAAiC,WAAW;;;;KAM7C,iCAAiC;;;;;;EAM3C;;;;;;EAOA,QAAQ;;;;;;EAOR;;;;;;EAOA;;;;;;EAOA,iBAAiB;;;;;;EAOjB;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA,YAAY;;;;;;EAOZ,YAAY;;;;;;EAOZ,kBAAkB;;;;;;cAOP,sCAAsC,WAAW;;;;KAMlD,iCAAiC;;;;;;EAM3C;;;;;;EAOA;;;;;;EAOA,YAAY;;;;;;EAOZ;;;;;;cAOW,sCAAsC,WAAW;;;;KAMlD,wBAAwB;;;;;;EAMlC,QAAQ;;;;;;EAOR;;;;;;EAOA,eAAe;;;;;;EAOf;;;;;;cAOW,6BAA6B,WAAW;;;;KAMzC,sBAAsB;;;;;;EAMhC,QAAQ;;;;;;EAOR,MAAM;;;;;;EAON;;;;;;EAOA;;;;;;EAOA,iBAAiB;;;;;;EAOjB,mBAAmB;;;;EAKnB;;;;;;IAME,OAAO;IACP;;;;;;;IAOA,OAAO;IACP;;IACI;IAAiB;;;;;;;EAOvB,qBAAqB;;;;;;cAOV,2BAA2B,WAAW;;;;KAMvC,0BAA0B;;;;;cAOzB,+BAA+B,WAAW;;;;KAM3C,2BAA2B;;;;;;EAMrC,OAAO;;;;;;cAOI,gCAAgC,WAAW;;;;KAM5C,gCAAgC;;;;;;EAM1C;;;;;;EAOA,MAAM;;;;;;;EAQN;;;;;;;;EASA;;;;;;cAOW,qCAAqC,WAAW;;;;KAMjD,iCAAiC;;;;;;EAM3C,SAAS;;;;;;EAOT;;;;;;cAOW,sCAAsC,WAAW;;;;KAMlD,gCAAgC;;;;;;EAM1C;;;;;;EAOA;;;;;;EAOA;;;;EAKA;;;;;;IAME,OAAO;IACP;;;;;;;IAOA,OAAO;IACP;;IACI;IAAiB;;;;;;;EAOvB;;;;;;EAOA,SAAS;;;;;;cAOE,qCAAqC,WAAW;;;;KAMjD,mCAAmC;;;;;;EAM7C;;;;;;cAOW,wCAAwC,WAAW;;;;KAMpD,iCAAiC;;;;;;EAM3C,QAAQ;;;;;;cAOG,sCAAsC,WAAW;;;;;;KAQlD,6BAA6B;;;;;;EAMvC;;;;;;EAOA;;;;;;EAOA;;;;;;;;EASA,SAAS;;;;;;cAOE,kCAAkC,WAAW;;;;KAM9C,gCAAgC;;;;;;EAM1C;;;;;;EAOA,QAAQ;;;;;;;EAQR,aAAa;;;;;;EAOb;;;;;;cAOW,qCAAqC,WAAW;;;;KAMjD,iCAAiC;;;;;;EAM3C,QAAQ;;;;;;cAOG,sCAAsC,WAAW;;;;KAMlD,sBAAsB;;;;;;EAMhC;;;;;;EAOA;;;;;;cAOW,2BAA2B,WAAW;;;;KAMvC,gCAAgC;;;;;;EAM1C;;;;;;cAOW,qCAAqC,WAAW;;;;KAMjD,iCAAiC;;;;;cAOhC,sCAAsC,WAAW;;;;KAMlD,8BAA8B;;;;;;EAMxC;;;;;;EAOA;;;;;;cAOW,mCAAmC,WAAW;;;;KAM/C,+BAA+B;;;;;;EAMzC,QAAQ;;;;;;cAOG,oCAAoC,WAAW;;;;KAMhD,8BAA8B;;;;;;EAMxC;;;;;;EAOA;;;;;;EAOA;;;;;;cAOW,mCAAmC,WAAW;;;;KAM/C,+BAA+B;;;;;;EAMzC,MAAM;;;;;;cAOK,oCAAoC,WAAW;;;;KAMhD,8BAA8B;;;;;;EAMxC;;;;;;EAOA;;;;;;EAOA;;;;;;cAOW,mCAAmC,WAAW;;;;KAM/C,+BAA+B;;;;;;EAMzC,MAAM;;;;;;cAOK,oCAAoC,WAAW;;;;KAMhD,8BAA8B;;;;;;EAMxC;;;;;;cAOW,mCAAmC,WAAW;;;;KAM/C,+BAA+B;;;;;cAO9B,oCAAoC,WAAW;;;;KAMhD,oCAAoC;;;;;;EAM9C;;;;;;EAOA,WAAW;;;;;;EAOX,MAAM;;;;;;;EAQN;;;;;;cAOW,yCAAyC,WAAW;;;;KAMrD,qCAAqC;;;;;;EAM/C,gBAAgB;;;;;;;EAQhB;;;;;;cAOW,0CAA0C,WAAW;;;;KAMtD,kCAAkC;;;;;;EAM5C;;;;;;EAOA,MAAM;;;;;;;EAQN;;;;;;;;EASA;;;;;;cAOW,uCAAuC,WAAW;;;;KAMnD,mCAAmC;;;;;;;EAO7C,cAAc;;;;;;EAOd;;;;;;cAOW,wCAAwC,WAAW;;;;KAMpD,8CAA8C;;;;;;EAMxD;;;;;;;EAQA;;;;;;;EAQA;;;;;;cAOW,mDAAmD,WAAW;;;;KAM/D,+CAA+C;;;;;;;EAOzD,SAAS;;;;;;EAOT;;;;;;cAOW,oDAAoD,WAAW;;;;KAMhE,kCAAkC;;;;;;EAM5C;;;;;;cAOW,uCAAuC,WAAW;;;;KAMnD,mCAAmC;;;;;;EAM7C,OAAO;;;;;;cAOI,wCAAwC,WAAW;;;;KAMpD,4BAA4B;;;;;;EAMtC;;;;;;;EAQA;;;;;;cAOW,iCAAiC,WAAW;;;;KAM7C,6BAA6B;;;;;;EAMvC,OAAO;;;;;;EAOP,UAAU;;;;;;EAOV,qBAAqB;;;;;;EAOrB,MAAM;;;;;;EAON,oBAAoB;;;;;;;EAQpB;;;;;;cAOW,kCAAkC,WAAW;;;;;;KAQ9C,6BAA6B;;;;;;EAMvC,QAAQ;;;;;;EAOR,gBAAgB;;;;;;cAOL,kCAAkC,WAAW;;;;;;aAQ9C;;;;;;EAMV;;;;;;EAOA;;;;;;EAOA;;;;;cAMW,wBAAwB,QAAQ;;;;;;aAQjC;;;;;;EAMV;;;;;;EAOA;;;;;;EAOA;;;;;cAMW,4BAA4B,QAAQ;;;;;;aAQrC;;;;;;EAMV;;;;;;EAOA;;;;;;EAOA;;;;;cAMW,yCAAyC,QAAQ;;;;;;aAQlD;;;;;;EAMV;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;cAMW,kCAAkC,QAAQ;;;;;;aAQ3C;;;;;;EAMV;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;;EAOA;;;;;cAMW,qCAAqC,QAAQ;;;;cAM7C,oBAAoB;;;;EAI/B;IACE;IACA,cAAc;IACd,eAAe;;;;;EAKjB;IACE;IACA,cAAc;IACd,eAAe;;;;;EAKjB;IACE;IACA,cAAc;IACd,eAAe;;;;;EAKjB;IACE;IACA,cAAc;IACd,eAAe;;;;;EAKjB;IACE;IACA,cAAc;IACd,eAAe;;;;;EAKjB;IACE;IACA,cAAc;IACd,eAAe;;;;;EAKjB;IACE;IACA,cAAc;IACd,eAAe;;;;;EAKjB;IACE;IACA,cAAc;IACd,eAAe;;;;;EAKjB;IACE;IACA,cAAc;IACd,eAAe;;;;;EAKjB;IACE;IACA,cAAc;IACd,eAAe;;;;;EAKjB;IACE;IACA,cAAc;IACd,eAAe;;;;;EAKjB;IACE;IACA,cAAc;IACd,eAAe;;;;;EAKjB;IACE;IACA,cAAc;IACd,eAAe;;;;;EAKjB;IACE;IACA,cAAc;IACd,eAAe"}
|
|
@@ -71,7 +71,7 @@ var address_book_pb_exports = /* @__PURE__ */ __exportAll({
|
|
|
71
71
|
/**
|
|
72
72
|
* Describes the file auth/v1/address_book.proto.
|
|
73
73
|
*/
|
|
74
|
-
const file_auth_v1_address_book = /*@__PURE__*/ fileDesc("ChphdXRoL3YxL2FkZHJlc3NfYm9vay5wcm90bxIHYXV0aC52MSJ2Cg9BY2NvdW50U2NvcGVSZWYSLwoKc2NvcGVfdHlwZRgBIAEoDjIZLmF1dGgudjEuQWNjb3VudFNjb3BlVHlwZUIAEhkKD3Jvb3RfYWNjb3VudF9pZBgCIAEoBkIAEhcKDXN1YmFjY291bnRfaWQYAyABKAZCACKyAQoLQWRkcmVzc0Jvb2sSJwoFc2NvcGUYASABKAsyGC5hdXRoLnYxLkFjY291bnRTY29wZVJlZhIuCgtjYWxsZXJfcm9sZRgCIAEoDjIXLmF1dGgudjEuU3ViYWNjb3VudFJvbGVCABIPCgVsYWJlbBgDIAEoCUIAEhgKDm93bmVyX3VzZXJuYW1lGAQgASgJQgASHwoVc21hcnRfYWNjb3VudF9hZGRyZXNzGAUgASgJQgAiSgoXRXh0ZXJuYWxXaXRoZHJhd0FkZHJlc3MSHAoScG9seWNoYWluX2NoYWluX2lkGAEgASgNQgASEQoHYWRkcmVzcxgCIAEoCUIAIt8BChdJbnRlcm5hbFRyYW5zZmVyQWNjb3VudBIZCg9yb290X2FjY291bnRfaWQYASABKAZCABIbChF0YXJnZXRfYWNjb3VudF9pZBgCIAEoBkIAEjYKEXRhcmdldF9zY29wZV90eXBlGAMgASgOMhkuYXV0aC52MS5BY2NvdW50U2NvcGVUeXBlQgASHwoVc21hcnRfYWNjb3VudF9hZGRyZXNzGAQgASgJQgASFwoNcm9vdF91c2VybmFtZRgFIAEoCUIAEhoKEHN1YmFjY291bnRfbGFiZWwYBiABKAlCACLMAQoOQWRkcmVzc0Jvb2tUYWcSEAoGdGFnX2lkGAEgASgGQgASJwoFc2NvcGUYAiABKAsyGC5hdXRoLnYxLkFjY291bnRTY29wZVJlZhIOCgRuYW1lGAMgASgJQgASDwoFY29sb3IYBCABKAlCABIuCgpjcmVhdGVkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCJKChVBZGRyZXNzQm9va1RhZ1N1bW1hcnkSEAoGdGFnX2lkGAEgASgGQgASDgoEbmFtZRgCIAEoCUIAEg8KBWNvbG9yGAMgASgJQgAiugMKEEFkZHJlc3NCb29rRW50cnkSHwoVYWRkcmVzc19ib29rX2VudHJ5X2lkGAEgASgGQgASJwoFc2NvcGUYAiABKAsyGC5hdXRoLnYxLkFjY291bnRTY29wZVJlZhItCgRraW5kGAMgASgOMh0uYXV0aC52MS5BZGRyZXNzQm9va0VudHJ5S2luZEIAEg8KBWxhYmVsGAQgASgJQgASDgoEbm90ZRgFIAEoCUIAEi4KCmNyZWF0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjQKCGV4dGVybmFsGBQgASgLMiAuYXV0aC52MS5FeHRlcm5hbFdpdGhkcmF3QWRkcmVzc0gAEjQKCGludGVybmFsGBUgASgLMiAuYXV0aC52MS5JbnRlcm5hbFRyYW5zZmVyQWNjb3VudEgAEiUKBHRhZ3MYHiADKAsyFy5hdXRoLnYxLkFkZHJlc3NCb29rVGFnEhAKCHJldmlzaW9uGB8gASgEQgcKBWVudHJ5IoIBChZBZGRyZXNzQm9va0VudHJpZXNWaWV3EjMKCGV4dGVybmFsGAEgAygLMiEuYXV0aC52MS5FeHRlcm5hbEFkZHJlc3NCb29rRW50cnkSMwoIaW50ZXJuYWwYAiADKAsyIS5hdXRoLnYxLkludGVybmFsQWRkcmVzc0Jvb2tFbnRyeSL8AgoYRXh0ZXJuYWxBZGRyZXNzQm9va0VudHJ5Eh8KFWFkZHJlc3NfYm9va19lbnRyeV9pZBgBIAEoBkIAEicKBXNjb3BlGAIgASgLMhguYXV0aC52MS5BY2NvdW50U2NvcGVSZWYSDwoFbGFiZWwYAyABKAlCABIOCgRub3RlGAQgASgJQgASEQoHdGFnX2lkcxgFIAMoBkIAEj8KEHdoaXRlbGlzdF9zdGF0dXMYBiABKA4yIy5hdXRoLnYxLkRlc3RpbmF0aW9uV2hpdGVsaXN0U3RhdHVzQgASHAoScG9seWNoYWluX2NoYWluX2lkGAcgASgNQgASEQoHYWRkcmVzcxgIIAEoCUIAEi4KCmNyZWF0ZWRfYXQYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYCiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhAKCHJldmlzaW9uGAsgASgEIpEEChhJbnRlcm5hbEFkZHJlc3NCb29rRW50cnkSHwoVYWRkcmVzc19ib29rX2VudHJ5X2lkGAEgASgGQgASJwoFc2NvcGUYAiABKAsyGC5hdXRoLnYxLkFjY291bnRTY29wZVJlZhIPCgVsYWJlbBgDIAEoCUIAEg4KBG5vdGUYBCABKAlCABIRCgd0YWdfaWRzGAUgAygGQgASPwoQd2hpdGVsaXN0X3N0YXR1cxgGIAEoDjIjLmF1dGgudjEuRGVzdGluYXRpb25XaGl0ZWxpc3RTdGF0dXNCABIZCg9yb290X2FjY291bnRfaWQYByABKAZCABIbChF0YXJnZXRfYWNjb3VudF9pZBgIIAEoBkIAEjYKEXRhcmdldF9zY29wZV90eXBlGAkgASgOMhkuYXV0aC52MS5BY2NvdW50U2NvcGVUeXBlQgASHwoVc21hcnRfYWNjb3VudF9hZGRyZXNzGAogASgJQgASFwoNcm9vdF91c2VybmFtZRgLIAEoCUIAEhoKEHN1YmFjY291bnRfbGFiZWwYDCABKAlCABIuCgpjcmVhdGVkX2F0GA0gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GA4gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIQCghyZXZpc2lvbhgPIAEoBCLqAwoUVHJhbnNmZXJDb3VudGVycGFydHkSGQoPY291bnRlcnBhcnR5X2lkGAEgASgGQgASJwoFc2NvcGUYAiABKAsyGC5hdXRoLnYxLkFjY291bnRTY29wZVJlZhI7CglkaXJlY3Rpb24YAyABKA4yJi5hdXRoLnYxLlRyYW5zZmVyQ291bnRlcnBhcnR5RGlyZWN0aW9uQgASLQoEa2luZBgEIAEoDjIdLmF1dGgudjEuQWRkcmVzc0Jvb2tFbnRyeUtpbmRCABINCgVzYXZlZBgFIAEoCBIfChVhZGRyZXNzX2Jvb2tfZW50cnlfaWQYBiABKAZCABIRCgl1c2VfY291bnQYByABKAQSMQoNZmlyc3Rfc2Vlbl9hdBgIIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASMAoMbGFzdF9zZWVuX2F0GAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI0CghleHRlcm5hbBgUIAEoCzIgLmF1dGgudjEuRXh0ZXJuYWxXaXRoZHJhd0FkZHJlc3NIABI0CghpbnRlcm5hbBgVIAEoCzIgLmF1dGgudjEuSW50ZXJuYWxUcmFuc2ZlckFjY291bnRIAEIOCgxjb3VudGVycGFydHkijwEKIUFkZHJlc3NCb29rUmVjZW50RGVzdGluYXRpb25zVmlldxI0CghleHRlcm5hbBgBIAMoCzIiLmF1dGgudjEuRXh0ZXJuYWxSZWNlbnREZXN0aW5hdGlvbhI0CghpbnRlcm5hbBgCIAMoCzIiLmF1dGgudjEuSW50ZXJuYWxSZWNlbnREZXN0aW5hdGlvbiKsAgoZRXh0ZXJuYWxSZWNlbnREZXN0aW5hdGlvbhInCgVzY29wZRgBIAEoCzIYLmF1dGgudjEuQWNjb3VudFNjb3BlUmVmEkAKDmxhc3RfZGlyZWN0aW9uGAIgASgOMiYuYXV0aC52MS5UcmFuc2ZlckNvdW50ZXJwYXJ0eURpcmVjdGlvbkIAEg0KBXNhdmVkGAMgASgIEh8KFWFkZHJlc3NfYm9va19lbnRyeV9pZBgEIAEoBkIAEhEKCXVzZV9jb3VudBgFIAEoBBIwCgxsYXN0X3NlZW5fYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhwKEnBvbHljaGFpbl9jaGFpbl9pZBgHIAEoDUIAEhEKB2FkZHJlc3MYCCABKAlCACLBAwoZSW50ZXJuYWxSZWNlbnREZXN0aW5hdGlvbhInCgVzY29wZRgBIAEoCzIYLmF1dGgudjEuQWNjb3VudFNjb3BlUmVmEkAKDmxhc3RfZGlyZWN0aW9uGAIgASgOMiYuYXV0aC52MS5UcmFuc2ZlckNvdW50ZXJwYXJ0eURpcmVjdGlvbkIAEg0KBXNhdmVkGAMgASgIEh8KFWFkZHJlc3NfYm9va19lbnRyeV9pZBgEIAEoBkIAEhEKCXVzZV9jb3VudBgFIAEoBBIwCgxsYXN0X3NlZW5fYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhkKD3Jvb3RfYWNjb3VudF9pZBgHIAEoBkIAEhsKEXRhcmdldF9hY2NvdW50X2lkGAggASgGQgASNgoRdGFyZ2V0X3Njb3BlX3R5cGUYCSABKA4yGS5hdXRoLnYxLkFjY291bnRTY29wZVR5cGVCABIfChVzbWFydF9hY2NvdW50X2FkZHJlc3MYCiABKAlCABIXCg1yb290X3VzZXJuYW1lGAsgASgJQgASGgoQc3ViYWNjb3VudF9sYWJlbBgMIAEoCUIAIswDCh5JbnRlcm5hbFRyYW5zZmVyV2hpdGVsaXN0RW50cnkSEgoIZW50cnlfaWQYASABKAZCABInCgVzY29wZRgCIAEoCzIYLmF1dGgudjEuQWNjb3VudFNjb3BlUmVmEhkKD3Jvb3RfYWNjb3VudF9pZBgDIAEoBkIAEhsKEXRhcmdldF9hY2NvdW50X2lkGAQgASgGQgASNgoRdGFyZ2V0X3Njb3BlX3R5cGUYBSABKA4yGS5hdXRoLnYxLkFjY291bnRTY29wZVR5cGVCABIfChVzbWFydF9hY2NvdW50X2FkZHJlc3MYBiABKAlCABIXCg1yb290X3VzZXJuYW1lGAcgASgJQgASGgoQc3ViYWNjb3VudF9sYWJlbBgIIAEoCUIAEi4KCmNyZWF0ZWRfYXQYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYCiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEkcKEXJlc29sdXRpb25fc3RhdHVzGAsgASgOMiouYXV0aC52MS5JbnRlcm5hbFdoaXRlbGlzdFJlc29sdXRpb25TdGF0dXNCACKmAQoeTWlycm9yZWRXaXRoZHJhd1doaXRlbGlzdEVudHJ5EhsKEWNhbm9uaWNhbF9hZGRyZXNzGAEgASgJQgASGQoPcmF3X2FkZHJlc3NfaGV4GAIgASgJQgASLgoKdXBkYXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASHAoScG9seWNoYWluX2NoYWluX2lkGAYgASgNQgAiywEKFVdpdGhkcmF3V2hpdGVsaXN0VmlldxInCgVzY29wZRgBIAEoCzIYLmF1dGgudjEuQWNjb3VudFNjb3BlUmVmEiMKG2V4dGVybmFsX3doaXRlbGlzdF9yZXF1aXJlZBgCIAEoCBI/Cg5hY3RpdmVfZW50cmllcxgDIAMoCzInLmF1dGgudjEuTWlycm9yZWRXaXRoZHJhd1doaXRlbGlzdEVudHJ5EiMKG2ludGVybmFsX3doaXRlbGlzdF9yZXF1aXJlZBgEIAEoCCK+AwoTVHJhbnNmZXJEZXN0aW5hdGlvbhInCgVzY29wZRgBIAEoCzIYLmF1dGgudjEuQWNjb3VudFNjb3BlUmVmEi0KBGtpbmQYAiABKA4yHS5hdXRoLnYxLkFkZHJlc3NCb29rRW50cnlLaW5kQgASDQoFc2F2ZWQYAyABKAgSEwoLd2hpdGVsaXN0ZWQYBCABKAgSPwoQd2hpdGVsaXN0X3N0YXR1cxgFIAEoDjIjLmF1dGgudjEuRGVzdGluYXRpb25XaGl0ZWxpc3RTdGF0dXNCABI1ChJhZGRyZXNzX2Jvb2tfZW50cnkYBiABKAsyGS5hdXRoLnYxLkFkZHJlc3NCb29rRW50cnkSNAoIZXh0ZXJuYWwYFCABKAsyIC5hdXRoLnYxLkV4dGVybmFsV2l0aGRyYXdBZGRyZXNzSAASNAoIaW50ZXJuYWwYFSABKAsyIC5hdXRoLnYxLkludGVybmFsVHJhbnNmZXJBY2NvdW50SAASOAoUd2hpdGVsaXN0X3VwZGF0ZWRfYXQYHyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQg0KC2Rlc3RpbmF0aW9uIhkKF0xpc3RBZGRyZXNzQm9va3NSZXF1ZXN0Ij8KGExpc3RBZGRyZXNzQm9va3NSZXNwb25zZRIjCgVib29rcxgBIAMoCzIULmF1dGgudjEuQWRkcmVzc0Jvb2sijgEKHUxpc3RBZGRyZXNzQm9va0VudHJpZXNSZXF1ZXN0EhcKDXN1YmFjY291bnRfaWQYASABKAZCABItCgRraW5kGAIgASgOMh0uYXV0aC52MS5BZGRyZXNzQm9va0VudHJ5S2luZEIAEg8KBWxpbWl0GAMgASgNQgASFAoKcGFnZV90b2tlbhgEIAEoCUIAImcKHkxpc3RBZGRyZXNzQm9va0VudHJpZXNSZXNwb25zZRIqCgdlbnRyaWVzGAEgAygLMhkuYXV0aC52MS5BZGRyZXNzQm9va0VudHJ5EhkKD25leHRfcGFnZV90b2tlbhgCIAEoCUIAIpwCCh1DcmVhdGVBZGRyZXNzQm9va0VudHJ5UmVxdWVzdBIXCg1zdWJhY2NvdW50X2lkGAEgASgGQgASDwoFbGFiZWwYAiABKAlCABIOCgRub3RlGAMgASgJQgASNAoIZXh0ZXJuYWwYCiABKAsyIC5hdXRoLnYxLkV4dGVybmFsV2l0aGRyYXdBZGRyZXNzSAASPQoIaW50ZXJuYWwYCyABKAsyKS5hdXRoLnYxLlJlcXVlc3RlZEludGVybmFsVHJhbnNmZXJBY2NvdW50SAASEQoHdGFnX2lkcxgEIAMoBkIAEjAKCG5ld190YWdzGAUgAygLMhwuYXV0aC52MS5BZGRyZXNzQm9va1RhZ0lucHV0QgBCBwoFZW50cnkiQwogUmVxdWVzdGVkSW50ZXJuYWxUcmFuc2ZlckFjY291bnQSHwoVc21hcnRfYWNjb3VudF9hZGRyZXNzGAEgASgJQgAiSgoeQ3JlYXRlQWRkcmVzc0Jvb2tFbnRyeVJlc3BvbnNlEigKBWVudHJ5GAEgASgLMhkuYXV0aC52MS5BZGRyZXNzQm9va0VudHJ5IlAKGkFkZHJlc3NCb29rRW50cnlVcGRhdGVTcGVjEg8KBWxhYmVsGAEgASgJQgASDgoEbm90ZRgCIAEoCUIAEhEKB3RhZ19pZHMYAyADKAZCACLGAQodVXBkYXRlQWRkcmVzc0Jvb2tFbnRyeVJlcXVlc3QSHwoVYWRkcmVzc19ib29rX2VudHJ5X2lkGAEgASgGQgASNAoFZW50cnkYAiABKAsyIy5hdXRoLnYxLkFkZHJlc3NCb29rRW50cnlVcGRhdGVTcGVjQgASMQoLdXBkYXRlX21hc2sYAyABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQgASGwoRZXhwZWN0ZWRfcmV2aXNpb24YBCABKARCACJKCh5VcGRhdGVBZGRyZXNzQm9va0VudHJ5UmVzcG9uc2USKAoFZW50cnkYASABKAsyGS5hdXRoLnYxLkFkZHJlc3NCb29rRW50cnkiNgoTQWRkcmVzc0Jvb2tUYWdJbnB1dBIOCgRuYW1lGAEgASgJQgASDwoFY29sb3IYAiABKAlCACJACh1EZWxldGVBZGRyZXNzQm9va0VudHJ5UmVxdWVzdBIfChVhZGRyZXNzX2Jvb2tfZW50cnlfaWQYASABKAZCACIgCh5EZWxldGVBZGRyZXNzQm9va0VudHJ5UmVzcG9uc2UiXgobQ29weUFkZHJlc3NCb29rRW50cnlSZXF1ZXN0Eh8KFWFkZHJlc3NfYm9va19lbnRyeV9pZBgBIAEoBkIAEh4KFHRhcmdldF9zdWJhY2NvdW50X2lkGAIgASgGQgAiSAocQ29weUFkZHJlc3NCb29rRW50cnlSZXNwb25zZRIoCgVlbnRyeRgBIAEoCzIZLmF1dGgudjEuQWRkcmVzc0Jvb2tFbnRyeSJXChtDcmVhdGVBZGRyZXNzQm9va1RhZ1JlcXVlc3QSFwoNc3ViYWNjb3VudF9pZBgBIAEoBkIAEg4KBG5hbWUYAiABKAlCABIPCgVjb2xvchgDIAEoCUIAIkQKHENyZWF0ZUFkZHJlc3NCb29rVGFnUmVzcG9uc2USJAoDdGFnGAEgASgLMhcuYXV0aC52MS5BZGRyZXNzQm9va1RhZyJtChtVcGRhdGVBZGRyZXNzQm9va1RhZ1JlcXVlc3QSEAoGdGFnX2lkGAEgASgGQgASEwoEbmFtZRgCIAEoCUIASACIAQESFAoFY29sb3IYAyABKAlCAEgBiAEBQgcKBV9uYW1lQggKBl9jb2xvciJEChxVcGRhdGVBZGRyZXNzQm9va1RhZ1Jlc3BvbnNlEiQKA3RhZxgBIAEoCzIXLmF1dGgudjEuQWRkcmVzc0Jvb2tUYWciLwobRGVsZXRlQWRkcmVzc0Jvb2tUYWdSZXF1ZXN0EhAKBnRhZ19pZBgBIAEoBkIAIh4KHERlbGV0ZUFkZHJlc3NCb29rVGFnUmVzcG9uc2UiuQEKIUxpc3RUcmFuc2ZlckNvdW50ZXJwYXJ0aWVzUmVxdWVzdBIXCg1zdWJhY2NvdW50X2lkGAEgASgGQgASOwoJZGlyZWN0aW9uGAIgASgOMiYuYXV0aC52MS5UcmFuc2ZlckNvdW50ZXJwYXJ0eURpcmVjdGlvbkIAEi0KBGtpbmQYAyABKA4yHS5hdXRoLnYxLkFkZHJlc3NCb29rRW50cnlLaW5kQgASDwoFbGltaXQYBSABKA1CACJuCiJMaXN0VHJhbnNmZXJDb3VudGVycGFydGllc1Jlc3BvbnNlEjUKDmNvdW50ZXJwYXJ0aWVzGAEgAygLMh0uYXV0aC52MS5UcmFuc2ZlckNvdW50ZXJwYXJ0eRIRCgl0cnVuY2F0ZWQYAiABKAgikAEKH0xpc3RUcmFuc2ZlckRlc3RpbmF0aW9uc1JlcXVlc3QSFwoNc3ViYWNjb3VudF9pZBgBIAEoBkIAEi0KBGtpbmQYAiABKA4yHS5hdXRoLnYxLkFkZHJlc3NCb29rRW50cnlLaW5kQgASDwoFbGltaXQYAyABKA1CABIUCgpwYWdlX3Rva2VuGAQgASgJQgAicQogTGlzdFRyYW5zZmVyRGVzdGluYXRpb25zUmVzcG9uc2USMgoMZGVzdGluYXRpb25zGAEgAygLMhwuYXV0aC52MS5UcmFuc2ZlckRlc3RpbmF0aW9uEhkKD25leHRfcGFnZV90b2tlbhgCIAEoCUIAIm0KK0xpc3RJbnRlcm5hbFRyYW5zZmVyV2hpdGVsaXN0RW50cmllc1JlcXVlc3QSFwoNc3ViYWNjb3VudF9pZBgBIAEoBkIAEg8KBWxpbWl0GAIgASgNQgASFAoKcGFnZV90b2tlbhgDIAEoCUIAIoMBCixMaXN0SW50ZXJuYWxUcmFuc2ZlcldoaXRlbGlzdEVudHJpZXNSZXNwb25zZRI4CgdlbnRyaWVzGAEgAygLMicuYXV0aC52MS5JbnRlcm5hbFRyYW5zZmVyV2hpdGVsaXN0RW50cnkSGQoPbmV4dF9wYWdlX3Rva2VuGAIgASgJQgAiOgofR2V0V2l0aGRyYXdXaGl0ZWxpc3RWaWV3UmVxdWVzdBIXCg1zdWJhY2NvdW50X2lkGAEgASgGQgAiUAogR2V0V2l0aGRyYXdXaGl0ZWxpc3RWaWV3UmVzcG9uc2USLAoEdmlldxgBIAEoCzIeLmF1dGgudjEuV2l0aGRyYXdXaGl0ZWxpc3RWaWV3IkUKGUdldEFkZHJlc3NCb29rVmlld1JlcXVlc3QSFwoNc3ViYWNjb3VudF9pZBgBIAEoBkIAEg8KBWxpbWl0GAYgASgNQgAizQIKGkdldEFkZHJlc3NCb29rVmlld1Jlc3BvbnNlEiMKBWJvb2tzGAEgAygLMhQuYXV0aC52MS5BZGRyZXNzQm9vaxIwCgdlbnRyaWVzGAIgASgLMh8uYXV0aC52MS5BZGRyZXNzQm9va0VudHJpZXNWaWV3EkcKE3JlY2VudF9kZXN0aW5hdGlvbnMYAyABKAsyKi5hdXRoLnYxLkFkZHJlc3NCb29rUmVjZW50RGVzdGluYXRpb25zVmlldxIsCgR0YWdzGAQgAygLMh4uYXV0aC52MS5BZGRyZXNzQm9va1RhZ1N1bW1hcnkSOgoSd2l0aGRyYXdfd2hpdGVsaXN0GAUgASgLMh4uYXV0aC52MS5XaXRoZHJhd1doaXRlbGlzdFZpZXcSJQodcmVjZW50X2Rlc3RpbmF0aW9uc190cnVuY2F0ZWQYBiABKAgieQoaQWRkcmVzc0Jvb2tWaWV3SW52YWxpZGF0ZWQSJwoFc2NvcGUYASABKAsyGC5hdXRoLnYxLkFjY291bnRTY29wZVJlZhIyCg5pbnZhbGlkYXRlZF9hdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAqTwoQQWNjb3VudFNjb3BlVHlwZRIVChFTQ09QRV9VTlNQRUNJRklFRBAAEg4KClNDT1BFX1JPT1QQARIUChBTQ09QRV9TVUJBQ0NPVU5UEAIqXAoUQWRkcmVzc0Jvb2tFbnRyeUtpbmQSGgoWRU5UUllfS0lORF9VTlNQRUNJRklFRBAAEhIKDkVYVEVSTkFMX0NIQUlOEAESFAoQSU5URVJOQUxfQUNDT1VOVBACKpYBCiFJbnRlcm5hbFdoaXRlbGlzdFJlc29sdXRpb25TdGF0dXMSLQopSU5URVJOQUxfV0hJVEVMSVNUX1JFU09MVVRJT05fVU5TUEVDSUZJRUQQABIfChtJTlRFUk5BTF9XSElURUxJU1RfUkVTT0xWRUQQARIhCh1JTlRFUk5BTF9XSElURUxJU1RfVU5SRVNPTFZFRBACKrMBChpEZXN0aW5hdGlvbldoaXRlbGlzdFN0YXR1cxIsCihERVNUSU5BVElPTl9XSElURUxJU1RfU1RBVFVTX1VOU1BFQ0lGSUVEEAASHwobREVTVElOQVRJT05fTk9UX1dISVRFTElTVEVEEAESIAocREVTVElOQVRJT05fV0hJVEVMSVNUX0FDVElWRRACEiQKIERFU1RJTkFUSU9OX1dISVRFTElTVF9VTlJFU09MVkVEEAMqqQEKHVRyYW5zZmVyQ291bnRlcnBhcnR5RGlyZWN0aW9uEi8KK1RSQU5TRkVSX0NPVU5URVJQQVJUWV9ESVJFQ1RJT05fVU5TUEVDSUZJRUQQABIQCgxERVBPU0lUX0ZST00QARIPCgtXSVRIRFJBV19UTxACEhoKFklOVEVSTkFMX1RSQU5TRkVSX0ZST00QAxIYChRJTlRFUk5BTF9UUkFOU0ZFUl9UTxAEMpcMChJBZGRyZXNzQm9va1NlcnZpY2USWQoQTGlzdEFkZHJlc3NCb29rcxIgLmF1dGgudjEuTGlzdEFkZHJlc3NCb29rc1JlcXVlc3QaIS5hdXRoLnYxLkxpc3RBZGRyZXNzQm9va3NSZXNwb25zZSIAEmsKFkxpc3RBZGRyZXNzQm9va0VudHJpZXMSJi5hdXRoLnYxLkxpc3RBZGRyZXNzQm9va0VudHJpZXNSZXF1ZXN0GicuYXV0aC52MS5MaXN0QWRkcmVzc0Jvb2tFbnRyaWVzUmVzcG9uc2UiABJrChZDcmVhdGVBZGRyZXNzQm9va0VudHJ5EiYuYXV0aC52MS5DcmVhdGVBZGRyZXNzQm9va0VudHJ5UmVxdWVzdBonLmF1dGgudjEuQ3JlYXRlQWRkcmVzc0Jvb2tFbnRyeVJlc3BvbnNlIgASawoWVXBkYXRlQWRkcmVzc0Jvb2tFbnRyeRImLmF1dGgudjEuVXBkYXRlQWRkcmVzc0Jvb2tFbnRyeVJlcXVlc3QaJy5hdXRoLnYxLlVwZGF0ZUFkZHJlc3NCb29rRW50cnlSZXNwb25zZSIAEmsKFkRlbGV0ZUFkZHJlc3NCb29rRW50cnkSJi5hdXRoLnYxLkRlbGV0ZUFkZHJlc3NCb29rRW50cnlSZXF1ZXN0GicuYXV0aC52MS5EZWxldGVBZGRyZXNzQm9va0VudHJ5UmVzcG9uc2UiABJlChRDb3B5QWRkcmVzc0Jvb2tFbnRyeRIkLmF1dGgudjEuQ29weUFkZHJlc3NCb29rRW50cnlSZXF1ZXN0GiUuYXV0aC52MS5Db3B5QWRkcmVzc0Jvb2tFbnRyeVJlc3BvbnNlIgASZQoUQ3JlYXRlQWRkcmVzc0Jvb2tUYWcSJC5hdXRoLnYxLkNyZWF0ZUFkZHJlc3NCb29rVGFnUmVxdWVzdBolLmF1dGgudjEuQ3JlYXRlQWRkcmVzc0Jvb2tUYWdSZXNwb25zZSIAEmUKFFVwZGF0ZUFkZHJlc3NCb29rVGFnEiQuYXV0aC52MS5VcGRhdGVBZGRyZXNzQm9va1RhZ1JlcXVlc3QaJS5hdXRoLnYxLlVwZGF0ZUFkZHJlc3NCb29rVGFnUmVzcG9uc2UiABJlChREZWxldGVBZGRyZXNzQm9va1RhZxIkLmF1dGgudjEuRGVsZXRlQWRkcmVzc0Jvb2tUYWdSZXF1ZXN0GiUuYXV0aC52MS5EZWxldGVBZGRyZXNzQm9va1RhZ1Jlc3BvbnNlIgASdwoaTGlzdFRyYW5zZmVyQ291bnRlcnBhcnRpZXMSKi5hdXRoLnYxLkxpc3RUcmFuc2ZlckNvdW50ZXJwYXJ0aWVzUmVxdWVzdBorLmF1dGgudjEuTGlzdFRyYW5zZmVyQ291bnRlcnBhcnRpZXNSZXNwb25zZSIAEnEKGExpc3RUcmFuc2ZlckRlc3RpbmF0aW9ucxIoLmF1dGgudjEuTGlzdFRyYW5zZmVyRGVzdGluYXRpb25zUmVxdWVzdBopLmF1dGgudjEuTGlzdFRyYW5zZmVyRGVzdGluYXRpb25zUmVzcG9uc2UiABKVAQokTGlzdEludGVybmFsVHJhbnNmZXJXaGl0ZWxpc3RFbnRyaWVzEjQuYXV0aC52MS5MaXN0SW50ZXJuYWxUcmFuc2ZlcldoaXRlbGlzdEVudHJpZXNSZXF1ZXN0GjUuYXV0aC52MS5MaXN0SW50ZXJuYWxUcmFuc2ZlcldoaXRlbGlzdEVudHJpZXNSZXNwb25zZSIAEnEKGEdldFdpdGhkcmF3V2hpdGVsaXN0VmlldxIoLmF1dGgudjEuR2V0V2l0aGRyYXdXaGl0ZWxpc3RWaWV3UmVxdWVzdBopLmF1dGgudjEuR2V0V2l0aGRyYXdXaGl0ZWxpc3RWaWV3UmVzcG9uc2UiABJfChJHZXRBZGRyZXNzQm9va1ZpZXcSIi5hdXRoLnYxLkdldEFkZHJlc3NCb29rVmlld1JlcXVlc3QaIy5hdXRoLnYxLkdldEFkZHJlc3NCb29rVmlld1Jlc3BvbnNlIgBCPFo6Z2l0aHViLmNvbS9GYWJyaWMtTGFicy9wb2x5ZXN0ZXItc2RrLWdvL2dlbi9hdXRoL3YxO2F1dGh2MWIGcHJvdG8z", [
|
|
74
|
+
const file_auth_v1_address_book = /*@__PURE__*/ fileDesc("ChphdXRoL3YxL2FkZHJlc3NfYm9vay5wcm90bxIHYXV0aC52MSJ2Cg9BY2NvdW50U2NvcGVSZWYSLwoKc2NvcGVfdHlwZRgBIAEoDjIZLmF1dGgudjEuQWNjb3VudFNjb3BlVHlwZUIAEhkKD3Jvb3RfYWNjb3VudF9pZBgCIAEoBkIAEhcKDXN1YmFjY291bnRfaWQYAyABKAZCACKyAQoLQWRkcmVzc0Jvb2sSJwoFc2NvcGUYASABKAsyGC5hdXRoLnYxLkFjY291bnRTY29wZVJlZhIuCgtjYWxsZXJfcm9sZRgCIAEoDjIXLmF1dGgudjEuU3ViYWNjb3VudFJvbGVCABIPCgVsYWJlbBgDIAEoCUIAEhgKDm93bmVyX3VzZXJuYW1lGAQgASgJQgASHwoVc21hcnRfYWNjb3VudF9hZGRyZXNzGAUgASgJQgAiSgoXRXh0ZXJuYWxXaXRoZHJhd0FkZHJlc3MSHAoScG9seWNoYWluX2NoYWluX2lkGAEgASgNQgASEQoHYWRkcmVzcxgCIAEoCUIAIt8BChdJbnRlcm5hbFRyYW5zZmVyQWNjb3VudBIZCg9yb290X2FjY291bnRfaWQYASABKAZCABIbChF0YXJnZXRfYWNjb3VudF9pZBgCIAEoBkIAEjYKEXRhcmdldF9zY29wZV90eXBlGAMgASgOMhkuYXV0aC52MS5BY2NvdW50U2NvcGVUeXBlQgASHwoVc21hcnRfYWNjb3VudF9hZGRyZXNzGAQgASgJQgASFwoNcm9vdF91c2VybmFtZRgFIAEoCUIAEhoKEHN1YmFjY291bnRfbGFiZWwYBiABKAlCACLMAQoOQWRkcmVzc0Jvb2tUYWcSEAoGdGFnX2lkGAEgASgGQgASJwoFc2NvcGUYAiABKAsyGC5hdXRoLnYxLkFjY291bnRTY29wZVJlZhIOCgRuYW1lGAMgASgJQgASDwoFY29sb3IYBCABKAlCABIuCgpjcmVhdGVkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCJKChVBZGRyZXNzQm9va1RhZ1N1bW1hcnkSEAoGdGFnX2lkGAEgASgGQgASDgoEbmFtZRgCIAEoCUIAEg8KBWNvbG9yGAMgASgJQgAiugMKEEFkZHJlc3NCb29rRW50cnkSHwoVYWRkcmVzc19ib29rX2VudHJ5X2lkGAEgASgGQgASJwoFc2NvcGUYAiABKAsyGC5hdXRoLnYxLkFjY291bnRTY29wZVJlZhItCgRraW5kGAMgASgOMh0uYXV0aC52MS5BZGRyZXNzQm9va0VudHJ5S2luZEIAEg8KBWxhYmVsGAQgASgJQgASDgoEbm90ZRgFIAEoCUIAEi4KCmNyZWF0ZWRfYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjQKCGV4dGVybmFsGBQgASgLMiAuYXV0aC52MS5FeHRlcm5hbFdpdGhkcmF3QWRkcmVzc0gAEjQKCGludGVybmFsGBUgASgLMiAuYXV0aC52MS5JbnRlcm5hbFRyYW5zZmVyQWNjb3VudEgAEiUKBHRhZ3MYHiADKAsyFy5hdXRoLnYxLkFkZHJlc3NCb29rVGFnEhAKCHJldmlzaW9uGB8gASgEQgcKBWVudHJ5IoIBChZBZGRyZXNzQm9va0VudHJpZXNWaWV3EjMKCGV4dGVybmFsGAEgAygLMiEuYXV0aC52MS5FeHRlcm5hbEFkZHJlc3NCb29rRW50cnkSMwoIaW50ZXJuYWwYAiADKAsyIS5hdXRoLnYxLkludGVybmFsQWRkcmVzc0Jvb2tFbnRyeSL8AgoYRXh0ZXJuYWxBZGRyZXNzQm9va0VudHJ5Eh8KFWFkZHJlc3NfYm9va19lbnRyeV9pZBgBIAEoBkIAEicKBXNjb3BlGAIgASgLMhguYXV0aC52MS5BY2NvdW50U2NvcGVSZWYSDwoFbGFiZWwYAyABKAlCABIOCgRub3RlGAQgASgJQgASEQoHdGFnX2lkcxgFIAMoBkIAEj8KEHdoaXRlbGlzdF9zdGF0dXMYBiABKA4yIy5hdXRoLnYxLkRlc3RpbmF0aW9uV2hpdGVsaXN0U3RhdHVzQgASHAoScG9seWNoYWluX2NoYWluX2lkGAcgASgNQgASEQoHYWRkcmVzcxgIIAEoCUIAEi4KCmNyZWF0ZWRfYXQYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYCiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhAKCHJldmlzaW9uGAsgASgEIpEEChhJbnRlcm5hbEFkZHJlc3NCb29rRW50cnkSHwoVYWRkcmVzc19ib29rX2VudHJ5X2lkGAEgASgGQgASJwoFc2NvcGUYAiABKAsyGC5hdXRoLnYxLkFjY291bnRTY29wZVJlZhIPCgVsYWJlbBgDIAEoCUIAEg4KBG5vdGUYBCABKAlCABIRCgd0YWdfaWRzGAUgAygGQgASPwoQd2hpdGVsaXN0X3N0YXR1cxgGIAEoDjIjLmF1dGgudjEuRGVzdGluYXRpb25XaGl0ZWxpc3RTdGF0dXNCABIZCg9yb290X2FjY291bnRfaWQYByABKAZCABIbChF0YXJnZXRfYWNjb3VudF9pZBgIIAEoBkIAEjYKEXRhcmdldF9zY29wZV90eXBlGAkgASgOMhkuYXV0aC52MS5BY2NvdW50U2NvcGVUeXBlQgASHwoVc21hcnRfYWNjb3VudF9hZGRyZXNzGAogASgJQgASFwoNcm9vdF91c2VybmFtZRgLIAEoCUIAEhoKEHN1YmFjY291bnRfbGFiZWwYDCABKAlCABIuCgpjcmVhdGVkX2F0GA0gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIuCgp1cGRhdGVkX2F0GA4gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIQCghyZXZpc2lvbhgPIAEoBCLqAwoUVHJhbnNmZXJDb3VudGVycGFydHkSGQoPY291bnRlcnBhcnR5X2lkGAEgASgGQgASJwoFc2NvcGUYAiABKAsyGC5hdXRoLnYxLkFjY291bnRTY29wZVJlZhI7CglkaXJlY3Rpb24YAyABKA4yJi5hdXRoLnYxLlRyYW5zZmVyQ291bnRlcnBhcnR5RGlyZWN0aW9uQgASLQoEa2luZBgEIAEoDjIdLmF1dGgudjEuQWRkcmVzc0Jvb2tFbnRyeUtpbmRCABINCgVzYXZlZBgFIAEoCBIfChVhZGRyZXNzX2Jvb2tfZW50cnlfaWQYBiABKAZCABIRCgl1c2VfY291bnQYByABKAQSMQoNZmlyc3Rfc2Vlbl9hdBgIIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASMAoMbGFzdF9zZWVuX2F0GAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI0CghleHRlcm5hbBgUIAEoCzIgLmF1dGgudjEuRXh0ZXJuYWxXaXRoZHJhd0FkZHJlc3NIABI0CghpbnRlcm5hbBgVIAEoCzIgLmF1dGgudjEuSW50ZXJuYWxUcmFuc2ZlckFjY291bnRIAEIOCgxjb3VudGVycGFydHkijwEKIUFkZHJlc3NCb29rUmVjZW50RGVzdGluYXRpb25zVmlldxI0CghleHRlcm5hbBgBIAMoCzIiLmF1dGgudjEuRXh0ZXJuYWxSZWNlbnREZXN0aW5hdGlvbhI0CghpbnRlcm5hbBgCIAMoCzIiLmF1dGgudjEuSW50ZXJuYWxSZWNlbnREZXN0aW5hdGlvbiKsAgoZRXh0ZXJuYWxSZWNlbnREZXN0aW5hdGlvbhInCgVzY29wZRgBIAEoCzIYLmF1dGgudjEuQWNjb3VudFNjb3BlUmVmEkAKDmxhc3RfZGlyZWN0aW9uGAIgASgOMiYuYXV0aC52MS5UcmFuc2ZlckNvdW50ZXJwYXJ0eURpcmVjdGlvbkIAEg0KBXNhdmVkGAMgASgIEh8KFWFkZHJlc3NfYm9va19lbnRyeV9pZBgEIAEoBkIAEhEKCXVzZV9jb3VudBgFIAEoBBIwCgxsYXN0X3NlZW5fYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhwKEnBvbHljaGFpbl9jaGFpbl9pZBgHIAEoDUIAEhEKB2FkZHJlc3MYCCABKAlCACLBAwoZSW50ZXJuYWxSZWNlbnREZXN0aW5hdGlvbhInCgVzY29wZRgBIAEoCzIYLmF1dGgudjEuQWNjb3VudFNjb3BlUmVmEkAKDmxhc3RfZGlyZWN0aW9uGAIgASgOMiYuYXV0aC52MS5UcmFuc2ZlckNvdW50ZXJwYXJ0eURpcmVjdGlvbkIAEg0KBXNhdmVkGAMgASgIEh8KFWFkZHJlc3NfYm9va19lbnRyeV9pZBgEIAEoBkIAEhEKCXVzZV9jb3VudBgFIAEoBBIwCgxsYXN0X3NlZW5fYXQYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhkKD3Jvb3RfYWNjb3VudF9pZBgHIAEoBkIAEhsKEXRhcmdldF9hY2NvdW50X2lkGAggASgGQgASNgoRdGFyZ2V0X3Njb3BlX3R5cGUYCSABKA4yGS5hdXRoLnYxLkFjY291bnRTY29wZVR5cGVCABIfChVzbWFydF9hY2NvdW50X2FkZHJlc3MYCiABKAlCABIXCg1yb290X3VzZXJuYW1lGAsgASgJQgASGgoQc3ViYWNjb3VudF9sYWJlbBgMIAEoCUIAIswDCh5JbnRlcm5hbFRyYW5zZmVyV2hpdGVsaXN0RW50cnkSEgoIZW50cnlfaWQYASABKAZCABInCgVzY29wZRgCIAEoCzIYLmF1dGgudjEuQWNjb3VudFNjb3BlUmVmEhkKD3Jvb3RfYWNjb3VudF9pZBgDIAEoBkIAEhsKEXRhcmdldF9hY2NvdW50X2lkGAQgASgGQgASNgoRdGFyZ2V0X3Njb3BlX3R5cGUYBSABKA4yGS5hdXRoLnYxLkFjY291bnRTY29wZVR5cGVCABIfChVzbWFydF9hY2NvdW50X2FkZHJlc3MYBiABKAlCABIXCg1yb290X3VzZXJuYW1lGAcgASgJQgASGgoQc3ViYWNjb3VudF9sYWJlbBgIIAEoCUIAEi4KCmNyZWF0ZWRfYXQYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCnVwZGF0ZWRfYXQYCiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEkcKEXJlc29sdXRpb25fc3RhdHVzGAsgASgOMiouYXV0aC52MS5JbnRlcm5hbFdoaXRlbGlzdFJlc29sdXRpb25TdGF0dXNCACKmAQoeTWlycm9yZWRXaXRoZHJhd1doaXRlbGlzdEVudHJ5EhsKEWNhbm9uaWNhbF9hZGRyZXNzGAEgASgJQgASGQoPcmF3X2FkZHJlc3NfaGV4GAIgASgJQgASLgoKdXBkYXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASHAoScG9seWNoYWluX2NoYWluX2lkGAYgASgNQgAiywEKFVdpdGhkcmF3V2hpdGVsaXN0VmlldxInCgVzY29wZRgBIAEoCzIYLmF1dGgudjEuQWNjb3VudFNjb3BlUmVmEiMKG2V4dGVybmFsX3doaXRlbGlzdF9yZXF1aXJlZBgCIAEoCBI/Cg5hY3RpdmVfZW50cmllcxgDIAMoCzInLmF1dGgudjEuTWlycm9yZWRXaXRoZHJhd1doaXRlbGlzdEVudHJ5EiMKG2ludGVybmFsX3doaXRlbGlzdF9yZXF1aXJlZBgEIAEoCCK+AwoTVHJhbnNmZXJEZXN0aW5hdGlvbhInCgVzY29wZRgBIAEoCzIYLmF1dGgudjEuQWNjb3VudFNjb3BlUmVmEi0KBGtpbmQYAiABKA4yHS5hdXRoLnYxLkFkZHJlc3NCb29rRW50cnlLaW5kQgASDQoFc2F2ZWQYAyABKAgSEwoLd2hpdGVsaXN0ZWQYBCABKAgSPwoQd2hpdGVsaXN0X3N0YXR1cxgFIAEoDjIjLmF1dGgudjEuRGVzdGluYXRpb25XaGl0ZWxpc3RTdGF0dXNCABI1ChJhZGRyZXNzX2Jvb2tfZW50cnkYBiABKAsyGS5hdXRoLnYxLkFkZHJlc3NCb29rRW50cnkSNAoIZXh0ZXJuYWwYFCABKAsyIC5hdXRoLnYxLkV4dGVybmFsV2l0aGRyYXdBZGRyZXNzSAASNAoIaW50ZXJuYWwYFSABKAsyIC5hdXRoLnYxLkludGVybmFsVHJhbnNmZXJBY2NvdW50SAASOAoUd2hpdGVsaXN0X3VwZGF0ZWRfYXQYHyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQg0KC2Rlc3RpbmF0aW9uIhkKF0xpc3RBZGRyZXNzQm9va3NSZXF1ZXN0Ij8KGExpc3RBZGRyZXNzQm9va3NSZXNwb25zZRIjCgVib29rcxgBIAMoCzIULmF1dGgudjEuQWRkcmVzc0Jvb2sijgEKHUxpc3RBZGRyZXNzQm9va0VudHJpZXNSZXF1ZXN0EhcKDXN1YmFjY291bnRfaWQYASABKAZCABItCgRraW5kGAIgASgOMh0uYXV0aC52MS5BZGRyZXNzQm9va0VudHJ5S2luZEIAEg8KBWxpbWl0GAMgASgNQgASFAoKcGFnZV90b2tlbhgEIAEoCUIAImcKHkxpc3RBZGRyZXNzQm9va0VudHJpZXNSZXNwb25zZRIqCgdlbnRyaWVzGAEgAygLMhkuYXV0aC52MS5BZGRyZXNzQm9va0VudHJ5EhkKD25leHRfcGFnZV90b2tlbhgCIAEoCUIAIpwCCh1DcmVhdGVBZGRyZXNzQm9va0VudHJ5UmVxdWVzdBIXCg1zdWJhY2NvdW50X2lkGAEgASgGQgASDwoFbGFiZWwYAiABKAlCABIOCgRub3RlGAMgASgJQgASNAoIZXh0ZXJuYWwYCiABKAsyIC5hdXRoLnYxLkV4dGVybmFsV2l0aGRyYXdBZGRyZXNzSAASPQoIaW50ZXJuYWwYCyABKAsyKS5hdXRoLnYxLlJlcXVlc3RlZEludGVybmFsVHJhbnNmZXJBY2NvdW50SAASEQoHdGFnX2lkcxgEIAMoBkIAEjAKCG5ld190YWdzGAUgAygLMhwuYXV0aC52MS5BZGRyZXNzQm9va1RhZ0lucHV0QgBCBwoFZW50cnkiQwogUmVxdWVzdGVkSW50ZXJuYWxUcmFuc2ZlckFjY291bnQSHwoVc21hcnRfYWNjb3VudF9hZGRyZXNzGAEgASgJQgAiSgoeQ3JlYXRlQWRkcmVzc0Jvb2tFbnRyeVJlc3BvbnNlEigKBWVudHJ5GAEgASgLMhkuYXV0aC52MS5BZGRyZXNzQm9va0VudHJ5IoIBChpBZGRyZXNzQm9va0VudHJ5VXBkYXRlU3BlYxIPCgVsYWJlbBgBIAEoCUIAEg4KBG5vdGUYAiABKAlCABIRCgd0YWdfaWRzGAMgAygGQgASMAoIbmV3X3RhZ3MYBCADKAsyHC5hdXRoLnYxLkFkZHJlc3NCb29rVGFnSW5wdXRCACLGAQodVXBkYXRlQWRkcmVzc0Jvb2tFbnRyeVJlcXVlc3QSHwoVYWRkcmVzc19ib29rX2VudHJ5X2lkGAEgASgGQgASNAoFZW50cnkYAiABKAsyIy5hdXRoLnYxLkFkZHJlc3NCb29rRW50cnlVcGRhdGVTcGVjQgASMQoLdXBkYXRlX21hc2sYAyABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQgASGwoRZXhwZWN0ZWRfcmV2aXNpb24YBCABKARCACJKCh5VcGRhdGVBZGRyZXNzQm9va0VudHJ5UmVzcG9uc2USKAoFZW50cnkYASABKAsyGS5hdXRoLnYxLkFkZHJlc3NCb29rRW50cnkiNgoTQWRkcmVzc0Jvb2tUYWdJbnB1dBIOCgRuYW1lGAEgASgJQgASDwoFY29sb3IYAiABKAlCACJACh1EZWxldGVBZGRyZXNzQm9va0VudHJ5UmVxdWVzdBIfChVhZGRyZXNzX2Jvb2tfZW50cnlfaWQYASABKAZCACIgCh5EZWxldGVBZGRyZXNzQm9va0VudHJ5UmVzcG9uc2UiXgobQ29weUFkZHJlc3NCb29rRW50cnlSZXF1ZXN0Eh8KFWFkZHJlc3NfYm9va19lbnRyeV9pZBgBIAEoBkIAEh4KFHRhcmdldF9zdWJhY2NvdW50X2lkGAIgASgGQgAiSAocQ29weUFkZHJlc3NCb29rRW50cnlSZXNwb25zZRIoCgVlbnRyeRgBIAEoCzIZLmF1dGgudjEuQWRkcmVzc0Jvb2tFbnRyeSJXChtDcmVhdGVBZGRyZXNzQm9va1RhZ1JlcXVlc3QSFwoNc3ViYWNjb3VudF9pZBgBIAEoBkIAEg4KBG5hbWUYAiABKAlCABIPCgVjb2xvchgDIAEoCUIAIkQKHENyZWF0ZUFkZHJlc3NCb29rVGFnUmVzcG9uc2USJAoDdGFnGAEgASgLMhcuYXV0aC52MS5BZGRyZXNzQm9va1RhZyJtChtVcGRhdGVBZGRyZXNzQm9va1RhZ1JlcXVlc3QSEAoGdGFnX2lkGAEgASgGQgASEwoEbmFtZRgCIAEoCUIASACIAQESFAoFY29sb3IYAyABKAlCAEgBiAEBQgcKBV9uYW1lQggKBl9jb2xvciJEChxVcGRhdGVBZGRyZXNzQm9va1RhZ1Jlc3BvbnNlEiQKA3RhZxgBIAEoCzIXLmF1dGgudjEuQWRkcmVzc0Jvb2tUYWciLwobRGVsZXRlQWRkcmVzc0Jvb2tUYWdSZXF1ZXN0EhAKBnRhZ19pZBgBIAEoBkIAIh4KHERlbGV0ZUFkZHJlc3NCb29rVGFnUmVzcG9uc2UiuQEKIUxpc3RUcmFuc2ZlckNvdW50ZXJwYXJ0aWVzUmVxdWVzdBIXCg1zdWJhY2NvdW50X2lkGAEgASgGQgASOwoJZGlyZWN0aW9uGAIgASgOMiYuYXV0aC52MS5UcmFuc2ZlckNvdW50ZXJwYXJ0eURpcmVjdGlvbkIAEi0KBGtpbmQYAyABKA4yHS5hdXRoLnYxLkFkZHJlc3NCb29rRW50cnlLaW5kQgASDwoFbGltaXQYBSABKA1CACJuCiJMaXN0VHJhbnNmZXJDb3VudGVycGFydGllc1Jlc3BvbnNlEjUKDmNvdW50ZXJwYXJ0aWVzGAEgAygLMh0uYXV0aC52MS5UcmFuc2ZlckNvdW50ZXJwYXJ0eRIRCgl0cnVuY2F0ZWQYAiABKAgikAEKH0xpc3RUcmFuc2ZlckRlc3RpbmF0aW9uc1JlcXVlc3QSFwoNc3ViYWNjb3VudF9pZBgBIAEoBkIAEi0KBGtpbmQYAiABKA4yHS5hdXRoLnYxLkFkZHJlc3NCb29rRW50cnlLaW5kQgASDwoFbGltaXQYAyABKA1CABIUCgpwYWdlX3Rva2VuGAQgASgJQgAicQogTGlzdFRyYW5zZmVyRGVzdGluYXRpb25zUmVzcG9uc2USMgoMZGVzdGluYXRpb25zGAEgAygLMhwuYXV0aC52MS5UcmFuc2ZlckRlc3RpbmF0aW9uEhkKD25leHRfcGFnZV90b2tlbhgCIAEoCUIAIm0KK0xpc3RJbnRlcm5hbFRyYW5zZmVyV2hpdGVsaXN0RW50cmllc1JlcXVlc3QSFwoNc3ViYWNjb3VudF9pZBgBIAEoBkIAEg8KBWxpbWl0GAIgASgNQgASFAoKcGFnZV90b2tlbhgDIAEoCUIAIoMBCixMaXN0SW50ZXJuYWxUcmFuc2ZlcldoaXRlbGlzdEVudHJpZXNSZXNwb25zZRI4CgdlbnRyaWVzGAEgAygLMicuYXV0aC52MS5JbnRlcm5hbFRyYW5zZmVyV2hpdGVsaXN0RW50cnkSGQoPbmV4dF9wYWdlX3Rva2VuGAIgASgJQgAiOgofR2V0V2l0aGRyYXdXaGl0ZWxpc3RWaWV3UmVxdWVzdBIXCg1zdWJhY2NvdW50X2lkGAEgASgGQgAiUAogR2V0V2l0aGRyYXdXaGl0ZWxpc3RWaWV3UmVzcG9uc2USLAoEdmlldxgBIAEoCzIeLmF1dGgudjEuV2l0aGRyYXdXaGl0ZWxpc3RWaWV3IkUKGUdldEFkZHJlc3NCb29rVmlld1JlcXVlc3QSFwoNc3ViYWNjb3VudF9pZBgBIAEoBkIAEg8KBWxpbWl0GAYgASgNQgAizQIKGkdldEFkZHJlc3NCb29rVmlld1Jlc3BvbnNlEiMKBWJvb2tzGAEgAygLMhQuYXV0aC52MS5BZGRyZXNzQm9vaxIwCgdlbnRyaWVzGAIgASgLMh8uYXV0aC52MS5BZGRyZXNzQm9va0VudHJpZXNWaWV3EkcKE3JlY2VudF9kZXN0aW5hdGlvbnMYAyABKAsyKi5hdXRoLnYxLkFkZHJlc3NCb29rUmVjZW50RGVzdGluYXRpb25zVmlldxIsCgR0YWdzGAQgAygLMh4uYXV0aC52MS5BZGRyZXNzQm9va1RhZ1N1bW1hcnkSOgoSd2l0aGRyYXdfd2hpdGVsaXN0GAUgASgLMh4uYXV0aC52MS5XaXRoZHJhd1doaXRlbGlzdFZpZXcSJQodcmVjZW50X2Rlc3RpbmF0aW9uc190cnVuY2F0ZWQYBiABKAgieQoaQWRkcmVzc0Jvb2tWaWV3SW52YWxpZGF0ZWQSJwoFc2NvcGUYASABKAsyGC5hdXRoLnYxLkFjY291bnRTY29wZVJlZhIyCg5pbnZhbGlkYXRlZF9hdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAqTwoQQWNjb3VudFNjb3BlVHlwZRIVChFTQ09QRV9VTlNQRUNJRklFRBAAEg4KClNDT1BFX1JPT1QQARIUChBTQ09QRV9TVUJBQ0NPVU5UEAIqXAoUQWRkcmVzc0Jvb2tFbnRyeUtpbmQSGgoWRU5UUllfS0lORF9VTlNQRUNJRklFRBAAEhIKDkVYVEVSTkFMX0NIQUlOEAESFAoQSU5URVJOQUxfQUNDT1VOVBACKpYBCiFJbnRlcm5hbFdoaXRlbGlzdFJlc29sdXRpb25TdGF0dXMSLQopSU5URVJOQUxfV0hJVEVMSVNUX1JFU09MVVRJT05fVU5TUEVDSUZJRUQQABIfChtJTlRFUk5BTF9XSElURUxJU1RfUkVTT0xWRUQQARIhCh1JTlRFUk5BTF9XSElURUxJU1RfVU5SRVNPTFZFRBACKrMBChpEZXN0aW5hdGlvbldoaXRlbGlzdFN0YXR1cxIsCihERVNUSU5BVElPTl9XSElURUxJU1RfU1RBVFVTX1VOU1BFQ0lGSUVEEAASHwobREVTVElOQVRJT05fTk9UX1dISVRFTElTVEVEEAESIAocREVTVElOQVRJT05fV0hJVEVMSVNUX0FDVElWRRACEiQKIERFU1RJTkFUSU9OX1dISVRFTElTVF9VTlJFU09MVkVEEAMqqQEKHVRyYW5zZmVyQ291bnRlcnBhcnR5RGlyZWN0aW9uEi8KK1RSQU5TRkVSX0NPVU5URVJQQVJUWV9ESVJFQ1RJT05fVU5TUEVDSUZJRUQQABIQCgxERVBPU0lUX0ZST00QARIPCgtXSVRIRFJBV19UTxACEhoKFklOVEVSTkFMX1RSQU5TRkVSX0ZST00QAxIYChRJTlRFUk5BTF9UUkFOU0ZFUl9UTxAEMpcMChJBZGRyZXNzQm9va1NlcnZpY2USWQoQTGlzdEFkZHJlc3NCb29rcxIgLmF1dGgudjEuTGlzdEFkZHJlc3NCb29rc1JlcXVlc3QaIS5hdXRoLnYxLkxpc3RBZGRyZXNzQm9va3NSZXNwb25zZSIAEmsKFkxpc3RBZGRyZXNzQm9va0VudHJpZXMSJi5hdXRoLnYxLkxpc3RBZGRyZXNzQm9va0VudHJpZXNSZXF1ZXN0GicuYXV0aC52MS5MaXN0QWRkcmVzc0Jvb2tFbnRyaWVzUmVzcG9uc2UiABJrChZDcmVhdGVBZGRyZXNzQm9va0VudHJ5EiYuYXV0aC52MS5DcmVhdGVBZGRyZXNzQm9va0VudHJ5UmVxdWVzdBonLmF1dGgudjEuQ3JlYXRlQWRkcmVzc0Jvb2tFbnRyeVJlc3BvbnNlIgASawoWVXBkYXRlQWRkcmVzc0Jvb2tFbnRyeRImLmF1dGgudjEuVXBkYXRlQWRkcmVzc0Jvb2tFbnRyeVJlcXVlc3QaJy5hdXRoLnYxLlVwZGF0ZUFkZHJlc3NCb29rRW50cnlSZXNwb25zZSIAEmsKFkRlbGV0ZUFkZHJlc3NCb29rRW50cnkSJi5hdXRoLnYxLkRlbGV0ZUFkZHJlc3NCb29rRW50cnlSZXF1ZXN0GicuYXV0aC52MS5EZWxldGVBZGRyZXNzQm9va0VudHJ5UmVzcG9uc2UiABJlChRDb3B5QWRkcmVzc0Jvb2tFbnRyeRIkLmF1dGgudjEuQ29weUFkZHJlc3NCb29rRW50cnlSZXF1ZXN0GiUuYXV0aC52MS5Db3B5QWRkcmVzc0Jvb2tFbnRyeVJlc3BvbnNlIgASZQoUQ3JlYXRlQWRkcmVzc0Jvb2tUYWcSJC5hdXRoLnYxLkNyZWF0ZUFkZHJlc3NCb29rVGFnUmVxdWVzdBolLmF1dGgudjEuQ3JlYXRlQWRkcmVzc0Jvb2tUYWdSZXNwb25zZSIAEmUKFFVwZGF0ZUFkZHJlc3NCb29rVGFnEiQuYXV0aC52MS5VcGRhdGVBZGRyZXNzQm9va1RhZ1JlcXVlc3QaJS5hdXRoLnYxLlVwZGF0ZUFkZHJlc3NCb29rVGFnUmVzcG9uc2UiABJlChREZWxldGVBZGRyZXNzQm9va1RhZxIkLmF1dGgudjEuRGVsZXRlQWRkcmVzc0Jvb2tUYWdSZXF1ZXN0GiUuYXV0aC52MS5EZWxldGVBZGRyZXNzQm9va1RhZ1Jlc3BvbnNlIgASdwoaTGlzdFRyYW5zZmVyQ291bnRlcnBhcnRpZXMSKi5hdXRoLnYxLkxpc3RUcmFuc2ZlckNvdW50ZXJwYXJ0aWVzUmVxdWVzdBorLmF1dGgudjEuTGlzdFRyYW5zZmVyQ291bnRlcnBhcnRpZXNSZXNwb25zZSIAEnEKGExpc3RUcmFuc2ZlckRlc3RpbmF0aW9ucxIoLmF1dGgudjEuTGlzdFRyYW5zZmVyRGVzdGluYXRpb25zUmVxdWVzdBopLmF1dGgudjEuTGlzdFRyYW5zZmVyRGVzdGluYXRpb25zUmVzcG9uc2UiABKVAQokTGlzdEludGVybmFsVHJhbnNmZXJXaGl0ZWxpc3RFbnRyaWVzEjQuYXV0aC52MS5MaXN0SW50ZXJuYWxUcmFuc2ZlcldoaXRlbGlzdEVudHJpZXNSZXF1ZXN0GjUuYXV0aC52MS5MaXN0SW50ZXJuYWxUcmFuc2ZlcldoaXRlbGlzdEVudHJpZXNSZXNwb25zZSIAEnEKGEdldFdpdGhkcmF3V2hpdGVsaXN0VmlldxIoLmF1dGgudjEuR2V0V2l0aGRyYXdXaGl0ZWxpc3RWaWV3UmVxdWVzdBopLmF1dGgudjEuR2V0V2l0aGRyYXdXaGl0ZWxpc3RWaWV3UmVzcG9uc2UiABJfChJHZXRBZGRyZXNzQm9va1ZpZXcSIi5hdXRoLnYxLkdldEFkZHJlc3NCb29rVmlld1JlcXVlc3QaIy5hdXRoLnYxLkdldEFkZHJlc3NCb29rVmlld1Jlc3BvbnNlIgBCPFo6Z2l0aHViLmNvbS9GYWJyaWMtTGFicy9wb2x5ZXN0ZXItc2RrLWdvL2dlbi9hdXRoL3YxO2F1dGh2MWIGcHJvdG8z", [
|
|
75
75
|
file_auth_v1_subaccounts,
|
|
76
76
|
file_google_protobuf_field_mask,
|
|
77
77
|
file_google_protobuf_timestamp,
|