Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replacing pool data tables with a json column #110

Merged
merged 8 commits into from
Feb 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions modules/content/github-content.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down Expand Up @@ -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({
Expand Down Expand Up @@ -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({
Expand Down
8 changes: 4 additions & 4 deletions modules/content/sanity-content.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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({
Expand Down Expand Up @@ -216,8 +216,8 @@ export class SanityContentService implements ContentService {
symbol: true,
name: true,
type: true,
typeData: true,
tokens: { orderBy: { index: 'asc' } },
linearData: true,
},
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();

Expand All @@ -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: {
Expand All @@ -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');
Expand Down
2 changes: 1 addition & 1 deletion modules/pool/lib/apr-data-sources/yb-tokens-apr.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand Down
16 changes: 0 additions & 16 deletions modules/pool/lib/pool-creator.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down
131 changes: 36 additions & 95 deletions modules/pool/lib/pool-gql-loader.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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<GqlPoolUnion> {
Expand Down Expand Up @@ -131,9 +131,9 @@ export class PoolGqlLoaderService {
return pools.map((pool) => this.mapPoolToGqlPool(pool)) as GqlPoolLinear[];
}

public async getGyroPools(): Promise<GqlPoolGyro[]> {
public async getGyroPools(chains: Chain[]): Promise<GqlPoolGyro[]> {
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,
});
Expand Down Expand Up @@ -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),
Expand All @@ -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,
};
}
Expand Down Expand Up @@ -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({
Expand Down Expand Up @@ -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)],
Expand All @@ -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
],
);
}

Expand Down Expand Up @@ -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) => {
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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',
};
}
Expand All @@ -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',
Expand All @@ -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);
Expand Down
Loading
Loading