From acce8e467f9664039bb0097098f98dc72eec49f6 Mon Sep 17 00:00:00 2001 From: fredwes <6827305+fredwes@users.noreply.github.com> Date: Wed, 10 Jun 2026 14:56:12 -0400 Subject: [PATCH] fix: update Morpho API integration to use marketId instead of uniqueKey --- .../borrow-apy-providers/morpho.ts | 8 ++-- src/lib/graphql/fetchers/morpho.ts | 11 +++--- src/lib/graphql/queries/morpho.ts | 7 ++-- src/lib/graphql/types/morpho.ts | 5 +-- .../borrow-apy-providers/morpho.test.ts | 39 ++++++++----------- 5 files changed, 30 insertions(+), 40 deletions(-) diff --git a/src/features/leverage-tokens/utils/apy-calculations/borrow-apy-providers/morpho.ts b/src/features/leverage-tokens/utils/apy-calculations/borrow-apy-providers/morpho.ts index c86edcab..e730ea3a 100644 --- a/src/features/leverage-tokens/utils/apy-calculations/borrow-apy-providers/morpho.ts +++ b/src/features/leverage-tokens/utils/apy-calculations/borrow-apy-providers/morpho.ts @@ -89,14 +89,14 @@ export class MorphoBorrowApyProvider implements BorrowApyFetcher { // Fetch market ID using the lending adapter const marketId = await fetchMorphoMarketId(tokenAddress, chainId, config) - // Fetch market data from Morpho using GraphQL with uniqueKey (marketId from contract) + // Fetch market data from Morpho using GraphQL with marketId from contract const response = await fetchMorphoMarketBorrowRate(marketId, chainId) - if (!response.marketByUniqueKey) { - throw new Error(`No market data found for unique key: ${marketId}`) + if (!response.marketById) { + throw new Error(`No market data found for market ID: ${marketId}`) } - const marketData = response.marketByUniqueKey + const marketData = response.marketById // Use 24-hour average borrow APY for current rates // Note: Zod validation in fetcher ensures this is number | null diff --git a/src/lib/graphql/fetchers/morpho.ts b/src/lib/graphql/fetchers/morpho.ts index e8ae4dcf..0ab6d97f 100644 --- a/src/lib/graphql/fetchers/morpho.ts +++ b/src/lib/graphql/fetchers/morpho.ts @@ -11,8 +11,7 @@ const MorphoMarketStateSchema = z.object({ }) const MorphoMarketDataSchema = z.object({ - uniqueKey: z.string(), - id: z.string(), + marketId: z.string(), collateralAsset: z.object({ address: z.string(), name: z.string(), @@ -21,14 +20,14 @@ const MorphoMarketDataSchema = z.object({ }) const MorphoResponseSchema = z.object({ - marketByUniqueKey: MorphoMarketDataSchema.nullable().optional(), + marketById: MorphoMarketDataSchema.nullable().optional(), }) /** * Fetches Morpho market borrow rate data using GraphQL */ export async function fetchMorphoMarketBorrowRate( - uniqueKey: string, + marketId: string, chainId: number = 8453, // Default to Base ): Promise> { const MORPHO_GRAPHQL_ENDPOINT = 'https://api.morpho.org/graphql' @@ -40,7 +39,7 @@ export async function fetchMorphoMarketBorrowRate( }, body: JSON.stringify({ query: MORPHO_MARKET_BORROW_RATE_QUERY, - variables: { uniqueKey, chainId }, + variables: { marketId, chainId }, }), }) @@ -65,7 +64,7 @@ export async function fetchMorphoMarketBorrowRate( // Log validation error with response snippet for debugging const responseSnippet = JSON.stringify(result.data).slice(0, 500) logger.error('Morpho API response validation failed', { - uniqueKey, + marketId, chainId, validationErrors: error.issues, responseSnippet, diff --git a/src/lib/graphql/queries/morpho.ts b/src/lib/graphql/queries/morpho.ts index 4b6f4752..5b6b1b50 100644 --- a/src/lib/graphql/queries/morpho.ts +++ b/src/lib/graphql/queries/morpho.ts @@ -1,8 +1,7 @@ export const MORPHO_MARKET_BORROW_RATE_QUERY = ` - query MorphoMarketBorrowRate($uniqueKey: String!, $chainId: Int!) { - marketByUniqueKey(uniqueKey: $uniqueKey, chainId: $chainId) { - uniqueKey - id + query MorphoMarketBorrowRate($marketId: String!, $chainId: Int!) { + marketById(marketId: $marketId, chainId: $chainId) { + marketId collateralAsset { address name diff --git a/src/lib/graphql/types/morpho.ts b/src/lib/graphql/types/morpho.ts index 8974af51..3a986a94 100644 --- a/src/lib/graphql/types/morpho.ts +++ b/src/lib/graphql/types/morpho.ts @@ -3,8 +3,7 @@ */ export interface MorphoMarketData { - uniqueKey: string - id: string + marketId: string collateralAsset: { address: string name: string @@ -16,5 +15,5 @@ export interface MorphoMarketData { } export interface MorphoMarketBorrowRateResponse { - marketByUniqueKey?: MorphoMarketData | null + marketById?: MorphoMarketData | null } diff --git a/tests/unit/features/leverage-tokens/utils/apy-calculations/borrow-apy-providers/morpho.test.ts b/tests/unit/features/leverage-tokens/utils/apy-calculations/borrow-apy-providers/morpho.test.ts index c6fd396f..a856bd85 100644 --- a/tests/unit/features/leverage-tokens/utils/apy-calculations/borrow-apy-providers/morpho.test.ts +++ b/tests/unit/features/leverage-tokens/utils/apy-calculations/borrow-apy-providers/morpho.test.ts @@ -53,9 +53,8 @@ describe('MorphoBorrowApyProvider', () => { } const mockGraphQLResponse = { - marketByUniqueKey: { - uniqueKey: mockMarketId, - id: 'market-id-123', + marketById: { + marketId: mockMarketId, collateralAsset: { address: '0x1234567890123456789012345678901234567890', name: 'WETH', @@ -180,7 +179,7 @@ describe('MorphoBorrowApyProvider', () => { } const mockGraphQLResponse = { - marketByUniqueKey: null, + marketById: null, } mockGetLeverageManagerAddress.mockReturnValue(mockManagerAddress) @@ -188,7 +187,7 @@ describe('MorphoBorrowApyProvider', () => { mockFetchMorphoMarketBorrowRate.mockResolvedValue(mockGraphQLResponse) await expect(provider.fetchBorrowApy(tokenAddress, chainId, mockConfig)).rejects.toThrow( - 'No market data found for unique key: 0xabcdef1234567890abcdef1234567890abcdef12', + 'No market data found for market ID: 0xabcdef1234567890abcdef1234567890abcdef12', ) }) @@ -240,9 +239,8 @@ describe('MorphoBorrowApyProvider', () => { } const mockGraphQLResponse = { - marketByUniqueKey: { - uniqueKey: mockMarketId, - id: 'market-id-123', + marketById: { + marketId: mockMarketId, collateralAsset: { address: '0x1234567890123456789012345678901234567890', name: 'WETH', @@ -280,9 +278,8 @@ describe('MorphoBorrowApyProvider', () => { } const mockGraphQLResponse = { - marketByUniqueKey: { - uniqueKey: mockMarketId, - id: 'market-id-123', + marketById: { + marketId: mockMarketId, collateralAsset: { address: '0x1234567890123456789012345678901234567890', name: 'WETH', @@ -320,9 +317,8 @@ describe('MorphoBorrowApyProvider', () => { } const mockGraphQLResponse = { - marketByUniqueKey: { - uniqueKey: mockMarketId, - id: 'market-id-123', + marketById: { + marketId: mockMarketId, collateralAsset: { address: '0x1234567890123456789012345678901234567890', name: 'WETH', @@ -356,9 +352,8 @@ describe('MorphoBorrowApyProvider', () => { } const mockGraphQLResponse = { - marketByUniqueKey: { - uniqueKey: mockMarketId, - id: 'market-id-123', + marketById: { + marketId: mockMarketId, collateralAsset: { address: '0x1234567890123456789012345678901234567890', name: 'WETH', @@ -392,9 +387,8 @@ describe('MorphoBorrowApyProvider', () => { } const mockGraphQLResponse = { - marketByUniqueKey: { - uniqueKey: mockMarketId, - id: 'market-id-123', + marketById: { + marketId: mockMarketId, collateralAsset: { address: '0x1234567890123456789012345678901234567890', name: 'WETH', @@ -428,9 +422,8 @@ describe('MorphoBorrowApyProvider', () => { } const mockGraphQLResponse = { - marketByUniqueKey: { - uniqueKey: mockMarketId, - id: 'market-id-123', + marketById: { + marketId: mockMarketId, collateralAsset: { address: '0x1234567890123456789012345678901234567890', name: 'WETH',