From c1efc6b333f2b1f288966452dbfd322f214106fb Mon Sep 17 00:00:00 2001 From: franz Date: Thu, 14 May 2026 16:50:43 +0200 Subject: [PATCH 1/5] patch open mutations --- apps/api/gql/resolvers/protocol.resolvers.ts | 3 +++ apps/api/gql/resolvers/user.resolvers.ts | 2 ++ 2 files changed, 5 insertions(+) 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'; From d9952e755a68f6d0e4609bcf51770f9d0814808c Mon Sep 17 00:00:00 2001 From: franz Date: Mon, 18 May 2026 13:15:45 +0200 Subject: [PATCH 2/5] merkl api key --- .changeset/ninety-falcons-flash.md | 5 +++++ apps/env.ts | 4 ++++ .../aprs/handlers/merkl-apr/merkl-apr-handler.ts | 14 ++++++++++---- 3 files changed, 19 insertions(+), 4 deletions(-) create mode 100644 .changeset/ninety-falcons-flash.md diff --git a/.changeset/ninety-falcons-flash.md b/.changeset/ninety-falcons-flash.md new file mode 100644 index 000000000..2ecdbff7e --- /dev/null +++ b/.changeset/ninety-falcons-flash.md @@ -0,0 +1,5 @@ +--- +'backend': patch +--- + +use merkl api key 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/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 }); + } } From 25132d83480c2c14b20ac61c1c26e0c56ae54a5f Mon Sep 17 00:00:00 2001 From: franz Date: Mon, 18 May 2026 20:07:11 +0200 Subject: [PATCH 3/5] new hyperevm aprs --- config/hyperevm.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/config/hyperevm.ts b/config/hyperevm.ts index 01765430b..01bc78fbf 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,17 @@ export default { }, ], }, + { + url: 'https://protocol-api.treehouse.finance/protocol_mey', + scale: 100, + extractors: [ + { + type: 'path', + token: '0xb83d27f0f4133a7b0377a88089583131a903fdc7', + path: '$[?(@.tasset=="tHYPE")].sma_mey', + }, + ], + }, { url: 'https://api.hyperdrive.fi/integrations/hyped/apr', extractors: [ From 4319e13f4fae33762ec15a67c87c06b446105fa7 Mon Sep 17 00:00:00 2001 From: franz Date: Mon, 18 May 2026 20:30:59 +0200 Subject: [PATCH 4/5] add khype --- config/hyperevm.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config/hyperevm.ts b/config/hyperevm.ts index 01bc78fbf..825265364 100644 --- a/config/hyperevm.ts +++ b/config/hyperevm.ts @@ -153,6 +153,13 @@ 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', From b16e2138d4f70ef7d79ed66d32003993f3a10220 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 18 May 2026 18:59:59 +0000 Subject: [PATCH 5/5] Version Packages --- .changeset/ninety-falcons-flash.md | 5 ----- CHANGELOG.md | 6 ++++++ package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/ninety-falcons-flash.md diff --git a/.changeset/ninety-falcons-flash.md b/.changeset/ninety-falcons-flash.md deleted file mode 100644 index 2ecdbff7e..000000000 --- a/.changeset/ninety-falcons-flash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'backend': patch ---- - -use merkl api key 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/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",