diff --git a/modules/content/github-content.service.ts b/modules/content/github-content.service.ts index 053052a89..51451c3bd 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, + typeData: 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?.typeData 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..cf7da5af8 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?.typeData 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, + typeData: 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..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 @@ -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.typeData as LinearData) || !pool.dynamicData || - pool.tokens[pool.linearData.mainIndex].address !== this.booAddress + pool.tokens[(pool.typeData as LinearData).mainIndex].address !== this.booAddress ) { continue; } - const linearData = pool.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/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-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: { diff --git a/modules/pool/lib/pool-gql-loader.service.ts b/modules/pool/lib/pool-gql-loader.service.ts index 7950c4cae..5d6305758 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, StableData } from '../subgraph-mapper'; export class PoolGqlLoaderService { public async getPool(id: string, chain: Chain, userAddress?: string): Promise { @@ -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, }); @@ -455,10 +455,11 @@ export class PoolGqlLoaderService { userWalletbalances: PrismaUserWalletBalance[] = [], userStakedBalances: PrismaUserStakedBalance[] = [], ): GqlPoolUnion { + const { typeData, ...poolWithoutTypeData } = 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,134 +477,71 @@ export class PoolGqlLoaderService { case 'STABLE': return { __typename: 'GqlPoolStable', + ...poolWithoutTypeData, + ...(typeData as StableData), ...mappedData, - amp: pool.stableDynamicData?.amp || '0', tokens: mappedData.tokens as GqlPoolToken[], }; case 'META_STABLE': return { __typename: 'GqlPoolMetaStable', + ...poolWithoutTypeData, + ...(typeData as StableData), ...mappedData, - amp: pool.stableDynamicData?.amp || '0', tokens: mappedData.tokens as GqlPoolToken[], }; case 'COMPOSABLE_STABLE': return { __typename: 'GqlPoolComposableStable', + ...poolWithoutTypeData, + ...(typeData as StableData), ...mappedData, - amp: pool.stableDynamicData?.amp || '0', bptPriceRate: bpt?.dynamicData?.priceRate || '1.0', }; case 'LINEAR': return { __typename: 'GqlPoolLinear', + ...poolWithoutTypeData, + ...(typeData 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', }; case 'ELEMENT': return { __typename: 'GqlPoolElement', + ...poolWithoutTypeData, + ...(typeData 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', + ...poolWithoutTypeData, ...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', + ...poolWithoutTypeData, + ...(typeData 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', + ...poolWithoutTypeData, ...mappedData, - type: mappedData.type, - alpha: data.alpha || '', - beta: data.beta || '', - delta: data.delta || '', - epsilon: data.epsilon || '', - lambda: data.lambda || '', + ...(typeData as FxData), }; } return { __typename: 'GqlPoolWeighted', + ...poolWithoutTypeData, ...mappedData, }; } @@ -1035,8 +973,8 @@ 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.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({ @@ -1074,10 +1012,12 @@ export class PoolGqlLoaderService { tokenOptions: nestedToken.nestedPool && nestedToken.nestedPool.type === 'LINEAR' && - nestedToken.nestedPool.linearData + (nestedToken.nestedPool.typeData as LinearData).mainIndex !== undefined ? [ this.mapPoolTokenToGql( - nestedToken.nestedPool.tokens[nestedToken.nestedPool.linearData.mainIndex], + nestedToken.nestedPool.tokens[ + (nestedToken.nestedPool.typeData as LinearData).mainIndex + ], ), ] : [this.mapPoolTokenToGql(nestedToken)], @@ -1092,10 +1032,12 @@ export class PoolGqlLoaderService { if ( nestedToken.nestedPool && nestedToken.nestedPool.type === 'LINEAR' && - nestedToken.nestedPool.linearData + (nestedToken.nestedPool.typeData as LinearData).mainIndex !== undefined ) { return this.mapPoolTokenToGql( - nestedToken.nestedPool.tokens[nestedToken.nestedPool.linearData.mainIndex], + nestedToken.nestedPool.tokens[ + (nestedToken.nestedPool.typeData as LinearData).mainIndex + ], ); } @@ -1185,8 +1127,7 @@ export class PoolGqlLoaderService { return { __typename: 'GqlPoolLinearNested', ...pool, - ...pool.linearData!, - ...pool.linearDynamicData!, + ...(pool.typeData as LinearData)!, tokens: pool.tokens .filter((token) => token.address !== pool.address) .map((token) => { @@ -1218,6 +1159,7 @@ export class PoolGqlLoaderService { return { __typename: 'GqlPoolComposableStableNested', ...pool, + ...(pool.typeData as StableData)!, nestingType: this.getPoolNestingType(pool), tokens: pool.tokens.map((token) => { const nestedPool = token.nestedPool; @@ -1252,7 +1194,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', }; } @@ -1278,7 +1219,7 @@ export class PoolGqlLoaderService { wrappedTokenBalance: string; totalMainTokenBalance: string; } { - if (!poolToken.dynamicData || !nestedPool.linearData || !nestedPool.dynamicData) { + if (!poolToken.dynamicData || !(nestedPool.typeData as LinearData) || !nestedPool.dynamicData) { return { mainTokenBalance: '0', wrappedTokenBalance: '0', @@ -1289,8 +1230,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.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 8243749eb..1c23bb203 100644 --- a/modules/pool/lib/pool-on-chain-data.service.ts +++ b/modules/pool/lib/pool-on-chain-data.service.ts @@ -2,13 +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, StableData } from '../subgraph-mapper'; const SUPPORTED_POOL_TYPES: PrismaPoolType[] = [ 'WEIGHTED', @@ -88,10 +89,7 @@ export class PoolOnChainDataService { }, include: { tokens: { orderBy: { index: 'asc' }, include: { dynamicData: true, token: true } }, - stableDynamicData: true, dynamicData: true, - linearDynamicData: true, - linearData: true, }, }); @@ -120,12 +118,16 @@ export class PoolOnChainDataService { } //only update if amp has changed - if (!pool.stableDynamicData || pool.stableDynamicData.amp !== amp) { + if ((pool.typeData 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: { + typeData: { + ...(pool.typeData 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.typeData as LinearData).lowerTarget !== lowerTarget || + (pool.typeData 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: { + typeData: { + ...(pool.typeData as LinearData), + lowerTarget, + upperTarget, + }, }, - update: { upperTarget, lowerTarget, blockNumber }, }), ); } @@ -228,7 +227,10 @@ export class PoolOnChainDataService { } // linear wrapped token rate - if (onchainData.wrappedTokenRate && pool.linearData?.wrappedIndex === poolToken.index) { + if ( + onchainData.wrappedTokenRate && + (pool.typeData 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..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, - beta: pool.beta, - delta: pool.delta, - epsilon: pool.epsilon, - lambda: pool.lambda, + alpha: pool.alpha || '', + beta: pool.beta || '', + delta: pool.delta || '', + epsilon: pool.epsilon || '', + lambda: pool.lambda || '', }; }; 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 4cce260b6..b382b3bf8 100644 --- a/modules/pool/pool.prisma +++ b/modules/pool/pool.prisma @@ -17,16 +17,11 @@ model PrismaPool { vaultVersion Int @default(2) - linearData PrismaPoolLinearData? - elementData PrismaPoolElementData? - gyroData PrismaPoolGyroData? - staticTypeData Json @default("{}") + typeData Json @default("{}") tokens PrismaPoolToken[] dynamicData PrismaPoolDynamicData? - stableDynamicData PrismaPoolStableDynamicData? - linearDynamicData PrismaPoolLinearDynamicData? snapshots PrismaPoolSnapshot[] swaps PrismaPoolSwap[] @@ -62,61 +57,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]) @@ -177,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/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 { diff --git a/modules/pool/subgraph-mapper.test.ts b/modules/pool/subgraph-mapper.test.ts index 0aa8889b0..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.stableDynamicData?.create.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.stableDynamicData?.create.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.linearDynamicData?.create.upperTarget).toBe(linearPool.upperTarget); - expect(result.data.linearData?.create.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.elementData?.create.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.gyroData?.create.alpha).toBe(gyroPool.alpha); - expect(result.data.gyroData?.create.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.poolTypeSpecificData['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 9d09f0692..bc4178781 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, @@ -14,7 +14,7 @@ export const subgraphToPrismaCreate = ( const prismaPoolRecordWithAssociations = { data: { ...dbData.base, - staticTypeData: dbData.staticTypeData, + typeData: dbData.typeData, tokens: { createMany: { data: dbData.tokens, @@ -26,49 +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' - ? { - 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, }, }; @@ -86,7 +43,7 @@ export const subgraphToPrismaUpdate = ( const prismaPoolRecordWithDataAssociations = { ...baseWithoutId, - staticTypeData: dbData.staticTypeData, + typeData: dbData.typeData, tokens: { update: dbData.tokens.map((token) => ({ where: { @@ -100,44 +57,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' - ? { - update: { - ...(dbData.dynamicTypeData as ReturnType), - }, - } - : undefined, - stableDynamicData: ['STABLE', 'COMPOSABLE_STABLE', 'META_STABLE'].includes(dbData.base.type) - ? { - update: { - ...(dbData.dynamicTypeData as ReturnType), - }, - } - : undefined, }; return prismaPoolRecordWithDataAssociations; @@ -175,14 +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) - : {}; - - const dynamicTypeData = Object.keys(dynamicTypeDataMapper).includes(type) - ? dynamicTypeDataMapper[type as keyof typeof dynamicTypeDataMapper](pool, blockNumber) + ? typeDataMapper[type as keyof typeof typeDataMapper](pool) : {}; const tokens = @@ -213,8 +128,7 @@ const subgraphMapper = ( base, dynamicData, tokens, - staticTypeData, - dynamicTypeData, + typeData, }; }; @@ -267,25 +181,20 @@ const mapPoolTypeVersion = (poolType: string, poolTypeVersion: number): number = return version; }; -const staticTypeDataMapper = { +const typeDataMapper = { ELEMENT: element, FX: fx, GYRO: gyro, 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/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 28576e75a..5be64bbda 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.typeData) { 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.typeData 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..e5f72380e 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.typeData) { 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.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 4cc3ce99f..58bf36c0a 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.typeData) { 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.typeData 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/sor/sorV2/lib/pools/metastable/metastablePool.ts b/modules/sor/sorV2/lib/pools/metastable/metastablePool.ts index b8b14d8cc..d0479f5ee 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.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 c99b20d9b..83dce24a3 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.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 adf8ea999..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 @@ -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.typeData 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.typeData as LinearData) && + token.address === pool.tokens[(pool.typeData as LinearData).wrappedIndex].address, ); + const linearData = pool?.typeData 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, ); 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/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/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..59164df2a --- /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 "typeData"; diff --git a/prisma/prisma-types.ts b/prisma/prisma-types.ts index 8fbbd4bf0..390f90532 100644 --- a/prisma/prisma-types.ts +++ b/prisma/prisma-types.ts @@ -14,12 +14,7 @@ export type PrismaPoolTokenWithDynamicData = Prisma.PrismaPoolTokenGetPayload()({ include: { - linearData: true, - elementData: true, dynamicData: true, - stableDynamicData: true, - linearDynamicData: true, - gyroData: true, staking: { include: { farm: { @@ -76,10 +71,7 @@ export const prismaPoolWithExpandedNesting = Prisma.validator()({ include: { - linearData: true, dynamicData: true, - stableDynamicData: true, - linearDynamicData: true, tokens: { orderBy: { index: 'asc' }, include: { @@ -123,9 +110,7 @@ const nestedPoolWithSingleLayerNesting = Prisma.validator dynamicData: true, nestedPool: { include: { - linearData: true, dynamicData: true, - linearDynamicData: true, tokens: { orderBy: { index: 'asc' }, include: { @@ -146,9 +131,7 @@ export type PrismaNestedPoolWithSingleLayerNesting = Prisma.PrismaPoolGetPayload const nestedPoolWithNoNesting = Prisma.validator()({ include: { - linearData: true, dynamicData: true, - linearDynamicData: true, tokens: { orderBy: { index: 'asc' }, include: { @@ -167,10 +150,7 @@ const prismaPoolTokenWithExpandedNesting = Prisma.validator()({ include: { - 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..640c36063 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -64,16 +64,11 @@ model PrismaPool { vaultVersion Int @default(2) - linearData PrismaPoolLinearData? - elementData PrismaPoolElementData? - gyroData PrismaPoolGyroData? - staticTypeData Json @default("{}") + typeData Json @default("{}") @map("type_data") tokens PrismaPoolToken[] dynamicData PrismaPoolDynamicData? - stableDynamicData PrismaPoolStableDynamicData? - linearDynamicData PrismaPoolLinearDynamicData? snapshots PrismaPoolSnapshot[] swaps PrismaPoolSwap[] @@ -109,61 +104,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]) @@ -224,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])