From d6025ac213755f88a678705b95afbe73f25e67f9 Mon Sep 17 00:00:00 2001 From: Alberto Gualis Date: Thu, 11 Jan 2024 13:14:32 +0100 Subject: [PATCH 1/5] Simplify remove liquidity types --- .../pool/actions/LiquidityActionHelpers.ts | 15 +++++++ .../handlers/AddLiquidity.handler.ts | 1 - .../UnbalancedAddLiquidity.handler.ts | 20 +++------- ...emoveLiquidity.handler.integration.spec.ts | 28 +++++++------ .../ProportionalRemoveLiquidity.handler.ts | 40 ++++++++----------- .../handlers/RemoveLiquidity.handler.ts | 16 ++++---- ...emoveLiquidity.handler.integration.spec.ts | 33 ++++++++------- .../SingleTokenRemoveLiquidity.handler.ts | 40 ++++++++----------- .../useRemoveLiquidityBuildCallDataQuery.ts | 6 +-- .../remove-liquidity.types.ts | 32 ++++++--------- 10 files changed, 111 insertions(+), 120 deletions(-) diff --git a/lib/modules/pool/actions/LiquidityActionHelpers.ts b/lib/modules/pool/actions/LiquidityActionHelpers.ts index 93c476c9b..c30690214 100644 --- a/lib/modules/pool/actions/LiquidityActionHelpers.ts +++ b/lib/modules/pool/actions/LiquidityActionHelpers.ts @@ -10,6 +10,7 @@ import { toPoolStateInput } from '../pool.helpers' import { Pool } from '../usePool' import { HumanAmountIn } from './liquidity-types' import { GqlToken } from '@/lib/shared/services/api/generated/graphql' +import { SentryError } from '@/lib/shared/utils/errors' // Null object used to avoid conditional checks during hook loading state const NullPool: Pool = { @@ -106,3 +107,17 @@ export const hasValidHumanAmounts = (humanAmountsIn: HumanAmountIn[]) => export function toHumanAmount(tokenAmount: TokenAmount): HumanAmount { return formatUnits(tokenAmount.amount, tokenAmount.token.decimals) as HumanAmount } + +export function ensureLastQueryLoaded(liquidityActionDescription: string, queryResponse?: Q): Q { + if (!queryResponse) { + // This should never happen because we don't allow the user to trigger buildLiquidityCallData + // before the query is loaded. + console.error(`Missing queryResponse in ${liquidityActionDescription}`) + throw new SentryError( + `Missing queryResponse. +It looks that you tried to call useBuildCallData before the last query finished generating queryResponse` + ) + } + + return queryResponse +} diff --git a/lib/modules/pool/actions/add-liquidity/handlers/AddLiquidity.handler.ts b/lib/modules/pool/actions/add-liquidity/handlers/AddLiquidity.handler.ts index 7a9edd762..26e3cbdcc 100644 --- a/lib/modules/pool/actions/add-liquidity/handlers/AddLiquidity.handler.ts +++ b/lib/modules/pool/actions/add-liquidity/handlers/AddLiquidity.handler.ts @@ -24,7 +24,6 @@ export interface AddLiquidityHandler { /* Build tx callData payload for adding liquidity It is responsibility of the UI to avoid calling buildAddLiquidityCallData before the last queryAddLiquidity was finished - ("Next" button will be disabled if the react-query calling queryAddLiquidity is in loading state) */ buildAddLiquidityCallData(inputs: BuildAddLiquidityInputs): Promise } diff --git a/lib/modules/pool/actions/add-liquidity/handlers/UnbalancedAddLiquidity.handler.ts b/lib/modules/pool/actions/add-liquidity/handlers/UnbalancedAddLiquidity.handler.ts index 86d628633..fb97038ae 100644 --- a/lib/modules/pool/actions/add-liquidity/handlers/UnbalancedAddLiquidity.handler.ts +++ b/lib/modules/pool/actions/add-liquidity/handlers/UnbalancedAddLiquidity.handler.ts @@ -11,11 +11,14 @@ import { Slippage, } from '@balancer/sdk' import { Pool } from '../../../usePool' -import { LiquidityActionHelpers, areEmptyAmounts } from '../../LiquidityActionHelpers' +import { + LiquidityActionHelpers, + areEmptyAmounts, + ensureLastQueryLoaded, +} from '../../LiquidityActionHelpers' import { HumanAmountIn } from '../../liquidity-types' import { BuildAddLiquidityInputs, QueryAddLiquidityOutput } from '../add-liquidity.types' import { AddLiquidityHandler } from './AddLiquidity.handler' -import { SentryError } from '@/lib/shared/utils/errors' /** * UnbalancedAddLiquidityHandler is a handler that implements the @@ -61,22 +64,11 @@ export class UnbalancedAddLiquidityHandler implements AddLiquidityHandler { return priceImpactABA.decimal } - /* - sdkQueryOutput is the result of the query that we run in the add liquidity form - */ public async buildAddLiquidityCallData({ account, slippagePercent, }: BuildAddLiquidityInputs): Promise { - if (!this.queryResponse) { - // This should never happen because we don't allow the user to trigger buildAddLiquidityCallData - // before the query is loaded. - console.error('Missing queryResponse.') - throw new SentryError( - `Missing queryResponse. -It looks that you tried to call useBuildCallData before the last query finished generating queryResponse` - ) - } + this.queryResponse = ensureLastQueryLoaded('Unbalanced add liquidity', this.queryResponse) const addLiquidity = new AddLiquidity() diff --git a/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.integration.spec.ts b/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.integration.spec.ts index 79496f0b6..53f28f3da 100644 --- a/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.integration.spec.ts +++ b/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.integration.spec.ts @@ -4,26 +4,30 @@ import { aBalWethPoolElementMock } from '@/test/msw/builders/gqlPoolElement.buil import { defaultTestUserAccount } from '@/test/utils/wagmi' import { aPhantomStablePoolStateInputMock } from '../../../__mocks__/pool.builders' import { Pool } from '../../../usePool' -import { RemoveLiquidityInputs, RemoveLiquidityType } from '../remove-liquidity.types' +import { QueryRemoveLiquidityInputs, RemoveLiquidityType } from '../remove-liquidity.types' import { selectRemoveLiquidityHandler } from './selectRemoveLiquidityHandler' +import { ProportionalRemoveLiquidityHandler } from './ProportionalRemoveLiquidity.handler' const poolMock = aBalWethPoolElementMock() // 80BAL-20WETH -function selectProportionalHandler(pool: Pool) { - return selectRemoveLiquidityHandler(pool, RemoveLiquidityType.Proportional) +function selectProportionalHandler(pool: Pool): ProportionalRemoveLiquidityHandler { + return selectRemoveLiquidityHandler( + pool, + RemoveLiquidityType.Proportional + ) as ProportionalRemoveLiquidityHandler } -const inputs: RemoveLiquidityInputs = { +const defaultQueryInput: QueryRemoveLiquidityInputs = { humanBptIn: '1', - account: defaultTestUserAccount, - slippagePercent: '0.2', } +const defaultBuildInput = { account: defaultTestUserAccount, slippagePercent: '0.2' } + describe('When proportionally removing liquidity for a weighted pool', () => { test('returns ZERO price impact', async () => { const handler = selectProportionalHandler(poolMock) - const result = await handler.queryRemoveLiquidity(inputs) + const result = await handler.queryRemoveLiquidity(defaultQueryInput) const [balTokenAmountOut, wEthTokenAmountOut] = result.amountsOut @@ -36,7 +40,7 @@ describe('When proportionally removing liquidity for a weighted pool', () => { test('queries amounts out', async () => { const handler = selectProportionalHandler(poolMock) - const result = await handler.queryRemoveLiquidity(inputs) + const result = await handler.queryRemoveLiquidity(defaultQueryInput) const [balTokenAmountOut, wEthTokenAmountOut] = result.amountsOut @@ -50,9 +54,9 @@ describe('When proportionally removing liquidity for a weighted pool', () => { test('builds Tx Config', async () => { const handler = selectProportionalHandler(poolMock) - const { sdkQueryOutput } = await handler.queryRemoveLiquidity(inputs) + await handler.queryRemoveLiquidity(defaultQueryInput) - const result = await handler.buildRemoveLiquidityTx({ inputs, sdkQueryOutput }) + const result = await handler.buildRemoveLiquidityCallData(defaultBuildInput) expect(result.to).toBe(networkConfig.contracts.balancer.vaultV2) expect(result.data).toBeDefined() @@ -65,9 +69,9 @@ describe('When removing liquidity from a stable pool', () => { const handler = selectProportionalHandler(pool) - const { sdkQueryOutput } = await handler.queryRemoveLiquidity(inputs) + await handler.queryRemoveLiquidity(defaultQueryInput) - const result = await handler.buildRemoveLiquidityTx({ inputs, sdkQueryOutput }) + const result = await handler.buildRemoveLiquidityCallData(defaultBuildInput) expect(result.account).toBe(defaultTestUserAccount) }) }) diff --git a/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.ts b/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.ts index e64d878ef..15c9d4a62 100644 --- a/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.ts +++ b/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.ts @@ -12,17 +12,17 @@ import { import { Address, parseEther } from 'viem' import { BPT_DECIMALS } from '../../../pool.constants' import { Pool } from '../../../usePool' -import { LiquidityActionHelpers } from '../../LiquidityActionHelpers' +import { LiquidityActionHelpers, ensureLastQueryLoaded } from '../../LiquidityActionHelpers' import { - BuildLiquidityInputs, - RemoveLiquidityInputs, - RemoveLiquidityOutputs, + BuildRemoveLiquidityInputs, + QueryRemoveLiquidityInputs, + QueryRemoveLiquidityOutput, } from '../remove-liquidity.types' import { RemoveLiquidityHandler } from './RemoveLiquidity.handler' export class ProportionalRemoveLiquidityHandler implements RemoveLiquidityHandler { helpers: LiquidityActionHelpers - sdkQueryOutput?: RemoveLiquidityQueryOutput + queryResponse?: RemoveLiquidityQueryOutput constructor(pool: Pool) { this.helpers = new LiquidityActionHelpers(pool) @@ -30,16 +30,18 @@ export class ProportionalRemoveLiquidityHandler implements RemoveLiquidityHandle public async queryRemoveLiquidity({ humanBptIn: bptIn, - }: RemoveLiquidityInputs): Promise { + }: QueryRemoveLiquidityInputs): Promise { + // Deletes the previous queryResponse to enforce that we don't buildCallData with an outdated queryResponse (while a new one is loading) + this.queryResponse = undefined const removeLiquidity = new RemoveLiquidity() const removeLiquidityInput = this.constructSdkInput(bptIn) - this.sdkQueryOutput = await removeLiquidity.query( + this.queryResponse = await removeLiquidity.query( removeLiquidityInput, this.helpers.poolStateInput ) - return { amountsOut: this.sdkQueryOutput.amountsOut } + return { amountsOut: this.queryResponse.amountsOut } } public async calculatePriceImpact(): Promise { @@ -47,26 +49,16 @@ export class ProportionalRemoveLiquidityHandler implements RemoveLiquidityHandle return 0 } - /* - sdkQueryOutput is the result of the query that we run in the remove liquidity form - */ - public async buildRemoveLiquidityTx( - buildInputs: BuildLiquidityInputs - ): Promise { - const { account, slippagePercent } = buildInputs.inputs - if (!account || !slippagePercent) throw new Error('Missing account or slippage') - if (!this.sdkQueryOutput) { - console.error('Missing sdkQueryOutput in buildRemoveLiquidityTx') - throw new Error( - `Missing sdkQueryOutput. -It looks that you did not call useRemoveLiquidityBtpOutQuery before trying to build the tx config` - ) - } + public async buildRemoveLiquidityCallData({ + account, + slippagePercent, + }: BuildRemoveLiquidityInputs): Promise { + this.queryResponse = ensureLastQueryLoaded('Proportional remove liquidity', this.queryResponse) const removeLiquidity = new RemoveLiquidity() const { call, to, value } = removeLiquidity.buildCall({ - ...this.sdkQueryOutput, + ...this.queryResponse, slippage: Slippage.fromPercentage(`${Number(slippagePercent)}`), sender: account, recipient: account, diff --git a/lib/modules/pool/actions/remove-liquidity/handlers/RemoveLiquidity.handler.ts b/lib/modules/pool/actions/remove-liquidity/handlers/RemoveLiquidity.handler.ts index af4c4830c..3bed6016d 100644 --- a/lib/modules/pool/actions/remove-liquidity/handlers/RemoveLiquidity.handler.ts +++ b/lib/modules/pool/actions/remove-liquidity/handlers/RemoveLiquidity.handler.ts @@ -1,8 +1,8 @@ import { TransactionConfig } from '@/lib/modules/web3/contracts/contract.types' import { - RemoveLiquidityInputs, - RemoveLiquidityOutputs, - BuildLiquidityInputs, + QueryRemoveLiquidityInputs, + BuildRemoveLiquidityInputs, + QueryRemoveLiquidityOutput, } from '../remove-liquidity.types' /** @@ -12,9 +12,11 @@ import { */ export interface RemoveLiquidityHandler { // Query the SDK for the expected output of removing liquidity - queryRemoveLiquidity(inputs: RemoveLiquidityInputs): Promise + queryRemoveLiquidity(inputs: QueryRemoveLiquidityInputs): Promise // Calculate the price impact of removing liquidity - calculatePriceImpact(inputs: RemoveLiquidityInputs): Promise - // Build tx payload for removing liquidity - buildRemoveLiquidityTx(inputs: BuildLiquidityInputs): Promise + calculatePriceImpact(inputs: QueryRemoveLiquidityInputs): Promise + /* + Build tx callData payload for removing liquidity + It is responsibility of the UI to avoid calling buildRemoveLiquidityCallData before the last queryRemoveLiquidity was finished + */ buildRemoveLiquidityCallData(inputs: BuildRemoveLiquidityInputs): Promise } diff --git a/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.integration.spec.ts b/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.integration.spec.ts index 59e74896d..559ea846c 100644 --- a/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.integration.spec.ts +++ b/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.integration.spec.ts @@ -3,26 +3,31 @@ import { balAddress, wETHAddress } from '@/lib/debug-helpers' import { aBalWethPoolElementMock } from '@/test/msw/builders/gqlPoolElement.builders' import { defaultTestUserAccount } from '@/test/utils/wagmi' import { Pool } from '../../../usePool' -import { RemoveLiquidityInputs, RemoveLiquidityType } from '../remove-liquidity.types' +import { QueryRemoveLiquidityInputs, RemoveLiquidityType } from '../remove-liquidity.types' import { selectRemoveLiquidityHandler } from './selectRemoveLiquidityHandler' +import { SingleTokenRemoveLiquidityHandler } from './SingleTokenRemoveLiquidity.handler' const poolMock = aBalWethPoolElementMock() // 80BAL-20WETH -function selectSingleTokenHandler(pool: Pool) { - return selectRemoveLiquidityHandler(pool, RemoveLiquidityType.SingleToken) +function selectSingleTokenHandler(pool: Pool): SingleTokenRemoveLiquidityHandler { + return selectRemoveLiquidityHandler( + pool, + RemoveLiquidityType.SingleToken + ) as SingleTokenRemoveLiquidityHandler } +const defaultQueryInput: QueryRemoveLiquidityInputs = { + humanBptIn: '1', + tokenOut: balAddress, +} + +const defaultBuildInput = { account: defaultTestUserAccount, slippagePercent: '0.2' } + describe('When removing unbalanced liquidity for a weighted pool', () => { test('queries amounts out', async () => { - const inputs: RemoveLiquidityInputs = { - humanBptIn: '1', - account: defaultTestUserAccount, - tokenOut: balAddress, - } - const handler = selectSingleTokenHandler(poolMock) - const result = await handler.queryRemoveLiquidity(inputs) + const result = await handler.queryRemoveLiquidity(defaultQueryInput) const [balTokenAmountOut, wEthTokenAmountOut] = result.amountsOut @@ -36,16 +41,14 @@ describe('When removing unbalanced liquidity for a weighted pool', () => { test('builds Tx Config', async () => { const handler = selectSingleTokenHandler(poolMock) - const inputs: RemoveLiquidityInputs = { + const inputs: QueryRemoveLiquidityInputs = { humanBptIn: '1', - account: defaultTestUserAccount, - slippagePercent: '0.2', tokenOut: balAddress, } - const { sdkQueryOutput } = await handler.queryRemoveLiquidity(inputs) + await handler.queryRemoveLiquidity(inputs) - const result = await handler.buildRemoveLiquidityTx({ inputs, sdkQueryOutput }) + const result = await handler.buildRemoveLiquidityCallData(defaultBuildInput) expect(result.to).toBe(networkConfig.contracts.balancer.vaultV2) expect(result.data).toBeDefined() diff --git a/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.ts b/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.ts index d0ee956a4..f944d6dc7 100644 --- a/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.ts +++ b/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.ts @@ -14,17 +14,21 @@ import { import { Address, parseEther } from 'viem' import { BPT_DECIMALS } from '../../../pool.constants' import { Pool } from '../../../usePool' -import { LiquidityActionHelpers, isEmptyHumanAmount } from '../../LiquidityActionHelpers' import { - BuildLiquidityInputs, - RemoveLiquidityOutputs, + LiquidityActionHelpers, + ensureLastQueryLoaded, + isEmptyHumanAmount, +} from '../../LiquidityActionHelpers' +import { + BuildRemoveLiquidityInputs, + QueryRemoveLiquidityOutput, SingleTokenRemoveLiquidityInputs, } from '../remove-liquidity.types' import { RemoveLiquidityHandler } from './RemoveLiquidity.handler' export class SingleTokenRemoveLiquidityHandler implements RemoveLiquidityHandler { helpers: LiquidityActionHelpers - sdkQueryOutput?: RemoveLiquidityQueryOutput + queryResponse?: RemoveLiquidityQueryOutput constructor(pool: Pool) { this.helpers = new LiquidityActionHelpers(pool) @@ -33,18 +37,18 @@ export class SingleTokenRemoveLiquidityHandler implements RemoveLiquidityHandler public async queryRemoveLiquidity({ humanBptIn, tokenOut, - }: SingleTokenRemoveLiquidityInputs): Promise { + }: SingleTokenRemoveLiquidityInputs): Promise { if (!tokenOut) return { amountsOut: [] } const removeLiquidity = new RemoveLiquidity() const removeLiquidityInput = this.constructSdkInput(humanBptIn, tokenOut) - this.sdkQueryOutput = await removeLiquidity.query( + this.queryResponse = await removeLiquidity.query( removeLiquidityInput, this.helpers.poolStateInput ) - return { amountsOut: this.sdkQueryOutput.amountsOut } + return { amountsOut: this.queryResponse.amountsOut } } public async calculatePriceImpact({ @@ -66,26 +70,16 @@ export class SingleTokenRemoveLiquidityHandler implements RemoveLiquidityHandler return priceImpactABA.decimal } - /* - sdkQueryOutput is the result of the query that we run in the remove liquidity form - */ - public async buildRemoveLiquidityTx( - buildInputs: BuildLiquidityInputs - ): Promise { - const { account, slippagePercent } = buildInputs.inputs - if (!account || !slippagePercent) throw new Error('Missing account or slippage') - if (!this.sdkQueryOutput) { - console.error('Missing sdkQueryOutput in buildRemoveLiquidityTx') - throw new Error( - `Missing sdkQueryOutput. -It looks that you did not call useRemoveLiquidityBtpOutQuery before trying to build the tx config` - ) - } + public async buildRemoveLiquidityCallData({ + account, + slippagePercent, + }: BuildRemoveLiquidityInputs): Promise { + this.queryResponse = ensureLastQueryLoaded('Single token remove liquidity', this.queryResponse) const removeLiquidity = new RemoveLiquidity() const { call, to, value } = removeLiquidity.buildCall({ - ...this.sdkQueryOutput, + ...this.queryResponse, slippage: Slippage.fromPercentage(`${Number(slippagePercent)}`), sender: account, recipient: account, diff --git a/lib/modules/pool/actions/remove-liquidity/queries/useRemoveLiquidityBuildCallDataQuery.ts b/lib/modules/pool/actions/remove-liquidity/queries/useRemoveLiquidityBuildCallDataQuery.ts index 655d2fb42..8a9947f3a 100644 --- a/lib/modules/pool/actions/remove-liquidity/queries/useRemoveLiquidityBuildCallDataQuery.ts +++ b/lib/modules/pool/actions/remove-liquidity/queries/useRemoveLiquidityBuildCallDataQuery.ts @@ -29,12 +29,10 @@ export function useRemoveLiquidityBuildCallDataQuery( tokenOut, }), async () => { - const inputs = { - humanBptIn, + return handler.buildRemoveLiquidityCallData({ account: userAddress, slippagePercent: slippage, - } - return handler.buildRemoveLiquidityTx({ inputs }) + }) }, { enabled: diff --git a/lib/modules/pool/actions/remove-liquidity/remove-liquidity.types.ts b/lib/modules/pool/actions/remove-liquidity/remove-liquidity.types.ts index 3a1d289e5..be4d3d720 100644 --- a/lib/modules/pool/actions/remove-liquidity/remove-liquidity.types.ts +++ b/lib/modules/pool/actions/remove-liquidity/remove-liquidity.types.ts @@ -1,42 +1,34 @@ import { HumanAmount, - RemoveLiquidityQueryOutput, RemoveLiquidityKind as SdkRemoveLiquidityKind, TokenAmount, } from '@balancer/sdk' import { Address } from 'wagmi' -type CommonRemoveLiquidityInputs = { account?: Address; slippagePercent?: string } +// There are other kinds but we only support two of them +export enum RemoveLiquidityType { + Proportional = SdkRemoveLiquidityKind.Proportional, + SingleToken = SdkRemoveLiquidityKind.SingleToken, +} export type ProportionalRemoveLiquidityInputs = { humanBptIn: HumanAmount -} & CommonRemoveLiquidityInputs +} export type SingleTokenRemoveLiquidityInputs = { humanBptIn: HumanAmount tokenOut: Address -} & CommonRemoveLiquidityInputs +} -export type RemoveLiquidityInputs = +export type QueryRemoveLiquidityInputs = | ProportionalRemoveLiquidityInputs | SingleTokenRemoveLiquidityInputs -// sdkQueryOutput is optional because it will be only used in cases where we use the SDK to query/build the transaction -// We will probably need a more abstract interface to be used by edge cases -export type RemoveLiquidityOutputs = { +export type QueryRemoveLiquidityOutput = { amountsOut: TokenAmount[] - sdkQueryOutput?: RemoveLiquidityQueryOutput } -// sdkQueryOutput is optional because it will be only used in cases where we use the SDK to query/build the transaction -// We will probably need a more abstract interface to be used by edge cases -export type BuildLiquidityInputs = { - inputs: RemoveLiquidityInputs - sdkQueryOutput?: RemoveLiquidityQueryOutput -} - -// There are other kinds but we only support two of them -export enum RemoveLiquidityType { - Proportional = SdkRemoveLiquidityKind.Proportional, - SingleToken = SdkRemoveLiquidityKind.SingleToken, +export type BuildRemoveLiquidityInputs = { + account: Address + slippagePercent: string } From 673d185e1a8ff7688eb0317b62a47590160a7b98 Mon Sep 17 00:00:00 2001 From: Alberto Gualis Date: Thu, 11 Jan 2024 13:17:51 +0100 Subject: [PATCH 2/5] Rename inputs to input --- .../actions/add-liquidity/add-liquidity.types.ts | 2 +- .../add-liquidity/handlers/AddLiquidity.handler.ts | 4 ++-- .../handlers/TwammAddLiquidity.handler.ts | 4 ++-- .../handlers/UnbalancedAddLiquidity.handler.ts | 4 ++-- ...tionalRemoveLiquidity.handler.integration.spec.ts | 4 ++-- .../handlers/ProportionalRemoveLiquidity.handler.ts | 8 ++++---- .../handlers/RemoveLiquidity.handler.ts | 10 +++++----- ...eTokenRemoveLiquidity.handler.integration.spec.ts | 6 +++--- .../handlers/SingleTokenRemoveLiquidity.handler.ts | 10 +++++----- .../remove-liquidity/remove-liquidity.types.ts | 12 ++++++------ 10 files changed, 32 insertions(+), 32 deletions(-) diff --git a/lib/modules/pool/actions/add-liquidity/add-liquidity.types.ts b/lib/modules/pool/actions/add-liquidity/add-liquidity.types.ts index 351ed6d67..279ef5b54 100644 --- a/lib/modules/pool/actions/add-liquidity/add-liquidity.types.ts +++ b/lib/modules/pool/actions/add-liquidity/add-liquidity.types.ts @@ -5,7 +5,7 @@ export type QueryAddLiquidityOutput = { bptOut: TokenAmount } -export type BuildAddLiquidityInputs = { +export type BuildAddLiquidityInput = { account: Address slippagePercent: string } diff --git a/lib/modules/pool/actions/add-liquidity/handlers/AddLiquidity.handler.ts b/lib/modules/pool/actions/add-liquidity/handlers/AddLiquidity.handler.ts index 26e3cbdcc..060421d65 100644 --- a/lib/modules/pool/actions/add-liquidity/handlers/AddLiquidity.handler.ts +++ b/lib/modules/pool/actions/add-liquidity/handlers/AddLiquidity.handler.ts @@ -1,6 +1,6 @@ import { TransactionConfig } from '@/lib/modules/web3/contracts/contract.types' import { HumanAmountIn } from '../../liquidity-types' -import { BuildAddLiquidityInputs, QueryAddLiquidityOutput } from '../add-liquidity.types' +import { BuildAddLiquidityInput, QueryAddLiquidityOutput } from '../add-liquidity.types' /** * AddLiquidityHandler is an interface that defines the methods that must be implemented by a handler. @@ -25,5 +25,5 @@ export interface AddLiquidityHandler { Build tx callData payload for adding liquidity It is responsibility of the UI to avoid calling buildAddLiquidityCallData before the last queryAddLiquidity was finished */ - buildAddLiquidityCallData(inputs: BuildAddLiquidityInputs): Promise + buildAddLiquidityCallData(inputs: BuildAddLiquidityInput): Promise } diff --git a/lib/modules/pool/actions/add-liquidity/handlers/TwammAddLiquidity.handler.ts b/lib/modules/pool/actions/add-liquidity/handlers/TwammAddLiquidity.handler.ts index ec1ef3fa7..e8c6c04f6 100644 --- a/lib/modules/pool/actions/add-liquidity/handlers/TwammAddLiquidity.handler.ts +++ b/lib/modules/pool/actions/add-liquidity/handlers/TwammAddLiquidity.handler.ts @@ -3,7 +3,7 @@ import { TransactionConfig } from '@/lib/modules/web3/contracts/contract.types' import { emptyAddress } from '@/lib/modules/web3/contracts/wagmi-helpers' import { Token, TokenAmount } from '@balancer/sdk' import { HumanAmountIn } from '../../liquidity-types' -import { BuildAddLiquidityInputs } from '../add-liquidity.types' +import { BuildAddLiquidityInput } from '../add-liquidity.types' import { AddLiquidityHandler } from './AddLiquidity.handler' /** @@ -35,7 +35,7 @@ export class TwammAddLiquidityHandler implements AddLiquidityHandler { // TODO: This is a non-sense example implementation public async buildAddLiquidityCallData({ account, - }: BuildAddLiquidityInputs): Promise { + }: BuildAddLiquidityInput): Promise { if (!this.humanAmountsIn) { throw new Error( `Missing humanAmountsIn. diff --git a/lib/modules/pool/actions/add-liquidity/handlers/UnbalancedAddLiquidity.handler.ts b/lib/modules/pool/actions/add-liquidity/handlers/UnbalancedAddLiquidity.handler.ts index fb97038ae..92cf28d37 100644 --- a/lib/modules/pool/actions/add-liquidity/handlers/UnbalancedAddLiquidity.handler.ts +++ b/lib/modules/pool/actions/add-liquidity/handlers/UnbalancedAddLiquidity.handler.ts @@ -17,7 +17,7 @@ import { ensureLastQueryLoaded, } from '../../LiquidityActionHelpers' import { HumanAmountIn } from '../../liquidity-types' -import { BuildAddLiquidityInputs, QueryAddLiquidityOutput } from '../add-liquidity.types' +import { BuildAddLiquidityInput, QueryAddLiquidityOutput } from '../add-liquidity.types' import { AddLiquidityHandler } from './AddLiquidity.handler' /** @@ -67,7 +67,7 @@ export class UnbalancedAddLiquidityHandler implements AddLiquidityHandler { public async buildAddLiquidityCallData({ account, slippagePercent, - }: BuildAddLiquidityInputs): Promise { + }: BuildAddLiquidityInput): Promise { this.queryResponse = ensureLastQueryLoaded('Unbalanced add liquidity', this.queryResponse) const addLiquidity = new AddLiquidity() diff --git a/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.integration.spec.ts b/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.integration.spec.ts index 53f28f3da..177dbb98b 100644 --- a/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.integration.spec.ts +++ b/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.integration.spec.ts @@ -4,7 +4,7 @@ import { aBalWethPoolElementMock } from '@/test/msw/builders/gqlPoolElement.buil import { defaultTestUserAccount } from '@/test/utils/wagmi' import { aPhantomStablePoolStateInputMock } from '../../../__mocks__/pool.builders' import { Pool } from '../../../usePool' -import { QueryRemoveLiquidityInputs, RemoveLiquidityType } from '../remove-liquidity.types' +import { QueryRemoveLiquidityInput, RemoveLiquidityType } from '../remove-liquidity.types' import { selectRemoveLiquidityHandler } from './selectRemoveLiquidityHandler' import { ProportionalRemoveLiquidityHandler } from './ProportionalRemoveLiquidity.handler' @@ -17,7 +17,7 @@ function selectProportionalHandler(pool: Pool): ProportionalRemoveLiquidityHandl ) as ProportionalRemoveLiquidityHandler } -const defaultQueryInput: QueryRemoveLiquidityInputs = { +const defaultQueryInput: QueryRemoveLiquidityInput = { humanBptIn: '1', } diff --git a/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.ts b/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.ts index 15c9d4a62..7a72e96fb 100644 --- a/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.ts +++ b/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.ts @@ -14,8 +14,8 @@ import { BPT_DECIMALS } from '../../../pool.constants' import { Pool } from '../../../usePool' import { LiquidityActionHelpers, ensureLastQueryLoaded } from '../../LiquidityActionHelpers' import { - BuildRemoveLiquidityInputs, - QueryRemoveLiquidityInputs, + BuildRemoveLiquidityInput, + QueryRemoveLiquidityInput, QueryRemoveLiquidityOutput, } from '../remove-liquidity.types' import { RemoveLiquidityHandler } from './RemoveLiquidity.handler' @@ -30,7 +30,7 @@ export class ProportionalRemoveLiquidityHandler implements RemoveLiquidityHandle public async queryRemoveLiquidity({ humanBptIn: bptIn, - }: QueryRemoveLiquidityInputs): Promise { + }: QueryRemoveLiquidityInput): Promise { // Deletes the previous queryResponse to enforce that we don't buildCallData with an outdated queryResponse (while a new one is loading) this.queryResponse = undefined const removeLiquidity = new RemoveLiquidity() @@ -52,7 +52,7 @@ export class ProportionalRemoveLiquidityHandler implements RemoveLiquidityHandle public async buildRemoveLiquidityCallData({ account, slippagePercent, - }: BuildRemoveLiquidityInputs): Promise { + }: BuildRemoveLiquidityInput): Promise { this.queryResponse = ensureLastQueryLoaded('Proportional remove liquidity', this.queryResponse) const removeLiquidity = new RemoveLiquidity() diff --git a/lib/modules/pool/actions/remove-liquidity/handlers/RemoveLiquidity.handler.ts b/lib/modules/pool/actions/remove-liquidity/handlers/RemoveLiquidity.handler.ts index 3bed6016d..f8aa0683a 100644 --- a/lib/modules/pool/actions/remove-liquidity/handlers/RemoveLiquidity.handler.ts +++ b/lib/modules/pool/actions/remove-liquidity/handlers/RemoveLiquidity.handler.ts @@ -1,7 +1,7 @@ import { TransactionConfig } from '@/lib/modules/web3/contracts/contract.types' import { - QueryRemoveLiquidityInputs, - BuildRemoveLiquidityInputs, + QueryRemoveLiquidityInput, + BuildRemoveLiquidityInput, QueryRemoveLiquidityOutput, } from '../remove-liquidity.types' @@ -12,11 +12,11 @@ import { */ export interface RemoveLiquidityHandler { // Query the SDK for the expected output of removing liquidity - queryRemoveLiquidity(inputs: QueryRemoveLiquidityInputs): Promise + queryRemoveLiquidity(inputs: QueryRemoveLiquidityInput): Promise // Calculate the price impact of removing liquidity - calculatePriceImpact(inputs: QueryRemoveLiquidityInputs): Promise + calculatePriceImpact(inputs: QueryRemoveLiquidityInput): Promise /* Build tx callData payload for removing liquidity It is responsibility of the UI to avoid calling buildRemoveLiquidityCallData before the last queryRemoveLiquidity was finished - */ buildRemoveLiquidityCallData(inputs: BuildRemoveLiquidityInputs): Promise + */ buildRemoveLiquidityCallData(inputs: BuildRemoveLiquidityInput): Promise } diff --git a/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.integration.spec.ts b/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.integration.spec.ts index 559ea846c..053f15859 100644 --- a/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.integration.spec.ts +++ b/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.integration.spec.ts @@ -3,7 +3,7 @@ import { balAddress, wETHAddress } from '@/lib/debug-helpers' import { aBalWethPoolElementMock } from '@/test/msw/builders/gqlPoolElement.builders' import { defaultTestUserAccount } from '@/test/utils/wagmi' import { Pool } from '../../../usePool' -import { QueryRemoveLiquidityInputs, RemoveLiquidityType } from '../remove-liquidity.types' +import { QueryRemoveLiquidityInput, RemoveLiquidityType } from '../remove-liquidity.types' import { selectRemoveLiquidityHandler } from './selectRemoveLiquidityHandler' import { SingleTokenRemoveLiquidityHandler } from './SingleTokenRemoveLiquidity.handler' @@ -16,7 +16,7 @@ function selectSingleTokenHandler(pool: Pool): SingleTokenRemoveLiquidityHandler ) as SingleTokenRemoveLiquidityHandler } -const defaultQueryInput: QueryRemoveLiquidityInputs = { +const defaultQueryInput: QueryRemoveLiquidityInput = { humanBptIn: '1', tokenOut: balAddress, } @@ -41,7 +41,7 @@ describe('When removing unbalanced liquidity for a weighted pool', () => { test('builds Tx Config', async () => { const handler = selectSingleTokenHandler(poolMock) - const inputs: QueryRemoveLiquidityInputs = { + const inputs: QueryRemoveLiquidityInput = { humanBptIn: '1', tokenOut: balAddress, } diff --git a/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.ts b/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.ts index f944d6dc7..0f65edf14 100644 --- a/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.ts +++ b/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.ts @@ -20,9 +20,9 @@ import { isEmptyHumanAmount, } from '../../LiquidityActionHelpers' import { - BuildRemoveLiquidityInputs, + BuildRemoveLiquidityInput, QueryRemoveLiquidityOutput, - SingleTokenRemoveLiquidityInputs, + SingleTokenRemoveLiquidityInput, } from '../remove-liquidity.types' import { RemoveLiquidityHandler } from './RemoveLiquidity.handler' @@ -37,7 +37,7 @@ export class SingleTokenRemoveLiquidityHandler implements RemoveLiquidityHandler public async queryRemoveLiquidity({ humanBptIn, tokenOut, - }: SingleTokenRemoveLiquidityInputs): Promise { + }: SingleTokenRemoveLiquidityInput): Promise { if (!tokenOut) return { amountsOut: [] } const removeLiquidity = new RemoveLiquidity() @@ -54,7 +54,7 @@ export class SingleTokenRemoveLiquidityHandler implements RemoveLiquidityHandler public async calculatePriceImpact({ humanBptIn, tokenOut, - }: SingleTokenRemoveLiquidityInputs): Promise { + }: SingleTokenRemoveLiquidityInput): Promise { if (isEmptyHumanAmount(humanBptIn) || !tokenOut) { // Avoid price impact calculation return 0 @@ -73,7 +73,7 @@ export class SingleTokenRemoveLiquidityHandler implements RemoveLiquidityHandler public async buildRemoveLiquidityCallData({ account, slippagePercent, - }: BuildRemoveLiquidityInputs): Promise { + }: BuildRemoveLiquidityInput): Promise { this.queryResponse = ensureLastQueryLoaded('Single token remove liquidity', this.queryResponse) const removeLiquidity = new RemoveLiquidity() diff --git a/lib/modules/pool/actions/remove-liquidity/remove-liquidity.types.ts b/lib/modules/pool/actions/remove-liquidity/remove-liquidity.types.ts index be4d3d720..fb7ae6870 100644 --- a/lib/modules/pool/actions/remove-liquidity/remove-liquidity.types.ts +++ b/lib/modules/pool/actions/remove-liquidity/remove-liquidity.types.ts @@ -11,24 +11,24 @@ export enum RemoveLiquidityType { SingleToken = SdkRemoveLiquidityKind.SingleToken, } -export type ProportionalRemoveLiquidityInputs = { +export type ProportionalRemoveLiquidityInput = { humanBptIn: HumanAmount } -export type SingleTokenRemoveLiquidityInputs = { +export type SingleTokenRemoveLiquidityInput = { humanBptIn: HumanAmount tokenOut: Address } -export type QueryRemoveLiquidityInputs = - | ProportionalRemoveLiquidityInputs - | SingleTokenRemoveLiquidityInputs +export type QueryRemoveLiquidityInput = + | ProportionalRemoveLiquidityInput + | SingleTokenRemoveLiquidityInput export type QueryRemoveLiquidityOutput = { amountsOut: TokenAmount[] } -export type BuildRemoveLiquidityInputs = { +export type BuildRemoveLiquidityInput = { account: Address slippagePercent: string } From ae551e991bf0714b455176d7639fde866cfa0cc5 Mon Sep 17 00:00:00 2001 From: Alberto Gualis Date: Thu, 11 Jan 2024 14:10:55 +0100 Subject: [PATCH 3/5] Update lib/modules/pool/actions/remove-liquidity/handlers/RemoveLiquidity.handler.ts Co-authored-by: Gareth Fuller --- .../remove-liquidity/handlers/RemoveLiquidity.handler.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/modules/pool/actions/remove-liquidity/handlers/RemoveLiquidity.handler.ts b/lib/modules/pool/actions/remove-liquidity/handlers/RemoveLiquidity.handler.ts index f8aa0683a..8928680e3 100644 --- a/lib/modules/pool/actions/remove-liquidity/handlers/RemoveLiquidity.handler.ts +++ b/lib/modules/pool/actions/remove-liquidity/handlers/RemoveLiquidity.handler.ts @@ -18,5 +18,6 @@ export interface RemoveLiquidityHandler { /* Build tx callData payload for removing liquidity It is responsibility of the UI to avoid calling buildRemoveLiquidityCallData before the last queryRemoveLiquidity was finished - */ buildRemoveLiquidityCallData(inputs: BuildRemoveLiquidityInput): Promise + */ + buildRemoveLiquidityCallData(inputs: BuildRemoveLiquidityInput): Promise } From d939a789a822a0a5787bb67f0a2fda5e9588d32d Mon Sep 17 00:00:00 2001 From: Alberto Gualis Date: Thu, 11 Jan 2024 15:47:11 +0100 Subject: [PATCH 4/5] Update lib/modules/pool/actions/LiquidityActionHelpers.ts Co-authored-by: Gareth Fuller --- lib/modules/pool/actions/LiquidityActionHelpers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/modules/pool/actions/LiquidityActionHelpers.ts b/lib/modules/pool/actions/LiquidityActionHelpers.ts index c30690214..cf369cc7e 100644 --- a/lib/modules/pool/actions/LiquidityActionHelpers.ts +++ b/lib/modules/pool/actions/LiquidityActionHelpers.ts @@ -108,7 +108,7 @@ export function toHumanAmount(tokenAmount: TokenAmount): HumanAmount { return formatUnits(tokenAmount.amount, tokenAmount.token.decimals) as HumanAmount } -export function ensureLastQueryLoaded(liquidityActionDescription: string, queryResponse?: Q): Q { +export function ensureLastQueryResponse(liquidityActionDescription: string, queryResponse?: Q): Q { if (!queryResponse) { // This should never happen because we don't allow the user to trigger buildLiquidityCallData // before the query is loaded. From 549e1af0d817d28fb079e0dbbbaab2bd3c89363b Mon Sep 17 00:00:00 2001 From: Alberto Gualis Date: Thu, 11 Jan 2024 15:49:00 +0100 Subject: [PATCH 5/5] Rename ensureLastQueryResponse --- lib/modules/pool/actions/LiquidityActionHelpers.ts | 5 ++++- .../handlers/UnbalancedAddLiquidity.handler.ts | 4 ++-- .../handlers/ProportionalRemoveLiquidity.handler.ts | 7 +++++-- .../handlers/SingleTokenRemoveLiquidity.handler.ts | 7 +++++-- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/lib/modules/pool/actions/LiquidityActionHelpers.ts b/lib/modules/pool/actions/LiquidityActionHelpers.ts index cf369cc7e..cabf172a4 100644 --- a/lib/modules/pool/actions/LiquidityActionHelpers.ts +++ b/lib/modules/pool/actions/LiquidityActionHelpers.ts @@ -108,7 +108,10 @@ export function toHumanAmount(tokenAmount: TokenAmount): HumanAmount { return formatUnits(tokenAmount.amount, tokenAmount.token.decimals) as HumanAmount } -export function ensureLastQueryResponse(liquidityActionDescription: string, queryResponse?: Q): Q { +export function ensureLastQueryResponse( + liquidityActionDescription: string, + queryResponse?: Q +): Q { if (!queryResponse) { // This should never happen because we don't allow the user to trigger buildLiquidityCallData // before the query is loaded. diff --git a/lib/modules/pool/actions/add-liquidity/handlers/UnbalancedAddLiquidity.handler.ts b/lib/modules/pool/actions/add-liquidity/handlers/UnbalancedAddLiquidity.handler.ts index 92cf28d37..3f393196e 100644 --- a/lib/modules/pool/actions/add-liquidity/handlers/UnbalancedAddLiquidity.handler.ts +++ b/lib/modules/pool/actions/add-liquidity/handlers/UnbalancedAddLiquidity.handler.ts @@ -14,7 +14,7 @@ import { Pool } from '../../../usePool' import { LiquidityActionHelpers, areEmptyAmounts, - ensureLastQueryLoaded, + ensureLastQueryResponse, } from '../../LiquidityActionHelpers' import { HumanAmountIn } from '../../liquidity-types' import { BuildAddLiquidityInput, QueryAddLiquidityOutput } from '../add-liquidity.types' @@ -68,7 +68,7 @@ export class UnbalancedAddLiquidityHandler implements AddLiquidityHandler { account, slippagePercent, }: BuildAddLiquidityInput): Promise { - this.queryResponse = ensureLastQueryLoaded('Unbalanced add liquidity', this.queryResponse) + this.queryResponse = ensureLastQueryResponse('Unbalanced add liquidity', this.queryResponse) const addLiquidity = new AddLiquidity() diff --git a/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.ts b/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.ts index 7a72e96fb..11254f2b7 100644 --- a/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.ts +++ b/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.ts @@ -12,7 +12,7 @@ import { import { Address, parseEther } from 'viem' import { BPT_DECIMALS } from '../../../pool.constants' import { Pool } from '../../../usePool' -import { LiquidityActionHelpers, ensureLastQueryLoaded } from '../../LiquidityActionHelpers' +import { LiquidityActionHelpers, ensureLastQueryResponse } from '../../LiquidityActionHelpers' import { BuildRemoveLiquidityInput, QueryRemoveLiquidityInput, @@ -53,7 +53,10 @@ export class ProportionalRemoveLiquidityHandler implements RemoveLiquidityHandle account, slippagePercent, }: BuildRemoveLiquidityInput): Promise { - this.queryResponse = ensureLastQueryLoaded('Proportional remove liquidity', this.queryResponse) + this.queryResponse = ensureLastQueryResponse( + 'Proportional remove liquidity', + this.queryResponse + ) const removeLiquidity = new RemoveLiquidity() diff --git a/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.ts b/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.ts index 0f65edf14..2c82a1aaa 100644 --- a/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.ts +++ b/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.ts @@ -16,7 +16,7 @@ import { BPT_DECIMALS } from '../../../pool.constants' import { Pool } from '../../../usePool' import { LiquidityActionHelpers, - ensureLastQueryLoaded, + ensureLastQueryResponse, isEmptyHumanAmount, } from '../../LiquidityActionHelpers' import { @@ -74,7 +74,10 @@ export class SingleTokenRemoveLiquidityHandler implements RemoveLiquidityHandler account, slippagePercent, }: BuildRemoveLiquidityInput): Promise { - this.queryResponse = ensureLastQueryLoaded('Single token remove liquidity', this.queryResponse) + this.queryResponse = ensureLastQueryResponse( + 'Single token remove liquidity', + this.queryResponse + ) const removeLiquidity = new RemoveLiquidity()