From fc774c598d7aaaea3e2737faca8277c20976e7f7 Mon Sep 17 00:00:00 2001 From: mkflow27 Date: Fri, 26 Sep 2025 14:04:14 +0200 Subject: [PATCH 1/7] refactor: replace wrapped with address --- modules/sor/lib/pathGraph/pathGraph.ts | 28 +++++++++---------- .../composableStable/composableStablePool.ts | 4 +-- modules/sor/lib/poolsV2/fx/fxPool.ts | 4 +-- modules/sor/lib/poolsV2/gyro2/gyro2Pool.ts | 4 +-- modules/sor/lib/poolsV2/gyro3/gyro3Pool.ts | 8 +++--- modules/sor/lib/poolsV2/gyroE/gyroEPool.ts | 4 +-- .../lib/poolsV2/metastable/metastablePool.ts | 4 +-- modules/sor/lib/poolsV2/stable/stablePool.ts | 4 +-- .../sor/lib/poolsV2/weighted/weightedPool.ts | 4 +-- modules/sor/lib/poolsV3/buffer/bufferPool.ts | 4 +-- .../sor/lib/poolsV3/gyro2CLP/gyro2CLPPool.ts | 4 +-- .../sor/lib/poolsV3/gyroECLP/gyroECLPPool.ts | 4 +-- .../liquidityBootstrapping.ts | 4 +-- .../sor/lib/poolsV3/quantAmm/quantAmmPool.ts | 4 +-- .../sor/lib/poolsV3/reClamm/reClammPool.ts | 4 +-- modules/sor/lib/poolsV3/stable/stablePool.ts | 4 +-- .../sor/lib/poolsV3/weighted/weightedPool.ts | 4 +-- 17 files changed, 48 insertions(+), 48 deletions(-) diff --git a/modules/sor/lib/pathGraph/pathGraph.ts b/modules/sor/lib/pathGraph/pathGraph.ts index 22cadf28e..027f7a501 100644 --- a/modules/sor/lib/pathGraph/pathGraph.ts +++ b/modules/sor/lib/pathGraph/pathGraph.ts @@ -88,11 +88,11 @@ export class PathGraph { const minLimitThreshold = (swapAmount.amount * BigInt(Math.floor(config.minSwapAmountRatio * 100))) / 100n; const tokenPaths = this.findAllValidTokenPaths({ - token: tokenIn.wrapped, - tokenIn: tokenIn.wrapped, - tokenOut: tokenOut.wrapped, + token: tokenIn.address, + tokenIn: tokenIn.address, + tokenOut: tokenOut.address, config, - tokenPath: [tokenIn.wrapped], + tokenPath: [tokenIn.address], }).sort((a, b) => (a.length < b.length ? -1 : 1)); const paths: PathGraphEdgeData[][] = []; @@ -186,7 +186,7 @@ export class PathGraph { tokens.push(new Token(pool.tokens[0].token.chainId, pool.address.toLowerCase() as Address, 18)); // Add BPT as token nodes } for (const token of tokens) { - if (!this.nodes.has(token.wrapped)) { + if (!this.nodes.has(token.address)) { this.addNode(token); } } @@ -226,12 +226,12 @@ export class PathGraph { } private addNode(token: Token): void { - this.nodes.set(token.wrapped, { - isPhantomBpt: !!this.poolAddressMap.get(token.wrapped), + this.nodes.set(token.address, { + isPhantomBpt: !!this.poolAddressMap.get(token.address), }); - if (!this.edges.has(token.wrapped)) { - this.edges.set(token.wrapped, new Map()); + if (!this.edges.has(token.address)) { + this.edges.set(token.address, new Map()); } } @@ -259,16 +259,16 @@ export class PathGraph { edgeProps: PathGraphEdgeData; maxPathsPerTokenPair: number; }): void { - const tokenInVertex = this.nodes.get(edgeProps.tokenIn.wrapped); - const tokenOutVertex = this.nodes.get(edgeProps.tokenOut.wrapped); - const tokenInNode = this.edges.get(edgeProps.tokenIn.wrapped); + const tokenInVertex = this.nodes.get(edgeProps.tokenIn.address); + const tokenOutVertex = this.nodes.get(edgeProps.tokenOut.address); + const tokenInNode = this.edges.get(edgeProps.tokenIn.address); if (!tokenInVertex || !tokenOutVertex || !tokenInNode) { throw new Error('Attempting to add invalid edge'); } const hasPhantomBpt = tokenInVertex.isPhantomBpt || tokenOutVertex.isPhantomBpt; - const existingEdges = tokenInNode.get(edgeProps.tokenOut.wrapped) || []; + const existingEdges = tokenInNode.get(edgeProps.tokenOut.address) || []; //TODO: ideally we don't call sort every time, this isn't performant const sorted = [...existingEdges, edgeProps].sort((a, b) => @@ -278,7 +278,7 @@ export class PathGraph { // TODO: double check if the hasPhantomBpt issue is not affecting v3 liquidity more frequently (considering all // pools have their BPT artificially added so we consider them for add/remove liquidity steps) tokenInNode.set( - edgeProps.tokenOut.wrapped, + edgeProps.tokenOut.address, sorted.length > maxPathsPerTokenPair && !hasPhantomBpt ? sorted.slice(0, maxPathsPerTokenPair) : sorted, ); } diff --git a/modules/sor/lib/poolsV2/composableStable/composableStablePool.ts b/modules/sor/lib/poolsV2/composableStable/composableStablePool.ts index 14118e1d5..369c2967e 100644 --- a/modules/sor/lib/poolsV2/composableStable/composableStablePool.ts +++ b/modules/sor/lib/poolsV2/composableStable/composableStablePool.ts @@ -299,8 +299,8 @@ export class ComposableStablePool implements BasePool { } public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate } { - const tIn = this.tokenMap.get(tokenIn.wrapped); - const tOut = this.tokenMap.get(tokenOut.wrapped); + const tIn = this.tokenMap.get(tokenIn.address); + const tOut = this.tokenMap.get(tokenOut.address); if (!tIn || !tOut) { throw new Error('Pool does not contain the tokens provided'); diff --git a/modules/sor/lib/poolsV2/fx/fxPool.ts b/modules/sor/lib/poolsV2/fx/fxPool.ts index d60d5d1d6..44b4c97b9 100644 --- a/modules/sor/lib/poolsV2/fx/fxPool.ts +++ b/modules/sor/lib/poolsV2/fx/fxPool.ts @@ -195,8 +195,8 @@ export class FxPool implements BasePool { } public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: FxPoolToken; tOut: FxPoolToken } { - const tIn = this.tokenMap.get(tokenIn.wrapped); - const tOut = this.tokenMap.get(tokenOut.wrapped); + const tIn = this.tokenMap.get(tokenIn.address); + const tOut = this.tokenMap.get(tokenOut.address); if (!tIn || !tOut) { throw new Error('Token not found'); diff --git a/modules/sor/lib/poolsV2/gyro2/gyro2Pool.ts b/modules/sor/lib/poolsV2/gyro2/gyro2Pool.ts index 9eea74cc7..54cb86f5c 100644 --- a/modules/sor/lib/poolsV2/gyro2/gyro2Pool.ts +++ b/modules/sor/lib/poolsV2/gyro2/gyro2Pool.ts @@ -222,8 +222,8 @@ export class Gyro2Pool implements BasePool { } public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate } { - const tIn = this.tokenMap.get(tokenIn.wrapped); - const tOut = this.tokenMap.get(tokenOut.wrapped); + const tIn = this.tokenMap.get(tokenIn.address); + const tOut = this.tokenMap.get(tokenOut.address); if (!tIn || !tOut) { throw new Error('Pool does not contain the tokens provided'); diff --git a/modules/sor/lib/poolsV2/gyro3/gyro3Pool.ts b/modules/sor/lib/poolsV2/gyro3/gyro3Pool.ts index fd84a4c88..58dffb464 100644 --- a/modules/sor/lib/poolsV2/gyro3/gyro3Pool.ts +++ b/modules/sor/lib/poolsV2/gyro3/gyro3Pool.ts @@ -172,8 +172,8 @@ export class Gyro3Pool implements BasePool { } public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: BasePoolToken; tOut: BasePoolToken } { - const tIn = this.tokenMap.get(tokenIn.wrapped); - const tOut = this.tokenMap.get(tokenOut.wrapped); + const tIn = this.tokenMap.get(tokenIn.address); + const tOut = this.tokenMap.get(tokenOut.address); if (!tIn || !tOut) { throw new Error('Pool does not contain the tokens provided'); @@ -193,8 +193,8 @@ export class Gyro3Pool implements BasePool { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const tertiaryAddress = this.tokens - .map((t) => t.token.wrapped) - .find((a) => a !== tokenIn.wrapped && a !== tokenOut.wrapped); + .map((t) => t.token.address) + .find((a) => a !== tokenIn.address && a !== tokenOut.address); const tertiary = this.tokenMap.get(tertiaryAddress as string); if (!tertiary) { diff --git a/modules/sor/lib/poolsV2/gyroE/gyroEPool.ts b/modules/sor/lib/poolsV2/gyroE/gyroEPool.ts index 9b61b6a87..208ef0be7 100644 --- a/modules/sor/lib/poolsV2/gyroE/gyroEPool.ts +++ b/modules/sor/lib/poolsV2/gyroE/gyroEPool.ts @@ -255,8 +255,8 @@ export class GyroEPool implements BasePool { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate; } { - const tIn = this.tokenMap.get(tokenIn.wrapped); - const tOut = this.tokenMap.get(tokenOut.wrapped); + const tIn = this.tokenMap.get(tokenIn.address); + const tOut = this.tokenMap.get(tokenOut.address); if (!tIn || !tOut) { throw new Error('Pool does not contain the tokens provided'); diff --git a/modules/sor/lib/poolsV2/metastable/metastablePool.ts b/modules/sor/lib/poolsV2/metastable/metastablePool.ts index 029249cc4..ac48966b1 100644 --- a/modules/sor/lib/poolsV2/metastable/metastablePool.ts +++ b/modules/sor/lib/poolsV2/metastable/metastablePool.ts @@ -195,8 +195,8 @@ export class MetaStablePool implements BasePool { } public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate } { - const tIn = this.tokenMap.get(tokenIn.wrapped); - const tOut = this.tokenMap.get(tokenOut.wrapped); + const tIn = this.tokenMap.get(tokenIn.address); + const tOut = this.tokenMap.get(tokenOut.address); if (!tIn || !tOut) { throw new Error('Pool does not contain the tokens provided'); diff --git a/modules/sor/lib/poolsV2/stable/stablePool.ts b/modules/sor/lib/poolsV2/stable/stablePool.ts index 101bc7c06..fd11e9faf 100644 --- a/modules/sor/lib/poolsV2/stable/stablePool.ts +++ b/modules/sor/lib/poolsV2/stable/stablePool.ts @@ -185,8 +185,8 @@ export class StablePool implements BasePool { } public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: BasePoolToken; tOut: BasePoolToken } { - const tIn = this.tokenMap.get(tokenIn.wrapped); - const tOut = this.tokenMap.get(tokenOut.wrapped); + const tIn = this.tokenMap.get(tokenIn.address); + const tOut = this.tokenMap.get(tokenOut.address); if (!tIn || !tOut) { throw new Error('Pool does not contain the tokens provided'); diff --git a/modules/sor/lib/poolsV2/weighted/weightedPool.ts b/modules/sor/lib/poolsV2/weighted/weightedPool.ts index 233d68af3..9424a59f0 100644 --- a/modules/sor/lib/poolsV2/weighted/weightedPool.ts +++ b/modules/sor/lib/poolsV2/weighted/weightedPool.ts @@ -155,8 +155,8 @@ export class WeightedPool implements BasePool { } public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: WeightedPoolToken; tOut: WeightedPoolToken } { - const tIn = this.tokenMap.get(tokenIn.wrapped); - const tOut = this.tokenMap.get(tokenOut.wrapped); + const tIn = this.tokenMap.get(tokenIn.address); + const tOut = this.tokenMap.get(tokenOut.address); if (!tIn || !tOut) { throw new Error('Pool does not contain the tokens provided'); diff --git a/modules/sor/lib/poolsV3/buffer/bufferPool.ts b/modules/sor/lib/poolsV3/buffer/bufferPool.ts index 3e89b477e..aad7e0234 100644 --- a/modules/sor/lib/poolsV3/buffer/bufferPool.ts +++ b/modules/sor/lib/poolsV3/buffer/bufferPool.ts @@ -190,8 +190,8 @@ export class BufferPool implements BasePoolMethodsV3 { // Helper methods public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: BasePoolToken; tOut: BasePoolToken } { - const tIn = this.tokenMap.get(tokenIn.wrapped); - const tOut = this.tokenMap.get(tokenOut.wrapped); + const tIn = this.tokenMap.get(tokenIn.address); + const tOut = this.tokenMap.get(tokenOut.address); if (!tIn || !tOut) { throw new Error('Pool does not contain the tokens provided'); diff --git a/modules/sor/lib/poolsV3/gyro2CLP/gyro2CLPPool.ts b/modules/sor/lib/poolsV3/gyro2CLP/gyro2CLPPool.ts index b03bea693..e1731c768 100644 --- a/modules/sor/lib/poolsV3/gyro2CLP/gyro2CLPPool.ts +++ b/modules/sor/lib/poolsV3/gyro2CLP/gyro2CLPPool.ts @@ -132,8 +132,8 @@ export class Gyro2CLPPool extends BasePoolV3 implements BasePoolMethodsV3 { } public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: GyroPoolToken; tOut: GyroPoolToken } { - const tIn = this.tokenMap.get(tokenIn.wrapped); - const tOut = this.tokenMap.get(tokenOut.wrapped); + const tIn = this.tokenMap.get(tokenIn.address); + const tOut = this.tokenMap.get(tokenOut.address); if (!tIn || !tOut) { throw new Error('Pool does not contain the tokens provided'); diff --git a/modules/sor/lib/poolsV3/gyroECLP/gyroECLPPool.ts b/modules/sor/lib/poolsV3/gyroECLP/gyroECLPPool.ts index 47ad8f83e..399f59b29 100644 --- a/modules/sor/lib/poolsV3/gyroECLP/gyroECLPPool.ts +++ b/modules/sor/lib/poolsV3/gyroECLP/gyroECLPPool.ts @@ -169,8 +169,8 @@ export class GyroECLPPool extends BasePoolV3 implements BasePoolMethodsV3 { } public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: GyroPoolToken; tOut: GyroPoolToken } { - const tIn = this.tokenMap.get(tokenIn.wrapped); - const tOut = this.tokenMap.get(tokenOut.wrapped); + const tIn = this.tokenMap.get(tokenIn.address); + const tOut = this.tokenMap.get(tokenOut.address); if (!tIn || !tOut) { throw new Error('Pool does not contain the tokens provided'); diff --git a/modules/sor/lib/poolsV3/liquidityBootstrapping/liquidityBootstrapping.ts b/modules/sor/lib/poolsV3/liquidityBootstrapping/liquidityBootstrapping.ts index 6f7c45e2f..a9ce2840c 100644 --- a/modules/sor/lib/poolsV3/liquidityBootstrapping/liquidityBootstrapping.ts +++ b/modules/sor/lib/poolsV3/liquidityBootstrapping/liquidityBootstrapping.ts @@ -219,8 +219,8 @@ export class LiquidityBootstrappingPoolV3 extends BasePoolV3 implements BasePool } public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: WeightedPoolToken; tOut: WeightedPoolToken } { - const tIn = this.tokenMap.get(tokenIn.wrapped); - const tOut = this.tokenMap.get(tokenOut.wrapped); + const tIn = this.tokenMap.get(tokenIn.address); + const tOut = this.tokenMap.get(tokenOut.address); if (!tIn || !tOut) { throw new Error('Pool does not contain the tokens provided'); diff --git a/modules/sor/lib/poolsV3/quantAmm/quantAmmPool.ts b/modules/sor/lib/poolsV3/quantAmm/quantAmmPool.ts index 57b0bb022..5edbb999c 100644 --- a/modules/sor/lib/poolsV3/quantAmm/quantAmmPool.ts +++ b/modules/sor/lib/poolsV3/quantAmm/quantAmmPool.ts @@ -158,8 +158,8 @@ export class QuantAmmPool extends BasePoolV3 implements BasePoolMethodsV3 { // Helper methods public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: QuantAmmPoolToken; tOut: QuantAmmPoolToken } { - const tIn = this.tokenMap.get(tokenIn.wrapped); - const tOut = this.tokenMap.get(tokenOut.wrapped); + const tIn = this.tokenMap.get(tokenIn.address); + const tOut = this.tokenMap.get(tokenOut.address); if (!tIn || !tOut) { throw new Error('Pool does not contain the tokens provided'); diff --git a/modules/sor/lib/poolsV3/reClamm/reClammPool.ts b/modules/sor/lib/poolsV3/reClamm/reClammPool.ts index 2a178ea6a..7f23e9cac 100644 --- a/modules/sor/lib/poolsV3/reClamm/reClammPool.ts +++ b/modules/sor/lib/poolsV3/reClamm/reClammPool.ts @@ -149,8 +149,8 @@ export class ReClammPool extends BasePoolV3 implements BasePoolMethodsV3 { } public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: ReClammPoolToken; tOut: ReClammPoolToken } { - const tIn = this.tokenMap.get(tokenIn.wrapped); - const tOut = this.tokenMap.get(tokenOut.wrapped); + const tIn = this.tokenMap.get(tokenIn.address); + const tOut = this.tokenMap.get(tokenOut.address); if (!tIn || !tOut) { throw new Error('Pool does not contain the tokens provided'); diff --git a/modules/sor/lib/poolsV3/stable/stablePool.ts b/modules/sor/lib/poolsV3/stable/stablePool.ts index 858244cd8..a407ec600 100644 --- a/modules/sor/lib/poolsV3/stable/stablePool.ts +++ b/modules/sor/lib/poolsV3/stable/stablePool.ts @@ -124,8 +124,8 @@ export class StablePoolV3 extends BasePoolV3 implements BasePoolMethodsV3 { } public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: StablePoolToken; tOut: StablePoolToken } { - const tIn = this.tokenMap.get(tokenIn.wrapped); - const tOut = this.tokenMap.get(tokenOut.wrapped); + const tIn = this.tokenMap.get(tokenIn.address); + const tOut = this.tokenMap.get(tokenOut.address); if (!tIn || !tOut) { throw new Error('Pool does not contain the tokens provided'); diff --git a/modules/sor/lib/poolsV3/weighted/weightedPool.ts b/modules/sor/lib/poolsV3/weighted/weightedPool.ts index eef3346fd..ceb7bc957 100644 --- a/modules/sor/lib/poolsV3/weighted/weightedPool.ts +++ b/modules/sor/lib/poolsV3/weighted/weightedPool.ts @@ -130,8 +130,8 @@ export class WeightedPoolV3 extends BasePoolV3 implements BasePoolMethodsV3 { // Helper methods public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: WeightedPoolToken; tOut: WeightedPoolToken } { - const tIn = this.tokenMap.get(tokenIn.wrapped); - const tOut = this.tokenMap.get(tokenOut.wrapped); + const tIn = this.tokenMap.get(tokenIn.address); + const tOut = this.tokenMap.get(tokenOut.address); if (!tIn || !tOut) { throw new Error('Pool does not contain the tokens provided'); From b82ad2895fda646aa7cf9f827abb5473e032e7e7 Mon Sep 17 00:00:00 2001 From: mkflow27 Date: Wed, 1 Oct 2025 09:08:53 +0200 Subject: [PATCH 2/7] refactor: type changes --- modules/sor/lib/path.ts | 2 +- modules/sor/lib/poolsV2/basePool.ts | 12 ++++++------ modules/sor/lib/poolsV3/basePoolV3.ts | 16 ++++++++-------- 3 files changed, 15 insertions(+), 15 deletions(-) diff --git a/modules/sor/lib/path.ts b/modules/sor/lib/path.ts index 4c992a30b..2363fe7ce 100644 --- a/modules/sor/lib/path.ts +++ b/modules/sor/lib/path.ts @@ -1,4 +1,4 @@ -import { TokenAmount, SwapKind, Token } from '@balancer/sdk'; +import { TokenAmount, SwapKind, BaseToken, Token } from '@balancer/sdk'; import { BasePool } from './poolsV2/basePool'; import { BufferPool } from './poolsV3/buffer/bufferPool'; diff --git a/modules/sor/lib/poolsV2/basePool.ts b/modules/sor/lib/poolsV2/basePool.ts index 9958e9672..d6eeebf80 100644 --- a/modules/sor/lib/poolsV2/basePool.ts +++ b/modules/sor/lib/poolsV2/basePool.ts @@ -1,4 +1,4 @@ -import { PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; +import { PoolType, SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; import { Hex } from 'viem'; import { BasePoolToken } from '../utils/basePoolToken'; @@ -9,13 +9,13 @@ export interface BasePool { readonly address: string; swapFee: bigint; tokens: BasePoolToken[]; - getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint; - swapGivenIn(tokenIn: Token, tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean): TokenAmount; - swapGivenOut(tokenIn: Token, tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean): TokenAmount; - getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint; + getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint; + swapGivenIn(tokenIn: BaseToken, tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean): TokenAmount; + swapGivenOut(tokenIn: BaseToken, tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean): TokenAmount; + getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint; /** * Validate that pool contains tokenIn and tokenOut provided and returns pool specific token data (e.g. balance, index, weight, rate, etc.) */ - getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: BasePoolToken; tOut: BasePoolToken }; + getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: BasePoolToken; tOut: BasePoolToken }; copy(): BasePool; } diff --git a/modules/sor/lib/poolsV3/basePoolV3.ts b/modules/sor/lib/poolsV3/basePoolV3.ts index 37560295b..8c9f4f29d 100644 --- a/modules/sor/lib/poolsV3/basePoolV3.ts +++ b/modules/sor/lib/poolsV3/basePoolV3.ts @@ -1,6 +1,6 @@ import { Hex } from 'viem'; -import { MAX_UINT256, PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; +import { MAX_UINT256, PoolType, SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; import { AddKind, RemoveKind, Vault, HookState, PoolState } from '@balancer-labs/balancer-maths'; import { Chain } from '@prisma/client'; @@ -55,7 +55,7 @@ export class BasePoolV3 { this.vault = new Vault(); } - public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); // remove liquidity @@ -90,8 +90,8 @@ export class BasePoolV3 { } public swapGivenIn( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -163,8 +163,8 @@ export class BasePoolV3 { } public swapGivenOut( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -235,7 +235,7 @@ export class BasePoolV3 { return TokenAmount.fromRawAmount(tIn.token, calculatedAmount); } - public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { + public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const tokenPair = this.tokenPairs.find( @@ -254,7 +254,7 @@ export class BasePoolV3 { throw new Error('Must be implemented by the subclass'); } - public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: BasePoolToken; tOut: BasePoolToken } { + public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: BasePoolToken; tOut: BasePoolToken } { throw new Error('Must be implemented by the subclass'); } From 4e1c4bad1f5e65dbbd727490d0209856a90a3ba7 Mon Sep 17 00:00:00 2001 From: mkflow27 Date: Wed, 1 Oct 2025 14:12:36 +0200 Subject: [PATCH 3/7] refactor: use more BaseToken --- modules/sor/lib/path.ts | 8 ++++---- modules/sor/lib/poolsV3/buffer/bufferPool.ts | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/modules/sor/lib/path.ts b/modules/sor/lib/path.ts index 2363fe7ce..bd7ac0e7a 100644 --- a/modules/sor/lib/path.ts +++ b/modules/sor/lib/path.ts @@ -4,10 +4,10 @@ import { BufferPool } from './poolsV3/buffer/bufferPool'; export class PathLocal { public readonly pools: BasePool[]; - public readonly tokens: Token[]; + public readonly tokens: BaseToken[]; public readonly isBuffer: boolean[]; - public constructor(tokens: Token[], pools: BasePool[], isBuffer: boolean[]) { + public constructor(tokens: BaseToken[], pools: BasePool[], isBuffer: boolean[]) { if (pools.length === 0 || tokens.length < 2) { throw new Error('Invalid path: must contain at least 1 pool and 2 tokens.'); } @@ -35,7 +35,7 @@ export class PathWithAmount extends PathLocal { public readonly swapStepsGreaterThanBufferLimit: number = 0; public constructor( - tokens: Token[], + tokens: BaseToken[], pools: BasePool[], isBuffer: boolean[], swapAmount: TokenAmount, @@ -46,7 +46,7 @@ export class PathWithAmount extends PathLocal { this.mutateBalances = Boolean(mutateBalances); //call to super ensures this array access is safe - if (tokens[0].isUnderlyingEqual(swapAmount.token)) { + if (tokens[0].isSameAddress(swapAmount.token.address)) { this.swapKind = SwapKind.GivenIn; } else { this.swapKind = SwapKind.GivenOut; diff --git a/modules/sor/lib/poolsV3/buffer/bufferPool.ts b/modules/sor/lib/poolsV3/buffer/bufferPool.ts index aad7e0234..8c31f599a 100644 --- a/modules/sor/lib/poolsV3/buffer/bufferPool.ts +++ b/modules/sor/lib/poolsV3/buffer/bufferPool.ts @@ -1,5 +1,5 @@ import { Address, Hex } from 'viem'; -import { MAX_UINT256, SwapKind, Token, TokenAmount } from '@balancer/sdk'; +import { MAX_UINT256, SwapKind, Token, TokenAmount, BaseToken } from '@balancer/sdk'; import { BufferState, Vault } from '@balancer-labs/balancer-maths'; import { BasePoolMethodsV3 } from '../basePoolMethodsV3'; @@ -189,7 +189,7 @@ export class BufferPool implements BasePoolMethodsV3 { // Helper methods - public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: BasePoolToken; tOut: BasePoolToken } { + public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: BasePoolToken; tOut: BasePoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); @@ -213,7 +213,7 @@ export class BufferPool implements BasePoolMethodsV3 { ); } - public swapGivenInGreaterThanBufferLimit(tokenIn: Token, tokenOut: Token, swapAmount: TokenAmount): boolean { + public swapGivenInGreaterThanBufferLimit(tokenIn: BaseToken, tokenOut: BaseToken, swapAmount: TokenAmount): boolean { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const mainTokenAmount = this.tokens[0]; const underlyingTokenAmount = this.tokens[1]; @@ -227,7 +227,7 @@ export class BufferPool implements BasePoolMethodsV3 { } } - public swapGivenOutGreaterThanBufferLimit(tokenIn: Token, tokenOut: Token, swapAmount: TokenAmount): boolean { + public swapGivenOutGreaterThanBufferLimit(tokenIn: BaseToken, tokenOut: BaseToken, swapAmount: TokenAmount): boolean { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const mainTokenAmount = this.tokens[0]; const underlyingTokenAmount = this.tokens[1]; From 546f00f7cc87daa131d319036354050b07e347e0 Mon Sep 17 00:00:00 2001 From: mkflow27 Date: Thu, 9 Oct 2025 11:08:56 +0200 Subject: [PATCH 4/7] refactor: replace Token with BaseToken --- modules/sor/balancer-sor.integration.test.ts | 30 +++++++++---------- modules/sor/lib/path.ts | 2 +- modules/sor/lib/pathGraph/pathGraph.ts | 14 ++++----- modules/sor/lib/pathGraph/pathGraphTypes.ts | 10 +++---- .../balancer-v2-sor.integration.test.ts | 10 +++---- .../composableStable/composableStablePool.ts | 18 +++++------ modules/sor/lib/poolsV2/fx/fxPool.ts | 20 ++++++------- modules/sor/lib/poolsV2/fx/fxPoolToken.ts | 4 +-- modules/sor/lib/poolsV2/gyro2/gyro2Pool.ts | 22 +++++++------- .../lib/poolsV2/gyro2/test/gyro2Math.test.ts | 18 +++++------ modules/sor/lib/poolsV2/gyro3/gyro3Pool.ts | 22 +++++++------- .../poolsV2/gyroE/gyroE.integration.test.ts | 14 ++++----- modules/sor/lib/poolsV2/gyroE/gyroEPool.ts | 20 ++++++------- .../lib/poolsV2/metastable/metastablePool.ts | 18 +++++------ .../stable/stablePool.integration.test.ts | 6 ++-- modules/sor/lib/poolsV2/stable/stablePool.ts | 18 +++++------ .../poolsV2/weighted/weightedBasePoolToken.ts | 4 +-- .../sor/lib/poolsV2/weighted/weightedPool.ts | 14 ++++----- modules/sor/lib/poolsV3/buffer/bufferPool.ts | 14 ++++----- .../sor/lib/poolsV3/gyro2CLP/gyro2CLPPool.ts | 8 ++--- .../sor/lib/poolsV3/gyroECLP/gyroECLPPool.ts | 8 ++--- .../liquidityBootstrapping.ts | 8 ++--- .../sor/lib/poolsV3/quantAmm/quantAmmPool.ts | 8 ++--- .../sor/lib/poolsV3/reClamm/reClammPool.ts | 8 ++--- .../sor/lib/poolsV3/stable/stablePool.test.ts | 6 ++-- modules/sor/lib/poolsV3/stable/stablePool.ts | 8 ++--- .../sor/lib/poolsV3/weighted/weightedPool.ts | 8 ++--- .../weighted/weightedPoolTokenWithRate.ts | 4 +-- modules/sor/lib/router.ts | 6 ++-- modules/sor/lib/sor.ts | 6 ++-- modules/sor/lib/utils/basePoolToken.ts | 4 +-- modules/sor/lib/utils/helpers.ts | 6 ++-- modules/sor/lib/utils/poolTokenWithRate.ts | 6 ++-- modules/sor/utils/helpers.ts | 8 ++--- test/factories/sor/stable-pool.factory.ts | 4 +-- test/testData/read/mapping.ts | 26 ++++++++-------- test/utils.ts | 10 +++---- 37 files changed, 210 insertions(+), 210 deletions(-) diff --git a/modules/sor/balancer-sor.integration.test.ts b/modules/sor/balancer-sor.integration.test.ts index 09a683918..5db18f8b4 100644 --- a/modules/sor/balancer-sor.integration.test.ts +++ b/modules/sor/balancer-sor.integration.test.ts @@ -1,6 +1,6 @@ // bun vitest balancer-sor.integration.test.ts -import { ExactInQueryOutput, Swap, SwapKind, Token, Address, Path, ExactOutQueryOutput } from '@balancer/sdk'; +import { ExactInQueryOutput, Swap, SwapKind, BaseToken, Address, Path, ExactOutQueryOutput } from '@balancer/sdk'; import { PathWithAmount } from './lib/path'; import { SOR } from './lib/sor'; @@ -90,12 +90,12 @@ describe('Balancer SOR Integration Tests', () => { }); // get SOR paths - const tIn = new Token( + const tIn = new BaseToken( parseFloat(chainToIdMap[stataUSDC.token.chain]), stataUSDC.token.underlyingTokenAddress as Address, // USDC stataUSDC.token.decimals, ); - const tOut = new Token( + const tOut = new BaseToken( parseFloat(chainToIdMap[stataUSDT.token.chain]), stataUSDT.token.underlyingTokenAddress as Address, // DAI stataUSDT.token.decimals, @@ -159,10 +159,10 @@ describe('Balancer SOR Integration Tests', () => { let exitFeeHook: HookData; let directionalFeeHook: HookData; - let weightedBpt: Token; - let stableBpt: Token; - let wethToken: Token; - let aaveFaucetUsdcToken: Token; + let weightedBpt: BaseToken; + let stableBpt: BaseToken; + let wethToken: BaseToken; + let aaveFaucetUsdcToken: BaseToken; beforeAll(async () => { // setup mock pool data - Weighted @@ -275,23 +275,23 @@ describe('Balancer SOR Integration Tests', () => { }, }); - weightedBpt = new Token( + weightedBpt = new BaseToken( parseFloat(chainToIdMap[BAL.token.chain]), prismaWeightedPool.address as Address, 18, ); - wethToken = new Token( + wethToken = new BaseToken( parseFloat(chainToIdMap[WETH.token.chain]), WETH.address as Address, WETH.token.decimals, ); - stableBpt = new Token( + stableBpt = new BaseToken( parseFloat(chainToIdMap[BAL.token.chain]), prismaStablePoolWithExitFee.address as Address, 18, ); - aaveFaucetUsdcToken = new Token( + aaveFaucetUsdcToken = new BaseToken( parseFloat(chainToIdMap[WETH.token.chain]), aaveFaucetUsdc.address as Address, aaveFaucetUsdc.token.decimals, @@ -475,12 +475,12 @@ describe('Balancer SOR Integration Tests', () => { }); test('SOR quote should match swap query with directional fee hook used - GIVEN IN', async () => { // GIVEN IN - const dai = new Token( + const dai = new BaseToken( parseFloat(chainToIdMap[BAL.token.chain]), aaveFaucetDai.address as Address, aaveFaucetDai.token.decimals, ); - const usdc = new Token( + const usdc = new BaseToken( parseFloat(chainToIdMap[WETH.token.chain]), aaveFaucetUsdc.address as Address, aaveFaucetUsdc.token.decimals, @@ -522,12 +522,12 @@ describe('Balancer SOR Integration Tests', () => { }); test('SOR quote should match swap query with directional fee hook used - GIVEN OUT', async () => { // GIVEN OUT - const dai = new Token( + const dai = new BaseToken( parseFloat(chainToIdMap[BAL.token.chain]), aaveFaucetDai.address as Address, aaveFaucetDai.token.decimals, ); - const usdc = new Token( + const usdc = new BaseToken( parseFloat(chainToIdMap[WETH.token.chain]), aaveFaucetUsdc.address as Address, aaveFaucetUsdc.token.decimals, diff --git a/modules/sor/lib/path.ts b/modules/sor/lib/path.ts index bd7ac0e7a..122db8890 100644 --- a/modules/sor/lib/path.ts +++ b/modules/sor/lib/path.ts @@ -1,4 +1,4 @@ -import { TokenAmount, SwapKind, BaseToken, Token } from '@balancer/sdk'; +import { TokenAmount, SwapKind, BaseToken } from '@balancer/sdk'; import { BasePool } from './poolsV2/basePool'; import { BufferPool } from './poolsV3/buffer/bufferPool'; diff --git a/modules/sor/lib/pathGraph/pathGraph.ts b/modules/sor/lib/pathGraph/pathGraph.ts index 027f7a501..d4ddadc36 100644 --- a/modules/sor/lib/pathGraph/pathGraph.ts +++ b/modules/sor/lib/pathGraph/pathGraph.ts @@ -1,4 +1,4 @@ -import { Address, SwapKind, Token, TokenAmount } from '@balancer/sdk'; +import { Address, SwapKind, TokenAmount, BaseToken } from '@balancer/sdk'; import { PathGraphEdgeData, PathGraphTraversalConfig } from './pathGraphTypes'; import { BasePool } from '../poolsV2/basePool'; import { PathLocal } from '../path'; @@ -64,8 +64,8 @@ export class PathGraph { swapKind, graphTraversalConfig, }: { - tokenIn: Token; - tokenOut: Token; + tokenIn: BaseToken; + tokenOut: BaseToken; swapAmount: TokenAmount; swapKind: SwapKind; graphTraversalConfig?: Partial; @@ -117,7 +117,7 @@ export class PathGraph { } return this.sortAndFilterPaths(paths).map((path) => { - const pathTokens: Token[] = [...path.map((segment) => segment.tokenOut)]; + const pathTokens: BaseToken[] = [...path.map((segment) => segment.tokenOut)]; pathTokens.unshift(tokenIn); pathTokens[pathTokens.length - 1] = tokenOut; @@ -183,7 +183,7 @@ export class PathGraph { for (const pool of pools) { const tokens = [...pool.tokens.map((t) => t.token)]; if (enableAddRemoveLiquidityPaths && pool.poolType !== 'Buffer') { - tokens.push(new Token(pool.tokens[0].token.chainId, pool.address.toLowerCase() as Address, 18)); // Add BPT as token nodes + tokens.push(new BaseToken(pool.tokens[0].token.chainId, pool.address.toLowerCase() as Address, 18)); // Add BPT as token nodes } for (const token of tokens) { if (!this.nodes.has(token.address)) { @@ -205,7 +205,7 @@ export class PathGraph { for (const pool of pools) { const tokens = [...pool.tokens.map((t) => t.token)]; if (enableAddRemoveLiquidityPaths && pool.poolType !== 'Buffer') { - tokens.push(new Token(pool.tokens[0].token.chainId, pool.address.toLowerCase() as Address, 18)); // Also consider BPT token pairs + tokens.push(new BaseToken(pool.tokens[0].token.chainId, pool.address.toLowerCase() as Address, 18)); // Also consider BPT token pairs } for (const tokenIn of tokens) { for (const tokenOut of tokens) { @@ -225,7 +225,7 @@ export class PathGraph { } } - private addNode(token: Token): void { + private addNode(token: BaseToken): void { this.nodes.set(token.address, { isPhantomBpt: !!this.poolAddressMap.get(token.address), }); diff --git a/modules/sor/lib/pathGraph/pathGraphTypes.ts b/modules/sor/lib/pathGraph/pathGraphTypes.ts index 6ea6829dc..871850a89 100644 --- a/modules/sor/lib/pathGraph/pathGraphTypes.ts +++ b/modules/sor/lib/pathGraph/pathGraphTypes.ts @@ -1,11 +1,11 @@ -import { Token } from '@balancer/sdk'; +import { BaseToken } from '@balancer/sdk'; import { BasePool } from '../poolsV2/basePool'; export interface PoolTokenPair { id: string; pool: BasePool; - tokenIn: Token; - tokenOut: Token; + tokenIn: BaseToken; + tokenOut: BaseToken; } export type PoolAddressDictionary = { @@ -46,7 +46,7 @@ export interface PathGraphTraversalConfig { export interface PathGraphEdgeData { pool: BasePool; normalizedLiquidity: bigint; - tokenIn: Token; - tokenOut: Token; + tokenIn: BaseToken; + tokenOut: BaseToken; isBuffer: boolean; } diff --git a/modules/sor/lib/poolsV2/balancer-v2-sor.integration.test.ts b/modules/sor/lib/poolsV2/balancer-v2-sor.integration.test.ts index aea41f217..453bcaeac 100644 --- a/modules/sor/lib/poolsV2/balancer-v2-sor.integration.test.ts +++ b/modules/sor/lib/poolsV2/balancer-v2-sor.integration.test.ts @@ -1,6 +1,6 @@ // yarn vitest balancer-v2-sor.integration.test.ts -import { ExactInQueryOutput, Swap, SwapKind, Token, Address } from '@balancer/sdk'; +import { ExactInQueryOutput, Swap, SwapKind, BaseToken, Address } from '@balancer/sdk'; import { PathWithAmount } from '../path'; import { SOR } from '../sor'; @@ -51,8 +51,8 @@ describe('Balancer V2 SOR Integration Tests', () => { describe('Weighted Pool Path - Token with 0 decimals', () => { let prismaWeightedPool: PrismaPoolAndHookWithDynamic; - let tIn: Token; - let tOut: Token; + let tIn: BaseToken; + let tOut: BaseToken; beforeAll(async () => { // setup mock pool data @@ -82,8 +82,8 @@ describe('Balancer V2 SOR Integration Tests', () => { chain: 'GNOSIS', }); - tIn = new Token(parseFloat(chainToIdMap['GNOSIS']), wxDAI.address as Address, wxDAI.token.decimals); - tOut = new Token(parseFloat(chainToIdMap['GNOSIS']), MPS.address as Address, MPS.token.decimals); + tIn = new BaseToken(parseFloat(chainToIdMap['GNOSIS']), wxDAI.address as Address, wxDAI.token.decimals); + tOut = new BaseToken(parseFloat(chainToIdMap['GNOSIS']), MPS.address as Address, MPS.token.decimals); }); test('SOR quote should match swap query - below min', async () => { diff --git a/modules/sor/lib/poolsV2/composableStable/composableStablePool.ts b/modules/sor/lib/poolsV2/composableStable/composableStablePool.ts index 369c2967e..20ab9e398 100644 --- a/modules/sor/lib/poolsV2/composableStable/composableStablePool.ts +++ b/modules/sor/lib/poolsV2/composableStable/composableStablePool.ts @@ -11,7 +11,7 @@ import { _calcTokenOutGivenExactBptIn, _calculateInvariant, } from './stableMath'; -import { PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; +import { PoolType, SwapKind, TokenAmount, BaseToken } from '@balancer/sdk'; import { chainToChainId as chainToIdMap } from '../../../../network/chain-id-to-chain'; import { StableData } from '../../../../pool/subgraph-mapper'; import { TokenPairData } from '../../../../pool/lib/pool-on-chain-tokenpair-data'; @@ -41,7 +41,7 @@ export class ComposableStablePool implements BasePool { for (const poolToken of pool.tokens) { if (!poolToken.priceRate) throw new Error('Stable pool token does not have a price rate'); - const token = new Token( + const token = new BaseToken( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -96,7 +96,7 @@ export class ComposableStablePool implements BasePool { this.tokenPairs = tokenPairs; } - public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { + public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const tokenPair = this.tokenPairs.find( @@ -110,8 +110,8 @@ export class ComposableStablePool implements BasePool { } public swapGivenIn( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -187,8 +187,8 @@ export class ComposableStablePool implements BasePool { } public swapGivenOut( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -273,7 +273,7 @@ export class ComposableStablePool implements BasePool { return amount.divUpFixed(MathSol.complementFixed(this.swapFee)); } - public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); if (swapKind === SwapKind.GivenIn) { @@ -298,7 +298,7 @@ export class ComposableStablePool implements BasePool { return amountsWithoutBpt; } - public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate } { + public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV2/fx/fxPool.ts b/modules/sor/lib/poolsV2/fx/fxPool.ts index 44b4c97b9..b801f71ce 100644 --- a/modules/sor/lib/poolsV2/fx/fxPool.ts +++ b/modules/sor/lib/poolsV2/fx/fxPool.ts @@ -7,7 +7,7 @@ import { Chain } from '@prisma/client'; import { _calcInGivenOut, _calcOutGivenIn } from './fxMath'; import { RAY } from '../../utils/math'; import { FxPoolPairData } from './types'; -import { PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; +import { PoolType, SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; import { chainToChainId as chainToIdMap } from '../../../../network/chain-id-to-chain'; import { TokenPairData } from '../../../../pool/lib/pool-on-chain-tokenpair-data'; import { BasePool } from '../basePool'; @@ -48,7 +48,7 @@ export class FxPool implements BasePool { throw new Error('FX pool token does not have latestFXPrice'); } - const token = new Token( + const token = new BaseToken( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -116,7 +116,7 @@ export class FxPool implements BasePool { this.tokenPairs = tokenPairs; } - public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { + public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const tokenPair = this.tokenPairs.find( @@ -130,8 +130,8 @@ export class FxPool implements BasePool { } public swapGivenIn( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -155,8 +155,8 @@ export class FxPool implements BasePool { } public swapGivenOut( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -183,7 +183,7 @@ export class FxPool implements BasePool { * Fx pool logic has an alpha region where it halts swaps. * maxLimit = [(1 + alpha) * oGLiq * 0.5] - token liquidity */ - public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { const { _oGLiq, tIn, tOut } = this.getPoolPairData(tokenIn, tokenOut, 0n, swapKind); const maxLimit = MathFx.mulDownFixed(this.alpha + RAY, _oGLiq) / 2n; // TODO: double check if RAY is indeed 1e36 or 1e27 - google says it's 1e27 if (swapKind === SwapKind.GivenIn) { @@ -194,7 +194,7 @@ export class FxPool implements BasePool { return FxPoolToken.fromNumeraire(tOut, maxAmount).amount; } - public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: FxPoolToken; tOut: FxPoolToken } { + public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: FxPoolToken; tOut: FxPoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); @@ -205,7 +205,7 @@ export class FxPool implements BasePool { return { tIn, tOut }; } - public getPoolPairData(tokenIn: Token, tokenOut: Token, swapAmount: bigint, swapKind: SwapKind): FxPoolPairData { + public getPoolPairData(tokenIn: BaseToken, tokenOut: BaseToken, swapAmount: bigint, swapKind: SwapKind): FxPoolPairData { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const usdcToken = isUSDC(tokenIn.address) ? tIn : tOut; diff --git a/modules/sor/lib/poolsV2/fx/fxPoolToken.ts b/modules/sor/lib/poolsV2/fx/fxPoolToken.ts index a0ca7384c..dad75bb6f 100644 --- a/modules/sor/lib/poolsV2/fx/fxPoolToken.ts +++ b/modules/sor/lib/poolsV2/fx/fxPoolToken.ts @@ -1,7 +1,7 @@ import { parseUnits } from 'viem'; import { WAD } from '../../utils/math'; import { MathFx } from './helpers'; -import { BigintIsh, Token, TokenAmount } from '@balancer/sdk'; +import { BigintIsh, BaseToken, TokenAmount } from '@balancer/sdk'; import { BasePoolToken } from '../../utils/basePoolToken'; export class FxPoolToken extends BasePoolToken { @@ -11,7 +11,7 @@ export class FxPoolToken extends BasePoolToken { private readonly scalar36 = this.scalar * WAD; public constructor( - token: Token, + token: BaseToken, amount: BigintIsh, index: number, latestFXPrice: string, diff --git a/modules/sor/lib/poolsV2/gyro2/gyro2Pool.ts b/modules/sor/lib/poolsV2/gyro2/gyro2Pool.ts index 54cb86f5c..20d24ee6b 100644 --- a/modules/sor/lib/poolsV2/gyro2/gyro2Pool.ts +++ b/modules/sor/lib/poolsV2/gyro2/gyro2Pool.ts @@ -4,7 +4,7 @@ import { Chain } from '@prisma/client'; import { _calcInGivenOut, _calcOutGivenIn, _calculateInvariant, _findVirtualParams } from './gyro2Math'; import { MathSol, WAD } from '../../utils/math'; import { SWAP_LIMIT_FACTOR } from '../../utils/gyroHelpers/math'; -import { PoolType, SwapKind, Token, TokenAmount, BigintIsh } from '@balancer/sdk'; +import { PoolType, SwapKind, BaseToken, TokenAmount, BigintIsh } from '@balancer/sdk'; import { chainToChainId as chainToIdMap } from '../../../../network/chain-id-to-chain'; import { GyroData } from '../../../../pool/subgraph-mapper'; import { TokenPairData } from '../../../../pool/lib/pool-on-chain-tokenpair-data'; @@ -36,7 +36,7 @@ export class Gyro2Pool implements BasePool { if (!poolToken.balance) { throw new Error('Gyro pool as no dynamic pool token data'); } - const token = new Token( + const token = new BaseToken( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -89,7 +89,7 @@ export class Gyro2Pool implements BasePool { this.tokenPairs = tokenPairs; } - public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { + public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const tokenPair = this.tokenPairs.find( @@ -103,8 +103,8 @@ export class Gyro2Pool implements BasePool { } public swapGivenIn( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -151,8 +151,8 @@ export class Gyro2Pool implements BasePool { } public swapGivenOut( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -197,7 +197,7 @@ export class Gyro2Pool implements BasePool { return inAmount; } - public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { const { tIn, tOut, sqrtAlpha, sqrtBeta } = this.getPoolPairData(tokenIn, tokenOut); if (swapKind === SwapKind.GivenIn) { const invariant = _calculateInvariant([tIn.scale18, tOut.scale18], sqrtAlpha, sqrtBeta); @@ -221,7 +221,7 @@ export class Gyro2Pool implements BasePool { return amount.divUpFixed(MathSol.complementFixed(this.swapFee)); } - public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate } { + public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); @@ -233,8 +233,8 @@ export class Gyro2Pool implements BasePool { } public getPoolPairData( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, ): { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate; diff --git a/modules/sor/lib/poolsV2/gyro2/test/gyro2Math.test.ts b/modules/sor/lib/poolsV2/gyro2/test/gyro2Math.test.ts index 62fe6a38a..4e3dbe7a6 100644 --- a/modules/sor/lib/poolsV2/gyro2/test/gyro2Math.test.ts +++ b/modules/sor/lib/poolsV2/gyro2/test/gyro2Math.test.ts @@ -1,7 +1,7 @@ import { _calculateInvariant, _calcOutGivenIn, _findVirtualParams } from "../gyro2Math"; import { Gyro2Pool, Gyro2PoolToken } from "../gyro2Pool"; -import { Token, TokenAmount } from '@balancer/sdk' +import { BaseToken, TokenAmount } from '@balancer/sdk' import { parseEther } from 'viem'; @@ -24,8 +24,8 @@ describe('gyro2Math', () => { const expectedAmountOut = 879697n; // Create dummy tokens - const tokenIn = new Token(1, '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9', 6, 'TKN1', 'Token 1'); - const tokenOut = new Token(1, '0xb165a74407fe1e519d6bcbdec1ed3202b35a4140', 6, 'TKN2', 'Token 2'); + const tokenIn = new BaseToken(1, '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9', 6, 'TKN1', 'Token 1'); + const tokenOut = new BaseToken(1, '0xb165a74407fe1e519d6bcbdec1ed3202b35a4140', 6, 'TKN2', 'Token 2'); // Create Gyro2PoolTokens (pool balances, index and rate) const gyro2PoolTokenIn = new Gyro2PoolToken(tokenIn, 54239799503n, 0, 1000000000000000000n); @@ -45,7 +45,7 @@ describe('gyro2Math', () => { [{ tokenA: '0xTokenInAddress', tokenB: '0xTokenOutAddress', normalizedLiquidity: '1000000', spotPrice: '1.5' }] ); - const tIn = new Token( + const tIn = new BaseToken( 42161, "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9", 6, @@ -54,7 +54,7 @@ describe('gyro2Math', () => { "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9", ) - const tOut = new Token( + const tOut = new BaseToken( 42161, "0xb165a74407fe1e519d6bcbdec1ed3202b35a4140", 6, @@ -84,8 +84,8 @@ describe('gyro2Math', () => { const expectedAmountOut = 1000003n; // Create dummy tokens - const tokenIn = new Token(1, '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9', 6, 'TKN1', 'Token 1'); - const tokenOut = new Token(1, '0xb165a74407fe1e519d6bcbdec1ed3202b35a4140', 6, 'TKN2', 'Token 2'); + const tokenIn = new BaseToken(1, '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9', 6, 'TKN1', 'Token 1'); + const tokenOut = new BaseToken(1, '0xb165a74407fe1e519d6bcbdec1ed3202b35a4140', 6, 'TKN2', 'Token 2'); // Create Gyro2PoolTokens (pool balances, index and rate) based on sim from block 257426306 const gyro2PoolTokenIn = new Gyro2PoolToken(tokenIn, 54239799503n, 0, 1000000000000000000n); @@ -104,7 +104,7 @@ describe('gyro2Math', () => { [{ tokenA: '0xTokenInAddress', tokenB: '0xTokenOutAddress', normalizedLiquidity: '1000000', spotPrice: '1.5' }] ); - const tIn = new Token( + const tIn = new BaseToken( 42161, "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9", 6, @@ -113,7 +113,7 @@ describe('gyro2Math', () => { "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9", ) - const tOut = new Token( + const tOut = new BaseToken( 42161, "0xb165a74407fe1e519d6bcbdec1ed3202b35a4140", 6, diff --git a/modules/sor/lib/poolsV2/gyro3/gyro3Pool.ts b/modules/sor/lib/poolsV2/gyro3/gyro3Pool.ts index 58dffb464..3e0997c58 100644 --- a/modules/sor/lib/poolsV2/gyro3/gyro3Pool.ts +++ b/modules/sor/lib/poolsV2/gyro3/gyro3Pool.ts @@ -4,7 +4,7 @@ import { Chain } from '@prisma/client'; import { MathSol, WAD } from '../../utils/math'; import { MathGyro, SWAP_LIMIT_FACTOR } from '../../utils/gyroHelpers/math'; import { _calcInGivenOut, _calcOutGivenIn, _calculateInvariant } from './gyro3Math'; -import { PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; +import { PoolType, SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; import { chainToChainId as chainToIdMap } from '../../../../network/chain-id-to-chain'; import { GyroData } from '../../../../pool/subgraph-mapper'; import { TokenPairData } from '../../../../pool/lib/pool-on-chain-tokenpair-data'; @@ -35,7 +35,7 @@ export class Gyro3Pool implements BasePool { if (!poolToken.balance) { throw new Error('Gyro pool as no dynamic pool token data'); } - const token = new Token( + const token = new BaseToken( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -80,7 +80,7 @@ export class Gyro3Pool implements BasePool { this.tokenPairs = tokenPairs; } - public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { + public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const tokenPair = this.tokenPairs.find( @@ -94,8 +94,8 @@ export class Gyro3Pool implements BasePool { } public swapGivenIn( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -124,8 +124,8 @@ export class Gyro3Pool implements BasePool { } public swapGivenOut( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -148,7 +148,7 @@ export class Gyro3Pool implements BasePool { return inAmount; } - public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { const { tIn, tOut, tertiary } = this.getPoolPairData(tokenIn, tokenOut); if (swapKind === SwapKind.GivenIn) { const invariant = _calculateInvariant([tIn.scale18, tOut.scale18, tertiary.scale18], this.root3Alpha); @@ -171,7 +171,7 @@ export class Gyro3Pool implements BasePool { return amount.divUpFixed(MathSol.complementFixed(this.swapFee)); } - public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: BasePoolToken; tOut: BasePoolToken } { + public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: BasePoolToken; tOut: BasePoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); @@ -183,8 +183,8 @@ export class Gyro3Pool implements BasePool { } public getPoolPairData( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, ): { tIn: BasePoolToken; tOut: BasePoolToken; diff --git a/modules/sor/lib/poolsV2/gyroE/gyroE.integration.test.ts b/modules/sor/lib/poolsV2/gyroE/gyroE.integration.test.ts index fba79ce25..151a48b7e 100644 --- a/modules/sor/lib/poolsV2/gyroE/gyroE.integration.test.ts +++ b/modules/sor/lib/poolsV2/gyroE/gyroE.integration.test.ts @@ -1,6 +1,6 @@ // yarn vitest gyroE.integration.test.ts -import { ExactInQueryOutput, Swap, SwapKind, Token, Address, ExactOutQueryOutput, ChainId } from '@balancer/sdk'; +import { ExactInQueryOutput, Swap, SwapKind, BaseToken, Address, ExactOutQueryOutput, ChainId } from '@balancer/sdk'; import { createTestClient, formatUnits, Hex, http, parseUnits, TestClient } from 'viem'; import { gnosis, sonic } from 'viem/chains'; @@ -24,8 +24,8 @@ describe('SOR - GyroE Integration Tests', () => { let client: TestClient; let chainId: number; let prismaPool: PrismaPoolAndHookWithDynamic; - let tIn: Token; - let tOut: Token; + let tIn: BaseToken; + let tOut: BaseToken; beforeEach(async () => { await client.revert({ @@ -85,8 +85,8 @@ describe('SOR - GyroE Integration Tests', () => { }), }); - tIn = new Token(chainId, scUSD.address as Address, scUSD.token.decimals); - tOut = new Token(chainId, scETH.address as Address, scETH.token.decimals); + tIn = new BaseToken(chainId, scUSD.address as Address, scUSD.token.decimals); + tOut = new BaseToken(chainId, scETH.address as Address, scETH.token.decimals); snapshot = await client.snapshot(); }); @@ -225,8 +225,8 @@ describe('SOR - GyroE Integration Tests', () => { }), }); - tIn = new Token(chainId, sDAI.address as Address, sDAI.token.decimals); - tOut = new Token(chainId, bCSPX.address as Address, bCSPX.token.decimals); + tIn = new BaseToken(chainId, sDAI.address as Address, sDAI.token.decimals); + tOut = new BaseToken(chainId, bCSPX.address as Address, bCSPX.token.decimals); snapshot = await client.snapshot(); }); diff --git a/modules/sor/lib/poolsV2/gyroE/gyroEPool.ts b/modules/sor/lib/poolsV2/gyroE/gyroEPool.ts index 208ef0be7..238d921e4 100644 --- a/modules/sor/lib/poolsV2/gyroE/gyroEPool.ts +++ b/modules/sor/lib/poolsV2/gyroE/gyroEPool.ts @@ -1,6 +1,6 @@ import { Address, Hex, parseEther, parseUnits } from 'viem'; import { Chain } from '@prisma/client'; -import { PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; +import { PoolType, SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; import { PrismaPoolAndHookWithDynamic } from '../../../../../prisma/prisma-types'; import { MathSol, WAD } from '../../utils/math'; @@ -40,7 +40,7 @@ export class GyroEPool implements BasePool { throw new Error('Gyro pool as no dynamic pool token data'); } - const token = new Token( + const token = new BaseToken( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -116,7 +116,7 @@ export class GyroEPool implements BasePool { this.tokenPairs = tokenPairs; } - public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { + public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const tokenPair = this.tokenPairs.find( @@ -130,8 +130,8 @@ export class GyroEPool implements BasePool { } public swapGivenIn( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -175,8 +175,8 @@ export class GyroEPool implements BasePool { } public swapGivenOut( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -215,7 +215,7 @@ export class GyroEPool implements BasePool { return inAmount; } - public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); if (swapKind === SwapKind.GivenIn) { const orderedNormalizedBalances = balancesFromTokenInOut(tIn.scale18, tOut.scale18, tIn.index === 0); @@ -249,8 +249,8 @@ export class GyroEPool implements BasePool { } public getPoolTokens( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, ): { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate; diff --git a/modules/sor/lib/poolsV2/metastable/metastablePool.ts b/modules/sor/lib/poolsV2/metastable/metastablePool.ts index ac48966b1..1c7e975f5 100644 --- a/modules/sor/lib/poolsV2/metastable/metastablePool.ts +++ b/modules/sor/lib/poolsV2/metastable/metastablePool.ts @@ -3,7 +3,7 @@ import { Address, Hex, parseEther, parseUnits } from 'viem'; import { PrismaPoolAndHookWithDynamic } from '../../../../../prisma/prisma-types'; import { _calcInGivenOut, _calcOutGivenIn, _calculateInvariant } from '../composableStable/stableMath'; import { MathSol, WAD } from '../../utils/math'; -import { PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; +import { PoolType, SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; import { chainToChainId as chainToIdMap } from '../../../../network/chain-id-to-chain'; import { StableData } from '../../../../pool/subgraph-mapper'; import { TokenPairData } from '../../../../pool/lib/pool-on-chain-tokenpair-data'; @@ -30,7 +30,7 @@ export class MetaStablePool implements BasePool { for (const poolToken of pool.tokens) { if (!poolToken.priceRate) throw new Error('Meta Stable pool token does not have a price rate'); - const token = new Token( + const token = new BaseToken( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -79,7 +79,7 @@ export class MetaStablePool implements BasePool { this.tokenPairs = tokenPairs; } - public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { + public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const tokenPair = this.tokenPairs.find( @@ -93,8 +93,8 @@ export class MetaStablePool implements BasePool { } public swapGivenIn( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -133,8 +133,8 @@ export class MetaStablePool implements BasePool { } public swapGivenOut( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -182,7 +182,7 @@ export class MetaStablePool implements BasePool { return amount.divUpFixed(MathSol.complementFixed(this.swapFee)); } - public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); if (swapKind === SwapKind.GivenIn) { @@ -194,7 +194,7 @@ export class MetaStablePool implements BasePool { return (tOut.amount * WAD) / tOut.rate; } - public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate } { + public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV2/stable/stablePool.integration.test.ts b/modules/sor/lib/poolsV2/stable/stablePool.integration.test.ts index b54eedd82..0f621f49d 100644 --- a/modules/sor/lib/poolsV2/stable/stablePool.integration.test.ts +++ b/modules/sor/lib/poolsV2/stable/stablePool.integration.test.ts @@ -19,7 +19,7 @@ * TODO: improve test data setup by creating a script that fetches all necessary data automatically for a given blockNumber. */ -import { ExactInQueryOutput, Swap, SwapKind, Token, Address, Path } from '@balancer/sdk'; +import { ExactInQueryOutput, Swap, SwapKind, BaseToken, Address, Path } from '@balancer/sdk'; import { createTestClient, Hex, http, TestClient } from 'viem'; import { mainnet } from 'viem/chains'; @@ -86,12 +86,12 @@ describe('Balancer SOR Integration Tests', () => { }); // get SOR paths - const tIn = new Token( + const tIn = new BaseToken( parseFloat(chainToChainId[DOLA.token.chain]), DOLA.address as Address, DOLA.token.decimals, ); - const tOut = new Token( + const tOut = new BaseToken( parseFloat(chainToChainId[USDC.token.chain]), USDC.address as Address, USDC.token.decimals, diff --git a/modules/sor/lib/poolsV2/stable/stablePool.ts b/modules/sor/lib/poolsV2/stable/stablePool.ts index fd11e9faf..9834fe687 100644 --- a/modules/sor/lib/poolsV2/stable/stablePool.ts +++ b/modules/sor/lib/poolsV2/stable/stablePool.ts @@ -3,7 +3,7 @@ import { Address, Hex, parseEther, parseUnits } from 'viem'; import { PrismaPoolAndHookWithDynamic } from '../../../../../prisma/prisma-types'; import { _calcInGivenOut, _calcOutGivenIn, _calculateInvariant } from '../composableStable/stableMath'; import { MathSol } from '../../utils/math'; -import { PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; +import { PoolType, SwapKind, TokenAmount, BaseToken } from '@balancer/sdk'; import { chainToChainId as chainToIdMap } from '../../../../network/chain-id-to-chain'; import { StableData } from '../../../../pool/subgraph-mapper'; import { TokenPairData } from '../../../../pool/lib/pool-on-chain-tokenpair-data'; @@ -28,7 +28,7 @@ export class StablePool implements BasePool { if (!pool.dynamicData) throw new Error('Stable pool has no dynamic data'); for (const poolToken of pool.tokens) { - const token = new Token( + const token = new BaseToken( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -74,7 +74,7 @@ export class StablePool implements BasePool { this.tokenPairs = tokenPairs; } - public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { + public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const tokenPair = this.tokenPairs.find( @@ -88,8 +88,8 @@ export class StablePool implements BasePool { } public swapGivenIn( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -126,8 +126,8 @@ export class StablePool implements BasePool { } public swapGivenOut( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -172,7 +172,7 @@ export class StablePool implements BasePool { return amount.divUpFixed(MathSol.complementFixed(this.swapFee)); } - public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); if (swapKind === SwapKind.GivenIn) { @@ -184,7 +184,7 @@ export class StablePool implements BasePool { return tOut.amount; } - public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: BasePoolToken; tOut: BasePoolToken } { + public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: BasePoolToken; tOut: BasePoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV2/weighted/weightedBasePoolToken.ts b/modules/sor/lib/poolsV2/weighted/weightedBasePoolToken.ts index 565e246f9..8de8fc469 100644 --- a/modules/sor/lib/poolsV2/weighted/weightedBasePoolToken.ts +++ b/modules/sor/lib/poolsV2/weighted/weightedBasePoolToken.ts @@ -1,10 +1,10 @@ -import { BigintIsh, Token } from '@balancer/sdk'; +import { BigintIsh, BaseToken } from '@balancer/sdk'; import { BasePoolToken } from '../../utils/basePoolToken'; export class WeightedBasePoolToken extends BasePoolToken { public readonly weight: bigint; - public constructor(token: Token, amount: BigintIsh, index: number, weight: BigintIsh) { + public constructor(token: BaseToken, amount: BigintIsh, index: number, weight: BigintIsh) { super(token, amount, index); this.weight = BigInt(weight); } diff --git a/modules/sor/lib/poolsV2/weighted/weightedPool.ts b/modules/sor/lib/poolsV2/weighted/weightedPool.ts index 9424a59f0..65a11b9ea 100644 --- a/modules/sor/lib/poolsV2/weighted/weightedPool.ts +++ b/modules/sor/lib/poolsV2/weighted/weightedPool.ts @@ -3,7 +3,7 @@ import { GqlPoolType } from '../../../../../apps/api/gql/generated-schema'; import { Chain } from '@prisma/client'; import { MathSol, WAD } from '../../utils/math'; import { Address, Hex, parseEther } from 'viem'; -import { SwapKind, Token, TokenAmount } from '@balancer/sdk'; +import { SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; import { chainToChainId as chainToIdMap } from '../../../../network/chain-id-to-chain'; import { TokenPairData } from '../../../../pool/lib/pool-on-chain-tokenpair-data'; import { BasePool } from '../basePool'; @@ -35,7 +35,7 @@ export class WeightedPool implements BasePool { throw new Error('Weighted pool token does not have a weight'); } - const token = new Token( + const token = new BaseToken( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -79,7 +79,7 @@ export class WeightedPool implements BasePool { this.tokenPairs = tokenPairs; } - public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { + public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const tokenPair = this.tokenPairs.find( @@ -92,7 +92,7 @@ export class WeightedPool implements BasePool { return 0n; } - public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); if (swapKind === SwapKind.GivenIn) { @@ -101,7 +101,7 @@ export class WeightedPool implements BasePool { return (tOut.amount * this.MAX_OUT_RATIO) / WAD; } - public swapGivenIn(tokenIn: Token, tokenOut: Token, swapAmount: TokenAmount): TokenAmount { + public swapGivenIn(tokenIn: BaseToken, tokenOut: BaseToken, swapAmount: TokenAmount): TokenAmount { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); if (swapAmount.amount > this.getLimitAmountSwap(tokenIn, tokenOut, SwapKind.GivenIn)) { @@ -124,7 +124,7 @@ export class WeightedPool implements BasePool { return tokenOutAmount; } - public swapGivenOut(tokenIn: Token, tokenOut: Token, swapAmount: TokenAmount): TokenAmount { + public swapGivenOut(tokenIn: BaseToken, tokenOut: BaseToken, swapAmount: TokenAmount): TokenAmount { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); if (swapAmount.amount > this.getLimitAmountSwap(tokenIn, tokenOut, SwapKind.GivenOut)) { @@ -154,7 +154,7 @@ export class WeightedPool implements BasePool { return amount.divUpFixed(MathSol.complementFixed(this.swapFee)); } - public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: WeightedPoolToken; tOut: WeightedPoolToken } { + public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: WeightedPoolToken; tOut: WeightedPoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV3/buffer/bufferPool.ts b/modules/sor/lib/poolsV3/buffer/bufferPool.ts index 8c31f599a..03796ed2e 100644 --- a/modules/sor/lib/poolsV3/buffer/bufferPool.ts +++ b/modules/sor/lib/poolsV3/buffer/bufferPool.ts @@ -1,5 +1,5 @@ import { Address, Hex } from 'viem'; -import { MAX_UINT256, SwapKind, Token, TokenAmount, BaseToken } from '@balancer/sdk'; +import { MAX_UINT256, SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; import { BufferState, Vault } from '@balancer-labs/balancer-maths'; import { BasePoolMethodsV3 } from '../basePoolMethodsV3'; @@ -38,12 +38,12 @@ export class BufferPool implements BasePoolMethodsV3 { bufferPoolData.chainId, bufferPoolData.unwrapRate, new BasePoolToken( - new Token(bufferPoolData.chainId, bufferPoolData.mainToken.address, bufferPoolData.mainToken.decimals), + new BaseToken(bufferPoolData.chainId, bufferPoolData.mainToken.address, bufferPoolData.mainToken.decimals), bufferPoolData.mainToken.balance, 0, ), new BasePoolToken( - new Token( + new BaseToken( bufferPoolData.chainId, bufferPoolData.underlyingToken.address, bufferPoolData.underlyingToken.decimals, @@ -79,11 +79,11 @@ export class BufferPool implements BasePoolMethodsV3 { this.poolState = this.getPoolState(); } - public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { + public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { return MAX_UINT256; } - public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const mainTokenAmount = this.tokens[0]; @@ -146,7 +146,7 @@ export class BufferPool implements BasePoolMethodsV3 { } } - public swapGivenIn(tokenIn: Token, tokenOut: Token, swapAmount: TokenAmount): TokenAmount { + public swapGivenIn(tokenIn: BaseToken, tokenOut: BaseToken, swapAmount: TokenAmount): TokenAmount { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const calculatedAmount = this.vault.swap( @@ -162,7 +162,7 @@ export class BufferPool implements BasePoolMethodsV3 { return TokenAmount.fromRawAmount(tOut.token, calculatedAmount); } - public swapGivenOut(tokenIn: Token, tokenOut: Token, swapAmount: TokenAmount): TokenAmount { + public swapGivenOut(tokenIn: BaseToken, tokenOut: BaseToken, swapAmount: TokenAmount): TokenAmount { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); // swap diff --git a/modules/sor/lib/poolsV3/gyro2CLP/gyro2CLPPool.ts b/modules/sor/lib/poolsV3/gyro2CLP/gyro2CLPPool.ts index e1731c768..d7d046ed6 100644 --- a/modules/sor/lib/poolsV3/gyro2CLP/gyro2CLPPool.ts +++ b/modules/sor/lib/poolsV3/gyro2CLP/gyro2CLPPool.ts @@ -1,6 +1,6 @@ import { Address, Hex, parseEther, parseUnits } from 'viem'; -import { PoolType, Token, TokenAmount } from '@balancer/sdk'; +import { PoolType, BaseToken, TokenAmount } from '@balancer/sdk'; import { HookState, Gyro2CLPState } from '@balancer-labs/balancer-maths'; import { Chain } from '@prisma/client'; @@ -32,7 +32,7 @@ export class Gyro2CLPPool extends BasePoolV3 implements BasePoolMethodsV3 { for (const poolToken of pool.tokens) { if (!poolToken.priceRate) throw new Error(`${pool.type} pool token does not have a price rate`); - const token = new Token( + const token = new BaseToken( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -104,7 +104,7 @@ export class Gyro2CLPPool extends BasePoolV3 implements BasePoolMethodsV3 { this.tokenMap = new Map(this.tokens.map((token) => [token.token.address, token])); // add BPT to tokenMap, so we can handle add/remove liquidity operations - const bpt = new Token(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); + const bpt = new BaseToken(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); this.tokenMap.set(bpt.address, new PoolTokenWithRate(bpt, totalShares, -1, WAD)); this.poolState = this.getPoolState(hookState?.hookType); @@ -131,7 +131,7 @@ export class Gyro2CLPPool extends BasePoolV3 implements BasePoolMethodsV3 { return poolState; } - public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: GyroPoolToken; tOut: GyroPoolToken } { + public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: GyroPoolToken; tOut: GyroPoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV3/gyroECLP/gyroECLPPool.ts b/modules/sor/lib/poolsV3/gyroECLP/gyroECLPPool.ts index 399f59b29..3038da76a 100644 --- a/modules/sor/lib/poolsV3/gyroECLP/gyroECLPPool.ts +++ b/modules/sor/lib/poolsV3/gyroECLP/gyroECLPPool.ts @@ -1,6 +1,6 @@ import { Address, Hex, parseEther, parseUnits } from 'viem'; -import { PoolType, Token, TokenAmount } from '@balancer/sdk'; +import { PoolType, BaseToken, TokenAmount } from '@balancer/sdk'; import { HookState, GyroECLPState } from '@balancer-labs/balancer-maths'; import { Chain } from '@prisma/client'; @@ -34,7 +34,7 @@ export class GyroECLPPool extends BasePoolV3 implements BasePoolMethodsV3 { for (const poolToken of pool.tokens) { if (!poolToken.priceRate) throw new Error(`${pool.type} pool token does not have a price rate`); - const token = new Token( + const token = new BaseToken( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -129,7 +129,7 @@ export class GyroECLPPool extends BasePoolV3 implements BasePoolMethodsV3 { this.tokenMap = new Map(this.tokens.map((token) => [token.token.address, token])); // add BPT to tokenMap, so we can handle add/remove liquidity operations - const bpt = new Token(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); + const bpt = new BaseToken(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); this.tokenMap.set(bpt.address, new PoolTokenWithRate(bpt, totalShares, -1, WAD)); this.poolState = this.getPoolState(hookState?.hookType); @@ -168,7 +168,7 @@ export class GyroECLPPool extends BasePoolV3 implements BasePoolMethodsV3 { return poolState; } - public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: GyroPoolToken; tOut: GyroPoolToken } { + public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: GyroPoolToken; tOut: GyroPoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV3/liquidityBootstrapping/liquidityBootstrapping.ts b/modules/sor/lib/poolsV3/liquidityBootstrapping/liquidityBootstrapping.ts index a9ce2840c..96295e9ae 100644 --- a/modules/sor/lib/poolsV3/liquidityBootstrapping/liquidityBootstrapping.ts +++ b/modules/sor/lib/poolsV3/liquidityBootstrapping/liquidityBootstrapping.ts @@ -1,5 +1,5 @@ import { Address, Hex, parseEther, parseUnits } from 'viem'; -import { PoolType, Token, TokenAmount, WAD } from '@balancer/sdk'; +import { PoolType, BaseToken, TokenAmount, WAD } from '@balancer/sdk'; import { HookState } from '@balancer-labs/balancer-maths'; import { BasePoolMethodsV3 } from '../basePoolMethodsV3'; import { WeightedPoolTokenWithRate } from '../weighted/weightedPoolTokenWithRate'; @@ -85,7 +85,7 @@ export class LiquidityBootstrappingPoolV3 extends BasePoolV3 implements BasePool if (!poolToken.weight) { throw new Error('Weighted pool token does not have a weight'); } - const token = new Token( + const token = new BaseToken( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -174,7 +174,7 @@ export class LiquidityBootstrappingPoolV3 extends BasePoolV3 implements BasePool this.tokenMap = new Map(tokens.map((token) => [token.token.address, token])); // add BPT to tokenMap, so we can handle add/remove liquidity operations - const bpt = new Token(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); + const bpt = new BaseToken(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); this.tokenMap.set(bpt.address, new WeightedPoolTokenWithRate(bpt, totalShares, -1, WAD, 0n)); this.projectToken = lbpParams.projectToken; @@ -218,7 +218,7 @@ export class LiquidityBootstrappingPoolV3 extends BasePoolV3 implements BasePool return poolState; } - public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: WeightedPoolToken; tOut: WeightedPoolToken } { + public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: WeightedPoolToken; tOut: WeightedPoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV3/quantAmm/quantAmmPool.ts b/modules/sor/lib/poolsV3/quantAmm/quantAmmPool.ts index 5edbb999c..96c2d8d57 100644 --- a/modules/sor/lib/poolsV3/quantAmm/quantAmmPool.ts +++ b/modules/sor/lib/poolsV3/quantAmm/quantAmmPool.ts @@ -1,5 +1,5 @@ import { Address, Hex, parseEther } from 'viem'; -import { Token, TokenAmount, WAD } from '@balancer/sdk'; +import { BaseToken, TokenAmount, WAD } from '@balancer/sdk'; import { QuantAmmState, HookState } from '@balancer-labs/balancer-maths'; import { Chain } from '@prisma/client'; @@ -37,7 +37,7 @@ export class QuantAmmPool extends BasePoolV3 implements BasePoolMethodsV3 { throw new Error('QuantAmm pool token does not have a weight'); } - const token = new Token( + const token = new BaseToken( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -124,7 +124,7 @@ export class QuantAmmPool extends BasePoolV3 implements BasePoolMethodsV3 { this.tokenMap = new Map(tokens.map((token) => [token.token.address, token])); // add BPT to tokenMap, so we can handle add/remove liquidity operations - const bpt = new Token(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); + const bpt = new BaseToken(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); this.tokenMap.set(bpt.address, new WeightedPoolTokenWithRate(bpt, totalShares, -1, WAD, 0n)); this.poolState = this.getPoolState(hookState?.hookType); @@ -157,7 +157,7 @@ export class QuantAmmPool extends BasePoolV3 implements BasePoolMethodsV3 { // Helper methods - public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: QuantAmmPoolToken; tOut: QuantAmmPoolToken } { + public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: QuantAmmPoolToken; tOut: QuantAmmPoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV3/reClamm/reClammPool.ts b/modules/sor/lib/poolsV3/reClamm/reClammPool.ts index 7f23e9cac..5e24688a6 100644 --- a/modules/sor/lib/poolsV3/reClamm/reClammPool.ts +++ b/modules/sor/lib/poolsV3/reClamm/reClammPool.ts @@ -1,5 +1,5 @@ import { Address, Hex, parseEther, parseUnits } from 'viem'; -import { Token } from '@balancer/sdk'; +import { BaseToken } from '@balancer/sdk'; import { HookState, ReClammState, ReClammV2State } from '@balancer-labs/balancer-maths'; import { Chain } from '@prisma/client'; @@ -34,7 +34,7 @@ export class ReClammPool extends BasePoolV3 implements BasePoolMethodsV3 { for (const poolToken of pool.tokens) { if (!poolToken.priceRate) throw new Error(`${pool.type} pool token does not have a price rate`); - const token = new Token( + const token = new BaseToken( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -114,7 +114,7 @@ export class ReClammPool extends BasePoolV3 implements BasePoolMethodsV3 { this.tokenMap = new Map(this.tokens.map((token) => [token.token.address, token])); // add BPT to tokenMap, so we can handle add/remove liquidity operations - const bpt = new Token(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); + const bpt = new BaseToken(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); this.tokenMap.set(bpt.address, new PoolTokenWithRate(bpt, totalShares, -1, WAD)); this.poolState = this.getPoolState(hookState?.hookType); @@ -148,7 +148,7 @@ export class ReClammPool extends BasePoolV3 implements BasePoolMethodsV3 { return poolState; } - public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: ReClammPoolToken; tOut: ReClammPoolToken } { + public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: ReClammPoolToken; tOut: ReClammPoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV3/stable/stablePool.test.ts b/modules/sor/lib/poolsV3/stable/stablePool.test.ts index 29410045d..f7c19dcad 100644 --- a/modules/sor/lib/poolsV3/stable/stablePool.test.ts +++ b/modules/sor/lib/poolsV3/stable/stablePool.test.ts @@ -6,7 +6,7 @@ import { PrismaPoolAndHookWithDynamic } from '../../../../../prisma/prisma-types import { WAD } from '../../utils/math'; import { StablePoolV3 } from './stablePool'; -import { Token, TokenAmount } from '@balancer/sdk'; +import { BaseToken, TokenAmount } from '@balancer/sdk'; // keep factories imports at the end - moving up will break the test import { @@ -149,9 +149,9 @@ describe('SOR V3 Stable Pool Tests', () => { expect(poolState).toEqual(stablePoolWithHook.getPoolState('StableSurge')); }); test('results differ when hookState is passed', () => { - const poolToken1 = new Token(1, stablePool.tokens[0].token.address, 18, 'pt1', 'poolToken2'); + const poolToken1 = new BaseToken(1, stablePool.tokens[0].token.address, 18, 'pt1', 'poolToken2'); - const poolToken2 = new Token(1, stablePool.tokens[1].token.address, 18, 'pt2', 'poolToken2'); + const poolToken2 = new BaseToken(1, stablePool.tokens[1].token.address, 18, 'pt2', 'poolToken2'); // If given a high enough swap Amount, the pool with hookState should return a lower amount Out // as it charges the surge Fee. diff --git a/modules/sor/lib/poolsV3/stable/stablePool.ts b/modules/sor/lib/poolsV3/stable/stablePool.ts index a407ec600..d0468a855 100644 --- a/modules/sor/lib/poolsV3/stable/stablePool.ts +++ b/modules/sor/lib/poolsV3/stable/stablePool.ts @@ -1,5 +1,5 @@ import { Address, Hex, parseEther, parseUnits } from 'viem'; -import { PoolType, Token } from '@balancer/sdk'; +import { PoolType, BaseToken } from '@balancer/sdk'; import { StableState, HookState } from '@balancer-labs/balancer-maths'; import { Chain } from '@prisma/client'; @@ -33,7 +33,7 @@ export class StablePoolV3 extends BasePoolV3 implements BasePoolMethodsV3 { for (const poolToken of pool.tokens) { if (!poolToken.priceRate) throw new Error(`${pool.type} pool token does not have a price rate`); - const token = new Token( + const token = new BaseToken( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -97,7 +97,7 @@ export class StablePoolV3 extends BasePoolV3 implements BasePoolMethodsV3 { this.tokenMap = new Map(this.tokens.map((token) => [token.token.address, token])); // add BPT to tokenMap, so we can handle add/remove liquidity operations - const bpt = new Token(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); + const bpt = new BaseToken(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); this.tokenMap.set(bpt.address, new PoolTokenWithRate(bpt, totalShares, -1, WAD)); this.poolState = this.getPoolState(hookState?.hookType); @@ -123,7 +123,7 @@ export class StablePoolV3 extends BasePoolV3 implements BasePoolMethodsV3 { return poolState; } - public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: StablePoolToken; tOut: StablePoolToken } { + public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: StablePoolToken; tOut: StablePoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV3/weighted/weightedPool.ts b/modules/sor/lib/poolsV3/weighted/weightedPool.ts index ceb7bc957..d3e8304dc 100644 --- a/modules/sor/lib/poolsV3/weighted/weightedPool.ts +++ b/modules/sor/lib/poolsV3/weighted/weightedPool.ts @@ -1,5 +1,5 @@ import { Address, Hex, parseEther } from 'viem'; -import { PoolType, Token, TokenAmount, WAD } from '@balancer/sdk'; +import { PoolType, BaseToken, TokenAmount, WAD } from '@balancer/sdk'; import { WeightedState, HookState } from '@balancer-labs/balancer-maths'; import { Chain } from '@prisma/client'; @@ -36,7 +36,7 @@ export class WeightedPoolV3 extends BasePoolV3 implements BasePoolMethodsV3 { throw new Error('Weighted pool token does not have a weight'); } - const token = new Token( + const token = new BaseToken( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -101,7 +101,7 @@ export class WeightedPoolV3 extends BasePoolV3 implements BasePoolMethodsV3 { this.tokenMap = new Map(tokens.map((token) => [token.token.address, token])); // add BPT to tokenMap, so we can handle add/remove liquidity operations - const bpt = new Token(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); + const bpt = new BaseToken(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); this.tokenMap.set(bpt.address, new WeightedPoolTokenWithRate(bpt, totalShares, -1, WAD, 0n)); this.poolState = this.getPoolState(hookState?.hookType); @@ -129,7 +129,7 @@ export class WeightedPoolV3 extends BasePoolV3 implements BasePoolMethodsV3 { // Helper methods - public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: WeightedPoolToken; tOut: WeightedPoolToken } { + public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: WeightedPoolToken; tOut: WeightedPoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV3/weighted/weightedPoolTokenWithRate.ts b/modules/sor/lib/poolsV3/weighted/weightedPoolTokenWithRate.ts index d43853ce3..19516727d 100644 --- a/modules/sor/lib/poolsV3/weighted/weightedPoolTokenWithRate.ts +++ b/modules/sor/lib/poolsV3/weighted/weightedPoolTokenWithRate.ts @@ -1,10 +1,10 @@ -import { BigintIsh, Token } from '@balancer/sdk'; +import { BigintIsh, BaseToken } from '@balancer/sdk'; import { PoolTokenWithRate } from '../../utils'; export class WeightedPoolTokenWithRate extends PoolTokenWithRate { public readonly weight: bigint; - public constructor(token: Token, amount: BigintIsh, index: number, rate: bigint, weight: BigintIsh) { + public constructor(token: BaseToken, amount: BigintIsh, index: number, rate: bigint, weight: BigintIsh) { super(token, amount, index, rate); this.weight = BigInt(weight); } diff --git a/modules/sor/lib/router.ts b/modules/sor/lib/router.ts index b285a347f..24e3f74d7 100644 --- a/modules/sor/lib/router.ts +++ b/modules/sor/lib/router.ts @@ -1,4 +1,4 @@ -import { SwapKind, Token, TokenAmount } from '@balancer/sdk'; +import { SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; import { PathGraph } from './pathGraph/pathGraph'; import { PathGraphTraversalConfig } from './pathGraph/pathGraphTypes'; import { max, min } from './utils/math'; @@ -17,8 +17,8 @@ export class Router { } public getCandidatePaths( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, pools: BasePool[], swapAmount: TokenAmount, swapKind: SwapKind, diff --git a/modules/sor/lib/sor.ts b/modules/sor/lib/sor.ts index f266c3627..ada4ffa0e 100644 --- a/modules/sor/lib/sor.ts +++ b/modules/sor/lib/sor.ts @@ -1,4 +1,4 @@ -import { SwapKind, Token } from '@balancer/sdk'; +import { SwapKind, BaseToken } from '@balancer/sdk'; import { Router } from './router'; import { PrismaPoolAndHookWithDynamic } from '../../../prisma/prisma-types'; @@ -30,8 +30,8 @@ import { BufferPoolData } from '../utils/data'; export class SOR { static async getPathsWithPools( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, swapKind: SwapKind, swapAmountEvm: bigint, prismaPools: PrismaPoolAndHookWithDynamic[], diff --git a/modules/sor/lib/utils/basePoolToken.ts b/modules/sor/lib/utils/basePoolToken.ts index a19edb5f1..0c5502817 100644 --- a/modules/sor/lib/utils/basePoolToken.ts +++ b/modules/sor/lib/utils/basePoolToken.ts @@ -1,9 +1,9 @@ -import { BigintIsh, Token, TokenAmount } from '@balancer/sdk'; +import { BigintIsh, BaseToken, TokenAmount } from '@balancer/sdk'; export class BasePoolToken extends TokenAmount { public readonly index: number; - public constructor(token: Token, amount: BigintIsh, index: number) { + public constructor(token: BaseToken, amount: BigintIsh, index: number) { super(token, amount); this.index = index; } diff --git a/modules/sor/lib/utils/helpers.ts b/modules/sor/lib/utils/helpers.ts index 757d91b67..a94394d85 100644 --- a/modules/sor/lib/utils/helpers.ts +++ b/modules/sor/lib/utils/helpers.ts @@ -1,4 +1,4 @@ -import { BigintIsh, SwapKind, Token, TokenAmount } from '@balancer/sdk'; +import { BigintIsh, SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; import { PathWithAmount } from '../path'; import { HookState } from '@balancer-labs/balancer-maths'; @@ -8,8 +8,8 @@ import { parseEther, parseUnits } from 'viem'; import { PrismaPoolAndHookWithDynamic, HookData } from '../../../../prisma/prisma-types'; export function checkInputs( - tokenIn: Token, - tokenOut: Token, + tokenIn: BaseToken, + tokenOut: BaseToken, swapKind: SwapKind, swapAmount: BigintIsh | TokenAmount, ): TokenAmount { diff --git a/modules/sor/lib/utils/poolTokenWithRate.ts b/modules/sor/lib/utils/poolTokenWithRate.ts index b102fe739..5a56821c0 100644 --- a/modules/sor/lib/utils/poolTokenWithRate.ts +++ b/modules/sor/lib/utils/poolTokenWithRate.ts @@ -1,10 +1,10 @@ -import { BigintIsh, DECIMAL_SCALES, MathSol, Token, TokenAmount, WAD } from '@balancer/sdk'; +import { BigintIsh, DECIMAL_SCALES, MathSol, BaseToken, TokenAmount, WAD } from '@balancer/sdk'; import { BasePoolToken } from './basePoolToken'; export class PoolTokenWithRate extends BasePoolToken { public readonly rate: bigint; - public constructor(token: Token, amount: BigintIsh, index: number, rate: BigintIsh) { + public constructor(token: BaseToken, amount: BigintIsh, index: number, rate: BigintIsh) { super(token, amount, index); this.rate = BigInt(rate); this.scale18 = (this.amount * this.scalar * this.rate) / WAD; @@ -27,7 +27,7 @@ export class PoolTokenWithRate extends BasePoolToken { } static fromScale18AmountWithRate( - token: Token, + token: BaseToken, scale18: bigint, rate: bigint, index: number, diff --git a/modules/sor/utils/helpers.ts b/modules/sor/utils/helpers.ts index e4ef51582..20225d174 100644 --- a/modules/sor/utils/helpers.ts +++ b/modules/sor/utils/helpers.ts @@ -4,7 +4,7 @@ import { chainToChainId as chainToIdMap } from '../../network/chain-id-to-chain' import { GqlSorGetSwapPaths } from '../../../apps/api/gql/generated-schema'; import { replaceZeroAddressWithEth } from '../../web3/addresses'; import { Address } from 'viem'; -import { Token, TokenAmount } from '@balancer/sdk'; +import { BaseToken, TokenAmount } from '@balancer/sdk'; import config from '../../../config'; export async function getTokenAmountHuman(tokenAddr: string, humanAmount: string, chain: Chain): Promise { @@ -23,13 +23,13 @@ export async function getTokenAmountRaw(tokenAddr: string, rawAmount: string, ch * @param chain * @returns */ -export const getToken = async (tokenAddr: string, chain: Chain): Promise => { +export const getToken = async (tokenAddr: string, chain: Chain): Promise => { if (tokenAddr === config[chain].eth.address) { - return new Token(parseInt(chainToIdMap[chain]), config[chain].weth.address as Address, 18); + return new BaseToken(parseInt(chainToIdMap[chain]), config[chain].weth.address as Address, 18); } else { const decimals = await tokenService.getTokenDecimals(tokenAddr, chain); if (!decimals) throw Error(`Missing token from tokenService ${tokenAddr}`); - return new Token(parseInt(chainToIdMap[chain]), tokenAddr as Address, decimals); + return new BaseToken(parseInt(chainToIdMap[chain]), tokenAddr as Address, decimals); } }; diff --git a/test/factories/sor/stable-pool.factory.ts b/test/factories/sor/stable-pool.factory.ts index 9a5bb3e14..3b3bcb704 100644 --- a/test/factories/sor/stable-pool.factory.ts +++ b/test/factories/sor/stable-pool.factory.ts @@ -1,7 +1,7 @@ // stablePoolFactory.ts import { Factory } from 'fishery'; import { faker } from '@faker-js/faker'; -import { Token, TokenAmount } from '@balancer/sdk'; +import { BaseToken, TokenAmount } from '@balancer/sdk'; import { Chain } from '@prisma/client'; import { parseEther, parseUnits, Address } from 'viem'; import { TokenPairData } from '../../../modules/sources/contracts/v3/fetch-tokenpair-data'; @@ -30,7 +30,7 @@ export const StablePoolFactory = Factory.define(({ params }) => { const tokens = params.tokens || Array.from({ length: 3 }, (_, index) => { - const token = new Token( + const token = new BaseToken( parseFloat(faker.number.int({ min: 1, max: 1000 }).toString()), faker.finance.ethereumAddress() as Address, 18, diff --git a/test/testData/read/mapping.ts b/test/testData/read/mapping.ts index fe51f70ab..afec5a321 100644 --- a/test/testData/read/mapping.ts +++ b/test/testData/read/mapping.ts @@ -1,5 +1,5 @@ import { Address, formatEther, formatUnits } from 'viem'; -import { isSameAddress, Token } from '@balancer/sdk'; +import { isSameAddress, BaseToken } from '@balancer/sdk'; import { PoolTokenWithRate } from '../../../modules/sor/lib/utils'; import { PrismaPoolAndHookWithDynamic } from '../../../prisma/prisma-types'; @@ -28,10 +28,10 @@ export function mapGyroPoolStateToPrismaPool( ); const poolTokens = poolState.tokens.map( - (token: string, i: number) => new Token(chainId, token as Address, decimals[i]), + (token: string, i: number) => new BaseToken(chainId, token as Address, decimals[i]), ); - const tokenAmounts = poolTokens.map((token: Token, i: number) => + const tokenAmounts = poolTokens.map((token: BaseToken, i: number) => PoolTokenWithRate.fromScale18AmountWithRate( token, poolState.balancesLiveScaled18[i], @@ -118,10 +118,10 @@ export function mapStablePoolStateToPrismaPool( ); const poolTokens = poolState.tokens.map( - (token: string, i: number) => new Token(chainId, token as Address, decimals[i]), + (token: string, i: number) => new BaseToken(chainId, token as Address, decimals[i]), ); - const tokenAmounts = poolTokens.map((token: Token, i: number) => + const tokenAmounts = poolTokens.map((token: BaseToken, i: number) => PoolTokenWithRate.fromScale18AmountWithRate( token, poolState.balancesLiveScaled18[i], @@ -189,10 +189,10 @@ export function mapWeightedPoolStateToPrismaPool( ); const poolTokens = poolState.tokens.map( - (token: string, i: number) => new Token(chainId, token as Address, decimals[i]), + (token: string, i: number) => new BaseToken(chainId, token as Address, decimals[i]), ); - const tokenAmounts = poolTokens.map((token: Token, i: number) => + const tokenAmounts = poolTokens.map((token: BaseToken, i: number) => PoolTokenWithRate.fromScale18AmountWithRate( token, poolState.balancesLiveScaled18[i], @@ -261,10 +261,10 @@ export function mapLiquidityBootstrappingPoolStateToPrismaPool( ); const poolTokens = poolState.tokens.map( - (token: string, i: number) => new Token(chainId, token as Address, decimals[i]), + (token: string, i: number) => new BaseToken(chainId, token as Address, decimals[i]), ); - const tokenAmounts = poolTokens.map((token: Token, i: number) => + const tokenAmounts = poolTokens.map((token: BaseToken, i: number) => PoolTokenWithRate.fromScale18AmountWithRate( token, poolState.balancesLiveScaled18[i], @@ -342,10 +342,10 @@ export function mapReClammPoolStateToPrismaPool( ); const poolTokens = poolState.tokens.map( - (token: string, i: number) => new Token(chainId, token as Address, decimals[i]), + (token: string, i: number) => new BaseToken(chainId, token as Address, decimals[i]), ); - const tokenAmounts = poolTokens.map((token: Token, i: number) => + const tokenAmounts = poolTokens.map((token: BaseToken, i: number) => PoolTokenWithRate.fromScale18AmountWithRate( token, poolState.balancesLiveScaled18[i], @@ -427,10 +427,10 @@ export function mapQuantAmmPoolStateToPrismaPool( ); const poolTokens = poolState.tokens.map( - (token: string, i: number) => new Token(chainId, token as Address, decimals[i]), + (token: string, i: number) => new BaseToken(chainId, token as Address, decimals[i]), ); - const tokenAmounts = poolTokens.map((token: Token, i: number) => + const tokenAmounts = poolTokens.map((token: BaseToken, i: number) => PoolTokenWithRate.fromScale18AmountWithRate( token, poolState.balancesLiveScaled18[i], diff --git a/test/utils.ts b/test/utils.ts index 30d7b7bf6..fbe23eb71 100644 --- a/test/utils.ts +++ b/test/utils.ts @@ -1,7 +1,7 @@ import { randomBytes } from 'crypto'; import { providers } from 'ethers'; import { mainnetNetworkConfig } from '../modules/network/mainnet'; -import { Token } from '@balancer/sdk'; +import { BaseToken } from '@balancer/sdk'; import { PrismaPoolAndHookWithDynamic } from '../prisma/prisma-types'; import { isSameAddress } from '@balancer/sdk'; import { Address } from 'viem'; @@ -60,8 +60,8 @@ export function getTokensFromPrismaPools( tokens: string[], bufferPools: BufferPoolData[], ): { - tokenIn: Token; - tokenOut: Token; + tokenIn: BaseToken; + tokenOut: BaseToken; } { const prismaTokens = supportedPools.flatMap((p) => p.tokens.map((t) => ({ address: t.token.address as Address, decimals: t.token.decimals })), @@ -75,7 +75,7 @@ export function getTokensFromPrismaPools( const prismaTokenIn = prismaTokens.find((p) => isSameAddress(p.address, tokens[0] as Address))!; const prismaTokenOut = prismaTokens.find((p) => isSameAddress(p.address, tokens[tokens.length - 1] as Address))!; - const tokenIn = new Token(chainId, prismaTokenIn.address, prismaTokenIn.decimals); - const tokenOut = new Token(chainId, prismaTokenOut.address, prismaTokenOut.decimals); + const tokenIn = new BaseToken(chainId, prismaTokenIn.address, prismaTokenIn.decimals); + const tokenOut = new BaseToken(chainId, prismaTokenOut.address, prismaTokenOut.decimals); return { tokenIn, tokenOut }; } From 31e9223df8465ba62b4ac1bce74235a349c2c9c6 Mon Sep 17 00:00:00 2001 From: mkflow27 Date: Thu, 9 Oct 2025 11:40:11 +0200 Subject: [PATCH 5/7] refactor: more BaseToken usage --- .../lib/pathGraph/performance/benchmark.ts | 6 ++-- .../sor/lib/pathGraph/performance/helpers.ts | 36 +++++++++---------- .../lib/pathGraph/performance/tune-params.ts | 4 +-- modules/sor/lib/router.ts | 2 +- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/modules/sor/lib/pathGraph/performance/benchmark.ts b/modules/sor/lib/pathGraph/performance/benchmark.ts index 6951d012b..c6d1fe1cd 100644 --- a/modules/sor/lib/pathGraph/performance/benchmark.ts +++ b/modules/sor/lib/pathGraph/performance/benchmark.ts @@ -16,7 +16,7 @@ import { PathGraph } from '../pathGraph'; import { BasePool } from '../../poolsV2/basePool'; -import { Token, TokenAmount, SwapKind } from '@balancer/sdk'; +import { BaseToken, TokenAmount, SwapKind } from '@balancer/sdk'; import { topologies } from './helpers'; // Performance benchmark configuration @@ -89,7 +89,7 @@ function percentile(arr: number[], p: number): number { async function benchmarkImplementation( ImplementationClass: typeof PathGraph, implementationName: string, - tokens: Token[], + tokens: BaseToken[], pools: BasePool[], topology: string, graphSize: string, @@ -118,7 +118,7 @@ async function benchmarkImplementation( const memoryUsageKB = (memAfter.heapUsed - memBefore.heapUsed) / 1024; // Generate diverse token pairs - const tokenPairs: { tokenIn: Token; tokenOut: Token }[] = []; + const tokenPairs: { tokenIn: BaseToken; tokenOut: BaseToken }[] = []; // Add some random pairs for (let i = 0; i < BENCHMARK_CONFIG.tokenPairTests; i++) { diff --git a/modules/sor/lib/pathGraph/performance/helpers.ts b/modules/sor/lib/pathGraph/performance/helpers.ts index b0243ac5b..9b7761499 100644 --- a/modules/sor/lib/pathGraph/performance/helpers.ts +++ b/modules/sor/lib/pathGraph/performance/helpers.ts @@ -1,10 +1,10 @@ import { BasePool } from '../../poolsV2/basePool'; -import { Token, TokenAmount } from '@balancer/sdk'; +import { BaseToken, TokenAmount } from '@balancer/sdk'; export interface GraphTopology { name: 'hub-spoke' | 'dense-mesh' | 'chain-bridges' | 'realistic-defi'; description: string; - generator: (tokenCount: number, poolCount: number) => { tokens: Token[]; pools: BasePool[] }; + generator: (tokenCount: number, poolCount: number) => { tokens: BaseToken[]; pools: BasePool[] }; } export interface GraphSpec { @@ -19,16 +19,16 @@ export const topologies: Record = { name: 'hub-spoke', description: 'Central hub with radiating spokes', generator: (tokenCount: number, poolCount: number) => { - const tokens: Token[] = []; + const tokens: BaseToken[] = []; const pools: BasePool[] = []; // Hub token (WETH-like) - const hubToken = new Token(1, '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', 18); + const hubToken = new BaseToken(1, '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', 18); tokens.push(hubToken); // Spoke tokens for (let i = 0; i < tokenCount - 1; i++) { - tokens.push(new Token(1, `0x${(0x1000 + i).toString(16).padStart(40, '0')}`, 18)); + tokens.push(new BaseToken(1, `0x${(0x1000 + i).toString(16).padStart(40, '0')}`, 18)); } let poolsCreated = 0; @@ -66,11 +66,11 @@ export const topologies: Record = { name: 'dense-mesh', description: 'High connectivity mesh network', generator: (tokenCount: number, poolCount: number) => { - const tokens: Token[] = []; + const tokens: BaseToken[] = []; const pools: BasePool[] = []; for (let i = 0; i < tokenCount; i++) { - tokens.push(new Token(1, `0x${(0x2000 + i).toString(16).padStart(40, '0')}`, 18)); + tokens.push(new BaseToken(1, `0x${(0x2000 + i).toString(16).padStart(40, '0')}`, 18)); } const maxPossiblePools = (tokenCount * (tokenCount - 1)) / 2; @@ -103,11 +103,11 @@ export const topologies: Record = { name: 'chain-bridges', description: 'Token chains with bridge connections', generator: (tokenCount: number, poolCount: number) => { - const tokens: Token[] = []; + const tokens: BaseToken[] = []; const pools: BasePool[] = []; for (let i = 0; i < tokenCount; i++) { - tokens.push(new Token(1, `0x${(0x3000 + i).toString(16).padStart(40, '0')}`, 18)); + tokens.push(new BaseToken(1, `0x${(0x3000 + i).toString(16).padStart(40, '0')}`, 18)); } let poolsCreated = 0; @@ -145,23 +145,23 @@ export const topologies: Record = { name: 'realistic-defi', description: 'Simulates realistic DeFi token distribution', generator: (tokenCount: number, poolCount: number) => { - const tokens: Token[] = []; + const tokens: BaseToken[] = []; const pools: BasePool[] = []; // Major tokens (ETH, USDC, USDT, DAI, WBTC equivalent) const majorTokens = [ - new Token(1, '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', 18), // WETH - new Token(1, '0xA0b86a33E6441942b3B9F1c882e6F2A5A86E1B5F', 6), // USDC-like - new Token(1, '0xdAC17F958D2ee523a2206206994597C13D831ec7', 6), // USDT-like - new Token(1, '0x6B175474E89094C44Da98b954EedeAC495271d0F', 18), // DAI-like - new Token(1, '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599', 8), // WBTC-like + new BaseToken(1, '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', 18), // WETH + new BaseToken(1, '0xA0b86a33E6441942b3B9F1c882e6F2A5A86E1B5F', 6), // USDC-like + new BaseToken(1, '0xdAC17F958D2ee523a2206206994597C13D831ec7', 6), // USDT-like + new BaseToken(1, '0x6B175474E89094C44Da98b954EedeAC495271d0F', 18), // DAI-like + new BaseToken(1, '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599', 8), // WBTC-like ]; tokens.push(...majorTokens.slice(0, Math.min(5, tokenCount))); // Add remaining tokens as smaller altcoins for (let i = majorTokens.length; i < tokenCount; i++) { - tokens.push(new Token(1, `0x${(0x4000 + i).toString(16).padStart(40, '0')}`, 18)); + tokens.push(new BaseToken(1, `0x${(0x4000 + i).toString(16).padStart(40, '0')}`, 18)); } let poolsCreated = 0; @@ -212,7 +212,7 @@ export const topologies: Record = { }, }; -function createMockPool(id: string, tokens: Token[], opts: Partial = {}): BasePool { +function createMockPool(id: string, tokens: BaseToken[], opts: Partial = {}): BasePool { return { id, address: id.startsWith('0x') ? id : `0x${id.padEnd(40, '0')}`, @@ -220,7 +220,7 @@ function createMockPool(id: string, tokens: Token[], opts: Partial = { tokens: tokens.map((t) => ({ token: t })), getNormalizedLiquidity: opts.getNormalizedLiquidity ?? (() => 100n), getLimitAmountSwap: opts.getLimitAmountSwap ?? (() => 1_000_000n), - swapGivenOut: opts.swapGivenOut ?? ((_in: Token, _out: Token, amt: TokenAmount) => amt), + swapGivenOut: opts.swapGivenOut ?? ((_in: BaseToken, _out: BaseToken, amt: TokenAmount) => amt), ...opts, } as unknown as BasePool; } diff --git a/modules/sor/lib/pathGraph/performance/tune-params.ts b/modules/sor/lib/pathGraph/performance/tune-params.ts index fc3fdbbf7..0047c04b7 100755 --- a/modules/sor/lib/pathGraph/performance/tune-params.ts +++ b/modules/sor/lib/pathGraph/performance/tune-params.ts @@ -14,7 +14,7 @@ import { PathGraph } from '../pathGraph'; import { BasePool } from '../../poolsV2/basePool'; -import { Token, TokenAmount, SwapKind } from '@balancer/sdk'; +import { BaseToken, TokenAmount, SwapKind } from '@balancer/sdk'; import { topologies, GraphSpec } from './helpers'; interface ParamSet { @@ -50,7 +50,7 @@ const GRAPHS: GraphSpec[] = [ { name: 'med-mesh', tokens: 100, pools: 300, type: 'dense-mesh' }, ]; -async function testParams(graph: { tokens: Token[]; pools: BasePool[] }, params: ParamSet): Promise { +async function testParams(graph: { tokens: BaseToken[]; pools: BasePool[] }, params: ParamSet): Promise { const pathGraph = new PathGraph(); pathGraph.buildGraph({ pools: graph.pools, diff --git a/modules/sor/lib/router.ts b/modules/sor/lib/router.ts index 69f6b47ff..96cbc6dd9 100644 --- a/modules/sor/lib/router.ts +++ b/modules/sor/lib/router.ts @@ -29,7 +29,7 @@ export class Router { const minSwapAmountRatio = graphTraversalConfig?.minSwapAmountRatio ?? 0.5; // Compute USD threshold if prices provided const priceToken = swapKind === SwapKind.GivenIn ? tokenIn : tokenOut; - const price = tokenPrices.get(priceToken.wrapped.toLowerCase()); + const price = tokenPrices.get(priceToken.address.toLowerCase()); const amount = Number(formatUnits(swapAmount.amount, priceToken.decimals)); const minLimitThresholdUSD = amount * minSwapAmountRatio * (price ?? 0); From 19c45c1153ae42aa21e1b449eb69df862aeab43b Mon Sep 17 00:00:00 2001 From: mkflow27 Date: Tue, 14 Oct 2025 16:36:49 +0200 Subject: [PATCH 6/7] SOR - Evaluate if Token still needs to differentiate address/wrapped Fixes #830 --- modules/sor/balancer-sor.integration.test.ts | 30 ++++++++-------- modules/sor/lib/path.ts | 8 ++--- modules/sor/lib/pathGraph/pathGraph.ts | 18 +++++----- modules/sor/lib/pathGraph/pathGraphTypes.ts | 10 +++--- .../lib/pathGraph/performance/benchmark.ts | 6 ++-- .../sor/lib/pathGraph/performance/helpers.ts | 36 +++++++++---------- .../lib/pathGraph/performance/tune-params.ts | 4 +-- .../balancer-v2-sor.integration.test.ts | 10 +++--- modules/sor/lib/poolsV2/basePool.ts | 12 +++---- .../composableStable/composableStablePool.ts | 18 +++++----- modules/sor/lib/poolsV2/fx/fxPool.ts | 20 +++++------ modules/sor/lib/poolsV2/fx/fxPoolToken.ts | 4 +-- modules/sor/lib/poolsV2/gyro2/gyro2Pool.ts | 22 ++++++------ .../lib/poolsV2/gyro2/test/gyro2Math.test.ts | 26 +++++++------- modules/sor/lib/poolsV2/gyro3/gyro3Pool.ts | 22 ++++++------ .../poolsV2/gyroE/gyroE.integration.test.ts | 14 ++++---- modules/sor/lib/poolsV2/gyroE/gyroEPool.ts | 20 +++++------ .../lib/poolsV2/metastable/metastablePool.ts | 18 +++++----- .../stable/stablePool.integration.test.ts | 6 ++-- modules/sor/lib/poolsV2/stable/stablePool.ts | 18 +++++----- .../poolsV2/weighted/weightedBasePoolToken.ts | 4 +-- .../sor/lib/poolsV2/weighted/weightedPool.ts | 14 ++++---- modules/sor/lib/poolsV3/basePoolV3.ts | 16 ++++----- modules/sor/lib/poolsV3/buffer/bufferPool.ts | 20 +++++------ .../sor/lib/poolsV3/gyro2CLP/gyro2CLPPool.ts | 8 ++--- .../sor/lib/poolsV3/gyroECLP/gyroECLPPool.ts | 8 ++--- .../liquidityBootstrapping.ts | 8 ++--- .../sor/lib/poolsV3/quantAmm/quantAmmPool.ts | 8 ++--- .../sor/lib/poolsV3/reClamm/reClammPool.ts | 8 ++--- .../sor/lib/poolsV3/stable/stablePool.test.ts | 6 ++-- modules/sor/lib/poolsV3/stable/stablePool.ts | 8 ++--- .../sor/lib/poolsV3/weighted/weightedPool.ts | 8 ++--- .../weighted/weightedPoolTokenWithRate.ts | 4 +-- modules/sor/lib/router.ts | 6 ++-- modules/sor/lib/sor.ts | 6 ++-- modules/sor/lib/utils/basePoolToken.ts | 4 +-- modules/sor/lib/utils/helpers.ts | 6 ++-- modules/sor/lib/utils/poolTokenWithRate.ts | 6 ++-- modules/sor/utils/helpers.ts | 8 ++--- test/factories/sor/stable-pool.factory.ts | 4 +-- test/testData/read/mapping.ts | 26 +++++++------- test/utils.ts | 10 +++--- 42 files changed, 259 insertions(+), 259 deletions(-) diff --git a/modules/sor/balancer-sor.integration.test.ts b/modules/sor/balancer-sor.integration.test.ts index 5db18f8b4..09a683918 100644 --- a/modules/sor/balancer-sor.integration.test.ts +++ b/modules/sor/balancer-sor.integration.test.ts @@ -1,6 +1,6 @@ // bun vitest balancer-sor.integration.test.ts -import { ExactInQueryOutput, Swap, SwapKind, BaseToken, Address, Path, ExactOutQueryOutput } from '@balancer/sdk'; +import { ExactInQueryOutput, Swap, SwapKind, Token, Address, Path, ExactOutQueryOutput } from '@balancer/sdk'; import { PathWithAmount } from './lib/path'; import { SOR } from './lib/sor'; @@ -90,12 +90,12 @@ describe('Balancer SOR Integration Tests', () => { }); // get SOR paths - const tIn = new BaseToken( + const tIn = new Token( parseFloat(chainToIdMap[stataUSDC.token.chain]), stataUSDC.token.underlyingTokenAddress as Address, // USDC stataUSDC.token.decimals, ); - const tOut = new BaseToken( + const tOut = new Token( parseFloat(chainToIdMap[stataUSDT.token.chain]), stataUSDT.token.underlyingTokenAddress as Address, // DAI stataUSDT.token.decimals, @@ -159,10 +159,10 @@ describe('Balancer SOR Integration Tests', () => { let exitFeeHook: HookData; let directionalFeeHook: HookData; - let weightedBpt: BaseToken; - let stableBpt: BaseToken; - let wethToken: BaseToken; - let aaveFaucetUsdcToken: BaseToken; + let weightedBpt: Token; + let stableBpt: Token; + let wethToken: Token; + let aaveFaucetUsdcToken: Token; beforeAll(async () => { // setup mock pool data - Weighted @@ -275,23 +275,23 @@ describe('Balancer SOR Integration Tests', () => { }, }); - weightedBpt = new BaseToken( + weightedBpt = new Token( parseFloat(chainToIdMap[BAL.token.chain]), prismaWeightedPool.address as Address, 18, ); - wethToken = new BaseToken( + wethToken = new Token( parseFloat(chainToIdMap[WETH.token.chain]), WETH.address as Address, WETH.token.decimals, ); - stableBpt = new BaseToken( + stableBpt = new Token( parseFloat(chainToIdMap[BAL.token.chain]), prismaStablePoolWithExitFee.address as Address, 18, ); - aaveFaucetUsdcToken = new BaseToken( + aaveFaucetUsdcToken = new Token( parseFloat(chainToIdMap[WETH.token.chain]), aaveFaucetUsdc.address as Address, aaveFaucetUsdc.token.decimals, @@ -475,12 +475,12 @@ describe('Balancer SOR Integration Tests', () => { }); test('SOR quote should match swap query with directional fee hook used - GIVEN IN', async () => { // GIVEN IN - const dai = new BaseToken( + const dai = new Token( parseFloat(chainToIdMap[BAL.token.chain]), aaveFaucetDai.address as Address, aaveFaucetDai.token.decimals, ); - const usdc = new BaseToken( + const usdc = new Token( parseFloat(chainToIdMap[WETH.token.chain]), aaveFaucetUsdc.address as Address, aaveFaucetUsdc.token.decimals, @@ -522,12 +522,12 @@ describe('Balancer SOR Integration Tests', () => { }); test('SOR quote should match swap query with directional fee hook used - GIVEN OUT', async () => { // GIVEN OUT - const dai = new BaseToken( + const dai = new Token( parseFloat(chainToIdMap[BAL.token.chain]), aaveFaucetDai.address as Address, aaveFaucetDai.token.decimals, ); - const usdc = new BaseToken( + const usdc = new Token( parseFloat(chainToIdMap[WETH.token.chain]), aaveFaucetUsdc.address as Address, aaveFaucetUsdc.token.decimals, diff --git a/modules/sor/lib/path.ts b/modules/sor/lib/path.ts index 122db8890..94260f261 100644 --- a/modules/sor/lib/path.ts +++ b/modules/sor/lib/path.ts @@ -1,13 +1,13 @@ -import { TokenAmount, SwapKind, BaseToken } from '@balancer/sdk'; +import { TokenAmount, SwapKind, Token } from '@balancer/sdk'; import { BasePool } from './poolsV2/basePool'; import { BufferPool } from './poolsV3/buffer/bufferPool'; export class PathLocal { public readonly pools: BasePool[]; - public readonly tokens: BaseToken[]; + public readonly tokens: Token[]; public readonly isBuffer: boolean[]; - public constructor(tokens: BaseToken[], pools: BasePool[], isBuffer: boolean[]) { + public constructor(tokens: Token[], pools: BasePool[], isBuffer: boolean[]) { if (pools.length === 0 || tokens.length < 2) { throw new Error('Invalid path: must contain at least 1 pool and 2 tokens.'); } @@ -35,7 +35,7 @@ export class PathWithAmount extends PathLocal { public readonly swapStepsGreaterThanBufferLimit: number = 0; public constructor( - tokens: BaseToken[], + tokens: Token[], pools: BasePool[], isBuffer: boolean[], swapAmount: TokenAmount, diff --git a/modules/sor/lib/pathGraph/pathGraph.ts b/modules/sor/lib/pathGraph/pathGraph.ts index 24fd6a3bc..04ff7024a 100644 --- a/modules/sor/lib/pathGraph/pathGraph.ts +++ b/modules/sor/lib/pathGraph/pathGraph.ts @@ -1,4 +1,4 @@ -import { Address, SwapKind, TokenAmount, BaseToken } from '@balancer/sdk'; +import { Address, SwapKind, TokenAmount, Token } from '@balancer/sdk'; import { PathGraphEdgeData, PathGraphTraversalConfig } from './pathGraphTypes'; import { BasePool } from '../poolsV2/basePool'; import { PathLocal } from '../path'; @@ -73,8 +73,8 @@ export class PathGraph { swapKind, graphTraversalConfig, }: { - tokenIn: BaseToken; - tokenOut: BaseToken; + tokenIn: Token; + tokenOut: Token; swapAmount: TokenAmount; swapKind: SwapKind; graphTraversalConfig?: Partial; @@ -143,7 +143,7 @@ export class PathGraph { const paths = this.expandAndValidateCandidates(flattenedCandidates, swapKind, minLimitThreshold, config); return paths.map((path) => { - const pathTokens: BaseToken[] = path.map((segment) => segment.tokenOut); + const pathTokens: Token[] = path.map((segment) => segment.tokenOut); pathTokens.unshift(tokenIn); pathTokens[pathTokens.length - 1] = tokenOut; @@ -171,7 +171,7 @@ export class PathGraph { for (const pool of pools) { const tokens = pool.tokens.map((t) => t.token); if (enableAddRemoveLiquidityPaths && pool.poolType !== 'Buffer') { - tokens.push(new BaseToken(pool.tokens[0].token.chainId, pool.address.toLowerCase() as Address, 18)); // Add BPT as token nodes + tokens.push(new Token(pool.tokens[0].token.chainId, pool.address.toLowerCase() as Address, 18)); // Add BPT as token nodes } for (const token of tokens) { if (!this.nodes.has(token.address)) { @@ -199,7 +199,7 @@ export class PathGraph { for (const pool of pools) { const tokens = pool.tokens.map((t) => t.token); if (enableAddRemoveLiquidityPaths && pool.poolType !== 'Buffer') { - tokens.push(new BaseToken(pool.tokens[0].token.chainId, pool.address.toLowerCase() as Address, 18)); // Also consider BPT token pairs + tokens.push(new Token(pool.tokens[0].token.chainId, pool.address.toLowerCase() as Address, 18)); // Also consider BPT token pairs } for (const tokenIn of tokens) { for (const tokenOut of tokens) { @@ -232,8 +232,8 @@ export class PathGraph { tokenPrices, }: { pool: BasePool; - tokenIn: BaseToken; - tokenOut: BaseToken; + tokenIn: Token; + tokenOut: Token; swapKind?: SwapKind; tokenPrices?: Map; }): PathGraphEdgeData { @@ -258,7 +258,7 @@ export class PathGraph { }; } - private addNode(token: BaseToken): void { + private addNode(token: Token): void { this.nodes.add(token.address); if (!this.edges.has(token.address)) { diff --git a/modules/sor/lib/pathGraph/pathGraphTypes.ts b/modules/sor/lib/pathGraph/pathGraphTypes.ts index 7ec10f46c..1dcb8db8a 100644 --- a/modules/sor/lib/pathGraph/pathGraphTypes.ts +++ b/modules/sor/lib/pathGraph/pathGraphTypes.ts @@ -1,11 +1,11 @@ -import { BaseToken } from '@balancer/sdk'; +import { Token } from '@balancer/sdk'; import { BasePool } from '../poolsV2/basePool'; export interface PoolTokenPair { id: string; pool: BasePool; - tokenIn: BaseToken; - tokenOut: BaseToken; + tokenIn: Token; + tokenOut: Token; } export type PoolAddressDictionary = { @@ -46,8 +46,8 @@ export interface PathGraphTraversalConfig { export interface PathGraphEdgeData { pool: BasePool; normalizedLiquidity: bigint; - tokenIn: BaseToken; - tokenOut: BaseToken; + tokenIn: Token; + tokenOut: Token; isBuffer: boolean; limitUSD?: number; } diff --git a/modules/sor/lib/pathGraph/performance/benchmark.ts b/modules/sor/lib/pathGraph/performance/benchmark.ts index c6d1fe1cd..6951d012b 100644 --- a/modules/sor/lib/pathGraph/performance/benchmark.ts +++ b/modules/sor/lib/pathGraph/performance/benchmark.ts @@ -16,7 +16,7 @@ import { PathGraph } from '../pathGraph'; import { BasePool } from '../../poolsV2/basePool'; -import { BaseToken, TokenAmount, SwapKind } from '@balancer/sdk'; +import { Token, TokenAmount, SwapKind } from '@balancer/sdk'; import { topologies } from './helpers'; // Performance benchmark configuration @@ -89,7 +89,7 @@ function percentile(arr: number[], p: number): number { async function benchmarkImplementation( ImplementationClass: typeof PathGraph, implementationName: string, - tokens: BaseToken[], + tokens: Token[], pools: BasePool[], topology: string, graphSize: string, @@ -118,7 +118,7 @@ async function benchmarkImplementation( const memoryUsageKB = (memAfter.heapUsed - memBefore.heapUsed) / 1024; // Generate diverse token pairs - const tokenPairs: { tokenIn: BaseToken; tokenOut: BaseToken }[] = []; + const tokenPairs: { tokenIn: Token; tokenOut: Token }[] = []; // Add some random pairs for (let i = 0; i < BENCHMARK_CONFIG.tokenPairTests; i++) { diff --git a/modules/sor/lib/pathGraph/performance/helpers.ts b/modules/sor/lib/pathGraph/performance/helpers.ts index 9b7761499..b0243ac5b 100644 --- a/modules/sor/lib/pathGraph/performance/helpers.ts +++ b/modules/sor/lib/pathGraph/performance/helpers.ts @@ -1,10 +1,10 @@ import { BasePool } from '../../poolsV2/basePool'; -import { BaseToken, TokenAmount } from '@balancer/sdk'; +import { Token, TokenAmount } from '@balancer/sdk'; export interface GraphTopology { name: 'hub-spoke' | 'dense-mesh' | 'chain-bridges' | 'realistic-defi'; description: string; - generator: (tokenCount: number, poolCount: number) => { tokens: BaseToken[]; pools: BasePool[] }; + generator: (tokenCount: number, poolCount: number) => { tokens: Token[]; pools: BasePool[] }; } export interface GraphSpec { @@ -19,16 +19,16 @@ export const topologies: Record = { name: 'hub-spoke', description: 'Central hub with radiating spokes', generator: (tokenCount: number, poolCount: number) => { - const tokens: BaseToken[] = []; + const tokens: Token[] = []; const pools: BasePool[] = []; // Hub token (WETH-like) - const hubToken = new BaseToken(1, '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', 18); + const hubToken = new Token(1, '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', 18); tokens.push(hubToken); // Spoke tokens for (let i = 0; i < tokenCount - 1; i++) { - tokens.push(new BaseToken(1, `0x${(0x1000 + i).toString(16).padStart(40, '0')}`, 18)); + tokens.push(new Token(1, `0x${(0x1000 + i).toString(16).padStart(40, '0')}`, 18)); } let poolsCreated = 0; @@ -66,11 +66,11 @@ export const topologies: Record = { name: 'dense-mesh', description: 'High connectivity mesh network', generator: (tokenCount: number, poolCount: number) => { - const tokens: BaseToken[] = []; + const tokens: Token[] = []; const pools: BasePool[] = []; for (let i = 0; i < tokenCount; i++) { - tokens.push(new BaseToken(1, `0x${(0x2000 + i).toString(16).padStart(40, '0')}`, 18)); + tokens.push(new Token(1, `0x${(0x2000 + i).toString(16).padStart(40, '0')}`, 18)); } const maxPossiblePools = (tokenCount * (tokenCount - 1)) / 2; @@ -103,11 +103,11 @@ export const topologies: Record = { name: 'chain-bridges', description: 'Token chains with bridge connections', generator: (tokenCount: number, poolCount: number) => { - const tokens: BaseToken[] = []; + const tokens: Token[] = []; const pools: BasePool[] = []; for (let i = 0; i < tokenCount; i++) { - tokens.push(new BaseToken(1, `0x${(0x3000 + i).toString(16).padStart(40, '0')}`, 18)); + tokens.push(new Token(1, `0x${(0x3000 + i).toString(16).padStart(40, '0')}`, 18)); } let poolsCreated = 0; @@ -145,23 +145,23 @@ export const topologies: Record = { name: 'realistic-defi', description: 'Simulates realistic DeFi token distribution', generator: (tokenCount: number, poolCount: number) => { - const tokens: BaseToken[] = []; + const tokens: Token[] = []; const pools: BasePool[] = []; // Major tokens (ETH, USDC, USDT, DAI, WBTC equivalent) const majorTokens = [ - new BaseToken(1, '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', 18), // WETH - new BaseToken(1, '0xA0b86a33E6441942b3B9F1c882e6F2A5A86E1B5F', 6), // USDC-like - new BaseToken(1, '0xdAC17F958D2ee523a2206206994597C13D831ec7', 6), // USDT-like - new BaseToken(1, '0x6B175474E89094C44Da98b954EedeAC495271d0F', 18), // DAI-like - new BaseToken(1, '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599', 8), // WBTC-like + new Token(1, '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2', 18), // WETH + new Token(1, '0xA0b86a33E6441942b3B9F1c882e6F2A5A86E1B5F', 6), // USDC-like + new Token(1, '0xdAC17F958D2ee523a2206206994597C13D831ec7', 6), // USDT-like + new Token(1, '0x6B175474E89094C44Da98b954EedeAC495271d0F', 18), // DAI-like + new Token(1, '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599', 8), // WBTC-like ]; tokens.push(...majorTokens.slice(0, Math.min(5, tokenCount))); // Add remaining tokens as smaller altcoins for (let i = majorTokens.length; i < tokenCount; i++) { - tokens.push(new BaseToken(1, `0x${(0x4000 + i).toString(16).padStart(40, '0')}`, 18)); + tokens.push(new Token(1, `0x${(0x4000 + i).toString(16).padStart(40, '0')}`, 18)); } let poolsCreated = 0; @@ -212,7 +212,7 @@ export const topologies: Record = { }, }; -function createMockPool(id: string, tokens: BaseToken[], opts: Partial = {}): BasePool { +function createMockPool(id: string, tokens: Token[], opts: Partial = {}): BasePool { return { id, address: id.startsWith('0x') ? id : `0x${id.padEnd(40, '0')}`, @@ -220,7 +220,7 @@ function createMockPool(id: string, tokens: BaseToken[], opts: Partial tokens: tokens.map((t) => ({ token: t })), getNormalizedLiquidity: opts.getNormalizedLiquidity ?? (() => 100n), getLimitAmountSwap: opts.getLimitAmountSwap ?? (() => 1_000_000n), - swapGivenOut: opts.swapGivenOut ?? ((_in: BaseToken, _out: BaseToken, amt: TokenAmount) => amt), + swapGivenOut: opts.swapGivenOut ?? ((_in: Token, _out: Token, amt: TokenAmount) => amt), ...opts, } as unknown as BasePool; } diff --git a/modules/sor/lib/pathGraph/performance/tune-params.ts b/modules/sor/lib/pathGraph/performance/tune-params.ts index 0047c04b7..fc3fdbbf7 100755 --- a/modules/sor/lib/pathGraph/performance/tune-params.ts +++ b/modules/sor/lib/pathGraph/performance/tune-params.ts @@ -14,7 +14,7 @@ import { PathGraph } from '../pathGraph'; import { BasePool } from '../../poolsV2/basePool'; -import { BaseToken, TokenAmount, SwapKind } from '@balancer/sdk'; +import { Token, TokenAmount, SwapKind } from '@balancer/sdk'; import { topologies, GraphSpec } from './helpers'; interface ParamSet { @@ -50,7 +50,7 @@ const GRAPHS: GraphSpec[] = [ { name: 'med-mesh', tokens: 100, pools: 300, type: 'dense-mesh' }, ]; -async function testParams(graph: { tokens: BaseToken[]; pools: BasePool[] }, params: ParamSet): Promise { +async function testParams(graph: { tokens: Token[]; pools: BasePool[] }, params: ParamSet): Promise { const pathGraph = new PathGraph(); pathGraph.buildGraph({ pools: graph.pools, diff --git a/modules/sor/lib/poolsV2/balancer-v2-sor.integration.test.ts b/modules/sor/lib/poolsV2/balancer-v2-sor.integration.test.ts index 453bcaeac..aea41f217 100644 --- a/modules/sor/lib/poolsV2/balancer-v2-sor.integration.test.ts +++ b/modules/sor/lib/poolsV2/balancer-v2-sor.integration.test.ts @@ -1,6 +1,6 @@ // yarn vitest balancer-v2-sor.integration.test.ts -import { ExactInQueryOutput, Swap, SwapKind, BaseToken, Address } from '@balancer/sdk'; +import { ExactInQueryOutput, Swap, SwapKind, Token, Address } from '@balancer/sdk'; import { PathWithAmount } from '../path'; import { SOR } from '../sor'; @@ -51,8 +51,8 @@ describe('Balancer V2 SOR Integration Tests', () => { describe('Weighted Pool Path - Token with 0 decimals', () => { let prismaWeightedPool: PrismaPoolAndHookWithDynamic; - let tIn: BaseToken; - let tOut: BaseToken; + let tIn: Token; + let tOut: Token; beforeAll(async () => { // setup mock pool data @@ -82,8 +82,8 @@ describe('Balancer V2 SOR Integration Tests', () => { chain: 'GNOSIS', }); - tIn = new BaseToken(parseFloat(chainToIdMap['GNOSIS']), wxDAI.address as Address, wxDAI.token.decimals); - tOut = new BaseToken(parseFloat(chainToIdMap['GNOSIS']), MPS.address as Address, MPS.token.decimals); + tIn = new Token(parseFloat(chainToIdMap['GNOSIS']), wxDAI.address as Address, wxDAI.token.decimals); + tOut = new Token(parseFloat(chainToIdMap['GNOSIS']), MPS.address as Address, MPS.token.decimals); }); test('SOR quote should match swap query - below min', async () => { diff --git a/modules/sor/lib/poolsV2/basePool.ts b/modules/sor/lib/poolsV2/basePool.ts index d6eeebf80..9958e9672 100644 --- a/modules/sor/lib/poolsV2/basePool.ts +++ b/modules/sor/lib/poolsV2/basePool.ts @@ -1,4 +1,4 @@ -import { PoolType, SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; +import { PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; import { Hex } from 'viem'; import { BasePoolToken } from '../utils/basePoolToken'; @@ -9,13 +9,13 @@ export interface BasePool { readonly address: string; swapFee: bigint; tokens: BasePoolToken[]; - getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint; - swapGivenIn(tokenIn: BaseToken, tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean): TokenAmount; - swapGivenOut(tokenIn: BaseToken, tokenOut: BaseToken, swapAmount: TokenAmount, mutateBalances?: boolean): TokenAmount; - getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint; + getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint; + swapGivenIn(tokenIn: Token, tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean): TokenAmount; + swapGivenOut(tokenIn: Token, tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean): TokenAmount; + getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint; /** * Validate that pool contains tokenIn and tokenOut provided and returns pool specific token data (e.g. balance, index, weight, rate, etc.) */ - getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: BasePoolToken; tOut: BasePoolToken }; + getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: BasePoolToken; tOut: BasePoolToken }; copy(): BasePool; } diff --git a/modules/sor/lib/poolsV2/composableStable/composableStablePool.ts b/modules/sor/lib/poolsV2/composableStable/composableStablePool.ts index 20ab9e398..369c2967e 100644 --- a/modules/sor/lib/poolsV2/composableStable/composableStablePool.ts +++ b/modules/sor/lib/poolsV2/composableStable/composableStablePool.ts @@ -11,7 +11,7 @@ import { _calcTokenOutGivenExactBptIn, _calculateInvariant, } from './stableMath'; -import { PoolType, SwapKind, TokenAmount, BaseToken } from '@balancer/sdk'; +import { PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; import { chainToChainId as chainToIdMap } from '../../../../network/chain-id-to-chain'; import { StableData } from '../../../../pool/subgraph-mapper'; import { TokenPairData } from '../../../../pool/lib/pool-on-chain-tokenpair-data'; @@ -41,7 +41,7 @@ export class ComposableStablePool implements BasePool { for (const poolToken of pool.tokens) { if (!poolToken.priceRate) throw new Error('Stable pool token does not have a price rate'); - const token = new BaseToken( + const token = new Token( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -96,7 +96,7 @@ export class ComposableStablePool implements BasePool { this.tokenPairs = tokenPairs; } - public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { + public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const tokenPair = this.tokenPairs.find( @@ -110,8 +110,8 @@ export class ComposableStablePool implements BasePool { } public swapGivenIn( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -187,8 +187,8 @@ export class ComposableStablePool implements BasePool { } public swapGivenOut( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -273,7 +273,7 @@ export class ComposableStablePool implements BasePool { return amount.divUpFixed(MathSol.complementFixed(this.swapFee)); } - public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); if (swapKind === SwapKind.GivenIn) { @@ -298,7 +298,7 @@ export class ComposableStablePool implements BasePool { return amountsWithoutBpt; } - public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate } { + public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV2/fx/fxPool.ts b/modules/sor/lib/poolsV2/fx/fxPool.ts index b801f71ce..44b4c97b9 100644 --- a/modules/sor/lib/poolsV2/fx/fxPool.ts +++ b/modules/sor/lib/poolsV2/fx/fxPool.ts @@ -7,7 +7,7 @@ import { Chain } from '@prisma/client'; import { _calcInGivenOut, _calcOutGivenIn } from './fxMath'; import { RAY } from '../../utils/math'; import { FxPoolPairData } from './types'; -import { PoolType, SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; +import { PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; import { chainToChainId as chainToIdMap } from '../../../../network/chain-id-to-chain'; import { TokenPairData } from '../../../../pool/lib/pool-on-chain-tokenpair-data'; import { BasePool } from '../basePool'; @@ -48,7 +48,7 @@ export class FxPool implements BasePool { throw new Error('FX pool token does not have latestFXPrice'); } - const token = new BaseToken( + const token = new Token( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -116,7 +116,7 @@ export class FxPool implements BasePool { this.tokenPairs = tokenPairs; } - public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { + public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const tokenPair = this.tokenPairs.find( @@ -130,8 +130,8 @@ export class FxPool implements BasePool { } public swapGivenIn( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -155,8 +155,8 @@ export class FxPool implements BasePool { } public swapGivenOut( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -183,7 +183,7 @@ export class FxPool implements BasePool { * Fx pool logic has an alpha region where it halts swaps. * maxLimit = [(1 + alpha) * oGLiq * 0.5] - token liquidity */ - public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { const { _oGLiq, tIn, tOut } = this.getPoolPairData(tokenIn, tokenOut, 0n, swapKind); const maxLimit = MathFx.mulDownFixed(this.alpha + RAY, _oGLiq) / 2n; // TODO: double check if RAY is indeed 1e36 or 1e27 - google says it's 1e27 if (swapKind === SwapKind.GivenIn) { @@ -194,7 +194,7 @@ export class FxPool implements BasePool { return FxPoolToken.fromNumeraire(tOut, maxAmount).amount; } - public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: FxPoolToken; tOut: FxPoolToken } { + public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: FxPoolToken; tOut: FxPoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); @@ -205,7 +205,7 @@ export class FxPool implements BasePool { return { tIn, tOut }; } - public getPoolPairData(tokenIn: BaseToken, tokenOut: BaseToken, swapAmount: bigint, swapKind: SwapKind): FxPoolPairData { + public getPoolPairData(tokenIn: Token, tokenOut: Token, swapAmount: bigint, swapKind: SwapKind): FxPoolPairData { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const usdcToken = isUSDC(tokenIn.address) ? tIn : tOut; diff --git a/modules/sor/lib/poolsV2/fx/fxPoolToken.ts b/modules/sor/lib/poolsV2/fx/fxPoolToken.ts index dad75bb6f..a0ca7384c 100644 --- a/modules/sor/lib/poolsV2/fx/fxPoolToken.ts +++ b/modules/sor/lib/poolsV2/fx/fxPoolToken.ts @@ -1,7 +1,7 @@ import { parseUnits } from 'viem'; import { WAD } from '../../utils/math'; import { MathFx } from './helpers'; -import { BigintIsh, BaseToken, TokenAmount } from '@balancer/sdk'; +import { BigintIsh, Token, TokenAmount } from '@balancer/sdk'; import { BasePoolToken } from '../../utils/basePoolToken'; export class FxPoolToken extends BasePoolToken { @@ -11,7 +11,7 @@ export class FxPoolToken extends BasePoolToken { private readonly scalar36 = this.scalar * WAD; public constructor( - token: BaseToken, + token: Token, amount: BigintIsh, index: number, latestFXPrice: string, diff --git a/modules/sor/lib/poolsV2/gyro2/gyro2Pool.ts b/modules/sor/lib/poolsV2/gyro2/gyro2Pool.ts index 20d24ee6b..54cb86f5c 100644 --- a/modules/sor/lib/poolsV2/gyro2/gyro2Pool.ts +++ b/modules/sor/lib/poolsV2/gyro2/gyro2Pool.ts @@ -4,7 +4,7 @@ import { Chain } from '@prisma/client'; import { _calcInGivenOut, _calcOutGivenIn, _calculateInvariant, _findVirtualParams } from './gyro2Math'; import { MathSol, WAD } from '../../utils/math'; import { SWAP_LIMIT_FACTOR } from '../../utils/gyroHelpers/math'; -import { PoolType, SwapKind, BaseToken, TokenAmount, BigintIsh } from '@balancer/sdk'; +import { PoolType, SwapKind, Token, TokenAmount, BigintIsh } from '@balancer/sdk'; import { chainToChainId as chainToIdMap } from '../../../../network/chain-id-to-chain'; import { GyroData } from '../../../../pool/subgraph-mapper'; import { TokenPairData } from '../../../../pool/lib/pool-on-chain-tokenpair-data'; @@ -36,7 +36,7 @@ export class Gyro2Pool implements BasePool { if (!poolToken.balance) { throw new Error('Gyro pool as no dynamic pool token data'); } - const token = new BaseToken( + const token = new Token( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -89,7 +89,7 @@ export class Gyro2Pool implements BasePool { this.tokenPairs = tokenPairs; } - public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { + public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const tokenPair = this.tokenPairs.find( @@ -103,8 +103,8 @@ export class Gyro2Pool implements BasePool { } public swapGivenIn( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -151,8 +151,8 @@ export class Gyro2Pool implements BasePool { } public swapGivenOut( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -197,7 +197,7 @@ export class Gyro2Pool implements BasePool { return inAmount; } - public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { const { tIn, tOut, sqrtAlpha, sqrtBeta } = this.getPoolPairData(tokenIn, tokenOut); if (swapKind === SwapKind.GivenIn) { const invariant = _calculateInvariant([tIn.scale18, tOut.scale18], sqrtAlpha, sqrtBeta); @@ -221,7 +221,7 @@ export class Gyro2Pool implements BasePool { return amount.divUpFixed(MathSol.complementFixed(this.swapFee)); } - public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate } { + public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); @@ -233,8 +233,8 @@ export class Gyro2Pool implements BasePool { } public getPoolPairData( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, ): { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate; diff --git a/modules/sor/lib/poolsV2/gyro2/test/gyro2Math.test.ts b/modules/sor/lib/poolsV2/gyro2/test/gyro2Math.test.ts index 4e3dbe7a6..89c976801 100644 --- a/modules/sor/lib/poolsV2/gyro2/test/gyro2Math.test.ts +++ b/modules/sor/lib/poolsV2/gyro2/test/gyro2Math.test.ts @@ -1,7 +1,7 @@ import { _calculateInvariant, _calcOutGivenIn, _findVirtualParams } from "../gyro2Math"; import { Gyro2Pool, Gyro2PoolToken } from "../gyro2Pool"; -import { BaseToken, TokenAmount } from '@balancer/sdk' +import { Token, TokenAmount, NativeToken } from '@balancer/sdk' import { parseEther } from 'viem'; @@ -24,8 +24,8 @@ describe('gyro2Math', () => { const expectedAmountOut = 879697n; // Create dummy tokens - const tokenIn = new BaseToken(1, '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9', 6, 'TKN1', 'Token 1'); - const tokenOut = new BaseToken(1, '0xb165a74407fe1e519d6bcbdec1ed3202b35a4140', 6, 'TKN2', 'Token 2'); + const tokenIn = new Token(1, '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9', 6, 'TKN1', 'Token 1'); + const tokenOut = new Token(1, '0xb165a74407fe1e519d6bcbdec1ed3202b35a4140', 6, 'TKN2', 'Token 2'); // Create Gyro2PoolTokens (pool balances, index and rate) const gyro2PoolTokenIn = new Gyro2PoolToken(tokenIn, 54239799503n, 0, 1000000000000000000n); @@ -45,22 +45,22 @@ describe('gyro2Math', () => { [{ tokenA: '0xTokenInAddress', tokenB: '0xTokenOutAddress', normalizedLiquidity: '1000000', spotPrice: '1.5' }] ); - const tIn = new BaseToken( + const tIn = new NativeToken( 42161, "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9", 6, + "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9", "USDT", "Tether USD", - "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9", ) - const tOut = new BaseToken( + const tOut = new NativeToken( 42161, "0xb165a74407fe1e519d6bcbdec1ed3202b35a4140", 6, + "0xb165a74407fe1e519d6bcbdec1ed3202b35a4140", "stataArbUSDT", "Static Aave Arbitrum USDT", - "0xb165a74407fe1e519d6bcbdec1ed3202b35a4140", ) const swapAmount = TokenAmount.fromHumanAmount(tIn, '1'); @@ -84,8 +84,8 @@ describe('gyro2Math', () => { const expectedAmountOut = 1000003n; // Create dummy tokens - const tokenIn = new BaseToken(1, '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9', 6, 'TKN1', 'Token 1'); - const tokenOut = new BaseToken(1, '0xb165a74407fe1e519d6bcbdec1ed3202b35a4140', 6, 'TKN2', 'Token 2'); + const tokenIn = new Token(1, '0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9', 6, 'TKN1', 'Token 1'); + const tokenOut = new Token(1, '0xb165a74407fe1e519d6bcbdec1ed3202b35a4140', 6, 'TKN2', 'Token 2'); // Create Gyro2PoolTokens (pool balances, index and rate) based on sim from block 257426306 const gyro2PoolTokenIn = new Gyro2PoolToken(tokenIn, 54239799503n, 0, 1000000000000000000n); @@ -104,22 +104,22 @@ describe('gyro2Math', () => { [{ tokenA: '0xTokenInAddress', tokenB: '0xTokenOutAddress', normalizedLiquidity: '1000000', spotPrice: '1.5' }] ); - const tIn = new BaseToken( + const tIn = new NativeToken( 42161, "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9", 6, + "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9", "USDT", "Tether USD", - "0xfd086bc7cd5c481dcc9c85ebe478a1c0b69fcbb9", ) - const tOut = new BaseToken( + const tOut = new NativeToken( 42161, "0xb165a74407fe1e519d6bcbdec1ed3202b35a4140", 6, + "0xb165a74407fe1e519d6bcbdec1ed3202b35a4140", "stataArbUSDT", "Static Aave Arbitrum USDT", - "0xb165a74407fe1e519d6bcbdec1ed3202b35a4140", ) const swapAmount = TokenAmount.fromHumanAmount(tIn, '0.879697'); diff --git a/modules/sor/lib/poolsV2/gyro3/gyro3Pool.ts b/modules/sor/lib/poolsV2/gyro3/gyro3Pool.ts index 3e0997c58..58dffb464 100644 --- a/modules/sor/lib/poolsV2/gyro3/gyro3Pool.ts +++ b/modules/sor/lib/poolsV2/gyro3/gyro3Pool.ts @@ -4,7 +4,7 @@ import { Chain } from '@prisma/client'; import { MathSol, WAD } from '../../utils/math'; import { MathGyro, SWAP_LIMIT_FACTOR } from '../../utils/gyroHelpers/math'; import { _calcInGivenOut, _calcOutGivenIn, _calculateInvariant } from './gyro3Math'; -import { PoolType, SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; +import { PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; import { chainToChainId as chainToIdMap } from '../../../../network/chain-id-to-chain'; import { GyroData } from '../../../../pool/subgraph-mapper'; import { TokenPairData } from '../../../../pool/lib/pool-on-chain-tokenpair-data'; @@ -35,7 +35,7 @@ export class Gyro3Pool implements BasePool { if (!poolToken.balance) { throw new Error('Gyro pool as no dynamic pool token data'); } - const token = new BaseToken( + const token = new Token( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -80,7 +80,7 @@ export class Gyro3Pool implements BasePool { this.tokenPairs = tokenPairs; } - public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { + public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const tokenPair = this.tokenPairs.find( @@ -94,8 +94,8 @@ export class Gyro3Pool implements BasePool { } public swapGivenIn( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -124,8 +124,8 @@ export class Gyro3Pool implements BasePool { } public swapGivenOut( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -148,7 +148,7 @@ export class Gyro3Pool implements BasePool { return inAmount; } - public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { const { tIn, tOut, tertiary } = this.getPoolPairData(tokenIn, tokenOut); if (swapKind === SwapKind.GivenIn) { const invariant = _calculateInvariant([tIn.scale18, tOut.scale18, tertiary.scale18], this.root3Alpha); @@ -171,7 +171,7 @@ export class Gyro3Pool implements BasePool { return amount.divUpFixed(MathSol.complementFixed(this.swapFee)); } - public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: BasePoolToken; tOut: BasePoolToken } { + public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: BasePoolToken; tOut: BasePoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); @@ -183,8 +183,8 @@ export class Gyro3Pool implements BasePool { } public getPoolPairData( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, ): { tIn: BasePoolToken; tOut: BasePoolToken; diff --git a/modules/sor/lib/poolsV2/gyroE/gyroE.integration.test.ts b/modules/sor/lib/poolsV2/gyroE/gyroE.integration.test.ts index 151a48b7e..fba79ce25 100644 --- a/modules/sor/lib/poolsV2/gyroE/gyroE.integration.test.ts +++ b/modules/sor/lib/poolsV2/gyroE/gyroE.integration.test.ts @@ -1,6 +1,6 @@ // yarn vitest gyroE.integration.test.ts -import { ExactInQueryOutput, Swap, SwapKind, BaseToken, Address, ExactOutQueryOutput, ChainId } from '@balancer/sdk'; +import { ExactInQueryOutput, Swap, SwapKind, Token, Address, ExactOutQueryOutput, ChainId } from '@balancer/sdk'; import { createTestClient, formatUnits, Hex, http, parseUnits, TestClient } from 'viem'; import { gnosis, sonic } from 'viem/chains'; @@ -24,8 +24,8 @@ describe('SOR - GyroE Integration Tests', () => { let client: TestClient; let chainId: number; let prismaPool: PrismaPoolAndHookWithDynamic; - let tIn: BaseToken; - let tOut: BaseToken; + let tIn: Token; + let tOut: Token; beforeEach(async () => { await client.revert({ @@ -85,8 +85,8 @@ describe('SOR - GyroE Integration Tests', () => { }), }); - tIn = new BaseToken(chainId, scUSD.address as Address, scUSD.token.decimals); - tOut = new BaseToken(chainId, scETH.address as Address, scETH.token.decimals); + tIn = new Token(chainId, scUSD.address as Address, scUSD.token.decimals); + tOut = new Token(chainId, scETH.address as Address, scETH.token.decimals); snapshot = await client.snapshot(); }); @@ -225,8 +225,8 @@ describe('SOR - GyroE Integration Tests', () => { }), }); - tIn = new BaseToken(chainId, sDAI.address as Address, sDAI.token.decimals); - tOut = new BaseToken(chainId, bCSPX.address as Address, bCSPX.token.decimals); + tIn = new Token(chainId, sDAI.address as Address, sDAI.token.decimals); + tOut = new Token(chainId, bCSPX.address as Address, bCSPX.token.decimals); snapshot = await client.snapshot(); }); diff --git a/modules/sor/lib/poolsV2/gyroE/gyroEPool.ts b/modules/sor/lib/poolsV2/gyroE/gyroEPool.ts index 238d921e4..208ef0be7 100644 --- a/modules/sor/lib/poolsV2/gyroE/gyroEPool.ts +++ b/modules/sor/lib/poolsV2/gyroE/gyroEPool.ts @@ -1,6 +1,6 @@ import { Address, Hex, parseEther, parseUnits } from 'viem'; import { Chain } from '@prisma/client'; -import { PoolType, SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; +import { PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; import { PrismaPoolAndHookWithDynamic } from '../../../../../prisma/prisma-types'; import { MathSol, WAD } from '../../utils/math'; @@ -40,7 +40,7 @@ export class GyroEPool implements BasePool { throw new Error('Gyro pool as no dynamic pool token data'); } - const token = new BaseToken( + const token = new Token( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -116,7 +116,7 @@ export class GyroEPool implements BasePool { this.tokenPairs = tokenPairs; } - public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { + public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const tokenPair = this.tokenPairs.find( @@ -130,8 +130,8 @@ export class GyroEPool implements BasePool { } public swapGivenIn( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -175,8 +175,8 @@ export class GyroEPool implements BasePool { } public swapGivenOut( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -215,7 +215,7 @@ export class GyroEPool implements BasePool { return inAmount; } - public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); if (swapKind === SwapKind.GivenIn) { const orderedNormalizedBalances = balancesFromTokenInOut(tIn.scale18, tOut.scale18, tIn.index === 0); @@ -249,8 +249,8 @@ export class GyroEPool implements BasePool { } public getPoolTokens( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, ): { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate; diff --git a/modules/sor/lib/poolsV2/metastable/metastablePool.ts b/modules/sor/lib/poolsV2/metastable/metastablePool.ts index 1c7e975f5..ac48966b1 100644 --- a/modules/sor/lib/poolsV2/metastable/metastablePool.ts +++ b/modules/sor/lib/poolsV2/metastable/metastablePool.ts @@ -3,7 +3,7 @@ import { Address, Hex, parseEther, parseUnits } from 'viem'; import { PrismaPoolAndHookWithDynamic } from '../../../../../prisma/prisma-types'; import { _calcInGivenOut, _calcOutGivenIn, _calculateInvariant } from '../composableStable/stableMath'; import { MathSol, WAD } from '../../utils/math'; -import { PoolType, SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; +import { PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; import { chainToChainId as chainToIdMap } from '../../../../network/chain-id-to-chain'; import { StableData } from '../../../../pool/subgraph-mapper'; import { TokenPairData } from '../../../../pool/lib/pool-on-chain-tokenpair-data'; @@ -30,7 +30,7 @@ export class MetaStablePool implements BasePool { for (const poolToken of pool.tokens) { if (!poolToken.priceRate) throw new Error('Meta Stable pool token does not have a price rate'); - const token = new BaseToken( + const token = new Token( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -79,7 +79,7 @@ export class MetaStablePool implements BasePool { this.tokenPairs = tokenPairs; } - public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { + public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const tokenPair = this.tokenPairs.find( @@ -93,8 +93,8 @@ export class MetaStablePool implements BasePool { } public swapGivenIn( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -133,8 +133,8 @@ export class MetaStablePool implements BasePool { } public swapGivenOut( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -182,7 +182,7 @@ export class MetaStablePool implements BasePool { return amount.divUpFixed(MathSol.complementFixed(this.swapFee)); } - public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); if (swapKind === SwapKind.GivenIn) { @@ -194,7 +194,7 @@ export class MetaStablePool implements BasePool { return (tOut.amount * WAD) / tOut.rate; } - public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate } { + public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: PoolTokenWithRate; tOut: PoolTokenWithRate } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV2/stable/stablePool.integration.test.ts b/modules/sor/lib/poolsV2/stable/stablePool.integration.test.ts index 0f621f49d..b54eedd82 100644 --- a/modules/sor/lib/poolsV2/stable/stablePool.integration.test.ts +++ b/modules/sor/lib/poolsV2/stable/stablePool.integration.test.ts @@ -19,7 +19,7 @@ * TODO: improve test data setup by creating a script that fetches all necessary data automatically for a given blockNumber. */ -import { ExactInQueryOutput, Swap, SwapKind, BaseToken, Address, Path } from '@balancer/sdk'; +import { ExactInQueryOutput, Swap, SwapKind, Token, Address, Path } from '@balancer/sdk'; import { createTestClient, Hex, http, TestClient } from 'viem'; import { mainnet } from 'viem/chains'; @@ -86,12 +86,12 @@ describe('Balancer SOR Integration Tests', () => { }); // get SOR paths - const tIn = new BaseToken( + const tIn = new Token( parseFloat(chainToChainId[DOLA.token.chain]), DOLA.address as Address, DOLA.token.decimals, ); - const tOut = new BaseToken( + const tOut = new Token( parseFloat(chainToChainId[USDC.token.chain]), USDC.address as Address, USDC.token.decimals, diff --git a/modules/sor/lib/poolsV2/stable/stablePool.ts b/modules/sor/lib/poolsV2/stable/stablePool.ts index 9834fe687..fd11e9faf 100644 --- a/modules/sor/lib/poolsV2/stable/stablePool.ts +++ b/modules/sor/lib/poolsV2/stable/stablePool.ts @@ -3,7 +3,7 @@ import { Address, Hex, parseEther, parseUnits } from 'viem'; import { PrismaPoolAndHookWithDynamic } from '../../../../../prisma/prisma-types'; import { _calcInGivenOut, _calcOutGivenIn, _calculateInvariant } from '../composableStable/stableMath'; import { MathSol } from '../../utils/math'; -import { PoolType, SwapKind, TokenAmount, BaseToken } from '@balancer/sdk'; +import { PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; import { chainToChainId as chainToIdMap } from '../../../../network/chain-id-to-chain'; import { StableData } from '../../../../pool/subgraph-mapper'; import { TokenPairData } from '../../../../pool/lib/pool-on-chain-tokenpair-data'; @@ -28,7 +28,7 @@ export class StablePool implements BasePool { if (!pool.dynamicData) throw new Error('Stable pool has no dynamic data'); for (const poolToken of pool.tokens) { - const token = new BaseToken( + const token = new Token( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -74,7 +74,7 @@ export class StablePool implements BasePool { this.tokenPairs = tokenPairs; } - public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { + public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const tokenPair = this.tokenPairs.find( @@ -88,8 +88,8 @@ export class StablePool implements BasePool { } public swapGivenIn( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -126,8 +126,8 @@ export class StablePool implements BasePool { } public swapGivenOut( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -172,7 +172,7 @@ export class StablePool implements BasePool { return amount.divUpFixed(MathSol.complementFixed(this.swapFee)); } - public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); if (swapKind === SwapKind.GivenIn) { @@ -184,7 +184,7 @@ export class StablePool implements BasePool { return tOut.amount; } - public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: BasePoolToken; tOut: BasePoolToken } { + public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: BasePoolToken; tOut: BasePoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV2/weighted/weightedBasePoolToken.ts b/modules/sor/lib/poolsV2/weighted/weightedBasePoolToken.ts index 8de8fc469..565e246f9 100644 --- a/modules/sor/lib/poolsV2/weighted/weightedBasePoolToken.ts +++ b/modules/sor/lib/poolsV2/weighted/weightedBasePoolToken.ts @@ -1,10 +1,10 @@ -import { BigintIsh, BaseToken } from '@balancer/sdk'; +import { BigintIsh, Token } from '@balancer/sdk'; import { BasePoolToken } from '../../utils/basePoolToken'; export class WeightedBasePoolToken extends BasePoolToken { public readonly weight: bigint; - public constructor(token: BaseToken, amount: BigintIsh, index: number, weight: BigintIsh) { + public constructor(token: Token, amount: BigintIsh, index: number, weight: BigintIsh) { super(token, amount, index); this.weight = BigInt(weight); } diff --git a/modules/sor/lib/poolsV2/weighted/weightedPool.ts b/modules/sor/lib/poolsV2/weighted/weightedPool.ts index 65a11b9ea..9424a59f0 100644 --- a/modules/sor/lib/poolsV2/weighted/weightedPool.ts +++ b/modules/sor/lib/poolsV2/weighted/weightedPool.ts @@ -3,7 +3,7 @@ import { GqlPoolType } from '../../../../../apps/api/gql/generated-schema'; import { Chain } from '@prisma/client'; import { MathSol, WAD } from '../../utils/math'; import { Address, Hex, parseEther } from 'viem'; -import { SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; +import { SwapKind, Token, TokenAmount } from '@balancer/sdk'; import { chainToChainId as chainToIdMap } from '../../../../network/chain-id-to-chain'; import { TokenPairData } from '../../../../pool/lib/pool-on-chain-tokenpair-data'; import { BasePool } from '../basePool'; @@ -35,7 +35,7 @@ export class WeightedPool implements BasePool { throw new Error('Weighted pool token does not have a weight'); } - const token = new BaseToken( + const token = new Token( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -79,7 +79,7 @@ export class WeightedPool implements BasePool { this.tokenPairs = tokenPairs; } - public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { + public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const tokenPair = this.tokenPairs.find( @@ -92,7 +92,7 @@ export class WeightedPool implements BasePool { return 0n; } - public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); if (swapKind === SwapKind.GivenIn) { @@ -101,7 +101,7 @@ export class WeightedPool implements BasePool { return (tOut.amount * this.MAX_OUT_RATIO) / WAD; } - public swapGivenIn(tokenIn: BaseToken, tokenOut: BaseToken, swapAmount: TokenAmount): TokenAmount { + public swapGivenIn(tokenIn: Token, tokenOut: Token, swapAmount: TokenAmount): TokenAmount { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); if (swapAmount.amount > this.getLimitAmountSwap(tokenIn, tokenOut, SwapKind.GivenIn)) { @@ -124,7 +124,7 @@ export class WeightedPool implements BasePool { return tokenOutAmount; } - public swapGivenOut(tokenIn: BaseToken, tokenOut: BaseToken, swapAmount: TokenAmount): TokenAmount { + public swapGivenOut(tokenIn: Token, tokenOut: Token, swapAmount: TokenAmount): TokenAmount { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); if (swapAmount.amount > this.getLimitAmountSwap(tokenIn, tokenOut, SwapKind.GivenOut)) { @@ -154,7 +154,7 @@ export class WeightedPool implements BasePool { return amount.divUpFixed(MathSol.complementFixed(this.swapFee)); } - public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: WeightedPoolToken; tOut: WeightedPoolToken } { + public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: WeightedPoolToken; tOut: WeightedPoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV3/basePoolV3.ts b/modules/sor/lib/poolsV3/basePoolV3.ts index 8c9f4f29d..37560295b 100644 --- a/modules/sor/lib/poolsV3/basePoolV3.ts +++ b/modules/sor/lib/poolsV3/basePoolV3.ts @@ -1,6 +1,6 @@ import { Hex } from 'viem'; -import { MAX_UINT256, PoolType, SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; +import { MAX_UINT256, PoolType, SwapKind, Token, TokenAmount } from '@balancer/sdk'; import { AddKind, RemoveKind, Vault, HookState, PoolState } from '@balancer-labs/balancer-maths'; import { Chain } from '@prisma/client'; @@ -55,7 +55,7 @@ export class BasePoolV3 { this.vault = new Vault(); } - public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); // remove liquidity @@ -90,8 +90,8 @@ export class BasePoolV3 { } public swapGivenIn( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -163,8 +163,8 @@ export class BasePoolV3 { } public swapGivenOut( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, swapAmount: TokenAmount, mutateBalances?: boolean, ): TokenAmount { @@ -235,7 +235,7 @@ export class BasePoolV3 { return TokenAmount.fromRawAmount(tIn.token, calculatedAmount); } - public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { + public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const tokenPair = this.tokenPairs.find( @@ -254,7 +254,7 @@ export class BasePoolV3 { throw new Error('Must be implemented by the subclass'); } - public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: BasePoolToken; tOut: BasePoolToken } { + public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: BasePoolToken; tOut: BasePoolToken } { throw new Error('Must be implemented by the subclass'); } diff --git a/modules/sor/lib/poolsV3/buffer/bufferPool.ts b/modules/sor/lib/poolsV3/buffer/bufferPool.ts index 03796ed2e..aad7e0234 100644 --- a/modules/sor/lib/poolsV3/buffer/bufferPool.ts +++ b/modules/sor/lib/poolsV3/buffer/bufferPool.ts @@ -1,5 +1,5 @@ import { Address, Hex } from 'viem'; -import { MAX_UINT256, SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; +import { MAX_UINT256, SwapKind, Token, TokenAmount } from '@balancer/sdk'; import { BufferState, Vault } from '@balancer-labs/balancer-maths'; import { BasePoolMethodsV3 } from '../basePoolMethodsV3'; @@ -38,12 +38,12 @@ export class BufferPool implements BasePoolMethodsV3 { bufferPoolData.chainId, bufferPoolData.unwrapRate, new BasePoolToken( - new BaseToken(bufferPoolData.chainId, bufferPoolData.mainToken.address, bufferPoolData.mainToken.decimals), + new Token(bufferPoolData.chainId, bufferPoolData.mainToken.address, bufferPoolData.mainToken.decimals), bufferPoolData.mainToken.balance, 0, ), new BasePoolToken( - new BaseToken( + new Token( bufferPoolData.chainId, bufferPoolData.underlyingToken.address, bufferPoolData.underlyingToken.decimals, @@ -79,11 +79,11 @@ export class BufferPool implements BasePoolMethodsV3 { this.poolState = this.getPoolState(); } - public getNormalizedLiquidity(tokenIn: BaseToken, tokenOut: BaseToken): bigint { + public getNormalizedLiquidity(tokenIn: Token, tokenOut: Token): bigint { return MAX_UINT256; } - public getLimitAmountSwap(tokenIn: BaseToken, tokenOut: BaseToken, swapKind: SwapKind): bigint { + public getLimitAmountSwap(tokenIn: Token, tokenOut: Token, swapKind: SwapKind): bigint { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const mainTokenAmount = this.tokens[0]; @@ -146,7 +146,7 @@ export class BufferPool implements BasePoolMethodsV3 { } } - public swapGivenIn(tokenIn: BaseToken, tokenOut: BaseToken, swapAmount: TokenAmount): TokenAmount { + public swapGivenIn(tokenIn: Token, tokenOut: Token, swapAmount: TokenAmount): TokenAmount { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const calculatedAmount = this.vault.swap( @@ -162,7 +162,7 @@ export class BufferPool implements BasePoolMethodsV3 { return TokenAmount.fromRawAmount(tOut.token, calculatedAmount); } - public swapGivenOut(tokenIn: BaseToken, tokenOut: BaseToken, swapAmount: TokenAmount): TokenAmount { + public swapGivenOut(tokenIn: Token, tokenOut: Token, swapAmount: TokenAmount): TokenAmount { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); // swap @@ -189,7 +189,7 @@ export class BufferPool implements BasePoolMethodsV3 { // Helper methods - public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: BasePoolToken; tOut: BasePoolToken } { + public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: BasePoolToken; tOut: BasePoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); @@ -213,7 +213,7 @@ export class BufferPool implements BasePoolMethodsV3 { ); } - public swapGivenInGreaterThanBufferLimit(tokenIn: BaseToken, tokenOut: BaseToken, swapAmount: TokenAmount): boolean { + public swapGivenInGreaterThanBufferLimit(tokenIn: Token, tokenOut: Token, swapAmount: TokenAmount): boolean { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const mainTokenAmount = this.tokens[0]; const underlyingTokenAmount = this.tokens[1]; @@ -227,7 +227,7 @@ export class BufferPool implements BasePoolMethodsV3 { } } - public swapGivenOutGreaterThanBufferLimit(tokenIn: BaseToken, tokenOut: BaseToken, swapAmount: TokenAmount): boolean { + public swapGivenOutGreaterThanBufferLimit(tokenIn: Token, tokenOut: Token, swapAmount: TokenAmount): boolean { const { tIn, tOut } = this.getPoolTokens(tokenIn, tokenOut); const mainTokenAmount = this.tokens[0]; const underlyingTokenAmount = this.tokens[1]; diff --git a/modules/sor/lib/poolsV3/gyro2CLP/gyro2CLPPool.ts b/modules/sor/lib/poolsV3/gyro2CLP/gyro2CLPPool.ts index d7d046ed6..e1731c768 100644 --- a/modules/sor/lib/poolsV3/gyro2CLP/gyro2CLPPool.ts +++ b/modules/sor/lib/poolsV3/gyro2CLP/gyro2CLPPool.ts @@ -1,6 +1,6 @@ import { Address, Hex, parseEther, parseUnits } from 'viem'; -import { PoolType, BaseToken, TokenAmount } from '@balancer/sdk'; +import { PoolType, Token, TokenAmount } from '@balancer/sdk'; import { HookState, Gyro2CLPState } from '@balancer-labs/balancer-maths'; import { Chain } from '@prisma/client'; @@ -32,7 +32,7 @@ export class Gyro2CLPPool extends BasePoolV3 implements BasePoolMethodsV3 { for (const poolToken of pool.tokens) { if (!poolToken.priceRate) throw new Error(`${pool.type} pool token does not have a price rate`); - const token = new BaseToken( + const token = new Token( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -104,7 +104,7 @@ export class Gyro2CLPPool extends BasePoolV3 implements BasePoolMethodsV3 { this.tokenMap = new Map(this.tokens.map((token) => [token.token.address, token])); // add BPT to tokenMap, so we can handle add/remove liquidity operations - const bpt = new BaseToken(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); + const bpt = new Token(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); this.tokenMap.set(bpt.address, new PoolTokenWithRate(bpt, totalShares, -1, WAD)); this.poolState = this.getPoolState(hookState?.hookType); @@ -131,7 +131,7 @@ export class Gyro2CLPPool extends BasePoolV3 implements BasePoolMethodsV3 { return poolState; } - public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: GyroPoolToken; tOut: GyroPoolToken } { + public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: GyroPoolToken; tOut: GyroPoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV3/gyroECLP/gyroECLPPool.ts b/modules/sor/lib/poolsV3/gyroECLP/gyroECLPPool.ts index 3038da76a..399f59b29 100644 --- a/modules/sor/lib/poolsV3/gyroECLP/gyroECLPPool.ts +++ b/modules/sor/lib/poolsV3/gyroECLP/gyroECLPPool.ts @@ -1,6 +1,6 @@ import { Address, Hex, parseEther, parseUnits } from 'viem'; -import { PoolType, BaseToken, TokenAmount } from '@balancer/sdk'; +import { PoolType, Token, TokenAmount } from '@balancer/sdk'; import { HookState, GyroECLPState } from '@balancer-labs/balancer-maths'; import { Chain } from '@prisma/client'; @@ -34,7 +34,7 @@ export class GyroECLPPool extends BasePoolV3 implements BasePoolMethodsV3 { for (const poolToken of pool.tokens) { if (!poolToken.priceRate) throw new Error(`${pool.type} pool token does not have a price rate`); - const token = new BaseToken( + const token = new Token( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -129,7 +129,7 @@ export class GyroECLPPool extends BasePoolV3 implements BasePoolMethodsV3 { this.tokenMap = new Map(this.tokens.map((token) => [token.token.address, token])); // add BPT to tokenMap, so we can handle add/remove liquidity operations - const bpt = new BaseToken(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); + const bpt = new Token(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); this.tokenMap.set(bpt.address, new PoolTokenWithRate(bpt, totalShares, -1, WAD)); this.poolState = this.getPoolState(hookState?.hookType); @@ -168,7 +168,7 @@ export class GyroECLPPool extends BasePoolV3 implements BasePoolMethodsV3 { return poolState; } - public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: GyroPoolToken; tOut: GyroPoolToken } { + public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: GyroPoolToken; tOut: GyroPoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV3/liquidityBootstrapping/liquidityBootstrapping.ts b/modules/sor/lib/poolsV3/liquidityBootstrapping/liquidityBootstrapping.ts index 96295e9ae..a9ce2840c 100644 --- a/modules/sor/lib/poolsV3/liquidityBootstrapping/liquidityBootstrapping.ts +++ b/modules/sor/lib/poolsV3/liquidityBootstrapping/liquidityBootstrapping.ts @@ -1,5 +1,5 @@ import { Address, Hex, parseEther, parseUnits } from 'viem'; -import { PoolType, BaseToken, TokenAmount, WAD } from '@balancer/sdk'; +import { PoolType, Token, TokenAmount, WAD } from '@balancer/sdk'; import { HookState } from '@balancer-labs/balancer-maths'; import { BasePoolMethodsV3 } from '../basePoolMethodsV3'; import { WeightedPoolTokenWithRate } from '../weighted/weightedPoolTokenWithRate'; @@ -85,7 +85,7 @@ export class LiquidityBootstrappingPoolV3 extends BasePoolV3 implements BasePool if (!poolToken.weight) { throw new Error('Weighted pool token does not have a weight'); } - const token = new BaseToken( + const token = new Token( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -174,7 +174,7 @@ export class LiquidityBootstrappingPoolV3 extends BasePoolV3 implements BasePool this.tokenMap = new Map(tokens.map((token) => [token.token.address, token])); // add BPT to tokenMap, so we can handle add/remove liquidity operations - const bpt = new BaseToken(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); + const bpt = new Token(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); this.tokenMap.set(bpt.address, new WeightedPoolTokenWithRate(bpt, totalShares, -1, WAD, 0n)); this.projectToken = lbpParams.projectToken; @@ -218,7 +218,7 @@ export class LiquidityBootstrappingPoolV3 extends BasePoolV3 implements BasePool return poolState; } - public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: WeightedPoolToken; tOut: WeightedPoolToken } { + public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: WeightedPoolToken; tOut: WeightedPoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV3/quantAmm/quantAmmPool.ts b/modules/sor/lib/poolsV3/quantAmm/quantAmmPool.ts index 96c2d8d57..5edbb999c 100644 --- a/modules/sor/lib/poolsV3/quantAmm/quantAmmPool.ts +++ b/modules/sor/lib/poolsV3/quantAmm/quantAmmPool.ts @@ -1,5 +1,5 @@ import { Address, Hex, parseEther } from 'viem'; -import { BaseToken, TokenAmount, WAD } from '@balancer/sdk'; +import { Token, TokenAmount, WAD } from '@balancer/sdk'; import { QuantAmmState, HookState } from '@balancer-labs/balancer-maths'; import { Chain } from '@prisma/client'; @@ -37,7 +37,7 @@ export class QuantAmmPool extends BasePoolV3 implements BasePoolMethodsV3 { throw new Error('QuantAmm pool token does not have a weight'); } - const token = new BaseToken( + const token = new Token( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -124,7 +124,7 @@ export class QuantAmmPool extends BasePoolV3 implements BasePoolMethodsV3 { this.tokenMap = new Map(tokens.map((token) => [token.token.address, token])); // add BPT to tokenMap, so we can handle add/remove liquidity operations - const bpt = new BaseToken(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); + const bpt = new Token(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); this.tokenMap.set(bpt.address, new WeightedPoolTokenWithRate(bpt, totalShares, -1, WAD, 0n)); this.poolState = this.getPoolState(hookState?.hookType); @@ -157,7 +157,7 @@ export class QuantAmmPool extends BasePoolV3 implements BasePoolMethodsV3 { // Helper methods - public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: QuantAmmPoolToken; tOut: QuantAmmPoolToken } { + public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: QuantAmmPoolToken; tOut: QuantAmmPoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV3/reClamm/reClammPool.ts b/modules/sor/lib/poolsV3/reClamm/reClammPool.ts index 5e24688a6..7f23e9cac 100644 --- a/modules/sor/lib/poolsV3/reClamm/reClammPool.ts +++ b/modules/sor/lib/poolsV3/reClamm/reClammPool.ts @@ -1,5 +1,5 @@ import { Address, Hex, parseEther, parseUnits } from 'viem'; -import { BaseToken } from '@balancer/sdk'; +import { Token } from '@balancer/sdk'; import { HookState, ReClammState, ReClammV2State } from '@balancer-labs/balancer-maths'; import { Chain } from '@prisma/client'; @@ -34,7 +34,7 @@ export class ReClammPool extends BasePoolV3 implements BasePoolMethodsV3 { for (const poolToken of pool.tokens) { if (!poolToken.priceRate) throw new Error(`${pool.type} pool token does not have a price rate`); - const token = new BaseToken( + const token = new Token( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -114,7 +114,7 @@ export class ReClammPool extends BasePoolV3 implements BasePoolMethodsV3 { this.tokenMap = new Map(this.tokens.map((token) => [token.token.address, token])); // add BPT to tokenMap, so we can handle add/remove liquidity operations - const bpt = new BaseToken(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); + const bpt = new Token(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); this.tokenMap.set(bpt.address, new PoolTokenWithRate(bpt, totalShares, -1, WAD)); this.poolState = this.getPoolState(hookState?.hookType); @@ -148,7 +148,7 @@ export class ReClammPool extends BasePoolV3 implements BasePoolMethodsV3 { return poolState; } - public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: ReClammPoolToken; tOut: ReClammPoolToken } { + public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: ReClammPoolToken; tOut: ReClammPoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV3/stable/stablePool.test.ts b/modules/sor/lib/poolsV3/stable/stablePool.test.ts index f7c19dcad..29410045d 100644 --- a/modules/sor/lib/poolsV3/stable/stablePool.test.ts +++ b/modules/sor/lib/poolsV3/stable/stablePool.test.ts @@ -6,7 +6,7 @@ import { PrismaPoolAndHookWithDynamic } from '../../../../../prisma/prisma-types import { WAD } from '../../utils/math'; import { StablePoolV3 } from './stablePool'; -import { BaseToken, TokenAmount } from '@balancer/sdk'; +import { Token, TokenAmount } from '@balancer/sdk'; // keep factories imports at the end - moving up will break the test import { @@ -149,9 +149,9 @@ describe('SOR V3 Stable Pool Tests', () => { expect(poolState).toEqual(stablePoolWithHook.getPoolState('StableSurge')); }); test('results differ when hookState is passed', () => { - const poolToken1 = new BaseToken(1, stablePool.tokens[0].token.address, 18, 'pt1', 'poolToken2'); + const poolToken1 = new Token(1, stablePool.tokens[0].token.address, 18, 'pt1', 'poolToken2'); - const poolToken2 = new BaseToken(1, stablePool.tokens[1].token.address, 18, 'pt2', 'poolToken2'); + const poolToken2 = new Token(1, stablePool.tokens[1].token.address, 18, 'pt2', 'poolToken2'); // If given a high enough swap Amount, the pool with hookState should return a lower amount Out // as it charges the surge Fee. diff --git a/modules/sor/lib/poolsV3/stable/stablePool.ts b/modules/sor/lib/poolsV3/stable/stablePool.ts index d0468a855..a407ec600 100644 --- a/modules/sor/lib/poolsV3/stable/stablePool.ts +++ b/modules/sor/lib/poolsV3/stable/stablePool.ts @@ -1,5 +1,5 @@ import { Address, Hex, parseEther, parseUnits } from 'viem'; -import { PoolType, BaseToken } from '@balancer/sdk'; +import { PoolType, Token } from '@balancer/sdk'; import { StableState, HookState } from '@balancer-labs/balancer-maths'; import { Chain } from '@prisma/client'; @@ -33,7 +33,7 @@ export class StablePoolV3 extends BasePoolV3 implements BasePoolMethodsV3 { for (const poolToken of pool.tokens) { if (!poolToken.priceRate) throw new Error(`${pool.type} pool token does not have a price rate`); - const token = new BaseToken( + const token = new Token( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -97,7 +97,7 @@ export class StablePoolV3 extends BasePoolV3 implements BasePoolMethodsV3 { this.tokenMap = new Map(this.tokens.map((token) => [token.token.address, token])); // add BPT to tokenMap, so we can handle add/remove liquidity operations - const bpt = new BaseToken(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); + const bpt = new Token(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); this.tokenMap.set(bpt.address, new PoolTokenWithRate(bpt, totalShares, -1, WAD)); this.poolState = this.getPoolState(hookState?.hookType); @@ -123,7 +123,7 @@ export class StablePoolV3 extends BasePoolV3 implements BasePoolMethodsV3 { return poolState; } - public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: StablePoolToken; tOut: StablePoolToken } { + public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: StablePoolToken; tOut: StablePoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV3/weighted/weightedPool.ts b/modules/sor/lib/poolsV3/weighted/weightedPool.ts index d3e8304dc..ceb7bc957 100644 --- a/modules/sor/lib/poolsV3/weighted/weightedPool.ts +++ b/modules/sor/lib/poolsV3/weighted/weightedPool.ts @@ -1,5 +1,5 @@ import { Address, Hex, parseEther } from 'viem'; -import { PoolType, BaseToken, TokenAmount, WAD } from '@balancer/sdk'; +import { PoolType, Token, TokenAmount, WAD } from '@balancer/sdk'; import { WeightedState, HookState } from '@balancer-labs/balancer-maths'; import { Chain } from '@prisma/client'; @@ -36,7 +36,7 @@ export class WeightedPoolV3 extends BasePoolV3 implements BasePoolMethodsV3 { throw new Error('Weighted pool token does not have a weight'); } - const token = new BaseToken( + const token = new Token( parseFloat(chainToIdMap[pool.chain]), poolToken.address as Address, poolToken.token.decimals, @@ -101,7 +101,7 @@ export class WeightedPoolV3 extends BasePoolV3 implements BasePoolMethodsV3 { this.tokenMap = new Map(tokens.map((token) => [token.token.address, token])); // add BPT to tokenMap, so we can handle add/remove liquidity operations - const bpt = new BaseToken(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); + const bpt = new Token(tokens[0].token.chainId, this.id, 18, 'BPT', 'BPT'); this.tokenMap.set(bpt.address, new WeightedPoolTokenWithRate(bpt, totalShares, -1, WAD, 0n)); this.poolState = this.getPoolState(hookState?.hookType); @@ -129,7 +129,7 @@ export class WeightedPoolV3 extends BasePoolV3 implements BasePoolMethodsV3 { // Helper methods - public getPoolTokens(tokenIn: BaseToken, tokenOut: BaseToken): { tIn: WeightedPoolToken; tOut: WeightedPoolToken } { + public getPoolTokens(tokenIn: Token, tokenOut: Token): { tIn: WeightedPoolToken; tOut: WeightedPoolToken } { const tIn = this.tokenMap.get(tokenIn.address); const tOut = this.tokenMap.get(tokenOut.address); diff --git a/modules/sor/lib/poolsV3/weighted/weightedPoolTokenWithRate.ts b/modules/sor/lib/poolsV3/weighted/weightedPoolTokenWithRate.ts index 19516727d..d43853ce3 100644 --- a/modules/sor/lib/poolsV3/weighted/weightedPoolTokenWithRate.ts +++ b/modules/sor/lib/poolsV3/weighted/weightedPoolTokenWithRate.ts @@ -1,10 +1,10 @@ -import { BigintIsh, BaseToken } from '@balancer/sdk'; +import { BigintIsh, Token } from '@balancer/sdk'; import { PoolTokenWithRate } from '../../utils'; export class WeightedPoolTokenWithRate extends PoolTokenWithRate { public readonly weight: bigint; - public constructor(token: BaseToken, amount: BigintIsh, index: number, rate: bigint, weight: BigintIsh) { + public constructor(token: Token, amount: BigintIsh, index: number, rate: bigint, weight: BigintIsh) { super(token, amount, index, rate); this.weight = BigInt(weight); } diff --git a/modules/sor/lib/router.ts b/modules/sor/lib/router.ts index 96cbc6dd9..87febf314 100644 --- a/modules/sor/lib/router.ts +++ b/modules/sor/lib/router.ts @@ -1,4 +1,4 @@ -import { SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; +import { SwapKind, Token, TokenAmount } from '@balancer/sdk'; import { PathGraph } from './pathGraph/pathGraph'; import { PathGraphTraversalConfig } from './pathGraph/pathGraphTypes'; import { max, min } from './utils/math'; @@ -17,8 +17,8 @@ export class Router { } public getCandidatePaths( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, pools: BasePool[], swapAmount: TokenAmount, swapKind: SwapKind, diff --git a/modules/sor/lib/sor.ts b/modules/sor/lib/sor.ts index 9610a5db5..2634d0d12 100644 --- a/modules/sor/lib/sor.ts +++ b/modules/sor/lib/sor.ts @@ -1,4 +1,4 @@ -import { SwapKind, BaseToken } from '@balancer/sdk'; +import { SwapKind, Token } from '@balancer/sdk'; import { Router } from './router'; import { PrismaPoolAndHookWithDynamic } from '../../../prisma/prisma-types'; @@ -30,8 +30,8 @@ import { BufferPoolData } from '../utils/data'; export class SOR { static async getPathsWithPools( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, swapKind: SwapKind, swapAmountEvm: bigint, prismaPools: PrismaPoolAndHookWithDynamic[], diff --git a/modules/sor/lib/utils/basePoolToken.ts b/modules/sor/lib/utils/basePoolToken.ts index 0c5502817..a19edb5f1 100644 --- a/modules/sor/lib/utils/basePoolToken.ts +++ b/modules/sor/lib/utils/basePoolToken.ts @@ -1,9 +1,9 @@ -import { BigintIsh, BaseToken, TokenAmount } from '@balancer/sdk'; +import { BigintIsh, Token, TokenAmount } from '@balancer/sdk'; export class BasePoolToken extends TokenAmount { public readonly index: number; - public constructor(token: BaseToken, amount: BigintIsh, index: number) { + public constructor(token: Token, amount: BigintIsh, index: number) { super(token, amount); this.index = index; } diff --git a/modules/sor/lib/utils/helpers.ts b/modules/sor/lib/utils/helpers.ts index a94394d85..757d91b67 100644 --- a/modules/sor/lib/utils/helpers.ts +++ b/modules/sor/lib/utils/helpers.ts @@ -1,4 +1,4 @@ -import { BigintIsh, SwapKind, BaseToken, TokenAmount } from '@balancer/sdk'; +import { BigintIsh, SwapKind, Token, TokenAmount } from '@balancer/sdk'; import { PathWithAmount } from '../path'; import { HookState } from '@balancer-labs/balancer-maths'; @@ -8,8 +8,8 @@ import { parseEther, parseUnits } from 'viem'; import { PrismaPoolAndHookWithDynamic, HookData } from '../../../../prisma/prisma-types'; export function checkInputs( - tokenIn: BaseToken, - tokenOut: BaseToken, + tokenIn: Token, + tokenOut: Token, swapKind: SwapKind, swapAmount: BigintIsh | TokenAmount, ): TokenAmount { diff --git a/modules/sor/lib/utils/poolTokenWithRate.ts b/modules/sor/lib/utils/poolTokenWithRate.ts index 5a56821c0..b102fe739 100644 --- a/modules/sor/lib/utils/poolTokenWithRate.ts +++ b/modules/sor/lib/utils/poolTokenWithRate.ts @@ -1,10 +1,10 @@ -import { BigintIsh, DECIMAL_SCALES, MathSol, BaseToken, TokenAmount, WAD } from '@balancer/sdk'; +import { BigintIsh, DECIMAL_SCALES, MathSol, Token, TokenAmount, WAD } from '@balancer/sdk'; import { BasePoolToken } from './basePoolToken'; export class PoolTokenWithRate extends BasePoolToken { public readonly rate: bigint; - public constructor(token: BaseToken, amount: BigintIsh, index: number, rate: BigintIsh) { + public constructor(token: Token, amount: BigintIsh, index: number, rate: BigintIsh) { super(token, amount, index); this.rate = BigInt(rate); this.scale18 = (this.amount * this.scalar * this.rate) / WAD; @@ -27,7 +27,7 @@ export class PoolTokenWithRate extends BasePoolToken { } static fromScale18AmountWithRate( - token: BaseToken, + token: Token, scale18: bigint, rate: bigint, index: number, diff --git a/modules/sor/utils/helpers.ts b/modules/sor/utils/helpers.ts index 20225d174..e4ef51582 100644 --- a/modules/sor/utils/helpers.ts +++ b/modules/sor/utils/helpers.ts @@ -4,7 +4,7 @@ import { chainToChainId as chainToIdMap } from '../../network/chain-id-to-chain' import { GqlSorGetSwapPaths } from '../../../apps/api/gql/generated-schema'; import { replaceZeroAddressWithEth } from '../../web3/addresses'; import { Address } from 'viem'; -import { BaseToken, TokenAmount } from '@balancer/sdk'; +import { Token, TokenAmount } from '@balancer/sdk'; import config from '../../../config'; export async function getTokenAmountHuman(tokenAddr: string, humanAmount: string, chain: Chain): Promise { @@ -23,13 +23,13 @@ export async function getTokenAmountRaw(tokenAddr: string, rawAmount: string, ch * @param chain * @returns */ -export const getToken = async (tokenAddr: string, chain: Chain): Promise => { +export const getToken = async (tokenAddr: string, chain: Chain): Promise => { if (tokenAddr === config[chain].eth.address) { - return new BaseToken(parseInt(chainToIdMap[chain]), config[chain].weth.address as Address, 18); + return new Token(parseInt(chainToIdMap[chain]), config[chain].weth.address as Address, 18); } else { const decimals = await tokenService.getTokenDecimals(tokenAddr, chain); if (!decimals) throw Error(`Missing token from tokenService ${tokenAddr}`); - return new BaseToken(parseInt(chainToIdMap[chain]), tokenAddr as Address, decimals); + return new Token(parseInt(chainToIdMap[chain]), tokenAddr as Address, decimals); } }; diff --git a/test/factories/sor/stable-pool.factory.ts b/test/factories/sor/stable-pool.factory.ts index 3b3bcb704..9a5bb3e14 100644 --- a/test/factories/sor/stable-pool.factory.ts +++ b/test/factories/sor/stable-pool.factory.ts @@ -1,7 +1,7 @@ // stablePoolFactory.ts import { Factory } from 'fishery'; import { faker } from '@faker-js/faker'; -import { BaseToken, TokenAmount } from '@balancer/sdk'; +import { Token, TokenAmount } from '@balancer/sdk'; import { Chain } from '@prisma/client'; import { parseEther, parseUnits, Address } from 'viem'; import { TokenPairData } from '../../../modules/sources/contracts/v3/fetch-tokenpair-data'; @@ -30,7 +30,7 @@ export const StablePoolFactory = Factory.define(({ params }) => { const tokens = params.tokens || Array.from({ length: 3 }, (_, index) => { - const token = new BaseToken( + const token = new Token( parseFloat(faker.number.int({ min: 1, max: 1000 }).toString()), faker.finance.ethereumAddress() as Address, 18, diff --git a/test/testData/read/mapping.ts b/test/testData/read/mapping.ts index afec5a321..fe51f70ab 100644 --- a/test/testData/read/mapping.ts +++ b/test/testData/read/mapping.ts @@ -1,5 +1,5 @@ import { Address, formatEther, formatUnits } from 'viem'; -import { isSameAddress, BaseToken } from '@balancer/sdk'; +import { isSameAddress, Token } from '@balancer/sdk'; import { PoolTokenWithRate } from '../../../modules/sor/lib/utils'; import { PrismaPoolAndHookWithDynamic } from '../../../prisma/prisma-types'; @@ -28,10 +28,10 @@ export function mapGyroPoolStateToPrismaPool( ); const poolTokens = poolState.tokens.map( - (token: string, i: number) => new BaseToken(chainId, token as Address, decimals[i]), + (token: string, i: number) => new Token(chainId, token as Address, decimals[i]), ); - const tokenAmounts = poolTokens.map((token: BaseToken, i: number) => + const tokenAmounts = poolTokens.map((token: Token, i: number) => PoolTokenWithRate.fromScale18AmountWithRate( token, poolState.balancesLiveScaled18[i], @@ -118,10 +118,10 @@ export function mapStablePoolStateToPrismaPool( ); const poolTokens = poolState.tokens.map( - (token: string, i: number) => new BaseToken(chainId, token as Address, decimals[i]), + (token: string, i: number) => new Token(chainId, token as Address, decimals[i]), ); - const tokenAmounts = poolTokens.map((token: BaseToken, i: number) => + const tokenAmounts = poolTokens.map((token: Token, i: number) => PoolTokenWithRate.fromScale18AmountWithRate( token, poolState.balancesLiveScaled18[i], @@ -189,10 +189,10 @@ export function mapWeightedPoolStateToPrismaPool( ); const poolTokens = poolState.tokens.map( - (token: string, i: number) => new BaseToken(chainId, token as Address, decimals[i]), + (token: string, i: number) => new Token(chainId, token as Address, decimals[i]), ); - const tokenAmounts = poolTokens.map((token: BaseToken, i: number) => + const tokenAmounts = poolTokens.map((token: Token, i: number) => PoolTokenWithRate.fromScale18AmountWithRate( token, poolState.balancesLiveScaled18[i], @@ -261,10 +261,10 @@ export function mapLiquidityBootstrappingPoolStateToPrismaPool( ); const poolTokens = poolState.tokens.map( - (token: string, i: number) => new BaseToken(chainId, token as Address, decimals[i]), + (token: string, i: number) => new Token(chainId, token as Address, decimals[i]), ); - const tokenAmounts = poolTokens.map((token: BaseToken, i: number) => + const tokenAmounts = poolTokens.map((token: Token, i: number) => PoolTokenWithRate.fromScale18AmountWithRate( token, poolState.balancesLiveScaled18[i], @@ -342,10 +342,10 @@ export function mapReClammPoolStateToPrismaPool( ); const poolTokens = poolState.tokens.map( - (token: string, i: number) => new BaseToken(chainId, token as Address, decimals[i]), + (token: string, i: number) => new Token(chainId, token as Address, decimals[i]), ); - const tokenAmounts = poolTokens.map((token: BaseToken, i: number) => + const tokenAmounts = poolTokens.map((token: Token, i: number) => PoolTokenWithRate.fromScale18AmountWithRate( token, poolState.balancesLiveScaled18[i], @@ -427,10 +427,10 @@ export function mapQuantAmmPoolStateToPrismaPool( ); const poolTokens = poolState.tokens.map( - (token: string, i: number) => new BaseToken(chainId, token as Address, decimals[i]), + (token: string, i: number) => new Token(chainId, token as Address, decimals[i]), ); - const tokenAmounts = poolTokens.map((token: BaseToken, i: number) => + const tokenAmounts = poolTokens.map((token: Token, i: number) => PoolTokenWithRate.fromScale18AmountWithRate( token, poolState.balancesLiveScaled18[i], diff --git a/test/utils.ts b/test/utils.ts index fbe23eb71..30d7b7bf6 100644 --- a/test/utils.ts +++ b/test/utils.ts @@ -1,7 +1,7 @@ import { randomBytes } from 'crypto'; import { providers } from 'ethers'; import { mainnetNetworkConfig } from '../modules/network/mainnet'; -import { BaseToken } from '@balancer/sdk'; +import { Token } from '@balancer/sdk'; import { PrismaPoolAndHookWithDynamic } from '../prisma/prisma-types'; import { isSameAddress } from '@balancer/sdk'; import { Address } from 'viem'; @@ -60,8 +60,8 @@ export function getTokensFromPrismaPools( tokens: string[], bufferPools: BufferPoolData[], ): { - tokenIn: BaseToken; - tokenOut: BaseToken; + tokenIn: Token; + tokenOut: Token; } { const prismaTokens = supportedPools.flatMap((p) => p.tokens.map((t) => ({ address: t.token.address as Address, decimals: t.token.decimals })), @@ -75,7 +75,7 @@ export function getTokensFromPrismaPools( const prismaTokenIn = prismaTokens.find((p) => isSameAddress(p.address, tokens[0] as Address))!; const prismaTokenOut = prismaTokens.find((p) => isSameAddress(p.address, tokens[tokens.length - 1] as Address))!; - const tokenIn = new BaseToken(chainId, prismaTokenIn.address, prismaTokenIn.decimals); - const tokenOut = new BaseToken(chainId, prismaTokenOut.address, prismaTokenOut.decimals); + const tokenIn = new Token(chainId, prismaTokenIn.address, prismaTokenIn.decimals); + const tokenOut = new Token(chainId, prismaTokenOut.address, prismaTokenOut.decimals); return { tokenIn, tokenOut }; } From 0e700868179c22459c31953a35e442a62939e7b6 Mon Sep 17 00:00:00 2001 From: mkflow27 Date: Tue, 14 Oct 2025 16:51:39 +0200 Subject: [PATCH 7/7] chore: add changeset --- .changeset/hot-chefs-press.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/hot-chefs-press.md diff --git a/.changeset/hot-chefs-press.md b/.changeset/hot-chefs-press.md new file mode 100644 index 000000000..d633c0dc7 --- /dev/null +++ b/.changeset/hot-chefs-press.md @@ -0,0 +1,5 @@ +--- +'backend': minor +--- + +replace wrapped functionality with accessing address & refactor to use scoped down Token functionality (removal of isUnderlyingEqual)