From 9340c0b1d091e986ddb989730988ece67b2b1e8b Mon Sep 17 00:00:00 2001 From: Gareth Fuller Date: Fri, 11 Aug 2023 10:39:12 +0100 Subject: [PATCH] fix: Limit swap exits (DM) (#3946) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Fix ethereum pool links in auto allowlist PRs * Add test for detecting duplicates in voting list * Change test name * chore: Add migration notices (#3934) * 1.118.1 * hotfix: fix reward tokens apr breakdown (#3936) * 1.118.2 * chore: Add farmDE pool to polygon allowlist * add well and stg to whitelist (#3939) * 1.118.3 * chore: Add 2BTC pool to mainnet allowlist * Add reth pool to allowlist * 1.118.4 * chore: Add 80TBTC-20WBTC pool to mainnet allowlist * 1.118.5 * 1.118.6 * 1.118.7 * 1.118.8 * 1.118.9 * fix: Limit swap exits to deep pools * chore: Add comment --------- Co-authored-by: Alberto Gualis Co-authored-by: Tim Robinson Co-authored-by: Automated Version Bump Co-authored-by: Fábio Mendes <43360747+mendesfabio@users.noreply.github.com> Co-authored-by: balopco Co-authored-by: ZeKraken <79888567+zekraken-bot@users.noreply.github.com> Co-authored-by: Tim Robinson --- .github/workflows/allowlist-manual.yml | 2 +- package-lock.json | 4 +-- package.json | 2 +- .../WithdrawForm/WithdrawForm.vue | 6 ++-- src/lib/config/base/pools.ts | 4 +++ src/lib/config/mainnet/pools.ts | 3 +- src/lib/config/polygon/pools.ts | 1 + src/lib/config/pools.spec.ts | 32 ++++++++++++++++--- .../scripts/automatic-prs/allowlist-pool.ts | 4 ++- src/providers/local/exit-pool.provider.ts | 10 ++++-- 10 files changed, 51 insertions(+), 17 deletions(-) diff --git a/.github/workflows/allowlist-manual.yml b/.github/workflows/allowlist-manual.yml index 4e8d0116c6..a0e3b64664 100644 --- a/.github/workflows/allowlist-manual.yml +++ b/.github/workflows/allowlist-manual.yml @@ -11,9 +11,9 @@ on: - avalanche - arbitrum - base + - ethereum - gnosis-chain - goerli - - mainnet - polygon - optimism - zkevm diff --git a/package-lock.json b/package-lock.json index 8300a25ebd..8a3e0d5d33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@balancer/frontend-v2", - "version": "1.118.1", + "version": "1.118.9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@balancer/frontend-v2", - "version": "1.118.1", + "version": "1.118.9", "license": "MIT", "devDependencies": { "@aave/protocol-js": "^4.3.0", diff --git a/package.json b/package.json index 4e8968043e..916e84ad42 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@balancer/frontend-v2", - "version": "1.118.1", + "version": "1.118.9", "engines": { "node": "=16", "npm": ">=8" diff --git a/src/components/forms/pool_actions/WithdrawForm/WithdrawForm.vue b/src/components/forms/pool_actions/WithdrawForm/WithdrawForm.vue index bd6487a7d8..5e41573915 100644 --- a/src/components/forms/pool_actions/WithdrawForm/WithdrawForm.vue +++ b/src/components/forms/pool_actions/WithdrawForm/WithdrawForm.vue @@ -9,7 +9,6 @@ import useVeBal from '@/composables/useVeBAL'; import WithdrawPreviewModal from './components/WithdrawPreviewModal/WithdrawPreviewModal.vue'; import { useTokens } from '@/providers/tokens.provider'; import { - isPreMintedBptType, tokensListExclBpt, usePoolHelpers, } from '@/composables/usePoolHelpers'; @@ -57,6 +56,7 @@ const { validAmounts, hasBpt, shouldUseRecoveryExit, + canSwapExit, } = useExitPool(); const { isWrappedNativeAssetPool } = usePoolHelpers(pool); @@ -76,8 +76,8 @@ const tokensList = computed(() => tokensListExclBpt(pool.value)); // Limit token select modal to a subset. const subsetTokens = computed((): string[] => { - if (!shouldUseRecoveryExit.value && isPreMintedBptType(pool.value.poolType)) - return []; + // Returning an empty array means all tokens are presented in the modal. + if (!shouldUseRecoveryExit.value && canSwapExit.value) return []; if (isWrappedNativeAssetPool.value) return [nativeAsset.address, ...tokensList.value]; diff --git a/src/lib/config/base/pools.ts b/src/lib/config/base/pools.ts index 493ecf801f..f9afa1e3b5 100644 --- a/src/lib/config/base/pools.ts +++ b/src/lib/config/base/pools.ts @@ -27,6 +27,7 @@ const pools: Pools = { AllowList: [ '0x6fbfcf88db1aada31f34215b2a1df7fafb4883e900000000000000000000000c', // stabal3 '0xe58ca65f418d4121d6c70d4c133e60cf6fda363c000000000000000000000013', // usdc/axlusd + '0x8c2062ec8d477366c749982e3703371a7ae1e66500000000000000000000001f', // rETH/WETH ], }, Investment: { @@ -46,6 +47,8 @@ const pools: Pools = { '0x52e281318fed4efffb8e46c0847a8f9b71a461a8000200000000000000000018', // 50BTC-50WETH '0x036d68e4e0005da4ef1c9ebd53b948d2c083495e00020000000000000000001a', // 50BTC-50USD '0xe40cbccba664c7b1a953827c062f5070b78de86800020000000000000000001b', // WETH-GOLD + '0xfab10dd71e11d0ad403cc31418b45d816f2f988200020000000000000000001d', // well-eth + '0xc69793563a8f0a2c5b25bcfb8661de50da8eae1000020000000000000000001c', // stg-usdc ], }, Factories: { @@ -62,6 +65,7 @@ const pools: Pools = { '0x52e281318fed4efffb8e46c0847a8f9b71a461a8000200000000000000000018', // 50BTC-50WETH '0x036d68e4e0005da4ef1c9ebd53b948d2c083495e00020000000000000000001a', // 50BTC-50USD '0xe40cbccba664c7b1a953827c062f5070b78de86800020000000000000000001b', // WETH-GOLD + '0xc69793563a8f0a2c5b25bcfb8661de50da8eae1000020000000000000000001c', // stg-usdc ], }, Metadata: { diff --git a/src/lib/config/mainnet/pools.ts b/src/lib/config/mainnet/pools.ts index 53b62e6910..2b426d67e5 100644 --- a/src/lib/config/mainnet/pools.ts +++ b/src/lib/config/mainnet/pools.ts @@ -121,6 +121,7 @@ const pools: Pools = { '0x1bd2f176a812e312077bca87e37c08432bb09f3e0000000000000000000005a1', // qETH-bb-a-WETH '0xae8535c23afedda9304b03c68a3563b75fc8f92b0000000000000000000005a0', // swETH-bb-a-WETH '0xe8c56405bc405840154d9b572927f4197d110de10000000000000000000005a4', // rETH/bbaWETH + '0xe4e72f872c4048925a78e1e6fddac411c9ae348a0000000000000000000005bc', // 2BTC ], }, Investment: { @@ -173,6 +174,7 @@ const pools: Pools = { '0xb841b062ea8ccf5c4cb78032e91de4ae875560420002000000000000000005b7', // 50bb-s-DAI-50bb-a-USD '0x2e52c64fd319e380cdbcfc4577ea1fda558a32e40002000000000000000005ba', // 50bb-a-WETH-50YieldETH '0xcebb73246fd3f0ba3e42a4ba6ff6b40d0cd02fb30001000000000000000005b8', // 20wstETH-50ETHx-20sfrxETH-10rETH + '0xa9dd57145ca13a2f05199d85e3f2739af64784270002000000000000000005be', // 80TBTC-20WBTC ], }, Factories: { @@ -267,7 +269,6 @@ const pools: Pools = { '0x173063a30e095313eee39411f07e95a8a806014e0002000000000000000003ab', '0x8167a1117691f39e05e9131cfa88f0e3a620e96700020000000000000000038c', '0x798b112420ad6391a4129ac25ef59663a44c88bb0002000000000000000003f4', - '0x798b112420ad6391a4129ac25ef59663a44c88bb0002000000000000000003f4', '0x5512a4bbe7b3051f92324bacf25c02b9000c4a500001000000000000000003d7', '0x4edcb2b46377530bc18bb4d2c7fe46a992c73e100000000000000000000003ec', '0xd1ec5e215e8148d76f4460e4097fd3d5ae0a35580002000000000000000003d3', diff --git a/src/lib/config/polygon/pools.ts b/src/lib/config/polygon/pools.ts index ab23d35ed6..30e15b1607 100644 --- a/src/lib/config/polygon/pools.ts +++ b/src/lib/config/polygon/pools.ts @@ -150,6 +150,7 @@ const pools: Pools = { '0xa88e4fae334a2237e300592ae7d52705cade95a0000200000000000000000c17', // 50WBTC-50MaticX '0xf7fd196c4606fb78178a85d1059f8224ddbccd2d000200000000000000000c18', // 50DAI-50miMATIC '0xacb0bd6f7206174c64cef5e05c4d7871ea888d33000100000000000000000c19', // 33WBTC-33WETH-33NEX + '0x93a97f352c8be88d1468b8f7e0c24ce535be9eae000100000000000000000c1a', // farmDE ], }, Factories: { diff --git a/src/lib/config/pools.spec.ts b/src/lib/config/pools.spec.ts index 0323074f39..c945e2cbde 100644 --- a/src/lib/config/pools.spec.ts +++ b/src/lib/config/pools.spec.ts @@ -15,29 +15,51 @@ function detectDuplicates( const duplicatedPoolAddresses = getDuplicatedAddresses(addresses); if (duplicatedPoolAddresses.length > 0) throw new Error( - `Network ${networkName}: found duplicated pool addresses in ${allowlistType} Allowlist: ${duplicatedPoolAddresses}. + `Network ${networkName}: found duplicated pool addresses in ${allowlistType} Allowlist: ${duplicatedPoolAddresses} Review /src/lib/config/${networkName}/pools.ts to remove duplicates. It could be that 2 similar allowlist PRs were created at the same time. ` ); } -test('Detect duplicated pool addresses in allowlists', async () => { +function detectDuplicatesInVotingList( + networkName: string, + addresses: string[] +) { + const duplicatedPoolAddresses = getDuplicatedAddresses(addresses); + if (duplicatedPoolAddresses.length > 0) + throw new Error( + `Network ${networkName}: found duplicated pool addresses in Stakable.VotingListPools: ${duplicatedPoolAddresses} + Review /src/lib/config/${networkName}/pools.ts to remove duplicates. + ` + ); +} + +test('Detect duplicated pool addresses in Staking.VotingGaugePools addresses', async () => { Object.values(config).forEach(networkConfig => { detectDuplicates( networkConfig.network, 'Stable', - networkConfig.pools['Stable'].AllowList + networkConfig.pools.Stable.AllowList ); detectDuplicates( networkConfig.network, 'Weighted', - networkConfig.pools['Weighted'].AllowList + networkConfig.pools.Weighted.AllowList ); detectDuplicates( networkConfig.network, 'Investment', - networkConfig.pools['Investment'].AllowList + networkConfig.pools.Investment.AllowList + ); + }); +}); + +test('Detect duplicated pool addresses in voting list', async () => { + Object.values(config).forEach(networkConfig => { + detectDuplicatesInVotingList( + networkConfig.network, + networkConfig.pools.Stakable.VotingGaugePools ); }); }); diff --git a/src/lib/scripts/automatic-prs/allowlist-pool.ts b/src/lib/scripts/automatic-prs/allowlist-pool.ts index 9db668416f..6c3b38d321 100644 --- a/src/lib/scripts/automatic-prs/allowlist-pool.ts +++ b/src/lib/scripts/automatic-prs/allowlist-pool.ts @@ -5,7 +5,7 @@ * 4. Writes new file content back to file. * * Example usage: - * npx vite-node ./src/lib/scripts/automatic-prs/allowlist-pool.ts --network mainnet --poolType=stable --poolId=\"0x...\" --poolDescription=foo/bar/baz + * npx vite-node ./src/lib/scripts/automatic-prs/allowlist-pool.ts --network ethereum --poolType=stable --poolId=\"0x...\" --poolDescription=foo/bar/baz */ import { cac } from 'cac'; @@ -25,6 +25,8 @@ const poolId = options.poolId.replace(/[^0-9a-fA-Fx]+/g, '') as string; const poolType = capitalize(options.poolType); let network = options.network as string; network = network.toLowerCase(); +// Allow ethereum alias to correctly generate pool link from allowlist-manual.yml +if (network === 'ethereum') network = 'mainnet'; const { poolDescription } = options; validateInput({ poolType, network, poolId }); diff --git a/src/providers/local/exit-pool.provider.ts b/src/providers/local/exit-pool.provider.ts index 55d2176788..214ba5f62b 100644 --- a/src/providers/local/exit-pool.provider.ts +++ b/src/providers/local/exit-pool.provider.ts @@ -186,12 +186,15 @@ export const exitPoolProvider = ( shouldSignRelayer.value ? [relayerApprovalAction.value] : [] ); + const canSwapExit = computed( + (): boolean => isDeep(pool.value) && isPreMintedBptType(pool.value.poolType) + ); + const shouldUseSwapExit = computed( (): boolean => isSingleAssetExit.value && - isDeep(pool.value) && - isPreMintedBptType(pool.value.poolType) && - !includesAddress(pool.value.tokensList, singleAmountOut.address) + !includesAddress(pool.value.tokensList, singleAmountOut.address) && + canSwapExit.value ); const shouldUseGeneralisedExit = computed( @@ -604,6 +607,7 @@ export const exitPoolProvider = ( relayerSignature, relayerApprovalTx, shouldUseSwapExit, + canSwapExit, shouldUseRecoveryExit, // methods