@nadohq/indexer-client 0.1.0-alpha.1 → 0.1.0-alpha.3
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/dist/IndexerBaseClient.cjs +18 -3
- package/dist/IndexerBaseClient.cjs.map +1 -1
- package/dist/IndexerBaseClient.d.cts +7 -2
- package/dist/IndexerBaseClient.d.ts +7 -2
- package/dist/IndexerBaseClient.js +19 -4
- package/dist/IndexerBaseClient.js.map +1 -1
- package/dist/IndexerClient.cjs +6 -6
- package/dist/IndexerClient.cjs.map +1 -1
- package/dist/IndexerClient.d.cts +2 -2
- package/dist/IndexerClient.d.ts +2 -2
- package/dist/IndexerClient.js +7 -7
- package/dist/IndexerClient.js.map +1 -1
- package/dist/dataMappers.cjs +3 -3
- package/dist/dataMappers.cjs.map +1 -1
- package/dist/dataMappers.d.cts +4 -4
- package/dist/dataMappers.d.ts +4 -4
- package/dist/dataMappers.js +2 -2
- package/dist/dataMappers.js.map +1 -1
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/types/IndexerEventType.cjs.map +1 -1
- package/dist/types/IndexerEventType.d.cts +1 -1
- package/dist/types/IndexerEventType.d.ts +1 -1
- package/dist/types/NadoTx.cjs.map +1 -1
- package/dist/types/clientTypes.cjs.map +1 -1
- package/dist/types/clientTypes.d.cts +10 -6
- package/dist/types/clientTypes.d.ts +10 -6
- package/dist/types/index.d.cts +4 -4
- package/dist/types/index.d.ts +4 -4
- package/dist/types/paginatedEventsTypes.cjs.map +1 -1
- package/dist/types/paginatedEventsTypes.d.cts +6 -6
- package/dist/types/paginatedEventsTypes.d.ts +6 -6
- package/dist/types/serverModelTypes.cjs.map +1 -1
- package/dist/types/serverModelTypes.d.cts +3 -3
- package/dist/types/serverModelTypes.d.ts +3 -3
- package/dist/types/serverTypes.cjs.map +1 -1
- package/dist/types/serverTypes.d.cts +15 -7
- package/dist/types/serverTypes.d.ts +15 -7
- package/package.json +5 -5
- package/src/IndexerBaseClient.ts +29 -8
- package/src/IndexerClient.ts +15 -15
- package/src/dataMappers.ts +5 -5
- package/src/types/IndexerEventType.ts +2 -2
- package/src/types/NadoTx.ts +1 -1
- package/src/types/clientTypes.ts +12 -6
- package/src/types/paginatedEventsTypes.ts +6 -6
- package/src/types/serverModelTypes.ts +2 -2
- package/src/types/serverTypes.ts +16 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/IndexerClient.ts"],"sourcesContent":["import {\n ProductEngineType,\n QUOTE_PRODUCT_ID,\n subaccountFromHex,\n VLP_PRODUCT_ID,\n} from '@nadohq/contracts';\nimport { toBigDecimal, toIntegerString } from '@nadohq/utils';\n\nimport { IndexerBaseClient } from './IndexerBaseClient';\nimport {\n BaseIndexerPaginatedEvent,\n CollateralEventType,\n GetIndexerPaginatedInterestFundingPaymentsResponse,\n GetIndexerPaginatedLeaderboardParams,\n GetIndexerPaginatedLeaderboardResponse,\n GetIndexerPaginatedOrdersParams,\n GetIndexerPaginatedOrdersResponse,\n GetIndexerSubaccountCollateralEventsParams,\n GetIndexerSubaccountCollateralEventsResponse,\n GetIndexerSubaccountInterestFundingPaymentsParams,\n GetIndexerSubaccountLiquidationEventsParams,\n GetIndexerSubaccountLiquidationEventsResponse,\n GetIndexerSubaccountMatchEventParams,\n GetIndexerSubaccountMatchEventsResponse,\n GetIndexerSubaccountSettlementEventsParams,\n GetIndexerSubaccountSettlementEventsResponse,\n GetIndexerSubaccountVlpEventsParams,\n GetIndexerSubaccountVlpEventsResponse,\n IndexerCollateralEvent,\n IndexerEventPerpStateSnapshot,\n IndexerEventSpotStateSnapshot,\n IndexerEventWithTx,\n IndexerLiquidationEvent,\n IndexerSettlementEvent,\n IndexerVlpEvent,\n PaginatedIndexerEventsResponse,\n} from './types';\n\n/**\n * Indexer client providing paginated queries for historical data from the Nado indexer service\n */\nexport class IndexerClient extends IndexerBaseClient {\n async getPaginatedSubaccountMatchEvents(\n params: GetIndexerSubaccountMatchEventParams,\n ): Promise<GetIndexerSubaccountMatchEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n isolated,\n productIds,\n } = params;\n\n const limit = requestedLimit + 1;\n const events = await this.getMatchEvents({\n startCursor,\n maxTimestampInclusive,\n limit,\n subaccount: { subaccountName, subaccountOwner },\n productIds,\n isolated,\n });\n\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n async getPaginatedSubaccountVlpEvents(\n params: GetIndexerSubaccountVlpEventsParams,\n ): Promise<GetIndexerSubaccountVlpEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n } = params;\n\n // There are 2 events per mint/burn for spot - one associated with the VLP product & the other with the primary quote\n const limit = requestedLimit + 1;\n const baseResponse = await this.getEvents({\n startCursor,\n maxTimestampInclusive,\n eventTypes: ['mint_vlp', 'burn_vlp'],\n limit: {\n type: 'txs',\n value: limit,\n },\n subaccount: { subaccountName, subaccountOwner },\n });\n\n // Now aggregate results by the submission index, use map to maintain insertion order\n const eventsBySubmissionIdx = new Map<string, IndexerVlpEvent>();\n\n baseResponse.forEach((event) => {\n const mappedEvent = (() => {\n const existingEvent = eventsBySubmissionIdx.get(event.submissionIndex);\n if (existingEvent) {\n return existingEvent;\n }\n\n const newEvent: IndexerVlpEvent = {\n vlpDelta: toBigDecimal(0),\n primaryQuoteDelta: toBigDecimal(0),\n timestamp: event.timestamp,\n submissionIndex: event.submissionIndex,\n tx: event.tx,\n ...subaccountFromHex(event.subaccount),\n };\n eventsBySubmissionIdx.set(event.submissionIndex, newEvent);\n\n return newEvent;\n })();\n\n const balanceDelta = event.state.postBalance.amount.minus(\n event.state.preBalance.amount,\n );\n\n const productId = event.state.market.productId;\n if (productId === QUOTE_PRODUCT_ID) {\n mappedEvent.primaryQuoteDelta = balanceDelta;\n } else if (productId === VLP_PRODUCT_ID) {\n mappedEvent.vlpDelta = balanceDelta;\n } else {\n throw Error(`Invalid product ID for VLP event ${productId}`);\n }\n });\n\n // Force cast to get rid of the `Partial`\n const events = Array.from(eventsBySubmissionIdx.values());\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n async getPaginatedSubaccountCollateralEvents(\n params: GetIndexerSubaccountCollateralEventsParams,\n ): Promise<GetIndexerSubaccountCollateralEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n eventTypes,\n isolated,\n } = params;\n\n const limit = requestedLimit + 1;\n const baseResponse = await this.getEvents({\n startCursor,\n maxTimestampInclusive,\n eventTypes: eventTypes ?? [\n 'deposit_collateral',\n 'withdraw_collateral',\n 'transfer_quote',\n ],\n limit: {\n type: 'txs',\n value: limit,\n },\n subaccount: { subaccountName, subaccountOwner },\n isolated,\n });\n\n const events = baseResponse.map((event): IndexerCollateralEvent => {\n if (event.state.type !== ProductEngineType.SPOT) {\n throw Error('Incorrect event state for collateral event');\n }\n\n return {\n timestamp: event.timestamp,\n // This cast is safe as the query param restricts to collateral events\n eventType: event.eventType as CollateralEventType,\n submissionIndex: event.submissionIndex,\n snapshot: event.state,\n amount: event.state.postBalance.amount.minus(\n event.state.preBalance.amount,\n ),\n newAmount: event.state.postBalance.amount,\n tx: event.tx,\n ...subaccountFromHex(event.subaccount),\n };\n });\n\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n async getPaginatedSubaccountOrders(\n params: GetIndexerPaginatedOrdersParams,\n ): Promise<GetIndexerPaginatedOrdersResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n productIds,\n isolated,\n } = params;\n\n const limit = requestedLimit + 1;\n const baseResponse = await this.getOrders({\n startCursor,\n maxTimestampInclusive,\n subaccount: { subaccountName, subaccountOwner },\n limit,\n productIds,\n isolated,\n });\n\n // Same pagination meta logic as events, but duplicate for now as this return type is slightly different\n const truncatedOrders = baseResponse.slice(0, requestedLimit);\n const hasMore = baseResponse.length > truncatedOrders.length;\n return {\n meta: {\n hasMore,\n nextCursor: baseResponse[truncatedOrders.length]?.submissionIndex,\n },\n orders: truncatedOrders,\n };\n }\n\n async getPaginatedSubaccountSettlementEvents(\n params: GetIndexerSubaccountSettlementEventsParams,\n ): Promise<GetIndexerSubaccountSettlementEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n } = params;\n\n // Each settlement has a quote & perp balance change, so 2 events per settlement tx\n const limit = requestedLimit + 1;\n const baseResponse = await this.getEvents({\n startCursor,\n maxTimestampInclusive,\n eventTypes: ['settle_pnl'],\n limit: {\n type: 'txs',\n value: limit,\n },\n subaccount: { subaccountName, subaccountOwner },\n });\n\n const events = baseResponse\n .map((event): IndexerSettlementEvent | undefined => {\n if (event.state.market.productId === QUOTE_PRODUCT_ID) {\n return;\n }\n if (event.state.type !== ProductEngineType.PERP) {\n throw Error('Incorrect event state for settlement event');\n }\n\n return {\n timestamp: event.timestamp,\n submissionIndex: event.submissionIndex,\n snapshot: event.state,\n // Spot quote delta = -vQuote delta\n quoteDelta: event.state.preBalance.vQuoteBalance.minus(\n event.state.postBalance.vQuoteBalance,\n ),\n isolated: event.isolated,\n tx: event.tx,\n ...subaccountFromHex(event.subaccount),\n };\n })\n .filter((event): event is IndexerSettlementEvent => !!event);\n\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n async getPaginatedSubaccountLiquidationEvents(\n params: GetIndexerSubaccountLiquidationEventsParams,\n ): Promise<GetIndexerSubaccountLiquidationEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n } = params;\n\n // There is 1 event emitted per product, including quote\n // However, if the balance change is 0, then the liquidation did not touch the product\n // A tx operates on a given health group, so only a spot & its associated perp can be actually liquidated within a single tx\n // with an associated quote balance change\n const limit = requestedLimit + 1;\n const baseResponse = await this.getEvents({\n startCursor,\n maxTimestampInclusive,\n eventTypes: ['liquidate_subaccount'],\n limit: {\n type: 'txs',\n value: limit,\n },\n subaccount: { subaccountName, subaccountOwner },\n });\n\n // Now aggregate results by the submission index, use map to maintain insertion order\n const eventsBySubmissionIdx = new Map<\n string,\n Partial<IndexerLiquidationEvent>\n >();\n\n baseResponse.forEach((event) => {\n const mappedEvent = (() => {\n const existingEvent = eventsBySubmissionIdx.get(event.submissionIndex);\n if (existingEvent) {\n return existingEvent;\n }\n\n const newEvent: Partial<IndexerLiquidationEvent> = {\n perp: undefined,\n spot: undefined,\n quote: undefined,\n timestamp: event.timestamp,\n submissionIndex: event.submissionIndex,\n };\n\n return newEvent;\n })();\n\n // The original balance is the negated delta\n const balanceDelta = event.state.postBalance.amount.minus(\n event.state.preBalance.amount,\n );\n\n // Event without balance change - not part of this liq\n // However, we could have zero balance changes for the quote product if this was a partial liquidation\n if (\n balanceDelta.isZero() &&\n event.state.market.productId !== QUOTE_PRODUCT_ID\n ) {\n return;\n }\n\n if (event.state.type === ProductEngineType.PERP) {\n mappedEvent.perp = {\n amountLiquidated: balanceDelta.negated(),\n // This cast is safe because we're checking for event.state.type\n indexerEvent:\n event as IndexerEventWithTx<IndexerEventPerpStateSnapshot>,\n };\n } else if (event.state.market.productId === QUOTE_PRODUCT_ID) {\n mappedEvent.quote = {\n balanceDelta,\n indexerEvent:\n event as IndexerEventWithTx<IndexerEventSpotStateSnapshot>,\n };\n } else {\n mappedEvent.spot = {\n amountLiquidated: balanceDelta.negated(),\n indexerEvent:\n event as IndexerEventWithTx<IndexerEventSpotStateSnapshot>,\n };\n }\n\n eventsBySubmissionIdx.set(event.submissionIndex, mappedEvent);\n });\n\n // Force cast to get rid of the `Partial`\n const events = Array.from(\n eventsBySubmissionIdx.values(),\n ) as IndexerLiquidationEvent[];\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n /**\n * Get all interest funding payments for a given subaccount with the standard pagination response\n * This is a simple wrapper over the underlying `getInterestFundingPayments` function. Very little\n * additional processing is needed because the endpoint is well structured for pagination\n *\n * @param params\n */\n async getPaginatedSubaccountInterestFundingPayments(\n params: GetIndexerSubaccountInterestFundingPaymentsParams,\n ): Promise<GetIndexerPaginatedInterestFundingPaymentsResponse> {\n const {\n limit,\n productIds,\n startCursor,\n maxTimestampInclusive,\n subaccountName,\n subaccountOwner,\n } = params;\n const baseResponse = await this.getInterestFundingPayments({\n limit,\n productIds,\n startCursor,\n maxTimestampInclusive,\n subaccount: {\n subaccountName,\n subaccountOwner,\n },\n });\n\n return {\n ...baseResponse,\n meta: {\n hasMore: baseResponse.nextCursor != null,\n nextCursor: baseResponse.nextCursor ?? undefined,\n },\n };\n }\n\n /**\n * Paginated leaderboard query that paginates on rank number.\n *\n * @param params\n */\n async getPaginatedLeaderboard(\n params: GetIndexerPaginatedLeaderboardParams,\n ): Promise<GetIndexerPaginatedLeaderboardResponse> {\n const requestedLimit = params.limit;\n\n const baseResponse = await this.getLeaderboard({\n contestId: params.contestId,\n rankType: params.rankType,\n // Query for 1 more result for proper pagination\n limit: requestedLimit + 1,\n // Start cursor is the next rank number\n startCursor: params.startCursor,\n });\n\n // Next cursor is the rank number of the (requestedLimit+1)th item\n const nextCursor =\n params.rankType === 'pnl'\n ? baseResponse.participants[requestedLimit]?.pnlRank\n : baseResponse.participants[requestedLimit]?.roiRank;\n\n return {\n ...baseResponse,\n // Truncate the response to the requested limit\n participants: baseResponse.participants.slice(0, requestedLimit),\n meta: {\n hasMore: baseResponse.participants.length > requestedLimit,\n nextCursor:\n nextCursor !== undefined ? toIntegerString(nextCursor) : undefined,\n },\n };\n }\n\n /**\n * A util function to generate the standard pagination response for events\n * @param events\n * @param requestedLimit given by consumers of the SDK\n * @private\n */\n private getPaginationEventsResponse<T extends BaseIndexerPaginatedEvent>(\n events: T[],\n requestedLimit: number,\n ): PaginatedIndexerEventsResponse<T> {\n const truncatedEvents = events.slice(0, requestedLimit);\n const hasMore = events.length > truncatedEvents.length;\n\n return {\n events: truncatedEvents,\n meta: {\n hasMore,\n // We want the NEXT available cursor, so we use the first event after the truncation cutoff\n // If len(events) === len(truncatedEvents), there are no more entries and this is undefined\n nextCursor: events[truncatedEvents.length]?.submissionIndex,\n },\n };\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/IndexerClient.ts"],"sourcesContent":["import {\n ProductEngineType,\n QUOTE_PRODUCT_ID,\n subaccountFromHex,\n NLP_PRODUCT_ID,\n} from '@nadohq/contracts';\nimport { toBigDecimal, toIntegerString } from '@nadohq/utils';\n\nimport { IndexerBaseClient } from './IndexerBaseClient';\nimport {\n BaseIndexerPaginatedEvent,\n CollateralEventType,\n GetIndexerPaginatedInterestFundingPaymentsResponse,\n GetIndexerPaginatedLeaderboardParams,\n GetIndexerPaginatedLeaderboardResponse,\n GetIndexerPaginatedOrdersParams,\n GetIndexerPaginatedOrdersResponse,\n GetIndexerSubaccountCollateralEventsParams,\n GetIndexerSubaccountCollateralEventsResponse,\n GetIndexerSubaccountInterestFundingPaymentsParams,\n GetIndexerSubaccountLiquidationEventsParams,\n GetIndexerSubaccountLiquidationEventsResponse,\n GetIndexerSubaccountMatchEventParams,\n GetIndexerSubaccountMatchEventsResponse,\n GetIndexerSubaccountSettlementEventsParams,\n GetIndexerSubaccountSettlementEventsResponse,\n GetIndexerSubaccountNlpEventsParams,\n GetIndexerSubaccountNlpEventsResponse,\n IndexerCollateralEvent,\n IndexerEventPerpStateSnapshot,\n IndexerEventSpotStateSnapshot,\n IndexerEventWithTx,\n IndexerLiquidationEvent,\n IndexerSettlementEvent,\n IndexerNlpEvent,\n PaginatedIndexerEventsResponse,\n} from './types';\n\n/**\n * Indexer client providing paginated queries for historical data from the Nado indexer service\n */\nexport class IndexerClient extends IndexerBaseClient {\n async getPaginatedSubaccountMatchEvents(\n params: GetIndexerSubaccountMatchEventParams,\n ): Promise<GetIndexerSubaccountMatchEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n isolated,\n productIds,\n } = params;\n\n const limit = requestedLimit + 1;\n const events = await this.getMatchEvents({\n startCursor,\n maxTimestampInclusive,\n limit,\n subaccount: { subaccountName, subaccountOwner },\n productIds,\n isolated,\n });\n\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n async getPaginatedSubaccountNlpEvents(\n params: GetIndexerSubaccountNlpEventsParams,\n ): Promise<GetIndexerSubaccountNlpEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n } = params;\n\n // There are 2 events per mint/burn for spot - one associated with the NLP product & the other with the primary quote\n const limit = requestedLimit + 1;\n const baseResponse = await this.getEvents({\n startCursor,\n maxTimestampInclusive,\n eventTypes: ['mint_nlp', 'burn_nlp'],\n limit: {\n type: 'txs',\n value: limit,\n },\n subaccount: { subaccountName, subaccountOwner },\n });\n\n // Now aggregate results by the submission index, use map to maintain insertion order\n const eventsBySubmissionIdx = new Map<string, IndexerNlpEvent>();\n\n baseResponse.forEach((event) => {\n const mappedEvent = (() => {\n const existingEvent = eventsBySubmissionIdx.get(event.submissionIndex);\n if (existingEvent) {\n return existingEvent;\n }\n\n const newEvent: IndexerNlpEvent = {\n nlpDelta: toBigDecimal(0),\n primaryQuoteDelta: toBigDecimal(0),\n timestamp: event.timestamp,\n submissionIndex: event.submissionIndex,\n tx: event.tx,\n ...subaccountFromHex(event.subaccount),\n };\n eventsBySubmissionIdx.set(event.submissionIndex, newEvent);\n\n return newEvent;\n })();\n\n const balanceDelta = event.state.postBalance.amount.minus(\n event.state.preBalance.amount,\n );\n\n const productId = event.state.market.productId;\n if (productId === QUOTE_PRODUCT_ID) {\n mappedEvent.primaryQuoteDelta = balanceDelta;\n } else if (productId === NLP_PRODUCT_ID) {\n mappedEvent.nlpDelta = balanceDelta;\n } else {\n throw Error(`Invalid product ID for NLP event ${productId}`);\n }\n });\n\n // Force cast to get rid of the `Partial`\n const events = Array.from(eventsBySubmissionIdx.values());\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n async getPaginatedSubaccountCollateralEvents(\n params: GetIndexerSubaccountCollateralEventsParams,\n ): Promise<GetIndexerSubaccountCollateralEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n eventTypes,\n isolated,\n } = params;\n\n const limit = requestedLimit + 1;\n const baseResponse = await this.getEvents({\n startCursor,\n maxTimestampInclusive,\n eventTypes: eventTypes ?? [\n 'deposit_collateral',\n 'withdraw_collateral',\n 'transfer_quote',\n ],\n limit: {\n type: 'txs',\n value: limit,\n },\n subaccount: { subaccountName, subaccountOwner },\n isolated,\n });\n\n const events = baseResponse.map((event): IndexerCollateralEvent => {\n if (event.state.type !== ProductEngineType.SPOT) {\n throw Error('Incorrect event state for collateral event');\n }\n\n return {\n timestamp: event.timestamp,\n // This cast is safe as the query param restricts to collateral events\n eventType: event.eventType as CollateralEventType,\n submissionIndex: event.submissionIndex,\n snapshot: event.state,\n amount: event.state.postBalance.amount.minus(\n event.state.preBalance.amount,\n ),\n newAmount: event.state.postBalance.amount,\n tx: event.tx,\n ...subaccountFromHex(event.subaccount),\n };\n });\n\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n async getPaginatedSubaccountOrders(\n params: GetIndexerPaginatedOrdersParams,\n ): Promise<GetIndexerPaginatedOrdersResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n productIds,\n isolated,\n } = params;\n\n const limit = requestedLimit + 1;\n const baseResponse = await this.getOrders({\n startCursor,\n maxTimestampInclusive,\n subaccount: { subaccountName, subaccountOwner },\n limit,\n productIds,\n isolated,\n });\n\n // Same pagination meta logic as events, but duplicate for now as this return type is slightly different\n const truncatedOrders = baseResponse.slice(0, requestedLimit);\n const hasMore = baseResponse.length > truncatedOrders.length;\n return {\n meta: {\n hasMore,\n nextCursor: baseResponse[truncatedOrders.length]?.submissionIndex,\n },\n orders: truncatedOrders,\n };\n }\n\n async getPaginatedSubaccountSettlementEvents(\n params: GetIndexerSubaccountSettlementEventsParams,\n ): Promise<GetIndexerSubaccountSettlementEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n } = params;\n\n // Each settlement has a quote & perp balance change, so 2 events per settlement tx\n const limit = requestedLimit + 1;\n const baseResponse = await this.getEvents({\n startCursor,\n maxTimestampInclusive,\n eventTypes: ['settle_pnl'],\n limit: {\n type: 'txs',\n value: limit,\n },\n subaccount: { subaccountName, subaccountOwner },\n });\n\n const events = baseResponse\n .map((event): IndexerSettlementEvent | undefined => {\n if (event.state.market.productId === QUOTE_PRODUCT_ID) {\n return;\n }\n if (event.state.type !== ProductEngineType.PERP) {\n throw Error('Incorrect event state for settlement event');\n }\n\n return {\n timestamp: event.timestamp,\n submissionIndex: event.submissionIndex,\n snapshot: event.state,\n // Spot quote delta = -vQuote delta\n quoteDelta: event.state.preBalance.vQuoteBalance.minus(\n event.state.postBalance.vQuoteBalance,\n ),\n isolated: event.isolated,\n tx: event.tx,\n ...subaccountFromHex(event.subaccount),\n };\n })\n .filter((event): event is IndexerSettlementEvent => !!event);\n\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n async getPaginatedSubaccountLiquidationEvents(\n params: GetIndexerSubaccountLiquidationEventsParams,\n ): Promise<GetIndexerSubaccountLiquidationEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n } = params;\n\n // There is 1 event emitted per product, including quote\n // However, if the balance change is 0, then the liquidation did not touch the product\n // A tx operates on a given health group, so only a spot & its associated perp can be actually liquidated within a single tx\n // with an associated quote balance change\n const limit = requestedLimit + 1;\n const baseResponse = await this.getEvents({\n startCursor,\n maxTimestampInclusive,\n eventTypes: ['liquidate_subaccount'],\n limit: {\n type: 'txs',\n value: limit,\n },\n subaccount: { subaccountName, subaccountOwner },\n });\n\n // Now aggregate results by the submission index, use map to maintain insertion order\n const eventsBySubmissionIdx = new Map<\n string,\n Partial<IndexerLiquidationEvent>\n >();\n\n baseResponse.forEach((event) => {\n const mappedEvent = (() => {\n const existingEvent = eventsBySubmissionIdx.get(event.submissionIndex);\n if (existingEvent) {\n return existingEvent;\n }\n\n const newEvent: Partial<IndexerLiquidationEvent> = {\n perp: undefined,\n spot: undefined,\n quote: undefined,\n timestamp: event.timestamp,\n submissionIndex: event.submissionIndex,\n };\n\n return newEvent;\n })();\n\n // The original balance is the negated delta\n const balanceDelta = event.state.postBalance.amount.minus(\n event.state.preBalance.amount,\n );\n\n // Event without balance change - not part of this liq\n // However, we could have zero balance changes for the quote product if this was a partial liquidation\n if (\n balanceDelta.isZero() &&\n event.state.market.productId !== QUOTE_PRODUCT_ID\n ) {\n return;\n }\n\n if (event.state.type === ProductEngineType.PERP) {\n mappedEvent.perp = {\n amountLiquidated: balanceDelta.negated(),\n // This cast is safe because we're checking for event.state.type\n indexerEvent:\n event as IndexerEventWithTx<IndexerEventPerpStateSnapshot>,\n };\n } else if (event.state.market.productId === QUOTE_PRODUCT_ID) {\n mappedEvent.quote = {\n balanceDelta,\n indexerEvent:\n event as IndexerEventWithTx<IndexerEventSpotStateSnapshot>,\n };\n } else {\n mappedEvent.spot = {\n amountLiquidated: balanceDelta.negated(),\n indexerEvent:\n event as IndexerEventWithTx<IndexerEventSpotStateSnapshot>,\n };\n }\n\n eventsBySubmissionIdx.set(event.submissionIndex, mappedEvent);\n });\n\n // Force cast to get rid of the `Partial`\n const events = Array.from(\n eventsBySubmissionIdx.values(),\n ) as IndexerLiquidationEvent[];\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n /**\n * Get all interest funding payments for a given subaccount with the standard pagination response\n * This is a simple wrapper over the underlying `getInterestFundingPayments` function. Very little\n * additional processing is needed because the endpoint is well structured for pagination\n *\n * @param params\n */\n async getPaginatedSubaccountInterestFundingPayments(\n params: GetIndexerSubaccountInterestFundingPaymentsParams,\n ): Promise<GetIndexerPaginatedInterestFundingPaymentsResponse> {\n const {\n limit,\n productIds,\n startCursor,\n maxTimestampInclusive,\n subaccountName,\n subaccountOwner,\n } = params;\n const baseResponse = await this.getInterestFundingPayments({\n limit,\n productIds,\n startCursor,\n maxTimestampInclusive,\n subaccount: {\n subaccountName,\n subaccountOwner,\n },\n });\n\n return {\n ...baseResponse,\n meta: {\n hasMore: baseResponse.nextCursor != null,\n nextCursor: baseResponse.nextCursor ?? undefined,\n },\n };\n }\n\n /**\n * Paginated leaderboard query that paginates on rank number.\n *\n * @param params\n */\n async getPaginatedLeaderboard(\n params: GetIndexerPaginatedLeaderboardParams,\n ): Promise<GetIndexerPaginatedLeaderboardResponse> {\n const requestedLimit = params.limit;\n\n const baseResponse = await this.getLeaderboard({\n contestId: params.contestId,\n rankType: params.rankType,\n // Query for 1 more result for proper pagination\n limit: requestedLimit + 1,\n // Start cursor is the next rank number\n startCursor: params.startCursor,\n });\n\n // Next cursor is the rank number of the (requestedLimit+1)th item\n const nextCursor =\n params.rankType === 'pnl'\n ? baseResponse.participants[requestedLimit]?.pnlRank\n : baseResponse.participants[requestedLimit]?.roiRank;\n\n return {\n ...baseResponse,\n // Truncate the response to the requested limit\n participants: baseResponse.participants.slice(0, requestedLimit),\n meta: {\n hasMore: baseResponse.participants.length > requestedLimit,\n nextCursor:\n nextCursor !== undefined ? toIntegerString(nextCursor) : undefined,\n },\n };\n }\n\n /**\n * A util function to generate the standard pagination response for events\n * @param events\n * @param requestedLimit given by consumers of the SDK\n * @private\n */\n private getPaginationEventsResponse<T extends BaseIndexerPaginatedEvent>(\n events: T[],\n requestedLimit: number,\n ): PaginatedIndexerEventsResponse<T> {\n const truncatedEvents = events.slice(0, requestedLimit);\n const hasMore = events.length > truncatedEvents.length;\n\n return {\n events: truncatedEvents,\n meta: {\n hasMore,\n // We want the NEXT available cursor, so we use the first event after the truncation cutoff\n // If len(events) === len(truncatedEvents), there are no more entries and this is undefined\n nextCursor: events[truncatedEvents.length]?.submissionIndex,\n },\n };\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/IndexerClient.d.cts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { IndexerBaseClient } from './IndexerBaseClient.cjs';
|
|
2
|
-
import { GetIndexerSubaccountMatchEventParams, GetIndexerSubaccountMatchEventsResponse,
|
|
2
|
+
import { GetIndexerSubaccountMatchEventParams, GetIndexerSubaccountMatchEventsResponse, GetIndexerSubaccountNlpEventsParams, GetIndexerSubaccountNlpEventsResponse, GetIndexerSubaccountCollateralEventsParams, GetIndexerSubaccountCollateralEventsResponse, GetIndexerPaginatedOrdersParams, GetIndexerPaginatedOrdersResponse, GetIndexerSubaccountSettlementEventsParams, GetIndexerSubaccountSettlementEventsResponse, GetIndexerSubaccountLiquidationEventsParams, GetIndexerSubaccountLiquidationEventsResponse, GetIndexerSubaccountInterestFundingPaymentsParams, GetIndexerPaginatedInterestFundingPaymentsResponse, GetIndexerPaginatedLeaderboardParams, GetIndexerPaginatedLeaderboardResponse } from './types/paginatedEventsTypes.cjs';
|
|
3
3
|
import '@nadohq/contracts';
|
|
4
4
|
import 'axios';
|
|
5
5
|
import './types/clientTypes.cjs';
|
|
@@ -19,7 +19,7 @@ import './types/collateralEventType.cjs';
|
|
|
19
19
|
*/
|
|
20
20
|
declare class IndexerClient extends IndexerBaseClient {
|
|
21
21
|
getPaginatedSubaccountMatchEvents(params: GetIndexerSubaccountMatchEventParams): Promise<GetIndexerSubaccountMatchEventsResponse>;
|
|
22
|
-
|
|
22
|
+
getPaginatedSubaccountNlpEvents(params: GetIndexerSubaccountNlpEventsParams): Promise<GetIndexerSubaccountNlpEventsResponse>;
|
|
23
23
|
getPaginatedSubaccountCollateralEvents(params: GetIndexerSubaccountCollateralEventsParams): Promise<GetIndexerSubaccountCollateralEventsResponse>;
|
|
24
24
|
getPaginatedSubaccountOrders(params: GetIndexerPaginatedOrdersParams): Promise<GetIndexerPaginatedOrdersResponse>;
|
|
25
25
|
getPaginatedSubaccountSettlementEvents(params: GetIndexerSubaccountSettlementEventsParams): Promise<GetIndexerSubaccountSettlementEventsResponse>;
|
package/dist/IndexerClient.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { IndexerBaseClient } from './IndexerBaseClient.js';
|
|
2
|
-
import { GetIndexerSubaccountMatchEventParams, GetIndexerSubaccountMatchEventsResponse,
|
|
2
|
+
import { GetIndexerSubaccountMatchEventParams, GetIndexerSubaccountMatchEventsResponse, GetIndexerSubaccountNlpEventsParams, GetIndexerSubaccountNlpEventsResponse, GetIndexerSubaccountCollateralEventsParams, GetIndexerSubaccountCollateralEventsResponse, GetIndexerPaginatedOrdersParams, GetIndexerPaginatedOrdersResponse, GetIndexerSubaccountSettlementEventsParams, GetIndexerSubaccountSettlementEventsResponse, GetIndexerSubaccountLiquidationEventsParams, GetIndexerSubaccountLiquidationEventsResponse, GetIndexerSubaccountInterestFundingPaymentsParams, GetIndexerPaginatedInterestFundingPaymentsResponse, GetIndexerPaginatedLeaderboardParams, GetIndexerPaginatedLeaderboardResponse } from './types/paginatedEventsTypes.js';
|
|
3
3
|
import '@nadohq/contracts';
|
|
4
4
|
import 'axios';
|
|
5
5
|
import './types/clientTypes.js';
|
|
@@ -19,7 +19,7 @@ import './types/collateralEventType.js';
|
|
|
19
19
|
*/
|
|
20
20
|
declare class IndexerClient extends IndexerBaseClient {
|
|
21
21
|
getPaginatedSubaccountMatchEvents(params: GetIndexerSubaccountMatchEventParams): Promise<GetIndexerSubaccountMatchEventsResponse>;
|
|
22
|
-
|
|
22
|
+
getPaginatedSubaccountNlpEvents(params: GetIndexerSubaccountNlpEventsParams): Promise<GetIndexerSubaccountNlpEventsResponse>;
|
|
23
23
|
getPaginatedSubaccountCollateralEvents(params: GetIndexerSubaccountCollateralEventsParams): Promise<GetIndexerSubaccountCollateralEventsResponse>;
|
|
24
24
|
getPaginatedSubaccountOrders(params: GetIndexerPaginatedOrdersParams): Promise<GetIndexerPaginatedOrdersResponse>;
|
|
25
25
|
getPaginatedSubaccountSettlementEvents(params: GetIndexerSubaccountSettlementEventsParams): Promise<GetIndexerSubaccountSettlementEventsResponse>;
|
package/dist/IndexerClient.js
CHANGED
|
@@ -3,7 +3,7 @@ import {
|
|
|
3
3
|
ProductEngineType,
|
|
4
4
|
QUOTE_PRODUCT_ID,
|
|
5
5
|
subaccountFromHex,
|
|
6
|
-
|
|
6
|
+
NLP_PRODUCT_ID
|
|
7
7
|
} from "@nadohq/contracts";
|
|
8
8
|
import { toBigDecimal, toIntegerString } from "@nadohq/utils";
|
|
9
9
|
import { IndexerBaseClient } from "./IndexerBaseClient.js";
|
|
@@ -29,7 +29,7 @@ var IndexerClient = class extends IndexerBaseClient {
|
|
|
29
29
|
});
|
|
30
30
|
return this.getPaginationEventsResponse(events, requestedLimit);
|
|
31
31
|
}
|
|
32
|
-
async
|
|
32
|
+
async getPaginatedSubaccountNlpEvents(params) {
|
|
33
33
|
const {
|
|
34
34
|
startCursor,
|
|
35
35
|
maxTimestampInclusive,
|
|
@@ -41,7 +41,7 @@ var IndexerClient = class extends IndexerBaseClient {
|
|
|
41
41
|
const baseResponse = await this.getEvents({
|
|
42
42
|
startCursor,
|
|
43
43
|
maxTimestampInclusive,
|
|
44
|
-
eventTypes: ["
|
|
44
|
+
eventTypes: ["mint_nlp", "burn_nlp"],
|
|
45
45
|
limit: {
|
|
46
46
|
type: "txs",
|
|
47
47
|
value: limit
|
|
@@ -56,7 +56,7 @@ var IndexerClient = class extends IndexerBaseClient {
|
|
|
56
56
|
return existingEvent;
|
|
57
57
|
}
|
|
58
58
|
const newEvent = {
|
|
59
|
-
|
|
59
|
+
nlpDelta: toBigDecimal(0),
|
|
60
60
|
primaryQuoteDelta: toBigDecimal(0),
|
|
61
61
|
timestamp: event.timestamp,
|
|
62
62
|
submissionIndex: event.submissionIndex,
|
|
@@ -72,10 +72,10 @@ var IndexerClient = class extends IndexerBaseClient {
|
|
|
72
72
|
const productId = event.state.market.productId;
|
|
73
73
|
if (productId === QUOTE_PRODUCT_ID) {
|
|
74
74
|
mappedEvent.primaryQuoteDelta = balanceDelta;
|
|
75
|
-
} else if (productId ===
|
|
76
|
-
mappedEvent.
|
|
75
|
+
} else if (productId === NLP_PRODUCT_ID) {
|
|
76
|
+
mappedEvent.nlpDelta = balanceDelta;
|
|
77
77
|
} else {
|
|
78
|
-
throw Error(`Invalid product ID for
|
|
78
|
+
throw Error(`Invalid product ID for NLP event ${productId}`);
|
|
79
79
|
}
|
|
80
80
|
});
|
|
81
81
|
const events = Array.from(eventsBySubmissionIdx.values());
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/IndexerClient.ts"],"sourcesContent":["import {\n ProductEngineType,\n QUOTE_PRODUCT_ID,\n subaccountFromHex,\n VLP_PRODUCT_ID,\n} from '@nadohq/contracts';\nimport { toBigDecimal, toIntegerString } from '@nadohq/utils';\n\nimport { IndexerBaseClient } from './IndexerBaseClient';\nimport {\n BaseIndexerPaginatedEvent,\n CollateralEventType,\n GetIndexerPaginatedInterestFundingPaymentsResponse,\n GetIndexerPaginatedLeaderboardParams,\n GetIndexerPaginatedLeaderboardResponse,\n GetIndexerPaginatedOrdersParams,\n GetIndexerPaginatedOrdersResponse,\n GetIndexerSubaccountCollateralEventsParams,\n GetIndexerSubaccountCollateralEventsResponse,\n GetIndexerSubaccountInterestFundingPaymentsParams,\n GetIndexerSubaccountLiquidationEventsParams,\n GetIndexerSubaccountLiquidationEventsResponse,\n GetIndexerSubaccountMatchEventParams,\n GetIndexerSubaccountMatchEventsResponse,\n GetIndexerSubaccountSettlementEventsParams,\n GetIndexerSubaccountSettlementEventsResponse,\n GetIndexerSubaccountVlpEventsParams,\n GetIndexerSubaccountVlpEventsResponse,\n IndexerCollateralEvent,\n IndexerEventPerpStateSnapshot,\n IndexerEventSpotStateSnapshot,\n IndexerEventWithTx,\n IndexerLiquidationEvent,\n IndexerSettlementEvent,\n IndexerVlpEvent,\n PaginatedIndexerEventsResponse,\n} from './types';\n\n/**\n * Indexer client providing paginated queries for historical data from the Nado indexer service\n */\nexport class IndexerClient extends IndexerBaseClient {\n async getPaginatedSubaccountMatchEvents(\n params: GetIndexerSubaccountMatchEventParams,\n ): Promise<GetIndexerSubaccountMatchEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n isolated,\n productIds,\n } = params;\n\n const limit = requestedLimit + 1;\n const events = await this.getMatchEvents({\n startCursor,\n maxTimestampInclusive,\n limit,\n subaccount: { subaccountName, subaccountOwner },\n productIds,\n isolated,\n });\n\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n async getPaginatedSubaccountVlpEvents(\n params: GetIndexerSubaccountVlpEventsParams,\n ): Promise<GetIndexerSubaccountVlpEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n } = params;\n\n // There are 2 events per mint/burn for spot - one associated with the VLP product & the other with the primary quote\n const limit = requestedLimit + 1;\n const baseResponse = await this.getEvents({\n startCursor,\n maxTimestampInclusive,\n eventTypes: ['mint_vlp', 'burn_vlp'],\n limit: {\n type: 'txs',\n value: limit,\n },\n subaccount: { subaccountName, subaccountOwner },\n });\n\n // Now aggregate results by the submission index, use map to maintain insertion order\n const eventsBySubmissionIdx = new Map<string, IndexerVlpEvent>();\n\n baseResponse.forEach((event) => {\n const mappedEvent = (() => {\n const existingEvent = eventsBySubmissionIdx.get(event.submissionIndex);\n if (existingEvent) {\n return existingEvent;\n }\n\n const newEvent: IndexerVlpEvent = {\n vlpDelta: toBigDecimal(0),\n primaryQuoteDelta: toBigDecimal(0),\n timestamp: event.timestamp,\n submissionIndex: event.submissionIndex,\n tx: event.tx,\n ...subaccountFromHex(event.subaccount),\n };\n eventsBySubmissionIdx.set(event.submissionIndex, newEvent);\n\n return newEvent;\n })();\n\n const balanceDelta = event.state.postBalance.amount.minus(\n event.state.preBalance.amount,\n );\n\n const productId = event.state.market.productId;\n if (productId === QUOTE_PRODUCT_ID) {\n mappedEvent.primaryQuoteDelta = balanceDelta;\n } else if (productId === VLP_PRODUCT_ID) {\n mappedEvent.vlpDelta = balanceDelta;\n } else {\n throw Error(`Invalid product ID for VLP event ${productId}`);\n }\n });\n\n // Force cast to get rid of the `Partial`\n const events = Array.from(eventsBySubmissionIdx.values());\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n async getPaginatedSubaccountCollateralEvents(\n params: GetIndexerSubaccountCollateralEventsParams,\n ): Promise<GetIndexerSubaccountCollateralEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n eventTypes,\n isolated,\n } = params;\n\n const limit = requestedLimit + 1;\n const baseResponse = await this.getEvents({\n startCursor,\n maxTimestampInclusive,\n eventTypes: eventTypes ?? [\n 'deposit_collateral',\n 'withdraw_collateral',\n 'transfer_quote',\n ],\n limit: {\n type: 'txs',\n value: limit,\n },\n subaccount: { subaccountName, subaccountOwner },\n isolated,\n });\n\n const events = baseResponse.map((event): IndexerCollateralEvent => {\n if (event.state.type !== ProductEngineType.SPOT) {\n throw Error('Incorrect event state for collateral event');\n }\n\n return {\n timestamp: event.timestamp,\n // This cast is safe as the query param restricts to collateral events\n eventType: event.eventType as CollateralEventType,\n submissionIndex: event.submissionIndex,\n snapshot: event.state,\n amount: event.state.postBalance.amount.minus(\n event.state.preBalance.amount,\n ),\n newAmount: event.state.postBalance.amount,\n tx: event.tx,\n ...subaccountFromHex(event.subaccount),\n };\n });\n\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n async getPaginatedSubaccountOrders(\n params: GetIndexerPaginatedOrdersParams,\n ): Promise<GetIndexerPaginatedOrdersResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n productIds,\n isolated,\n } = params;\n\n const limit = requestedLimit + 1;\n const baseResponse = await this.getOrders({\n startCursor,\n maxTimestampInclusive,\n subaccount: { subaccountName, subaccountOwner },\n limit,\n productIds,\n isolated,\n });\n\n // Same pagination meta logic as events, but duplicate for now as this return type is slightly different\n const truncatedOrders = baseResponse.slice(0, requestedLimit);\n const hasMore = baseResponse.length > truncatedOrders.length;\n return {\n meta: {\n hasMore,\n nextCursor: baseResponse[truncatedOrders.length]?.submissionIndex,\n },\n orders: truncatedOrders,\n };\n }\n\n async getPaginatedSubaccountSettlementEvents(\n params: GetIndexerSubaccountSettlementEventsParams,\n ): Promise<GetIndexerSubaccountSettlementEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n } = params;\n\n // Each settlement has a quote & perp balance change, so 2 events per settlement tx\n const limit = requestedLimit + 1;\n const baseResponse = await this.getEvents({\n startCursor,\n maxTimestampInclusive,\n eventTypes: ['settle_pnl'],\n limit: {\n type: 'txs',\n value: limit,\n },\n subaccount: { subaccountName, subaccountOwner },\n });\n\n const events = baseResponse\n .map((event): IndexerSettlementEvent | undefined => {\n if (event.state.market.productId === QUOTE_PRODUCT_ID) {\n return;\n }\n if (event.state.type !== ProductEngineType.PERP) {\n throw Error('Incorrect event state for settlement event');\n }\n\n return {\n timestamp: event.timestamp,\n submissionIndex: event.submissionIndex,\n snapshot: event.state,\n // Spot quote delta = -vQuote delta\n quoteDelta: event.state.preBalance.vQuoteBalance.minus(\n event.state.postBalance.vQuoteBalance,\n ),\n isolated: event.isolated,\n tx: event.tx,\n ...subaccountFromHex(event.subaccount),\n };\n })\n .filter((event): event is IndexerSettlementEvent => !!event);\n\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n async getPaginatedSubaccountLiquidationEvents(\n params: GetIndexerSubaccountLiquidationEventsParams,\n ): Promise<GetIndexerSubaccountLiquidationEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n } = params;\n\n // There is 1 event emitted per product, including quote\n // However, if the balance change is 0, then the liquidation did not touch the product\n // A tx operates on a given health group, so only a spot & its associated perp can be actually liquidated within a single tx\n // with an associated quote balance change\n const limit = requestedLimit + 1;\n const baseResponse = await this.getEvents({\n startCursor,\n maxTimestampInclusive,\n eventTypes: ['liquidate_subaccount'],\n limit: {\n type: 'txs',\n value: limit,\n },\n subaccount: { subaccountName, subaccountOwner },\n });\n\n // Now aggregate results by the submission index, use map to maintain insertion order\n const eventsBySubmissionIdx = new Map<\n string,\n Partial<IndexerLiquidationEvent>\n >();\n\n baseResponse.forEach((event) => {\n const mappedEvent = (() => {\n const existingEvent = eventsBySubmissionIdx.get(event.submissionIndex);\n if (existingEvent) {\n return existingEvent;\n }\n\n const newEvent: Partial<IndexerLiquidationEvent> = {\n perp: undefined,\n spot: undefined,\n quote: undefined,\n timestamp: event.timestamp,\n submissionIndex: event.submissionIndex,\n };\n\n return newEvent;\n })();\n\n // The original balance is the negated delta\n const balanceDelta = event.state.postBalance.amount.minus(\n event.state.preBalance.amount,\n );\n\n // Event without balance change - not part of this liq\n // However, we could have zero balance changes for the quote product if this was a partial liquidation\n if (\n balanceDelta.isZero() &&\n event.state.market.productId !== QUOTE_PRODUCT_ID\n ) {\n return;\n }\n\n if (event.state.type === ProductEngineType.PERP) {\n mappedEvent.perp = {\n amountLiquidated: balanceDelta.negated(),\n // This cast is safe because we're checking for event.state.type\n indexerEvent:\n event as IndexerEventWithTx<IndexerEventPerpStateSnapshot>,\n };\n } else if (event.state.market.productId === QUOTE_PRODUCT_ID) {\n mappedEvent.quote = {\n balanceDelta,\n indexerEvent:\n event as IndexerEventWithTx<IndexerEventSpotStateSnapshot>,\n };\n } else {\n mappedEvent.spot = {\n amountLiquidated: balanceDelta.negated(),\n indexerEvent:\n event as IndexerEventWithTx<IndexerEventSpotStateSnapshot>,\n };\n }\n\n eventsBySubmissionIdx.set(event.submissionIndex, mappedEvent);\n });\n\n // Force cast to get rid of the `Partial`\n const events = Array.from(\n eventsBySubmissionIdx.values(),\n ) as IndexerLiquidationEvent[];\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n /**\n * Get all interest funding payments for a given subaccount with the standard pagination response\n * This is a simple wrapper over the underlying `getInterestFundingPayments` function. Very little\n * additional processing is needed because the endpoint is well structured for pagination\n *\n * @param params\n */\n async getPaginatedSubaccountInterestFundingPayments(\n params: GetIndexerSubaccountInterestFundingPaymentsParams,\n ): Promise<GetIndexerPaginatedInterestFundingPaymentsResponse> {\n const {\n limit,\n productIds,\n startCursor,\n maxTimestampInclusive,\n subaccountName,\n subaccountOwner,\n } = params;\n const baseResponse = await this.getInterestFundingPayments({\n limit,\n productIds,\n startCursor,\n maxTimestampInclusive,\n subaccount: {\n subaccountName,\n subaccountOwner,\n },\n });\n\n return {\n ...baseResponse,\n meta: {\n hasMore: baseResponse.nextCursor != null,\n nextCursor: baseResponse.nextCursor ?? undefined,\n },\n };\n }\n\n /**\n * Paginated leaderboard query that paginates on rank number.\n *\n * @param params\n */\n async getPaginatedLeaderboard(\n params: GetIndexerPaginatedLeaderboardParams,\n ): Promise<GetIndexerPaginatedLeaderboardResponse> {\n const requestedLimit = params.limit;\n\n const baseResponse = await this.getLeaderboard({\n contestId: params.contestId,\n rankType: params.rankType,\n // Query for 1 more result for proper pagination\n limit: requestedLimit + 1,\n // Start cursor is the next rank number\n startCursor: params.startCursor,\n });\n\n // Next cursor is the rank number of the (requestedLimit+1)th item\n const nextCursor =\n params.rankType === 'pnl'\n ? baseResponse.participants[requestedLimit]?.pnlRank\n : baseResponse.participants[requestedLimit]?.roiRank;\n\n return {\n ...baseResponse,\n // Truncate the response to the requested limit\n participants: baseResponse.participants.slice(0, requestedLimit),\n meta: {\n hasMore: baseResponse.participants.length > requestedLimit,\n nextCursor:\n nextCursor !== undefined ? toIntegerString(nextCursor) : undefined,\n },\n };\n }\n\n /**\n * A util function to generate the standard pagination response for events\n * @param events\n * @param requestedLimit given by consumers of the SDK\n * @private\n */\n private getPaginationEventsResponse<T extends BaseIndexerPaginatedEvent>(\n events: T[],\n requestedLimit: number,\n ): PaginatedIndexerEventsResponse<T> {\n const truncatedEvents = events.slice(0, requestedLimit);\n const hasMore = events.length > truncatedEvents.length;\n\n return {\n events: truncatedEvents,\n meta: {\n hasMore,\n // We want the NEXT available cursor, so we use the first event after the truncation cutoff\n // If len(events) === len(truncatedEvents), there are no more entries and this is undefined\n nextCursor: events[truncatedEvents.length]?.submissionIndex,\n },\n };\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/IndexerClient.ts"],"sourcesContent":["import {\n ProductEngineType,\n QUOTE_PRODUCT_ID,\n subaccountFromHex,\n NLP_PRODUCT_ID,\n} from '@nadohq/contracts';\nimport { toBigDecimal, toIntegerString } from '@nadohq/utils';\n\nimport { IndexerBaseClient } from './IndexerBaseClient';\nimport {\n BaseIndexerPaginatedEvent,\n CollateralEventType,\n GetIndexerPaginatedInterestFundingPaymentsResponse,\n GetIndexerPaginatedLeaderboardParams,\n GetIndexerPaginatedLeaderboardResponse,\n GetIndexerPaginatedOrdersParams,\n GetIndexerPaginatedOrdersResponse,\n GetIndexerSubaccountCollateralEventsParams,\n GetIndexerSubaccountCollateralEventsResponse,\n GetIndexerSubaccountInterestFundingPaymentsParams,\n GetIndexerSubaccountLiquidationEventsParams,\n GetIndexerSubaccountLiquidationEventsResponse,\n GetIndexerSubaccountMatchEventParams,\n GetIndexerSubaccountMatchEventsResponse,\n GetIndexerSubaccountSettlementEventsParams,\n GetIndexerSubaccountSettlementEventsResponse,\n GetIndexerSubaccountNlpEventsParams,\n GetIndexerSubaccountNlpEventsResponse,\n IndexerCollateralEvent,\n IndexerEventPerpStateSnapshot,\n IndexerEventSpotStateSnapshot,\n IndexerEventWithTx,\n IndexerLiquidationEvent,\n IndexerSettlementEvent,\n IndexerNlpEvent,\n PaginatedIndexerEventsResponse,\n} from './types';\n\n/**\n * Indexer client providing paginated queries for historical data from the Nado indexer service\n */\nexport class IndexerClient extends IndexerBaseClient {\n async getPaginatedSubaccountMatchEvents(\n params: GetIndexerSubaccountMatchEventParams,\n ): Promise<GetIndexerSubaccountMatchEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n isolated,\n productIds,\n } = params;\n\n const limit = requestedLimit + 1;\n const events = await this.getMatchEvents({\n startCursor,\n maxTimestampInclusive,\n limit,\n subaccount: { subaccountName, subaccountOwner },\n productIds,\n isolated,\n });\n\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n async getPaginatedSubaccountNlpEvents(\n params: GetIndexerSubaccountNlpEventsParams,\n ): Promise<GetIndexerSubaccountNlpEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n } = params;\n\n // There are 2 events per mint/burn for spot - one associated with the NLP product & the other with the primary quote\n const limit = requestedLimit + 1;\n const baseResponse = await this.getEvents({\n startCursor,\n maxTimestampInclusive,\n eventTypes: ['mint_nlp', 'burn_nlp'],\n limit: {\n type: 'txs',\n value: limit,\n },\n subaccount: { subaccountName, subaccountOwner },\n });\n\n // Now aggregate results by the submission index, use map to maintain insertion order\n const eventsBySubmissionIdx = new Map<string, IndexerNlpEvent>();\n\n baseResponse.forEach((event) => {\n const mappedEvent = (() => {\n const existingEvent = eventsBySubmissionIdx.get(event.submissionIndex);\n if (existingEvent) {\n return existingEvent;\n }\n\n const newEvent: IndexerNlpEvent = {\n nlpDelta: toBigDecimal(0),\n primaryQuoteDelta: toBigDecimal(0),\n timestamp: event.timestamp,\n submissionIndex: event.submissionIndex,\n tx: event.tx,\n ...subaccountFromHex(event.subaccount),\n };\n eventsBySubmissionIdx.set(event.submissionIndex, newEvent);\n\n return newEvent;\n })();\n\n const balanceDelta = event.state.postBalance.amount.minus(\n event.state.preBalance.amount,\n );\n\n const productId = event.state.market.productId;\n if (productId === QUOTE_PRODUCT_ID) {\n mappedEvent.primaryQuoteDelta = balanceDelta;\n } else if (productId === NLP_PRODUCT_ID) {\n mappedEvent.nlpDelta = balanceDelta;\n } else {\n throw Error(`Invalid product ID for NLP event ${productId}`);\n }\n });\n\n // Force cast to get rid of the `Partial`\n const events = Array.from(eventsBySubmissionIdx.values());\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n async getPaginatedSubaccountCollateralEvents(\n params: GetIndexerSubaccountCollateralEventsParams,\n ): Promise<GetIndexerSubaccountCollateralEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n eventTypes,\n isolated,\n } = params;\n\n const limit = requestedLimit + 1;\n const baseResponse = await this.getEvents({\n startCursor,\n maxTimestampInclusive,\n eventTypes: eventTypes ?? [\n 'deposit_collateral',\n 'withdraw_collateral',\n 'transfer_quote',\n ],\n limit: {\n type: 'txs',\n value: limit,\n },\n subaccount: { subaccountName, subaccountOwner },\n isolated,\n });\n\n const events = baseResponse.map((event): IndexerCollateralEvent => {\n if (event.state.type !== ProductEngineType.SPOT) {\n throw Error('Incorrect event state for collateral event');\n }\n\n return {\n timestamp: event.timestamp,\n // This cast is safe as the query param restricts to collateral events\n eventType: event.eventType as CollateralEventType,\n submissionIndex: event.submissionIndex,\n snapshot: event.state,\n amount: event.state.postBalance.amount.minus(\n event.state.preBalance.amount,\n ),\n newAmount: event.state.postBalance.amount,\n tx: event.tx,\n ...subaccountFromHex(event.subaccount),\n };\n });\n\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n async getPaginatedSubaccountOrders(\n params: GetIndexerPaginatedOrdersParams,\n ): Promise<GetIndexerPaginatedOrdersResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n productIds,\n isolated,\n } = params;\n\n const limit = requestedLimit + 1;\n const baseResponse = await this.getOrders({\n startCursor,\n maxTimestampInclusive,\n subaccount: { subaccountName, subaccountOwner },\n limit,\n productIds,\n isolated,\n });\n\n // Same pagination meta logic as events, but duplicate for now as this return type is slightly different\n const truncatedOrders = baseResponse.slice(0, requestedLimit);\n const hasMore = baseResponse.length > truncatedOrders.length;\n return {\n meta: {\n hasMore,\n nextCursor: baseResponse[truncatedOrders.length]?.submissionIndex,\n },\n orders: truncatedOrders,\n };\n }\n\n async getPaginatedSubaccountSettlementEvents(\n params: GetIndexerSubaccountSettlementEventsParams,\n ): Promise<GetIndexerSubaccountSettlementEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n } = params;\n\n // Each settlement has a quote & perp balance change, so 2 events per settlement tx\n const limit = requestedLimit + 1;\n const baseResponse = await this.getEvents({\n startCursor,\n maxTimestampInclusive,\n eventTypes: ['settle_pnl'],\n limit: {\n type: 'txs',\n value: limit,\n },\n subaccount: { subaccountName, subaccountOwner },\n });\n\n const events = baseResponse\n .map((event): IndexerSettlementEvent | undefined => {\n if (event.state.market.productId === QUOTE_PRODUCT_ID) {\n return;\n }\n if (event.state.type !== ProductEngineType.PERP) {\n throw Error('Incorrect event state for settlement event');\n }\n\n return {\n timestamp: event.timestamp,\n submissionIndex: event.submissionIndex,\n snapshot: event.state,\n // Spot quote delta = -vQuote delta\n quoteDelta: event.state.preBalance.vQuoteBalance.minus(\n event.state.postBalance.vQuoteBalance,\n ),\n isolated: event.isolated,\n tx: event.tx,\n ...subaccountFromHex(event.subaccount),\n };\n })\n .filter((event): event is IndexerSettlementEvent => !!event);\n\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n async getPaginatedSubaccountLiquidationEvents(\n params: GetIndexerSubaccountLiquidationEventsParams,\n ): Promise<GetIndexerSubaccountLiquidationEventsResponse> {\n const {\n startCursor,\n maxTimestampInclusive,\n limit: requestedLimit,\n subaccountName,\n subaccountOwner,\n } = params;\n\n // There is 1 event emitted per product, including quote\n // However, if the balance change is 0, then the liquidation did not touch the product\n // A tx operates on a given health group, so only a spot & its associated perp can be actually liquidated within a single tx\n // with an associated quote balance change\n const limit = requestedLimit + 1;\n const baseResponse = await this.getEvents({\n startCursor,\n maxTimestampInclusive,\n eventTypes: ['liquidate_subaccount'],\n limit: {\n type: 'txs',\n value: limit,\n },\n subaccount: { subaccountName, subaccountOwner },\n });\n\n // Now aggregate results by the submission index, use map to maintain insertion order\n const eventsBySubmissionIdx = new Map<\n string,\n Partial<IndexerLiquidationEvent>\n >();\n\n baseResponse.forEach((event) => {\n const mappedEvent = (() => {\n const existingEvent = eventsBySubmissionIdx.get(event.submissionIndex);\n if (existingEvent) {\n return existingEvent;\n }\n\n const newEvent: Partial<IndexerLiquidationEvent> = {\n perp: undefined,\n spot: undefined,\n quote: undefined,\n timestamp: event.timestamp,\n submissionIndex: event.submissionIndex,\n };\n\n return newEvent;\n })();\n\n // The original balance is the negated delta\n const balanceDelta = event.state.postBalance.amount.minus(\n event.state.preBalance.amount,\n );\n\n // Event without balance change - not part of this liq\n // However, we could have zero balance changes for the quote product if this was a partial liquidation\n if (\n balanceDelta.isZero() &&\n event.state.market.productId !== QUOTE_PRODUCT_ID\n ) {\n return;\n }\n\n if (event.state.type === ProductEngineType.PERP) {\n mappedEvent.perp = {\n amountLiquidated: balanceDelta.negated(),\n // This cast is safe because we're checking for event.state.type\n indexerEvent:\n event as IndexerEventWithTx<IndexerEventPerpStateSnapshot>,\n };\n } else if (event.state.market.productId === QUOTE_PRODUCT_ID) {\n mappedEvent.quote = {\n balanceDelta,\n indexerEvent:\n event as IndexerEventWithTx<IndexerEventSpotStateSnapshot>,\n };\n } else {\n mappedEvent.spot = {\n amountLiquidated: balanceDelta.negated(),\n indexerEvent:\n event as IndexerEventWithTx<IndexerEventSpotStateSnapshot>,\n };\n }\n\n eventsBySubmissionIdx.set(event.submissionIndex, mappedEvent);\n });\n\n // Force cast to get rid of the `Partial`\n const events = Array.from(\n eventsBySubmissionIdx.values(),\n ) as IndexerLiquidationEvent[];\n return this.getPaginationEventsResponse(events, requestedLimit);\n }\n\n /**\n * Get all interest funding payments for a given subaccount with the standard pagination response\n * This is a simple wrapper over the underlying `getInterestFundingPayments` function. Very little\n * additional processing is needed because the endpoint is well structured for pagination\n *\n * @param params\n */\n async getPaginatedSubaccountInterestFundingPayments(\n params: GetIndexerSubaccountInterestFundingPaymentsParams,\n ): Promise<GetIndexerPaginatedInterestFundingPaymentsResponse> {\n const {\n limit,\n productIds,\n startCursor,\n maxTimestampInclusive,\n subaccountName,\n subaccountOwner,\n } = params;\n const baseResponse = await this.getInterestFundingPayments({\n limit,\n productIds,\n startCursor,\n maxTimestampInclusive,\n subaccount: {\n subaccountName,\n subaccountOwner,\n },\n });\n\n return {\n ...baseResponse,\n meta: {\n hasMore: baseResponse.nextCursor != null,\n nextCursor: baseResponse.nextCursor ?? undefined,\n },\n };\n }\n\n /**\n * Paginated leaderboard query that paginates on rank number.\n *\n * @param params\n */\n async getPaginatedLeaderboard(\n params: GetIndexerPaginatedLeaderboardParams,\n ): Promise<GetIndexerPaginatedLeaderboardResponse> {\n const requestedLimit = params.limit;\n\n const baseResponse = await this.getLeaderboard({\n contestId: params.contestId,\n rankType: params.rankType,\n // Query for 1 more result for proper pagination\n limit: requestedLimit + 1,\n // Start cursor is the next rank number\n startCursor: params.startCursor,\n });\n\n // Next cursor is the rank number of the (requestedLimit+1)th item\n const nextCursor =\n params.rankType === 'pnl'\n ? baseResponse.participants[requestedLimit]?.pnlRank\n : baseResponse.participants[requestedLimit]?.roiRank;\n\n return {\n ...baseResponse,\n // Truncate the response to the requested limit\n participants: baseResponse.participants.slice(0, requestedLimit),\n meta: {\n hasMore: baseResponse.participants.length > requestedLimit,\n nextCursor:\n nextCursor !== undefined ? toIntegerString(nextCursor) : undefined,\n },\n };\n }\n\n /**\n * A util function to generate the standard pagination response for events\n * @param events\n * @param requestedLimit given by consumers of the SDK\n * @private\n */\n private getPaginationEventsResponse<T extends BaseIndexerPaginatedEvent>(\n events: T[],\n requestedLimit: number,\n ): PaginatedIndexerEventsResponse<T> {\n const truncatedEvents = events.slice(0, requestedLimit);\n const hasMore = events.length > truncatedEvents.length;\n\n return {\n events: truncatedEvents,\n meta: {\n hasMore,\n // We want the NEXT available cursor, so we use the first event after the truncation cutoff\n // If len(events) === len(truncatedEvents), there are no more entries and this is undefined\n nextCursor: events[truncatedEvents.length]?.submissionIndex,\n },\n };\n }\n}\n"],"mappings":";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc,uBAAuB;AAE9C,SAAS,yBAAyB;AAiC3B,IAAM,gBAAN,cAA4B,kBAAkB;AAAA,EACnD,MAAM,kCACJ,QACkD;AAClD,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AAEJ,UAAM,QAAQ,iBAAiB;AAC/B,UAAM,SAAS,MAAM,KAAK,eAAe;AAAA,MACvC;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY,EAAE,gBAAgB,gBAAgB;AAAA,MAC9C;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO,KAAK,4BAA4B,QAAQ,cAAc;AAAA,EAChE;AAAA,EAEA,MAAM,gCACJ,QACgD;AAChD,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACF,IAAI;AAGJ,UAAM,QAAQ,iBAAiB;AAC/B,UAAM,eAAe,MAAM,KAAK,UAAU;AAAA,MACxC;AAAA,MACA;AAAA,MACA,YAAY,CAAC,YAAY,UAAU;AAAA,MACnC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA,YAAY,EAAE,gBAAgB,gBAAgB;AAAA,IAChD,CAAC;AAGD,UAAM,wBAAwB,oBAAI,IAA6B;AAE/D,iBAAa,QAAQ,CAAC,UAAU;AAC9B,YAAM,eAAe,MAAM;AACzB,cAAM,gBAAgB,sBAAsB,IAAI,MAAM,eAAe;AACrE,YAAI,eAAe;AACjB,iBAAO;AAAA,QACT;AAEA,cAAM,WAA4B;AAAA,UAChC,UAAU,aAAa,CAAC;AAAA,UACxB,mBAAmB,aAAa,CAAC;AAAA,UACjC,WAAW,MAAM;AAAA,UACjB,iBAAiB,MAAM;AAAA,UACvB,IAAI,MAAM;AAAA,UACV,GAAG,kBAAkB,MAAM,UAAU;AAAA,QACvC;AACA,8BAAsB,IAAI,MAAM,iBAAiB,QAAQ;AAEzD,eAAO;AAAA,MACT,GAAG;AAEH,YAAM,eAAe,MAAM,MAAM,YAAY,OAAO;AAAA,QAClD,MAAM,MAAM,WAAW;AAAA,MACzB;AAEA,YAAM,YAAY,MAAM,MAAM,OAAO;AACrC,UAAI,cAAc,kBAAkB;AAClC,oBAAY,oBAAoB;AAAA,MAClC,WAAW,cAAc,gBAAgB;AACvC,oBAAY,WAAW;AAAA,MACzB,OAAO;AACL,cAAM,MAAM,oCAAoC,SAAS,EAAE;AAAA,MAC7D;AAAA,IACF,CAAC;AAGD,UAAM,SAAS,MAAM,KAAK,sBAAsB,OAAO,CAAC;AACxD,WAAO,KAAK,4BAA4B,QAAQ,cAAc;AAAA,EAChE;AAAA,EAEA,MAAM,uCACJ,QACuD;AACvD,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AAEJ,UAAM,QAAQ,iBAAiB;AAC/B,UAAM,eAAe,MAAM,KAAK,UAAU;AAAA,MACxC;AAAA,MACA;AAAA,MACA,YAAY,cAAc;AAAA,QACxB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA,YAAY,EAAE,gBAAgB,gBAAgB;AAAA,MAC9C;AAAA,IACF,CAAC;AAED,UAAM,SAAS,aAAa,IAAI,CAAC,UAAkC;AACjE,UAAI,MAAM,MAAM,SAAS,kBAAkB,MAAM;AAC/C,cAAM,MAAM,4CAA4C;AAAA,MAC1D;AAEA,aAAO;AAAA,QACL,WAAW,MAAM;AAAA;AAAA,QAEjB,WAAW,MAAM;AAAA,QACjB,iBAAiB,MAAM;AAAA,QACvB,UAAU,MAAM;AAAA,QAChB,QAAQ,MAAM,MAAM,YAAY,OAAO;AAAA,UACrC,MAAM,MAAM,WAAW;AAAA,QACzB;AAAA,QACA,WAAW,MAAM,MAAM,YAAY;AAAA,QACnC,IAAI,MAAM;AAAA,QACV,GAAG,kBAAkB,MAAM,UAAU;AAAA,MACvC;AAAA,IACF,CAAC;AAED,WAAO,KAAK,4BAA4B,QAAQ,cAAc;AAAA,EAChE;AAAA,EAEA,MAAM,6BACJ,QAC4C;AAC5C,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AAEJ,UAAM,QAAQ,iBAAiB;AAC/B,UAAM,eAAe,MAAM,KAAK,UAAU;AAAA,MACxC;AAAA,MACA;AAAA,MACA,YAAY,EAAE,gBAAgB,gBAAgB;AAAA,MAC9C;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAGD,UAAM,kBAAkB,aAAa,MAAM,GAAG,cAAc;AAC5D,UAAM,UAAU,aAAa,SAAS,gBAAgB;AACtD,WAAO;AAAA,MACL,MAAM;AAAA,QACJ;AAAA,QACA,YAAY,aAAa,gBAAgB,MAAM,GAAG;AAAA,MACpD;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EAEA,MAAM,uCACJ,QACuD;AACvD,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACF,IAAI;AAGJ,UAAM,QAAQ,iBAAiB;AAC/B,UAAM,eAAe,MAAM,KAAK,UAAU;AAAA,MACxC;AAAA,MACA;AAAA,MACA,YAAY,CAAC,YAAY;AAAA,MACzB,OAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA,YAAY,EAAE,gBAAgB,gBAAgB;AAAA,IAChD,CAAC;AAED,UAAM,SAAS,aACZ,IAAI,CAAC,UAA8C;AAClD,UAAI,MAAM,MAAM,OAAO,cAAc,kBAAkB;AACrD;AAAA,MACF;AACA,UAAI,MAAM,MAAM,SAAS,kBAAkB,MAAM;AAC/C,cAAM,MAAM,4CAA4C;AAAA,MAC1D;AAEA,aAAO;AAAA,QACL,WAAW,MAAM;AAAA,QACjB,iBAAiB,MAAM;AAAA,QACvB,UAAU,MAAM;AAAA;AAAA,QAEhB,YAAY,MAAM,MAAM,WAAW,cAAc;AAAA,UAC/C,MAAM,MAAM,YAAY;AAAA,QAC1B;AAAA,QACA,UAAU,MAAM;AAAA,QAChB,IAAI,MAAM;AAAA,QACV,GAAG,kBAAkB,MAAM,UAAU;AAAA,MACvC;AAAA,IACF,CAAC,EACA,OAAO,CAAC,UAA2C,CAAC,CAAC,KAAK;AAE7D,WAAO,KAAK,4BAA4B,QAAQ,cAAc;AAAA,EAChE;AAAA,EAEA,MAAM,wCACJ,QACwD;AACxD,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,OAAO;AAAA,MACP;AAAA,MACA;AAAA,IACF,IAAI;AAMJ,UAAM,QAAQ,iBAAiB;AAC/B,UAAM,eAAe,MAAM,KAAK,UAAU;AAAA,MACxC;AAAA,MACA;AAAA,MACA,YAAY,CAAC,sBAAsB;AAAA,MACnC,OAAO;AAAA,QACL,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA,YAAY,EAAE,gBAAgB,gBAAgB;AAAA,IAChD,CAAC;AAGD,UAAM,wBAAwB,oBAAI,IAGhC;AAEF,iBAAa,QAAQ,CAAC,UAAU;AAC9B,YAAM,eAAe,MAAM;AACzB,cAAM,gBAAgB,sBAAsB,IAAI,MAAM,eAAe;AACrE,YAAI,eAAe;AACjB,iBAAO;AAAA,QACT;AAEA,cAAM,WAA6C;AAAA,UACjD,MAAM;AAAA,UACN,MAAM;AAAA,UACN,OAAO;AAAA,UACP,WAAW,MAAM;AAAA,UACjB,iBAAiB,MAAM;AAAA,QACzB;AAEA,eAAO;AAAA,MACT,GAAG;AAGH,YAAM,eAAe,MAAM,MAAM,YAAY,OAAO;AAAA,QAClD,MAAM,MAAM,WAAW;AAAA,MACzB;AAIA,UACE,aAAa,OAAO,KACpB,MAAM,MAAM,OAAO,cAAc,kBACjC;AACA;AAAA,MACF;AAEA,UAAI,MAAM,MAAM,SAAS,kBAAkB,MAAM;AAC/C,oBAAY,OAAO;AAAA,UACjB,kBAAkB,aAAa,QAAQ;AAAA;AAAA,UAEvC,cACE;AAAA,QACJ;AAAA,MACF,WAAW,MAAM,MAAM,OAAO,cAAc,kBAAkB;AAC5D,oBAAY,QAAQ;AAAA,UAClB;AAAA,UACA,cACE;AAAA,QACJ;AAAA,MACF,OAAO;AACL,oBAAY,OAAO;AAAA,UACjB,kBAAkB,aAAa,QAAQ;AAAA,UACvC,cACE;AAAA,QACJ;AAAA,MACF;AAEA,4BAAsB,IAAI,MAAM,iBAAiB,WAAW;AAAA,IAC9D,CAAC;AAGD,UAAM,SAAS,MAAM;AAAA,MACnB,sBAAsB,OAAO;AAAA,IAC/B;AACA,WAAO,KAAK,4BAA4B,QAAQ,cAAc;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,8CACJ,QAC6D;AAC7D,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AACJ,UAAM,eAAe,MAAM,KAAK,2BAA2B;AAAA,MACzD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,YAAY;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL,GAAG;AAAA,MACH,MAAM;AAAA,QACJ,SAAS,aAAa,cAAc;AAAA,QACpC,YAAY,aAAa,cAAc;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,wBACJ,QACiD;AACjD,UAAM,iBAAiB,OAAO;AAE9B,UAAM,eAAe,MAAM,KAAK,eAAe;AAAA,MAC7C,WAAW,OAAO;AAAA,MAClB,UAAU,OAAO;AAAA;AAAA,MAEjB,OAAO,iBAAiB;AAAA;AAAA,MAExB,aAAa,OAAO;AAAA,IACtB,CAAC;AAGD,UAAM,aACJ,OAAO,aAAa,QAChB,aAAa,aAAa,cAAc,GAAG,UAC3C,aAAa,aAAa,cAAc,GAAG;AAEjD,WAAO;AAAA,MACL,GAAG;AAAA;AAAA,MAEH,cAAc,aAAa,aAAa,MAAM,GAAG,cAAc;AAAA,MAC/D,MAAM;AAAA,QACJ,SAAS,aAAa,aAAa,SAAS;AAAA,QAC5C,YACE,eAAe,SAAY,gBAAgB,UAAU,IAAI;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,4BACN,QACA,gBACmC;AACnC,UAAM,kBAAkB,OAAO,MAAM,GAAG,cAAc;AACtD,UAAM,UAAU,OAAO,SAAS,gBAAgB;AAEhD,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,MAAM;AAAA,QACJ;AAAA;AAAA;AAAA,QAGA,YAAY,OAAO,gBAAgB,MAAM,GAAG;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
package/dist/dataMappers.cjs
CHANGED
|
@@ -30,12 +30,12 @@ __export(dataMappers_exports, {
|
|
|
30
30
|
mapIndexerMakerStatistics: () => mapIndexerMakerStatistics,
|
|
31
31
|
mapIndexerMarketSnapshot: () => mapIndexerMarketSnapshot,
|
|
32
32
|
mapIndexerMatchEventBalances: () => mapIndexerMatchEventBalances,
|
|
33
|
+
mapIndexerNlpSnapshot: () => mapIndexerNlpSnapshot,
|
|
33
34
|
mapIndexerOrder: () => mapIndexerOrder,
|
|
34
35
|
mapIndexerPerpPrices: () => mapIndexerPerpPrices,
|
|
35
36
|
mapIndexerProductPayment: () => mapIndexerProductPayment,
|
|
36
37
|
mapIndexerServerBalance: () => mapIndexerServerBalance,
|
|
37
38
|
mapIndexerServerProduct: () => mapIndexerServerProduct,
|
|
38
|
-
mapIndexerVlpSnapshot: () => mapIndexerVlpSnapshot,
|
|
39
39
|
mapSnapshotsIntervalToServerParams: () => mapSnapshotsIntervalToServerParams
|
|
40
40
|
});
|
|
41
41
|
module.exports = __toCommonJS(dataMappers_exports);
|
|
@@ -287,7 +287,7 @@ function mapIndexerMarketSnapshot(snapshot) {
|
|
|
287
287
|
)
|
|
288
288
|
};
|
|
289
289
|
}
|
|
290
|
-
function
|
|
290
|
+
function mapIndexerNlpSnapshot(snapshot) {
|
|
291
291
|
return {
|
|
292
292
|
submissionIndex: snapshot.submission_idx,
|
|
293
293
|
timestamp: (0, import_utils.toBigDecimal)(snapshot.timestamp),
|
|
@@ -313,12 +313,12 @@ function mapIndexerVlpSnapshot(snapshot) {
|
|
|
313
313
|
mapIndexerMakerStatistics,
|
|
314
314
|
mapIndexerMarketSnapshot,
|
|
315
315
|
mapIndexerMatchEventBalances,
|
|
316
|
+
mapIndexerNlpSnapshot,
|
|
316
317
|
mapIndexerOrder,
|
|
317
318
|
mapIndexerPerpPrices,
|
|
318
319
|
mapIndexerProductPayment,
|
|
319
320
|
mapIndexerServerBalance,
|
|
320
321
|
mapIndexerServerProduct,
|
|
321
|
-
mapIndexerVlpSnapshot,
|
|
322
322
|
mapSnapshotsIntervalToServerParams
|
|
323
323
|
});
|
|
324
324
|
//# sourceMappingURL=dataMappers.cjs.map
|
package/dist/dataMappers.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dataMappers.ts"],"sourcesContent":["import {\n getRecvTimeFromOrderNonce,\n Market,\n parseRawExpirationTimestamp,\n PerpMarket,\n ProductEngineType,\n SpotMarket,\n subaccountFromHex,\n} from '@nadohq/contracts';\nimport {\n mapEngineServerPerpProduct,\n mapEngineServerSpotProduct,\n} from '@nadohq/engine-client';\nimport {\n mapValues,\n removeDecimals,\n toBigDecimal,\n toIntegerString,\n} from '@nadohq/utils';\nimport {\n Candlestick,\n IndexerEvent,\n IndexerEventWithTx,\n IndexerFundingRate,\n IndexerLeaderboardContest,\n IndexerLeaderboardParticipant,\n IndexerLeaderboardRegistration,\n IndexerMaker,\n IndexerMarketSnapshot,\n IndexerMatchEventBalances,\n IndexerOrder,\n IndexerPerpBalance,\n IndexerPerpPrices,\n IndexerProductPayment,\n IndexerServerBalance,\n IndexerServerCandlestick,\n IndexerServerEvent,\n IndexerServerFundingRate,\n IndexerServerLeaderboardContest,\n IndexerServerLeaderboardPosition,\n IndexerServerLeaderboardRegistration,\n IndexerServerMaker,\n IndexerServerMarketSnapshot,\n IndexerServerMatchEventBalances,\n IndexerServerOrder,\n IndexerServerPerpPrices,\n IndexerServerProduct,\n IndexerServerProductPayment,\n IndexerServerSnapshotsInterval,\n IndexerServerTx,\n IndexerServerVlpSnapshot,\n IndexerSnapshotsIntervalParams,\n IndexerSpotBalance,\n IndexerVlpSnapshot,\n} from './types';\n\nexport function mapSnapshotsIntervalToServerParams(\n params: IndexerSnapshotsIntervalParams,\n): IndexerServerSnapshotsInterval {\n return {\n count: params.limit,\n max_time: params.maxTimeInclusive\n ? toIntegerString(params.maxTimeInclusive)\n : undefined,\n granularity: params.granularity,\n };\n}\n\nexport function mapIndexerServerProduct(product: IndexerServerProduct): Market {\n if ('spot' in product) {\n return mapEngineServerSpotProduct(product.spot);\n }\n return mapEngineServerPerpProduct(product.perp);\n}\n\nexport function mapIndexerServerBalance(\n balance: IndexerServerBalance,\n): IndexerSpotBalance | IndexerPerpBalance {\n if ('spot' in balance) {\n return {\n amount: toBigDecimal(balance.spot.balance.amount),\n productId: balance.spot.product_id,\n type: ProductEngineType.SPOT,\n };\n }\n return {\n amount: toBigDecimal(balance.perp.balance.amount),\n productId: balance.perp.product_id,\n type: ProductEngineType.PERP,\n vQuoteBalance: toBigDecimal(balance.perp.balance.v_quote_balance),\n };\n}\n\nexport function mapIndexerOrder(order: IndexerServerOrder): IndexerOrder {\n const expiration = toBigDecimal(order.expiration);\n const expirationEncodedData = parseRawExpirationTimestamp(order.expiration);\n return {\n amount: toBigDecimal(order.amount),\n digest: order.digest,\n isolated: order.isolated,\n rawExpiration: expiration,\n isReduceOnly: expirationEncodedData.reduceOnly,\n expiration: expirationEncodedData.expirationTime,\n orderType: expirationEncodedData.type,\n nonce: toBigDecimal(order.nonce),\n recvTimeSeconds: getRecvTimeFromOrderNonce(order.nonce) / 1000,\n price: removeDecimals(order.price_x18),\n productId: order.product_id,\n subaccount: order.subaccount,\n submissionIndex: order.submission_idx,\n baseFilled: toBigDecimal(order.base_filled),\n quoteFilled: toBigDecimal(order.quote_filled),\n totalFee: toBigDecimal(order.fee),\n };\n}\n\nexport function mapIndexerEvent(event: IndexerServerEvent): IndexerEvent {\n const eventState: IndexerEvent['state'] = (() => {\n // Assume backend data is consistent\n if ('spot' in event.pre_balance) {\n return {\n type: ProductEngineType.SPOT,\n market: mapIndexerServerProduct(event.product) as SpotMarket,\n preBalance: mapIndexerServerBalance(\n event.pre_balance,\n ) as IndexerSpotBalance,\n postBalance: mapIndexerServerBalance(\n event.post_balance,\n ) as IndexerSpotBalance,\n };\n }\n return {\n type: ProductEngineType.PERP,\n market: mapIndexerServerProduct(event.product) as PerpMarket,\n preBalance: mapIndexerServerBalance(\n event.pre_balance,\n ) as IndexerPerpBalance,\n postBalance: mapIndexerServerBalance(\n event.post_balance,\n ) as IndexerPerpBalance,\n };\n })();\n\n return {\n eventType: event.event_type,\n productId: event.product_id,\n isolated: event.isolated,\n isolatedProductId: event.isolated_product_id,\n state: eventState,\n subaccount: event.subaccount,\n submissionIndex: event.submission_idx,\n trackedVars: {\n netEntryCumulative: toBigDecimal(event.net_entry_cumulative),\n netEntryUnrealized: toBigDecimal(event.net_entry_unrealized),\n netFundingCumulative: toBigDecimal(event.net_funding_cumulative),\n netFundingUnrealized: toBigDecimal(event.net_funding_unrealized),\n netInterestCumulative: toBigDecimal(event.net_interest_cumulative),\n netInterestUnrealized: toBigDecimal(event.net_interest_unrealized),\n },\n };\n}\n\nexport function mapIndexerEventWithTx(\n event: IndexerServerEvent,\n tx: IndexerServerTx,\n): IndexerEventWithTx {\n return {\n timestamp: toBigDecimal(tx.timestamp),\n tx: tx.tx,\n ...mapIndexerEvent(event),\n };\n}\n\nexport function mapIndexerMatchEventBalances(\n eventBalances: IndexerServerMatchEventBalances,\n): IndexerMatchEventBalances {\n return {\n base: mapIndexerServerBalance(eventBalances.base),\n quote: eventBalances.quote\n ? (mapIndexerServerBalance(eventBalances.quote) as IndexerSpotBalance)\n : undefined,\n };\n}\n\nexport function mapIndexerProductPayment(\n payment: IndexerServerProductPayment,\n): IndexerProductPayment {\n return {\n submissionIndex: payment.idx,\n timestamp: toBigDecimal(payment.timestamp),\n paymentAmount: toBigDecimal(payment.amount),\n balanceAmount: toBigDecimal(payment.balance_amount),\n annualPaymentRate: removeDecimals(payment.rate_x18),\n oraclePrice: removeDecimals(payment.oracle_price_x18),\n isolated: payment.isolated,\n productId: payment.product_id,\n isolatedProductId: payment.isolated_product_id,\n };\n}\n\nexport function mapIndexerPerpPrices(\n perpPrices: IndexerServerPerpPrices,\n): IndexerPerpPrices {\n return {\n indexPrice: removeDecimals(perpPrices.index_price_x18),\n markPrice: removeDecimals(perpPrices.mark_price_x18),\n updateTime: toBigDecimal(perpPrices.update_time),\n productId: perpPrices.product_id,\n };\n}\n\nexport function mapIndexerFundingRate(\n fundingRate: IndexerServerFundingRate,\n): IndexerFundingRate {\n return {\n fundingRate: removeDecimals(fundingRate.funding_rate_x18),\n updateTime: toBigDecimal(fundingRate.update_time),\n productId: fundingRate.product_id,\n };\n}\n\nexport function mapIndexerMakerStatistics(\n maker: IndexerServerMaker,\n): IndexerMaker {\n return {\n address: maker.address,\n snapshots: maker.data.map((makerData) => {\n return {\n timestamp: toBigDecimal(makerData.timestamp),\n makerFee: toBigDecimal(makerData.maker_fee),\n uptime: toBigDecimal(makerData.uptime),\n sumQMin: toBigDecimal(makerData.sum_q_min),\n qScore: toBigDecimal(makerData.q_score),\n makerShare: toBigDecimal(makerData.maker_share),\n expectedMakerReward: toBigDecimal(makerData.expected_maker_reward),\n };\n }),\n };\n}\n\nexport function mapIndexerLeaderboardPosition(\n position: IndexerServerLeaderboardPosition,\n): IndexerLeaderboardParticipant {\n return {\n subaccount: subaccountFromHex(position.subaccount),\n contestId: position.contest_id,\n pnl: toBigDecimal(position.pnl),\n pnlRank: toBigDecimal(position.pnl_rank),\n percentRoi: toBigDecimal(position.roi),\n roiRank: toBigDecimal(position.roi_rank),\n accountValue: toBigDecimal(position.account_value),\n volume: position.volume ? toBigDecimal(position.volume) : undefined,\n updateTime: toBigDecimal(position.update_time),\n };\n}\n\nexport function mapIndexerLeaderboardRegistration(\n registration: IndexerServerLeaderboardRegistration,\n): IndexerLeaderboardRegistration {\n return {\n subaccount: subaccountFromHex(registration.subaccount),\n contestId: registration.contest_id,\n updateTime: toBigDecimal(registration.update_time),\n };\n}\n\nexport function mapIndexerLeaderboardContest(\n contest: IndexerServerLeaderboardContest,\n): IndexerLeaderboardContest {\n return {\n contestId: contest.contest_id,\n startTime: toBigDecimal(contest.start_time),\n endTime: toBigDecimal(contest.end_time),\n period: toBigDecimal(contest.threshold),\n totalParticipants: toBigDecimal(contest.count),\n minRequiredAccountValue: toBigDecimal(contest.threshold),\n minRequiredVolume: toBigDecimal(contest.volume_threshold),\n requiredProductIds: contest.product_ids,\n active: contest.active,\n lastUpdated: toBigDecimal(contest.last_updated),\n };\n}\n\nexport function mapIndexerCandlesticks(\n candlestick: IndexerServerCandlestick,\n): Candlestick {\n return {\n close: removeDecimals(candlestick.close_x18),\n high: removeDecimals(candlestick.high_x18),\n low: removeDecimals(candlestick.low_x18),\n open: removeDecimals(candlestick.open_x18),\n time: toBigDecimal(candlestick.timestamp),\n volume: toBigDecimal(candlestick.volume),\n };\n}\n\nexport function mapIndexerMarketSnapshot(\n snapshot: IndexerServerMarketSnapshot,\n): IndexerMarketSnapshot {\n return {\n timestamp: toBigDecimal(snapshot.timestamp),\n cumulativeUsers: toBigDecimal(snapshot.cumulative_users),\n dailyActiveUsers: toBigDecimal(snapshot.daily_active_users),\n tvl: toBigDecimal(snapshot.tvl),\n borrowRates: mapValues(snapshot.borrow_rates, (value) =>\n removeDecimals(value),\n ),\n cumulativeLiquidationAmounts: mapValues(\n snapshot.cumulative_liquidation_amounts,\n toBigDecimal,\n ),\n cumulativeMakerFees: mapValues(\n snapshot.cumulative_maker_fees,\n toBigDecimal,\n ),\n cumulativeSequencerFees: mapValues(\n snapshot.cumulative_sequencer_fees,\n toBigDecimal,\n ),\n cumulativeTakerFees: mapValues(\n snapshot.cumulative_taker_fees,\n toBigDecimal,\n ),\n cumulativeTrades: mapValues(snapshot.cumulative_trades, toBigDecimal),\n cumulativeVolumes: mapValues(snapshot.cumulative_volumes, toBigDecimal),\n depositRates: mapValues(snapshot.deposit_rates, (value) =>\n removeDecimals(value),\n ),\n fundingRates: mapValues(snapshot.funding_rates, (value) =>\n removeDecimals(value),\n ),\n openInterestsQuote: mapValues(snapshot.open_interests, toBigDecimal),\n totalBorrows: mapValues(snapshot.total_borrows, toBigDecimal),\n totalDeposits: mapValues(snapshot.total_deposits, toBigDecimal),\n cumulativeTradeSizes: mapValues(\n snapshot.cumulative_trade_sizes,\n toBigDecimal,\n ),\n cumulativeInflows: mapValues(snapshot.cumulative_inflows, toBigDecimal),\n cumulativeOutflows: mapValues(snapshot.cumulative_outflows, toBigDecimal),\n oraclePrices: mapValues(snapshot.oracle_prices, (value) =>\n removeDecimals(value),\n ),\n };\n}\n\nexport function mapIndexerVlpSnapshot(\n snapshot: IndexerServerVlpSnapshot,\n): IndexerVlpSnapshot {\n return {\n submissionIndex: snapshot.submission_idx,\n timestamp: toBigDecimal(snapshot.timestamp),\n cumulativeBurnAmountUsdc: toBigDecimal(snapshot.cumulative_burn_usdc),\n cumulativeMintAmountUsdc: toBigDecimal(snapshot.cumulative_mint_usdc),\n cumulativePnl: toBigDecimal(snapshot.cumulative_pnl),\n cumulativeTrades: toBigDecimal(snapshot.cumulative_trades),\n cumulativeVolume: toBigDecimal(snapshot.cumulative_volume),\n depositors: toBigDecimal(snapshot.depositors),\n oraclePrice: removeDecimals(snapshot.oracle_price_x18),\n tvl: toBigDecimal(snapshot.tvl),\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/dataMappers.ts"],"sourcesContent":["import {\n getRecvTimeFromOrderNonce,\n Market,\n parseRawExpirationTimestamp,\n PerpMarket,\n ProductEngineType,\n SpotMarket,\n subaccountFromHex,\n} from '@nadohq/contracts';\nimport {\n mapEngineServerPerpProduct,\n mapEngineServerSpotProduct,\n} from '@nadohq/engine-client';\nimport {\n mapValues,\n removeDecimals,\n toBigDecimal,\n toIntegerString,\n} from '@nadohq/utils';\nimport {\n Candlestick,\n IndexerEvent,\n IndexerEventWithTx,\n IndexerFundingRate,\n IndexerLeaderboardContest,\n IndexerLeaderboardParticipant,\n IndexerLeaderboardRegistration,\n IndexerMaker,\n IndexerMarketSnapshot,\n IndexerMatchEventBalances,\n IndexerOrder,\n IndexerPerpBalance,\n IndexerPerpPrices,\n IndexerProductPayment,\n IndexerServerBalance,\n IndexerServerCandlestick,\n IndexerServerEvent,\n IndexerServerFundingRate,\n IndexerServerLeaderboardContest,\n IndexerServerLeaderboardPosition,\n IndexerServerLeaderboardRegistration,\n IndexerServerMaker,\n IndexerServerMarketSnapshot,\n IndexerServerMatchEventBalances,\n IndexerServerOrder,\n IndexerServerPerpPrices,\n IndexerServerProduct,\n IndexerServerProductPayment,\n IndexerServerSnapshotsInterval,\n IndexerServerTx,\n IndexerServerNlpSnapshot,\n IndexerSnapshotsIntervalParams,\n IndexerSpotBalance,\n IndexerNlpSnapshot,\n} from './types';\n\nexport function mapSnapshotsIntervalToServerParams(\n params: IndexerSnapshotsIntervalParams,\n): IndexerServerSnapshotsInterval {\n return {\n count: params.limit,\n max_time: params.maxTimeInclusive\n ? toIntegerString(params.maxTimeInclusive)\n : undefined,\n granularity: params.granularity,\n };\n}\n\nexport function mapIndexerServerProduct(product: IndexerServerProduct): Market {\n if ('spot' in product) {\n return mapEngineServerSpotProduct(product.spot);\n }\n return mapEngineServerPerpProduct(product.perp);\n}\n\nexport function mapIndexerServerBalance(\n balance: IndexerServerBalance,\n): IndexerSpotBalance | IndexerPerpBalance {\n if ('spot' in balance) {\n return {\n amount: toBigDecimal(balance.spot.balance.amount),\n productId: balance.spot.product_id,\n type: ProductEngineType.SPOT,\n };\n }\n return {\n amount: toBigDecimal(balance.perp.balance.amount),\n productId: balance.perp.product_id,\n type: ProductEngineType.PERP,\n vQuoteBalance: toBigDecimal(balance.perp.balance.v_quote_balance),\n };\n}\n\nexport function mapIndexerOrder(order: IndexerServerOrder): IndexerOrder {\n const expiration = toBigDecimal(order.expiration);\n const expirationEncodedData = parseRawExpirationTimestamp(order.expiration);\n return {\n amount: toBigDecimal(order.amount),\n digest: order.digest,\n isolated: order.isolated,\n rawExpiration: expiration,\n isReduceOnly: expirationEncodedData.reduceOnly,\n expiration: expirationEncodedData.expirationTime,\n orderType: expirationEncodedData.type,\n nonce: toBigDecimal(order.nonce),\n recvTimeSeconds: getRecvTimeFromOrderNonce(order.nonce) / 1000,\n price: removeDecimals(order.price_x18),\n productId: order.product_id,\n subaccount: order.subaccount,\n submissionIndex: order.submission_idx,\n baseFilled: toBigDecimal(order.base_filled),\n quoteFilled: toBigDecimal(order.quote_filled),\n totalFee: toBigDecimal(order.fee),\n };\n}\n\nexport function mapIndexerEvent(event: IndexerServerEvent): IndexerEvent {\n const eventState: IndexerEvent['state'] = (() => {\n // Assume backend data is consistent\n if ('spot' in event.pre_balance) {\n return {\n type: ProductEngineType.SPOT,\n market: mapIndexerServerProduct(event.product) as SpotMarket,\n preBalance: mapIndexerServerBalance(\n event.pre_balance,\n ) as IndexerSpotBalance,\n postBalance: mapIndexerServerBalance(\n event.post_balance,\n ) as IndexerSpotBalance,\n };\n }\n return {\n type: ProductEngineType.PERP,\n market: mapIndexerServerProduct(event.product) as PerpMarket,\n preBalance: mapIndexerServerBalance(\n event.pre_balance,\n ) as IndexerPerpBalance,\n postBalance: mapIndexerServerBalance(\n event.post_balance,\n ) as IndexerPerpBalance,\n };\n })();\n\n return {\n eventType: event.event_type,\n productId: event.product_id,\n isolated: event.isolated,\n isolatedProductId: event.isolated_product_id,\n state: eventState,\n subaccount: event.subaccount,\n submissionIndex: event.submission_idx,\n trackedVars: {\n netEntryCumulative: toBigDecimal(event.net_entry_cumulative),\n netEntryUnrealized: toBigDecimal(event.net_entry_unrealized),\n netFundingCumulative: toBigDecimal(event.net_funding_cumulative),\n netFundingUnrealized: toBigDecimal(event.net_funding_unrealized),\n netInterestCumulative: toBigDecimal(event.net_interest_cumulative),\n netInterestUnrealized: toBigDecimal(event.net_interest_unrealized),\n },\n };\n}\n\nexport function mapIndexerEventWithTx(\n event: IndexerServerEvent,\n tx: IndexerServerTx,\n): IndexerEventWithTx {\n return {\n timestamp: toBigDecimal(tx.timestamp),\n tx: tx.tx,\n ...mapIndexerEvent(event),\n };\n}\n\nexport function mapIndexerMatchEventBalances(\n eventBalances: IndexerServerMatchEventBalances,\n): IndexerMatchEventBalances {\n return {\n base: mapIndexerServerBalance(eventBalances.base),\n quote: eventBalances.quote\n ? (mapIndexerServerBalance(eventBalances.quote) as IndexerSpotBalance)\n : undefined,\n };\n}\n\nexport function mapIndexerProductPayment(\n payment: IndexerServerProductPayment,\n): IndexerProductPayment {\n return {\n submissionIndex: payment.idx,\n timestamp: toBigDecimal(payment.timestamp),\n paymentAmount: toBigDecimal(payment.amount),\n balanceAmount: toBigDecimal(payment.balance_amount),\n annualPaymentRate: removeDecimals(payment.rate_x18),\n oraclePrice: removeDecimals(payment.oracle_price_x18),\n isolated: payment.isolated,\n productId: payment.product_id,\n isolatedProductId: payment.isolated_product_id,\n };\n}\n\nexport function mapIndexerPerpPrices(\n perpPrices: IndexerServerPerpPrices,\n): IndexerPerpPrices {\n return {\n indexPrice: removeDecimals(perpPrices.index_price_x18),\n markPrice: removeDecimals(perpPrices.mark_price_x18),\n updateTime: toBigDecimal(perpPrices.update_time),\n productId: perpPrices.product_id,\n };\n}\n\nexport function mapIndexerFundingRate(\n fundingRate: IndexerServerFundingRate,\n): IndexerFundingRate {\n return {\n fundingRate: removeDecimals(fundingRate.funding_rate_x18),\n updateTime: toBigDecimal(fundingRate.update_time),\n productId: fundingRate.product_id,\n };\n}\n\nexport function mapIndexerMakerStatistics(\n maker: IndexerServerMaker,\n): IndexerMaker {\n return {\n address: maker.address,\n snapshots: maker.data.map((makerData) => {\n return {\n timestamp: toBigDecimal(makerData.timestamp),\n makerFee: toBigDecimal(makerData.maker_fee),\n uptime: toBigDecimal(makerData.uptime),\n sumQMin: toBigDecimal(makerData.sum_q_min),\n qScore: toBigDecimal(makerData.q_score),\n makerShare: toBigDecimal(makerData.maker_share),\n expectedMakerReward: toBigDecimal(makerData.expected_maker_reward),\n };\n }),\n };\n}\n\nexport function mapIndexerLeaderboardPosition(\n position: IndexerServerLeaderboardPosition,\n): IndexerLeaderboardParticipant {\n return {\n subaccount: subaccountFromHex(position.subaccount),\n contestId: position.contest_id,\n pnl: toBigDecimal(position.pnl),\n pnlRank: toBigDecimal(position.pnl_rank),\n percentRoi: toBigDecimal(position.roi),\n roiRank: toBigDecimal(position.roi_rank),\n accountValue: toBigDecimal(position.account_value),\n volume: position.volume ? toBigDecimal(position.volume) : undefined,\n updateTime: toBigDecimal(position.update_time),\n };\n}\n\nexport function mapIndexerLeaderboardRegistration(\n registration: IndexerServerLeaderboardRegistration,\n): IndexerLeaderboardRegistration {\n return {\n subaccount: subaccountFromHex(registration.subaccount),\n contestId: registration.contest_id,\n updateTime: toBigDecimal(registration.update_time),\n };\n}\n\nexport function mapIndexerLeaderboardContest(\n contest: IndexerServerLeaderboardContest,\n): IndexerLeaderboardContest {\n return {\n contestId: contest.contest_id,\n startTime: toBigDecimal(contest.start_time),\n endTime: toBigDecimal(contest.end_time),\n period: toBigDecimal(contest.threshold),\n totalParticipants: toBigDecimal(contest.count),\n minRequiredAccountValue: toBigDecimal(contest.threshold),\n minRequiredVolume: toBigDecimal(contest.volume_threshold),\n requiredProductIds: contest.product_ids,\n active: contest.active,\n lastUpdated: toBigDecimal(contest.last_updated),\n };\n}\n\nexport function mapIndexerCandlesticks(\n candlestick: IndexerServerCandlestick,\n): Candlestick {\n return {\n close: removeDecimals(candlestick.close_x18),\n high: removeDecimals(candlestick.high_x18),\n low: removeDecimals(candlestick.low_x18),\n open: removeDecimals(candlestick.open_x18),\n time: toBigDecimal(candlestick.timestamp),\n volume: toBigDecimal(candlestick.volume),\n };\n}\n\nexport function mapIndexerMarketSnapshot(\n snapshot: IndexerServerMarketSnapshot,\n): IndexerMarketSnapshot {\n return {\n timestamp: toBigDecimal(snapshot.timestamp),\n cumulativeUsers: toBigDecimal(snapshot.cumulative_users),\n dailyActiveUsers: toBigDecimal(snapshot.daily_active_users),\n tvl: toBigDecimal(snapshot.tvl),\n borrowRates: mapValues(snapshot.borrow_rates, (value) =>\n removeDecimals(value),\n ),\n cumulativeLiquidationAmounts: mapValues(\n snapshot.cumulative_liquidation_amounts,\n toBigDecimal,\n ),\n cumulativeMakerFees: mapValues(\n snapshot.cumulative_maker_fees,\n toBigDecimal,\n ),\n cumulativeSequencerFees: mapValues(\n snapshot.cumulative_sequencer_fees,\n toBigDecimal,\n ),\n cumulativeTakerFees: mapValues(\n snapshot.cumulative_taker_fees,\n toBigDecimal,\n ),\n cumulativeTrades: mapValues(snapshot.cumulative_trades, toBigDecimal),\n cumulativeVolumes: mapValues(snapshot.cumulative_volumes, toBigDecimal),\n depositRates: mapValues(snapshot.deposit_rates, (value) =>\n removeDecimals(value),\n ),\n fundingRates: mapValues(snapshot.funding_rates, (value) =>\n removeDecimals(value),\n ),\n openInterestsQuote: mapValues(snapshot.open_interests, toBigDecimal),\n totalBorrows: mapValues(snapshot.total_borrows, toBigDecimal),\n totalDeposits: mapValues(snapshot.total_deposits, toBigDecimal),\n cumulativeTradeSizes: mapValues(\n snapshot.cumulative_trade_sizes,\n toBigDecimal,\n ),\n cumulativeInflows: mapValues(snapshot.cumulative_inflows, toBigDecimal),\n cumulativeOutflows: mapValues(snapshot.cumulative_outflows, toBigDecimal),\n oraclePrices: mapValues(snapshot.oracle_prices, (value) =>\n removeDecimals(value),\n ),\n };\n}\n\nexport function mapIndexerNlpSnapshot(\n snapshot: IndexerServerNlpSnapshot,\n): IndexerNlpSnapshot {\n return {\n submissionIndex: snapshot.submission_idx,\n timestamp: toBigDecimal(snapshot.timestamp),\n cumulativeBurnAmountUsdc: toBigDecimal(snapshot.cumulative_burn_usdc),\n cumulativeMintAmountUsdc: toBigDecimal(snapshot.cumulative_mint_usdc),\n cumulativePnl: toBigDecimal(snapshot.cumulative_pnl),\n cumulativeTrades: toBigDecimal(snapshot.cumulative_trades),\n cumulativeVolume: toBigDecimal(snapshot.cumulative_volume),\n depositors: toBigDecimal(snapshot.depositors),\n oraclePrice: removeDecimals(snapshot.oracle_price_x18),\n tvl: toBigDecimal(snapshot.tvl),\n };\n}\n"],"mappings":"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","names":[]}
|
package/dist/dataMappers.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Market } from '@nadohq/contracts';
|
|
2
|
-
import { IndexerSnapshotsIntervalParams, IndexerSpotBalance, IndexerPerpBalance, IndexerOrder, IndexerEvent, IndexerEventWithTx, IndexerMatchEventBalances, IndexerProductPayment, IndexerPerpPrices, IndexerFundingRate, IndexerMaker, IndexerLeaderboardParticipant, IndexerLeaderboardRegistration, IndexerLeaderboardContest, Candlestick, IndexerMarketSnapshot,
|
|
2
|
+
import { IndexerSnapshotsIntervalParams, IndexerSpotBalance, IndexerPerpBalance, IndexerOrder, IndexerEvent, IndexerEventWithTx, IndexerMatchEventBalances, IndexerProductPayment, IndexerPerpPrices, IndexerFundingRate, IndexerMaker, IndexerLeaderboardParticipant, IndexerLeaderboardRegistration, IndexerLeaderboardContest, Candlestick, IndexerMarketSnapshot, IndexerNlpSnapshot } from './types/clientTypes.cjs';
|
|
3
3
|
import { IndexerServerPerpPrices, IndexerServerFundingRate } from './types/serverTypes.cjs';
|
|
4
|
-
import { IndexerServerSnapshotsInterval, IndexerServerProduct, IndexerServerBalance, IndexerServerOrder, IndexerServerEvent, IndexerServerTx, IndexerServerMatchEventBalances, IndexerServerProductPayment, IndexerServerMaker, IndexerServerLeaderboardPosition, IndexerServerLeaderboardRegistration, IndexerServerLeaderboardContest, IndexerServerCandlestick, IndexerServerMarketSnapshot,
|
|
4
|
+
import { IndexerServerSnapshotsInterval, IndexerServerProduct, IndexerServerBalance, IndexerServerOrder, IndexerServerEvent, IndexerServerTx, IndexerServerMatchEventBalances, IndexerServerProductPayment, IndexerServerMaker, IndexerServerLeaderboardPosition, IndexerServerLeaderboardRegistration, IndexerServerLeaderboardContest, IndexerServerCandlestick, IndexerServerMarketSnapshot, IndexerServerNlpSnapshot } from './types/serverModelTypes.cjs';
|
|
5
5
|
import '@nadohq/utils';
|
|
6
6
|
import 'viem';
|
|
7
7
|
import './types/CandlestickPeriod.cjs';
|
|
@@ -26,6 +26,6 @@ declare function mapIndexerLeaderboardRegistration(registration: IndexerServerLe
|
|
|
26
26
|
declare function mapIndexerLeaderboardContest(contest: IndexerServerLeaderboardContest): IndexerLeaderboardContest;
|
|
27
27
|
declare function mapIndexerCandlesticks(candlestick: IndexerServerCandlestick): Candlestick;
|
|
28
28
|
declare function mapIndexerMarketSnapshot(snapshot: IndexerServerMarketSnapshot): IndexerMarketSnapshot;
|
|
29
|
-
declare function
|
|
29
|
+
declare function mapIndexerNlpSnapshot(snapshot: IndexerServerNlpSnapshot): IndexerNlpSnapshot;
|
|
30
30
|
|
|
31
|
-
export { mapIndexerCandlesticks, mapIndexerEvent, mapIndexerEventWithTx, mapIndexerFundingRate, mapIndexerLeaderboardContest, mapIndexerLeaderboardPosition, mapIndexerLeaderboardRegistration, mapIndexerMakerStatistics, mapIndexerMarketSnapshot, mapIndexerMatchEventBalances, mapIndexerOrder, mapIndexerPerpPrices, mapIndexerProductPayment, mapIndexerServerBalance, mapIndexerServerProduct,
|
|
31
|
+
export { mapIndexerCandlesticks, mapIndexerEvent, mapIndexerEventWithTx, mapIndexerFundingRate, mapIndexerLeaderboardContest, mapIndexerLeaderboardPosition, mapIndexerLeaderboardRegistration, mapIndexerMakerStatistics, mapIndexerMarketSnapshot, mapIndexerMatchEventBalances, mapIndexerNlpSnapshot, mapIndexerOrder, mapIndexerPerpPrices, mapIndexerProductPayment, mapIndexerServerBalance, mapIndexerServerProduct, mapSnapshotsIntervalToServerParams };
|
package/dist/dataMappers.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Market } from '@nadohq/contracts';
|
|
2
|
-
import { IndexerSnapshotsIntervalParams, IndexerSpotBalance, IndexerPerpBalance, IndexerOrder, IndexerEvent, IndexerEventWithTx, IndexerMatchEventBalances, IndexerProductPayment, IndexerPerpPrices, IndexerFundingRate, IndexerMaker, IndexerLeaderboardParticipant, IndexerLeaderboardRegistration, IndexerLeaderboardContest, Candlestick, IndexerMarketSnapshot,
|
|
2
|
+
import { IndexerSnapshotsIntervalParams, IndexerSpotBalance, IndexerPerpBalance, IndexerOrder, IndexerEvent, IndexerEventWithTx, IndexerMatchEventBalances, IndexerProductPayment, IndexerPerpPrices, IndexerFundingRate, IndexerMaker, IndexerLeaderboardParticipant, IndexerLeaderboardRegistration, IndexerLeaderboardContest, Candlestick, IndexerMarketSnapshot, IndexerNlpSnapshot } from './types/clientTypes.js';
|
|
3
3
|
import { IndexerServerPerpPrices, IndexerServerFundingRate } from './types/serverTypes.js';
|
|
4
|
-
import { IndexerServerSnapshotsInterval, IndexerServerProduct, IndexerServerBalance, IndexerServerOrder, IndexerServerEvent, IndexerServerTx, IndexerServerMatchEventBalances, IndexerServerProductPayment, IndexerServerMaker, IndexerServerLeaderboardPosition, IndexerServerLeaderboardRegistration, IndexerServerLeaderboardContest, IndexerServerCandlestick, IndexerServerMarketSnapshot,
|
|
4
|
+
import { IndexerServerSnapshotsInterval, IndexerServerProduct, IndexerServerBalance, IndexerServerOrder, IndexerServerEvent, IndexerServerTx, IndexerServerMatchEventBalances, IndexerServerProductPayment, IndexerServerMaker, IndexerServerLeaderboardPosition, IndexerServerLeaderboardRegistration, IndexerServerLeaderboardContest, IndexerServerCandlestick, IndexerServerMarketSnapshot, IndexerServerNlpSnapshot } from './types/serverModelTypes.js';
|
|
5
5
|
import '@nadohq/utils';
|
|
6
6
|
import 'viem';
|
|
7
7
|
import './types/CandlestickPeriod.js';
|
|
@@ -26,6 +26,6 @@ declare function mapIndexerLeaderboardRegistration(registration: IndexerServerLe
|
|
|
26
26
|
declare function mapIndexerLeaderboardContest(contest: IndexerServerLeaderboardContest): IndexerLeaderboardContest;
|
|
27
27
|
declare function mapIndexerCandlesticks(candlestick: IndexerServerCandlestick): Candlestick;
|
|
28
28
|
declare function mapIndexerMarketSnapshot(snapshot: IndexerServerMarketSnapshot): IndexerMarketSnapshot;
|
|
29
|
-
declare function
|
|
29
|
+
declare function mapIndexerNlpSnapshot(snapshot: IndexerServerNlpSnapshot): IndexerNlpSnapshot;
|
|
30
30
|
|
|
31
|
-
export { mapIndexerCandlesticks, mapIndexerEvent, mapIndexerEventWithTx, mapIndexerFundingRate, mapIndexerLeaderboardContest, mapIndexerLeaderboardPosition, mapIndexerLeaderboardRegistration, mapIndexerMakerStatistics, mapIndexerMarketSnapshot, mapIndexerMatchEventBalances, mapIndexerOrder, mapIndexerPerpPrices, mapIndexerProductPayment, mapIndexerServerBalance, mapIndexerServerProduct,
|
|
31
|
+
export { mapIndexerCandlesticks, mapIndexerEvent, mapIndexerEventWithTx, mapIndexerFundingRate, mapIndexerLeaderboardContest, mapIndexerLeaderboardPosition, mapIndexerLeaderboardRegistration, mapIndexerMakerStatistics, mapIndexerMarketSnapshot, mapIndexerMatchEventBalances, mapIndexerNlpSnapshot, mapIndexerOrder, mapIndexerPerpPrices, mapIndexerProductPayment, mapIndexerServerBalance, mapIndexerServerProduct, mapSnapshotsIntervalToServerParams };
|
package/dist/dataMappers.js
CHANGED
|
@@ -260,7 +260,7 @@ function mapIndexerMarketSnapshot(snapshot) {
|
|
|
260
260
|
)
|
|
261
261
|
};
|
|
262
262
|
}
|
|
263
|
-
function
|
|
263
|
+
function mapIndexerNlpSnapshot(snapshot) {
|
|
264
264
|
return {
|
|
265
265
|
submissionIndex: snapshot.submission_idx,
|
|
266
266
|
timestamp: toBigDecimal(snapshot.timestamp),
|
|
@@ -285,12 +285,12 @@ export {
|
|
|
285
285
|
mapIndexerMakerStatistics,
|
|
286
286
|
mapIndexerMarketSnapshot,
|
|
287
287
|
mapIndexerMatchEventBalances,
|
|
288
|
+
mapIndexerNlpSnapshot,
|
|
288
289
|
mapIndexerOrder,
|
|
289
290
|
mapIndexerPerpPrices,
|
|
290
291
|
mapIndexerProductPayment,
|
|
291
292
|
mapIndexerServerBalance,
|
|
292
293
|
mapIndexerServerProduct,
|
|
293
|
-
mapIndexerVlpSnapshot,
|
|
294
294
|
mapSnapshotsIntervalToServerParams
|
|
295
295
|
};
|
|
296
296
|
//# sourceMappingURL=dataMappers.js.map
|
package/dist/dataMappers.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/dataMappers.ts"],"sourcesContent":["import {\n getRecvTimeFromOrderNonce,\n Market,\n parseRawExpirationTimestamp,\n PerpMarket,\n ProductEngineType,\n SpotMarket,\n subaccountFromHex,\n} from '@nadohq/contracts';\nimport {\n mapEngineServerPerpProduct,\n mapEngineServerSpotProduct,\n} from '@nadohq/engine-client';\nimport {\n mapValues,\n removeDecimals,\n toBigDecimal,\n toIntegerString,\n} from '@nadohq/utils';\nimport {\n Candlestick,\n IndexerEvent,\n IndexerEventWithTx,\n IndexerFundingRate,\n IndexerLeaderboardContest,\n IndexerLeaderboardParticipant,\n IndexerLeaderboardRegistration,\n IndexerMaker,\n IndexerMarketSnapshot,\n IndexerMatchEventBalances,\n IndexerOrder,\n IndexerPerpBalance,\n IndexerPerpPrices,\n IndexerProductPayment,\n IndexerServerBalance,\n IndexerServerCandlestick,\n IndexerServerEvent,\n IndexerServerFundingRate,\n IndexerServerLeaderboardContest,\n IndexerServerLeaderboardPosition,\n IndexerServerLeaderboardRegistration,\n IndexerServerMaker,\n IndexerServerMarketSnapshot,\n IndexerServerMatchEventBalances,\n IndexerServerOrder,\n IndexerServerPerpPrices,\n IndexerServerProduct,\n IndexerServerProductPayment,\n IndexerServerSnapshotsInterval,\n IndexerServerTx,\n IndexerServerVlpSnapshot,\n IndexerSnapshotsIntervalParams,\n IndexerSpotBalance,\n IndexerVlpSnapshot,\n} from './types';\n\nexport function mapSnapshotsIntervalToServerParams(\n params: IndexerSnapshotsIntervalParams,\n): IndexerServerSnapshotsInterval {\n return {\n count: params.limit,\n max_time: params.maxTimeInclusive\n ? toIntegerString(params.maxTimeInclusive)\n : undefined,\n granularity: params.granularity,\n };\n}\n\nexport function mapIndexerServerProduct(product: IndexerServerProduct): Market {\n if ('spot' in product) {\n return mapEngineServerSpotProduct(product.spot);\n }\n return mapEngineServerPerpProduct(product.perp);\n}\n\nexport function mapIndexerServerBalance(\n balance: IndexerServerBalance,\n): IndexerSpotBalance | IndexerPerpBalance {\n if ('spot' in balance) {\n return {\n amount: toBigDecimal(balance.spot.balance.amount),\n productId: balance.spot.product_id,\n type: ProductEngineType.SPOT,\n };\n }\n return {\n amount: toBigDecimal(balance.perp.balance.amount),\n productId: balance.perp.product_id,\n type: ProductEngineType.PERP,\n vQuoteBalance: toBigDecimal(balance.perp.balance.v_quote_balance),\n };\n}\n\nexport function mapIndexerOrder(order: IndexerServerOrder): IndexerOrder {\n const expiration = toBigDecimal(order.expiration);\n const expirationEncodedData = parseRawExpirationTimestamp(order.expiration);\n return {\n amount: toBigDecimal(order.amount),\n digest: order.digest,\n isolated: order.isolated,\n rawExpiration: expiration,\n isReduceOnly: expirationEncodedData.reduceOnly,\n expiration: expirationEncodedData.expirationTime,\n orderType: expirationEncodedData.type,\n nonce: toBigDecimal(order.nonce),\n recvTimeSeconds: getRecvTimeFromOrderNonce(order.nonce) / 1000,\n price: removeDecimals(order.price_x18),\n productId: order.product_id,\n subaccount: order.subaccount,\n submissionIndex: order.submission_idx,\n baseFilled: toBigDecimal(order.base_filled),\n quoteFilled: toBigDecimal(order.quote_filled),\n totalFee: toBigDecimal(order.fee),\n };\n}\n\nexport function mapIndexerEvent(event: IndexerServerEvent): IndexerEvent {\n const eventState: IndexerEvent['state'] = (() => {\n // Assume backend data is consistent\n if ('spot' in event.pre_balance) {\n return {\n type: ProductEngineType.SPOT,\n market: mapIndexerServerProduct(event.product) as SpotMarket,\n preBalance: mapIndexerServerBalance(\n event.pre_balance,\n ) as IndexerSpotBalance,\n postBalance: mapIndexerServerBalance(\n event.post_balance,\n ) as IndexerSpotBalance,\n };\n }\n return {\n type: ProductEngineType.PERP,\n market: mapIndexerServerProduct(event.product) as PerpMarket,\n preBalance: mapIndexerServerBalance(\n event.pre_balance,\n ) as IndexerPerpBalance,\n postBalance: mapIndexerServerBalance(\n event.post_balance,\n ) as IndexerPerpBalance,\n };\n })();\n\n return {\n eventType: event.event_type,\n productId: event.product_id,\n isolated: event.isolated,\n isolatedProductId: event.isolated_product_id,\n state: eventState,\n subaccount: event.subaccount,\n submissionIndex: event.submission_idx,\n trackedVars: {\n netEntryCumulative: toBigDecimal(event.net_entry_cumulative),\n netEntryUnrealized: toBigDecimal(event.net_entry_unrealized),\n netFundingCumulative: toBigDecimal(event.net_funding_cumulative),\n netFundingUnrealized: toBigDecimal(event.net_funding_unrealized),\n netInterestCumulative: toBigDecimal(event.net_interest_cumulative),\n netInterestUnrealized: toBigDecimal(event.net_interest_unrealized),\n },\n };\n}\n\nexport function mapIndexerEventWithTx(\n event: IndexerServerEvent,\n tx: IndexerServerTx,\n): IndexerEventWithTx {\n return {\n timestamp: toBigDecimal(tx.timestamp),\n tx: tx.tx,\n ...mapIndexerEvent(event),\n };\n}\n\nexport function mapIndexerMatchEventBalances(\n eventBalances: IndexerServerMatchEventBalances,\n): IndexerMatchEventBalances {\n return {\n base: mapIndexerServerBalance(eventBalances.base),\n quote: eventBalances.quote\n ? (mapIndexerServerBalance(eventBalances.quote) as IndexerSpotBalance)\n : undefined,\n };\n}\n\nexport function mapIndexerProductPayment(\n payment: IndexerServerProductPayment,\n): IndexerProductPayment {\n return {\n submissionIndex: payment.idx,\n timestamp: toBigDecimal(payment.timestamp),\n paymentAmount: toBigDecimal(payment.amount),\n balanceAmount: toBigDecimal(payment.balance_amount),\n annualPaymentRate: removeDecimals(payment.rate_x18),\n oraclePrice: removeDecimals(payment.oracle_price_x18),\n isolated: payment.isolated,\n productId: payment.product_id,\n isolatedProductId: payment.isolated_product_id,\n };\n}\n\nexport function mapIndexerPerpPrices(\n perpPrices: IndexerServerPerpPrices,\n): IndexerPerpPrices {\n return {\n indexPrice: removeDecimals(perpPrices.index_price_x18),\n markPrice: removeDecimals(perpPrices.mark_price_x18),\n updateTime: toBigDecimal(perpPrices.update_time),\n productId: perpPrices.product_id,\n };\n}\n\nexport function mapIndexerFundingRate(\n fundingRate: IndexerServerFundingRate,\n): IndexerFundingRate {\n return {\n fundingRate: removeDecimals(fundingRate.funding_rate_x18),\n updateTime: toBigDecimal(fundingRate.update_time),\n productId: fundingRate.product_id,\n };\n}\n\nexport function mapIndexerMakerStatistics(\n maker: IndexerServerMaker,\n): IndexerMaker {\n return {\n address: maker.address,\n snapshots: maker.data.map((makerData) => {\n return {\n timestamp: toBigDecimal(makerData.timestamp),\n makerFee: toBigDecimal(makerData.maker_fee),\n uptime: toBigDecimal(makerData.uptime),\n sumQMin: toBigDecimal(makerData.sum_q_min),\n qScore: toBigDecimal(makerData.q_score),\n makerShare: toBigDecimal(makerData.maker_share),\n expectedMakerReward: toBigDecimal(makerData.expected_maker_reward),\n };\n }),\n };\n}\n\nexport function mapIndexerLeaderboardPosition(\n position: IndexerServerLeaderboardPosition,\n): IndexerLeaderboardParticipant {\n return {\n subaccount: subaccountFromHex(position.subaccount),\n contestId: position.contest_id,\n pnl: toBigDecimal(position.pnl),\n pnlRank: toBigDecimal(position.pnl_rank),\n percentRoi: toBigDecimal(position.roi),\n roiRank: toBigDecimal(position.roi_rank),\n accountValue: toBigDecimal(position.account_value),\n volume: position.volume ? toBigDecimal(position.volume) : undefined,\n updateTime: toBigDecimal(position.update_time),\n };\n}\n\nexport function mapIndexerLeaderboardRegistration(\n registration: IndexerServerLeaderboardRegistration,\n): IndexerLeaderboardRegistration {\n return {\n subaccount: subaccountFromHex(registration.subaccount),\n contestId: registration.contest_id,\n updateTime: toBigDecimal(registration.update_time),\n };\n}\n\nexport function mapIndexerLeaderboardContest(\n contest: IndexerServerLeaderboardContest,\n): IndexerLeaderboardContest {\n return {\n contestId: contest.contest_id,\n startTime: toBigDecimal(contest.start_time),\n endTime: toBigDecimal(contest.end_time),\n period: toBigDecimal(contest.threshold),\n totalParticipants: toBigDecimal(contest.count),\n minRequiredAccountValue: toBigDecimal(contest.threshold),\n minRequiredVolume: toBigDecimal(contest.volume_threshold),\n requiredProductIds: contest.product_ids,\n active: contest.active,\n lastUpdated: toBigDecimal(contest.last_updated),\n };\n}\n\nexport function mapIndexerCandlesticks(\n candlestick: IndexerServerCandlestick,\n): Candlestick {\n return {\n close: removeDecimals(candlestick.close_x18),\n high: removeDecimals(candlestick.high_x18),\n low: removeDecimals(candlestick.low_x18),\n open: removeDecimals(candlestick.open_x18),\n time: toBigDecimal(candlestick.timestamp),\n volume: toBigDecimal(candlestick.volume),\n };\n}\n\nexport function mapIndexerMarketSnapshot(\n snapshot: IndexerServerMarketSnapshot,\n): IndexerMarketSnapshot {\n return {\n timestamp: toBigDecimal(snapshot.timestamp),\n cumulativeUsers: toBigDecimal(snapshot.cumulative_users),\n dailyActiveUsers: toBigDecimal(snapshot.daily_active_users),\n tvl: toBigDecimal(snapshot.tvl),\n borrowRates: mapValues(snapshot.borrow_rates, (value) =>\n removeDecimals(value),\n ),\n cumulativeLiquidationAmounts: mapValues(\n snapshot.cumulative_liquidation_amounts,\n toBigDecimal,\n ),\n cumulativeMakerFees: mapValues(\n snapshot.cumulative_maker_fees,\n toBigDecimal,\n ),\n cumulativeSequencerFees: mapValues(\n snapshot.cumulative_sequencer_fees,\n toBigDecimal,\n ),\n cumulativeTakerFees: mapValues(\n snapshot.cumulative_taker_fees,\n toBigDecimal,\n ),\n cumulativeTrades: mapValues(snapshot.cumulative_trades, toBigDecimal),\n cumulativeVolumes: mapValues(snapshot.cumulative_volumes, toBigDecimal),\n depositRates: mapValues(snapshot.deposit_rates, (value) =>\n removeDecimals(value),\n ),\n fundingRates: mapValues(snapshot.funding_rates, (value) =>\n removeDecimals(value),\n ),\n openInterestsQuote: mapValues(snapshot.open_interests, toBigDecimal),\n totalBorrows: mapValues(snapshot.total_borrows, toBigDecimal),\n totalDeposits: mapValues(snapshot.total_deposits, toBigDecimal),\n cumulativeTradeSizes: mapValues(\n snapshot.cumulative_trade_sizes,\n toBigDecimal,\n ),\n cumulativeInflows: mapValues(snapshot.cumulative_inflows, toBigDecimal),\n cumulativeOutflows: mapValues(snapshot.cumulative_outflows, toBigDecimal),\n oraclePrices: mapValues(snapshot.oracle_prices, (value) =>\n removeDecimals(value),\n ),\n };\n}\n\nexport function mapIndexerVlpSnapshot(\n snapshot: IndexerServerVlpSnapshot,\n): IndexerVlpSnapshot {\n return {\n submissionIndex: snapshot.submission_idx,\n timestamp: toBigDecimal(snapshot.timestamp),\n cumulativeBurnAmountUsdc: toBigDecimal(snapshot.cumulative_burn_usdc),\n cumulativeMintAmountUsdc: toBigDecimal(snapshot.cumulative_mint_usdc),\n cumulativePnl: toBigDecimal(snapshot.cumulative_pnl),\n cumulativeTrades: toBigDecimal(snapshot.cumulative_trades),\n cumulativeVolume: toBigDecimal(snapshot.cumulative_volume),\n depositors: toBigDecimal(snapshot.depositors),\n oraclePrice: removeDecimals(snapshot.oracle_price_x18),\n tvl: toBigDecimal(snapshot.tvl),\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/dataMappers.ts"],"sourcesContent":["import {\n getRecvTimeFromOrderNonce,\n Market,\n parseRawExpirationTimestamp,\n PerpMarket,\n ProductEngineType,\n SpotMarket,\n subaccountFromHex,\n} from '@nadohq/contracts';\nimport {\n mapEngineServerPerpProduct,\n mapEngineServerSpotProduct,\n} from '@nadohq/engine-client';\nimport {\n mapValues,\n removeDecimals,\n toBigDecimal,\n toIntegerString,\n} from '@nadohq/utils';\nimport {\n Candlestick,\n IndexerEvent,\n IndexerEventWithTx,\n IndexerFundingRate,\n IndexerLeaderboardContest,\n IndexerLeaderboardParticipant,\n IndexerLeaderboardRegistration,\n IndexerMaker,\n IndexerMarketSnapshot,\n IndexerMatchEventBalances,\n IndexerOrder,\n IndexerPerpBalance,\n IndexerPerpPrices,\n IndexerProductPayment,\n IndexerServerBalance,\n IndexerServerCandlestick,\n IndexerServerEvent,\n IndexerServerFundingRate,\n IndexerServerLeaderboardContest,\n IndexerServerLeaderboardPosition,\n IndexerServerLeaderboardRegistration,\n IndexerServerMaker,\n IndexerServerMarketSnapshot,\n IndexerServerMatchEventBalances,\n IndexerServerOrder,\n IndexerServerPerpPrices,\n IndexerServerProduct,\n IndexerServerProductPayment,\n IndexerServerSnapshotsInterval,\n IndexerServerTx,\n IndexerServerNlpSnapshot,\n IndexerSnapshotsIntervalParams,\n IndexerSpotBalance,\n IndexerNlpSnapshot,\n} from './types';\n\nexport function mapSnapshotsIntervalToServerParams(\n params: IndexerSnapshotsIntervalParams,\n): IndexerServerSnapshotsInterval {\n return {\n count: params.limit,\n max_time: params.maxTimeInclusive\n ? toIntegerString(params.maxTimeInclusive)\n : undefined,\n granularity: params.granularity,\n };\n}\n\nexport function mapIndexerServerProduct(product: IndexerServerProduct): Market {\n if ('spot' in product) {\n return mapEngineServerSpotProduct(product.spot);\n }\n return mapEngineServerPerpProduct(product.perp);\n}\n\nexport function mapIndexerServerBalance(\n balance: IndexerServerBalance,\n): IndexerSpotBalance | IndexerPerpBalance {\n if ('spot' in balance) {\n return {\n amount: toBigDecimal(balance.spot.balance.amount),\n productId: balance.spot.product_id,\n type: ProductEngineType.SPOT,\n };\n }\n return {\n amount: toBigDecimal(balance.perp.balance.amount),\n productId: balance.perp.product_id,\n type: ProductEngineType.PERP,\n vQuoteBalance: toBigDecimal(balance.perp.balance.v_quote_balance),\n };\n}\n\nexport function mapIndexerOrder(order: IndexerServerOrder): IndexerOrder {\n const expiration = toBigDecimal(order.expiration);\n const expirationEncodedData = parseRawExpirationTimestamp(order.expiration);\n return {\n amount: toBigDecimal(order.amount),\n digest: order.digest,\n isolated: order.isolated,\n rawExpiration: expiration,\n isReduceOnly: expirationEncodedData.reduceOnly,\n expiration: expirationEncodedData.expirationTime,\n orderType: expirationEncodedData.type,\n nonce: toBigDecimal(order.nonce),\n recvTimeSeconds: getRecvTimeFromOrderNonce(order.nonce) / 1000,\n price: removeDecimals(order.price_x18),\n productId: order.product_id,\n subaccount: order.subaccount,\n submissionIndex: order.submission_idx,\n baseFilled: toBigDecimal(order.base_filled),\n quoteFilled: toBigDecimal(order.quote_filled),\n totalFee: toBigDecimal(order.fee),\n };\n}\n\nexport function mapIndexerEvent(event: IndexerServerEvent): IndexerEvent {\n const eventState: IndexerEvent['state'] = (() => {\n // Assume backend data is consistent\n if ('spot' in event.pre_balance) {\n return {\n type: ProductEngineType.SPOT,\n market: mapIndexerServerProduct(event.product) as SpotMarket,\n preBalance: mapIndexerServerBalance(\n event.pre_balance,\n ) as IndexerSpotBalance,\n postBalance: mapIndexerServerBalance(\n event.post_balance,\n ) as IndexerSpotBalance,\n };\n }\n return {\n type: ProductEngineType.PERP,\n market: mapIndexerServerProduct(event.product) as PerpMarket,\n preBalance: mapIndexerServerBalance(\n event.pre_balance,\n ) as IndexerPerpBalance,\n postBalance: mapIndexerServerBalance(\n event.post_balance,\n ) as IndexerPerpBalance,\n };\n })();\n\n return {\n eventType: event.event_type,\n productId: event.product_id,\n isolated: event.isolated,\n isolatedProductId: event.isolated_product_id,\n state: eventState,\n subaccount: event.subaccount,\n submissionIndex: event.submission_idx,\n trackedVars: {\n netEntryCumulative: toBigDecimal(event.net_entry_cumulative),\n netEntryUnrealized: toBigDecimal(event.net_entry_unrealized),\n netFundingCumulative: toBigDecimal(event.net_funding_cumulative),\n netFundingUnrealized: toBigDecimal(event.net_funding_unrealized),\n netInterestCumulative: toBigDecimal(event.net_interest_cumulative),\n netInterestUnrealized: toBigDecimal(event.net_interest_unrealized),\n },\n };\n}\n\nexport function mapIndexerEventWithTx(\n event: IndexerServerEvent,\n tx: IndexerServerTx,\n): IndexerEventWithTx {\n return {\n timestamp: toBigDecimal(tx.timestamp),\n tx: tx.tx,\n ...mapIndexerEvent(event),\n };\n}\n\nexport function mapIndexerMatchEventBalances(\n eventBalances: IndexerServerMatchEventBalances,\n): IndexerMatchEventBalances {\n return {\n base: mapIndexerServerBalance(eventBalances.base),\n quote: eventBalances.quote\n ? (mapIndexerServerBalance(eventBalances.quote) as IndexerSpotBalance)\n : undefined,\n };\n}\n\nexport function mapIndexerProductPayment(\n payment: IndexerServerProductPayment,\n): IndexerProductPayment {\n return {\n submissionIndex: payment.idx,\n timestamp: toBigDecimal(payment.timestamp),\n paymentAmount: toBigDecimal(payment.amount),\n balanceAmount: toBigDecimal(payment.balance_amount),\n annualPaymentRate: removeDecimals(payment.rate_x18),\n oraclePrice: removeDecimals(payment.oracle_price_x18),\n isolated: payment.isolated,\n productId: payment.product_id,\n isolatedProductId: payment.isolated_product_id,\n };\n}\n\nexport function mapIndexerPerpPrices(\n perpPrices: IndexerServerPerpPrices,\n): IndexerPerpPrices {\n return {\n indexPrice: removeDecimals(perpPrices.index_price_x18),\n markPrice: removeDecimals(perpPrices.mark_price_x18),\n updateTime: toBigDecimal(perpPrices.update_time),\n productId: perpPrices.product_id,\n };\n}\n\nexport function mapIndexerFundingRate(\n fundingRate: IndexerServerFundingRate,\n): IndexerFundingRate {\n return {\n fundingRate: removeDecimals(fundingRate.funding_rate_x18),\n updateTime: toBigDecimal(fundingRate.update_time),\n productId: fundingRate.product_id,\n };\n}\n\nexport function mapIndexerMakerStatistics(\n maker: IndexerServerMaker,\n): IndexerMaker {\n return {\n address: maker.address,\n snapshots: maker.data.map((makerData) => {\n return {\n timestamp: toBigDecimal(makerData.timestamp),\n makerFee: toBigDecimal(makerData.maker_fee),\n uptime: toBigDecimal(makerData.uptime),\n sumQMin: toBigDecimal(makerData.sum_q_min),\n qScore: toBigDecimal(makerData.q_score),\n makerShare: toBigDecimal(makerData.maker_share),\n expectedMakerReward: toBigDecimal(makerData.expected_maker_reward),\n };\n }),\n };\n}\n\nexport function mapIndexerLeaderboardPosition(\n position: IndexerServerLeaderboardPosition,\n): IndexerLeaderboardParticipant {\n return {\n subaccount: subaccountFromHex(position.subaccount),\n contestId: position.contest_id,\n pnl: toBigDecimal(position.pnl),\n pnlRank: toBigDecimal(position.pnl_rank),\n percentRoi: toBigDecimal(position.roi),\n roiRank: toBigDecimal(position.roi_rank),\n accountValue: toBigDecimal(position.account_value),\n volume: position.volume ? toBigDecimal(position.volume) : undefined,\n updateTime: toBigDecimal(position.update_time),\n };\n}\n\nexport function mapIndexerLeaderboardRegistration(\n registration: IndexerServerLeaderboardRegistration,\n): IndexerLeaderboardRegistration {\n return {\n subaccount: subaccountFromHex(registration.subaccount),\n contestId: registration.contest_id,\n updateTime: toBigDecimal(registration.update_time),\n };\n}\n\nexport function mapIndexerLeaderboardContest(\n contest: IndexerServerLeaderboardContest,\n): IndexerLeaderboardContest {\n return {\n contestId: contest.contest_id,\n startTime: toBigDecimal(contest.start_time),\n endTime: toBigDecimal(contest.end_time),\n period: toBigDecimal(contest.threshold),\n totalParticipants: toBigDecimal(contest.count),\n minRequiredAccountValue: toBigDecimal(contest.threshold),\n minRequiredVolume: toBigDecimal(contest.volume_threshold),\n requiredProductIds: contest.product_ids,\n active: contest.active,\n lastUpdated: toBigDecimal(contest.last_updated),\n };\n}\n\nexport function mapIndexerCandlesticks(\n candlestick: IndexerServerCandlestick,\n): Candlestick {\n return {\n close: removeDecimals(candlestick.close_x18),\n high: removeDecimals(candlestick.high_x18),\n low: removeDecimals(candlestick.low_x18),\n open: removeDecimals(candlestick.open_x18),\n time: toBigDecimal(candlestick.timestamp),\n volume: toBigDecimal(candlestick.volume),\n };\n}\n\nexport function mapIndexerMarketSnapshot(\n snapshot: IndexerServerMarketSnapshot,\n): IndexerMarketSnapshot {\n return {\n timestamp: toBigDecimal(snapshot.timestamp),\n cumulativeUsers: toBigDecimal(snapshot.cumulative_users),\n dailyActiveUsers: toBigDecimal(snapshot.daily_active_users),\n tvl: toBigDecimal(snapshot.tvl),\n borrowRates: mapValues(snapshot.borrow_rates, (value) =>\n removeDecimals(value),\n ),\n cumulativeLiquidationAmounts: mapValues(\n snapshot.cumulative_liquidation_amounts,\n toBigDecimal,\n ),\n cumulativeMakerFees: mapValues(\n snapshot.cumulative_maker_fees,\n toBigDecimal,\n ),\n cumulativeSequencerFees: mapValues(\n snapshot.cumulative_sequencer_fees,\n toBigDecimal,\n ),\n cumulativeTakerFees: mapValues(\n snapshot.cumulative_taker_fees,\n toBigDecimal,\n ),\n cumulativeTrades: mapValues(snapshot.cumulative_trades, toBigDecimal),\n cumulativeVolumes: mapValues(snapshot.cumulative_volumes, toBigDecimal),\n depositRates: mapValues(snapshot.deposit_rates, (value) =>\n removeDecimals(value),\n ),\n fundingRates: mapValues(snapshot.funding_rates, (value) =>\n removeDecimals(value),\n ),\n openInterestsQuote: mapValues(snapshot.open_interests, toBigDecimal),\n totalBorrows: mapValues(snapshot.total_borrows, toBigDecimal),\n totalDeposits: mapValues(snapshot.total_deposits, toBigDecimal),\n cumulativeTradeSizes: mapValues(\n snapshot.cumulative_trade_sizes,\n toBigDecimal,\n ),\n cumulativeInflows: mapValues(snapshot.cumulative_inflows, toBigDecimal),\n cumulativeOutflows: mapValues(snapshot.cumulative_outflows, toBigDecimal),\n oraclePrices: mapValues(snapshot.oracle_prices, (value) =>\n removeDecimals(value),\n ),\n };\n}\n\nexport function mapIndexerNlpSnapshot(\n snapshot: IndexerServerNlpSnapshot,\n): IndexerNlpSnapshot {\n return {\n submissionIndex: snapshot.submission_idx,\n timestamp: toBigDecimal(snapshot.timestamp),\n cumulativeBurnAmountUsdc: toBigDecimal(snapshot.cumulative_burn_usdc),\n cumulativeMintAmountUsdc: toBigDecimal(snapshot.cumulative_mint_usdc),\n cumulativePnl: toBigDecimal(snapshot.cumulative_pnl),\n cumulativeTrades: toBigDecimal(snapshot.cumulative_trades),\n cumulativeVolume: toBigDecimal(snapshot.cumulative_volume),\n depositors: toBigDecimal(snapshot.depositors),\n oraclePrice: removeDecimals(snapshot.oracle_price_x18),\n tvl: toBigDecimal(snapshot.tvl),\n };\n}\n"],"mappings":"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","names":[]}
|