@metamask-previews/money-account-api-data-service 0.4.0-preview-c2ef75d18 → 0.4.0-preview-e81fe8853

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
10
10
  ### Changed
11
11
 
12
12
  - Bump `@metamask/superstruct` from `^3.1.0` to `^3.4.1` ([#9754](https://github.com/MetaMask/core/pull/9754))
13
+ - Bump `@tanstack/query-core` from `^4.43.0` to `^5.62.16` ([#9712](https://github.com/MetaMask/core/pull/9712))
13
14
 
14
15
  ## [0.4.0]
15
16
 
@@ -181,6 +181,7 @@ class MoneyAccountApiDataService extends base_data_service_1.BaseDataService {
181
181
  options?.chainId ?? null,
182
182
  options?.limit ?? null,
183
183
  ],
184
+ initialPageParam: null,
184
185
  staleTime: constants_js_1.DEFAULT_STALE_TIME_MS,
185
186
  queryFn: async (context) => {
186
187
  const cursor = context.pageParam;
@@ -215,6 +216,7 @@ class MoneyAccountApiDataService extends base_data_service_1.BaseDataService {
215
216
  return validated;
216
217
  });
217
218
  },
219
+ getNextPageParam: (lastPage) => lastPage.next_cursor,
218
220
  }, options?.cursor ?? undefined);
219
221
  }
220
222
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"money-account-api-data-service.cjs","sourceRoot":"","sources":["../src/money-account-api-data-service.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n DataServiceCacheUpdatedEvent,\n DataServiceGranularCacheUpdatedEvent,\n DataServiceInvalidateQueriesAction,\n} from '@metamask/base-data-service';\nimport { BaseDataService } from '@metamask/base-data-service';\nimport type {\n CreateServicePolicyOptions,\n TraceContext,\n TraceRequest,\n} from '@metamask/controller-utils';\nimport { handleWhen, HttpError } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport { validate } from '@metamask/superstruct';\nimport type { Json } from '@metamask/utils';\nimport type { QueryClientConfig } from '@tanstack/query-core';\n\nimport {\n DEFAULT_STALE_TIME_MS,\n Env,\n MONEY_ACCOUNT_API_URL_MAP,\n RATE_HISTORY_STALE_TIME_MS,\n} from './constants.js';\nimport { MoneyAccountApiResponseValidationError } from './errors.js';\nimport { projectLogger, createModuleLogger } from './logger.js';\nimport type { MoneyAccountApiDataServiceMethodActions } from './money-account-api-data-service-method-action-types.js';\nimport type {\n HistoryResponse,\n InterestResponse,\n PositionResponse,\n RateHistoryResponse,\n} from './response.types';\nimport {\n HistoryResponseStruct,\n InterestResponseStruct,\n PositionResponseStruct,\n RateHistoryResponseStruct,\n} from './structs.js';\nimport type {\n HistoryOptions,\n InterestOptions,\n RateHistoryOptions,\n} from './types.js';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link MoneyAccountApiDataService}, used to namespace the\n * service's actions and events.\n */\nexport const serviceName = 'MoneyAccountApiDataService';\n\nconst log = createModuleLogger(projectLogger, serviceName);\nconst traceLogger = createModuleLogger(projectLogger, 'trace');\n\nexport const TRACES = {\n POSITIONS_API: 'Money Account API Fetch Positions',\n INTEREST_API: 'Money Account API Fetch Interest',\n HISTORY_API: 'Money Account API Fetch History',\n RATE_HISTORY_API: 'Money Account API Fetch Rate History',\n} as const;\n\nexport type MoneyAccountApiDataServiceTraceName =\n (typeof TRACES)[keyof typeof TRACES];\n\nexport type MoneyAccountApiDataServiceTraceRequest = Omit<\n TraceRequest,\n 'name'\n> & {\n name: MoneyAccountApiDataServiceTraceName;\n startTime?: number;\n};\n\nexport type MoneyAccountApiDataServiceTraceCallback = <ReturnType>(\n request: MoneyAccountApiDataServiceTraceRequest,\n fn?: (context?: TraceContext) => ReturnType,\n) => Promise<ReturnType>;\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'fetchPositions',\n 'fetchInterest',\n 'fetchHistory',\n 'fetchRateHistory',\n] as const;\n\n/**\n * Invalidates cached queries for {@link MoneyAccountApiDataService}.\n */\nexport type MoneyAccountApiDataServiceInvalidateQueriesAction =\n DataServiceInvalidateQueriesAction<typeof serviceName>;\n\n/**\n * Actions that {@link MoneyAccountApiDataService} exposes to other consumers.\n */\nexport type MoneyAccountApiDataServiceActions =\n | MoneyAccountApiDataServiceMethodActions\n | MoneyAccountApiDataServiceInvalidateQueriesAction;\n\n/**\n * Actions from other messengers that {@link MoneyAccountApiDataService} calls.\n */\ntype AuthenticationControllerGetBearerTokenAction = {\n type: 'AuthenticationController:getBearerToken';\n handler: (entropySourceId?: string) => Promise<string>;\n};\n\ntype AllowedActions = AuthenticationControllerGetBearerTokenAction;\n\n/**\n * Published when {@link MoneyAccountApiDataService}'s cache is updated.\n */\nexport type MoneyAccountApiDataServiceCacheUpdatedEvent =\n DataServiceCacheUpdatedEvent<typeof serviceName>;\n\n/**\n * Published when a key within {@link MoneyAccountApiDataService}'s cache is\n * updated.\n */\nexport type MoneyAccountApiDataServiceGranularCacheUpdatedEvent =\n DataServiceGranularCacheUpdatedEvent<typeof serviceName>;\n\n/**\n * Events that {@link MoneyAccountApiDataService} exposes to other consumers.\n */\nexport type MoneyAccountApiDataServiceEvents =\n | MoneyAccountApiDataServiceCacheUpdatedEvent\n | MoneyAccountApiDataServiceGranularCacheUpdatedEvent;\n\n/**\n * Events from other messengers that {@link MoneyAccountApiDataService}\n * subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link MoneyAccountApiDataService}.\n */\nexport type MoneyAccountApiDataServiceMessenger = Messenger<\n typeof serviceName,\n MoneyAccountApiDataServiceActions | AllowedActions,\n MoneyAccountApiDataServiceEvents | AllowedEvents\n>;\n\n// === SERVICE DEFINITION ===\n\nexport type MoneyAccountApiDataServiceOptions = {\n messenger: MoneyAccountApiDataServiceMessenger;\n env?: Env;\n queryClientConfig?: QueryClientConfig;\n policyOptions?: CreateServicePolicyOptions;\n trace?: MoneyAccountApiDataServiceTraceCallback;\n};\n\n/**\n * Data service responsible for fetching positions, interest, cash-flow\n * history, and vault rate history from the Money Account APY Tracking API.\n */\nexport class MoneyAccountApiDataService extends BaseDataService<\n typeof serviceName,\n MoneyAccountApiDataServiceMessenger\n> {\n readonly #baseUrl: string;\n\n readonly #trace: MoneyAccountApiDataServiceTraceCallback;\n\n /**\n * Constructs a new MoneyAccountApiDataService.\n *\n * @param options - The constructor arguments.\n * @param options.messenger - The messenger suited for this service.\n * @param options.env - The target environment. Defaults to production.\n * @param options.queryClientConfig - Configuration for the underlying\n * TanStack Query client.\n * @param options.policyOptions - Options to pass to `createServicePolicy`.\n * @param options.trace - Optional callback to trace network requests.\n */\n constructor({\n messenger,\n env = Env.PRD,\n queryClientConfig = {},\n policyOptions = {},\n trace,\n }: MoneyAccountApiDataServiceOptions) {\n super({\n name: serviceName,\n messenger,\n queryClientConfig,\n policyOptions: {\n retryFilterPolicy: handleWhen(\n (error) =>\n !(error instanceof MoneyAccountApiResponseValidationError) &&\n !(error instanceof HttpError && error.httpStatus === 403),\n ),\n ...policyOptions,\n },\n });\n\n this.#baseUrl = MONEY_ACCOUNT_API_URL_MAP[env];\n\n this.#trace =\n trace ??\n (async <Result>(\n _request: MoneyAccountApiDataServiceTraceRequest,\n fn?: (context?: TraceContext) => Result,\n ): Promise<Result> => {\n return await Promise.resolve(fn?.() as Result);\n });\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n log('Initialized', { env, baseUrl: this.#baseUrl });\n }\n\n /**\n * Builds best-effort authentication headers for a Money Account API request.\n *\n * Requests proceed without authentication when the wallet is locked, the\n * user is signed out, or the token is otherwise unavailable. The API edge\n * rate limiter falls back to IP-based limiting when the header is omitted.\n *\n * @returns The Authorization header when a profile token is available.\n */\n async #getRequestHeaders(): Promise<Record<string, string>> {\n try {\n const token = await this.messenger.call(\n 'AuthenticationController:getBearerToken',\n );\n return token ? { Authorization: `Bearer ${token}` } : {};\n } catch (error: unknown) {\n log('Auth token unavailable, proceeding unauthenticated', error);\n return {};\n }\n }\n\n /**\n * Fetches the current vault positions for a given user address.\n *\n * @param address - The user's Ethereum address.\n * @returns The position response containing vault positions and an optional\n * `balance` summary (`null` when the API balance path is unavailable).\n */\n async fetchPositions(address: string): Promise<PositionResponse> {\n const url = new URL(\n `/v1/positions/${address.toLowerCase()}`,\n this.#baseUrl,\n );\n\n return this.fetchQuery({\n queryKey: [`${this.name}:fetchPositions`, address.toLowerCase()],\n staleTime: DEFAULT_STALE_TIME_MS,\n queryFn: async () => {\n return this.#traceNetworkRequest(\n {\n name: TRACES.POSITIONS_API,\n data: { operation: 'fetchPositions' },\n },\n async () => {\n const response = await fetch(url, {\n headers: await this.#getRequestHeaders(),\n });\n\n if (!response.ok) {\n throw new HttpError(\n response.status,\n `Money Account API positions request failed with status '${response.status}'`,\n );\n }\n\n const json: Json = await response.json();\n\n const [error, validated] = validate(json, PositionResponseStruct);\n if (error) {\n throw new MoneyAccountApiResponseValidationError(\n `Malformed response from positions endpoint: ${error.message}`,\n );\n }\n\n return validated as unknown as PositionResponse;\n },\n );\n },\n });\n }\n\n /**\n * Fetches the interest earned for a given address and vault over a\n * specified time window.\n *\n * @param address - The user's Ethereum address.\n * @param options - Options specifying vault, window, and optional chain ID.\n * @returns The interest response.\n */\n async fetchInterest(\n address: string,\n options: InterestOptions,\n ): Promise<InterestResponse> {\n const url = new URL(\n `/v1/positions/${address.toLowerCase()}/interest`,\n this.#baseUrl,\n );\n url.searchParams.append(\n 'vault_address',\n options.vaultAddress.toLowerCase(),\n );\n url.searchParams.append('window', options.window);\n if (options.chainId !== undefined) {\n url.searchParams.append('chain_id', String(options.chainId));\n }\n\n return this.fetchQuery({\n queryKey: [\n `${this.name}:fetchInterest`,\n address.toLowerCase(),\n options.vaultAddress.toLowerCase(),\n options.window,\n ...(options.chainId === undefined ? [] : [options.chainId]),\n ],\n staleTime: DEFAULT_STALE_TIME_MS,\n queryFn: async () => {\n return this.#traceNetworkRequest(\n {\n name: TRACES.INTEREST_API,\n data: { operation: 'fetchInterest' },\n },\n async () => {\n const response = await fetch(url, {\n headers: await this.#getRequestHeaders(),\n });\n\n if (!response.ok) {\n throw new HttpError(\n response.status,\n `Money Account API interest request failed with status '${response.status}'`,\n );\n }\n\n const json: Json = await response.json();\n\n const [error, validated] = validate(json, InterestResponseStruct);\n if (error) {\n throw new MoneyAccountApiResponseValidationError(\n `Malformed response from interest endpoint: ${error.message}`,\n );\n }\n\n return validated as unknown as InterestResponse;\n },\n );\n },\n });\n }\n\n /**\n * Fetches cursor-paginated cash-flow history for a given address.\n * Uses `fetchInfiniteQuery` for proper TanStack Query pagination semantics.\n *\n * When paginating, consumers must re-pass the same filter options\n * (`vaultAddress`, `chainId`, `limit`) alongside `cursor` on every page\n * request. This ensures the query key matches the original infinite query\n * and that the HTTP request includes the correct filters.\n *\n * @param address - The user's Ethereum address.\n * @param options - Optional filtering and pagination options.\n * @returns The history response containing cash-flow entries for the requested page.\n */\n async fetchHistory(\n address: string,\n options?: HistoryOptions,\n ): Promise<HistoryResponse> {\n const normalizedAddress = address.toLowerCase();\n const normalizedVault = options?.vaultAddress?.toLowerCase() ?? null;\n\n return this.fetchInfiniteQuery(\n {\n queryKey: [\n `${this.name}:fetchHistory`,\n normalizedAddress,\n normalizedVault,\n options?.chainId ?? null,\n options?.limit ?? null,\n ],\n staleTime: DEFAULT_STALE_TIME_MS,\n queryFn: async (context) => {\n const cursor = context.pageParam as string | null | undefined;\n\n const url = new URL(\n `/v1/positions/${normalizedAddress}/history`,\n this.#baseUrl,\n );\n if (normalizedVault) {\n url.searchParams.append('vault_address', normalizedVault);\n }\n if (options?.chainId !== undefined) {\n url.searchParams.append('chain_id', String(options.chainId));\n }\n if (cursor) {\n url.searchParams.append('cursor', cursor);\n }\n if (options?.limit !== undefined) {\n url.searchParams.append('limit', String(options.limit));\n }\n\n return this.#traceNetworkRequest(\n {\n name: TRACES.HISTORY_API,\n data: { operation: 'fetchHistory' },\n },\n async () => {\n const response = await fetch(url, {\n headers: await this.#getRequestHeaders(),\n });\n\n if (!response.ok) {\n throw new HttpError(\n response.status,\n `Money Account API history request failed with status '${response.status}'`,\n );\n }\n\n const json: Json = await response.json();\n\n const [error, validated] = validate(json, HistoryResponseStruct);\n if (error) {\n throw new MoneyAccountApiResponseValidationError(\n `Malformed response from history endpoint: ${error.message}`,\n );\n }\n\n return validated as unknown as HistoryResponse;\n },\n );\n },\n },\n options?.cursor ?? undefined,\n );\n }\n\n /**\n * Fetches the exchange-rate time series for a given vault.\n *\n * @param vaultAddress - The vault's Ethereum address.\n * @param options - Optional range and chain ID filters.\n * @returns The rate history response.\n */\n async fetchRateHistory(\n vaultAddress: string,\n options?: RateHistoryOptions,\n ): Promise<RateHistoryResponse> {\n const url = new URL(\n `/v1/vaults/${vaultAddress.toLowerCase()}/rate-history`,\n this.#baseUrl,\n );\n if (options?.chainId !== undefined) {\n url.searchParams.append('chain_id', String(options.chainId));\n }\n if (options?.from) {\n url.searchParams.append('from', options.from);\n }\n if (options?.to) {\n url.searchParams.append('to', options.to);\n }\n\n return this.fetchQuery({\n queryKey: [\n `${this.name}:fetchRateHistory`,\n vaultAddress.toLowerCase(),\n ...(options?.chainId === undefined ? [null] : [options.chainId]),\n ...(options?.from ? [options.from] : [null]),\n ...(options?.to ? [options.to] : [null]),\n ],\n staleTime: RATE_HISTORY_STALE_TIME_MS,\n queryFn: async () => {\n return this.#traceNetworkRequest(\n {\n name: TRACES.RATE_HISTORY_API,\n data: { operation: 'fetchRateHistory' },\n },\n async () => {\n const response = await fetch(url, {\n headers: await this.#getRequestHeaders(),\n });\n\n if (!response.ok) {\n throw new HttpError(\n response.status,\n `Money Account API rate-history request failed with status '${response.status}'`,\n );\n }\n\n const json: Json = await response.json();\n\n const [error, validated] = validate(\n json,\n RateHistoryResponseStruct,\n );\n if (error) {\n throw new MoneyAccountApiResponseValidationError(\n `Malformed response from rate-history endpoint: ${error.message}`,\n );\n }\n\n return validated as unknown as RateHistoryResponse;\n },\n );\n },\n });\n }\n\n /**\n * Runs a network request and emits a best-effort backdated trace.\n *\n * @param request - Trace metadata for the network request.\n * @param fn - Network request to execute.\n * @returns The network request result.\n */\n async #traceNetworkRequest<Result>(\n request: MoneyAccountApiDataServiceTraceRequest,\n fn: () => Promise<Result>,\n ): Promise<Result> {\n const startTime = Date.now();\n let success = false;\n let errorName: string | undefined;\n\n try {\n const result = await fn();\n success = true;\n return result;\n } catch (error) {\n errorName = error instanceof Error ? error.name : typeof error;\n throw error;\n } finally {\n const traceRequest = {\n ...request,\n startTime,\n data: {\n ...request.data,\n success,\n ...(errorName ? { errorName } : {}),\n },\n };\n const onTraceError = (traceError: unknown): void => {\n traceLogger('Failed to emit trace', {\n traceName: request.name,\n traceError,\n });\n };\n\n try {\n Promise.resolve(this.#trace(traceRequest, () => undefined)).catch(\n onTraceError,\n );\n } catch (traceError) {\n onTraceError(traceError);\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"money-account-api-data-service.cjs","sourceRoot":"","sources":["../src/money-account-api-data-service.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n DataServiceCacheUpdatedEvent,\n DataServiceGranularCacheUpdatedEvent,\n DataServiceInvalidateQueriesAction,\n} from '@metamask/base-data-service';\nimport { BaseDataService } from '@metamask/base-data-service';\nimport type {\n CreateServicePolicyOptions,\n TraceContext,\n TraceRequest,\n} from '@metamask/controller-utils';\nimport { handleWhen, HttpError } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport { validate } from '@metamask/superstruct';\nimport type { Json } from '@metamask/utils';\nimport type { QueryClientConfig } from '@tanstack/query-core';\n\nimport {\n DEFAULT_STALE_TIME_MS,\n Env,\n MONEY_ACCOUNT_API_URL_MAP,\n RATE_HISTORY_STALE_TIME_MS,\n} from './constants.js';\nimport { MoneyAccountApiResponseValidationError } from './errors.js';\nimport { projectLogger, createModuleLogger } from './logger.js';\nimport type { MoneyAccountApiDataServiceMethodActions } from './money-account-api-data-service-method-action-types.js';\nimport type {\n HistoryResponse,\n InterestResponse,\n PositionResponse,\n RateHistoryResponse,\n} from './response.types';\nimport {\n HistoryResponseStruct,\n InterestResponseStruct,\n PositionResponseStruct,\n RateHistoryResponseStruct,\n} from './structs.js';\nimport type {\n HistoryOptions,\n InterestOptions,\n RateHistoryOptions,\n} from './types.js';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link MoneyAccountApiDataService}, used to namespace the\n * service's actions and events.\n */\nexport const serviceName = 'MoneyAccountApiDataService';\n\nconst log = createModuleLogger(projectLogger, serviceName);\nconst traceLogger = createModuleLogger(projectLogger, 'trace');\n\nexport const TRACES = {\n POSITIONS_API: 'Money Account API Fetch Positions',\n INTEREST_API: 'Money Account API Fetch Interest',\n HISTORY_API: 'Money Account API Fetch History',\n RATE_HISTORY_API: 'Money Account API Fetch Rate History',\n} as const;\n\nexport type MoneyAccountApiDataServiceTraceName =\n (typeof TRACES)[keyof typeof TRACES];\n\nexport type MoneyAccountApiDataServiceTraceRequest = Omit<\n TraceRequest,\n 'name'\n> & {\n name: MoneyAccountApiDataServiceTraceName;\n startTime?: number;\n};\n\nexport type MoneyAccountApiDataServiceTraceCallback = <ReturnType>(\n request: MoneyAccountApiDataServiceTraceRequest,\n fn?: (context?: TraceContext) => ReturnType,\n) => Promise<ReturnType>;\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'fetchPositions',\n 'fetchInterest',\n 'fetchHistory',\n 'fetchRateHistory',\n] as const;\n\n/**\n * Invalidates cached queries for {@link MoneyAccountApiDataService}.\n */\nexport type MoneyAccountApiDataServiceInvalidateQueriesAction =\n DataServiceInvalidateQueriesAction<typeof serviceName>;\n\n/**\n * Actions that {@link MoneyAccountApiDataService} exposes to other consumers.\n */\nexport type MoneyAccountApiDataServiceActions =\n | MoneyAccountApiDataServiceMethodActions\n | MoneyAccountApiDataServiceInvalidateQueriesAction;\n\n/**\n * Actions from other messengers that {@link MoneyAccountApiDataService} calls.\n */\ntype AuthenticationControllerGetBearerTokenAction = {\n type: 'AuthenticationController:getBearerToken';\n handler: (entropySourceId?: string) => Promise<string>;\n};\n\ntype AllowedActions = AuthenticationControllerGetBearerTokenAction;\n\n/**\n * Published when {@link MoneyAccountApiDataService}'s cache is updated.\n */\nexport type MoneyAccountApiDataServiceCacheUpdatedEvent =\n DataServiceCacheUpdatedEvent<typeof serviceName>;\n\n/**\n * Published when a key within {@link MoneyAccountApiDataService}'s cache is\n * updated.\n */\nexport type MoneyAccountApiDataServiceGranularCacheUpdatedEvent =\n DataServiceGranularCacheUpdatedEvent<typeof serviceName>;\n\n/**\n * Events that {@link MoneyAccountApiDataService} exposes to other consumers.\n */\nexport type MoneyAccountApiDataServiceEvents =\n | MoneyAccountApiDataServiceCacheUpdatedEvent\n | MoneyAccountApiDataServiceGranularCacheUpdatedEvent;\n\n/**\n * Events from other messengers that {@link MoneyAccountApiDataService}\n * subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link MoneyAccountApiDataService}.\n */\nexport type MoneyAccountApiDataServiceMessenger = Messenger<\n typeof serviceName,\n MoneyAccountApiDataServiceActions | AllowedActions,\n MoneyAccountApiDataServiceEvents | AllowedEvents\n>;\n\n// === SERVICE DEFINITION ===\n\nexport type MoneyAccountApiDataServiceOptions = {\n messenger: MoneyAccountApiDataServiceMessenger;\n env?: Env;\n queryClientConfig?: QueryClientConfig;\n policyOptions?: CreateServicePolicyOptions;\n trace?: MoneyAccountApiDataServiceTraceCallback;\n};\n\n/**\n * Data service responsible for fetching positions, interest, cash-flow\n * history, and vault rate history from the Money Account APY Tracking API.\n */\nexport class MoneyAccountApiDataService extends BaseDataService<\n typeof serviceName,\n MoneyAccountApiDataServiceMessenger\n> {\n readonly #baseUrl: string;\n\n readonly #trace: MoneyAccountApiDataServiceTraceCallback;\n\n /**\n * Constructs a new MoneyAccountApiDataService.\n *\n * @param options - The constructor arguments.\n * @param options.messenger - The messenger suited for this service.\n * @param options.env - The target environment. Defaults to production.\n * @param options.queryClientConfig - Configuration for the underlying\n * TanStack Query client.\n * @param options.policyOptions - Options to pass to `createServicePolicy`.\n * @param options.trace - Optional callback to trace network requests.\n */\n constructor({\n messenger,\n env = Env.PRD,\n queryClientConfig = {},\n policyOptions = {},\n trace,\n }: MoneyAccountApiDataServiceOptions) {\n super({\n name: serviceName,\n messenger,\n queryClientConfig,\n policyOptions: {\n retryFilterPolicy: handleWhen(\n (error) =>\n !(error instanceof MoneyAccountApiResponseValidationError) &&\n !(error instanceof HttpError && error.httpStatus === 403),\n ),\n ...policyOptions,\n },\n });\n\n this.#baseUrl = MONEY_ACCOUNT_API_URL_MAP[env];\n\n this.#trace =\n trace ??\n (async <Result>(\n _request: MoneyAccountApiDataServiceTraceRequest,\n fn?: (context?: TraceContext) => Result,\n ): Promise<Result> => {\n return await Promise.resolve(fn?.() as Result);\n });\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n log('Initialized', { env, baseUrl: this.#baseUrl });\n }\n\n /**\n * Builds best-effort authentication headers for a Money Account API request.\n *\n * Requests proceed without authentication when the wallet is locked, the\n * user is signed out, or the token is otherwise unavailable. The API edge\n * rate limiter falls back to IP-based limiting when the header is omitted.\n *\n * @returns The Authorization header when a profile token is available.\n */\n async #getRequestHeaders(): Promise<Record<string, string>> {\n try {\n const token = await this.messenger.call(\n 'AuthenticationController:getBearerToken',\n );\n return token ? { Authorization: `Bearer ${token}` } : {};\n } catch (error: unknown) {\n log('Auth token unavailable, proceeding unauthenticated', error);\n return {};\n }\n }\n\n /**\n * Fetches the current vault positions for a given user address.\n *\n * @param address - The user's Ethereum address.\n * @returns The position response containing vault positions and an optional\n * `balance` summary (`null` when the API balance path is unavailable).\n */\n async fetchPositions(address: string): Promise<PositionResponse> {\n const url = new URL(\n `/v1/positions/${address.toLowerCase()}`,\n this.#baseUrl,\n );\n\n return this.fetchQuery({\n queryKey: [`${this.name}:fetchPositions`, address.toLowerCase()],\n staleTime: DEFAULT_STALE_TIME_MS,\n queryFn: async () => {\n return this.#traceNetworkRequest(\n {\n name: TRACES.POSITIONS_API,\n data: { operation: 'fetchPositions' },\n },\n async () => {\n const response = await fetch(url, {\n headers: await this.#getRequestHeaders(),\n });\n\n if (!response.ok) {\n throw new HttpError(\n response.status,\n `Money Account API positions request failed with status '${response.status}'`,\n );\n }\n\n const json: Json = await response.json();\n\n const [error, validated] = validate(json, PositionResponseStruct);\n if (error) {\n throw new MoneyAccountApiResponseValidationError(\n `Malformed response from positions endpoint: ${error.message}`,\n );\n }\n\n return validated as unknown as PositionResponse;\n },\n );\n },\n });\n }\n\n /**\n * Fetches the interest earned for a given address and vault over a\n * specified time window.\n *\n * @param address - The user's Ethereum address.\n * @param options - Options specifying vault, window, and optional chain ID.\n * @returns The interest response.\n */\n async fetchInterest(\n address: string,\n options: InterestOptions,\n ): Promise<InterestResponse> {\n const url = new URL(\n `/v1/positions/${address.toLowerCase()}/interest`,\n this.#baseUrl,\n );\n url.searchParams.append(\n 'vault_address',\n options.vaultAddress.toLowerCase(),\n );\n url.searchParams.append('window', options.window);\n if (options.chainId !== undefined) {\n url.searchParams.append('chain_id', String(options.chainId));\n }\n\n return this.fetchQuery({\n queryKey: [\n `${this.name}:fetchInterest`,\n address.toLowerCase(),\n options.vaultAddress.toLowerCase(),\n options.window,\n ...(options.chainId === undefined ? [] : [options.chainId]),\n ],\n staleTime: DEFAULT_STALE_TIME_MS,\n queryFn: async () => {\n return this.#traceNetworkRequest(\n {\n name: TRACES.INTEREST_API,\n data: { operation: 'fetchInterest' },\n },\n async () => {\n const response = await fetch(url, {\n headers: await this.#getRequestHeaders(),\n });\n\n if (!response.ok) {\n throw new HttpError(\n response.status,\n `Money Account API interest request failed with status '${response.status}'`,\n );\n }\n\n const json: Json = await response.json();\n\n const [error, validated] = validate(json, InterestResponseStruct);\n if (error) {\n throw new MoneyAccountApiResponseValidationError(\n `Malformed response from interest endpoint: ${error.message}`,\n );\n }\n\n return validated as unknown as InterestResponse;\n },\n );\n },\n });\n }\n\n /**\n * Fetches cursor-paginated cash-flow history for a given address.\n * Uses `fetchInfiniteQuery` for proper TanStack Query pagination semantics.\n *\n * When paginating, consumers must re-pass the same filter options\n * (`vaultAddress`, `chainId`, `limit`) alongside `cursor` on every page\n * request. This ensures the query key matches the original infinite query\n * and that the HTTP request includes the correct filters.\n *\n * @param address - The user's Ethereum address.\n * @param options - Optional filtering and pagination options.\n * @returns The history response containing cash-flow entries for the requested page.\n */\n async fetchHistory(\n address: string,\n options?: HistoryOptions,\n ): Promise<HistoryResponse> {\n const normalizedAddress = address.toLowerCase();\n const normalizedVault = options?.vaultAddress?.toLowerCase() ?? null;\n\n return this.fetchInfiniteQuery(\n {\n queryKey: [\n `${this.name}:fetchHistory`,\n normalizedAddress,\n normalizedVault,\n options?.chainId ?? null,\n options?.limit ?? null,\n ],\n initialPageParam: null,\n staleTime: DEFAULT_STALE_TIME_MS,\n queryFn: async (context) => {\n const cursor = context.pageParam as string | null | undefined;\n\n const url = new URL(\n `/v1/positions/${normalizedAddress}/history`,\n this.#baseUrl,\n );\n if (normalizedVault) {\n url.searchParams.append('vault_address', normalizedVault);\n }\n if (options?.chainId !== undefined) {\n url.searchParams.append('chain_id', String(options.chainId));\n }\n if (cursor) {\n url.searchParams.append('cursor', cursor);\n }\n if (options?.limit !== undefined) {\n url.searchParams.append('limit', String(options.limit));\n }\n\n return this.#traceNetworkRequest(\n {\n name: TRACES.HISTORY_API,\n data: { operation: 'fetchHistory' },\n },\n async () => {\n const response = await fetch(url, {\n headers: await this.#getRequestHeaders(),\n });\n\n if (!response.ok) {\n throw new HttpError(\n response.status,\n `Money Account API history request failed with status '${response.status}'`,\n );\n }\n\n const json: Json = await response.json();\n\n const [error, validated] = validate(json, HistoryResponseStruct);\n if (error) {\n throw new MoneyAccountApiResponseValidationError(\n `Malformed response from history endpoint: ${error.message}`,\n );\n }\n\n return validated as unknown as HistoryResponse;\n },\n );\n },\n getNextPageParam: (lastPage) => lastPage.next_cursor,\n },\n options?.cursor ?? undefined,\n );\n }\n\n /**\n * Fetches the exchange-rate time series for a given vault.\n *\n * @param vaultAddress - The vault's Ethereum address.\n * @param options - Optional range and chain ID filters.\n * @returns The rate history response.\n */\n async fetchRateHistory(\n vaultAddress: string,\n options?: RateHistoryOptions,\n ): Promise<RateHistoryResponse> {\n const url = new URL(\n `/v1/vaults/${vaultAddress.toLowerCase()}/rate-history`,\n this.#baseUrl,\n );\n if (options?.chainId !== undefined) {\n url.searchParams.append('chain_id', String(options.chainId));\n }\n if (options?.from) {\n url.searchParams.append('from', options.from);\n }\n if (options?.to) {\n url.searchParams.append('to', options.to);\n }\n\n return this.fetchQuery({\n queryKey: [\n `${this.name}:fetchRateHistory`,\n vaultAddress.toLowerCase(),\n ...(options?.chainId === undefined ? [null] : [options.chainId]),\n ...(options?.from ? [options.from] : [null]),\n ...(options?.to ? [options.to] : [null]),\n ],\n staleTime: RATE_HISTORY_STALE_TIME_MS,\n queryFn: async () => {\n return this.#traceNetworkRequest(\n {\n name: TRACES.RATE_HISTORY_API,\n data: { operation: 'fetchRateHistory' },\n },\n async () => {\n const response = await fetch(url, {\n headers: await this.#getRequestHeaders(),\n });\n\n if (!response.ok) {\n throw new HttpError(\n response.status,\n `Money Account API rate-history request failed with status '${response.status}'`,\n );\n }\n\n const json: Json = await response.json();\n\n const [error, validated] = validate(\n json,\n RateHistoryResponseStruct,\n );\n if (error) {\n throw new MoneyAccountApiResponseValidationError(\n `Malformed response from rate-history endpoint: ${error.message}`,\n );\n }\n\n return validated as unknown as RateHistoryResponse;\n },\n );\n },\n });\n }\n\n /**\n * Runs a network request and emits a best-effort backdated trace.\n *\n * @param request - Trace metadata for the network request.\n * @param fn - Network request to execute.\n * @returns The network request result.\n */\n async #traceNetworkRequest<Result>(\n request: MoneyAccountApiDataServiceTraceRequest,\n fn: () => Promise<Result>,\n ): Promise<Result> {\n const startTime = Date.now();\n let success = false;\n let errorName: string | undefined;\n\n try {\n const result = await fn();\n success = true;\n return result;\n } catch (error) {\n errorName = error instanceof Error ? error.name : typeof error;\n throw error;\n } finally {\n const traceRequest = {\n ...request,\n startTime,\n data: {\n ...request.data,\n success,\n ...(errorName ? { errorName } : {}),\n },\n };\n const onTraceError = (traceError: unknown): void => {\n traceLogger('Failed to emit trace', {\n traceName: request.name,\n traceError,\n });\n };\n\n try {\n Promise.resolve(this.#trace(traceRequest, () => undefined)).catch(\n onTraceError,\n );\n } catch (traceError) {\n onTraceError(traceError);\n }\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"money-account-api-data-service.d.cts","sourceRoot":"","sources":["../src/money-account-api-data-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"money-account-api-data-service.d.cts","sourceRoot":"","sources":["../src/money-account-api-data-service.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"money-account-api-data-service.d.mts","sourceRoot":"","sources":["../src/money-account-api-data-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"money-account-api-data-service.d.mts","sourceRoot":"","sources":["../src/money-account-api-data-service.ts"],"names":[],"mappings":"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"}
@@ -178,6 +178,7 @@ export class MoneyAccountApiDataService extends BaseDataService {
178
178
  options?.chainId ?? null,
179
179
  options?.limit ?? null,
180
180
  ],
181
+ initialPageParam: null,
181
182
  staleTime: DEFAULT_STALE_TIME_MS,
182
183
  queryFn: async (context) => {
183
184
  const cursor = context.pageParam;
@@ -212,6 +213,7 @@ export class MoneyAccountApiDataService extends BaseDataService {
212
213
  return validated;
213
214
  });
214
215
  },
216
+ getNextPageParam: (lastPage) => lastPage.next_cursor,
215
217
  }, options?.cursor ?? undefined);
216
218
  }
217
219
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"money-account-api-data-service.mjs","sourceRoot":"","sources":["../src/money-account-api-data-service.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n DataServiceCacheUpdatedEvent,\n DataServiceGranularCacheUpdatedEvent,\n DataServiceInvalidateQueriesAction,\n} from '@metamask/base-data-service';\nimport { BaseDataService } from '@metamask/base-data-service';\nimport type {\n CreateServicePolicyOptions,\n TraceContext,\n TraceRequest,\n} from '@metamask/controller-utils';\nimport { handleWhen, HttpError } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport { validate } from '@metamask/superstruct';\nimport type { Json } from '@metamask/utils';\nimport type { QueryClientConfig } from '@tanstack/query-core';\n\nimport {\n DEFAULT_STALE_TIME_MS,\n Env,\n MONEY_ACCOUNT_API_URL_MAP,\n RATE_HISTORY_STALE_TIME_MS,\n} from './constants.js';\nimport { MoneyAccountApiResponseValidationError } from './errors.js';\nimport { projectLogger, createModuleLogger } from './logger.js';\nimport type { MoneyAccountApiDataServiceMethodActions } from './money-account-api-data-service-method-action-types.js';\nimport type {\n HistoryResponse,\n InterestResponse,\n PositionResponse,\n RateHistoryResponse,\n} from './response.types';\nimport {\n HistoryResponseStruct,\n InterestResponseStruct,\n PositionResponseStruct,\n RateHistoryResponseStruct,\n} from './structs.js';\nimport type {\n HistoryOptions,\n InterestOptions,\n RateHistoryOptions,\n} from './types.js';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link MoneyAccountApiDataService}, used to namespace the\n * service's actions and events.\n */\nexport const serviceName = 'MoneyAccountApiDataService';\n\nconst log = createModuleLogger(projectLogger, serviceName);\nconst traceLogger = createModuleLogger(projectLogger, 'trace');\n\nexport const TRACES = {\n POSITIONS_API: 'Money Account API Fetch Positions',\n INTEREST_API: 'Money Account API Fetch Interest',\n HISTORY_API: 'Money Account API Fetch History',\n RATE_HISTORY_API: 'Money Account API Fetch Rate History',\n} as const;\n\nexport type MoneyAccountApiDataServiceTraceName =\n (typeof TRACES)[keyof typeof TRACES];\n\nexport type MoneyAccountApiDataServiceTraceRequest = Omit<\n TraceRequest,\n 'name'\n> & {\n name: MoneyAccountApiDataServiceTraceName;\n startTime?: number;\n};\n\nexport type MoneyAccountApiDataServiceTraceCallback = <ReturnType>(\n request: MoneyAccountApiDataServiceTraceRequest,\n fn?: (context?: TraceContext) => ReturnType,\n) => Promise<ReturnType>;\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'fetchPositions',\n 'fetchInterest',\n 'fetchHistory',\n 'fetchRateHistory',\n] as const;\n\n/**\n * Invalidates cached queries for {@link MoneyAccountApiDataService}.\n */\nexport type MoneyAccountApiDataServiceInvalidateQueriesAction =\n DataServiceInvalidateQueriesAction<typeof serviceName>;\n\n/**\n * Actions that {@link MoneyAccountApiDataService} exposes to other consumers.\n */\nexport type MoneyAccountApiDataServiceActions =\n | MoneyAccountApiDataServiceMethodActions\n | MoneyAccountApiDataServiceInvalidateQueriesAction;\n\n/**\n * Actions from other messengers that {@link MoneyAccountApiDataService} calls.\n */\ntype AuthenticationControllerGetBearerTokenAction = {\n type: 'AuthenticationController:getBearerToken';\n handler: (entropySourceId?: string) => Promise<string>;\n};\n\ntype AllowedActions = AuthenticationControllerGetBearerTokenAction;\n\n/**\n * Published when {@link MoneyAccountApiDataService}'s cache is updated.\n */\nexport type MoneyAccountApiDataServiceCacheUpdatedEvent =\n DataServiceCacheUpdatedEvent<typeof serviceName>;\n\n/**\n * Published when a key within {@link MoneyAccountApiDataService}'s cache is\n * updated.\n */\nexport type MoneyAccountApiDataServiceGranularCacheUpdatedEvent =\n DataServiceGranularCacheUpdatedEvent<typeof serviceName>;\n\n/**\n * Events that {@link MoneyAccountApiDataService} exposes to other consumers.\n */\nexport type MoneyAccountApiDataServiceEvents =\n | MoneyAccountApiDataServiceCacheUpdatedEvent\n | MoneyAccountApiDataServiceGranularCacheUpdatedEvent;\n\n/**\n * Events from other messengers that {@link MoneyAccountApiDataService}\n * subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link MoneyAccountApiDataService}.\n */\nexport type MoneyAccountApiDataServiceMessenger = Messenger<\n typeof serviceName,\n MoneyAccountApiDataServiceActions | AllowedActions,\n MoneyAccountApiDataServiceEvents | AllowedEvents\n>;\n\n// === SERVICE DEFINITION ===\n\nexport type MoneyAccountApiDataServiceOptions = {\n messenger: MoneyAccountApiDataServiceMessenger;\n env?: Env;\n queryClientConfig?: QueryClientConfig;\n policyOptions?: CreateServicePolicyOptions;\n trace?: MoneyAccountApiDataServiceTraceCallback;\n};\n\n/**\n * Data service responsible for fetching positions, interest, cash-flow\n * history, and vault rate history from the Money Account APY Tracking API.\n */\nexport class MoneyAccountApiDataService extends BaseDataService<\n typeof serviceName,\n MoneyAccountApiDataServiceMessenger\n> {\n readonly #baseUrl: string;\n\n readonly #trace: MoneyAccountApiDataServiceTraceCallback;\n\n /**\n * Constructs a new MoneyAccountApiDataService.\n *\n * @param options - The constructor arguments.\n * @param options.messenger - The messenger suited for this service.\n * @param options.env - The target environment. Defaults to production.\n * @param options.queryClientConfig - Configuration for the underlying\n * TanStack Query client.\n * @param options.policyOptions - Options to pass to `createServicePolicy`.\n * @param options.trace - Optional callback to trace network requests.\n */\n constructor({\n messenger,\n env = Env.PRD,\n queryClientConfig = {},\n policyOptions = {},\n trace,\n }: MoneyAccountApiDataServiceOptions) {\n super({\n name: serviceName,\n messenger,\n queryClientConfig,\n policyOptions: {\n retryFilterPolicy: handleWhen(\n (error) =>\n !(error instanceof MoneyAccountApiResponseValidationError) &&\n !(error instanceof HttpError && error.httpStatus === 403),\n ),\n ...policyOptions,\n },\n });\n\n this.#baseUrl = MONEY_ACCOUNT_API_URL_MAP[env];\n\n this.#trace =\n trace ??\n (async <Result>(\n _request: MoneyAccountApiDataServiceTraceRequest,\n fn?: (context?: TraceContext) => Result,\n ): Promise<Result> => {\n return await Promise.resolve(fn?.() as Result);\n });\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n log('Initialized', { env, baseUrl: this.#baseUrl });\n }\n\n /**\n * Builds best-effort authentication headers for a Money Account API request.\n *\n * Requests proceed without authentication when the wallet is locked, the\n * user is signed out, or the token is otherwise unavailable. The API edge\n * rate limiter falls back to IP-based limiting when the header is omitted.\n *\n * @returns The Authorization header when a profile token is available.\n */\n async #getRequestHeaders(): Promise<Record<string, string>> {\n try {\n const token = await this.messenger.call(\n 'AuthenticationController:getBearerToken',\n );\n return token ? { Authorization: `Bearer ${token}` } : {};\n } catch (error: unknown) {\n log('Auth token unavailable, proceeding unauthenticated', error);\n return {};\n }\n }\n\n /**\n * Fetches the current vault positions for a given user address.\n *\n * @param address - The user's Ethereum address.\n * @returns The position response containing vault positions and an optional\n * `balance` summary (`null` when the API balance path is unavailable).\n */\n async fetchPositions(address: string): Promise<PositionResponse> {\n const url = new URL(\n `/v1/positions/${address.toLowerCase()}`,\n this.#baseUrl,\n );\n\n return this.fetchQuery({\n queryKey: [`${this.name}:fetchPositions`, address.toLowerCase()],\n staleTime: DEFAULT_STALE_TIME_MS,\n queryFn: async () => {\n return this.#traceNetworkRequest(\n {\n name: TRACES.POSITIONS_API,\n data: { operation: 'fetchPositions' },\n },\n async () => {\n const response = await fetch(url, {\n headers: await this.#getRequestHeaders(),\n });\n\n if (!response.ok) {\n throw new HttpError(\n response.status,\n `Money Account API positions request failed with status '${response.status}'`,\n );\n }\n\n const json: Json = await response.json();\n\n const [error, validated] = validate(json, PositionResponseStruct);\n if (error) {\n throw new MoneyAccountApiResponseValidationError(\n `Malformed response from positions endpoint: ${error.message}`,\n );\n }\n\n return validated as unknown as PositionResponse;\n },\n );\n },\n });\n }\n\n /**\n * Fetches the interest earned for a given address and vault over a\n * specified time window.\n *\n * @param address - The user's Ethereum address.\n * @param options - Options specifying vault, window, and optional chain ID.\n * @returns The interest response.\n */\n async fetchInterest(\n address: string,\n options: InterestOptions,\n ): Promise<InterestResponse> {\n const url = new URL(\n `/v1/positions/${address.toLowerCase()}/interest`,\n this.#baseUrl,\n );\n url.searchParams.append(\n 'vault_address',\n options.vaultAddress.toLowerCase(),\n );\n url.searchParams.append('window', options.window);\n if (options.chainId !== undefined) {\n url.searchParams.append('chain_id', String(options.chainId));\n }\n\n return this.fetchQuery({\n queryKey: [\n `${this.name}:fetchInterest`,\n address.toLowerCase(),\n options.vaultAddress.toLowerCase(),\n options.window,\n ...(options.chainId === undefined ? [] : [options.chainId]),\n ],\n staleTime: DEFAULT_STALE_TIME_MS,\n queryFn: async () => {\n return this.#traceNetworkRequest(\n {\n name: TRACES.INTEREST_API,\n data: { operation: 'fetchInterest' },\n },\n async () => {\n const response = await fetch(url, {\n headers: await this.#getRequestHeaders(),\n });\n\n if (!response.ok) {\n throw new HttpError(\n response.status,\n `Money Account API interest request failed with status '${response.status}'`,\n );\n }\n\n const json: Json = await response.json();\n\n const [error, validated] = validate(json, InterestResponseStruct);\n if (error) {\n throw new MoneyAccountApiResponseValidationError(\n `Malformed response from interest endpoint: ${error.message}`,\n );\n }\n\n return validated as unknown as InterestResponse;\n },\n );\n },\n });\n }\n\n /**\n * Fetches cursor-paginated cash-flow history for a given address.\n * Uses `fetchInfiniteQuery` for proper TanStack Query pagination semantics.\n *\n * When paginating, consumers must re-pass the same filter options\n * (`vaultAddress`, `chainId`, `limit`) alongside `cursor` on every page\n * request. This ensures the query key matches the original infinite query\n * and that the HTTP request includes the correct filters.\n *\n * @param address - The user's Ethereum address.\n * @param options - Optional filtering and pagination options.\n * @returns The history response containing cash-flow entries for the requested page.\n */\n async fetchHistory(\n address: string,\n options?: HistoryOptions,\n ): Promise<HistoryResponse> {\n const normalizedAddress = address.toLowerCase();\n const normalizedVault = options?.vaultAddress?.toLowerCase() ?? null;\n\n return this.fetchInfiniteQuery(\n {\n queryKey: [\n `${this.name}:fetchHistory`,\n normalizedAddress,\n normalizedVault,\n options?.chainId ?? null,\n options?.limit ?? null,\n ],\n staleTime: DEFAULT_STALE_TIME_MS,\n queryFn: async (context) => {\n const cursor = context.pageParam as string | null | undefined;\n\n const url = new URL(\n `/v1/positions/${normalizedAddress}/history`,\n this.#baseUrl,\n );\n if (normalizedVault) {\n url.searchParams.append('vault_address', normalizedVault);\n }\n if (options?.chainId !== undefined) {\n url.searchParams.append('chain_id', String(options.chainId));\n }\n if (cursor) {\n url.searchParams.append('cursor', cursor);\n }\n if (options?.limit !== undefined) {\n url.searchParams.append('limit', String(options.limit));\n }\n\n return this.#traceNetworkRequest(\n {\n name: TRACES.HISTORY_API,\n data: { operation: 'fetchHistory' },\n },\n async () => {\n const response = await fetch(url, {\n headers: await this.#getRequestHeaders(),\n });\n\n if (!response.ok) {\n throw new HttpError(\n response.status,\n `Money Account API history request failed with status '${response.status}'`,\n );\n }\n\n const json: Json = await response.json();\n\n const [error, validated] = validate(json, HistoryResponseStruct);\n if (error) {\n throw new MoneyAccountApiResponseValidationError(\n `Malformed response from history endpoint: ${error.message}`,\n );\n }\n\n return validated as unknown as HistoryResponse;\n },\n );\n },\n },\n options?.cursor ?? undefined,\n );\n }\n\n /**\n * Fetches the exchange-rate time series for a given vault.\n *\n * @param vaultAddress - The vault's Ethereum address.\n * @param options - Optional range and chain ID filters.\n * @returns The rate history response.\n */\n async fetchRateHistory(\n vaultAddress: string,\n options?: RateHistoryOptions,\n ): Promise<RateHistoryResponse> {\n const url = new URL(\n `/v1/vaults/${vaultAddress.toLowerCase()}/rate-history`,\n this.#baseUrl,\n );\n if (options?.chainId !== undefined) {\n url.searchParams.append('chain_id', String(options.chainId));\n }\n if (options?.from) {\n url.searchParams.append('from', options.from);\n }\n if (options?.to) {\n url.searchParams.append('to', options.to);\n }\n\n return this.fetchQuery({\n queryKey: [\n `${this.name}:fetchRateHistory`,\n vaultAddress.toLowerCase(),\n ...(options?.chainId === undefined ? [null] : [options.chainId]),\n ...(options?.from ? [options.from] : [null]),\n ...(options?.to ? [options.to] : [null]),\n ],\n staleTime: RATE_HISTORY_STALE_TIME_MS,\n queryFn: async () => {\n return this.#traceNetworkRequest(\n {\n name: TRACES.RATE_HISTORY_API,\n data: { operation: 'fetchRateHistory' },\n },\n async () => {\n const response = await fetch(url, {\n headers: await this.#getRequestHeaders(),\n });\n\n if (!response.ok) {\n throw new HttpError(\n response.status,\n `Money Account API rate-history request failed with status '${response.status}'`,\n );\n }\n\n const json: Json = await response.json();\n\n const [error, validated] = validate(\n json,\n RateHistoryResponseStruct,\n );\n if (error) {\n throw new MoneyAccountApiResponseValidationError(\n `Malformed response from rate-history endpoint: ${error.message}`,\n );\n }\n\n return validated as unknown as RateHistoryResponse;\n },\n );\n },\n });\n }\n\n /**\n * Runs a network request and emits a best-effort backdated trace.\n *\n * @param request - Trace metadata for the network request.\n * @param fn - Network request to execute.\n * @returns The network request result.\n */\n async #traceNetworkRequest<Result>(\n request: MoneyAccountApiDataServiceTraceRequest,\n fn: () => Promise<Result>,\n ): Promise<Result> {\n const startTime = Date.now();\n let success = false;\n let errorName: string | undefined;\n\n try {\n const result = await fn();\n success = true;\n return result;\n } catch (error) {\n errorName = error instanceof Error ? error.name : typeof error;\n throw error;\n } finally {\n const traceRequest = {\n ...request,\n startTime,\n data: {\n ...request.data,\n success,\n ...(errorName ? { errorName } : {}),\n },\n };\n const onTraceError = (traceError: unknown): void => {\n traceLogger('Failed to emit trace', {\n traceName: request.name,\n traceError,\n });\n };\n\n try {\n Promise.resolve(this.#trace(traceRequest, () => undefined)).catch(\n onTraceError,\n );\n } catch (traceError) {\n onTraceError(traceError);\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"money-account-api-data-service.mjs","sourceRoot":"","sources":["../src/money-account-api-data-service.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n DataServiceCacheUpdatedEvent,\n DataServiceGranularCacheUpdatedEvent,\n DataServiceInvalidateQueriesAction,\n} from '@metamask/base-data-service';\nimport { BaseDataService } from '@metamask/base-data-service';\nimport type {\n CreateServicePolicyOptions,\n TraceContext,\n TraceRequest,\n} from '@metamask/controller-utils';\nimport { handleWhen, HttpError } from '@metamask/controller-utils';\nimport type { Messenger } from '@metamask/messenger';\nimport { validate } from '@metamask/superstruct';\nimport type { Json } from '@metamask/utils';\nimport type { QueryClientConfig } from '@tanstack/query-core';\n\nimport {\n DEFAULT_STALE_TIME_MS,\n Env,\n MONEY_ACCOUNT_API_URL_MAP,\n RATE_HISTORY_STALE_TIME_MS,\n} from './constants.js';\nimport { MoneyAccountApiResponseValidationError } from './errors.js';\nimport { projectLogger, createModuleLogger } from './logger.js';\nimport type { MoneyAccountApiDataServiceMethodActions } from './money-account-api-data-service-method-action-types.js';\nimport type {\n HistoryResponse,\n InterestResponse,\n PositionResponse,\n RateHistoryResponse,\n} from './response.types';\nimport {\n HistoryResponseStruct,\n InterestResponseStruct,\n PositionResponseStruct,\n RateHistoryResponseStruct,\n} from './structs.js';\nimport type {\n HistoryOptions,\n InterestOptions,\n RateHistoryOptions,\n} from './types.js';\n\n// === GENERAL ===\n\n/**\n * The name of the {@link MoneyAccountApiDataService}, used to namespace the\n * service's actions and events.\n */\nexport const serviceName = 'MoneyAccountApiDataService';\n\nconst log = createModuleLogger(projectLogger, serviceName);\nconst traceLogger = createModuleLogger(projectLogger, 'trace');\n\nexport const TRACES = {\n POSITIONS_API: 'Money Account API Fetch Positions',\n INTEREST_API: 'Money Account API Fetch Interest',\n HISTORY_API: 'Money Account API Fetch History',\n RATE_HISTORY_API: 'Money Account API Fetch Rate History',\n} as const;\n\nexport type MoneyAccountApiDataServiceTraceName =\n (typeof TRACES)[keyof typeof TRACES];\n\nexport type MoneyAccountApiDataServiceTraceRequest = Omit<\n TraceRequest,\n 'name'\n> & {\n name: MoneyAccountApiDataServiceTraceName;\n startTime?: number;\n};\n\nexport type MoneyAccountApiDataServiceTraceCallback = <ReturnType>(\n request: MoneyAccountApiDataServiceTraceRequest,\n fn?: (context?: TraceContext) => ReturnType,\n) => Promise<ReturnType>;\n\n// === MESSENGER ===\n\nconst MESSENGER_EXPOSED_METHODS = [\n 'fetchPositions',\n 'fetchInterest',\n 'fetchHistory',\n 'fetchRateHistory',\n] as const;\n\n/**\n * Invalidates cached queries for {@link MoneyAccountApiDataService}.\n */\nexport type MoneyAccountApiDataServiceInvalidateQueriesAction =\n DataServiceInvalidateQueriesAction<typeof serviceName>;\n\n/**\n * Actions that {@link MoneyAccountApiDataService} exposes to other consumers.\n */\nexport type MoneyAccountApiDataServiceActions =\n | MoneyAccountApiDataServiceMethodActions\n | MoneyAccountApiDataServiceInvalidateQueriesAction;\n\n/**\n * Actions from other messengers that {@link MoneyAccountApiDataService} calls.\n */\ntype AuthenticationControllerGetBearerTokenAction = {\n type: 'AuthenticationController:getBearerToken';\n handler: (entropySourceId?: string) => Promise<string>;\n};\n\ntype AllowedActions = AuthenticationControllerGetBearerTokenAction;\n\n/**\n * Published when {@link MoneyAccountApiDataService}'s cache is updated.\n */\nexport type MoneyAccountApiDataServiceCacheUpdatedEvent =\n DataServiceCacheUpdatedEvent<typeof serviceName>;\n\n/**\n * Published when a key within {@link MoneyAccountApiDataService}'s cache is\n * updated.\n */\nexport type MoneyAccountApiDataServiceGranularCacheUpdatedEvent =\n DataServiceGranularCacheUpdatedEvent<typeof serviceName>;\n\n/**\n * Events that {@link MoneyAccountApiDataService} exposes to other consumers.\n */\nexport type MoneyAccountApiDataServiceEvents =\n | MoneyAccountApiDataServiceCacheUpdatedEvent\n | MoneyAccountApiDataServiceGranularCacheUpdatedEvent;\n\n/**\n * Events from other messengers that {@link MoneyAccountApiDataService}\n * subscribes to.\n */\ntype AllowedEvents = never;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * {@link MoneyAccountApiDataService}.\n */\nexport type MoneyAccountApiDataServiceMessenger = Messenger<\n typeof serviceName,\n MoneyAccountApiDataServiceActions | AllowedActions,\n MoneyAccountApiDataServiceEvents | AllowedEvents\n>;\n\n// === SERVICE DEFINITION ===\n\nexport type MoneyAccountApiDataServiceOptions = {\n messenger: MoneyAccountApiDataServiceMessenger;\n env?: Env;\n queryClientConfig?: QueryClientConfig;\n policyOptions?: CreateServicePolicyOptions;\n trace?: MoneyAccountApiDataServiceTraceCallback;\n};\n\n/**\n * Data service responsible for fetching positions, interest, cash-flow\n * history, and vault rate history from the Money Account APY Tracking API.\n */\nexport class MoneyAccountApiDataService extends BaseDataService<\n typeof serviceName,\n MoneyAccountApiDataServiceMessenger\n> {\n readonly #baseUrl: string;\n\n readonly #trace: MoneyAccountApiDataServiceTraceCallback;\n\n /**\n * Constructs a new MoneyAccountApiDataService.\n *\n * @param options - The constructor arguments.\n * @param options.messenger - The messenger suited for this service.\n * @param options.env - The target environment. Defaults to production.\n * @param options.queryClientConfig - Configuration for the underlying\n * TanStack Query client.\n * @param options.policyOptions - Options to pass to `createServicePolicy`.\n * @param options.trace - Optional callback to trace network requests.\n */\n constructor({\n messenger,\n env = Env.PRD,\n queryClientConfig = {},\n policyOptions = {},\n trace,\n }: MoneyAccountApiDataServiceOptions) {\n super({\n name: serviceName,\n messenger,\n queryClientConfig,\n policyOptions: {\n retryFilterPolicy: handleWhen(\n (error) =>\n !(error instanceof MoneyAccountApiResponseValidationError) &&\n !(error instanceof HttpError && error.httpStatus === 403),\n ),\n ...policyOptions,\n },\n });\n\n this.#baseUrl = MONEY_ACCOUNT_API_URL_MAP[env];\n\n this.#trace =\n trace ??\n (async <Result>(\n _request: MoneyAccountApiDataServiceTraceRequest,\n fn?: (context?: TraceContext) => Result,\n ): Promise<Result> => {\n return await Promise.resolve(fn?.() as Result);\n });\n\n this.messenger.registerMethodActionHandlers(\n this,\n MESSENGER_EXPOSED_METHODS,\n );\n\n log('Initialized', { env, baseUrl: this.#baseUrl });\n }\n\n /**\n * Builds best-effort authentication headers for a Money Account API request.\n *\n * Requests proceed without authentication when the wallet is locked, the\n * user is signed out, or the token is otherwise unavailable. The API edge\n * rate limiter falls back to IP-based limiting when the header is omitted.\n *\n * @returns The Authorization header when a profile token is available.\n */\n async #getRequestHeaders(): Promise<Record<string, string>> {\n try {\n const token = await this.messenger.call(\n 'AuthenticationController:getBearerToken',\n );\n return token ? { Authorization: `Bearer ${token}` } : {};\n } catch (error: unknown) {\n log('Auth token unavailable, proceeding unauthenticated', error);\n return {};\n }\n }\n\n /**\n * Fetches the current vault positions for a given user address.\n *\n * @param address - The user's Ethereum address.\n * @returns The position response containing vault positions and an optional\n * `balance` summary (`null` when the API balance path is unavailable).\n */\n async fetchPositions(address: string): Promise<PositionResponse> {\n const url = new URL(\n `/v1/positions/${address.toLowerCase()}`,\n this.#baseUrl,\n );\n\n return this.fetchQuery({\n queryKey: [`${this.name}:fetchPositions`, address.toLowerCase()],\n staleTime: DEFAULT_STALE_TIME_MS,\n queryFn: async () => {\n return this.#traceNetworkRequest(\n {\n name: TRACES.POSITIONS_API,\n data: { operation: 'fetchPositions' },\n },\n async () => {\n const response = await fetch(url, {\n headers: await this.#getRequestHeaders(),\n });\n\n if (!response.ok) {\n throw new HttpError(\n response.status,\n `Money Account API positions request failed with status '${response.status}'`,\n );\n }\n\n const json: Json = await response.json();\n\n const [error, validated] = validate(json, PositionResponseStruct);\n if (error) {\n throw new MoneyAccountApiResponseValidationError(\n `Malformed response from positions endpoint: ${error.message}`,\n );\n }\n\n return validated as unknown as PositionResponse;\n },\n );\n },\n });\n }\n\n /**\n * Fetches the interest earned for a given address and vault over a\n * specified time window.\n *\n * @param address - The user's Ethereum address.\n * @param options - Options specifying vault, window, and optional chain ID.\n * @returns The interest response.\n */\n async fetchInterest(\n address: string,\n options: InterestOptions,\n ): Promise<InterestResponse> {\n const url = new URL(\n `/v1/positions/${address.toLowerCase()}/interest`,\n this.#baseUrl,\n );\n url.searchParams.append(\n 'vault_address',\n options.vaultAddress.toLowerCase(),\n );\n url.searchParams.append('window', options.window);\n if (options.chainId !== undefined) {\n url.searchParams.append('chain_id', String(options.chainId));\n }\n\n return this.fetchQuery({\n queryKey: [\n `${this.name}:fetchInterest`,\n address.toLowerCase(),\n options.vaultAddress.toLowerCase(),\n options.window,\n ...(options.chainId === undefined ? [] : [options.chainId]),\n ],\n staleTime: DEFAULT_STALE_TIME_MS,\n queryFn: async () => {\n return this.#traceNetworkRequest(\n {\n name: TRACES.INTEREST_API,\n data: { operation: 'fetchInterest' },\n },\n async () => {\n const response = await fetch(url, {\n headers: await this.#getRequestHeaders(),\n });\n\n if (!response.ok) {\n throw new HttpError(\n response.status,\n `Money Account API interest request failed with status '${response.status}'`,\n );\n }\n\n const json: Json = await response.json();\n\n const [error, validated] = validate(json, InterestResponseStruct);\n if (error) {\n throw new MoneyAccountApiResponseValidationError(\n `Malformed response from interest endpoint: ${error.message}`,\n );\n }\n\n return validated as unknown as InterestResponse;\n },\n );\n },\n });\n }\n\n /**\n * Fetches cursor-paginated cash-flow history for a given address.\n * Uses `fetchInfiniteQuery` for proper TanStack Query pagination semantics.\n *\n * When paginating, consumers must re-pass the same filter options\n * (`vaultAddress`, `chainId`, `limit`) alongside `cursor` on every page\n * request. This ensures the query key matches the original infinite query\n * and that the HTTP request includes the correct filters.\n *\n * @param address - The user's Ethereum address.\n * @param options - Optional filtering and pagination options.\n * @returns The history response containing cash-flow entries for the requested page.\n */\n async fetchHistory(\n address: string,\n options?: HistoryOptions,\n ): Promise<HistoryResponse> {\n const normalizedAddress = address.toLowerCase();\n const normalizedVault = options?.vaultAddress?.toLowerCase() ?? null;\n\n return this.fetchInfiniteQuery(\n {\n queryKey: [\n `${this.name}:fetchHistory`,\n normalizedAddress,\n normalizedVault,\n options?.chainId ?? null,\n options?.limit ?? null,\n ],\n initialPageParam: null,\n staleTime: DEFAULT_STALE_TIME_MS,\n queryFn: async (context) => {\n const cursor = context.pageParam as string | null | undefined;\n\n const url = new URL(\n `/v1/positions/${normalizedAddress}/history`,\n this.#baseUrl,\n );\n if (normalizedVault) {\n url.searchParams.append('vault_address', normalizedVault);\n }\n if (options?.chainId !== undefined) {\n url.searchParams.append('chain_id', String(options.chainId));\n }\n if (cursor) {\n url.searchParams.append('cursor', cursor);\n }\n if (options?.limit !== undefined) {\n url.searchParams.append('limit', String(options.limit));\n }\n\n return this.#traceNetworkRequest(\n {\n name: TRACES.HISTORY_API,\n data: { operation: 'fetchHistory' },\n },\n async () => {\n const response = await fetch(url, {\n headers: await this.#getRequestHeaders(),\n });\n\n if (!response.ok) {\n throw new HttpError(\n response.status,\n `Money Account API history request failed with status '${response.status}'`,\n );\n }\n\n const json: Json = await response.json();\n\n const [error, validated] = validate(json, HistoryResponseStruct);\n if (error) {\n throw new MoneyAccountApiResponseValidationError(\n `Malformed response from history endpoint: ${error.message}`,\n );\n }\n\n return validated as unknown as HistoryResponse;\n },\n );\n },\n getNextPageParam: (lastPage) => lastPage.next_cursor,\n },\n options?.cursor ?? undefined,\n );\n }\n\n /**\n * Fetches the exchange-rate time series for a given vault.\n *\n * @param vaultAddress - The vault's Ethereum address.\n * @param options - Optional range and chain ID filters.\n * @returns The rate history response.\n */\n async fetchRateHistory(\n vaultAddress: string,\n options?: RateHistoryOptions,\n ): Promise<RateHistoryResponse> {\n const url = new URL(\n `/v1/vaults/${vaultAddress.toLowerCase()}/rate-history`,\n this.#baseUrl,\n );\n if (options?.chainId !== undefined) {\n url.searchParams.append('chain_id', String(options.chainId));\n }\n if (options?.from) {\n url.searchParams.append('from', options.from);\n }\n if (options?.to) {\n url.searchParams.append('to', options.to);\n }\n\n return this.fetchQuery({\n queryKey: [\n `${this.name}:fetchRateHistory`,\n vaultAddress.toLowerCase(),\n ...(options?.chainId === undefined ? [null] : [options.chainId]),\n ...(options?.from ? [options.from] : [null]),\n ...(options?.to ? [options.to] : [null]),\n ],\n staleTime: RATE_HISTORY_STALE_TIME_MS,\n queryFn: async () => {\n return this.#traceNetworkRequest(\n {\n name: TRACES.RATE_HISTORY_API,\n data: { operation: 'fetchRateHistory' },\n },\n async () => {\n const response = await fetch(url, {\n headers: await this.#getRequestHeaders(),\n });\n\n if (!response.ok) {\n throw new HttpError(\n response.status,\n `Money Account API rate-history request failed with status '${response.status}'`,\n );\n }\n\n const json: Json = await response.json();\n\n const [error, validated] = validate(\n json,\n RateHistoryResponseStruct,\n );\n if (error) {\n throw new MoneyAccountApiResponseValidationError(\n `Malformed response from rate-history endpoint: ${error.message}`,\n );\n }\n\n return validated as unknown as RateHistoryResponse;\n },\n );\n },\n });\n }\n\n /**\n * Runs a network request and emits a best-effort backdated trace.\n *\n * @param request - Trace metadata for the network request.\n * @param fn - Network request to execute.\n * @returns The network request result.\n */\n async #traceNetworkRequest<Result>(\n request: MoneyAccountApiDataServiceTraceRequest,\n fn: () => Promise<Result>,\n ): Promise<Result> {\n const startTime = Date.now();\n let success = false;\n let errorName: string | undefined;\n\n try {\n const result = await fn();\n success = true;\n return result;\n } catch (error) {\n errorName = error instanceof Error ? error.name : typeof error;\n throw error;\n } finally {\n const traceRequest = {\n ...request,\n startTime,\n data: {\n ...request.data,\n success,\n ...(errorName ? { errorName } : {}),\n },\n };\n const onTraceError = (traceError: unknown): void => {\n traceLogger('Failed to emit trace', {\n traceName: request.name,\n traceError,\n });\n };\n\n try {\n Promise.resolve(this.#trace(traceRequest, () => undefined)).catch(\n onTraceError,\n );\n } catch (traceError) {\n onTraceError(traceError);\n }\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask-previews/money-account-api-data-service",
3
- "version": "0.4.0-preview-c2ef75d18",
3
+ "version": "0.4.0-preview-e81fe8853",
4
4
  "description": "Data service for fetching Money account positions, interest, cash-flow history, and vault rate history from the Money Account API",
5
5
  "keywords": [
6
6
  "Ethereum",
@@ -60,7 +60,7 @@
60
60
  "@metamask/messenger": "^2.0.0",
61
61
  "@metamask/superstruct": "^3.4.1",
62
62
  "@metamask/utils": "^11.11.0",
63
- "@tanstack/query-core": "^4.43.0"
63
+ "@tanstack/query-core": "^5.62.16"
64
64
  },
65
65
  "devDependencies": {
66
66
  "@metamask/auto-changelog": "^6.1.0",