From a28d5e67328f9d99bdaa42816311a709efde2751 Mon Sep 17 00:00:00 2001 From: gmbronco <83549293+gmbronco@users.noreply.github.com> Date: Thu, 1 Feb 2024 15:38:55 +0100 Subject: [PATCH 1/8] removing pool type based tables --- modules/pool/pool.prisma | 58 ------------------- .../migration.sql | 35 +++++++++++ prisma/prisma-types.ts | 12 ---- prisma/schema.prisma | 58 ------------------- 4 files changed, 35 insertions(+), 128 deletions(-) create mode 100644 prisma/migrations/20240131160000_jsonb_pool_data/migration.sql diff --git a/modules/pool/pool.prisma b/modules/pool/pool.prisma index 4cce260b6..f4851194c 100644 --- a/modules/pool/pool.prisma +++ b/modules/pool/pool.prisma @@ -17,9 +17,6 @@ model PrismaPool { vaultVersion Int @default(2) - linearData PrismaPoolLinearData? - elementData PrismaPoolElementData? - gyroData PrismaPoolGyroData? staticTypeData Json @default("{}") tokens PrismaPoolToken[] @@ -62,61 +59,6 @@ enum PrismaPoolType { FX } -model PrismaPoolLinearData { - @@id([id, chain]) - @@unique([poolId, chain]) - - id String - poolId String - pool PrismaPool @relation(fields:[poolId, chain], references: [id, chain], onDelete: Cascade) - chain Chain - - mainIndex Int - wrappedIndex Int -} - -model PrismaPoolElementData { - @@id([id, chain]) - @@unique([poolId, chain]) - - id String - poolId String - pool PrismaPool @relation(fields:[poolId, chain], references: [id, chain], onDelete: Cascade) - chain Chain - - unitSeconds String - principalToken String - baseToken String -} - -model PrismaPoolGyroData{ - @@id([id, chain]) - @@unique([poolId, chain]) - - id String - poolId String - pool PrismaPool @relation(fields:[poolId, chain], references: [id, chain], onDelete: Cascade) - chain Chain - - alpha String - beta String - sqrtAlpha String? - sqrtBeta String? - root3Alpha String? - c String? - s String? - lambda String? - tauAlphaX String? - tauAlphaY String? - tauBetaX String? - tauBetaY String? - u String? - v String? - w String? - z String? - dSq String? -} - model PrismaPoolDynamicData { @@id([id, chain]) @@unique([poolId, chain]) diff --git a/prisma/migrations/20240131160000_jsonb_pool_data/migration.sql b/prisma/migrations/20240131160000_jsonb_pool_data/migration.sql new file mode 100644 index 000000000..8d2011d51 --- /dev/null +++ b/prisma/migrations/20240131160000_jsonb_pool_data/migration.sql @@ -0,0 +1,35 @@ +-- Migrate pool data from tables to JSON columns +WITH json_data as ( + ( + SELECT t.id, jsonb(row_to_json(t)) - 'id' - 'chain' - 'poolId' as json + FROM ( + SELECT * + FROM "PrismaPoolGyroData" + ) t + ) + UNION + ( + SELECT t.id, jsonb(row_to_json(t)) - 'id' - 'chain' - 'poolId' as json + FROM ( + SELECT * + FROM "PrismaPoolLinearData" + ) t + ) + UNION + ( + SELECT t.id, jsonb(row_to_json(t)) - 'id' - 'chain' - 'poolId' as json + FROM ( + SELECT * + FROM "PrismaPoolElementData" + ) t + ) +) +UPDATE "PrismaPool" +SET "staticTypeData" = json +FROM json_data +WHERE "PrismaPool".id = json_data.id; + +-- Remove old tables +DROP TABLE "PrismaPoolGyroData"; +DROP TABLE "PrismaPoolLinearData"; +DROP TABLE "PrismaPoolElementData"; diff --git a/prisma/prisma-types.ts b/prisma/prisma-types.ts index 8fbbd4bf0..e853a7b0f 100644 --- a/prisma/prisma-types.ts +++ b/prisma/prisma-types.ts @@ -14,12 +14,9 @@ export type PrismaPoolTokenWithDynamicData = Prisma.PrismaPoolTokenGetPayload()({ include: { - linearData: true, - elementData: true, dynamicData: true, stableDynamicData: true, linearDynamicData: true, - gyroData: true, staking: { include: { farm: { @@ -76,7 +73,6 @@ export const prismaPoolWithExpandedNesting = Prisma.validator()({ include: { - linearData: true, dynamicData: true, stableDynamicData: true, linearDynamicData: true, @@ -123,7 +117,6 @@ const nestedPoolWithSingleLayerNesting = Prisma.validator dynamicData: true, nestedPool: { include: { - linearData: true, dynamicData: true, linearDynamicData: true, tokens: { @@ -146,7 +139,6 @@ export type PrismaNestedPoolWithSingleLayerNesting = Prisma.PrismaPoolGetPayload const nestedPoolWithNoNesting = Prisma.validator()({ include: { - linearData: true, dynamicData: true, linearDynamicData: true, tokens: { @@ -167,7 +159,6 @@ const prismaPoolTokenWithExpandedNesting = Prisma.validator()({ stableDynamicData: true, dynamicData: true, linearDynamicData: true, - linearData: true, - gyroData: true, tokens: { orderBy: { index: 'asc' }, include: { diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 08dabf136..99f55447a 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -64,9 +64,6 @@ model PrismaPool { vaultVersion Int @default(2) - linearData PrismaPoolLinearData? - elementData PrismaPoolElementData? - gyroData PrismaPoolGyroData? staticTypeData Json @default("{}") tokens PrismaPoolToken[] @@ -109,61 +106,6 @@ enum PrismaPoolType { FX } -model PrismaPoolLinearData { - @@id([id, chain]) - @@unique([poolId, chain]) - - id String - poolId String - pool PrismaPool @relation(fields:[poolId, chain], references: [id, chain], onDelete: Cascade) - chain Chain - - mainIndex Int - wrappedIndex Int -} - -model PrismaPoolElementData { - @@id([id, chain]) - @@unique([poolId, chain]) - - id String - poolId String - pool PrismaPool @relation(fields:[poolId, chain], references: [id, chain], onDelete: Cascade) - chain Chain - - unitSeconds String - principalToken String - baseToken String -} - -model PrismaPoolGyroData{ - @@id([id, chain]) - @@unique([poolId, chain]) - - id String - poolId String - pool PrismaPool @relation(fields:[poolId, chain], references: [id, chain], onDelete: Cascade) - chain Chain - - alpha String - beta String - sqrtAlpha String? - sqrtBeta String? - root3Alpha String? - c String? - s String? - lambda String? - tauAlphaX String? - tauAlphaY String? - tauBetaX String? - tauBetaY String? - u String? - v String? - w String? - z String? - dSq String? -} - model PrismaPoolDynamicData { @@id([id, chain]) @@unique([poolId, chain]) From e0c18ec7aa86ae51080424e2130903e04173a560 Mon Sep 17 00:00:00 2001 From: gmbronco <83549293+gmbronco@users.noreply.github.com> Date: Thu, 1 Feb 2024 15:40:02 +0100 Subject: [PATCH 2/8] reading from pool data column instead of a table --- modules/content/github-content.service.ts | 8 +- modules/content/sanity-content.service.ts | 8 +- .../fantom/spooky-swap-apr.service.ts | 8 +- .../apr-data-sources/yb-tokens-apr.service.ts | 2 +- modules/pool/lib/pool-gql-loader.service.ts | 124 ++++++------------ .../pool/lib/pool-on-chain-data.service.ts | 7 +- modules/pool/pool-data/fx.ts | 10 +- modules/pool/subgraph-mapper.test.ts | 10 +- modules/pool/subgraph-mapper.ts | 49 ------- .../sor/sorV2/lib/pools/gyro2/gyro2Pool.ts | 9 +- .../sor/sorV2/lib/pools/gyro3/gyro3Pool.ts | 5 +- .../sor/sorV2/lib/pools/gyroE/gyroEPool.ts | 33 ++--- ...ear-wrapped-token-price-handler.service.ts | 18 ++- 13 files changed, 105 insertions(+), 186 deletions(-) diff --git a/modules/content/github-content.service.ts b/modules/content/github-content.service.ts index 053052a89..a987e73af 100644 --- a/modules/content/github-content.service.ts +++ b/modules/content/github-content.service.ts @@ -5,6 +5,7 @@ import { prisma } from '../../prisma/prisma-client'; import { networkContext } from '../network/network-context.service'; import { ContentService, FeaturedPool, HomeScreenFeaturedPoolGroup, HomeScreenNewsItem } from './content-types'; import { chainIdToChain } from '../network/network-config'; +import { LinearData } from '../pool/subgraph-mapper'; const POOLS_METADATA_URL = 'https://raw.githubusercontent.com/balancer/metadata/main/pools/featured.json'; @@ -116,8 +117,8 @@ export class GithubContentService implements ContentService { symbol: true, name: true, type: true, + staticTypeData: true, tokens: { orderBy: { index: 'asc' } }, - linearData: true, }, }); const tokens = await prisma.prismaToken.findMany({ @@ -151,9 +152,8 @@ export class GithubContentService implements ContentService { }); } - const wrappedLinearPoolToken = pools.find( - (pool) => pool.linearData && pool.tokens[pool.linearData.wrappedIndex]?.address === token.address, - ); + const wrappedIndex = (pool?.staticTypeData as LinearData).wrappedIndex; + const wrappedLinearPoolToken = pools.find((pool) => pool.tokens[wrappedIndex]?.address === token.address); if (wrappedLinearPoolToken && !tokenTypes.includes('LINEAR_WRAPPED_TOKEN')) { types.push({ diff --git a/modules/content/sanity-content.service.ts b/modules/content/sanity-content.service.ts index bbbe66707..4aaa03075 100644 --- a/modules/content/sanity-content.service.ts +++ b/modules/content/sanity-content.service.ts @@ -12,6 +12,7 @@ import SanityClient from '@sanity/client'; import { env } from '../../app/env'; import { chainToIdMap } from '../network/network-config'; import { wrap } from 'module'; +import { LinearData } from '../pool/subgraph-mapper'; interface SanityToken { name: string; @@ -185,9 +186,8 @@ export class SanityContentService implements ContentService { }); } - const wrappedLinearPoolToken = pools.find( - (pool) => pool.linearData && pool.tokens[pool.linearData.wrappedIndex].address === token.address, - ); + const wrappedIndex = (pool?.staticTypeData as LinearData).wrappedIndex; + const wrappedLinearPoolToken = pools.find((pool) => pool.tokens[wrappedIndex]?.address === token.address); if (wrappedLinearPoolToken && !tokenTypes.includes('LINEAR_WRAPPED_TOKEN')) { types.push({ @@ -216,8 +216,8 @@ export class SanityContentService implements ContentService { symbol: true, name: true, type: true, + staticTypeData: true, tokens: { orderBy: { index: 'asc' } }, - linearData: true, }, }); } diff --git a/modules/pool/lib/apr-data-sources/fantom/spooky-swap-apr.service.ts b/modules/pool/lib/apr-data-sources/fantom/spooky-swap-apr.service.ts index 84bb17165..a345f0493 100644 --- a/modules/pool/lib/apr-data-sources/fantom/spooky-swap-apr.service.ts +++ b/modules/pool/lib/apr-data-sources/fantom/spooky-swap-apr.service.ts @@ -5,6 +5,7 @@ import { prisma } from '../../../../../prisma/prisma-client'; import { TokenService } from '../../../../token/token.service'; import { networkContext } from '../../../../network/network-context.service'; import { liquidStakedBaseAprService } from '../liquid-staked-base-apr.service'; +import { LinearData } from '../../../subgraph-mapper'; const BOO_TOKEN_ADDRESS = '0x841FAD6EAe12c286d1Fd18d1d525DFfA75C7EFFE'.toLowerCase(); @@ -23,7 +24,6 @@ export class SpookySwapAprService implements PoolAprService { where: { chain: networkContext.chain, id: { in: pools.map((pool) => pool.id) } }, include: { dynamicData: true, - linearData: true, tokens: { orderBy: { index: 'asc' }, include: { @@ -38,14 +38,14 @@ export class SpookySwapAprService implements PoolAprService { for (const pool of expandedSpookyPools) { if ( - !pool.linearData || + !(pool.staticTypeData as LinearData) || !pool.dynamicData || - pool.tokens[pool.linearData.mainIndex].address !== this.booAddress + pool.tokens[(pool.staticTypeData as LinearData).mainIndex].address !== this.booAddress ) { continue; } - const linearData = pool.linearData; + const linearData = pool.staticTypeData as LinearData; const wrappedToken = pool.tokens[linearData.wrappedIndex]; const tokenPrice = this.tokenService.getPriceForToken(tokenPrices, this.booAddress); const wrappedTokens = parseFloat(wrappedToken.dynamicData?.balance || '0'); diff --git a/modules/pool/lib/apr-data-sources/yb-tokens-apr.service.ts b/modules/pool/lib/apr-data-sources/yb-tokens-apr.service.ts index 18d171d54..c6791a8df 100644 --- a/modules/pool/lib/apr-data-sources/yb-tokens-apr.service.ts +++ b/modules/pool/lib/apr-data-sources/yb-tokens-apr.service.ts @@ -2,7 +2,7 @@ import { PoolAprService } from '../../pool-types'; import { PrismaPoolWithTokens } from '../../../../prisma/prisma-types'; import { prisma } from '../../../../prisma/prisma-client'; import { prismaBulkExecuteOperations } from '../../../../prisma/prisma-util'; -import { Chain, PrismaPoolAprItemGroup, PrismaPoolAprType, PrismaPoolLinearData } from '@prisma/client'; +import { Chain, PrismaPoolAprItemGroup, PrismaPoolAprType } from '@prisma/client'; import { YbAprHandlers, TokenApr } from './yb-apr-handlers'; import { tokenService } from '../../../token/token.service'; import { collectsYieldFee } from '../pool-utils'; diff --git a/modules/pool/lib/pool-gql-loader.service.ts b/modules/pool/lib/pool-gql-loader.service.ts index 7950c4cae..9907a41fc 100644 --- a/modules/pool/lib/pool-gql-loader.service.ts +++ b/modules/pool/lib/pool-gql-loader.service.ts @@ -48,7 +48,7 @@ import { BalancerChainIds, BeethovenChainIds, chainIdToChain, chainToIdMap } fro import { GithubContentService } from '../../content/github-content.service'; import { SanityContentService } from '../../content/sanity-content.service'; import { FeaturedPool } from '../../content/content-types'; -import { FxData } from '../subgraph-mapper'; +import { ElementData, FxData, GyroData, LinearData } from '../subgraph-mapper'; export class PoolGqlLoaderService { public async getPool(id: string, chain: Chain, userAddress?: string): Promise { @@ -455,10 +455,11 @@ export class PoolGqlLoaderService { userWalletbalances: PrismaUserWalletBalance[] = [], userStakedBalances: PrismaUserStakedBalance[] = [], ): GqlPoolUnion { + const { staticTypeData, ...poolWithoutStaticTypeData } = pool; + const bpt = pool.tokens.find((token) => token.address === pool.address); const mappedData = { - ...pool, decimals: 18, staking: this.getStakingData(pool), dynamicData: this.getPoolDynamicData(pool), @@ -476,6 +477,7 @@ export class PoolGqlLoaderService { case 'STABLE': return { __typename: 'GqlPoolStable', + ...poolWithoutStaticTypeData, ...mappedData, amp: pool.stableDynamicData?.amp || '0', tokens: mappedData.tokens as GqlPoolToken[], @@ -483,6 +485,7 @@ export class PoolGqlLoaderService { case 'META_STABLE': return { __typename: 'GqlPoolMetaStable', + ...poolWithoutStaticTypeData, ...mappedData, amp: pool.stableDynamicData?.amp || '0', tokens: mappedData.tokens as GqlPoolToken[], @@ -490,6 +493,7 @@ export class PoolGqlLoaderService { case 'COMPOSABLE_STABLE': return { __typename: 'GqlPoolComposableStable', + ...poolWithoutStaticTypeData, ...mappedData, amp: pool.stableDynamicData?.amp || '0', bptPriceRate: bpt?.dynamicData?.priceRate || '1.0', @@ -497,10 +501,10 @@ export class PoolGqlLoaderService { case 'LINEAR': return { __typename: 'GqlPoolLinear', + ...poolWithoutStaticTypeData, + ...(staticTypeData as LinearData), ...mappedData, tokens: mappedData.tokens as GqlPoolToken[], - mainIndex: pool.linearData?.mainIndex || 0, - wrappedIndex: pool.linearData?.wrappedIndex || 0, lowerTarget: pool.linearDynamicData?.lowerTarget || '0', upperTarget: pool.linearDynamicData?.upperTarget || '0', bptPriceRate: bpt?.dynamicData?.priceRate || '1.0', @@ -508,102 +512,42 @@ export class PoolGqlLoaderService { case 'ELEMENT': return { __typename: 'GqlPoolElement', + ...poolWithoutStaticTypeData, + ...(staticTypeData as ElementData), ...mappedData, tokens: mappedData.tokens as GqlPoolToken[], - baseToken: pool.elementData?.baseToken || '', - unitSeconds: pool.elementData?.unitSeconds || '', - principalToken: pool.elementData?.principalToken || '', }; case 'LIQUIDITY_BOOTSTRAPPING': return { __typename: 'GqlPoolLiquidityBootstrapping', + ...poolWithoutStaticTypeData, ...mappedData, }; case 'GYRO': - return { - __typename: 'GqlPoolGyro', - ...mappedData, - type: mappedData.type, - alpha: pool.gyroData?.alpha || '', - beta: pool.gyroData?.beta || '', - sqrtAlpha: pool.gyroData?.sqrtAlpha || '', - sqrtBeta: pool.gyroData?.sqrtBeta || '', - root3Alpha: pool.gyroData?.root3Alpha || '', - c: pool.gyroData?.c || '', - s: pool.gyroData?.s || '', - lambda: pool.gyroData?.lambda || '', - tauAlphaX: pool.gyroData?.tauAlphaX || '', - tauAlphaY: pool.gyroData?.tauAlphaY || '', - tauBetaX: pool.gyroData?.tauBetaX || '', - tauBetaY: pool.gyroData?.tauBetaY || '', - u: pool.gyroData?.u || '', - v: pool.gyroData?.v || '', - w: pool.gyroData?.w || '', - z: pool.gyroData?.z || '', - dSq: pool.gyroData?.dSq || '', - }; case 'GYRO3': - return { - __typename: 'GqlPoolGyro', - ...mappedData, - type: mappedData.type, - alpha: pool.gyroData?.alpha || '', - beta: pool.gyroData?.beta || '', - sqrtAlpha: pool.gyroData?.sqrtAlpha || '', - sqrtBeta: pool.gyroData?.sqrtBeta || '', - root3Alpha: pool.gyroData?.root3Alpha || '', - c: pool.gyroData?.c || '', - s: pool.gyroData?.s || '', - lambda: pool.gyroData?.lambda || '', - tauAlphaX: pool.gyroData?.tauAlphaX || '', - tauAlphaY: pool.gyroData?.tauAlphaY || '', - tauBetaX: pool.gyroData?.tauBetaX || '', - tauBetaY: pool.gyroData?.tauBetaY || '', - u: pool.gyroData?.u || '', - v: pool.gyroData?.v || '', - w: pool.gyroData?.w || '', - z: pool.gyroData?.z || '', - dSq: pool.gyroData?.dSq || '', - }; case 'GYROE': return { __typename: 'GqlPoolGyro', + ...poolWithoutStaticTypeData, + ...(staticTypeData as GyroData), ...mappedData, - type: mappedData.type, - alpha: pool.gyroData?.alpha || '', - beta: pool.gyroData?.beta || '', - sqrtAlpha: pool.gyroData?.sqrtAlpha || '', - sqrtBeta: pool.gyroData?.sqrtBeta || '', - root3Alpha: pool.gyroData?.root3Alpha || '', - c: pool.gyroData?.c || '', - s: pool.gyroData?.s || '', - lambda: pool.gyroData?.lambda || '', - tauAlphaX: pool.gyroData?.tauAlphaX || '', - tauAlphaY: pool.gyroData?.tauAlphaY || '', - tauBetaX: pool.gyroData?.tauBetaX || '', - tauBetaY: pool.gyroData?.tauBetaY || '', - u: pool.gyroData?.u || '', - v: pool.gyroData?.v || '', - w: pool.gyroData?.w || '', - z: pool.gyroData?.z || '', - dSq: pool.gyroData?.dSq || '', }; case 'FX': - const data = pool.staticTypeData as FxData; return { __typename: 'GqlPoolFx', + ...poolWithoutStaticTypeData, ...mappedData, - type: mappedData.type, - alpha: data.alpha || '', - beta: data.beta || '', - delta: data.delta || '', - epsilon: data.epsilon || '', - lambda: data.lambda || '', + alpha: (staticTypeData as FxData).alpha || '', + beta: (staticTypeData as FxData).beta || '', + delta: (staticTypeData as FxData).delta || '', + epsilon: (staticTypeData as FxData).epsilon || '', + lambda: (staticTypeData as FxData).lambda || '', }; } return { __typename: 'GqlPoolWeighted', + ...poolWithoutStaticTypeData, ...mappedData, }; } @@ -1035,8 +979,12 @@ export class PoolGqlLoaderService { const nestedPool = poolToken.nestedPool; const options: GqlPoolInvestOption[] = []; - if (nestedPool && nestedPool.type === 'LINEAR' && nestedPool.linearData) { - const mainToken = nestedPool.tokens[nestedPool.linearData.mainIndex]; + if ( + nestedPool && + nestedPool.type === 'LINEAR' && + (nestedPool.staticTypeData as LinearData).mainIndex !== undefined + ) { + const mainToken = nestedPool.tokens[(nestedPool.staticTypeData as LinearData).mainIndex]; const isWrappedNativeAsset = isSameAddress(mainToken.address, networkContext.data.weth.address); options.push({ @@ -1074,10 +1022,12 @@ export class PoolGqlLoaderService { tokenOptions: nestedToken.nestedPool && nestedToken.nestedPool.type === 'LINEAR' && - nestedToken.nestedPool.linearData + (nestedToken.nestedPool.staticTypeData as LinearData).mainIndex !== undefined ? [ this.mapPoolTokenToGql( - nestedToken.nestedPool.tokens[nestedToken.nestedPool.linearData.mainIndex], + nestedToken.nestedPool.tokens[ + (nestedToken.nestedPool.staticTypeData as LinearData).mainIndex + ], ), ] : [this.mapPoolTokenToGql(nestedToken)], @@ -1092,10 +1042,12 @@ export class PoolGqlLoaderService { if ( nestedToken.nestedPool && nestedToken.nestedPool.type === 'LINEAR' && - nestedToken.nestedPool.linearData + (nestedToken.nestedPool.staticTypeData as LinearData).mainIndex !== undefined ) { return this.mapPoolTokenToGql( - nestedToken.nestedPool.tokens[nestedToken.nestedPool.linearData.mainIndex], + nestedToken.nestedPool.tokens[ + (nestedToken.nestedPool.staticTypeData as LinearData).mainIndex + ], ); } @@ -1185,7 +1137,7 @@ export class PoolGqlLoaderService { return { __typename: 'GqlPoolLinearNested', ...pool, - ...pool.linearData!, + ...(pool.staticTypeData as LinearData)!, ...pool.linearDynamicData!, tokens: pool.tokens .filter((token) => token.address !== pool.address) @@ -1278,7 +1230,7 @@ export class PoolGqlLoaderService { wrappedTokenBalance: string; totalMainTokenBalance: string; } { - if (!poolToken.dynamicData || !nestedPool.linearData || !nestedPool.dynamicData) { + if (!poolToken.dynamicData || !(nestedPool.staticTypeData as LinearData) || !nestedPool.dynamicData) { return { mainTokenBalance: '0', wrappedTokenBalance: '0', @@ -1289,8 +1241,8 @@ export class PoolGqlLoaderService { const percentOfSupplyInPool = parseFloat(poolToken.dynamicData.balance) / parseFloat(nestedPool.dynamicData.totalShares); - const mainToken = nestedPool.tokens[nestedPool.linearData.mainIndex]; - const wrappedToken = nestedPool.tokens[nestedPool.linearData.wrappedIndex]; + const mainToken = nestedPool.tokens[(nestedPool.staticTypeData as LinearData).mainIndex]; + const wrappedToken = nestedPool.tokens[(nestedPool.staticTypeData as LinearData).wrappedIndex]; const wrappedTokenBalance = oldBnum(wrappedToken.dynamicData?.balance || '0').times(percentOfSupplyInPool); const mainTokenBalance = oldBnum(mainToken.dynamicData?.balance || '0').times(percentOfSupplyInPool); diff --git a/modules/pool/lib/pool-on-chain-data.service.ts b/modules/pool/lib/pool-on-chain-data.service.ts index 8243749eb..511511d3d 100644 --- a/modules/pool/lib/pool-on-chain-data.service.ts +++ b/modules/pool/lib/pool-on-chain-data.service.ts @@ -9,6 +9,7 @@ import { fetchOnChainPoolState } from './pool-onchain-state'; import { fetchOnChainPoolData } from './pool-onchain-data'; import { fetchOnChainGyroFees } from './pool-onchain-gyro-fee'; import { networkContext } from '../../network/network-context.service'; +import { LinearData } from '../subgraph-mapper'; const SUPPORTED_POOL_TYPES: PrismaPoolType[] = [ 'WEIGHTED', @@ -91,7 +92,6 @@ export class PoolOnChainDataService { stableDynamicData: true, dynamicData: true, linearDynamicData: true, - linearData: true, }, }); @@ -228,7 +228,10 @@ export class PoolOnChainDataService { } // linear wrapped token rate - if (onchainData.wrappedTokenRate && pool.linearData?.wrappedIndex === poolToken.index) { + if ( + onchainData.wrappedTokenRate && + (pool.staticTypeData as LinearData)?.wrappedIndex === poolToken.index + ) { priceRate = onchainData.wrappedTokenRate; } diff --git a/modules/pool/pool-data/fx.ts b/modules/pool/pool-data/fx.ts index 7b1edf745..6a805bca4 100644 --- a/modules/pool/pool-data/fx.ts +++ b/modules/pool/pool-data/fx.ts @@ -2,10 +2,10 @@ import { BalancerPoolFragment } from '../../subgraphs/balancer-subgraph/generate export const fx = (pool: BalancerPoolFragment) => { return { - alpha: pool.alpha, - beta: pool.beta, - delta: pool.delta, - epsilon: pool.epsilon, - lambda: pool.lambda, + alpha: pool.alpha as string, + beta: pool.beta as string, + delta: pool.delta as string, + epsilon: pool.epsilon as string, + lambda: pool.lambda as string, }; }; diff --git a/modules/pool/subgraph-mapper.test.ts b/modules/pool/subgraph-mapper.test.ts index 0aa8889b0..5889798b0 100644 --- a/modules/pool/subgraph-mapper.test.ts +++ b/modules/pool/subgraph-mapper.test.ts @@ -60,26 +60,26 @@ describe('subgraphToPrismaCreate', () => { const result = subgraphToPrismaCreate(linearPool, 'MAINNET', 1, []); expect(result.data.type).toBe('LINEAR'); expect(result.data.linearDynamicData?.create.upperTarget).toBe(linearPool.upperTarget); - expect(result.data.linearData?.create.wrappedIndex).toBe(linearPool.wrappedIndex); + expect(result.data.staticTypeData['wrappedIndex']).toBe(linearPool.wrappedIndex); }); it('should return correct object for element pool', () => { const result = subgraphToPrismaCreate(elementPool, 'MAINNET', 1, []); expect(result.data.type).toBe('ELEMENT'); - expect(result.data.elementData?.create.principalToken).toBe(elementPool.principalToken); + expect(result.data.staticTypeData['principalToken']).toBe(elementPool.principalToken); }); it('should return correct object for gyro pool', () => { const result = subgraphToPrismaCreate(gyroPool, 'MAINNET', 1, []); expect(result.data.type).toBe('GYROE'); - expect(result.data.gyroData?.create.alpha).toBe(gyroPool.alpha); - expect(result.data.gyroData?.create.tauAlphaX).toBe(gyroPool.tauAlphaX); + expect(result.data.staticTypeData['alpha']).toBe(gyroPool.alpha); + expect(result.data.staticTypeData['tauAlphaX']).toBe(gyroPool.tauAlphaX); }); it('should return correct object for fx pool', () => { const result = subgraphToPrismaCreate(fxPool, 'MAINNET', 1, []); expect(result.data.type).toBe('FX'); - expect(result.data.poolTypeSpecificData['alpha']).toBe(gyroPool.alpha); + expect(result.data.staticTypeData['alpha']).toBe(gyroPool.alpha); }); describe('nested pools', () => { diff --git a/modules/pool/subgraph-mapper.ts b/modules/pool/subgraph-mapper.ts index 9d09f0692..a12d267dd 100644 --- a/modules/pool/subgraph-mapper.ts +++ b/modules/pool/subgraph-mapper.ts @@ -26,32 +26,6 @@ export const subgraphToPrismaCreate = ( ...dbData.dynamicData, }, }, - linearData: - dbData.base.type === 'LINEAR' - ? { - create: { - id: dbData.base.id, - ...(dbData.staticTypeData as ReturnType), - }, - } - : undefined, - elementData: - dbData.base.type === 'ELEMENT' - ? { - create: { - id: dbData.base.id, - ...(dbData.staticTypeData as ReturnType), - }, - } - : undefined, - gyroData: ['GYRO', 'GYRO3', 'GYROE'].includes(dbData.base.type) - ? { - create: { - id: dbData.base.id, - ...(dbData.staticTypeData as ReturnType), - }, - } - : undefined, linearDynamicData: dbData.base.type === 'LINEAR' ? { @@ -100,29 +74,6 @@ export const subgraphToPrismaUpdate = ( }, })), }, - linearData: - dbData.base.type === 'LINEAR' - ? { - update: { - ...(dbData.staticTypeData as ReturnType), - }, - } - : undefined, - elementData: - dbData.base.type === 'ELEMENT' - ? { - update: { - ...(dbData.staticTypeData as ReturnType), - }, - } - : undefined, - gyroData: ['GYRO', 'GYRO3', 'GYROE'].includes(dbData.base.type) - ? { - update: { - ...(dbData.staticTypeData as ReturnType), - }, - } - : undefined, linearDynamicData: dbData.base.type === 'LINEAR' ? { diff --git a/modules/sor/sorV2/lib/pools/gyro2/gyro2Pool.ts b/modules/sor/sorV2/lib/pools/gyro2/gyro2Pool.ts index 28576e75a..63e2ddf7f 100644 --- a/modules/sor/sorV2/lib/pools/gyro2/gyro2Pool.ts +++ b/modules/sor/sorV2/lib/pools/gyro2/gyro2Pool.ts @@ -6,6 +6,7 @@ import { MathSol, WAD } from '../../utils/math'; import { SWAP_LIMIT_FACTOR } from '../../utils/gyroHelpers/math'; import { BasePool, BigintIsh, PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; import { chainToIdMap } from '../../../../../network/network-config'; +import { GyroData } from '../../../../../pool/subgraph-mapper'; export class Gyro2PoolToken extends TokenAmount { public readonly index: number; @@ -44,7 +45,7 @@ export class Gyro2Pool implements BasePool { static fromPrismaPool(pool: PrismaPoolWithDynamic): Gyro2Pool { const poolTokens: Gyro2PoolToken[] = []; - if (!pool.dynamicData || !pool.gyroData) { + if (!pool.dynamicData || !pool.staticTypeData) { throw new Error('No dynamic data for pool'); } @@ -64,14 +65,16 @@ export class Gyro2Pool implements BasePool { poolTokens.push(new Gyro2PoolToken(token, tokenAmount.amount, poolToken.index)); } + const gyroData = pool.staticTypeData as GyroData; + return new Gyro2Pool( pool.id as Hex, pool.address, pool.chain, pool.version, parseEther(pool.dynamicData.swapFee), - parseEther(pool.gyroData.sqrtAlpha!), - parseEther(pool.gyroData.sqrtBeta!), + parseEther(gyroData.sqrtAlpha!), + parseEther(gyroData.sqrtBeta!), poolTokens, ); } diff --git a/modules/sor/sorV2/lib/pools/gyro3/gyro3Pool.ts b/modules/sor/sorV2/lib/pools/gyro3/gyro3Pool.ts index 465bf5ba4..6c5fef94c 100644 --- a/modules/sor/sorV2/lib/pools/gyro3/gyro3Pool.ts +++ b/modules/sor/sorV2/lib/pools/gyro3/gyro3Pool.ts @@ -6,6 +6,7 @@ import { MathGyro, SWAP_LIMIT_FACTOR } from '../../utils/gyroHelpers/math'; import { _calcInGivenOut, _calcOutGivenIn, _calculateInvariant } from './gyro3Math'; import { BasePool, BigintIsh, PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; import { chainToIdMap } from '../../../../../network/network-config'; +import { GyroData } from '../../../../../pool/subgraph-mapper'; export class Gyro3PoolToken extends TokenAmount { public readonly index: number; @@ -43,7 +44,7 @@ export class Gyro3Pool implements BasePool { static fromPrismaPool(pool: PrismaPoolWithDynamic): Gyro3Pool { const poolTokens: Gyro3PoolToken[] = []; - if (!pool.dynamicData || !pool.gyroData) { + if (!pool.dynamicData || !pool.staticTypeData) { throw new Error('No dynamic data for pool'); } @@ -69,7 +70,7 @@ export class Gyro3Pool implements BasePool { pool.chain, pool.version, parseEther(pool.dynamicData.swapFee), - parseEther(pool.gyroData.root3Alpha!), + parseEther((pool.staticTypeData as GyroData).root3Alpha!), poolTokens, ); } diff --git a/modules/sor/sorV2/lib/pools/gyroE/gyroEPool.ts b/modules/sor/sorV2/lib/pools/gyroE/gyroEPool.ts index 4cc3ce99f..1a4a812c4 100644 --- a/modules/sor/sorV2/lib/pools/gyroE/gyroEPool.ts +++ b/modules/sor/sorV2/lib/pools/gyroE/gyroEPool.ts @@ -8,6 +8,7 @@ import { balancesFromTokenInOut, virtualOffset0, virtualOffset1 } from './gyroEM import { calculateInvariantWithError, calcOutGivenIn, calcInGivenOut } from './gyroEMath'; import { BasePool, BigintIsh, PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; import { chainToIdMap } from '../../../../../network/network-config'; +import { GyroData } from '../../../../../pool/subgraph-mapper'; export class GyroEPoolToken extends TokenAmount { public readonly rate: bigint; @@ -49,7 +50,7 @@ export class GyroEPool implements BasePool { static fromPrismaPool(pool: PrismaPoolWithDynamic): GyroEPool { const poolTokens: GyroEPoolToken[] = []; - if (!pool.dynamicData || !pool.gyroData) { + if (!pool.dynamicData || !pool.staticTypeData) { throw new Error('No dynamic data for pool'); } @@ -71,28 +72,30 @@ export class GyroEPool implements BasePool { poolTokens.push(new GyroEPoolToken(token, tokenAmount.amount, parseEther(tokenRate), poolToken.index)); } + const gyroData = pool.staticTypeData as GyroData; + const gyroEParams: GyroEParams = { - alpha: parseEther(pool.gyroData.alpha), - beta: parseEther(pool.gyroData.beta), - c: parseEther(pool.gyroData.c!), - s: parseEther(pool.gyroData.s!), - lambda: parseEther(pool.gyroData.lambda!), + alpha: parseEther(gyroData.alpha), + beta: parseEther(gyroData.beta), + c: parseEther(gyroData.c!), + s: parseEther(gyroData.s!), + lambda: parseEther(gyroData.lambda!), }; const derivedGyroEParams: DerivedGyroEParams = { tauAlpha: { - x: parseUnits(pool.gyroData.tauAlphaX!, 38), - y: parseUnits(pool.gyroData.tauAlphaY!, 38), + x: parseUnits(gyroData.tauAlphaX!, 38), + y: parseUnits(gyroData.tauAlphaY!, 38), }, tauBeta: { - x: parseUnits(pool.gyroData.tauBetaX!, 38), - y: parseUnits(pool.gyroData.tauBetaY!, 38), + x: parseUnits(gyroData.tauBetaX!, 38), + y: parseUnits(gyroData.tauBetaY!, 38), }, - u: parseUnits(pool.gyroData.u!, 38), - v: parseUnits(pool.gyroData.v!, 38), - w: parseUnits(pool.gyroData.w!, 38), - z: parseUnits(pool.gyroData.z!, 38), - dSq: parseUnits(pool.gyroData.dSq!, 38), + u: parseUnits(gyroData.u!, 38), + v: parseUnits(gyroData.v!, 38), + w: parseUnits(gyroData.w!, 38), + z: parseUnits(gyroData.z!, 38), + dSq: parseUnits(gyroData.dSq!, 38), }; return new GyroEPool( diff --git a/modules/token/lib/token-price-handlers/linear-wrapped-token-price-handler.service.ts b/modules/token/lib/token-price-handlers/linear-wrapped-token-price-handler.service.ts index adf8ea999..66d865b0d 100644 --- a/modules/token/lib/token-price-handlers/linear-wrapped-token-price-handler.service.ts +++ b/modules/token/lib/token-price-handlers/linear-wrapped-token-price-handler.service.ts @@ -3,6 +3,7 @@ import { PrismaTokenWithTypes } from '../../../../prisma/prisma-types'; import { prisma } from '../../../../prisma/prisma-client'; import { timestampRoundedUpToNearestHour } from '../../../common/time'; import { networkContext } from '../../../network/network-context.service'; +import { LinearData } from '../../../pool/subgraph-mapper'; export class LinearWrappedTokenPriceHandlerService implements TokenPriceHandler { public readonly exitIfFails = false; @@ -22,24 +23,29 @@ export class LinearWrappedTokenPriceHandlerService implements TokenPriceHandler chain: networkContext.chain, categories: { none: { category: 'BLACK_LISTED' } }, }, - include: { linearData: true, tokens: { orderBy: { index: 'asc' }, include: { dynamicData: true } } }, + include: { tokens: { orderBy: { index: 'asc' }, include: { dynamicData: true } } }, }); const mainTokenPrices = await prisma.prismaTokenPrice.findMany({ where: { chain: networkContext.chain, - tokenAddress: { in: pools.map((pool) => pool.tokens[pool.linearData?.mainIndex || 0].address) }, + tokenAddress: { + in: pools.map((pool) => pool.tokens[(pool.staticTypeData as LinearData)?.mainIndex || 0].address), + }, timestamp, }, }); for (const token of tokens) { const pool = pools.find( - (pool) => pool.linearData && token.address === pool.tokens[pool.linearData.wrappedIndex].address, + (pool) => + (pool.staticTypeData as LinearData) && + token.address === pool.tokens[(pool.staticTypeData as LinearData).wrappedIndex].address, ); + const linearData = pool?.staticTypeData as LinearData; - if (pool && pool.linearData) { - const mainToken = pool.tokens[pool.linearData.mainIndex]; - const wrappedToken = pool.tokens[pool.linearData.wrappedIndex]; + if (pool && linearData) { + const mainToken = pool.tokens[linearData.mainIndex]; + const wrappedToken = pool.tokens[linearData.wrappedIndex]; const mainTokenPrice = mainTokenPrices.find( (tokenPrice) => tokenPrice.tokenAddress == mainToken.address, ); From 99b80d3e02b9cda922b8bdaf50b5036a5a2fd5d6 Mon Sep 17 00:00:00 2001 From: gmbronco <83549293+gmbronco@users.noreply.github.com> Date: Thu, 1 Feb 2024 16:26:15 +0100 Subject: [PATCH 3/8] fix getGyroPools chains query param --- modules/pool/lib/pool-gql-loader.service.ts | 4 ++-- modules/pool/pool.resolvers.ts | 13 +++++++++---- modules/pool/pool.service.ts | 4 ++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/modules/pool/lib/pool-gql-loader.service.ts b/modules/pool/lib/pool-gql-loader.service.ts index 9907a41fc..3f6e4fc03 100644 --- a/modules/pool/lib/pool-gql-loader.service.ts +++ b/modules/pool/lib/pool-gql-loader.service.ts @@ -131,9 +131,9 @@ export class PoolGqlLoaderService { return pools.map((pool) => this.mapPoolToGqlPool(pool)) as GqlPoolLinear[]; } - public async getGyroPools(): Promise { + public async getGyroPools(chains: Chain[]): Promise { const pools = await prisma.prismaPool.findMany({ - where: { type: { in: ['GYRO', 'GYRO3', 'GYROE'] }, chain: networkContext.chain }, + where: { type: { in: ['GYRO', 'GYRO3', 'GYROE'] }, chain: { in: chains } }, orderBy: { dynamicData: { totalLiquidity: 'desc' } }, include: prismaPoolWithExpandedNesting.include, }); diff --git a/modules/pool/pool.resolvers.ts b/modules/pool/pool.resolvers.ts index bb8275e65..7bf0519f3 100644 --- a/modules/pool/pool.resolvers.ts +++ b/modules/pool/pool.resolvers.ts @@ -91,16 +91,21 @@ const balancerResolvers: Resolvers = { } return poolService.getGqlLinearPools(chains); }, - poolGetGyroPools: async () => { - return poolService.getGqlGyroPools(); + poolGetGyroPools: async (parent, { chains }, context) => { + const currentChain = headerChain(); + if (!chains && currentChain) { + chains = [currentChain]; + } else if (!chains) { + throw new Error('poolGetGyroPools error: Provide "chains" param'); + } + return poolService.getGqlGyroPools(chains); }, - poolGetFxPools: async (parent, { chains }) => { const currentChain = headerChain(); if (!chains && currentChain) { chains = [currentChain]; } else if (!chains) { - throw new Error('poolGetLinearPools error: Provide "chains" param'); + throw new Error('poolGetFxPools error: Provide "chains" param'); } return poolService.getGqlFxPools(chains); }, diff --git a/modules/pool/pool.service.ts b/modules/pool/pool.service.ts index ef91a0fcf..93ae434c6 100644 --- a/modules/pool/pool.service.ts +++ b/modules/pool/pool.service.ts @@ -83,8 +83,8 @@ export class PoolService { return this.poolGqlLoaderService.getLinearPools(chains); } - public async getGqlGyroPools(): Promise { - return this.poolGqlLoaderService.getGyroPools(); + public async getGqlGyroPools(chains: Chain[]): Promise { + return this.poolGqlLoaderService.getGyroPools(chains); } public async getGqlFxPools(chains: Chain[]): Promise { From b59af3a14713c684210b375fdd26c512ad1da0b9 Mon Sep 17 00:00:00 2001 From: gmbronco <83549293+gmbronco@users.noreply.github.com> Date: Thu, 1 Feb 2024 16:45:14 +0100 Subject: [PATCH 4/8] removing quick fix GyroData table inserts --- modules/pool/lib/pool-creator.service.ts | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/modules/pool/lib/pool-creator.service.ts b/modules/pool/lib/pool-creator.service.ts index 351844b3a..c1d6bc183 100644 --- a/modules/pool/lib/pool-creator.service.ts +++ b/modules/pool/lib/pool-creator.service.ts @@ -250,22 +250,6 @@ export class PoolCreatorService { })), }); - // TODO: It's just a quick fix. Remove after merging json column replacement for tables - if (pool.poolType!.includes('Gyro')) { - await prisma.prismaPoolGyroData.upsert({ - where: { poolId_chain: { poolId: pool.id, chain: this.chain } }, - create: { - id: pool.id, - poolId: pool.id, - chain: this.chain, - ...(poolWithoutTokens.gyroData!.update || {}), - }, - update: { - ...(poolWithoutTokens.gyroData!.update || {}), - }, - }); - } - await prisma.prismaPool.update({ data: poolWithoutTokens, where: { From e1f0909095d0ea30394d1d273ba49eef15a2142e Mon Sep 17 00:00:00 2001 From: gmbronco <83549293+gmbronco@users.noreply.github.com> Date: Tue, 6 Feb 2024 07:53:45 +0100 Subject: [PATCH 5/8] fix: fx data defaults --- modules/pool/lib/pool-gql-loader.service.ts | 6 +----- modules/pool/pool-data/fx.ts | 10 +++++----- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/modules/pool/lib/pool-gql-loader.service.ts b/modules/pool/lib/pool-gql-loader.service.ts index 3f6e4fc03..85789b539 100644 --- a/modules/pool/lib/pool-gql-loader.service.ts +++ b/modules/pool/lib/pool-gql-loader.service.ts @@ -537,11 +537,7 @@ export class PoolGqlLoaderService { __typename: 'GqlPoolFx', ...poolWithoutStaticTypeData, ...mappedData, - alpha: (staticTypeData as FxData).alpha || '', - beta: (staticTypeData as FxData).beta || '', - delta: (staticTypeData as FxData).delta || '', - epsilon: (staticTypeData as FxData).epsilon || '', - lambda: (staticTypeData as FxData).lambda || '', + ...(staticTypeData as FxData), }; } diff --git a/modules/pool/pool-data/fx.ts b/modules/pool/pool-data/fx.ts index 6a805bca4..e460d8559 100644 --- a/modules/pool/pool-data/fx.ts +++ b/modules/pool/pool-data/fx.ts @@ -2,10 +2,10 @@ import { BalancerPoolFragment } from '../../subgraphs/balancer-subgraph/generate export const fx = (pool: BalancerPoolFragment) => { return { - alpha: pool.alpha as string, - beta: pool.beta as string, - delta: pool.delta as string, - epsilon: pool.epsilon as string, - lambda: pool.lambda as string, + alpha: pool.alpha || '', + beta: pool.beta || '', + delta: pool.delta || '', + epsilon: pool.epsilon || '', + lambda: pool.lambda || '', }; }; From 8b9ce399b45d6bc4be5065693cc0316eaeca7511 Mon Sep 17 00:00:00 2001 From: gmbronco <83549293+gmbronco@users.noreply.github.com> Date: Tue, 6 Feb 2024 07:58:03 +0100 Subject: [PATCH 6/8] migrate type specific dynamic data to json column --- modules/pool/lib/pool-gql-loader.service.ts | 13 ++--- .../pool/lib/pool-on-chain-data.service.ts | 39 +++++++------- modules/pool/pool-data/linear.ts | 10 +--- modules/pool/pool-data/stable.ts | 3 +- modules/pool/pool.prisma | 31 ----------- modules/pool/subgraph-mapper.test.ts | 6 +-- modules/pool/subgraph-mapper.ts | 52 ++----------------- .../lib/pools/metastable/metastablePool.ts | 5 +- .../sor/sorV2/lib/pools/stable/stablePool.ts | 5 +- .../migration.sql | 28 ++++++++++ prisma/prisma-types.ts | 14 ----- prisma/schema.prisma | 31 ----------- 12 files changed, 69 insertions(+), 168 deletions(-) create mode 100644 prisma/migrations/20240205160000_jsonb_pool_type_dynamic_data/migration.sql diff --git a/modules/pool/lib/pool-gql-loader.service.ts b/modules/pool/lib/pool-gql-loader.service.ts index 85789b539..8e68f3714 100644 --- a/modules/pool/lib/pool-gql-loader.service.ts +++ b/modules/pool/lib/pool-gql-loader.service.ts @@ -48,7 +48,7 @@ import { BalancerChainIds, BeethovenChainIds, chainIdToChain, chainToIdMap } fro import { GithubContentService } from '../../content/github-content.service'; import { SanityContentService } from '../../content/sanity-content.service'; import { FeaturedPool } from '../../content/content-types'; -import { ElementData, FxData, GyroData, LinearData } from '../subgraph-mapper'; +import { ElementData, FxData, GyroData, LinearData, StableData } from '../subgraph-mapper'; export class PoolGqlLoaderService { public async getPool(id: string, chain: Chain, userAddress?: string): Promise { @@ -478,24 +478,24 @@ export class PoolGqlLoaderService { return { __typename: 'GqlPoolStable', ...poolWithoutStaticTypeData, + ...(staticTypeData as StableData), ...mappedData, - amp: pool.stableDynamicData?.amp || '0', tokens: mappedData.tokens as GqlPoolToken[], }; case 'META_STABLE': return { __typename: 'GqlPoolMetaStable', ...poolWithoutStaticTypeData, + ...(staticTypeData as StableData), ...mappedData, - amp: pool.stableDynamicData?.amp || '0', tokens: mappedData.tokens as GqlPoolToken[], }; case 'COMPOSABLE_STABLE': return { __typename: 'GqlPoolComposableStable', ...poolWithoutStaticTypeData, + ...(staticTypeData as StableData), ...mappedData, - amp: pool.stableDynamicData?.amp || '0', bptPriceRate: bpt?.dynamicData?.priceRate || '1.0', }; case 'LINEAR': @@ -505,8 +505,6 @@ export class PoolGqlLoaderService { ...(staticTypeData as LinearData), ...mappedData, tokens: mappedData.tokens as GqlPoolToken[], - lowerTarget: pool.linearDynamicData?.lowerTarget || '0', - upperTarget: pool.linearDynamicData?.upperTarget || '0', bptPriceRate: bpt?.dynamicData?.priceRate || '1.0', }; case 'ELEMENT': @@ -1134,7 +1132,6 @@ export class PoolGqlLoaderService { __typename: 'GqlPoolLinearNested', ...pool, ...(pool.staticTypeData as LinearData)!, - ...pool.linearDynamicData!, tokens: pool.tokens .filter((token) => token.address !== pool.address) .map((token) => { @@ -1166,6 +1163,7 @@ export class PoolGqlLoaderService { return { __typename: 'GqlPoolComposableStableNested', ...pool, + ...(pool.staticTypeData as StableData)!, nestingType: this.getPoolNestingType(pool), tokens: pool.tokens.map((token) => { const nestedPool = token.nestedPool; @@ -1200,7 +1198,6 @@ export class PoolGqlLoaderService { totalLiquidity: `${pool.dynamicData?.totalLiquidity || 0}`, totalShares: pool.dynamicData?.totalShares || '0', swapFee: pool.dynamicData?.swapFee || '0', - amp: pool.stableDynamicData?.amp || '0', bptPriceRate: bpt?.dynamicData?.priceRate || '1.0', }; } diff --git a/modules/pool/lib/pool-on-chain-data.service.ts b/modules/pool/lib/pool-on-chain-data.service.ts index 511511d3d..1fa77b5ae 100644 --- a/modules/pool/lib/pool-on-chain-data.service.ts +++ b/modules/pool/lib/pool-on-chain-data.service.ts @@ -2,14 +2,14 @@ import { formatFixed } from '@ethersproject/bignumber'; import { PrismaPoolType } from '@prisma/client'; import { isSameAddress } from '@balancer-labs/sdk'; import { prisma } from '../../../prisma/prisma-client'; -import { isComposableStablePool, isStablePool } from './pool-utils'; +import { isStablePool } from './pool-utils'; import { TokenService } from '../../token/token.service'; import { prismaBulkExecuteOperations } from '../../../prisma/prisma-util'; import { fetchOnChainPoolState } from './pool-onchain-state'; import { fetchOnChainPoolData } from './pool-onchain-data'; import { fetchOnChainGyroFees } from './pool-onchain-gyro-fee'; import { networkContext } from '../../network/network-context.service'; -import { LinearData } from '../subgraph-mapper'; +import { LinearData, StableData } from '../subgraph-mapper'; const SUPPORTED_POOL_TYPES: PrismaPoolType[] = [ 'WEIGHTED', @@ -89,9 +89,7 @@ export class PoolOnChainDataService { }, include: { tokens: { orderBy: { index: 'asc' }, include: { dynamicData: true, token: true } }, - stableDynamicData: true, dynamicData: true, - linearDynamicData: true, }, }); @@ -120,12 +118,16 @@ export class PoolOnChainDataService { } //only update if amp has changed - if (!pool.stableDynamicData || pool.stableDynamicData.amp !== amp) { + if ((pool.staticTypeData as StableData).amp !== amp) { operations.push( - prisma.prismaPoolStableDynamicData.upsert({ + prisma.prismaPool.update({ where: { id_chain: { id: pool.id, chain: this.options.chain } }, - create: { id: pool.id, chain: this.options.chain, poolId: pool.id, amp, blockNumber }, - update: { amp, blockNumber }, + data: { + staticTypeData: { + ...(pool.staticTypeData as StableData), + amp, + }, + }, }), ); } @@ -140,22 +142,19 @@ export class PoolOnChainDataService { const upperTarget = formatFixed(onchainData.targets[1], 18); if ( - !pool.linearDynamicData || - pool.linearDynamicData.lowerTarget !== lowerTarget || - pool.linearDynamicData.upperTarget !== upperTarget + (pool.staticTypeData as LinearData).lowerTarget !== lowerTarget || + (pool.staticTypeData as LinearData).upperTarget !== upperTarget ) { operations.push( - prisma.prismaPoolLinearDynamicData.upsert({ + prisma.prismaPool.update({ where: { id_chain: { id: pool.id, chain: this.options.chain } }, - create: { - id: pool.id, - chain: this.options.chain, - poolId: pool.id, - upperTarget, - lowerTarget, - blockNumber, + data: { + staticTypeData: { + ...(pool.staticTypeData as LinearData), + lowerTarget, + upperTarget, + }, }, - update: { upperTarget, lowerTarget, blockNumber }, }), ); } diff --git a/modules/pool/pool-data/linear.ts b/modules/pool/pool-data/linear.ts index becb29a4c..2f731157a 100644 --- a/modules/pool/pool-data/linear.ts +++ b/modules/pool/pool-data/linear.ts @@ -4,13 +4,7 @@ export const linear = (pool: BalancerPoolFragment) => { return { mainIndex: pool.mainIndex || 0, wrappedIndex: pool.wrappedIndex || 0, - }; -}; - -export const linearDynamic = (pool: BalancerPoolFragment, blockNumber: number) => { - return { - upperTarget: pool.upperTarget || '', - lowerTarget: pool.lowerTarget || '', - blockNumber, + lowerTarget: pool.lowerTarget || '0', + upperTarget: pool.upperTarget || '0', }; }; diff --git a/modules/pool/pool-data/stable.ts b/modules/pool/pool-data/stable.ts index 7ac8218d8..72eec03e4 100644 --- a/modules/pool/pool-data/stable.ts +++ b/modules/pool/pool-data/stable.ts @@ -1,8 +1,7 @@ import { BalancerPoolFragment } from '../../subgraphs/balancer-subgraph/generated/balancer-subgraph-types'; -export const stableDynamic = (pool: BalancerPoolFragment, blockNumber: number) => { +export const stable = (pool: BalancerPoolFragment) => { return { amp: pool.amp || '', - blockNumber, }; }; diff --git a/modules/pool/pool.prisma b/modules/pool/pool.prisma index f4851194c..e1d883e90 100644 --- a/modules/pool/pool.prisma +++ b/modules/pool/pool.prisma @@ -22,8 +22,6 @@ model PrismaPool { tokens PrismaPoolToken[] dynamicData PrismaPoolDynamicData? - stableDynamicData PrismaPoolStableDynamicData? - linearDynamicData PrismaPoolLinearDynamicData? snapshots PrismaPoolSnapshot[] swaps PrismaPoolSwap[] @@ -119,35 +117,6 @@ model PrismaPoolDynamicData { fees24hAtlTimestamp Int @default(0) } -model PrismaPoolStableDynamicData { - @@id([id, chain]) - @@unique([poolId, chain]) - - id String - poolId String - pool PrismaPool @relation(fields:[poolId, chain], references: [id, chain], onDelete: Cascade) - chain Chain - blockNumber Int - updatedAt DateTime @updatedAt - - amp String -} - -model PrismaPoolLinearDynamicData { - @@id([id, chain]) - @@unique([poolId, chain]) - - id String - poolId String - pool PrismaPool @relation(fields:[poolId, chain], references: [id, chain], onDelete: Cascade) - chain Chain - blockNumber Int - updatedAt DateTime @updatedAt - - lowerTarget String - upperTarget String -} - model PrismaPoolToken { @@id([id, chain]) diff --git a/modules/pool/subgraph-mapper.test.ts b/modules/pool/subgraph-mapper.test.ts index 5889798b0..5c482e736 100644 --- a/modules/pool/subgraph-mapper.test.ts +++ b/modules/pool/subgraph-mapper.test.ts @@ -46,20 +46,20 @@ describe('subgraphToPrismaCreate', () => { it('should return correct object for stable pool', () => { const result = subgraphToPrismaCreate(stablePool, 'MAINNET', 1, []); expect(result.data.type).toBe('COMPOSABLE_STABLE'); - expect(result.data.stableDynamicData?.create.amp).toBe(stablePool.amp); + expect(result.data.staticTypeData['amp']).toBe(stablePool.amp); }); it('should return correct object for old stable pool', () => { const result = subgraphToPrismaCreate(oldStablePool, 'MAINNET', 1, []); expect(result.data.type).toBe('COMPOSABLE_STABLE'); expect(result.data.version).toBe(0); - expect(result.data.stableDynamicData?.create.amp).toBe(oldStablePool.amp); + expect(result.data.staticTypeData['amp']).toBe(oldStablePool.amp); }); it('should return correct object for linear pool', () => { const result = subgraphToPrismaCreate(linearPool, 'MAINNET', 1, []); expect(result.data.type).toBe('LINEAR'); - expect(result.data.linearDynamicData?.create.upperTarget).toBe(linearPool.upperTarget); + expect(result.data.staticTypeData['upperTarget']).toBe(linearPool.upperTarget); expect(result.data.staticTypeData['wrappedIndex']).toBe(linearPool.wrappedIndex); }); diff --git a/modules/pool/subgraph-mapper.ts b/modules/pool/subgraph-mapper.ts index a12d267dd..7d7740d20 100644 --- a/modules/pool/subgraph-mapper.ts +++ b/modules/pool/subgraph-mapper.ts @@ -1,7 +1,7 @@ import { Chain, PrismaPoolType } from '@prisma/client'; import { BalancerPoolFragment } from '../subgraphs/balancer-subgraph/generated/balancer-subgraph-types'; import { AddressZero } from '@ethersproject/constants'; -import { fx, gyro, linear, element, stableDynamic, linearDynamic } from './pool-data'; +import { fx, gyro, linear, element, stable } from './pool-data'; export const subgraphToPrismaCreate = ( pool: BalancerPoolFragment, @@ -26,23 +26,6 @@ export const subgraphToPrismaCreate = ( ...dbData.dynamicData, }, }, - linearDynamicData: - dbData.base.type === 'LINEAR' - ? { - create: { - id: dbData.base.id, - ...(dbData.dynamicTypeData as ReturnType), - }, - } - : undefined, - stableDynamicData: ['STABLE', 'COMPOSABLE_STABLE', 'META_STABLE'].includes(dbData.base.type) - ? { - create: { - id: dbData.base.id, - ...(dbData.dynamicTypeData as ReturnType), - }, - } - : undefined, }, }; @@ -74,21 +57,6 @@ export const subgraphToPrismaUpdate = ( }, })), }, - linearDynamicData: - dbData.base.type === 'LINEAR' - ? { - update: { - ...(dbData.dynamicTypeData as ReturnType), - }, - } - : undefined, - stableDynamicData: ['STABLE', 'COMPOSABLE_STABLE', 'META_STABLE'].includes(dbData.base.type) - ? { - update: { - ...(dbData.dynamicTypeData as ReturnType), - }, - } - : undefined, }; return prismaPoolRecordWithDataAssociations; @@ -132,10 +100,6 @@ const subgraphMapper = ( ? staticTypeDataMapper[type as keyof typeof staticTypeDataMapper](pool) : {}; - const dynamicTypeData = Object.keys(dynamicTypeDataMapper).includes(type) - ? dynamicTypeDataMapper[type as keyof typeof dynamicTypeDataMapper](pool, blockNumber) - : {}; - const tokens = pool.tokens?.map((token) => { const nestedPool = nestedPools.find((nestedPool) => { @@ -165,7 +129,6 @@ const subgraphMapper = ( dynamicData, tokens, staticTypeData, - dynamicTypeData, }; }; @@ -225,18 +188,13 @@ const staticTypeDataMapper = { GYRO3: gyro, GYROE: gyro, LINEAR: linear, -}; - -const dynamicTypeDataMapper = { - STABLE: stableDynamic, - COMPOSABLE_STABLE: stableDynamic, - META_STABLE: stableDynamic, - LINEAR: linearDynamic, + STABLE: stable, + COMPOSABLE_STABLE: stable, + META_STABLE: stable, }; export type FxData = ReturnType; export type GyroData = ReturnType; export type LinearData = ReturnType; export type ElementData = ReturnType; -export type StableDynamicData = ReturnType; -export type LinearDynamicData = ReturnType; +export type StableData = ReturnType; diff --git a/modules/sor/sorV2/lib/pools/metastable/metastablePool.ts b/modules/sor/sorV2/lib/pools/metastable/metastablePool.ts index b8b14d8cc..44d458ffd 100644 --- a/modules/sor/sorV2/lib/pools/metastable/metastablePool.ts +++ b/modules/sor/sorV2/lib/pools/metastable/metastablePool.ts @@ -6,6 +6,7 @@ import { _calcInGivenOut, _calcOutGivenIn, _calculateInvariant } from '../stable import { MathSol, WAD } from '../../utils/math'; import { BasePool, PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; import { chainToIdMap } from '../../../../../network/network-config'; +import { StableData } from '../../../../../pool/subgraph-mapper'; export class MetaStablePool implements BasePool { public readonly chain: Chain; @@ -22,7 +23,7 @@ export class MetaStablePool implements BasePool { static fromPrismaPool(pool: PrismaPoolWithDynamic): MetaStablePool { const poolTokens: StablePoolToken[] = []; - if (!pool.dynamicData || !pool.stableDynamicData) throw new Error('Stable pool has no dynamic data'); + if (!pool.dynamicData) throw new Error('Stable pool has no dynamic data'); for (const poolToken of pool.tokens) { if (!poolToken.dynamicData?.priceRate) throw new Error('Meta Stable pool token does not have a price rate'); @@ -45,7 +46,7 @@ export class MetaStablePool implements BasePool { ); } - const amp = parseUnits(pool.stableDynamicData.amp, 3); + const amp = parseUnits((pool.staticTypeData as StableData).amp, 3); return new MetaStablePool( pool.id as Hex, diff --git a/modules/sor/sorV2/lib/pools/stable/stablePool.ts b/modules/sor/sorV2/lib/pools/stable/stablePool.ts index c99b20d9b..74c3f2678 100644 --- a/modules/sor/sorV2/lib/pools/stable/stablePool.ts +++ b/modules/sor/sorV2/lib/pools/stable/stablePool.ts @@ -13,6 +13,7 @@ import { } from './stableMath'; import { BasePool, BigintIsh, PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; import { chainToIdMap } from '../../../../../network/network-config'; +import { StableData } from '../../../../../pool/subgraph-mapper'; export class StablePoolToken extends TokenAmount { public readonly rate: bigint; @@ -56,7 +57,7 @@ export class StablePool implements BasePool { static fromPrismaPool(pool: PrismaPoolWithDynamic): StablePool { const poolTokens: StablePoolToken[] = []; - if (!pool.dynamicData || !pool.stableDynamicData) throw new Error('Stable pool has no dynamic data'); + if (!pool.dynamicData) throw new Error('Stable pool has no dynamic data'); for (const poolToken of pool.tokens) { if (!poolToken.dynamicData?.priceRate) throw new Error('Stable pool token does not have a price rate'); @@ -80,7 +81,7 @@ export class StablePool implements BasePool { } const totalShares = parseEther(pool.dynamicData.totalShares); - const amp = parseUnits(pool.stableDynamicData.amp, 3); + const amp = parseUnits((pool.staticTypeData as StableData).amp, 3); return new StablePool( pool.id as Hex, diff --git a/prisma/migrations/20240205160000_jsonb_pool_type_dynamic_data/migration.sql b/prisma/migrations/20240205160000_jsonb_pool_type_dynamic_data/migration.sql new file mode 100644 index 000000000..9114b53fe --- /dev/null +++ b/prisma/migrations/20240205160000_jsonb_pool_type_dynamic_data/migration.sql @@ -0,0 +1,28 @@ +-- Migrate pool data from tables to JSON columns +WITH stable_data as ( + SELECT t.id, jsonb(row_to_json(t)) - 'id' as json + FROM ( + SELECT id, amp + FROM "PrismaPoolStableDynamicData" + ) t +) +UPDATE "PrismaPool" +SET "staticTypeData" = "staticTypeData" || json +FROM stable_data +WHERE "PrismaPool".id = stable_data.id; + +WITH linear_data as ( + SELECT t.id, jsonb(row_to_json(t)) - 'id' as json + FROM ( + SELECT id, "lowerTarget", "upperTarget" + FROM "PrismaPoolLinearDynamicData" + ) t +) +UPDATE "PrismaPool" +SET "staticTypeData" = "staticTypeData" || json +FROM linear_data +WHERE "PrismaPool".id = linear_data.id; + +-- Remove old tables +DROP TABLE "PrismaPoolLinearDynamicData"; +DROP TABLE "PrismaPoolStableDynamicData"; diff --git a/prisma/prisma-types.ts b/prisma/prisma-types.ts index e853a7b0f..390f90532 100644 --- a/prisma/prisma-types.ts +++ b/prisma/prisma-types.ts @@ -15,8 +15,6 @@ export type PrismaPoolTokenWithDynamicData = Prisma.PrismaPoolTokenGetPayload()({ include: { dynamicData: true, - stableDynamicData: true, - linearDynamicData: true, staking: { include: { farm: { @@ -74,8 +72,6 @@ export const prismaPoolWithExpandedNesting = Prisma.validator()({ include: { dynamicData: true, - stableDynamicData: true, - linearDynamicData: true, tokens: { orderBy: { index: 'asc' }, include: { @@ -118,7 +111,6 @@ const nestedPoolWithSingleLayerNesting = Prisma.validator nestedPool: { include: { dynamicData: true, - linearDynamicData: true, tokens: { orderBy: { index: 'asc' }, include: { @@ -140,7 +132,6 @@ export type PrismaNestedPoolWithSingleLayerNesting = Prisma.PrismaPoolGetPayload const nestedPoolWithNoNesting = Prisma.validator()({ include: { dynamicData: true, - linearDynamicData: true, tokens: { orderBy: { index: 'asc' }, include: { @@ -160,8 +151,6 @@ const prismaPoolTokenWithExpandedNesting = Prisma.validator()({ include: { - stableDynamicData: true, dynamicData: true, - linearDynamicData: true, tokens: { orderBy: { index: 'asc' }, include: { diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 99f55447a..a61b0e1df 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -69,8 +69,6 @@ model PrismaPool { tokens PrismaPoolToken[] dynamicData PrismaPoolDynamicData? - stableDynamicData PrismaPoolStableDynamicData? - linearDynamicData PrismaPoolLinearDynamicData? snapshots PrismaPoolSnapshot[] swaps PrismaPoolSwap[] @@ -166,35 +164,6 @@ model PrismaPoolDynamicData { fees24hAtlTimestamp Int @default(0) } -model PrismaPoolStableDynamicData { - @@id([id, chain]) - @@unique([poolId, chain]) - - id String - poolId String - pool PrismaPool @relation(fields:[poolId, chain], references: [id, chain], onDelete: Cascade) - chain Chain - blockNumber Int - updatedAt DateTime @updatedAt - - amp String -} - -model PrismaPoolLinearDynamicData { - @@id([id, chain]) - @@unique([poolId, chain]) - - id String - poolId String - pool PrismaPool @relation(fields:[poolId, chain], references: [id, chain], onDelete: Cascade) - chain Chain - blockNumber Int - updatedAt DateTime @updatedAt - - lowerTarget String - upperTarget String -} - model PrismaPoolToken { @@id([id, chain]) From 12c8d7b7c8dbf62d5b88eba30998388f9defa71b Mon Sep 17 00:00:00 2001 From: gmbronco <83549293+gmbronco@users.noreply.github.com> Date: Wed, 7 Feb 2024 17:45:00 +0100 Subject: [PATCH 7/8] pools.type_data column --- modules/content/github-content.service.ts | 4 +- modules/content/sanity-content.service.ts | 4 +- .../fantom/spooky-swap-apr.service.ts | 6 +- modules/pool/lib/pool-gql-loader.service.ts | 60 +++++++++---------- .../pool/lib/pool-on-chain-data.service.ts | 16 ++--- modules/pool/pool.prisma | 2 +- modules/pool/subgraph-mapper.test.ts | 16 ++--- modules/pool/subgraph-mapper.ts | 14 ++--- modules/sor/sorV2/lib/pools/fx/fxPool.ts | 10 ++-- .../sor/sorV2/lib/pools/gyro2/gyro2Pool.ts | 4 +- .../sor/sorV2/lib/pools/gyro3/gyro3Pool.ts | 4 +- .../sor/sorV2/lib/pools/gyroE/gyroEPool.ts | 4 +- .../lib/pools/metastable/metastablePool.ts | 2 +- .../sor/sorV2/lib/pools/stable/stablePool.ts | 2 +- ...ear-wrapped-token-price-handler.service.ts | 8 +-- .../migration.sql | 2 + prisma/schema.prisma | 2 +- 17 files changed, 79 insertions(+), 81 deletions(-) create mode 100644 prisma/migrations/20240207160000_jsonb_pool_data_column_rename/migration.sql diff --git a/modules/content/github-content.service.ts b/modules/content/github-content.service.ts index a987e73af..51451c3bd 100644 --- a/modules/content/github-content.service.ts +++ b/modules/content/github-content.service.ts @@ -117,7 +117,7 @@ export class GithubContentService implements ContentService { symbol: true, name: true, type: true, - staticTypeData: true, + typeData: true, tokens: { orderBy: { index: 'asc' } }, }, }); @@ -152,7 +152,7 @@ export class GithubContentService implements ContentService { }); } - const wrappedIndex = (pool?.staticTypeData as LinearData).wrappedIndex; + const wrappedIndex = (pool?.typeData as LinearData).wrappedIndex; const wrappedLinearPoolToken = pools.find((pool) => pool.tokens[wrappedIndex]?.address === token.address); if (wrappedLinearPoolToken && !tokenTypes.includes('LINEAR_WRAPPED_TOKEN')) { diff --git a/modules/content/sanity-content.service.ts b/modules/content/sanity-content.service.ts index 4aaa03075..cf7da5af8 100644 --- a/modules/content/sanity-content.service.ts +++ b/modules/content/sanity-content.service.ts @@ -186,7 +186,7 @@ export class SanityContentService implements ContentService { }); } - const wrappedIndex = (pool?.staticTypeData as LinearData).wrappedIndex; + const wrappedIndex = (pool?.typeData as LinearData).wrappedIndex; const wrappedLinearPoolToken = pools.find((pool) => pool.tokens[wrappedIndex]?.address === token.address); if (wrappedLinearPoolToken && !tokenTypes.includes('LINEAR_WRAPPED_TOKEN')) { @@ -216,7 +216,7 @@ export class SanityContentService implements ContentService { symbol: true, name: true, type: true, - staticTypeData: true, + typeData: true, tokens: { orderBy: { index: 'asc' } }, }, }); diff --git a/modules/pool/lib/apr-data-sources/fantom/spooky-swap-apr.service.ts b/modules/pool/lib/apr-data-sources/fantom/spooky-swap-apr.service.ts index a345f0493..3004a2210 100644 --- a/modules/pool/lib/apr-data-sources/fantom/spooky-swap-apr.service.ts +++ b/modules/pool/lib/apr-data-sources/fantom/spooky-swap-apr.service.ts @@ -38,14 +38,14 @@ export class SpookySwapAprService implements PoolAprService { for (const pool of expandedSpookyPools) { if ( - !(pool.staticTypeData as LinearData) || + !(pool.typeData as LinearData) || !pool.dynamicData || - pool.tokens[(pool.staticTypeData as LinearData).mainIndex].address !== this.booAddress + pool.tokens[(pool.typeData as LinearData).mainIndex].address !== this.booAddress ) { continue; } - const linearData = pool.staticTypeData as LinearData; + const linearData = pool.typeData as LinearData; const wrappedToken = pool.tokens[linearData.wrappedIndex]; const tokenPrice = this.tokenService.getPriceForToken(tokenPrices, this.booAddress); const wrappedTokens = parseFloat(wrappedToken.dynamicData?.balance || '0'); diff --git a/modules/pool/lib/pool-gql-loader.service.ts b/modules/pool/lib/pool-gql-loader.service.ts index 8e68f3714..5d6305758 100644 --- a/modules/pool/lib/pool-gql-loader.service.ts +++ b/modules/pool/lib/pool-gql-loader.service.ts @@ -455,7 +455,7 @@ export class PoolGqlLoaderService { userWalletbalances: PrismaUserWalletBalance[] = [], userStakedBalances: PrismaUserStakedBalance[] = [], ): GqlPoolUnion { - const { staticTypeData, ...poolWithoutStaticTypeData } = pool; + const { typeData, ...poolWithoutTypeData } = pool; const bpt = pool.tokens.find((token) => token.address === pool.address); @@ -477,32 +477,32 @@ export class PoolGqlLoaderService { case 'STABLE': return { __typename: 'GqlPoolStable', - ...poolWithoutStaticTypeData, - ...(staticTypeData as StableData), + ...poolWithoutTypeData, + ...(typeData as StableData), ...mappedData, tokens: mappedData.tokens as GqlPoolToken[], }; case 'META_STABLE': return { __typename: 'GqlPoolMetaStable', - ...poolWithoutStaticTypeData, - ...(staticTypeData as StableData), + ...poolWithoutTypeData, + ...(typeData as StableData), ...mappedData, tokens: mappedData.tokens as GqlPoolToken[], }; case 'COMPOSABLE_STABLE': return { __typename: 'GqlPoolComposableStable', - ...poolWithoutStaticTypeData, - ...(staticTypeData as StableData), + ...poolWithoutTypeData, + ...(typeData as StableData), ...mappedData, bptPriceRate: bpt?.dynamicData?.priceRate || '1.0', }; case 'LINEAR': return { __typename: 'GqlPoolLinear', - ...poolWithoutStaticTypeData, - ...(staticTypeData as LinearData), + ...poolWithoutTypeData, + ...(typeData as LinearData), ...mappedData, tokens: mappedData.tokens as GqlPoolToken[], bptPriceRate: bpt?.dynamicData?.priceRate || '1.0', @@ -510,15 +510,15 @@ export class PoolGqlLoaderService { case 'ELEMENT': return { __typename: 'GqlPoolElement', - ...poolWithoutStaticTypeData, - ...(staticTypeData as ElementData), + ...poolWithoutTypeData, + ...(typeData as ElementData), ...mappedData, tokens: mappedData.tokens as GqlPoolToken[], }; case 'LIQUIDITY_BOOTSTRAPPING': return { __typename: 'GqlPoolLiquidityBootstrapping', - ...poolWithoutStaticTypeData, + ...poolWithoutTypeData, ...mappedData, }; case 'GYRO': @@ -526,22 +526,22 @@ export class PoolGqlLoaderService { case 'GYROE': return { __typename: 'GqlPoolGyro', - ...poolWithoutStaticTypeData, - ...(staticTypeData as GyroData), + ...poolWithoutTypeData, + ...(typeData as GyroData), ...mappedData, }; case 'FX': return { __typename: 'GqlPoolFx', - ...poolWithoutStaticTypeData, + ...poolWithoutTypeData, ...mappedData, - ...(staticTypeData as FxData), + ...(typeData as FxData), }; } return { __typename: 'GqlPoolWeighted', - ...poolWithoutStaticTypeData, + ...poolWithoutTypeData, ...mappedData, }; } @@ -973,12 +973,8 @@ export class PoolGqlLoaderService { const nestedPool = poolToken.nestedPool; const options: GqlPoolInvestOption[] = []; - if ( - nestedPool && - nestedPool.type === 'LINEAR' && - (nestedPool.staticTypeData as LinearData).mainIndex !== undefined - ) { - const mainToken = nestedPool.tokens[(nestedPool.staticTypeData as LinearData).mainIndex]; + if (nestedPool && nestedPool.type === 'LINEAR' && (nestedPool.typeData as LinearData).mainIndex !== undefined) { + const mainToken = nestedPool.tokens[(nestedPool.typeData as LinearData).mainIndex]; const isWrappedNativeAsset = isSameAddress(mainToken.address, networkContext.data.weth.address); options.push({ @@ -1016,11 +1012,11 @@ export class PoolGqlLoaderService { tokenOptions: nestedToken.nestedPool && nestedToken.nestedPool.type === 'LINEAR' && - (nestedToken.nestedPool.staticTypeData as LinearData).mainIndex !== undefined + (nestedToken.nestedPool.typeData as LinearData).mainIndex !== undefined ? [ this.mapPoolTokenToGql( nestedToken.nestedPool.tokens[ - (nestedToken.nestedPool.staticTypeData as LinearData).mainIndex + (nestedToken.nestedPool.typeData as LinearData).mainIndex ], ), ] @@ -1036,11 +1032,11 @@ export class PoolGqlLoaderService { if ( nestedToken.nestedPool && nestedToken.nestedPool.type === 'LINEAR' && - (nestedToken.nestedPool.staticTypeData as LinearData).mainIndex !== undefined + (nestedToken.nestedPool.typeData as LinearData).mainIndex !== undefined ) { return this.mapPoolTokenToGql( nestedToken.nestedPool.tokens[ - (nestedToken.nestedPool.staticTypeData as LinearData).mainIndex + (nestedToken.nestedPool.typeData as LinearData).mainIndex ], ); } @@ -1131,7 +1127,7 @@ export class PoolGqlLoaderService { return { __typename: 'GqlPoolLinearNested', ...pool, - ...(pool.staticTypeData as LinearData)!, + ...(pool.typeData as LinearData)!, tokens: pool.tokens .filter((token) => token.address !== pool.address) .map((token) => { @@ -1163,7 +1159,7 @@ export class PoolGqlLoaderService { return { __typename: 'GqlPoolComposableStableNested', ...pool, - ...(pool.staticTypeData as StableData)!, + ...(pool.typeData as StableData)!, nestingType: this.getPoolNestingType(pool), tokens: pool.tokens.map((token) => { const nestedPool = token.nestedPool; @@ -1223,7 +1219,7 @@ export class PoolGqlLoaderService { wrappedTokenBalance: string; totalMainTokenBalance: string; } { - if (!poolToken.dynamicData || !(nestedPool.staticTypeData as LinearData) || !nestedPool.dynamicData) { + if (!poolToken.dynamicData || !(nestedPool.typeData as LinearData) || !nestedPool.dynamicData) { return { mainTokenBalance: '0', wrappedTokenBalance: '0', @@ -1234,8 +1230,8 @@ export class PoolGqlLoaderService { const percentOfSupplyInPool = parseFloat(poolToken.dynamicData.balance) / parseFloat(nestedPool.dynamicData.totalShares); - const mainToken = nestedPool.tokens[(nestedPool.staticTypeData as LinearData).mainIndex]; - const wrappedToken = nestedPool.tokens[(nestedPool.staticTypeData as LinearData).wrappedIndex]; + const mainToken = nestedPool.tokens[(nestedPool.typeData as LinearData).mainIndex]; + const wrappedToken = nestedPool.tokens[(nestedPool.typeData as LinearData).wrappedIndex]; const wrappedTokenBalance = oldBnum(wrappedToken.dynamicData?.balance || '0').times(percentOfSupplyInPool); const mainTokenBalance = oldBnum(mainToken.dynamicData?.balance || '0').times(percentOfSupplyInPool); diff --git a/modules/pool/lib/pool-on-chain-data.service.ts b/modules/pool/lib/pool-on-chain-data.service.ts index 1fa77b5ae..1c23bb203 100644 --- a/modules/pool/lib/pool-on-chain-data.service.ts +++ b/modules/pool/lib/pool-on-chain-data.service.ts @@ -118,13 +118,13 @@ export class PoolOnChainDataService { } //only update if amp has changed - if ((pool.staticTypeData as StableData).amp !== amp) { + if ((pool.typeData as StableData).amp !== amp) { operations.push( prisma.prismaPool.update({ where: { id_chain: { id: pool.id, chain: this.options.chain } }, data: { - staticTypeData: { - ...(pool.staticTypeData as StableData), + typeData: { + ...(pool.typeData as StableData), amp, }, }, @@ -142,15 +142,15 @@ export class PoolOnChainDataService { const upperTarget = formatFixed(onchainData.targets[1], 18); if ( - (pool.staticTypeData as LinearData).lowerTarget !== lowerTarget || - (pool.staticTypeData as LinearData).upperTarget !== upperTarget + (pool.typeData as LinearData).lowerTarget !== lowerTarget || + (pool.typeData as LinearData).upperTarget !== upperTarget ) { operations.push( prisma.prismaPool.update({ where: { id_chain: { id: pool.id, chain: this.options.chain } }, data: { - staticTypeData: { - ...(pool.staticTypeData as LinearData), + typeData: { + ...(pool.typeData as LinearData), lowerTarget, upperTarget, }, @@ -229,7 +229,7 @@ export class PoolOnChainDataService { // linear wrapped token rate if ( onchainData.wrappedTokenRate && - (pool.staticTypeData as LinearData)?.wrappedIndex === poolToken.index + (pool.typeData as LinearData)?.wrappedIndex === poolToken.index ) { priceRate = onchainData.wrappedTokenRate; } diff --git a/modules/pool/pool.prisma b/modules/pool/pool.prisma index e1d883e90..8d5a739bd 100644 --- a/modules/pool/pool.prisma +++ b/modules/pool/pool.prisma @@ -17,7 +17,7 @@ model PrismaPool { vaultVersion Int @default(2) - staticTypeData Json @default("{}") + typeData Json @default("{}") @map("type_data") tokens PrismaPoolToken[] diff --git a/modules/pool/subgraph-mapper.test.ts b/modules/pool/subgraph-mapper.test.ts index 5c482e736..168c21d3b 100644 --- a/modules/pool/subgraph-mapper.test.ts +++ b/modules/pool/subgraph-mapper.test.ts @@ -46,40 +46,40 @@ describe('subgraphToPrismaCreate', () => { it('should return correct object for stable pool', () => { const result = subgraphToPrismaCreate(stablePool, 'MAINNET', 1, []); expect(result.data.type).toBe('COMPOSABLE_STABLE'); - expect(result.data.staticTypeData['amp']).toBe(stablePool.amp); + expect(result.data.typeData['amp']).toBe(stablePool.amp); }); it('should return correct object for old stable pool', () => { const result = subgraphToPrismaCreate(oldStablePool, 'MAINNET', 1, []); expect(result.data.type).toBe('COMPOSABLE_STABLE'); expect(result.data.version).toBe(0); - expect(result.data.staticTypeData['amp']).toBe(oldStablePool.amp); + expect(result.data.typeData['amp']).toBe(oldStablePool.amp); }); it('should return correct object for linear pool', () => { const result = subgraphToPrismaCreate(linearPool, 'MAINNET', 1, []); expect(result.data.type).toBe('LINEAR'); - expect(result.data.staticTypeData['upperTarget']).toBe(linearPool.upperTarget); - expect(result.data.staticTypeData['wrappedIndex']).toBe(linearPool.wrappedIndex); + expect(result.data.typeData['upperTarget']).toBe(linearPool.upperTarget); + expect(result.data.typeData['wrappedIndex']).toBe(linearPool.wrappedIndex); }); it('should return correct object for element pool', () => { const result = subgraphToPrismaCreate(elementPool, 'MAINNET', 1, []); expect(result.data.type).toBe('ELEMENT'); - expect(result.data.staticTypeData['principalToken']).toBe(elementPool.principalToken); + expect(result.data.typeData['principalToken']).toBe(elementPool.principalToken); }); it('should return correct object for gyro pool', () => { const result = subgraphToPrismaCreate(gyroPool, 'MAINNET', 1, []); expect(result.data.type).toBe('GYROE'); - expect(result.data.staticTypeData['alpha']).toBe(gyroPool.alpha); - expect(result.data.staticTypeData['tauAlphaX']).toBe(gyroPool.tauAlphaX); + expect(result.data.typeData['alpha']).toBe(gyroPool.alpha); + expect(result.data.typeData['tauAlphaX']).toBe(gyroPool.tauAlphaX); }); it('should return correct object for fx pool', () => { const result = subgraphToPrismaCreate(fxPool, 'MAINNET', 1, []); expect(result.data.type).toBe('FX'); - expect(result.data.staticTypeData['alpha']).toBe(gyroPool.alpha); + expect(result.data.typeData['alpha']).toBe(gyroPool.alpha); }); describe('nested pools', () => { diff --git a/modules/pool/subgraph-mapper.ts b/modules/pool/subgraph-mapper.ts index 7d7740d20..bc4178781 100644 --- a/modules/pool/subgraph-mapper.ts +++ b/modules/pool/subgraph-mapper.ts @@ -14,7 +14,7 @@ export const subgraphToPrismaCreate = ( const prismaPoolRecordWithAssociations = { data: { ...dbData.base, - staticTypeData: dbData.staticTypeData, + typeData: dbData.typeData, tokens: { createMany: { data: dbData.tokens, @@ -43,7 +43,7 @@ export const subgraphToPrismaUpdate = ( const prismaPoolRecordWithDataAssociations = { ...baseWithoutId, - staticTypeData: dbData.staticTypeData, + typeData: dbData.typeData, tokens: { update: dbData.tokens.map((token) => ({ where: { @@ -94,10 +94,10 @@ const subgraphMapper = ( totalLiquidity: Math.max(parseFloat(pool.totalLiquidity), 0), }; - const staticTypeData: ReturnType | {} = Object.keys( - staticTypeDataMapper, + const typeData: ReturnType | {} = Object.keys( + typeDataMapper, ).includes(type) - ? staticTypeDataMapper[type as keyof typeof staticTypeDataMapper](pool) + ? typeDataMapper[type as keyof typeof typeDataMapper](pool) : {}; const tokens = @@ -128,7 +128,7 @@ const subgraphMapper = ( base, dynamicData, tokens, - staticTypeData, + typeData, }; }; @@ -181,7 +181,7 @@ const mapPoolTypeVersion = (poolType: string, poolTypeVersion: number): number = return version; }; -const staticTypeDataMapper = { +const typeDataMapper = { ELEMENT: element, FX: fx, GYRO: gyro, diff --git a/modules/sor/sorV2/lib/pools/fx/fxPool.ts b/modules/sor/sorV2/lib/pools/fx/fxPool.ts index a0e3f02db..962885078 100644 --- a/modules/sor/sorV2/lib/pools/fx/fxPool.ts +++ b/modules/sor/sorV2/lib/pools/fx/fxPool.ts @@ -73,11 +73,11 @@ export class FxPool implements BasePool { pool.chain, pool.version, parseEther(pool.dynamicData.swapFee), - parseFixedCurveParam((pool.staticTypeData as FxData).alpha as string), - parseFixedCurveParam((pool.staticTypeData as FxData).beta as string), - parseFixedCurveParam((pool.staticTypeData as FxData).lambda as string), - parseUnits((pool.staticTypeData as FxData).delta as string, 36), - parseFixedCurveParam((pool.staticTypeData as FxData).epsilon as string), + parseFixedCurveParam((pool.typeData as FxData).alpha as string), + parseFixedCurveParam((pool.typeData as FxData).beta as string), + parseFixedCurveParam((pool.typeData as FxData).lambda as string), + parseUnits((pool.typeData as FxData).delta as string, 36), + parseFixedCurveParam((pool.typeData as FxData).epsilon as string), poolTokens, ); } diff --git a/modules/sor/sorV2/lib/pools/gyro2/gyro2Pool.ts b/modules/sor/sorV2/lib/pools/gyro2/gyro2Pool.ts index 63e2ddf7f..5be64bbda 100644 --- a/modules/sor/sorV2/lib/pools/gyro2/gyro2Pool.ts +++ b/modules/sor/sorV2/lib/pools/gyro2/gyro2Pool.ts @@ -45,7 +45,7 @@ export class Gyro2Pool implements BasePool { static fromPrismaPool(pool: PrismaPoolWithDynamic): Gyro2Pool { const poolTokens: Gyro2PoolToken[] = []; - if (!pool.dynamicData || !pool.staticTypeData) { + if (!pool.dynamicData || !pool.typeData) { throw new Error('No dynamic data for pool'); } @@ -65,7 +65,7 @@ export class Gyro2Pool implements BasePool { poolTokens.push(new Gyro2PoolToken(token, tokenAmount.amount, poolToken.index)); } - const gyroData = pool.staticTypeData as GyroData; + const gyroData = pool.typeData as GyroData; return new Gyro2Pool( pool.id as Hex, diff --git a/modules/sor/sorV2/lib/pools/gyro3/gyro3Pool.ts b/modules/sor/sorV2/lib/pools/gyro3/gyro3Pool.ts index 6c5fef94c..e5f72380e 100644 --- a/modules/sor/sorV2/lib/pools/gyro3/gyro3Pool.ts +++ b/modules/sor/sorV2/lib/pools/gyro3/gyro3Pool.ts @@ -44,7 +44,7 @@ export class Gyro3Pool implements BasePool { static fromPrismaPool(pool: PrismaPoolWithDynamic): Gyro3Pool { const poolTokens: Gyro3PoolToken[] = []; - if (!pool.dynamicData || !pool.staticTypeData) { + if (!pool.dynamicData || !pool.typeData) { throw new Error('No dynamic data for pool'); } @@ -70,7 +70,7 @@ export class Gyro3Pool implements BasePool { pool.chain, pool.version, parseEther(pool.dynamicData.swapFee), - parseEther((pool.staticTypeData as GyroData).root3Alpha!), + parseEther((pool.typeData as GyroData).root3Alpha!), poolTokens, ); } diff --git a/modules/sor/sorV2/lib/pools/gyroE/gyroEPool.ts b/modules/sor/sorV2/lib/pools/gyroE/gyroEPool.ts index 1a4a812c4..58bf36c0a 100644 --- a/modules/sor/sorV2/lib/pools/gyroE/gyroEPool.ts +++ b/modules/sor/sorV2/lib/pools/gyroE/gyroEPool.ts @@ -50,7 +50,7 @@ export class GyroEPool implements BasePool { static fromPrismaPool(pool: PrismaPoolWithDynamic): GyroEPool { const poolTokens: GyroEPoolToken[] = []; - if (!pool.dynamicData || !pool.staticTypeData) { + if (!pool.dynamicData || !pool.typeData) { throw new Error('No dynamic data for pool'); } @@ -72,7 +72,7 @@ export class GyroEPool implements BasePool { poolTokens.push(new GyroEPoolToken(token, tokenAmount.amount, parseEther(tokenRate), poolToken.index)); } - const gyroData = pool.staticTypeData as GyroData; + const gyroData = pool.typeData as GyroData; const gyroEParams: GyroEParams = { alpha: parseEther(gyroData.alpha), diff --git a/modules/sor/sorV2/lib/pools/metastable/metastablePool.ts b/modules/sor/sorV2/lib/pools/metastable/metastablePool.ts index 44d458ffd..d0479f5ee 100644 --- a/modules/sor/sorV2/lib/pools/metastable/metastablePool.ts +++ b/modules/sor/sorV2/lib/pools/metastable/metastablePool.ts @@ -46,7 +46,7 @@ export class MetaStablePool implements BasePool { ); } - const amp = parseUnits((pool.staticTypeData as StableData).amp, 3); + const amp = parseUnits((pool.typeData as StableData).amp, 3); return new MetaStablePool( pool.id as Hex, diff --git a/modules/sor/sorV2/lib/pools/stable/stablePool.ts b/modules/sor/sorV2/lib/pools/stable/stablePool.ts index 74c3f2678..83dce24a3 100644 --- a/modules/sor/sorV2/lib/pools/stable/stablePool.ts +++ b/modules/sor/sorV2/lib/pools/stable/stablePool.ts @@ -81,7 +81,7 @@ export class StablePool implements BasePool { } const totalShares = parseEther(pool.dynamicData.totalShares); - const amp = parseUnits((pool.staticTypeData as StableData).amp, 3); + const amp = parseUnits((pool.typeData as StableData).amp, 3); return new StablePool( pool.id as Hex, diff --git a/modules/token/lib/token-price-handlers/linear-wrapped-token-price-handler.service.ts b/modules/token/lib/token-price-handlers/linear-wrapped-token-price-handler.service.ts index 66d865b0d..9fafe4df5 100644 --- a/modules/token/lib/token-price-handlers/linear-wrapped-token-price-handler.service.ts +++ b/modules/token/lib/token-price-handlers/linear-wrapped-token-price-handler.service.ts @@ -29,7 +29,7 @@ export class LinearWrappedTokenPriceHandlerService implements TokenPriceHandler where: { chain: networkContext.chain, tokenAddress: { - in: pools.map((pool) => pool.tokens[(pool.staticTypeData as LinearData)?.mainIndex || 0].address), + in: pools.map((pool) => pool.tokens[(pool.typeData as LinearData)?.mainIndex || 0].address), }, timestamp, }, @@ -38,10 +38,10 @@ export class LinearWrappedTokenPriceHandlerService implements TokenPriceHandler for (const token of tokens) { const pool = pools.find( (pool) => - (pool.staticTypeData as LinearData) && - token.address === pool.tokens[(pool.staticTypeData as LinearData).wrappedIndex].address, + (pool.typeData as LinearData) && + token.address === pool.tokens[(pool.typeData as LinearData).wrappedIndex].address, ); - const linearData = pool?.staticTypeData as LinearData; + const linearData = pool?.typeData as LinearData; if (pool && linearData) { const mainToken = pool.tokens[linearData.mainIndex]; diff --git a/prisma/migrations/20240207160000_jsonb_pool_data_column_rename/migration.sql b/prisma/migrations/20240207160000_jsonb_pool_data_column_rename/migration.sql new file mode 100644 index 000000000..8dc04e4d4 --- /dev/null +++ b/prisma/migrations/20240207160000_jsonb_pool_data_column_rename/migration.sql @@ -0,0 +1,2 @@ +-- Remove old tables +ALTER TABLE "PrismaPool" RENAME COLUMN "staticTypeData" TO type_data; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index a61b0e1df..640c36063 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -64,7 +64,7 @@ model PrismaPool { vaultVersion Int @default(2) - staticTypeData Json @default("{}") + typeData Json @default("{}") @map("type_data") tokens PrismaPoolToken[] From 35ad503bb08901f387d44d6ddcdb4e44f375b679 Mon Sep 17 00:00:00 2001 From: gmbronco <83549293+gmbronco@users.noreply.github.com> Date: Thu, 8 Feb 2024 13:30:36 +0100 Subject: [PATCH 8/8] column naming fix --- modules/pool/pool.prisma | 2 +- .../20240207160000_jsonb_pool_data_column_rename/migration.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/pool/pool.prisma b/modules/pool/pool.prisma index 8d5a739bd..b382b3bf8 100644 --- a/modules/pool/pool.prisma +++ b/modules/pool/pool.prisma @@ -17,7 +17,7 @@ model PrismaPool { vaultVersion Int @default(2) - typeData Json @default("{}") @map("type_data") + typeData Json @default("{}") tokens PrismaPoolToken[] diff --git a/prisma/migrations/20240207160000_jsonb_pool_data_column_rename/migration.sql b/prisma/migrations/20240207160000_jsonb_pool_data_column_rename/migration.sql index 8dc04e4d4..59164df2a 100644 --- a/prisma/migrations/20240207160000_jsonb_pool_data_column_rename/migration.sql +++ b/prisma/migrations/20240207160000_jsonb_pool_data_column_rename/migration.sql @@ -1,2 +1,2 @@ -- Remove old tables -ALTER TABLE "PrismaPool" RENAME COLUMN "staticTypeData" TO type_data; +ALTER TABLE "PrismaPool" RENAME COLUMN "staticTypeData" TO "typeData";