diff --git a/CHANGELOG.md b/CHANGELOG.md index ed3d8103c..0ebcbdd85 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # backend +## 2.1.11 + +### Patch Changes + +- d9952e7: use merkl api key + ## 2.1.10 ### Patch Changes diff --git a/apps/api/gql/resolvers/protocol.resolvers.ts b/apps/api/gql/resolvers/protocol.resolvers.ts index d3a219f37..45f65a23f 100644 --- a/apps/api/gql/resolvers/protocol.resolvers.ts +++ b/apps/api/gql/resolvers/protocol.resolvers.ts @@ -1,5 +1,6 @@ import { Resolvers } from '../generated-schema'; import { protocolService } from '../../../../modules/protocol/protocol.service'; +import { isAdminRoute } from '../../../../modules/auth/auth-context'; const protocolResolvers: Resolvers = { Query: { @@ -12,6 +13,8 @@ const protocolResolvers: Resolvers = { }, Mutation: { protocolCacheMetrics: async (parent, { chain }, context): Promise => { + isAdminRoute(context); + await protocolService.cacheProtocolMetrics(chain); return 'success'; }, diff --git a/apps/api/gql/resolvers/user.resolvers.ts b/apps/api/gql/resolvers/user.resolvers.ts index b226719e3..cfbc4168e 100644 --- a/apps/api/gql/resolvers/user.resolvers.ts +++ b/apps/api/gql/resolvers/user.resolvers.ts @@ -6,6 +6,8 @@ const resolvers: Resolvers = { Query: {}, Mutation: { userSyncChangedWalletBalancesForAllPools: async (parent, { chain }, context) => { + isAdminRoute(context); + await UserBalancesController().syncBalances(chain); return 'success'; diff --git a/apps/env.ts b/apps/env.ts index 179a66952..28288bf4a 100644 --- a/apps/env.ts +++ b/apps/env.ts @@ -74,6 +74,10 @@ export const schema = { type: String, optional: true, }, + MERKL_API_KEY: { + type: String, + optional: true, + }, }; export const env: Env = load(schema, { diff --git a/config/hyperevm.ts b/config/hyperevm.ts index 01765430b..825265364 100644 --- a/config/hyperevm.ts +++ b/config/hyperevm.ts @@ -108,6 +108,11 @@ export default { token: '0x06fd9d03b3d0f18e4919919b72d30c582f0a97e5', path: '$["0x06Fd9D03b3d0F18E4919919b72D30c582f0a97E5"].supplyAPR', }, + { + type: 'path', + token: '0xb2a2104d9fc202a38d74d8f6c3c45da6eef8f5e0', + path: '$["0xfD739d4e423301CE9385c1fb8850539D657C296D"].supplyAPR', + }, ], }, { @@ -145,6 +150,24 @@ export default { }, ], }, + { + url: 'https://protocol-api.treehouse.finance/protocol_mey', + scale: 100, + convert: async (val: number) => { + const khype = ( + (await (await fetch('https://kinetiq.xyz/api/khype')).json()) as { apy_14d: number } + ).apy_14d; + + return khype + val; + }, + extractors: [ + { + type: 'path', + token: '0xb83d27f0f4133a7b0377a88089583131a903fdc7', + path: '$[?(@.tasset=="tHYPE")].sma_mey', + }, + ], + }, { url: 'https://api.hyperdrive.fi/integrations/hyped/apr', extractors: [ diff --git a/modules/aprs/handlers/merkl-apr/merkl-apr-handler.ts b/modules/aprs/handlers/merkl-apr/merkl-apr-handler.ts index 8bb98ee4b..8b479c288 100644 --- a/modules/aprs/handlers/merkl-apr/merkl-apr-handler.ts +++ b/modules/aprs/handlers/merkl-apr/merkl-apr-handler.ts @@ -2,11 +2,12 @@ import { $Enums, PrismaPoolAprItem, PrismaPoolAprType } from '@prisma/client'; import { AprHandler, PoolAPRData } from '../../types'; import { chainIdToChain } from '../../../network/chain-id-to-chain'; import { AaveV3Plasma } from '@bgd-labs/aave-address-book'; +import { env } from '../../../../apps/env'; const opportunityUrl = - 'https://api.merkl.fr/v4/opportunities/?test=false&status=LIVE&campaigns=true&mainProtocolId=balancer&page=0&items=100'; + 'https://api.merkl.xyz/v4/opportunities/?test=false&status=LIVE&campaigns=true&mainProtocolId=balancer&page=0&items=100'; -const tokenOpportunityUrlBase = `https://api.merkl.fr/v4/opportunities/?status=LIVE&explorerAddress=`; +const tokenOpportunityUrlBase = `https://api.merkl.xyz/v4/opportunities/?status=LIVE&explorerAddress=`; interface MerklOpportunity { chainId: number; @@ -27,7 +28,7 @@ export class MerklAprHandler implements AprHandler { } private async fetchMerklOpportunities() { - const response = await fetch(opportunityUrl); + const response = await this.merklFetch(opportunityUrl); const data = (await response.json()) as MerklOpportunity[]; // remove opportunities with whitelist @@ -128,7 +129,7 @@ export class MerklAprHandler implements AprHandler { // Fetch opportunities for the unique tokens const tokenOpportunityResponses = await Promise.all( uniqueTokensWithUnderlying.map((tokenAddress) => - fetch(`${tokenOpportunityUrlBase}${tokenAddress}`).then( + this.merklFetch(`${tokenOpportunityUrlBase}${tokenAddress}`).then( (res) => res.json() as unknown as MerklOpportunity[], ), ), @@ -259,4 +260,9 @@ export class MerklAprHandler implements AprHandler { } return wrapperToATokenMap; } + private async merklFetch(url: string): Promise { + const apiKey = env.MERKL_API_KEY; + const headers: Record = apiKey ? { 'X-API-Key': apiKey } : {}; + return fetch(url, { headers }); + } } diff --git a/package.json b/package.json index a1f899a7f..c3e8d7e8f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "backend", - "version": "2.1.10", + "version": "2.1.11", "description": "Backend service for Beethoven X and Balancer", "repository": "https://github.com/balancer/backend", "author": "Beethoven X",