From b7b28c276e9bd21ac559abe45b96d5aec950f272 Mon Sep 17 00:00:00 2001 From: Alberto Gualis Date: Mon, 16 Sep 2024 18:19:13 +0200 Subject: [PATCH 1/6] feat: adapt V2 and V3 buildCall parameters in handlers --- lib/config/networks/sepolia.ts | 2 +- lib/debug-helpers.ts | 2 ++ .../pool/actions/LiquidityActionHelpers.ts | 11 +++++++++- .../UnbalancedAddLiquidity.handler.ts | 22 ++++++++++++++----- .../add-liquidity/useAddLiquiditySteps.tsx | 5 +++-- .../ProportionalRemoveLiquidity.handler.ts | 16 +++++++++----- .../SingleTokenRemoveLiquidity.handler.ts | 20 ++++++++++++----- 7 files changed, 58 insertions(+), 20 deletions(-) diff --git a/lib/config/networks/sepolia.ts b/lib/config/networks/sepolia.ts index 6a8c36c87..4811fa377 100644 --- a/lib/config/networks/sepolia.ts +++ b/lib/config/networks/sepolia.ts @@ -31,7 +31,7 @@ const networkConfig: NetworkConfig = { multicall2: '0xca11bde05977b3631167028862be2a173976ca11', balancer: { vaultV2: '0xBA12222222228d8Ba445958a75a0704d566BF2C8', - vaultV3: '0xD5584b37D1845fFeD958C2d94bC675603DdCce68', + vaultV3: '0x0EF1c156a7986F394d90eD1bEeA6483Cc435F542', relayerV6: '0x7852fB9d0895e6e8b3EedA553c03F6e2F9124dF9', minter: '0x1783Cd84b3d01854A96B4eD5843753C2CcbD574A', }, diff --git a/lib/debug-helpers.ts b/lib/debug-helpers.ts index a399cf86d..a1111c7df 100644 --- a/lib/debug-helpers.ts +++ b/lib/debug-helpers.ts @@ -36,6 +36,8 @@ export const vaultV3Address = sepoliaNetworkConfig.contracts.balancer.vaultV3 as export const poolId = '0x68e3266c9c8bbd44ad9dca5afbfe629022aee9fe000200000000000000000512' as const // Balancer Weighted wjAura and WETH +export const sepoliaRouter = '0x1c58cc548a23956469c7C528Bb3a846c842dfaF9' + /* Used to pretty print objects when debugging */ diff --git a/lib/modules/pool/actions/LiquidityActionHelpers.ts b/lib/modules/pool/actions/LiquidityActionHelpers.ts index c19b9ad49..5bbaa3188 100644 --- a/lib/modules/pool/actions/LiquidityActionHelpers.ts +++ b/lib/modules/pool/actions/LiquidityActionHelpers.ts @@ -232,7 +232,7 @@ export function toPoolStateWithBalances(pool: Pool): PoolStateWithBalances { * - is native and the wrapped native token is already in the array and * - is wrapped native and the native token is already in the array * - * @param {HumanAmoHumanTokenAmountWithAddressuntIn[]} humanAmountsIn - The array of human amounts to filter. + * @param {HumanAmoHumanTokenAmountWithAddress[]} humanAmountsIn - The array of human amounts to filter. * @param {Address} tokenAddress - The token address to compare against. * @param {GqlChain} chain - The chain type for comparison. * @return {HumanTokenAmountWithAddress[]} The filtered array of human amounts. @@ -309,3 +309,12 @@ export function injectNativeAsset( export function hasNoLiquidity(pool: Pool): boolean { return isZero(pool.dynamicData.totalShares) } + +// When the pool has version v2, it adds extra buildCall params (sender and recipient) that must be present only in V2 +export function adaptBuildCallParams(buildCallParams: T, isV3Pool: boolean, account: Address) { + // sender must be undefined for v3 pools + if (isV3Pool) return buildCallParams + + // sender and recipient must be defined only for v2 pools + return { ...buildCallParams, sender: account, recipient: account } +} 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 f71f483a1..dfb4dcf31 100644 --- a/lib/modules/pool/actions/add-liquidity/handlers/UnbalancedAddLiquidity.handler.ts +++ b/lib/modules/pool/actions/add-liquidity/handlers/UnbalancedAddLiquidity.handler.ts @@ -11,9 +11,13 @@ import { Slippage, } from '@balancer/sdk' import { Pool } from '../../../PoolProvider' -import { LiquidityActionHelpers, areEmptyAmounts } from '../../LiquidityActionHelpers' -import { SdkBuildAddLiquidityInput, SdkQueryAddLiquidityOutput } from '../add-liquidity.types' +import { + LiquidityActionHelpers, + adaptBuildCallParams, + areEmptyAmounts, +} from '../../LiquidityActionHelpers' import { AddLiquidityHandler } from './AddLiquidity.handler' +import { SdkBuildAddLiquidityInput, SdkQueryAddLiquidityOutput } from '../add-liquidity.types' /** * UnbalancedAddLiquidityHandler is a handler that implements the @@ -64,13 +68,19 @@ export class UnbalancedAddLiquidityHandler implements AddLiquidityHandler { }: SdkBuildAddLiquidityInput): Promise { const addLiquidity = new AddLiquidity() - const { callData, to, value } = addLiquidity.buildCall({ + const baseBuildCallParams = { ...queryOutput.sdkQueryOutput, slippage: Slippage.fromPercentage(`${Number(slippagePercent)}`), - sender: account, - recipient: account, wethIsEth: this.helpers.isNativeAssetIn(humanAmountsIn), - }) + } + + const buildCallParams = adaptBuildCallParams( + baseBuildCallParams, + this.helpers.isV3Pool(), + account + ) + + const { callData, to, value } = addLiquidity.buildCall(buildCallParams) return { account, diff --git a/lib/modules/pool/actions/add-liquidity/useAddLiquiditySteps.tsx b/lib/modules/pool/actions/add-liquidity/useAddLiquiditySteps.tsx index 74a46d7e8..248a5c589 100644 --- a/lib/modules/pool/actions/add-liquidity/useAddLiquiditySteps.tsx +++ b/lib/modules/pool/actions/add-liquidity/useAddLiquiditySteps.tsx @@ -3,11 +3,11 @@ import { useShouldSignRelayerApproval } from '@/lib/modules/relayer/signRelayerA import { useApproveRelayerStep } from '@/lib/modules/relayer/useApproveRelayerStep' import { useRelayerMode } from '@/lib/modules/relayer/useRelayerMode' import { useTokenApprovalSteps } from '@/lib/modules/tokens/approvals/useTokenApprovalSteps' -import { useContractAddress } from '@/lib/modules/web3/contracts/useContractAddress' import { useMemo } from 'react' import { usePool } from '../../PoolProvider' import { LiquidityActionHelpers } from '../LiquidityActionHelpers' import { AddLiquidityStepParams, useAddLiquidityStep } from './useAddLiquidityStep' +import { getVaultConfig } from '../../pool.helpers' import { useSignRelayerStep } from '@/lib/modules/transactions/transaction-steps/useSignRelayerStep' import { Address } from 'viem' import { isCowAmmPool } from '../../pool.helpers' @@ -21,10 +21,11 @@ export function useAddLiquiditySteps({ humanAmountsIn, simulationQuery, }: AddLiquidityStepsParams) { - const vaultAddress = useContractAddress('balancer.vaultV2') const { pool, chainId, chain } = usePool() + const { vaultAddress } = getVaultConfig(pool) const relayerMode = useRelayerMode(pool) const shouldSignRelayerApproval = useShouldSignRelayerApproval(chainId, relayerMode) + const { step: approveRelayerStep, isLoading: isLoadingRelayerApproval } = useApproveRelayerStep(chainId) const signRelayerStep = useSignRelayerStep(chain) 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 a0370fd47..ffd3ef5dd 100644 --- a/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.ts +++ b/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.ts @@ -10,7 +10,7 @@ import { import { Address, parseEther } from 'viem' import { BPT_DECIMALS } from '../../../pool.constants' import { Pool } from '../../../PoolProvider' -import { LiquidityActionHelpers } from '../../LiquidityActionHelpers' +import { LiquidityActionHelpers, adaptBuildCallParams } from '../../LiquidityActionHelpers' import { QueryRemoveLiquidityInput, SdkBuildRemoveLiquidityInput, @@ -50,13 +50,19 @@ export class ProportionalRemoveLiquidityHandler implements RemoveLiquidityHandle }: SdkBuildRemoveLiquidityInput): Promise { const removeLiquidity = new RemoveLiquidity() - const { callData, to, value } = removeLiquidity.buildCall({ + const baseBuildCallParams = { ...queryOutput.sdkQueryOutput, slippage: Slippage.fromPercentage(`${Number(slippagePercent)}`), - sender: account, - recipient: account, wethIsEth, - }) + } + + const buildCallParams = adaptBuildCallParams( + baseBuildCallParams, + this.helpers.isV3Pool(), + account + ) + + const { callData, to, value } = removeLiquidity.buildCall(buildCallParams) return { account, 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 3ee78fee1..807f4f86a 100644 --- a/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.ts +++ b/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.ts @@ -12,7 +12,11 @@ import { import { Address, parseEther } from 'viem' import { BPT_DECIMALS } from '../../../pool.constants' import { Pool } from '../../../PoolProvider' -import { LiquidityActionHelpers, isEmptyHumanAmount } from '../../LiquidityActionHelpers' +import { + LiquidityActionHelpers, + adaptBuildCallParams, + isEmptyHumanAmount, +} from '../../LiquidityActionHelpers' import { SdkBuildRemoveLiquidityInput, SdkQueryRemoveLiquidityOutput, @@ -72,13 +76,19 @@ export class SingleTokenRemoveLiquidityHandler implements RemoveLiquidityHandler }: SdkBuildRemoveLiquidityInput): Promise { const removeLiquidity = new RemoveLiquidity() - const { callData, to, value } = removeLiquidity.buildCall({ + const baseBuildCallParams = { ...queryOutput.sdkQueryOutput, slippage: Slippage.fromPercentage(`${Number(slippagePercent)}`), - sender: account, - recipient: account, wethIsEth, - }) + } + + const buildCallParams = adaptBuildCallParams( + baseBuildCallParams, + this.helpers.isV3Pool(), + account + ) + + const { callData, to, value } = removeLiquidity.buildCall(buildCallParams) return { account, From a78b343fcbec75ec98c9eae7309b9aab60449a3f Mon Sep 17 00:00:00 2001 From: Alberto Gualis Date: Mon, 16 Sep 2024 18:39:58 +0200 Subject: [PATCH 2/6] chore: improve comment --- 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 5bbaa3188..8f6674391 100644 --- a/lib/modules/pool/actions/LiquidityActionHelpers.ts +++ b/lib/modules/pool/actions/LiquidityActionHelpers.ts @@ -315,6 +315,6 @@ export function adaptBuildCallParams(buildCallParams: T, isV3Pool: boolean, a // sender must be undefined for v3 pools if (isV3Pool) return buildCallParams - // sender and recipient must be defined only for v2 pools + // sender and recipient must be defined only for v1 and v2 pools return { ...buildCallParams, sender: account, recipient: account } } From e8541b91e23c1ebe87692e164e56fc9a41cc024f Mon Sep 17 00:00:00 2001 From: Alberto Gualis Date: Mon, 16 Sep 2024 18:42:29 +0200 Subject: [PATCH 3/6] chore: improve comment2 --- 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 8f6674391..f271cc6ed 100644 --- a/lib/modules/pool/actions/LiquidityActionHelpers.ts +++ b/lib/modules/pool/actions/LiquidityActionHelpers.ts @@ -310,7 +310,7 @@ export function hasNoLiquidity(pool: Pool): boolean { return isZero(pool.dynamicData.totalShares) } -// When the pool has version v2, it adds extra buildCall params (sender and recipient) that must be present only in V2 +// When the pool has version < v3, it adds extra buildCall params (sender and recipient) that must be present only in V1/V2 export function adaptBuildCallParams(buildCallParams: T, isV3Pool: boolean, account: Address) { // sender must be undefined for v3 pools if (isV3Pool) return buildCallParams From 174056376651db240023724ebe74469995f2ef2d Mon Sep 17 00:00:00 2001 From: Alberto Gualis Date: Tue, 17 Sep 2024 12:22:40 +0200 Subject: [PATCH 4/6] chore: add NEXT prefix to NEXT_PRIVATE_ALCHEMY_KEY for simpler local integration test setup (#1097) --- .github/workflows/checks.yml | 2 +- app/api/rpc/[chain]/route.ts | 4 ++-- test/anvil/anvil-setup.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 8dc816690..e257e157d 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -6,7 +6,7 @@ on: env: NEXT_PUBLIC_BALANCER_API_URL: https://api-v3.balancer.fi/graphql NEXT_PUBLIC_WALLET_CONNECT_ID: ${{ secrets.NEXT_PUBLIC_WALLET_CONNECT_ID }} - PRIVATE_ALCHEMY_KEY: ${{ secrets.PRIVATE_ALCHEMY_KEY }} + NEXT_PRIVATE_ALCHEMY_KEY: ${{ secrets.PRIVATE_ALCHEMY_KEY }} jobs: Build: diff --git a/app/api/rpc/[chain]/route.ts b/app/api/rpc/[chain]/route.ts index 9f31494d0..190a39ed3 100644 --- a/app/api/rpc/[chain]/route.ts +++ b/app/api/rpc/[chain]/route.ts @@ -6,7 +6,7 @@ type Params = { } } -const ALCHEMY_KEY = process.env.PRIVATE_ALCHEMY_KEY || '' +const ALCHEMY_KEY = process.env.NEXT_PRIVATE_ALCHEMY_KEY || '' const chainToRpcMap: Record = { [GqlChain.Mainnet]: `https://eth-mainnet.g.alchemy.com/v2/${ALCHEMY_KEY}`, @@ -35,7 +35,7 @@ function getRpcUrl(chain: string) { export async function POST(request: Request, { params: { chain } }: Params) { if (!ALCHEMY_KEY) { - return new Response(JSON.stringify({ error: 'PRIVATE_ALCHEMY_KEY is missing' }), { + return new Response(JSON.stringify({ error: 'NEXT_PRIVATE_ALCHEMY_KEY is missing' }), { status: 500, }) } diff --git a/test/anvil/anvil-setup.ts b/test/anvil/anvil-setup.ts index baa6388e7..3b2030965 100644 --- a/test/anvil/anvil-setup.ts +++ b/test/anvil/anvil-setup.ts @@ -85,7 +85,7 @@ export function getTestRpcSetup(networkName: NetworksWithFork) { } export function getForkUrl(network: NetworkSetup, verbose = false): string { - const privateAlchemyKey = process.env['PRIVATE_ALCHEMY_KEY'] + const privateAlchemyKey = process.env['NEXT_PRIVATE_ALCHEMY_KEY'] if (privateAlchemyKey) { if (network.networkName === 'Ethereum') { return `https://eth-mainnet.g.alchemy.com/v2/${privateAlchemyKey}` From f344a6bf6f79525053913853b122b0943b44ed05 Mon Sep 17 00:00:00 2001 From: Alberto Gualis Date: Tue, 17 Sep 2024 12:39:21 +0200 Subject: [PATCH 5/6] chore: rename function --- lib/modules/pool/actions/LiquidityActionHelpers.ts | 4 ++-- .../add-liquidity/handlers/UnbalancedAddLiquidity.handler.ts | 4 ++-- .../handlers/ProportionalRemoveLiquidity.handler.ts | 4 ++-- .../handlers/SingleTokenRemoveLiquidity.handler.ts | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/modules/pool/actions/LiquidityActionHelpers.ts b/lib/modules/pool/actions/LiquidityActionHelpers.ts index f271cc6ed..00c2709be 100644 --- a/lib/modules/pool/actions/LiquidityActionHelpers.ts +++ b/lib/modules/pool/actions/LiquidityActionHelpers.ts @@ -232,7 +232,7 @@ export function toPoolStateWithBalances(pool: Pool): PoolStateWithBalances { * - is native and the wrapped native token is already in the array and * - is wrapped native and the native token is already in the array * - * @param {HumanAmoHumanTokenAmountWithAddress[]} humanAmountsIn - The array of human amounts to filter. + * @param {HumanTokenAmountWithAddress[]} humanAmountsIn - The array of human amounts to filter. * @param {Address} tokenAddress - The token address to compare against. * @param {GqlChain} chain - The chain type for comparison. * @return {HumanTokenAmountWithAddress[]} The filtered array of human amounts. @@ -311,7 +311,7 @@ export function hasNoLiquidity(pool: Pool): boolean { } // When the pool has version < v3, it adds extra buildCall params (sender and recipient) that must be present only in V1/V2 -export function adaptBuildCallParams(buildCallParams: T, isV3Pool: boolean, account: Address) { +export function formatBuildCallParams(buildCallParams: T, isV3Pool: boolean, account: Address) { // sender must be undefined for v3 pools if (isV3Pool) return buildCallParams 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 dfb4dcf31..c33ee4716 100644 --- a/lib/modules/pool/actions/add-liquidity/handlers/UnbalancedAddLiquidity.handler.ts +++ b/lib/modules/pool/actions/add-liquidity/handlers/UnbalancedAddLiquidity.handler.ts @@ -13,7 +13,7 @@ import { import { Pool } from '../../../PoolProvider' import { LiquidityActionHelpers, - adaptBuildCallParams, + formatBuildCallParams, areEmptyAmounts, } from '../../LiquidityActionHelpers' import { AddLiquidityHandler } from './AddLiquidity.handler' @@ -74,7 +74,7 @@ export class UnbalancedAddLiquidityHandler implements AddLiquidityHandler { wethIsEth: this.helpers.isNativeAssetIn(humanAmountsIn), } - const buildCallParams = adaptBuildCallParams( + const buildCallParams = formatBuildCallParams( baseBuildCallParams, this.helpers.isV3Pool(), account 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 ffd3ef5dd..b3e36e89e 100644 --- a/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.ts +++ b/lib/modules/pool/actions/remove-liquidity/handlers/ProportionalRemoveLiquidity.handler.ts @@ -10,7 +10,7 @@ import { import { Address, parseEther } from 'viem' import { BPT_DECIMALS } from '../../../pool.constants' import { Pool } from '../../../PoolProvider' -import { LiquidityActionHelpers, adaptBuildCallParams } from '../../LiquidityActionHelpers' +import { LiquidityActionHelpers, formatBuildCallParams } from '../../LiquidityActionHelpers' import { QueryRemoveLiquidityInput, SdkBuildRemoveLiquidityInput, @@ -56,7 +56,7 @@ export class ProportionalRemoveLiquidityHandler implements RemoveLiquidityHandle wethIsEth, } - const buildCallParams = adaptBuildCallParams( + const buildCallParams = formatBuildCallParams( baseBuildCallParams, this.helpers.isV3Pool(), account 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 807f4f86a..a0c8736f7 100644 --- a/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.ts +++ b/lib/modules/pool/actions/remove-liquidity/handlers/SingleTokenRemoveLiquidity.handler.ts @@ -14,7 +14,7 @@ import { BPT_DECIMALS } from '../../../pool.constants' import { Pool } from '../../../PoolProvider' import { LiquidityActionHelpers, - adaptBuildCallParams, + formatBuildCallParams, isEmptyHumanAmount, } from '../../LiquidityActionHelpers' import { @@ -82,7 +82,7 @@ export class SingleTokenRemoveLiquidityHandler implements RemoveLiquidityHandler wethIsEth, } - const buildCallParams = adaptBuildCallParams( + const buildCallParams = formatBuildCallParams( baseBuildCallParams, this.helpers.isV3Pool(), account From 7f4d9e68489bd8686a61c84f46f707d8f8c9891b Mon Sep 17 00:00:00 2001 From: Gareth Fuller Date: Tue, 17 Sep 2024 11:57:55 +0100 Subject: [PATCH 6/6] chore: Update template --- .env.template | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.template b/.env.template index eb2e23ad9..5d2af7054 100644 --- a/.env.template +++ b/.env.template @@ -10,6 +10,6 @@ PRIVATE_HYPERNATIVE_API_SECRET=xxx PRIVATE_CURRENCYAPI_KEY=xxx # For integration tests and rpc proxy routes (optional) -PRIVATE_ALCHEMY_KEY=xxx +NEXT_PRIVATE_ALCHEMY_KEY=xxx