From b4fb64ee297a44d206ac2cf7418c948eef6f0bc7 Mon Sep 17 00:00:00 2001 From: gmbronco <83549293+gmbronco@users.noreply.github.com> Date: Wed, 15 Jan 2025 17:56:09 +0100 Subject: [PATCH 1/2] apollo v4 --- .changeset/cool-houses-grab.md | 5 ++ apps/api/apollo/sentry-plugin.ts | 54 +++++++++++++++++++ apps/api/gql/resolvers/content.resolvers.ts | 5 +- apps/api/gql/resolvers/pool.resolvers.ts | 33 +++++++++--- apps/api/gql/resolvers/protocol.resolvers.ts | 9 +++- apps/api/gql/resolvers/sor.resolvers.ts | 5 +- apps/api/gql/resolvers/token.resolvers.ts | 37 +++++++++---- apps/api/gql/resolvers/user.resolvers.ts | 25 ++++++--- apps/api/gql/resolvers/vebal.resolvers.ts | 13 +++-- apps/api/sentry.ts | 47 ---------------- apps/api/server.ts | 44 ++++++++------- bun.lockb | Bin 471961 -> 466644 bytes modules/auth/auth-context.ts | 13 ++++- modules/pool/lib/pool-gql-loader.service.ts | 5 +- package.json | 3 +- 15 files changed, 195 insertions(+), 103 deletions(-) create mode 100644 .changeset/cool-houses-grab.md create mode 100644 apps/api/apollo/sentry-plugin.ts diff --git a/.changeset/cool-houses-grab.md b/.changeset/cool-houses-grab.md new file mode 100644 index 000000000..b0f43643c --- /dev/null +++ b/.changeset/cool-houses-grab.md @@ -0,0 +1,5 @@ +--- +'backend': minor +--- + +apollo v4 diff --git a/apps/api/apollo/sentry-plugin.ts b/apps/api/apollo/sentry-plugin.ts new file mode 100644 index 000000000..7aa6f2aec --- /dev/null +++ b/apps/api/apollo/sentry-plugin.ts @@ -0,0 +1,54 @@ +import { captureException } from '@sentry/node'; +import { ApolloServerPlugin } from '@apollo/server'; +import { ResolverContext } from '../gql/resolver-context'; + +export const apolloSentryPlugin: ApolloServerPlugin = { + async requestDidStart({ request }) { + return { + // This will send any errors captured by Apollo Server to Sentry + async didEncounterErrors(ctx) { + for (const err of ctx.errors) { + // Ignore syntax errors + if ( + [ + 'GRAPHQL_PARSE_FAILED', + 'GRAPHQL_VALIDATION_FAILED', + 'BAD_USER_INPUT', + 'ACCOUNT_ADDRESS_REQUIRED', + 'ACCESS_DENIED', + 'NOT_FOUND', + ].includes(err.extensions?.code as string) + ) { + continue; + } + + // Ignore specific errors + if (err.message && err.message === 'SOR queryBatchSwap failed') { + continue; + } + + // Potentially set transaction name to the operation name, + // add tags and fingerprint to group errors + + // Sentry.withScope((scope) => { + // let name = request.operationName; + // if (!name) { + // name = request.query + // ?.substring( + // request.query?.indexOf('{') + 1, + // request.query?.indexOf('(') || request.query?.length, + // ) + // .replace(/\n/g, '') + // .replace(/\s/g, ''); + // } + // scope.setTransactionName(`POST /graphql ${name}`); + // Sentry.captureException(err); + // }); + + captureException(err); + } + }, + async willSendResponse({}) {}, + }; + }, +}; diff --git a/apps/api/gql/resolvers/content.resolvers.ts b/apps/api/gql/resolvers/content.resolvers.ts index d233bc648..ed07b0c4f 100644 --- a/apps/api/gql/resolvers/content.resolvers.ts +++ b/apps/api/gql/resolvers/content.resolvers.ts @@ -1,6 +1,7 @@ import { Resolvers } from '../../../../schema'; import { headerChain } from '../../../../modules/context/header-chain'; import { SanityContentService } from '../../../../modules/content/sanity-content.service'; +import { GraphQLError } from 'graphql'; const contentResolvers: Resolvers = { Query: { @@ -9,7 +10,9 @@ const contentResolvers: Resolvers = { if (!chain && currentChain) { chain = currentChain; } else if (!chain) { - throw new Error('contentGetNewsItems error: Provide "chain" param'); + throw new GraphQLError('Provide "chain" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } const sanityContent = new SanityContentService(); return sanityContent.getNewsItems(chain); diff --git a/apps/api/gql/resolvers/pool.resolvers.ts b/apps/api/gql/resolvers/pool.resolvers.ts index 6408e2149..ed3810b14 100644 --- a/apps/api/gql/resolvers/pool.resolvers.ts +++ b/apps/api/gql/resolvers/pool.resolvers.ts @@ -11,6 +11,7 @@ import { FXPoolsController, } from '../../../../modules/controllers'; import { chainIdToChain } from '../../../../modules/network/chain-id-to-chain'; +import { GraphQLError } from 'graphql'; const balancerResolvers: Resolvers = { Query: { @@ -19,7 +20,9 @@ const balancerResolvers: Resolvers = { if (!chain && currentChain) { chain = currentChain; } else if (!chain) { - throw new Error('poolGetPool error: Provide "chain" param'); + throw new GraphQLError('Provide "chain" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } return poolService.getGqlPool(id, chain, userAddress ? userAddress : undefined); }, @@ -38,7 +41,9 @@ const balancerResolvers: Resolvers = { if (!args.where?.chainIn && currentChain) { args.where = { ...args.where, chainIn: [currentChain] }; } else if (!args.where?.chainIn) { - throw new Error('poolGetSwaps error: Provide "where.chainIn" param'); + throw new GraphQLError('Provide "chainIn" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } return poolService.getPoolSwaps(args); }, @@ -48,7 +53,9 @@ const balancerResolvers: Resolvers = { if (!args.where?.chainIn && currentChain) { args.where = { ...args.where, chainIn: [currentChain] }; } else if (!args.where?.chainIn) { - throw new Error('poolGetBatchSwaps error: Provide "where.chainIn" param'); + throw new GraphQLError('Provide "chainIn" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } return poolService.getPoolBatchSwaps(args); }, @@ -58,7 +65,9 @@ const balancerResolvers: Resolvers = { if (!args.where?.chainIn && currentChain) { args.where = { ...args.where, chainIn: [currentChain] }; } else if (!args.where?.chainIn) { - throw new Error('poolGetJoinExits error: Provide "where.chainIn" param'); + throw new GraphQLError('Provide "chainIn" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } return poolService.getPoolJoinExits(args); }, @@ -80,7 +89,9 @@ const balancerResolvers: Resolvers = { if (!chains && currentChain) { chains = [currentChain]; } else if (!chains) { - throw new Error('poolGetFeaturedPoolGroups error: Provide "chains" param'); + throw new GraphQLError('Provide "chains" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } return poolService.getFeaturedPoolGroups(chains); }, @@ -92,7 +103,9 @@ const balancerResolvers: Resolvers = { if (!chain && currentChain) { chain = currentChain; } else if (!chain) { - throw new Error('poolGetSnapshots error: Provide "chain" param'); + throw new GraphQLError('Provide "chain" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } const snapshots = await poolService.getSnapshotsForPool(id, chain, range); @@ -118,7 +131,9 @@ const balancerResolvers: Resolvers = { const chain = headerChain(); if (!chain) { - throw new Error('poolSyncAllPoolsFromSubgraph error: Provide chain header'); + throw new GraphQLError('Provide "chainId" header', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } return PoolController().addPoolsV2(chain); @@ -135,7 +150,9 @@ const balancerResolvers: Resolvers = { const currentChain = headerChain(); if (!currentChain) { - throw new Error('poolReloadStakingForAllPools error: Provide chain header'); + throw new GraphQLError('Provide "chainId" header', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } await poolService.reloadStakingForAllPools(args.stakingTypes, currentChain); diff --git a/apps/api/gql/resolvers/protocol.resolvers.ts b/apps/api/gql/resolvers/protocol.resolvers.ts index 07e86e080..c4bb1b2c1 100644 --- a/apps/api/gql/resolvers/protocol.resolvers.ts +++ b/apps/api/gql/resolvers/protocol.resolvers.ts @@ -2,6 +2,7 @@ import { GqlLatestSyncedBlocks, Resolvers } from '../../../../schema'; import { protocolService } from '../../../../modules/protocol/protocol.service'; import { networkContext } from '../../../../modules/network/network-context.service'; import { headerChain } from '../../../../modules/context/header-chain'; +import { GraphQLError } from 'graphql'; const protocolResolvers: Resolvers = { Query: { @@ -10,7 +11,9 @@ const protocolResolvers: Resolvers = { if (!chain && currentChain) { chain = currentChain; } else if (!chain) { - throw new Error('poolGetPool error: Provide "chain" param'); + throw new GraphQLError('Provide "chain" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } return protocolService.getMetrics(chain); }, @@ -19,7 +22,9 @@ const protocolResolvers: Resolvers = { if (!chains && currentChain) { chains = [currentChain]; } else if (!chains) { - throw new Error('tokenGetTokens error: Provide "chains" param'); + throw new GraphQLError('Provide "chains" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } return protocolService.getAggregatedMetrics(chains); }, diff --git a/apps/api/gql/resolvers/sor.resolvers.ts b/apps/api/gql/resolvers/sor.resolvers.ts index 3f0dd3023..98b216dc9 100644 --- a/apps/api/gql/resolvers/sor.resolvers.ts +++ b/apps/api/gql/resolvers/sor.resolvers.ts @@ -1,6 +1,7 @@ import { Resolvers } from '../../../../schema'; import { sorService } from '../../../../modules/sor/sor.service'; import { headerChain } from '../../../../modules/context/header-chain'; +import { GraphQLError } from 'graphql'; const balancerSdkResolvers: Resolvers = { Query: { @@ -9,7 +10,9 @@ const balancerSdkResolvers: Resolvers = { if (!args.chain && currentChain) { args.chain = currentChain; } else if (!args.chain) { - throw new Error('sorGetSwaps error: Provide "chain" param'); + throw new GraphQLError('Provide "chain" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } return sorService.getSorSwaps(args); diff --git a/apps/api/gql/resolvers/token.resolvers.ts b/apps/api/gql/resolvers/token.resolvers.ts index 4a57c9a3f..62f32c4fb 100644 --- a/apps/api/gql/resolvers/token.resolvers.ts +++ b/apps/api/gql/resolvers/token.resolvers.ts @@ -7,6 +7,7 @@ import { syncLatestFXPrices } from '../../../../modules/token/latest-fx-price'; import moment from 'moment'; import { TokenController } from '../../../../modules/controllers/token-controller'; import config from '../../../../config'; +import { GraphQLError } from 'graphql'; const resolvers: Resolvers = { Query: { @@ -15,7 +16,9 @@ const resolvers: Resolvers = { if (!args.chains && currentChain) { args.chains = [currentChain]; } else if (!args.chains) { - throw new Error('tokenGetTokens error: Provide "chains" param'); + throw new GraphQLError('Provide "chains" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } return tokenService.getTokenDefinitions(args); }, @@ -24,7 +27,9 @@ const resolvers: Resolvers = { if (!chains && currentChain) { chains = [currentChain]; } else if (!chains) { - throw new Error('tokenGetCurrentPrices error: Provide "chains" param'); + throw new GraphQLError('Provide "chains" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } const prices = await tokenService.getCurrentTokenPrices(chains); @@ -61,7 +66,9 @@ const resolvers: Resolvers = { if (!chain && currentChain) { chain = currentChain; } else if (!chain) { - throw new Error('tokenGetTokenDynamicData error: Provide "chain" param'); + throw new GraphQLError('Provide "chain" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } const data = await tokenService.getTokenDynamicData(address, chain); @@ -80,7 +87,9 @@ const resolvers: Resolvers = { if (!chain && currentChain) { chain = currentChain; } else if (!chain) { - throw new Error('tokenGetTokensDynamicData error: Provide "chain" param'); + throw new GraphQLError('Provide "chain" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } const items = await tokenService.getTokensDynamicData(addresses, chain); @@ -97,7 +106,9 @@ const resolvers: Resolvers = { if (!chain && currentChain) { chain = currentChain; } else if (!chain) { - throw new Error('tokenGetPriceChartData error: Provide "chain" param'); + throw new GraphQLError('Provide "chain" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } const data = await tokenService.getTokenPriceForRange(address, range, chain); @@ -112,7 +123,9 @@ const resolvers: Resolvers = { if (!chain && currentChain) { chain = currentChain; } else if (!chain) { - throw new Error('tokenGetRelativePriceChartData error: Provide "chain" param'); + throw new GraphQLError('Provide "chain" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } const data = await tokenService.getRelativeDataForRange(tokenIn, tokenOut, range, chain); @@ -127,7 +140,9 @@ const resolvers: Resolvers = { if (!chain && currentChain) { chain = currentChain; } else if (!chain) { - throw new Error('tokenGetCandlestickChartData error: Provide "chain" param'); + throw new GraphQLError('Provide "chain" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } const data = await tokenService.getTokenPriceForRange(address, range, chain); @@ -145,7 +160,9 @@ const resolvers: Resolvers = { if (!chain && currentChain) { chain = currentChain; } else if (!chain) { - throw new Error('tokenGetTokenData error: Provide "chain" param'); + throw new GraphQLError('Provide "chain" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } const token = await tokenService.getToken(address, chain); if (token) { @@ -167,7 +184,9 @@ const resolvers: Resolvers = { if (!chain && currentChain) { chain = currentChain; } else if (!chain) { - throw new Error('tokenGetProtocolTokenPrice error: Provide "chain" param'); + throw new GraphQLError('Provide "chain" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } return tokenService.getProtocolTokenPrice(chain); }, diff --git a/apps/api/gql/resolvers/user.resolvers.ts b/apps/api/gql/resolvers/user.resolvers.ts index 1d0690ac7..0d2344e8b 100644 --- a/apps/api/gql/resolvers/user.resolvers.ts +++ b/apps/api/gql/resolvers/user.resolvers.ts @@ -4,6 +4,7 @@ import { getRequiredAccountAddress, isAdminRoute } from '../../../../modules/aut import { tokenService } from '../../../../modules/token/token.service'; import { headerChain } from '../../../../modules/context/header-chain'; import { UserBalancesController } from '../../../../modules/controllers'; +import { GraphQLError } from 'graphql'; const resolvers: Resolvers = { Query: { @@ -12,7 +13,9 @@ const resolvers: Resolvers = { if (!chains && currentChain) { chains = [currentChain]; } else if (!chains) { - throw new Error('userGetPoolBalances error: Provide "chains" param'); + throw new GraphQLError('Provide "chains" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } const accountAddress = address || getRequiredAccountAddress(context); const tokenPrices = await tokenService.getTokenPricesForChains(chains); @@ -33,7 +36,9 @@ const resolvers: Resolvers = { if (!chain && currentChain) { chain = currentChain; } else if (!chain) { - throw new Error('userGetPoolJoinExits error: Provide "chain" param'); + throw new GraphQLError('Provide "chain" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } const accountAddress = address || getRequiredAccountAddress(context); @@ -45,7 +50,9 @@ const resolvers: Resolvers = { if (!chain && currentChain) { chain = currentChain; } else if (!chain) { - throw new Error('userGetSwaps error: Provide "chain" param'); + throw new GraphQLError('Provide "chain" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } const accountAddress = address || getRequiredAccountAddress(context); return userService.getUserSwaps(accountAddress, poolId, chain, first, skip); @@ -55,7 +62,9 @@ const resolvers: Resolvers = { if (!chains && currentChain) { chains = [currentChain]; } else if (!chains) { - throw new Error('userGetStaking error: Provide "chains" param'); + throw new GraphQLError('Provide "chains" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } const accountAddress = address || getRequiredAccountAddress(context); @@ -68,7 +77,9 @@ const resolvers: Resolvers = { const chain = headerChain(); if (!chain) { - throw new Error('userSyncChangedWalletBalancesForAllPools error: Provide "chainId" header'); + throw new GraphQLError('Provide "chainId" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } await UserBalancesController().syncBalances(chain); @@ -79,7 +90,9 @@ const resolvers: Resolvers = { isAdminRoute(context); if (!chain) { - throw new Error('userInitWalletBalancesForAllPools error: Provide "chain" param'); + throw new GraphQLError('Provide "chain" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } await UserBalancesController().syncBalances(chain); diff --git a/apps/api/gql/resolvers/vebal.resolvers.ts b/apps/api/gql/resolvers/vebal.resolvers.ts index af1710655..01f3b2258 100644 --- a/apps/api/gql/resolvers/vebal.resolvers.ts +++ b/apps/api/gql/resolvers/vebal.resolvers.ts @@ -3,6 +3,7 @@ import { getRequiredAccountAddress, isAdminRoute } from '../../../../modules/aut import { veBalService } from '../../../../modules/vebal/vebal.service'; import { veBalVotingListService } from '../../../../modules/vebal/vebal-voting-list.service'; import { headerChain } from '../../../../modules/context/header-chain'; +import { GraphQLError } from 'graphql'; const resolvers: Resolvers = { Query: { @@ -11,7 +12,9 @@ const resolvers: Resolvers = { if (!chain && currentChain) { chain = currentChain; } else if (!chain) { - throw new Error('veBalGetUserBalance error: Provide "chains" param'); + throw new GraphQLError('Provide "chain" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } const accountAddress = address || getRequiredAccountAddress(context); @@ -33,7 +36,9 @@ const resolvers: Resolvers = { if (!chain && currentChain) { chain = currentChain; } else if (!chain) { - throw new Error('veBalGetUser error: Provide "chains" param'); + throw new GraphQLError('Provide "chain" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } const accountAddress = address || getRequiredAccountAddress(context); @@ -44,7 +49,9 @@ const resolvers: Resolvers = { if (!chain && currentChain) { chain = currentChain; } else if (!chain) { - throw new Error('veBalGetTotalSupply error: Provide "chains" param'); + throw new GraphQLError('Provide "chain" param', { + extensions: { code: 'GRAPHQL_VALIDATION_FAILED' }, + }); } return veBalService.getVeBalTotalSupply(chain); }, diff --git a/apps/api/sentry.ts b/apps/api/sentry.ts index f2bffee70..8ea129b70 100644 --- a/apps/api/sentry.ts +++ b/apps/api/sentry.ts @@ -1,8 +1,5 @@ import * as Sentry from '@sentry/node'; import { env } from '../env'; -import { ApolloServerPlugin } from 'apollo-server-plugin-base'; -import { ApolloError } from 'apollo-server-express'; -import { ResolverContext } from './gql/resolver-context'; // Ensure to call this before importing any other modules! export const initApiSentry = () => { @@ -52,47 +49,3 @@ export const initApiSentry = () => { }, }); }; - -// Ref: https://blog.sentry.io/handling-graphql-errors-using-sentry/ -export const apolloSentryPlugin: ApolloServerPlugin = { - async requestDidStart({ request, context }) { - return { - // This will send any errors captured by Apollo Server to Sentry - async didEncounterErrors(ctx) { - for (const err of ctx.errors) { - // Only report internal server errors, - // all errors extending ApolloError should be user-facing - if (err instanceof ApolloError) { - continue; - } - - // Ignore specific errors - if (err.message === 'SOR queryBatchSwap failed') { - continue; - } - - // Potentially set transaction name to the operation name, - // add tags and fingerprint to group errors - - // Sentry.withScope((scope) => { - // let name = request.operationName; - // if (!name) { - // name = request.query - // ?.substring( - // request.query?.indexOf('{') + 1, - // request.query?.indexOf('(') || request.query?.length, - // ) - // .replace(/\n/g, '') - // .replace(/\s/g, ''); - // } - // scope.setTransactionName(`POST /graphql ${name}`); - // Sentry.captureException(err); - // }); - - Sentry.captureException(err); - } - }, - async willSendResponse({ context }) {}, - }; - }, -}; diff --git a/apps/api/server.ts b/apps/api/server.ts index d4196a74f..45a691a2a 100644 --- a/apps/api/server.ts +++ b/apps/api/server.ts @@ -1,21 +1,19 @@ -import './sentry'; -import * as Sentry from '@sentry/node'; +import { setupExpressErrorHandler } from '@sentry/node'; import express from 'express'; -import { ApolloServer } from 'apollo-server-express'; +import { ApolloServer } from '@apollo/server'; +import { expressMiddleware } from '@apollo/server/express4'; import helmet from 'helmet'; import * as http from 'http'; import { env } from '../env'; import { loadRestRoutes } from './rest-routes'; import { corsMiddleware, lowerCaseMiddleware, sessionMiddleware } from './middleware'; -import { - ApolloServerPluginDrainHttpServer, - ApolloServerPluginLandingPageGraphQLPlayground, - ApolloServerPluginUsageReporting, -} from 'apollo-server-core'; +import { ApolloServerPluginDrainHttpServer } from '@apollo/server/plugin/drainHttpServer'; +import { ApolloServerPluginUsageReporting } from '@apollo/server/plugin/usageReporting'; +import { ApolloServerPluginLandingPageLocalDefault } from '@apollo/server/plugin/landingPage/default'; import { schema } from '../../graphql_schema_generated'; import { resolvers } from './gql/resolvers'; -import { resolverContext } from './gql/resolver-context'; -import { apolloSentryPlugin } from './sentry'; +import { ResolverContext, resolverContext } from './gql/resolver-context'; +import { apolloSentryPlugin } from './apollo/sentry-plugin'; const configureHelmet = (app: express.Express) => { app.use(helmet.dnsPrefetchControl()); @@ -37,12 +35,10 @@ const configureMiddlewares = (app: express.Express) => { app.use(lowerCaseMiddleware); }; -const configureApolloServer = async (httpServer: http.Server) => { +const configureApolloServer = async (httpServer: http.Server, app: express.Express) => { const plugins = [ ApolloServerPluginDrainHttpServer({ httpServer }), - ApolloServerPluginLandingPageGraphQLPlayground({ - settings: { 'schema.polling.interval': 20000 }, - }), + ApolloServerPluginLandingPageLocalDefault(), apolloSentryPlugin, ]; @@ -55,15 +51,24 @@ const configureApolloServer = async (httpServer: http.Server) => { ); } - const server = new ApolloServer({ + const server = new ApolloServer({ resolvers, typeDefs: schema, introspection: true, + cache: 'bounded', plugins, - context: ({ req }) => resolverContext(req), }); await server.start(); + + app.use( + '/graphql', + express.json(), + expressMiddleware(server, { + context: async ({ req }) => resolverContext(req), + }), + ); + return server; }; @@ -71,15 +76,14 @@ export const startApiServer = async () => { const app = express(); loadRestRoutes(app); - Sentry.setupExpressErrorHandler(app); + setupExpressErrorHandler(app); configureHelmet(app); configureMiddlewares(app); const httpServer = http.createServer(app); - const apolloServer = await configureApolloServer(httpServer); - apolloServer.applyMiddleware({ app }); + await configureApolloServer(httpServer, app); await new Promise((resolve) => httpServer.listen({ port: env.PORT }, resolve)); - console.log(`🚀 Server ready at http://localhost:${env.PORT}${apolloServer.graphqlPath}`); + console.log(`🚀 Server ready at http://localhost:${env.PORT}/graphql`); }; diff --git a/bun.lockb b/bun.lockb index d9c203dd6398674a41ab4a6bb824c2ce15e2cabd..b2f7d580ccbfb92301354521fc2e4b22877194b2 100755 GIT binary patch delta 95124 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 Y{V_Jqi()Md3@Ox}y{Bn<#Ey>mFSw=_wg3PC delta 98060 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 Z8qwPHxJ2|+nY>HI(e9?sSH+{={{uQ14iEqU diff --git a/modules/auth/auth-context.ts b/modules/auth/auth-context.ts index d0e6bb95b..e0481fbbc 100644 --- a/modules/auth/auth-context.ts +++ b/modules/auth/auth-context.ts @@ -1,9 +1,14 @@ import { env } from '../../apps/env'; import { ResolverContext } from '../../apps/api/gql/resolver-context'; +import { GraphQLError } from 'graphql'; export function getRequiredAccountAddress(context: ResolverContext) { if (!context?.accountAddress) { - throw new Error('Account address is required'); + throw new GraphQLError('Account address is required', { + extensions: { + code: 'ACCOUNT_ADDRESS_REQUIRED', + }, + }); } return context.accountAddress; @@ -11,6 +16,10 @@ export function getRequiredAccountAddress(context: ResolverContext) { export function isAdminRoute(context: ResolverContext) { if (!context?.adminApiKey || context.adminApiKey !== env.ADMIN_API_KEY) { - throw new Error('Missing or invalid admin api key'); + throw new GraphQLError('Missing or invalid admin api key', { + extensions: { + code: 'ACCESS_DENIED', + }, + }); } } diff --git a/modules/pool/lib/pool-gql-loader.service.ts b/modules/pool/lib/pool-gql-loader.service.ts index dc1df9f33..8d766713e 100644 --- a/modules/pool/lib/pool-gql-loader.service.ts +++ b/modules/pool/lib/pool-gql-loader.service.ts @@ -53,6 +53,7 @@ import { ElementData, FxData, GyroData, StableData } from '../subgraph-mapper'; import { ZERO_ADDRESS } from '@balancer/sdk'; import { tokenService } from '../../token/token.service'; import { HookData } from '../../sources/transformers'; +import { GraphQLError } from 'graphql'; const isToken = (text: string) => text.match(/^0x[0-9a-fA-F]{40}$/); const isPoolId = (text: string) => isToken(text) || text.match(/^0x[0-9a-fA-F]{64}$/); @@ -68,11 +69,11 @@ export class PoolGqlLoaderService { }); if (!pool) { - throw new Error('Pool with id does not exist'); + throw new GraphQLError('Pool with id does not exist', { extensions: { code: 'NOT_FOUND' } }); } if (pool.type === 'UNKNOWN') { - throw new Error('Pool exists, but has an unknown type'); + throw new GraphQLError('Pool exists, but has an unknown type', { extensions: { code: 'NOT_FOUND' } }); } const mappedPool = this.mapPoolToGqlPool( diff --git a/package.json b/package.json index 50c3cee36..0776ed120 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "mutation": "sh scripts/run_mutation.sh" }, "dependencies": { + "@apollo/server": "^4.11.3", "@aws-sdk/client-cloudwatch": "^3.388.0", "@aws-sdk/client-secrets-manager": "^3.195.0", "@aws-sdk/client-sqs": "^3.137.0", @@ -33,8 +34,6 @@ "@sentry/node": "^8.0.0", "@sentry/tracing": "^7.0.0", "abitype": "^1.0.0", - "apollo-server-core": "^3.5.0", - "apollo-server-express": "^3.5.0", "axios": "^0.24.0", "bignumber.js": "^9.0.2", "decimal.js": "^10.3.1", From 3d704194815dec5e720655b42fb880820a6b401e Mon Sep 17 00:00:00 2001 From: gmbronco <83549293+gmbronco@users.noreply.github.com> Date: Wed, 15 Jan 2025 19:16:00 +0100 Subject: [PATCH 2/2] gql schema generation --- .../api/gql/generated-schema-ast.ts | 2 +- schema.ts => apps/api/gql/generated-schema.ts | 2 +- apps/api/gql/resolvers/beets.resolvers.ts | 2 +- apps/api/gql/resolvers/blocks.resolvers.ts | 2 +- apps/api/gql/resolvers/content.resolvers.ts | 2 +- apps/api/gql/resolvers/pool.resolvers.ts | 2 +- apps/api/gql/resolvers/protocol.resolvers.ts | 2 +- apps/api/gql/resolvers/scalar.resolvers.ts | 2 +- apps/api/gql/resolvers/sftmx.resolvers.ts | 2 +- apps/api/gql/resolvers/sor.resolvers.ts | 2 +- apps/api/gql/resolvers/sts.resolvers.ts | 2 +- apps/api/gql/resolvers/token.resolvers.ts | 2 +- apps/api/gql/resolvers/user.resolvers.ts | 2 +- apps/api/gql/resolvers/vebal.resolvers.ts | 2 +- apps/api/server.ts | 2 +- codegen.ts | 8 +- .../snapshots/pool-snapshot-service.ts | 2 +- modules/content/content-types.ts | 2 +- modules/controllers/event-query-controller.ts | 2 +- modules/controllers/sftmx-controller.ts | 2 +- modules/controllers/sts-controller.ts | 6 +- modules/network/network-config-types.ts | 2 +- modules/pool/lib/pool-gql-loader.service.ts | 2 +- modules/pool/lib/pool-snapshot.service.ts | 2 +- modules/pool/lib/pool-swap.service.ts | 2 +- .../pool/lib/reliquary-snapshot.service.ts | 2 +- modules/pool/pool.service.ts | 2 +- modules/protocol/protocol.service.ts | 2 +- modules/sor/sor.service.ts | 2 +- .../lib/poolsV2/weighted/weightedPool.ts | 2 +- .../lib/poolsV3/weighted/weightedPool.ts | 2 +- modules/sor/sorV2/sorPathService.ts | 2 +- modules/sor/sorV2/swapResultV2.ts | 2 +- modules/sor/types.ts | 7 +- modules/sor/utils.ts | 2 +- .../aura/generated/aura-subgraph-types.ts | 9 +- .../balancer-v3-pools/generated/types.ts | 26 +- .../balancer-v3-vault/generated/types.ts | 235 ++-- .../subgraphs/cow-amm/generated/types.ts | 102 +- .../generated/sftmx-subgraph-types.ts | 29 +- .../generated/sts-subgraph-types.ts | 29 +- .../generated/balancer-subgraph-types.ts | 1043 ++++++++--------- .../generated/beets-bar-subgraph-types.ts | 300 +++-- .../generated/blocks-subgraph-types.ts | 16 +- .../generated/gauge-subgraph-types.ts | 201 ++-- .../generated/masterchef-subgraph-types.ts | 117 +- .../generated/reliquary-subgraph-types.ts | 205 ++-- .../generated/veBal-locks-subgraph-types.ts | 45 +- modules/token/lib/token-price.service.ts | 2 +- modules/token/token.service.ts | 2 +- modules/user/user.service.ts | 2 +- .../vebal/special-pools/hardcoded-pools.ts | 2 +- modules/vebal/vebal-voting-list.service.ts | 2 +- modules/vebal/vebal.service.ts | 2 +- stellate-beets-canary.ts | 137 --- 55 files changed, 1201 insertions(+), 1390 deletions(-) rename graphql_schema_generated.ts => apps/api/gql/generated-schema-ast.ts (99%) rename schema.ts => apps/api/gql/generated-schema.ts (99%) delete mode 100644 stellate-beets-canary.ts diff --git a/graphql_schema_generated.ts b/apps/api/gql/generated-schema-ast.ts similarity index 99% rename from graphql_schema_generated.ts rename to apps/api/gql/generated-schema-ast.ts index 0ef9c4552..ae73c1f66 100644 --- a/graphql_schema_generated.ts +++ b/apps/api/gql/generated-schema-ast.ts @@ -1,4 +1,4 @@ -import { gql } from 'apollo-server-express'; +import { gql } from 'graphql-request'; export const schema = gql` # # THIS FILE IS AUTOGENERATED — DO NOT EDIT IT diff --git a/schema.ts b/apps/api/gql/generated-schema.ts similarity index 99% rename from schema.ts rename to apps/api/gql/generated-schema.ts index 4251022aa..c7613e371 100644 --- a/schema.ts +++ b/apps/api/gql/generated-schema.ts @@ -2,7 +2,7 @@ * THIS FILE IS AUTOGENERATED — DO NOT EDIT IT */ import { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql'; -import { ResolverContext } from './apps/api/gql/resolver-context'; +import { ResolverContext } from './resolver-context'; export type Maybe = T | null; export type InputMaybe = Maybe; export type Exact = { [K in keyof T]: T[K] }; diff --git a/apps/api/gql/resolvers/beets.resolvers.ts b/apps/api/gql/resolvers/beets.resolvers.ts index a471ea604..8f9cf0f57 100644 --- a/apps/api/gql/resolvers/beets.resolvers.ts +++ b/apps/api/gql/resolvers/beets.resolvers.ts @@ -1,4 +1,4 @@ -import { Resolvers } from '../../../../schema'; +import { Resolvers } from '../generated-schema'; import { beetsService } from '../../../../modules/beets/beets.service'; import { getRequiredAccountAddress, isAdminRoute } from '../../../../modules/auth/auth-context'; import { userService } from '../../../../modules/user/user.service'; diff --git a/apps/api/gql/resolvers/blocks.resolvers.ts b/apps/api/gql/resolvers/blocks.resolvers.ts index 0cefe65ee..27506f333 100644 --- a/apps/api/gql/resolvers/blocks.resolvers.ts +++ b/apps/api/gql/resolvers/blocks.resolvers.ts @@ -1,4 +1,4 @@ -import { Resolvers } from '../../../../schema'; +import { Resolvers } from '../generated-schema'; import { isAdminRoute } from '../../../../modules/auth/auth-context'; import { blocksSubgraphService } from '../../../../modules/subgraphs/blocks-subgraph/blocks-subgraph.service'; diff --git a/apps/api/gql/resolvers/content.resolvers.ts b/apps/api/gql/resolvers/content.resolvers.ts index ed07b0c4f..b1d05c6b9 100644 --- a/apps/api/gql/resolvers/content.resolvers.ts +++ b/apps/api/gql/resolvers/content.resolvers.ts @@ -1,4 +1,4 @@ -import { Resolvers } from '../../../../schema'; +import { Resolvers } from '../generated-schema'; import { headerChain } from '../../../../modules/context/header-chain'; import { SanityContentService } from '../../../../modules/content/sanity-content.service'; import { GraphQLError } from 'graphql'; diff --git a/apps/api/gql/resolvers/pool.resolvers.ts b/apps/api/gql/resolvers/pool.resolvers.ts index ed3810b14..4c1c3fdef 100644 --- a/apps/api/gql/resolvers/pool.resolvers.ts +++ b/apps/api/gql/resolvers/pool.resolvers.ts @@ -1,5 +1,5 @@ import { poolService } from '../../../../modules/pool/pool.service'; -import { GqlChain, Resolvers } from '../../../../schema'; +import { GqlChain, Resolvers } from '../generated-schema'; import { isAdminRoute } from '../../../../modules/auth/auth-context'; import { networkContext } from '../../../../modules/network/network-context.service'; import { headerChain } from '../../../../modules/context/header-chain'; diff --git a/apps/api/gql/resolvers/protocol.resolvers.ts b/apps/api/gql/resolvers/protocol.resolvers.ts index c4bb1b2c1..787d00f37 100644 --- a/apps/api/gql/resolvers/protocol.resolvers.ts +++ b/apps/api/gql/resolvers/protocol.resolvers.ts @@ -1,4 +1,4 @@ -import { GqlLatestSyncedBlocks, Resolvers } from '../../../../schema'; +import { GqlLatestSyncedBlocks, Resolvers } from '../generated-schema'; import { protocolService } from '../../../../modules/protocol/protocol.service'; import { networkContext } from '../../../../modules/network/network-context.service'; import { headerChain } from '../../../../modules/context/header-chain'; diff --git a/apps/api/gql/resolvers/scalar.resolvers.ts b/apps/api/gql/resolvers/scalar.resolvers.ts index 3e128a8aa..0787f2eb6 100644 --- a/apps/api/gql/resolvers/scalar.resolvers.ts +++ b/apps/api/gql/resolvers/scalar.resolvers.ts @@ -1,4 +1,4 @@ -import { Resolvers } from '../../../../schema'; +import { Resolvers } from '../generated-schema'; import { GraphQLScalarType, Kind } from 'graphql'; const dateScalar = new GraphQLScalarType({ diff --git a/apps/api/gql/resolvers/sftmx.resolvers.ts b/apps/api/gql/resolvers/sftmx.resolvers.ts index 79b270c40..75cba8ca5 100644 --- a/apps/api/gql/resolvers/sftmx.resolvers.ts +++ b/apps/api/gql/resolvers/sftmx.resolvers.ts @@ -1,4 +1,4 @@ -import { Resolvers } from '../../../../schema'; +import { Resolvers } from '../generated-schema'; import { SftmxController } from '../../../../modules/controllers'; const resolvers: Resolvers = { diff --git a/apps/api/gql/resolvers/sor.resolvers.ts b/apps/api/gql/resolvers/sor.resolvers.ts index 98b216dc9..b0266584d 100644 --- a/apps/api/gql/resolvers/sor.resolvers.ts +++ b/apps/api/gql/resolvers/sor.resolvers.ts @@ -1,4 +1,4 @@ -import { Resolvers } from '../../../../schema'; +import { Resolvers } from '../generated-schema'; import { sorService } from '../../../../modules/sor/sor.service'; import { headerChain } from '../../../../modules/context/header-chain'; import { GraphQLError } from 'graphql'; diff --git a/apps/api/gql/resolvers/sts.resolvers.ts b/apps/api/gql/resolvers/sts.resolvers.ts index d9fb8687b..d59fec58d 100644 --- a/apps/api/gql/resolvers/sts.resolvers.ts +++ b/apps/api/gql/resolvers/sts.resolvers.ts @@ -1,4 +1,4 @@ -import { Resolvers } from '../../../../schema'; +import { Resolvers } from '../generated-schema'; import { StakedSonicController } from '../../../../modules/controllers'; const resolvers: Resolvers = { diff --git a/apps/api/gql/resolvers/token.resolvers.ts b/apps/api/gql/resolvers/token.resolvers.ts index 62f32c4fb..3d287bb58 100644 --- a/apps/api/gql/resolvers/token.resolvers.ts +++ b/apps/api/gql/resolvers/token.resolvers.ts @@ -1,4 +1,4 @@ -import { GqlChain, GqlHistoricalTokenPrice, Resolvers } from '../../../../schema'; +import { GqlChain, GqlHistoricalTokenPrice, Resolvers } from '../generated-schema'; import _ from 'lodash'; import { isAdminRoute } from '../../../../modules/auth/auth-context'; import { tokenService } from '../../../../modules/token/token.service'; diff --git a/apps/api/gql/resolvers/user.resolvers.ts b/apps/api/gql/resolvers/user.resolvers.ts index 0d2344e8b..c37aa0524 100644 --- a/apps/api/gql/resolvers/user.resolvers.ts +++ b/apps/api/gql/resolvers/user.resolvers.ts @@ -1,4 +1,4 @@ -import { Resolvers } from '../../../../schema'; +import { Resolvers } from '../generated-schema'; import { userService } from '../../../../modules/user/user.service'; import { getRequiredAccountAddress, isAdminRoute } from '../../../../modules/auth/auth-context'; import { tokenService } from '../../../../modules/token/token.service'; diff --git a/apps/api/gql/resolvers/vebal.resolvers.ts b/apps/api/gql/resolvers/vebal.resolvers.ts index 01f3b2258..3b0bae6f3 100644 --- a/apps/api/gql/resolvers/vebal.resolvers.ts +++ b/apps/api/gql/resolvers/vebal.resolvers.ts @@ -1,4 +1,4 @@ -import { Resolvers } from '../../../../schema'; +import { Resolvers } from '../generated-schema'; import { getRequiredAccountAddress, isAdminRoute } from '../../../../modules/auth/auth-context'; import { veBalService } from '../../../../modules/vebal/vebal.service'; import { veBalVotingListService } from '../../../../modules/vebal/vebal-voting-list.service'; diff --git a/apps/api/server.ts b/apps/api/server.ts index 45a691a2a..0d1d9e8e0 100644 --- a/apps/api/server.ts +++ b/apps/api/server.ts @@ -10,7 +10,7 @@ import { corsMiddleware, lowerCaseMiddleware, sessionMiddleware } from './middle import { ApolloServerPluginDrainHttpServer } from '@apollo/server/plugin/drainHttpServer'; import { ApolloServerPluginUsageReporting } from '@apollo/server/plugin/usageReporting'; import { ApolloServerPluginLandingPageLocalDefault } from '@apollo/server/plugin/landingPage/default'; -import { schema } from '../../graphql_schema_generated'; +import { schema } from './gql/generated-schema-ast'; import { resolvers } from './gql/resolvers'; import { ResolverContext, resolverContext } from './gql/resolver-context'; import { apolloSentryPlugin } from './apollo/sentry-plugin'; diff --git a/codegen.ts b/codegen.ts index e727be325..a4fdcb6f2 100644 --- a/codegen.ts +++ b/codegen.ts @@ -121,20 +121,20 @@ const files = { }, }, }, - ['graphql_schema_generated.ts']: { + ['apps/api/gql/generated-schema-ast.ts']: { schema: './apps/api/gql/schema/*.gql', plugins: [ { add: { content: - "import { gql } from 'apollo-server-express';\nexport const schema = gql`\n#\n# THIS FILE IS AUTOGENERATED — DO NOT EDIT IT\n#\n", + "import { gql } from 'graphql-request';\nexport const schema = gql`\n#\n# THIS FILE IS AUTOGENERATED — DO NOT EDIT IT\n#\n", }, }, 'schema-ast', { add: { content: '`;', placement: 'append' } }, ], }, - ['schema.ts']: { + ['apps/api/gql/generated-schema.ts']: { schema: './apps/api/gql/schema/*.gql', plugins: [ { @@ -150,7 +150,7 @@ const files = { immutableTypes: false, useIndexSignature: true, enumsAsTypes: true, - contextType: './apps/api/gql/resolver-context#ResolverContext', + contextType: './resolver-context#ResolverContext', scalars: { Date: 'Date', UUID: 'string', diff --git a/modules/actions/snapshots/pool-snapshot-service.ts b/modules/actions/snapshots/pool-snapshot-service.ts index d1fc01ec4..7fac53eae 100644 --- a/modules/actions/snapshots/pool-snapshot-service.ts +++ b/modules/actions/snapshots/pool-snapshot-service.ts @@ -4,7 +4,7 @@ import { OrderDirection, PoolSnapshot_OrderBy, } from '../../subgraphs/balancer-subgraph/generated/balancer-subgraph-types'; -import { GqlPoolSnapshotDataRange } from '../../../schema'; +import { GqlPoolSnapshotDataRange } from '../../../apps/api/gql/generated-schema'; import moment from 'moment-timezone'; import _ from 'lodash'; import { Chain, PrismaPoolSnapshot } from '@prisma/client'; diff --git a/modules/content/content-types.ts b/modules/content/content-types.ts index 8168b55e3..1b3d7ba95 100644 --- a/modules/content/content-types.ts +++ b/modules/content/content-types.ts @@ -1,5 +1,5 @@ import { Chain } from '@prisma/client'; -import { GqlChain } from '../../schema'; +import { GqlChain } from '../../apps/api/gql/generated-schema'; export interface ConfigHomeScreen { featuredPoolGroups: HomeScreenFeaturedPoolGroup[]; diff --git a/modules/controllers/event-query-controller.ts b/modules/controllers/event-query-controller.ts index 4e7096f94..a7f7bf7e0 100644 --- a/modules/controllers/event-query-controller.ts +++ b/modules/controllers/event-query-controller.ts @@ -4,7 +4,7 @@ import { GqlPoolSwapEventV3, QueryPoolEventsArgs, GqlPoolSwapEventCowAmm, -} from '../../schema'; +} from '../../apps/api/gql/generated-schema'; import { prisma } from '../../prisma/prisma-client'; import { Chain, PoolEventType, Prisma } from '@prisma/client'; import { JoinExitEvent, SwapEvent } from '../../prisma/prisma-types'; diff --git a/modules/controllers/sftmx-controller.ts b/modules/controllers/sftmx-controller.ts index d789d3483..b5e92b1f9 100644 --- a/modules/controllers/sftmx-controller.ts +++ b/modules/controllers/sftmx-controller.ts @@ -13,7 +13,7 @@ import { GqlSftmxWithdrawalRequests, GqlSftmxStakingData, GqlSftmxStakingSnapshot, -} from '../../schema'; +} from '../../apps/api/gql/generated-schema'; const SFTMX_STACKINGCONTRACT = config['FANTOM'].sftmx!.stakingContractAddress; diff --git a/modules/controllers/sts-controller.ts b/modules/controllers/sts-controller.ts index f09c333aa..94b6ba750 100644 --- a/modules/controllers/sts-controller.ts +++ b/modules/controllers/sts-controller.ts @@ -2,7 +2,11 @@ import config from '../../config'; import { getViemClient } from '../sources/viem-client'; import { Address } from 'viem'; import { prisma } from '../../prisma/prisma-client'; -import { GqlStakedSonicData, GqlStakedSonicSnapshot, GqlStakedSonicSnapshotDataRange } from '../../schema'; +import { + GqlStakedSonicData, + GqlStakedSonicSnapshot, + GqlStakedSonicSnapshotDataRange, +} from '../../apps/api/gql/generated-schema'; import { syncStakingData } from '../actions/sts/sync-staking-data'; import { StsSubgraphService } from '../sources/subgraphs/sts-subgraph/sts.service'; import { syncSonicStakingSnapshots } from '../actions/sts/sync-staking-snapshots'; diff --git a/modules/network/network-config-types.ts b/modules/network/network-config-types.ts index 7c3ee2f32..5c3fcbaf5 100644 --- a/modules/network/network-config-types.ts +++ b/modules/network/network-config-types.ts @@ -3,7 +3,7 @@ import type { BigNumber } from 'ethers'; import type { PoolAprService } from '../pool/pool-types'; import type { UserStakedBalanceService } from '../user/user-types'; import type { BaseProvider } from '@ethersproject/providers'; -import type { GqlChain } from '../../schema'; +import type { GqlChain } from '../../apps/api/gql/generated-schema'; import type { ContentService } from '../content/content-types'; import type { YbAprConfig } from './apr-config-types'; import type { BalancerSubgraphService } from '../subgraphs/balancer-subgraph/balancer-subgraph.service'; diff --git a/modules/pool/lib/pool-gql-loader.service.ts b/modules/pool/lib/pool-gql-loader.service.ts index 8d766713e..a761f4f5b 100644 --- a/modules/pool/lib/pool-gql-loader.service.ts +++ b/modules/pool/lib/pool-gql-loader.service.ts @@ -37,7 +37,7 @@ import { GqlPoolAggregator, LiquidityManagement, GqlHook, -} from '../../../schema'; +} from '../../../apps/api/gql/generated-schema'; import { addressesMatch } from '../../web3/addresses'; import _ from 'lodash'; import { prisma } from '../../../prisma/prisma-client'; diff --git a/modules/pool/lib/pool-snapshot.service.ts b/modules/pool/lib/pool-snapshot.service.ts index 64ca73c72..7571705bd 100644 --- a/modules/pool/lib/pool-snapshot.service.ts +++ b/modules/pool/lib/pool-snapshot.service.ts @@ -4,7 +4,7 @@ import { OrderDirection, PoolSnapshot_OrderBy, } from '../../subgraphs/balancer-subgraph/generated/balancer-subgraph-types'; -import { GqlPoolSnapshotDataRange } from '../../../schema'; +import { GqlPoolSnapshotDataRange } from '../../../apps/api/gql/generated-schema'; import moment from 'moment-timezone'; import _ from 'lodash'; import { Chain, PrismaPoolSnapshot } from '@prisma/client'; diff --git a/modules/pool/lib/pool-swap.service.ts b/modules/pool/lib/pool-swap.service.ts index 0e42bb827..0d32fdcb0 100644 --- a/modules/pool/lib/pool-swap.service.ts +++ b/modules/pool/lib/pool-swap.service.ts @@ -12,7 +12,7 @@ import { QueryPoolGetBatchSwapsArgs, QueryPoolGetJoinExitsArgs, QueryPoolGetSwapsArgs, -} from '../../../schema'; +} from '../../../apps/api/gql/generated-schema'; import { Chain, PrismaPoolSwap } from '@prisma/client'; import _ from 'lodash'; import { PrismaPoolBatchSwapWithSwaps } from '../../../prisma/prisma-types'; diff --git a/modules/pool/lib/reliquary-snapshot.service.ts b/modules/pool/lib/reliquary-snapshot.service.ts index edf532f7c..2310239ab 100644 --- a/modules/pool/lib/reliquary-snapshot.service.ts +++ b/modules/pool/lib/reliquary-snapshot.service.ts @@ -1,5 +1,5 @@ import { prisma } from '../../../prisma/prisma-client'; -import { GqlPoolSnapshotDataRange } from '../../../schema'; +import { GqlPoolSnapshotDataRange } from '../../../apps/api/gql/generated-schema'; import moment from 'moment-timezone'; import _ from 'lodash'; import { prismaBulkExecuteOperations } from '../../../prisma/prisma-util'; diff --git a/modules/pool/pool.service.ts b/modules/pool/pool.service.ts index 10c0a88d2..edb8ef5b3 100644 --- a/modules/pool/pool.service.ts +++ b/modules/pool/pool.service.ts @@ -16,7 +16,7 @@ import { QueryPoolGetJoinExitsArgs, QueryPoolGetPoolsArgs, QueryPoolGetSwapsArgs, -} from '../../schema'; +} from '../../apps/api/gql/generated-schema'; import { blocksSubgraphService } from '../subgraphs/blocks-subgraph/blocks-subgraph.service'; import { tokenService } from '../token/token.service'; import { userService } from '../user/user.service'; diff --git a/modules/protocol/protocol.service.ts b/modules/protocol/protocol.service.ts index 9496736b5..318a22059 100644 --- a/modules/protocol/protocol.service.ts +++ b/modules/protocol/protocol.service.ts @@ -4,7 +4,7 @@ import { Cache } from 'memory-cache'; import { Chain, PrismaLastBlockSyncedCategory, PrismaUserBalanceType } from '@prisma/client'; import _ from 'lodash'; import { networkContext } from '../network/network-context.service'; -import { GqlProtocolMetricsAggregated, GqlProtocolMetricsChain } from '../../schema'; +import { GqlProtocolMetricsAggregated, GqlProtocolMetricsChain } from '../../apps/api/gql/generated-schema'; import axios from 'axios'; import config from '../../config'; diff --git a/modules/sor/sor.service.ts b/modules/sor/sor.service.ts index 93f8c1b5e..bd6c244b6 100644 --- a/modules/sor/sor.service.ts +++ b/modules/sor/sor.service.ts @@ -4,7 +4,7 @@ import { GqlSorGetSwapsResponse, QuerySorGetSwapPathsArgs, QuerySorGetSwapsArgs, -} from '../../schema'; +} from '../../apps/api/gql/generated-schema'; import { sorV2Service } from './sorV2/sorPathService'; import { GetSwapsV2Input as GetSwapPathsInput } from './types'; import { getToken, getTokenAmountHuman, swapPathsZeroResponse, zeroResponse } from './utils'; diff --git a/modules/sor/sorV2/lib/poolsV2/weighted/weightedPool.ts b/modules/sor/sorV2/lib/poolsV2/weighted/weightedPool.ts index 82bba3917..63d264bb4 100644 --- a/modules/sor/sorV2/lib/poolsV2/weighted/weightedPool.ts +++ b/modules/sor/sorV2/lib/poolsV2/weighted/weightedPool.ts @@ -1,5 +1,5 @@ import { PrismaPoolAndHookWithDynamic } from '../../../../../../prisma/prisma-types'; -import { GqlPoolType } from '../../../../../../schema'; +import { GqlPoolType } from '../../../../../../apps/api/gql/generated-schema'; import { Chain } from '@prisma/client'; import { MathSol, WAD } from '../../utils/math'; import { Address, Hex, parseEther } from 'viem'; diff --git a/modules/sor/sorV2/lib/poolsV3/weighted/weightedPool.ts b/modules/sor/sorV2/lib/poolsV3/weighted/weightedPool.ts index 0e755beb2..5d788704b 100644 --- a/modules/sor/sorV2/lib/poolsV3/weighted/weightedPool.ts +++ b/modules/sor/sorV2/lib/poolsV3/weighted/weightedPool.ts @@ -4,7 +4,7 @@ import { AddKind, RemoveKind, Vault, Weighted, WeightedState, HookState } from ' import { Chain } from '@prisma/client'; import { PrismaPoolAndHookWithDynamic } from '../../../../../../prisma/prisma-types'; -import { GqlPoolType } from '../../../../../../schema'; +import { GqlPoolType } from '../../../../../../apps/api/gql/generated-schema'; import { TokenPairData } from '../../../../../sources/contracts/v3/fetch-tokenpair-data'; import { chainToChainId as chainToIdMap } from '../../../../../network/chain-id-to-chain'; diff --git a/modules/sor/sorV2/sorPathService.ts b/modules/sor/sorV2/sorPathService.ts index 61e36894b..0b1defee0 100644 --- a/modules/sor/sorV2/sorPathService.ts +++ b/modules/sor/sorV2/sorPathService.ts @@ -8,7 +8,7 @@ import { GqlSorSwapRouteHop, GqlSorSwapType, GqlSwapCallDataInput, -} from '../../../schema'; +} from '../../../apps/api/gql/generated-schema'; import { Chain, Prisma, PrismaPoolType } from '@prisma/client'; import { PrismaPoolAndHookWithDynamic, prismaPoolAndHookWithDynamic } from '../../../prisma/prisma-types'; import { prisma } from '../../../prisma/prisma-client'; diff --git a/modules/sor/sorV2/swapResultV2.ts b/modules/sor/sorV2/swapResultV2.ts index 53f2da6ba..cec652770 100644 --- a/modules/sor/sorV2/swapResultV2.ts +++ b/modules/sor/sorV2/swapResultV2.ts @@ -5,7 +5,7 @@ import { GqlPoolMinimal, GqlSorSwapRoute, GqlSorSwapRouteHop, -} from '../../../schema'; +} from '../../../apps/api/gql/generated-schema'; import { Chain } from '@prisma/client'; import { SwapResult } from '../types'; import { poolService } from '../../pool/pool.service'; diff --git a/modules/sor/types.ts b/modules/sor/types.ts index 11f87cbd6..a918fbca4 100644 --- a/modules/sor/types.ts +++ b/modules/sor/types.ts @@ -1,5 +1,10 @@ import { Chain } from '@prisma/client'; -import { GqlSorSwapType, GqlSorGetSwapsResponse, GqlSorSwapOptionsInput, GqlSwapCallDataInput } from '../../schema'; +import { + GqlSorSwapType, + GqlSorGetSwapsResponse, + GqlSorSwapOptionsInput, + GqlSwapCallDataInput, +} from '../../apps/api/gql/generated-schema'; import { TokenAmount } from '@balancer/sdk'; export interface GetSwapsInput { chain: Chain; diff --git a/modules/sor/utils.ts b/modules/sor/utils.ts index b4bc880f5..a85d2b19d 100644 --- a/modules/sor/utils.ts +++ b/modules/sor/utils.ts @@ -1,7 +1,7 @@ import { tokenService } from '../token/token.service'; import { Chain } from '@prisma/client'; import { chainToChainId as chainToIdMap } from '../network/chain-id-to-chain'; -import { GqlSorGetSwapPaths, GqlSorGetSwapsResponse, GqlSorSwapType } from '../../schema'; +import { GqlSorGetSwapPaths, GqlSorGetSwapsResponse, GqlSorSwapType } from '../../apps/api/gql/generated-schema'; import { replaceZeroAddressWithEth } from '../web3/addresses'; import { Address } from 'viem'; import { Token, TokenAmount } from '@balancer/sdk'; diff --git a/modules/sources/subgraphs/aura/generated/aura-subgraph-types.ts b/modules/sources/subgraphs/aura/generated/aura-subgraph-types.ts index b0a76ab6a..4d370a9cf 100644 --- a/modules/sources/subgraphs/aura/generated/aura-subgraph-types.ts +++ b/modules/sources/subgraphs/aura/generated/aura-subgraph-types.ts @@ -400,7 +400,7 @@ export type VaultSchemaHistoricApRsArgs = { }; export type AllPoolsQueryVariables = Exact<{ - chainIds?: Maybe | Scalars['Int']>; + chainIds?: InputMaybe | Scalars['Int']>; }>; export type AllPoolsQuery = { @@ -427,7 +427,7 @@ export type PoolSchemaFragment = { }; export type AccountsQueryVariables = Exact<{ - ids?: Maybe | Scalars['String']>; + ids?: InputMaybe | Scalars['String']>; }>; export type AccountsQuery = { @@ -515,9 +515,10 @@ export const AccountsDocument = gql` export type SdkFunctionWrapper = ( action: (requestHeaders?: Record) => Promise, operationName: string, + operationType?: string, ) => Promise; -const defaultWrapper: SdkFunctionWrapper = (action, _operationName) => action(); +const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => action(); export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) { return { @@ -532,6 +533,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'allPools', + 'query', ); }, accounts( @@ -545,6 +547,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'accounts', + 'query', ); }, }; diff --git a/modules/sources/subgraphs/balancer-v3-pools/generated/types.ts b/modules/sources/subgraphs/balancer-v3-pools/generated/types.ts index 8fc64f8b2..9aa7de38c 100644 --- a/modules/sources/subgraphs/balancer-v3-pools/generated/types.ts +++ b/modules/sources/subgraphs/balancer-v3-pools/generated/types.ts @@ -514,7 +514,7 @@ export type FactoryFragment = { id: string; type: PoolType; version: number; - pools?: Array<{ __typename?: 'Pool'; id: string; address: string }> | null | undefined; + pools?: Array<{ __typename?: 'Pool'; id: string; address: string }> | null; }; export type TypePoolFragment = { @@ -522,17 +522,17 @@ export type TypePoolFragment = { id: string; address: string; factory: { __typename?: 'Factory'; id: string; type: PoolType; version: number }; - stableParams?: { __typename?: 'StableParams'; amp: string } | null | undefined; - weightedParams?: { __typename?: 'WeightedParams'; weights: Array } | null | undefined; + stableParams?: { __typename?: 'StableParams'; amp: string } | null; + weightedParams?: { __typename?: 'WeightedParams'; weights: Array } | null; }; export type PoolsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type PoolsQuery = { @@ -542,8 +542,8 @@ export type PoolsQuery = { id: string; address: string; factory: { __typename?: 'Factory'; id: string; type: PoolType; version: number }; - stableParams?: { __typename?: 'StableParams'; amp: string } | null | undefined; - weightedParams?: { __typename?: 'WeightedParams'; weights: Array } | null | undefined; + stableParams?: { __typename?: 'StableParams'; amp: string } | null; + weightedParams?: { __typename?: 'WeightedParams'; weights: Array } | null; }>; }; @@ -601,9 +601,10 @@ export const PoolsDocument = gql` export type SdkFunctionWrapper = ( action: (requestHeaders?: Record) => Promise, operationName: string, + operationType?: string, ) => Promise; -const defaultWrapper: SdkFunctionWrapper = (action, _operationName) => action(); +const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => action(); export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) { return { @@ -615,6 +616,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'Pools', + 'query', ); }, }; diff --git a/modules/sources/subgraphs/balancer-v3-vault/generated/types.ts b/modules/sources/subgraphs/balancer-v3-vault/generated/types.ts index c74c7ecae..06d3d0891 100644 --- a/modules/sources/subgraphs/balancer-v3-vault/generated/types.ts +++ b/modules/sources/subgraphs/balancer-v3-vault/generated/types.ts @@ -2989,12 +2989,12 @@ export type AddRemoveFragment = { }; export type AddRemoveQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type AddRemoveQuery = { @@ -3027,12 +3027,12 @@ export type PoolBalancesFragment = { }; export type PoolBalancesQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type PoolBalancesQuery = { @@ -3056,26 +3056,23 @@ export type MetadataQueryVariables = Exact<{ [key: string]: never }>; export type MetadataQuery = { __typename?: 'Query'; - meta?: - | { - __typename?: '_Meta_'; - deployment: string; - hasIndexingErrors: boolean; - block: { __typename?: '_Block_'; number: number }; - } - | null - | undefined; + meta?: { + __typename?: '_Meta_'; + deployment: string; + hasIndexingErrors: boolean; + block: { __typename?: '_Block_'; number: number }; + } | null; }; export type PoolShareFragment = { __typename?: 'PoolShare'; id: string; balance: string }; export type PoolSharesQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type PoolSharesQuery = { @@ -3104,12 +3101,12 @@ export type PoolSnapshotFragment = { }; export type PoolSnapshotsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type PoolSnapshotsQuery = { @@ -3163,18 +3160,15 @@ export type VaultPoolFragment = { totalProtocolYieldFee: string; paysYieldFees: boolean; scalingFactor: string; - nestedPool?: - | { - __typename?: 'Pool'; - id: string; - tokens: Array<{ - __typename?: 'PoolToken'; - address: string; - nestedPool?: { __typename?: 'Pool'; id: string } | null | undefined; - }>; - } - | null - | undefined; + nestedPool?: { + __typename?: 'Pool'; + id: string; + tokens: Array<{ + __typename?: 'PoolToken'; + address: string; + nestedPool?: { __typename?: 'Pool'; id: string } | null; + }>; + } | null; }>; rateProviders: Array<{ __typename?: 'RateProvider'; @@ -3205,12 +3199,12 @@ export type VaultPoolFragment = { }; export type PoolsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type PoolsQuery = { @@ -3243,18 +3237,15 @@ export type PoolsQuery = { totalProtocolYieldFee: string; paysYieldFees: boolean; scalingFactor: string; - nestedPool?: - | { - __typename?: 'Pool'; - id: string; - tokens: Array<{ - __typename?: 'PoolToken'; - address: string; - nestedPool?: { __typename?: 'Pool'; id: string } | null | undefined; - }>; - } - | null - | undefined; + nestedPool?: { + __typename?: 'Pool'; + id: string; + tokens: Array<{ + __typename?: 'PoolToken'; + address: string; + nestedPool?: { __typename?: 'Pool'; id: string } | null; + }>; + } | null; }>; rateProviders: Array<{ __typename?: 'RateProvider'; @@ -3305,12 +3296,12 @@ export type SwapFragment = { }; export type SwapsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type SwapsQuery = { @@ -3338,35 +3329,34 @@ export type SwapsQuery = { export type UserFragment = { __typename?: 'User'; id: string; - swaps?: - | Array<{ - __typename?: 'Swap'; - id: string; - pool: string; - tokenIn: string; - tokenOut: string; - tokenAmountIn: string; - tokenAmountOut: string; - swapFeeAmount: string; - blockNumber: string; - blockTimestamp: string; - transactionHash: string; - }> - | null - | undefined; - shares?: - | Array<{ __typename?: 'PoolShare'; id: string; balance: string; pool: { __typename?: 'Pool'; id: string } }> - | null - | undefined; + swaps?: Array<{ + __typename?: 'Swap'; + id: string; + pool: string; + tokenIn: string; + tokenOut: string; + tokenAmountIn: string; + tokenAmountOut: string; + swapFeeAmount: string; + blockNumber: string; + blockTimestamp: string; + transactionHash: string; + }> | null; + shares?: Array<{ + __typename?: 'PoolShare'; + id: string; + balance: string; + pool: { __typename?: 'Pool'; id: string }; + }> | null; }; export type UsersQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type UsersQuery = { @@ -3374,31 +3364,25 @@ export type UsersQuery = { users: Array<{ __typename?: 'User'; id: string; - swaps?: - | Array<{ - __typename?: 'Swap'; - id: string; - pool: string; - tokenIn: string; - tokenOut: string; - tokenAmountIn: string; - tokenAmountOut: string; - swapFeeAmount: string; - blockNumber: string; - blockTimestamp: string; - transactionHash: string; - }> - | null - | undefined; - shares?: - | Array<{ - __typename?: 'PoolShare'; - id: string; - balance: string; - pool: { __typename?: 'Pool'; id: string }; - }> - | null - | undefined; + swaps?: Array<{ + __typename?: 'Swap'; + id: string; + pool: string; + tokenIn: string; + tokenOut: string; + tokenAmountIn: string; + tokenAmountOut: string; + swapFeeAmount: string; + blockNumber: string; + blockTimestamp: string; + transactionHash: string; + }> | null; + shares?: Array<{ + __typename?: 'PoolShare'; + id: string; + balance: string; + pool: { __typename?: 'Pool'; id: string }; + }> | null; }>; }; @@ -3745,9 +3729,10 @@ export const UsersDocument = gql` export type SdkFunctionWrapper = ( action: (requestHeaders?: Record) => Promise, operationName: string, + operationType?: string, ) => Promise; -const defaultWrapper: SdkFunctionWrapper = (action, _operationName) => action(); +const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => action(); export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) { return { @@ -3762,6 +3747,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'AddRemove', + 'query', ); }, PoolBalances( @@ -3775,6 +3761,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'PoolBalances', + 'query', ); }, Metadata( @@ -3788,6 +3775,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'Metadata', + 'query', ); }, PoolShares( @@ -3801,6 +3789,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'PoolShares', + 'query', ); }, PoolSnapshots( @@ -3814,6 +3803,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'PoolSnapshots', + 'query', ); }, Pools(variables?: PoolsQueryVariables, requestHeaders?: Dom.RequestInit['headers']): Promise { @@ -3824,6 +3814,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'Pools', + 'query', ); }, Swaps(variables?: SwapsQueryVariables, requestHeaders?: Dom.RequestInit['headers']): Promise { @@ -3834,6 +3825,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'Swaps', + 'query', ); }, Users(variables?: UsersQueryVariables, requestHeaders?: Dom.RequestInit['headers']): Promise { @@ -3844,6 +3836,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'Users', + 'query', ); }, }; diff --git a/modules/sources/subgraphs/cow-amm/generated/types.ts b/modules/sources/subgraphs/cow-amm/generated/types.ts index eefd13557..39c736dad 100644 --- a/modules/sources/subgraphs/cow-amm/generated/types.ts +++ b/modules/sources/subgraphs/cow-amm/generated/types.ts @@ -1723,12 +1723,12 @@ export type CowAmmAddRemoveFragment = { }; export type AddRemovesQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type AddRemovesQuery = { @@ -1765,10 +1765,10 @@ export type CowAmmSwapFragment = { blockTimestamp: string; transactionHash: string; logIndex: string; - surplusAmount?: string | null | undefined; - surplusToken?: string | null | undefined; - swapFeeAmount?: string | null | undefined; - swapFeeToken?: string | null | undefined; + surplusAmount?: string | null; + surplusToken?: string | null; + swapFeeAmount?: string | null; + swapFeeToken?: string | null; pool: { __typename?: 'Pool'; id: string; @@ -1778,12 +1778,12 @@ export type CowAmmSwapFragment = { }; export type SwapsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type SwapsQuery = { @@ -1801,10 +1801,10 @@ export type SwapsQuery = { blockTimestamp: string; transactionHash: string; logIndex: string; - surplusAmount?: string | null | undefined; - surplusToken?: string | null | undefined; - swapFeeAmount?: string | null | undefined; - swapFeeToken?: string | null | undefined; + surplusAmount?: string | null; + surplusToken?: string | null; + swapFeeAmount?: string | null; + swapFeeToken?: string | null; pool: { __typename?: 'Pool'; id: string; @@ -1818,26 +1818,23 @@ export type MetadataQueryVariables = Exact<{ [key: string]: never }>; export type MetadataQuery = { __typename?: 'Query'; - meta?: - | { - __typename?: '_Meta_'; - deployment: string; - hasIndexingErrors: boolean; - block: { __typename?: '_Block_'; number: number }; - } - | null - | undefined; + meta?: { + __typename?: '_Meta_'; + deployment: string; + hasIndexingErrors: boolean; + block: { __typename?: '_Block_'; number: number }; + } | null; }; export type PoolShareFragment = { __typename?: 'PoolShare'; id: string; balance: string }; export type PoolSharesQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type PoolSharesQuery = { @@ -1873,12 +1870,12 @@ export type CowAmmPoolFragment = { }; export type PoolsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type PoolsQuery = { @@ -1909,16 +1906,16 @@ export type PoolsQuery = { weight: string; }>; }>; - _meta?: { __typename?: '_Meta_'; block: { __typename?: '_Block_'; number: number } } | null | undefined; + _meta?: { __typename?: '_Meta_'; block: { __typename?: '_Block_'; number: number } } | null; }; export type SnapshotsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type SnapshotsQuery = { @@ -2202,9 +2199,10 @@ export const SnapshotsDocument = gql` export type SdkFunctionWrapper = ( action: (requestHeaders?: Record) => Promise, operationName: string, + operationType?: string, ) => Promise; -const defaultWrapper: SdkFunctionWrapper = (action, _operationName) => action(); +const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => action(); export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) { return { @@ -2219,6 +2217,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'AddRemoves', + 'query', ); }, Swaps(variables?: SwapsQueryVariables, requestHeaders?: Dom.RequestInit['headers']): Promise { @@ -2229,6 +2228,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'Swaps', + 'query', ); }, Metadata( @@ -2242,6 +2242,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'Metadata', + 'query', ); }, PoolShares( @@ -2255,6 +2256,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'PoolShares', + 'query', ); }, Pools(variables?: PoolsQueryVariables, requestHeaders?: Dom.RequestInit['headers']): Promise { @@ -2265,6 +2267,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'Pools', + 'query', ); }, Snapshots( @@ -2278,6 +2281,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'Snapshots', + 'query', ); }, }; diff --git a/modules/sources/subgraphs/sftmx-subgraph/generated/sftmx-subgraph-types.ts b/modules/sources/subgraphs/sftmx-subgraph/generated/sftmx-subgraph-types.ts index e7a5c2277..508dc189c 100644 --- a/modules/sources/subgraphs/sftmx-subgraph/generated/sftmx-subgraph-types.ts +++ b/modules/sources/subgraphs/sftmx-subgraph/generated/sftmx-subgraph-types.ts @@ -860,12 +860,12 @@ export enum _SubgraphErrorPolicy_ { } export type WithdrawalRequestsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type WithdrawalRequestsQuery = { @@ -881,12 +881,12 @@ export type WithdrawalRequestsQuery = { }; export type FtmStakingSnapshotsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type FtmStakingSnapshotsQuery = { @@ -990,9 +990,10 @@ export const FtmStakingSnapshotsDocument = gql` export type SdkFunctionWrapper = ( action: (requestHeaders?: Record) => Promise, operationName: string, + operationType?: string, ) => Promise; -const defaultWrapper: SdkFunctionWrapper = (action, _operationName) => action(); +const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => action(); export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) { return { @@ -1007,6 +1008,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'WithdrawalRequests', + 'query', ); }, ftmStakingSnapshots( @@ -1020,6 +1022,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'ftmStakingSnapshots', + 'query', ); }, }; diff --git a/modules/sources/subgraphs/sts-subgraph/generated/sts-subgraph-types.ts b/modules/sources/subgraphs/sts-subgraph/generated/sts-subgraph-types.ts index a69c741b8..a4b0c3e47 100644 --- a/modules/sources/subgraphs/sts-subgraph/generated/sts-subgraph-types.ts +++ b/modules/sources/subgraphs/sts-subgraph/generated/sts-subgraph-types.ts @@ -433,12 +433,12 @@ export enum _SubgraphErrorPolicy_ { } export type ValidatorsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type ValidatorsQuery = { @@ -447,12 +447,12 @@ export type ValidatorsQuery = { }; export type SonicStakingSnapshotsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type SonicStakingSnapshotsQuery = { @@ -544,9 +544,10 @@ export const SonicStakingSnapshotsDocument = gql` export type SdkFunctionWrapper = ( action: (requestHeaders?: Record) => Promise, operationName: string, + operationType?: string, ) => Promise; -const defaultWrapper: SdkFunctionWrapper = (action, _operationName) => action(); +const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => action(); export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) { return { @@ -561,6 +562,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'Validators', + 'query', ); }, SonicStakingSnapshots( @@ -574,6 +576,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'SonicStakingSnapshots', + 'query', ); }, }; diff --git a/modules/subgraphs/balancer-subgraph/generated/balancer-subgraph-types.ts b/modules/subgraphs/balancer-subgraph/generated/balancer-subgraph-types.ts index 17182c371..639599228 100644 --- a/modules/subgraphs/balancer-subgraph/generated/balancer-subgraph-types.ts +++ b/modules/subgraphs/balancer-subgraph/generated/balancer-subgraph-types.ts @@ -5883,12 +5883,12 @@ export enum _SubgraphErrorPolicy_ { } export type BalancerProtocolDataQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type BalancerProtocolDataQuery = { @@ -5905,36 +5905,30 @@ export type BalancerProtocolDataQuery = { export type BalancerUserQueryVariables = Exact<{ id: Scalars['ID']; - block?: Maybe; + block?: InputMaybe; }>; export type BalancerUserQuery = { __typename?: 'Query'; - user?: - | { - __typename?: 'User'; - id: string; - sharesOwned?: - | Array<{ - __typename?: 'PoolShare'; - id: string; - balance: string; - poolId: { __typename?: 'Pool'; id: string }; - }> - | null - | undefined; - } - | null - | undefined; + user?: { + __typename?: 'User'; + id: string; + sharesOwned?: Array<{ + __typename?: 'PoolShare'; + id: string; + balance: string; + poolId: { __typename?: 'Pool'; id: string }; + }> | null; + } | null; }; export type BalancerUsersQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type BalancerUsersQuery = { @@ -5942,34 +5936,33 @@ export type BalancerUsersQuery = { users: Array<{ __typename?: 'User'; id: string; - sharesOwned?: - | Array<{ - __typename?: 'PoolShare'; - id: string; - balance: string; - poolId: { __typename?: 'Pool'; id: string }; - }> - | null - | undefined; + sharesOwned?: Array<{ + __typename?: 'PoolShare'; + id: string; + balance: string; + poolId: { __typename?: 'Pool'; id: string }; + }> | null; }>; }; export type BalancerUserFragment = { __typename?: 'User'; id: string; - sharesOwned?: - | Array<{ __typename?: 'PoolShare'; id: string; balance: string; poolId: { __typename?: 'Pool'; id: string } }> - | null - | undefined; + sharesOwned?: Array<{ + __typename?: 'PoolShare'; + id: string; + balance: string; + poolId: { __typename?: 'Pool'; id: string }; + }> | null; }; export type BalancerPoolSharesQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type BalancerPoolSharesQuery = { @@ -5990,12 +5983,12 @@ export type BalancerPoolShareFragment = { }; export type BalancerTokenPricesQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type BalancerTokenPricesQuery = { @@ -6026,12 +6019,12 @@ export type BalancerTokenPriceFragment = { }; export type BalancerTokensQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type BalancerTokensQuery = { @@ -6039,40 +6032,40 @@ export type BalancerTokensQuery = { tokens: Array<{ __typename?: 'Token'; id: string; - symbol?: string | null | undefined; + symbol?: string | null; address: string; - latestFXPrice?: string | null | undefined; - latestUSDPrice?: string | null | undefined; + latestFXPrice?: string | null; + latestUSDPrice?: string | null; totalVolumeNotional: string; totalVolumeUSD: string; totalSwapCount: string; - latestPrice?: { __typename?: 'LatestPrice'; pricingAsset: string; price: string } | null | undefined; + latestPrice?: { __typename?: 'LatestPrice'; pricingAsset: string; price: string } | null; }>; }; export type BalancerTokenFragment = { __typename?: 'Token'; id: string; - symbol?: string | null | undefined; + symbol?: string | null; address: string; - latestFXPrice?: string | null | undefined; - latestUSDPrice?: string | null | undefined; + latestFXPrice?: string | null; + latestUSDPrice?: string | null; totalVolumeNotional: string; totalVolumeUSD: string; totalSwapCount: string; - latestPrice?: { __typename?: 'LatestPrice'; pricingAsset: string; price: string } | null | undefined; + latestPrice?: { __typename?: 'LatestPrice'; pricingAsset: string; price: string } | null; }; export type BalancerPoolFragment = { __typename?: 'Pool'; id: string; address: string; - poolType?: string | null | undefined; - poolTypeVersion?: number | null | undefined; - symbol?: string | null | undefined; - name?: string | null | undefined; + poolType?: string | null; + poolTypeVersion?: number | null; + symbol?: string | null; + name?: string | null; swapFee: string; - totalWeight?: string | null | undefined; + totalWeight?: string | null; totalSwapVolume: string; totalSwapFee: string; totalLiquidity: string; @@ -6082,61 +6075,55 @@ export type BalancerPoolFragment = { createTime: number; swapEnabled: boolean; tokensList: Array; - lowerTarget?: string | null | undefined; - upperTarget?: string | null | undefined; - mainIndex?: number | null | undefined; - wrappedIndex?: number | null | undefined; - factory?: string | null | undefined; - expiryTime?: string | null | undefined; - unitSeconds?: string | null | undefined; - principalToken?: string | null | undefined; - baseToken?: string | null | undefined; - owner?: string | null | undefined; - amp?: string | null | undefined; - alpha?: string | null | undefined; - beta?: string | null | undefined; - sqrtAlpha?: string | null | undefined; - sqrtBeta?: string | null | undefined; - root3Alpha?: string | null | undefined; - c?: string | null | undefined; - s?: string | null | undefined; - lambda?: string | null | undefined; - tauAlphaX?: string | null | undefined; - tauAlphaY?: string | null | undefined; - tauBetaX?: string | null | undefined; - tauBetaY?: string | null | undefined; - u?: string | null | undefined; - v?: string | null | undefined; - w?: string | null | undefined; - z?: string | null | undefined; - dSq?: string | null | undefined; - delta?: string | null | undefined; - epsilon?: string | null | undefined; - priceRateProviders?: - | Array<{ - __typename?: 'PriceRateProvider'; - address: string; - token: { __typename?: 'PoolToken'; address: string }; - }> - | null - | undefined; - tokens?: - | Array<{ - __typename?: 'PoolToken'; - id: string; - symbol: string; - name: string; - decimals: number; - address: string; - balance: string; - weight?: string | null | undefined; - priceRate: string; - isExemptFromYieldProtocolFee?: boolean | null | undefined; - index?: number | null | undefined; - token: { __typename?: 'Token'; latestFXPrice?: string | null | undefined }; - }> - | null - | undefined; + lowerTarget?: string | null; + upperTarget?: string | null; + mainIndex?: number | null; + wrappedIndex?: number | null; + factory?: string | null; + expiryTime?: string | null; + unitSeconds?: string | null; + principalToken?: string | null; + baseToken?: string | null; + owner?: string | null; + amp?: string | null; + alpha?: string | null; + beta?: string | null; + sqrtAlpha?: string | null; + sqrtBeta?: string | null; + root3Alpha?: string | null; + c?: string | null; + s?: string | null; + lambda?: string | null; + tauAlphaX?: string | null; + tauAlphaY?: string | null; + tauBetaX?: string | null; + tauBetaY?: string | null; + u?: string | null; + v?: string | null; + w?: string | null; + z?: string | null; + dSq?: string | null; + delta?: string | null; + epsilon?: string | null; + priceRateProviders?: Array<{ + __typename?: 'PriceRateProvider'; + address: string; + token: { __typename?: 'PoolToken'; address: string }; + }> | null; + tokens?: Array<{ + __typename?: 'PoolToken'; + id: string; + symbol: string; + name: string; + decimals: number; + address: string; + balance: string; + weight?: string | null; + priceRate: string; + isExemptFromYieldProtocolFee?: boolean | null; + index?: number | null; + token: { __typename?: 'Token'; latestFXPrice?: string | null }; + }> | null; }; export type BalancerPoolTokenFragment = { @@ -6147,20 +6134,20 @@ export type BalancerPoolTokenFragment = { decimals: number; address: string; balance: string; - weight?: string | null | undefined; + weight?: string | null; priceRate: string; - isExemptFromYieldProtocolFee?: boolean | null | undefined; - index?: number | null | undefined; - token: { __typename?: 'Token'; latestFXPrice?: string | null | undefined }; + isExemptFromYieldProtocolFee?: boolean | null; + index?: number | null; + token: { __typename?: 'Token'; latestFXPrice?: string | null }; }; export type BalancerPoolsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type BalancerPoolsQuery = { @@ -6169,12 +6156,12 @@ export type BalancerPoolsQuery = { __typename?: 'Pool'; id: string; address: string; - poolType?: string | null | undefined; - poolTypeVersion?: number | null | undefined; - symbol?: string | null | undefined; - name?: string | null | undefined; + poolType?: string | null; + poolTypeVersion?: number | null; + symbol?: string | null; + name?: string | null; swapFee: string; - totalWeight?: string | null | undefined; + totalWeight?: string | null; totalSwapVolume: string; totalSwapFee: string; totalLiquidity: string; @@ -6184,158 +6171,143 @@ export type BalancerPoolsQuery = { createTime: number; swapEnabled: boolean; tokensList: Array; - lowerTarget?: string | null | undefined; - upperTarget?: string | null | undefined; - mainIndex?: number | null | undefined; - wrappedIndex?: number | null | undefined; - factory?: string | null | undefined; - expiryTime?: string | null | undefined; - unitSeconds?: string | null | undefined; - principalToken?: string | null | undefined; - baseToken?: string | null | undefined; - owner?: string | null | undefined; - amp?: string | null | undefined; - alpha?: string | null | undefined; - beta?: string | null | undefined; - sqrtAlpha?: string | null | undefined; - sqrtBeta?: string | null | undefined; - root3Alpha?: string | null | undefined; - c?: string | null | undefined; - s?: string | null | undefined; - lambda?: string | null | undefined; - tauAlphaX?: string | null | undefined; - tauAlphaY?: string | null | undefined; - tauBetaX?: string | null | undefined; - tauBetaY?: string | null | undefined; - u?: string | null | undefined; - v?: string | null | undefined; - w?: string | null | undefined; - z?: string | null | undefined; - dSq?: string | null | undefined; - delta?: string | null | undefined; - epsilon?: string | null | undefined; - priceRateProviders?: - | Array<{ - __typename?: 'PriceRateProvider'; - address: string; - token: { __typename?: 'PoolToken'; address: string }; - }> - | null - | undefined; - tokens?: - | Array<{ - __typename?: 'PoolToken'; - id: string; - symbol: string; - name: string; - decimals: number; - address: string; - balance: string; - weight?: string | null | undefined; - priceRate: string; - isExemptFromYieldProtocolFee?: boolean | null | undefined; - index?: number | null | undefined; - token: { __typename?: 'Token'; latestFXPrice?: string | null | undefined }; - }> - | null - | undefined; + lowerTarget?: string | null; + upperTarget?: string | null; + mainIndex?: number | null; + wrappedIndex?: number | null; + factory?: string | null; + expiryTime?: string | null; + unitSeconds?: string | null; + principalToken?: string | null; + baseToken?: string | null; + owner?: string | null; + amp?: string | null; + alpha?: string | null; + beta?: string | null; + sqrtAlpha?: string | null; + sqrtBeta?: string | null; + root3Alpha?: string | null; + c?: string | null; + s?: string | null; + lambda?: string | null; + tauAlphaX?: string | null; + tauAlphaY?: string | null; + tauBetaX?: string | null; + tauBetaY?: string | null; + u?: string | null; + v?: string | null; + w?: string | null; + z?: string | null; + dSq?: string | null; + delta?: string | null; + epsilon?: string | null; + priceRateProviders?: Array<{ + __typename?: 'PriceRateProvider'; + address: string; + token: { __typename?: 'PoolToken'; address: string }; + }> | null; + tokens?: Array<{ + __typename?: 'PoolToken'; + id: string; + symbol: string; + name: string; + decimals: number; + address: string; + balance: string; + weight?: string | null; + priceRate: string; + isExemptFromYieldProtocolFee?: boolean | null; + index?: number | null; + token: { __typename?: 'Token'; latestFXPrice?: string | null }; + }> | null; }>; }; export type BalancerPoolQueryVariables = Exact<{ id: Scalars['ID']; - block?: Maybe; + block?: InputMaybe; }>; export type BalancerPoolQuery = { __typename?: 'Query'; - pool?: - | { - __typename?: 'Pool'; - id: string; - address: string; - poolType?: string | null | undefined; - poolTypeVersion?: number | null | undefined; - symbol?: string | null | undefined; - name?: string | null | undefined; - swapFee: string; - totalWeight?: string | null | undefined; - totalSwapVolume: string; - totalSwapFee: string; - totalLiquidity: string; - totalShares: string; - swapsCount: string; - holdersCount: string; - createTime: number; - swapEnabled: boolean; - tokensList: Array; - lowerTarget?: string | null | undefined; - upperTarget?: string | null | undefined; - mainIndex?: number | null | undefined; - wrappedIndex?: number | null | undefined; - factory?: string | null | undefined; - expiryTime?: string | null | undefined; - unitSeconds?: string | null | undefined; - principalToken?: string | null | undefined; - baseToken?: string | null | undefined; - owner?: string | null | undefined; - amp?: string | null | undefined; - alpha?: string | null | undefined; - beta?: string | null | undefined; - sqrtAlpha?: string | null | undefined; - sqrtBeta?: string | null | undefined; - root3Alpha?: string | null | undefined; - c?: string | null | undefined; - s?: string | null | undefined; - lambda?: string | null | undefined; - tauAlphaX?: string | null | undefined; - tauAlphaY?: string | null | undefined; - tauBetaX?: string | null | undefined; - tauBetaY?: string | null | undefined; - u?: string | null | undefined; - v?: string | null | undefined; - w?: string | null | undefined; - z?: string | null | undefined; - dSq?: string | null | undefined; - delta?: string | null | undefined; - epsilon?: string | null | undefined; - priceRateProviders?: - | Array<{ - __typename?: 'PriceRateProvider'; - address: string; - token: { __typename?: 'PoolToken'; address: string }; - }> - | null - | undefined; - tokens?: - | Array<{ - __typename?: 'PoolToken'; - id: string; - symbol: string; - name: string; - decimals: number; - address: string; - balance: string; - weight?: string | null | undefined; - priceRate: string; - isExemptFromYieldProtocolFee?: boolean | null | undefined; - index?: number | null | undefined; - token: { __typename?: 'Token'; latestFXPrice?: string | null | undefined }; - }> - | null - | undefined; - } - | null - | undefined; + pool?: { + __typename?: 'Pool'; + id: string; + address: string; + poolType?: string | null; + poolTypeVersion?: number | null; + symbol?: string | null; + name?: string | null; + swapFee: string; + totalWeight?: string | null; + totalSwapVolume: string; + totalSwapFee: string; + totalLiquidity: string; + totalShares: string; + swapsCount: string; + holdersCount: string; + createTime: number; + swapEnabled: boolean; + tokensList: Array; + lowerTarget?: string | null; + upperTarget?: string | null; + mainIndex?: number | null; + wrappedIndex?: number | null; + factory?: string | null; + expiryTime?: string | null; + unitSeconds?: string | null; + principalToken?: string | null; + baseToken?: string | null; + owner?: string | null; + amp?: string | null; + alpha?: string | null; + beta?: string | null; + sqrtAlpha?: string | null; + sqrtBeta?: string | null; + root3Alpha?: string | null; + c?: string | null; + s?: string | null; + lambda?: string | null; + tauAlphaX?: string | null; + tauAlphaY?: string | null; + tauBetaX?: string | null; + tauBetaY?: string | null; + u?: string | null; + v?: string | null; + w?: string | null; + z?: string | null; + dSq?: string | null; + delta?: string | null; + epsilon?: string | null; + priceRateProviders?: Array<{ + __typename?: 'PriceRateProvider'; + address: string; + token: { __typename?: 'PoolToken'; address: string }; + }> | null; + tokens?: Array<{ + __typename?: 'PoolToken'; + id: string; + symbol: string; + name: string; + decimals: number; + address: string; + balance: string; + weight?: string | null; + priceRate: string; + isExemptFromYieldProtocolFee?: boolean | null; + index?: number | null; + token: { __typename?: 'Token'; latestFXPrice?: string | null }; + }> | null; + } | null; }; export type BalancerPoolHistoricalLiquiditiesQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type BalancerPoolHistoricalLiquiditiesQuery = { @@ -6353,12 +6325,12 @@ export type BalancerPoolHistoricalLiquiditiesQuery = { }; export type BalancerPoolSnapshotsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type BalancerPoolSnapshotsQuery = { @@ -6393,12 +6365,12 @@ export type BalancerPoolSnapshotFragment = { }; export type BalancerLatestPricesQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type BalancerLatestPricesQuery = { @@ -6420,27 +6392,24 @@ export type BalancerLatestPriceQueryVariables = Exact<{ export type BalancerLatestPriceQuery = { __typename?: 'Query'; - latestPrice?: - | { - __typename?: 'LatestPrice'; - id: string; - asset: string; - price: string; - pricingAsset: string; - block: string; - poolId: { __typename?: 'Pool'; id: string }; - } - | null - | undefined; + latestPrice?: { + __typename?: 'LatestPrice'; + id: string; + asset: string; + price: string; + pricingAsset: string; + block: string; + poolId: { __typename?: 'Pool'; id: string }; + } | null; }; export type BalancerJoinExitsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type BalancerJoinExitsQuery = { @@ -6450,11 +6419,11 @@ export type BalancerJoinExitsQuery = { amounts: Array; id: string; sender: string; - block?: string | null | undefined; + block?: string | null; timestamp: number; tx: string; type: InvestType; - valueUSD?: string | null | undefined; + valueUSD?: string | null; pool: { __typename?: 'Pool'; id: string; tokensList: Array }; }>; }; @@ -6474,11 +6443,11 @@ export type BalancerJoinExitFragment = { amounts: Array; id: string; sender: string; - block?: string | null | undefined; + block?: string | null; timestamp: number; tx: string; type: InvestType; - valueUSD?: string | null | undefined; + valueUSD?: string | null; pool: { __typename?: 'Pool'; id: string; tokensList: Array }; }; @@ -6489,38 +6458,26 @@ export type BalancerPortfolioDataQueryVariables = Exact<{ export type BalancerPortfolioDataQuery = { __typename?: 'Query'; - user?: - | { - __typename?: 'User'; - id: string; - sharesOwned?: - | Array<{ - __typename?: 'PoolShare'; - id: string; - balance: string; - poolId: { __typename?: 'Pool'; id: string }; - }> - | null - | undefined; - } - | null - | undefined; - previousUser?: - | { - __typename?: 'User'; - id: string; - sharesOwned?: - | Array<{ - __typename?: 'PoolShare'; - id: string; - balance: string; - poolId: { __typename?: 'Pool'; id: string }; - }> - | null - | undefined; - } - | null - | undefined; + user?: { + __typename?: 'User'; + id: string; + sharesOwned?: Array<{ + __typename?: 'PoolShare'; + id: string; + balance: string; + poolId: { __typename?: 'Pool'; id: string }; + }> | null; + } | null; + previousUser?: { + __typename?: 'User'; + id: string; + sharesOwned?: Array<{ + __typename?: 'PoolShare'; + id: string; + balance: string; + poolId: { __typename?: 'Pool'; id: string }; + }> | null; + } | null; }; export type BalancerPortfolioPoolsDataQueryVariables = Exact<{ @@ -6533,12 +6490,12 @@ export type BalancerPortfolioPoolsDataQuery = { __typename?: 'Pool'; id: string; address: string; - poolType?: string | null | undefined; - poolTypeVersion?: number | null | undefined; - symbol?: string | null | undefined; - name?: string | null | undefined; + poolType?: string | null; + poolTypeVersion?: number | null; + symbol?: string | null; + name?: string | null; swapFee: string; - totalWeight?: string | null | undefined; + totalWeight?: string | null; totalSwapVolume: string; totalSwapFee: string; totalLiquidity: string; @@ -6548,72 +6505,66 @@ export type BalancerPortfolioPoolsDataQuery = { createTime: number; swapEnabled: boolean; tokensList: Array; - lowerTarget?: string | null | undefined; - upperTarget?: string | null | undefined; - mainIndex?: number | null | undefined; - wrappedIndex?: number | null | undefined; - factory?: string | null | undefined; - expiryTime?: string | null | undefined; - unitSeconds?: string | null | undefined; - principalToken?: string | null | undefined; - baseToken?: string | null | undefined; - owner?: string | null | undefined; - amp?: string | null | undefined; - alpha?: string | null | undefined; - beta?: string | null | undefined; - sqrtAlpha?: string | null | undefined; - sqrtBeta?: string | null | undefined; - root3Alpha?: string | null | undefined; - c?: string | null | undefined; - s?: string | null | undefined; - lambda?: string | null | undefined; - tauAlphaX?: string | null | undefined; - tauAlphaY?: string | null | undefined; - tauBetaX?: string | null | undefined; - tauBetaY?: string | null | undefined; - u?: string | null | undefined; - v?: string | null | undefined; - w?: string | null | undefined; - z?: string | null | undefined; - dSq?: string | null | undefined; - delta?: string | null | undefined; - epsilon?: string | null | undefined; - priceRateProviders?: - | Array<{ - __typename?: 'PriceRateProvider'; - address: string; - token: { __typename?: 'PoolToken'; address: string }; - }> - | null - | undefined; - tokens?: - | Array<{ - __typename?: 'PoolToken'; - id: string; - symbol: string; - name: string; - decimals: number; - address: string; - balance: string; - weight?: string | null | undefined; - priceRate: string; - isExemptFromYieldProtocolFee?: boolean | null | undefined; - index?: number | null | undefined; - token: { __typename?: 'Token'; latestFXPrice?: string | null | undefined }; - }> - | null - | undefined; + lowerTarget?: string | null; + upperTarget?: string | null; + mainIndex?: number | null; + wrappedIndex?: number | null; + factory?: string | null; + expiryTime?: string | null; + unitSeconds?: string | null; + principalToken?: string | null; + baseToken?: string | null; + owner?: string | null; + amp?: string | null; + alpha?: string | null; + beta?: string | null; + sqrtAlpha?: string | null; + sqrtBeta?: string | null; + root3Alpha?: string | null; + c?: string | null; + s?: string | null; + lambda?: string | null; + tauAlphaX?: string | null; + tauAlphaY?: string | null; + tauBetaX?: string | null; + tauBetaY?: string | null; + u?: string | null; + v?: string | null; + w?: string | null; + z?: string | null; + dSq?: string | null; + delta?: string | null; + epsilon?: string | null; + priceRateProviders?: Array<{ + __typename?: 'PriceRateProvider'; + address: string; + token: { __typename?: 'PoolToken'; address: string }; + }> | null; + tokens?: Array<{ + __typename?: 'PoolToken'; + id: string; + symbol: string; + name: string; + decimals: number; + address: string; + balance: string; + weight?: string | null; + priceRate: string; + isExemptFromYieldProtocolFee?: boolean | null; + index?: number | null; + token: { __typename?: 'Token'; latestFXPrice?: string | null }; + }> | null; }>; previousPools: Array<{ __typename?: 'Pool'; id: string; address: string; - poolType?: string | null | undefined; - poolTypeVersion?: number | null | undefined; - symbol?: string | null | undefined; - name?: string | null | undefined; + poolType?: string | null; + poolTypeVersion?: number | null; + symbol?: string | null; + name?: string | null; swapFee: string; - totalWeight?: string | null | undefined; + totalWeight?: string | null; totalSwapVolume: string; totalSwapFee: string; totalLiquidity: string; @@ -6623,71 +6574,65 @@ export type BalancerPortfolioPoolsDataQuery = { createTime: number; swapEnabled: boolean; tokensList: Array; - lowerTarget?: string | null | undefined; - upperTarget?: string | null | undefined; - mainIndex?: number | null | undefined; - wrappedIndex?: number | null | undefined; - factory?: string | null | undefined; - expiryTime?: string | null | undefined; - unitSeconds?: string | null | undefined; - principalToken?: string | null | undefined; - baseToken?: string | null | undefined; - owner?: string | null | undefined; - amp?: string | null | undefined; - alpha?: string | null | undefined; - beta?: string | null | undefined; - sqrtAlpha?: string | null | undefined; - sqrtBeta?: string | null | undefined; - root3Alpha?: string | null | undefined; - c?: string | null | undefined; - s?: string | null | undefined; - lambda?: string | null | undefined; - tauAlphaX?: string | null | undefined; - tauAlphaY?: string | null | undefined; - tauBetaX?: string | null | undefined; - tauBetaY?: string | null | undefined; - u?: string | null | undefined; - v?: string | null | undefined; - w?: string | null | undefined; - z?: string | null | undefined; - dSq?: string | null | undefined; - delta?: string | null | undefined; - epsilon?: string | null | undefined; - priceRateProviders?: - | Array<{ - __typename?: 'PriceRateProvider'; - address: string; - token: { __typename?: 'PoolToken'; address: string }; - }> - | null - | undefined; - tokens?: - | Array<{ - __typename?: 'PoolToken'; - id: string; - symbol: string; - name: string; - decimals: number; - address: string; - balance: string; - weight?: string | null | undefined; - priceRate: string; - isExemptFromYieldProtocolFee?: boolean | null | undefined; - index?: number | null | undefined; - token: { __typename?: 'Token'; latestFXPrice?: string | null | undefined }; - }> - | null - | undefined; + lowerTarget?: string | null; + upperTarget?: string | null; + mainIndex?: number | null; + wrappedIndex?: number | null; + factory?: string | null; + expiryTime?: string | null; + unitSeconds?: string | null; + principalToken?: string | null; + baseToken?: string | null; + owner?: string | null; + amp?: string | null; + alpha?: string | null; + beta?: string | null; + sqrtAlpha?: string | null; + sqrtBeta?: string | null; + root3Alpha?: string | null; + c?: string | null; + s?: string | null; + lambda?: string | null; + tauAlphaX?: string | null; + tauAlphaY?: string | null; + tauBetaX?: string | null; + tauBetaY?: string | null; + u?: string | null; + v?: string | null; + w?: string | null; + z?: string | null; + dSq?: string | null; + delta?: string | null; + epsilon?: string | null; + priceRateProviders?: Array<{ + __typename?: 'PriceRateProvider'; + address: string; + token: { __typename?: 'PoolToken'; address: string }; + }> | null; + tokens?: Array<{ + __typename?: 'PoolToken'; + id: string; + symbol: string; + name: string; + decimals: number; + address: string; + balance: string; + weight?: string | null; + priceRate: string; + isExemptFromYieldProtocolFee?: boolean | null; + index?: number | null; + token: { __typename?: 'Token'; latestFXPrice?: string | null }; + }> | null; }>; }; export type BalancerTradePairSnapshotsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type BalancerTradePairSnapshotsQuery = { @@ -6700,8 +6645,8 @@ export type BalancerTradePairSnapshotsQuery = { timestamp: number; pair: { __typename?: 'TradePair'; - token0: { __typename?: 'Token'; address: string; symbol?: string | null | undefined }; - token1: { __typename?: 'Token'; address: string; symbol?: string | null | undefined }; + token0: { __typename?: 'Token'; address: string; symbol?: string | null }; + token1: { __typename?: 'Token'; address: string; symbol?: string | null }; }; }>; }; @@ -6714,18 +6659,18 @@ export type BalancerTradePairSnapshotFragment = { timestamp: number; pair: { __typename?: 'TradePair'; - token0: { __typename?: 'Token'; address: string; symbol?: string | null | undefined }; - token1: { __typename?: 'Token'; address: string; symbol?: string | null | undefined }; + token0: { __typename?: 'Token'; address: string; symbol?: string | null }; + token1: { __typename?: 'Token'; address: string; symbol?: string | null }; }; }; export type BalancerSwapsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type BalancerSwapsQuery = { @@ -6743,19 +6688,16 @@ export type BalancerSwapsQuery = { timestamp: number; tx: string; valueUSD: string; - block?: string | null | undefined; + block?: string | null; poolId: { __typename?: 'Pool'; id: string; swapFee: string; - poolType?: string | null | undefined; - tokens?: - | Array<{ - __typename?: 'PoolToken'; - token: { __typename?: 'Token'; address: string; latestFXPrice?: string | null | undefined }; - }> - | null - | undefined; + poolType?: string | null; + tokens?: Array<{ + __typename?: 'PoolToken'; + token: { __typename?: 'Token'; address: string; latestFXPrice?: string | null }; + }> | null; }; userAddress: { __typename?: 'User'; id: string }; }>; @@ -6774,30 +6716,27 @@ export type BalancerSwapFragment = { timestamp: number; tx: string; valueUSD: string; - block?: string | null | undefined; + block?: string | null; poolId: { __typename?: 'Pool'; id: string; swapFee: string; - poolType?: string | null | undefined; - tokens?: - | Array<{ - __typename?: 'PoolToken'; - token: { __typename?: 'Token'; address: string; latestFXPrice?: string | null | undefined }; - }> - | null - | undefined; + poolType?: string | null; + tokens?: Array<{ + __typename?: 'PoolToken'; + token: { __typename?: 'Token'; address: string; latestFXPrice?: string | null }; + }> | null; }; userAddress: { __typename?: 'User'; id: string }; }; export type BalancerAmpUpdatesQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type BalancerAmpUpdatesQuery = { @@ -6824,12 +6763,12 @@ export type BalancerAmpUpdateFragment = { }; export type BalancerGradualWeightUpdatesQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type BalancerGradualWeightUpdatesQuery = { @@ -6867,15 +6806,12 @@ export type BalancerGetMetaQueryVariables = Exact<{ [key: string]: never }>; export type BalancerGetMetaQuery = { __typename?: 'Query'; - meta?: - | { - __typename?: '_Meta_'; - deployment: string; - hasIndexingErrors: boolean; - block: { __typename?: '_Block_'; number: number }; - } - | null - | undefined; + meta?: { + __typename?: '_Meta_'; + deployment: string; + hasIndexingErrors: boolean; + block: { __typename?: '_Block_'; number: number }; + } | null; }; export type PoolBalancesFragment = { @@ -6883,19 +6819,22 @@ export type PoolBalancesFragment = { id: string; address: string; totalShares: string; - tokens?: - | Array<{ __typename?: 'PoolToken'; address: string; decimals: number; balance: string; priceRate: string }> - | null - | undefined; + tokens?: Array<{ + __typename?: 'PoolToken'; + address: string; + decimals: number; + balance: string; + priceRate: string; + }> | null; }; export type PoolBalancesQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type PoolBalancesQuery = { @@ -6905,10 +6844,13 @@ export type PoolBalancesQuery = { id: string; address: string; totalShares: string; - tokens?: - | Array<{ __typename?: 'PoolToken'; address: string; decimals: number; balance: string; priceRate: string }> - | null - | undefined; + tokens?: Array<{ + __typename?: 'PoolToken'; + address: string; + decimals: number; + balance: string; + priceRate: string; + }> | null; }>; }; @@ -7585,9 +7527,10 @@ export const PoolBalancesDocument = gql` export type SdkFunctionWrapper = ( action: (requestHeaders?: Record) => Promise, operationName: string, + operationType?: string, ) => Promise; -const defaultWrapper: SdkFunctionWrapper = (action, _operationName) => action(); +const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => action(); export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) { return { @@ -7602,6 +7545,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BalancerProtocolData', + 'query', ); }, BalancerUser( @@ -7615,6 +7559,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BalancerUser', + 'query', ); }, BalancerUsers( @@ -7628,6 +7573,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BalancerUsers', + 'query', ); }, BalancerPoolShares( @@ -7641,6 +7587,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BalancerPoolShares', + 'query', ); }, BalancerTokenPrices( @@ -7654,6 +7601,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BalancerTokenPrices', + 'query', ); }, BalancerTokens( @@ -7667,6 +7615,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BalancerTokens', + 'query', ); }, BalancerPools( @@ -7680,6 +7629,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BalancerPools', + 'query', ); }, BalancerPool( @@ -7693,6 +7643,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BalancerPool', + 'query', ); }, BalancerPoolHistoricalLiquidities( @@ -7707,6 +7658,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = { ...requestHeaders, ...wrappedRequestHeaders }, ), 'BalancerPoolHistoricalLiquidities', + 'query', ); }, BalancerPoolSnapshots( @@ -7720,6 +7672,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BalancerPoolSnapshots', + 'query', ); }, BalancerLatestPrices( @@ -7733,6 +7686,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BalancerLatestPrices', + 'query', ); }, BalancerLatestPrice( @@ -7746,6 +7700,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BalancerLatestPrice', + 'query', ); }, BalancerJoinExits( @@ -7759,6 +7714,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BalancerJoinExits', + 'query', ); }, BalancerPortfolioData( @@ -7772,6 +7728,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BalancerPortfolioData', + 'query', ); }, BalancerPortfolioPoolsData( @@ -7785,6 +7742,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BalancerPortfolioPoolsData', + 'query', ); }, BalancerTradePairSnapshots( @@ -7798,6 +7756,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BalancerTradePairSnapshots', + 'query', ); }, BalancerSwaps( @@ -7811,6 +7770,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BalancerSwaps', + 'query', ); }, BalancerAmpUpdates( @@ -7824,6 +7784,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BalancerAmpUpdates', + 'query', ); }, BalancerGradualWeightUpdates( @@ -7837,6 +7798,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BalancerGradualWeightUpdates', + 'query', ); }, BalancerGetPoolsWithActiveUpdates( @@ -7851,6 +7813,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = { ...requestHeaders, ...wrappedRequestHeaders }, ), 'BalancerGetPoolsWithActiveUpdates', + 'query', ); }, BalancerGetMeta( @@ -7864,6 +7827,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BalancerGetMeta', + 'query', ); }, PoolBalances( @@ -7877,6 +7841,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'PoolBalances', + 'query', ); }, }; diff --git a/modules/subgraphs/beets-bar-subgraph/generated/beets-bar-subgraph-types.ts b/modules/subgraphs/beets-bar-subgraph/generated/beets-bar-subgraph-types.ts index 426f3ac96..5b0289049 100644 --- a/modules/subgraphs/beets-bar-subgraph/generated/beets-bar-subgraph-types.ts +++ b/modules/subgraphs/beets-bar-subgraph/generated/beets-bar-subgraph-types.ts @@ -497,63 +497,57 @@ export enum _SubgraphErrorPolicy_ { export type GetBeetsBarQueryVariables = Exact<{ id: Scalars['ID']; - block?: Maybe; + block?: InputMaybe; }>; export type GetBeetsBarQuery = { __typename?: 'Query'; - bar?: - | { - __typename?: 'Bar'; - id: string; - address: string; - block: string; - decimals: number; - fBeetsBurned: string; - fBeetsMinted: string; - name: string; - ratio: string; - sharedVestingTokenRevenue: string; - symbol: string; - timestamp: string; - totalSupply: string; - vestingToken: string; - vestingTokenStaked: string; - } - | null - | undefined; + bar?: { + __typename?: 'Bar'; + id: string; + address: string; + block: string; + decimals: number; + fBeetsBurned: string; + fBeetsMinted: string; + name: string; + ratio: string; + sharedVestingTokenRevenue: string; + symbol: string; + timestamp: string; + totalSupply: string; + vestingToken: string; + vestingTokenStaked: string; + } | null; }; export type GetBeetsBarUserQueryVariables = Exact<{ id: Scalars['ID']; - block?: Maybe; + block?: InputMaybe; }>; export type GetBeetsBarUserQuery = { __typename?: 'Query'; - user?: - | { - __typename?: 'User'; - id: string; - address: string; - block: string; - fBeets: string; - timestamp: string; - vestingTokenHarvested: string; - vestingTokenIn: string; - vestingTokenOut: string; - } - | null - | undefined; + user?: { + __typename?: 'User'; + id: string; + address: string; + block: string; + fBeets: string; + timestamp: string; + vestingTokenHarvested: string; + vestingTokenIn: string; + vestingTokenOut: string; + } | null; }; export type BeetsBarUsersQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type BeetsBarUsersQuery = { @@ -609,74 +603,62 @@ export type BeetsBarPortfolioDataQueryVariables = Exact<{ export type BeetsBarPortfolioDataQuery = { __typename?: 'Query'; - beetsBar?: - | { - __typename?: 'Bar'; - id: string; - address: string; - block: string; - decimals: number; - fBeetsBurned: string; - fBeetsMinted: string; - name: string; - ratio: string; - sharedVestingTokenRevenue: string; - symbol: string; - timestamp: string; - totalSupply: string; - vestingToken: string; - vestingTokenStaked: string; - } - | null - | undefined; - previousBeetsBar?: - | { - __typename?: 'Bar'; - id: string; - address: string; - block: string; - decimals: number; - fBeetsBurned: string; - fBeetsMinted: string; - name: string; - ratio: string; - sharedVestingTokenRevenue: string; - symbol: string; - timestamp: string; - totalSupply: string; - vestingToken: string; - vestingTokenStaked: string; - } - | null - | undefined; - beetsBarUser?: - | { - __typename?: 'User'; - id: string; - address: string; - block: string; - fBeets: string; - timestamp: string; - vestingTokenHarvested: string; - vestingTokenIn: string; - vestingTokenOut: string; - } - | null - | undefined; - previousBeetsBarUser?: - | { - __typename?: 'User'; - id: string; - address: string; - block: string; - fBeets: string; - timestamp: string; - vestingTokenHarvested: string; - vestingTokenIn: string; - vestingTokenOut: string; - } - | null - | undefined; + beetsBar?: { + __typename?: 'Bar'; + id: string; + address: string; + block: string; + decimals: number; + fBeetsBurned: string; + fBeetsMinted: string; + name: string; + ratio: string; + sharedVestingTokenRevenue: string; + symbol: string; + timestamp: string; + totalSupply: string; + vestingToken: string; + vestingTokenStaked: string; + } | null; + previousBeetsBar?: { + __typename?: 'Bar'; + id: string; + address: string; + block: string; + decimals: number; + fBeetsBurned: string; + fBeetsMinted: string; + name: string; + ratio: string; + sharedVestingTokenRevenue: string; + symbol: string; + timestamp: string; + totalSupply: string; + vestingToken: string; + vestingTokenStaked: string; + } | null; + beetsBarUser?: { + __typename?: 'User'; + id: string; + address: string; + block: string; + fBeets: string; + timestamp: string; + vestingTokenHarvested: string; + vestingTokenIn: string; + vestingTokenOut: string; + } | null; + previousBeetsBarUser?: { + __typename?: 'User'; + id: string; + address: string; + block: string; + fBeets: string; + timestamp: string; + vestingTokenHarvested: string; + vestingTokenIn: string; + vestingTokenOut: string; + } | null; }; export type BeetsBarDataQueryVariables = Exact<{ @@ -686,61 +668,52 @@ export type BeetsBarDataQueryVariables = Exact<{ export type BeetsBarDataQuery = { __typename?: 'Query'; - beetsBar?: - | { - __typename?: 'Bar'; - id: string; - address: string; - block: string; - decimals: number; - fBeetsBurned: string; - fBeetsMinted: string; - name: string; - ratio: string; - sharedVestingTokenRevenue: string; - symbol: string; - timestamp: string; - totalSupply: string; - vestingToken: string; - vestingTokenStaked: string; - } - | null - | undefined; - previousBeetsBar?: - | { - __typename?: 'Bar'; - id: string; - address: string; - block: string; - decimals: number; - fBeetsBurned: string; - fBeetsMinted: string; - name: string; - ratio: string; - sharedVestingTokenRevenue: string; - symbol: string; - timestamp: string; - totalSupply: string; - vestingToken: string; - vestingTokenStaked: string; - } - | null - | undefined; + beetsBar?: { + __typename?: 'Bar'; + id: string; + address: string; + block: string; + decimals: number; + fBeetsBurned: string; + fBeetsMinted: string; + name: string; + ratio: string; + sharedVestingTokenRevenue: string; + symbol: string; + timestamp: string; + totalSupply: string; + vestingToken: string; + vestingTokenStaked: string; + } | null; + previousBeetsBar?: { + __typename?: 'Bar'; + id: string; + address: string; + block: string; + decimals: number; + fBeetsBurned: string; + fBeetsMinted: string; + name: string; + ratio: string; + sharedVestingTokenRevenue: string; + symbol: string; + timestamp: string; + totalSupply: string; + vestingToken: string; + vestingTokenStaked: string; + } | null; }; export type BeetsBarGetMetaQueryVariables = Exact<{ [key: string]: never }>; export type BeetsBarGetMetaQuery = { __typename?: 'Query'; - meta?: - | { - __typename?: '_Meta_'; - deployment: string; - hasIndexingErrors: boolean; - block: { __typename?: '_Block_'; number: number }; - } - | null - | undefined; + meta?: { + __typename?: '_Meta_'; + deployment: string; + hasIndexingErrors: boolean; + block: { __typename?: '_Block_'; number: number }; + } | null; }; export const BeetsBarFragmentDoc = gql` @@ -855,9 +828,10 @@ export const BeetsBarGetMetaDocument = gql` export type SdkFunctionWrapper = ( action: (requestHeaders?: Record) => Promise, operationName: string, + operationType?: string, ) => Promise; -const defaultWrapper: SdkFunctionWrapper = (action, _operationName) => action(); +const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => action(); export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) { return { @@ -872,6 +846,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'GetBeetsBar', + 'query', ); }, GetBeetsBarUser( @@ -885,6 +860,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'GetBeetsBarUser', + 'query', ); }, BeetsBarUsers( @@ -898,6 +874,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BeetsBarUsers', + 'query', ); }, BeetsBarPortfolioData( @@ -911,6 +888,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BeetsBarPortfolioData', + 'query', ); }, BeetsBarData( @@ -924,6 +902,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BeetsBarData', + 'query', ); }, BeetsBarGetMeta( @@ -937,6 +916,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'BeetsBarGetMeta', + 'query', ); }, }; diff --git a/modules/subgraphs/blocks-subgraph/generated/blocks-subgraph-types.ts b/modules/subgraphs/blocks-subgraph/generated/blocks-subgraph-types.ts index a8e25e133..651c08324 100644 --- a/modules/subgraphs/blocks-subgraph/generated/blocks-subgraph-types.ts +++ b/modules/subgraphs/blocks-subgraph/generated/blocks-subgraph-types.ts @@ -360,12 +360,12 @@ export enum _SubgraphErrorPolicy_ { } export type BlocksQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type BlocksQuery = { @@ -408,9 +408,10 @@ export const BlocksDocument = gql` export type SdkFunctionWrapper = ( action: (requestHeaders?: Record) => Promise, operationName: string, + operationType?: string, ) => Promise; -const defaultWrapper: SdkFunctionWrapper = (action, _operationName) => action(); +const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => action(); export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) { return { @@ -422,6 +423,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'Blocks', + 'query', ); }, }; diff --git a/modules/subgraphs/gauge-subgraph/generated/gauge-subgraph-types.ts b/modules/subgraphs/gauge-subgraph/generated/gauge-subgraph-types.ts index af21cdc78..8016f0a57 100644 --- a/modules/subgraphs/gauge-subgraph/generated/gauge-subgraph-types.ts +++ b/modules/subgraphs/gauge-subgraph/generated/gauge-subgraph-types.ts @@ -2318,11 +2318,11 @@ export enum _SubgraphErrorPolicy_ { } export type GaugeLiquidityGaugesQueryVariables = Exact<{ - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - skip?: Maybe; - where?: Maybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; }>; export type GaugeLiquidityGaugesQuery = { @@ -2330,56 +2330,48 @@ export type GaugeLiquidityGaugesQuery = { liquidityGauges: Array<{ __typename?: 'LiquidityGauge'; id: string; - poolId?: string | null | undefined; + poolId?: string | null; poolAddress: string; totalSupply: string; - streamer?: string | null | undefined; + streamer?: string | null; isPreferentialGauge: boolean; isKilled: boolean; - tokens?: - | Array<{ - __typename?: 'RewardToken'; - id: string; - decimals: number; - symbol: string; - rate?: string | null | undefined; - periodFinish?: string | null | undefined; - }> - | null - | undefined; - shares?: - | Array<{ __typename?: 'GaugeShare'; balance: string; user: { __typename?: 'User'; id: string } }> - | null - | undefined; - gauge?: { __typename?: 'Gauge'; addedTimestamp: number } | null | undefined; + tokens?: Array<{ + __typename?: 'RewardToken'; + id: string; + decimals: number; + symbol: string; + rate?: string | null; + periodFinish?: string | null; + }> | null; + shares?: Array<{ + __typename?: 'GaugeShare'; + balance: string; + user: { __typename?: 'User'; id: string }; + }> | null; + gauge?: { __typename?: 'Gauge'; addedTimestamp: number } | null; }>; }; export type GaugeFragment = { __typename?: 'LiquidityGauge'; id: string; - poolId?: string | null | undefined; + poolId?: string | null; poolAddress: string; totalSupply: string; - streamer?: string | null | undefined; + streamer?: string | null; isPreferentialGauge: boolean; isKilled: boolean; - tokens?: - | Array<{ - __typename?: 'RewardToken'; - id: string; - decimals: number; - symbol: string; - rate?: string | null | undefined; - periodFinish?: string | null | undefined; - }> - | null - | undefined; - shares?: - | Array<{ __typename?: 'GaugeShare'; balance: string; user: { __typename?: 'User'; id: string } }> - | null - | undefined; - gauge?: { __typename?: 'Gauge'; addedTimestamp: number } | null | undefined; + tokens?: Array<{ + __typename?: 'RewardToken'; + id: string; + decimals: number; + symbol: string; + rate?: string | null; + periodFinish?: string | null; + }> | null; + shares?: Array<{ __typename?: 'GaugeShare'; balance: string; user: { __typename?: 'User'; id: string } }> | null; + gauge?: { __typename?: 'Gauge'; addedTimestamp: number } | null; }; export type GaugeLiquidityGaugeAddressesQueryVariables = Exact<{ [key: string]: never }>; @@ -2395,47 +2387,38 @@ export type GaugeUserGaugesQueryVariables = Exact<{ export type GaugeUserGaugesQuery = { __typename?: 'Query'; - user?: - | { - __typename?: 'User'; - id: string; - gaugeShares?: - | Array<{ - __typename?: 'GaugeShare'; - balance: string; - gauge: { - __typename?: 'LiquidityGauge'; - id: string; - poolId?: string | null | undefined; - isPreferentialGauge: boolean; - isKilled: boolean; - tokens?: - | Array<{ - __typename?: 'RewardToken'; - id: string; - decimals: number; - symbol: string; - rate?: string | null | undefined; - periodFinish?: string | null | undefined; - }> - | null - | undefined; - }; - }> - | null - | undefined; - } - | null - | undefined; + user?: { + __typename?: 'User'; + id: string; + gaugeShares?: Array<{ + __typename?: 'GaugeShare'; + balance: string; + gauge: { + __typename?: 'LiquidityGauge'; + id: string; + poolId?: string | null; + isPreferentialGauge: boolean; + isKilled: boolean; + tokens?: Array<{ + __typename?: 'RewardToken'; + id: string; + decimals: number; + symbol: string; + rate?: string | null; + periodFinish?: string | null; + }> | null; + }; + }> | null; + } | null; }; export type GaugeSharesQueryVariables = Exact<{ - block?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - skip?: Maybe; - where?: Maybe; + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; }>; export type GaugeSharesQuery = { @@ -2447,7 +2430,7 @@ export type GaugeSharesQuery = { gauge: { __typename?: 'LiquidityGauge'; id: string; - poolId?: string | null | undefined; + poolId?: string | null; poolAddress: string; isPreferentialGauge: boolean; isKilled: boolean; @@ -2463,7 +2446,7 @@ export type GaugeShareFragment = { gauge: { __typename?: 'LiquidityGauge'; id: string; - poolId?: string | null | undefined; + poolId?: string | null; poolAddress: string; isPreferentialGauge: boolean; isKilled: boolean; @@ -2475,24 +2458,21 @@ export type GaugeGetMetaQueryVariables = Exact<{ [key: string]: never }>; export type GaugeGetMetaQuery = { __typename?: 'Query'; - meta?: - | { - __typename?: '_Meta_'; - deployment: string; - hasIndexingErrors: boolean; - block: { __typename?: '_Block_'; number: number }; - } - | null - | undefined; + meta?: { + __typename?: '_Meta_'; + deployment: string; + hasIndexingErrors: boolean; + block: { __typename?: '_Block_'; number: number }; + } | null; }; export type VotingEscrowLocksQueryVariables = Exact<{ - block?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - skip?: Maybe; - where?: Maybe; + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; }>; export type VotingEscrowLocksQuery = { @@ -2506,12 +2486,12 @@ export type VotingEscrowLocksQuery = { }; export type RootGaugesQueryVariables = Exact<{ - block?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - skip?: Maybe; - where?: Maybe; + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; }>; export type RootGaugesQuery = { @@ -2521,7 +2501,7 @@ export type RootGaugesQuery = { id: string; chain: Chain; recipient: string; - gauge?: { __typename?: 'Gauge'; addedTimestamp: number } | null | undefined; + gauge?: { __typename?: 'Gauge'; addedTimestamp: number } | null; }>; }; @@ -2530,11 +2510,11 @@ export type RootGaugeFragment = { id: string; chain: Chain; recipient: string; - gauge?: { __typename?: 'Gauge'; addedTimestamp: number } | null | undefined; + gauge?: { __typename?: 'Gauge'; addedTimestamp: number } | null; }; export type LiquidityGaugesQueryVariables = Exact<{ - ids?: Maybe | Scalars['ID']>; + ids?: InputMaybe | Scalars['ID']>; }>; export type LiquidityGaugesQuery = { @@ -2730,9 +2710,10 @@ export const LiquidityGaugesDocument = gql` export type SdkFunctionWrapper = ( action: (requestHeaders?: Record) => Promise, operationName: string, + operationType?: string, ) => Promise; -const defaultWrapper: SdkFunctionWrapper = (action, _operationName) => action(); +const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => action(); export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) { return { @@ -2747,6 +2728,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'GaugeLiquidityGauges', + 'query', ); }, GaugeLiquidityGaugeAddresses( @@ -2760,6 +2742,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'GaugeLiquidityGaugeAddresses', + 'query', ); }, GaugeUserGauges( @@ -2773,6 +2756,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'GaugeUserGauges', + 'query', ); }, GaugeShares( @@ -2786,6 +2770,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'GaugeShares', + 'query', ); }, GaugeGetMeta( @@ -2799,6 +2784,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'GaugeGetMeta', + 'query', ); }, VotingEscrowLocks( @@ -2812,6 +2798,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'VotingEscrowLocks', + 'query', ); }, RootGauges( @@ -2825,6 +2812,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'RootGauges', + 'query', ); }, LiquidityGauges( @@ -2838,6 +2826,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'LiquidityGauges', + 'query', ); }, }; diff --git a/modules/subgraphs/masterchef-subgraph/generated/masterchef-subgraph-types.ts b/modules/subgraphs/masterchef-subgraph/generated/masterchef-subgraph-types.ts index f42ae54e8..73114e6da 100644 --- a/modules/subgraphs/masterchef-subgraph/generated/masterchef-subgraph-types.ts +++ b/modules/subgraphs/masterchef-subgraph/generated/masterchef-subgraph-types.ts @@ -988,12 +988,12 @@ export enum _SubgraphErrorPolicy_ { } export type MasterchefUsersQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type MasterchefUsersQuery = { @@ -1006,7 +1006,7 @@ export type MasterchefUsersQuery = { rewardDebt: string; beetsHarvested: string; timestamp: string; - pool?: { __typename?: 'Pool'; id: string; pair: string } | null | undefined; + pool?: { __typename?: 'Pool'; id: string; pair: string } | null; }>; }; @@ -1018,16 +1018,16 @@ export type FarmUserFragment = { rewardDebt: string; beetsHarvested: string; timestamp: string; - pool?: { __typename?: 'Pool'; id: string; pair: string } | null | undefined; + pool?: { __typename?: 'Pool'; id: string; pair: string } | null; }; export type MasterchefsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type MasterchefsQuery = { @@ -1045,12 +1045,12 @@ export type MasterchefsQuery = { }; export type MasterchefFarmsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type MasterchefFarmsQuery = { @@ -1067,20 +1067,17 @@ export type MasterchefFarmsQuery = { timestamp: string; block: string; masterChef: { __typename?: 'MasterChef'; id: string; totalAllocPoint: string; beetsPerBlock: string }; - rewarder?: - | { - __typename?: 'Rewarder'; - id: string; - rewardTokens: Array<{ - __typename?: 'RewardToken'; - token: string; - decimals: number; - symbol: string; - rewardPerSecond: string; - }>; - } - | null - | undefined; + rewarder?: { + __typename?: 'Rewarder'; + id: string; + rewardTokens: Array<{ + __typename?: 'RewardToken'; + token: string; + decimals: number; + symbol: string; + rewardPerSecond: string; + }>; + } | null; }>; }; @@ -1096,20 +1093,17 @@ export type FarmFragment = { timestamp: string; block: string; masterChef: { __typename?: 'MasterChef'; id: string; totalAllocPoint: string; beetsPerBlock: string }; - rewarder?: - | { - __typename?: 'Rewarder'; - id: string; - rewardTokens: Array<{ - __typename?: 'RewardToken'; - token: string; - decimals: number; - symbol: string; - rewardPerSecond: string; - }>; - } - | null - | undefined; + rewarder?: { + __typename?: 'Rewarder'; + id: string; + rewardTokens: Array<{ + __typename?: 'RewardToken'; + token: string; + decimals: number; + symbol: string; + rewardPerSecond: string; + }>; + } | null; }; export type MasterchefPortfolioDataQueryVariables = Exact<{ @@ -1127,7 +1121,7 @@ export type MasterchefPortfolioDataQuery = { rewardDebt: string; beetsHarvested: string; timestamp: string; - pool?: { __typename?: 'Pool'; id: string; pair: string } | null | undefined; + pool?: { __typename?: 'Pool'; id: string; pair: string } | null; }>; previousFarmUsers: Array<{ __typename?: 'User'; @@ -1137,7 +1131,7 @@ export type MasterchefPortfolioDataQuery = { rewardDebt: string; beetsHarvested: string; timestamp: string; - pool?: { __typename?: 'Pool'; id: string; pair: string } | null | undefined; + pool?: { __typename?: 'Pool'; id: string; pair: string } | null; }>; }; @@ -1145,15 +1139,12 @@ export type MasterchefGetMetaQueryVariables = Exact<{ [key: string]: never }>; export type MasterchefGetMetaQuery = { __typename?: 'Query'; - meta?: - | { - __typename?: '_Meta_'; - deployment: string; - hasIndexingErrors: boolean; - block: { __typename?: '_Block_'; number: number }; - } - | null - | undefined; + meta?: { + __typename?: '_Meta_'; + deployment: string; + hasIndexingErrors: boolean; + block: { __typename?: '_Block_'; number: number }; + } | null; }; export const FarmUserFragmentDoc = gql` @@ -1294,9 +1285,10 @@ export const MasterchefGetMetaDocument = gql` export type SdkFunctionWrapper = ( action: (requestHeaders?: Record) => Promise, operationName: string, + operationType?: string, ) => Promise; -const defaultWrapper: SdkFunctionWrapper = (action, _operationName) => action(); +const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => action(); export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) { return { @@ -1311,6 +1303,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'MasterchefUsers', + 'query', ); }, Masterchefs( @@ -1324,6 +1317,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'Masterchefs', + 'query', ); }, MasterchefFarms( @@ -1337,6 +1331,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'MasterchefFarms', + 'query', ); }, MasterchefPortfolioData( @@ -1350,6 +1345,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'MasterchefPortfolioData', + 'query', ); }, MasterchefGetMeta( @@ -1363,6 +1359,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'MasterchefGetMeta', + 'query', ); }, }; diff --git a/modules/subgraphs/reliquary-subgraph/generated/reliquary-subgraph-types.ts b/modules/subgraphs/reliquary-subgraph/generated/reliquary-subgraph-types.ts index 45200c463..800971a45 100644 --- a/modules/subgraphs/reliquary-subgraph/generated/reliquary-subgraph-types.ts +++ b/modules/subgraphs/reliquary-subgraph/generated/reliquary-subgraph-types.ts @@ -2068,39 +2068,36 @@ export enum _SubgraphErrorPolicy_ { export type ReliquaryQueryVariables = Exact<{ id: Scalars['ID']; - block?: Maybe; + block?: InputMaybe; }>; export type ReliquaryQuery = { __typename?: 'Query'; - reliquary?: - | { - __typename?: 'Reliquary'; - id: string; - totalAllocPoint: number; - poolCount: number; - relicCount: number; - emissionToken: { - __typename?: 'Token'; - id: string; - address: string; - name: string; - symbol: string; - decimals: number; - }; - emissionCurve: { __typename?: 'EmissionCurve'; id: string; address: string; rewardPerSecond: string }; - } - | null - | undefined; + reliquary?: { + __typename?: 'Reliquary'; + id: string; + totalAllocPoint: number; + poolCount: number; + relicCount: number; + emissionToken: { + __typename?: 'Token'; + id: string; + address: string; + name: string; + symbol: string; + decimals: number; + }; + emissionCurve: { __typename?: 'EmissionCurve'; id: string; address: string; rewardPerSecond: string }; + } | null; }; export type ReliquaryRelicsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type ReliquaryRelicsQuery = { @@ -2119,12 +2116,12 @@ export type ReliquaryRelicsQuery = { }; export type ReliquaryUsersQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type ReliquaryUsersQuery = { @@ -2147,12 +2144,12 @@ export type ReliquaryUsersQuery = { }; export type ReliquaryPoolsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type ReliquaryPoolsQuery = { @@ -2166,25 +2163,22 @@ export type ReliquaryPoolsQuery = { totalBalance: string; relicCount: number; allocPoint: number; - rewarder?: - | { - __typename?: 'Rewarder'; - id: string; - emissions: Array<{ - __typename?: 'RewarderEmission'; - rewardPerSecond: string; - rewardToken: { - __typename?: 'Token'; - id: string; - address: string; - name: string; - symbol: string; - decimals: number; - }; - }>; - } - | null - | undefined; + rewarder?: { + __typename?: 'Rewarder'; + id: string; + emissions: Array<{ + __typename?: 'RewarderEmission'; + rewardPerSecond: string; + rewardToken: { + __typename?: 'Token'; + id: string; + address: string; + name: string; + symbol: string; + decimals: number; + }; + }>; + } | null; levels: Array<{ __typename?: 'PoolLevel'; level: number; @@ -2196,12 +2190,12 @@ export type ReliquaryPoolsQuery = { }; export type ReliquaryFarmSnapshotsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type ReliquaryFarmSnapshotsQuery = { @@ -2219,12 +2213,12 @@ export type ReliquaryFarmSnapshotsQuery = { }; export type ReliquaryRelicSnapshotsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type ReliquaryRelicSnapshotsQuery = { @@ -2243,12 +2237,12 @@ export type ReliquaryRelicSnapshotsQuery = { }; export type ReliquaryPoolLevelsQueryVariables = Exact<{ - skip?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - where?: Maybe; - block?: Maybe; + skip?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + where?: InputMaybe; + block?: InputMaybe; }>; export type ReliquaryPoolLevelsQuery = { @@ -2300,25 +2294,22 @@ export type ReliquaryFarmFragment = { totalBalance: string; relicCount: number; allocPoint: number; - rewarder?: - | { - __typename?: 'Rewarder'; - id: string; - emissions: Array<{ - __typename?: 'RewarderEmission'; - rewardPerSecond: string; - rewardToken: { - __typename?: 'Token'; - id: string; - address: string; - name: string; - symbol: string; - decimals: number; - }; - }>; - } - | null - | undefined; + rewarder?: { + __typename?: 'Rewarder'; + id: string; + emissions: Array<{ + __typename?: 'RewarderEmission'; + rewardPerSecond: string; + rewardToken: { + __typename?: 'Token'; + id: string; + address: string; + name: string; + symbol: string; + decimals: number; + }; + }>; + } | null; levels: Array<{ __typename?: 'PoolLevel'; level: number; @@ -2355,15 +2346,12 @@ export type ReliquaryGetMetaQueryVariables = Exact<{ [key: string]: never }>; export type ReliquaryGetMetaQuery = { __typename?: 'Query'; - meta?: - | { - __typename?: '_Meta_'; - deployment: string; - hasIndexingErrors: boolean; - block: { __typename?: '_Block_'; number: number }; - } - | null - | undefined; + meta?: { + __typename?: '_Meta_'; + deployment: string; + hasIndexingErrors: boolean; + block: { __typename?: '_Block_'; number: number }; + } | null; }; export const ReliquaryRelicFragmentDoc = gql` @@ -2614,9 +2602,10 @@ export const ReliquaryGetMetaDocument = gql` export type SdkFunctionWrapper = ( action: (requestHeaders?: Record) => Promise, operationName: string, + operationType?: string, ) => Promise; -const defaultWrapper: SdkFunctionWrapper = (action, _operationName) => action(); +const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => action(); export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) { return { @@ -2631,6 +2620,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'Reliquary', + 'query', ); }, ReliquaryRelics( @@ -2644,6 +2634,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'ReliquaryRelics', + 'query', ); }, ReliquaryUsers( @@ -2657,6 +2648,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'ReliquaryUsers', + 'query', ); }, ReliquaryPools( @@ -2670,6 +2662,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'ReliquaryPools', + 'query', ); }, ReliquaryFarmSnapshots( @@ -2683,6 +2676,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'ReliquaryFarmSnapshots', + 'query', ); }, ReliquaryRelicSnapshots( @@ -2696,6 +2690,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'ReliquaryRelicSnapshots', + 'query', ); }, ReliquaryPoolLevels( @@ -2709,6 +2704,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'ReliquaryPoolLevels', + 'query', ); }, ReliquaryGetMeta( @@ -2722,6 +2718,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'ReliquaryGetMeta', + 'query', ); }, }; diff --git a/modules/subgraphs/veBal-locks-subgraph/generated/veBal-locks-subgraph-types.ts b/modules/subgraphs/veBal-locks-subgraph/generated/veBal-locks-subgraph-types.ts index 20be807a0..87b361092 100644 --- a/modules/subgraphs/veBal-locks-subgraph/generated/veBal-locks-subgraph-types.ts +++ b/modules/subgraphs/veBal-locks-subgraph/generated/veBal-locks-subgraph-types.ts @@ -2318,12 +2318,12 @@ export enum _SubgraphErrorPolicy_ { } export type VotingEscrowLocksQueryVariables = Exact<{ - block?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - skip?: Maybe; - where?: Maybe; + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; }>; export type VotingEscrowLocksQuery = { @@ -2337,12 +2337,12 @@ export type VotingEscrowLocksQuery = { }; export type LockSnapshotsQueryVariables = Exact<{ - block?: Maybe; - first?: Maybe; - orderBy?: Maybe; - orderDirection?: Maybe; - skip?: Maybe; - where?: Maybe; + block?: InputMaybe; + first?: InputMaybe; + orderBy?: InputMaybe; + orderDirection?: InputMaybe; + skip?: InputMaybe; + where?: InputMaybe; }>; export type LockSnapshotsQuery = { @@ -2361,15 +2361,12 @@ export type VebalGetMetaQueryVariables = Exact<{ [key: string]: never }>; export type VebalGetMetaQuery = { __typename?: 'Query'; - meta?: - | { - __typename?: '_Meta_'; - deployment: string; - hasIndexingErrors: boolean; - block: { __typename?: '_Block_'; number: number }; - } - | null - | undefined; + meta?: { + __typename?: '_Meta_'; + deployment: string; + hasIndexingErrors: boolean; + block: { __typename?: '_Block_'; number: number }; + } | null; }; export const VotingEscrowLocksDocument = gql` @@ -2439,9 +2436,10 @@ export const VebalGetMetaDocument = gql` export type SdkFunctionWrapper = ( action: (requestHeaders?: Record) => Promise, operationName: string, + operationType?: string, ) => Promise; -const defaultWrapper: SdkFunctionWrapper = (action, _operationName) => action(); +const defaultWrapper: SdkFunctionWrapper = (action, _operationName, _operationType) => action(); export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = defaultWrapper) { return { @@ -2456,6 +2454,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'VotingEscrowLocks', + 'query', ); }, LockSnapshots( @@ -2469,6 +2468,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'LockSnapshots', + 'query', ); }, VebalGetMeta( @@ -2482,6 +2482,7 @@ export function getSdk(client: GraphQLClient, withWrapper: SdkFunctionWrapper = ...wrappedRequestHeaders, }), 'VebalGetMeta', + 'query', ); }, }; diff --git a/modules/token/lib/token-price.service.ts b/modules/token/lib/token-price.service.ts index 8a5f2f620..6240b4d86 100644 --- a/modules/token/lib/token-price.service.ts +++ b/modules/token/lib/token-price.service.ts @@ -4,7 +4,7 @@ import _ from 'lodash'; import { timestampRoundedUpToNearestHour } from '../../common/time'; import { Chain, PrismaTokenCurrentPrice, PrismaTokenPrice } from '@prisma/client'; import moment from 'moment-timezone'; -import { GqlTokenChartDataRange } from '../../../schema'; +import { GqlTokenChartDataRange } from '../../../apps/api/gql/generated-schema'; import { Cache, CacheClass } from 'memory-cache'; import * as Sentry from '@sentry/node'; import { FbeetsPriceHandlerService } from './token-price-handlers/fbeets-price-handler.service'; diff --git a/modules/token/token.service.ts b/modules/token/token.service.ts index 09fedd159..cb6815326 100644 --- a/modules/token/token.service.ts +++ b/modules/token/token.service.ts @@ -18,7 +18,7 @@ import { GqlTokenChartDataRange, MutationTokenDeleteTokenTypeArgs, QueryTokenGetTokensArgs, -} from '../../schema'; +} from '../../apps/api/gql/generated-schema'; import { Dictionary } from 'lodash'; import { GithubContentService } from '../content/github-content.service'; import config from '../../config'; diff --git a/modules/user/user.service.ts b/modules/user/user.service.ts index 3242eaf10..0a54ba114 100644 --- a/modules/user/user.service.ts +++ b/modules/user/user.service.ts @@ -1,6 +1,6 @@ import { Chain, PrismaPoolStaking, PrismaPoolStakingType } from '@prisma/client'; import { prisma } from '../../prisma/prisma-client'; -import { GqlPoolJoinExit, GqlPoolSwap } from '../../schema'; +import { GqlPoolJoinExit, GqlPoolSwap } from '../../apps/api/gql/generated-schema'; import { PoolSwapService } from '../pool/lib/pool-swap.service'; import { tokenService } from '../token/token.service'; import { UserBalanceService } from './lib/user-balance.service'; diff --git a/modules/vebal/special-pools/hardcoded-pools.ts b/modules/vebal/special-pools/hardcoded-pools.ts index 4cd54c3be..3048e542b 100644 --- a/modules/vebal/special-pools/hardcoded-pools.ts +++ b/modules/vebal/special-pools/hardcoded-pools.ts @@ -1,5 +1,5 @@ import { Chain } from '@prisma/client'; -import { GqlVotingPool } from '../../../schema'; +import { GqlVotingPool } from '../../../apps/api/gql/generated-schema'; /* Balancer wstETH/rETH/L and USDC/WETH/L from Cron Finance are special pools because Cron Contract is not compliant with BasePool interface so we won't find it the pools from the Subgraph diff --git a/modules/vebal/vebal-voting-list.service.ts b/modules/vebal/vebal-voting-list.service.ts index 57e667950..94bb14ef4 100644 --- a/modules/vebal/vebal-voting-list.service.ts +++ b/modules/vebal/vebal-voting-list.service.ts @@ -5,7 +5,7 @@ import { VotingGauge, VotingGaugesRepository } from './voting-gauges.repository' import { oldVeBalAddress, specialVotingGaugeAddresses } from './special-pools/special-voting-gauge-addresses'; import { getVeVotingGauges, veGauges, vePools } from './special-pools/ve-pools'; import { hardCodedPools } from './special-pools/hardcoded-pools'; -import { GqlVotingPool } from '../../schema'; +import { GqlVotingPool } from '../../apps/api/gql/generated-schema'; import { Chain } from '@prisma/client'; export class VeBalVotingListService { diff --git a/modules/vebal/vebal.service.ts b/modules/vebal/vebal.service.ts index caa304081..c7ccc9151 100644 --- a/modules/vebal/vebal.service.ts +++ b/modules/vebal/vebal.service.ts @@ -9,7 +9,7 @@ import { Multicaller } from '../web3/multicaller'; import VeDelegationAbi from './abi/VotingEscrowDelegationProxy.json'; import { getContractAt } from '../web3/contract'; import { AmountHumanReadable } from '../common/global-types'; -import { GqlVeBalBalance, GqlVeBalUserData } from '../../schema'; +import { GqlVeBalBalance, GqlVeBalUserData } from '../../apps/api/gql/generated-schema'; import mainnet from '../../config/mainnet'; import VeBalABI from './abi/vebal.json'; import { Chain } from '@prisma/client'; diff --git a/stellate-beets-canary.ts b/stellate-beets-canary.ts deleted file mode 100644 index 1a21f625a..000000000 --- a/stellate-beets-canary.ts +++ /dev/null @@ -1,137 +0,0 @@ -// import { Config } from 'stellate'; - -// const config: Config = { -// config: { -// originUrl: 'https://backend-v3-canary-origin.beets-ftm-node.com/graphql', -// schema: 'https://backend-v3-canary.beets-ftm-node.com/graphql', -// name: 'backend-v3-canary', -// devPortal: { -// enabled: true, -// auth: false, -// description: 'IMPORTANT: To stay up to date with changes of our API, please join https://t.me/beetsapi', -// readme: 'Learn how to use the API ### Query pools for a certain or multiple chains and apply sorting ```graphiql { poolGetPools(where: {chainIn: [FANTOM, OPTIMISM]}, orderBy: totalLiquidity, orderDirection: desc) { id name } } ``` ### Query user balances for one or more chains ```graphiql { userGetPoolBalances( address: "0x4fbe899d37fb7514adf2f41b0630e018ec275a0c" chains: [FANTOM] ) { poolId stakedBalance walletBalance } } ``` Check out the Graphql Schema for endless possibilities.', -// urls: { -// logo: 'https://beethoven-assets.s3.eu-central-1.amazonaws.com/logo-full%402x.png', -// favicon: 'https://assets.coingecko.com/coins/images/19158/large/beets-icon-large.png?1634545465', -// support: 'https://discord.gg/kbPnYJjvwZ', -// website: 'https://beets.fi', -// }, -// }, -// queryDepthLimit: 10, -// scopes: { -// AUTHENTICATED: 'header:accountaddress', -// CHAIN: 'header:chainid', -// AUTHENTICATED_CHAIN: 'header:accountaddress|header:chainid', -// }, -// rootTypeNames: { -// query: 'Query', -// mutation: 'Mutation', -// }, -// rules: [ -// { -// types: ['Query'], -// maxAge: 15, -// swr: 30, -// description: 'Cache everything (default)', -// scope: 'CHAIN', -// }, -// { -// types: { -// Query: [ -// 'userGetSwaps', -// 'userGetStaking', -// 'userGetPoolBalances', -// 'userGetFbeetsBalance', -// 'userGetPoolJoinExits', -// ], -// }, -// maxAge: 10, -// swr: 15, -// scope: 'AUTHENTICATED_CHAIN', -// description: 'Time critical user queries', -// }, -// { -// types: { -// Query: ['latestSyncedBlocks'], -// }, -// maxAge: 2, -// swr: 10, -// description: 'Time critical block data', -// scope: 'CHAIN', -// }, -// { -// types: { -// Query: [ -// 'protocolMetricsChain', -// 'protocolMetricsAggregated', -// 'tokenGetProtocolTokenPrice', -// 'beetsGetFbeetsRatio', -// 'blocksGetBlocksPerSecond', -// 'blocksGetBlocksPerDay', -// 'blocksGetAverageBlockTime', -// 'tokenGetTokens', -// 'poolGetFeaturedPoolGroups', -// 'contentGetNewsItems', -// ], -// }, -// maxAge: 60, -// swr: 120, -// description: 'Mostly static, cache for a long time', -// scope: 'CHAIN', -// }, -// ], -// rateLimits: (req) => { -// if ( -// req.headers['stellate-api-token'] && -// req.headers['stellate-api-token'] === -// 'stl8_bcebb2b60910a55e58a82c8e83825034dc763e294582447118fab0a6a1225ebb' -// ) { -// return [ -// { -// name: 'Specific API Token based limits', -// state: 'dryRun', -// group: req.headers['stellate-api-token'], -// limit: { -// type: 'RequestCount', -// budget: 20, -// window: '1m', -// }, -// }, -// ]; -// } - -// if (req.headers['stellate-api-token']) { -// return [ -// { -// name: 'General API Token based limits', -// state: 'dryRun', -// group: req.headers['stellate-api-token'], -// limit: { -// type: 'RequestCount', -// budget: 10, -// window: '1m', -// }, -// }, -// ]; -// } - -// const xForwardedFor = Array.isArray(req.headers['x-forwarded-for']) -// ? req.headers['x-forwarded-for'][0] -// : req.headers['x-forwarded-for']; -// return [ -// { -// name: 'IP based limits', -// state: 'dryRun', -// group: xForwardedFor ? xForwardedFor.split(',')[0] : req.ip, -// limit: { -// type: 'RequestCount', -// budget: 5, -// window: '1m', -// }, -// }, -// ]; -// }, -// }, -// }; - -// export default config;