From 385d4fa139163cbf4a5b62e21e22aedddb8791dc Mon Sep 17 00:00:00 2001 From: groninge Date: Wed, 20 Nov 2024 11:16:25 +0100 Subject: [PATCH 1/9] add script --- apps/beets-frontend-v3/package.json | 1 + apps/frontend-v3/package.json | 1 + 2 files changed, 2 insertions(+) diff --git a/apps/beets-frontend-v3/package.json b/apps/beets-frontend-v3/package.json index 19ca2535b..ddb610fb6 100644 --- a/apps/beets-frontend-v3/package.json +++ b/apps/beets-frontend-v3/package.json @@ -6,6 +6,7 @@ "scripts": { "build": "pnpm --filter @repo/lib graphql:gen && next build", "dev": "concurrently \"pnpm --filter @repo/lib graphql:gen --watch\" \"next dev -p 3001\"", + "dev:mock": "next dev -p 3001", "gen:wagmi": "pnpm wagmi generate", "lint": "next lint", "lint:fix": "next lint --fix", diff --git a/apps/frontend-v3/package.json b/apps/frontend-v3/package.json index a716a831c..3162b5cee 100644 --- a/apps/frontend-v3/package.json +++ b/apps/frontend-v3/package.json @@ -6,6 +6,7 @@ "scripts": { "build": "pnpm --filter @repo/lib graphql:gen && next build", "dev": "concurrently \"pnpm --filter @repo/lib graphql:gen --watch\" \"next dev\"", + "dev:mock": "next dev", "gen:wagmi": "pnpm wagmi generate", "lint": "next lint", "lint:fix": "next lint --fix", From e9f4ebaa29d6a4c6b403fa9652a496524b326513 Mon Sep 17 00:00:00 2001 From: groninge Date: Wed, 20 Nov 2024 11:49:59 +0100 Subject: [PATCH 2/9] update graphql --- packages/lib/shared/services/api/pool.graphql | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/lib/shared/services/api/pool.graphql b/packages/lib/shared/services/api/pool.graphql index 6b1ea97f0..05531c852 100644 --- a/packages/lib/shared/services/api/pool.graphql +++ b/packages/lib/shared/services/api/pool.graphql @@ -244,6 +244,11 @@ fragment PoolTokens on GqlPoolTokenDetail { name symbol } + erc4626ReviewData { + reviewFile + summary + warnings + } } query GetPoolSnapshots($poolId: String!, $range: GqlPoolSnapshotDataRange!, $chainId: GqlChain!) { From 4d0cf8334a96ac555cba68facb2e9ee7692b8686 Mon Sep 17 00:00:00 2001 From: groninge Date: Mon, 25 Nov 2024 14:44:52 +0100 Subject: [PATCH 3/9] update graphql --- packages/lib/shared/services/api/pool.graphql | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/lib/shared/services/api/pool.graphql b/packages/lib/shared/services/api/pool.graphql index 855293b3c..112c37ff0 100644 --- a/packages/lib/shared/services/api/pool.graphql +++ b/packages/lib/shared/services/api/pool.graphql @@ -227,9 +227,15 @@ fragment PoolTokens on GqlPoolTokenDetail { type tokens { index + name address decimals isErc4626 + erc4626ReviewData { + reviewFile + summary + warnings + } underlyingToken { address decimals From 342fc491296ee362573d513028c450a9fa1dbc5a Mon Sep 17 00:00:00 2001 From: groninge Date: Mon, 25 Nov 2024 17:09:39 +0100 Subject: [PATCH 4/9] add erc4626 review to ui --- .../PoolDetail/PoolInfo/PoolContracts.tsx | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/packages/lib/modules/pool/PoolDetail/PoolInfo/PoolContracts.tsx b/packages/lib/modules/pool/PoolDetail/PoolInfo/PoolContracts.tsx index e2bed9fb8..53531e1b2 100644 --- a/packages/lib/modules/pool/PoolDetail/PoolInfo/PoolContracts.tsx +++ b/packages/lib/modules/pool/PoolDetail/PoolInfo/PoolContracts.tsx @@ -146,6 +146,14 @@ export function PoolContracts({ ...props }: CardProps) { return [...(pool.hook ? [pool.hook] : []), ...nestedHooks] }, [pool]) + const erc4626Tokens = useMemo(() => { + const erc4626Tokens = pool.poolTokens.filter(token => token.isErc4626) + const erc4626NestedTokens = pool.poolTokens.flatMap(token => + token.nestedPool ? token.nestedPool.tokens.filter(token => token.isErc4626) : [] + ) + return [...(erc4626Tokens ? erc4626Tokens : []), ...erc4626NestedTokens] + }, [pool]) + return ( @@ -274,6 +282,57 @@ export function PoolContracts({ ...props }: CardProps) { )} + {erc4626Tokens.length > 0 && ( + + + + + + {erc4626Tokens.length === 1 ? 'ERC4626 token:' : 'ERC4626 tokens:'} + + + + + erc4626 text + + + + + + + {erc4626Tokens.map(erc4626Token => { + const token = getToken(erc4626Token.address, chain) + return ( + token && ( + + + + + + + {abbreviateAddress(erc4626Token.address)} + + + + {/* {getRateProviderIcon(erc4626Token.address, token)} */} + + ) + ) + })} + + + + )} ) From 4ff09f70c90639076001c2e889c83f4a4a0e2061 Mon Sep 17 00:00:00 2001 From: groninge Date: Tue, 26 Nov 2024 07:47:45 +0100 Subject: [PATCH 5/9] update text --- .../lib/modules/pool/PoolDetail/PoolInfo/PoolContracts.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/lib/modules/pool/PoolDetail/PoolInfo/PoolContracts.tsx b/packages/lib/modules/pool/PoolDetail/PoolInfo/PoolContracts.tsx index 53531e1b2..6dcf70cdc 100644 --- a/packages/lib/modules/pool/PoolDetail/PoolInfo/PoolContracts.tsx +++ b/packages/lib/modules/pool/PoolDetail/PoolInfo/PoolContracts.tsx @@ -288,12 +288,14 @@ export function PoolContracts({ ...props }: CardProps) { - {erc4626Tokens.length === 1 ? 'ERC4626 token:' : 'ERC4626 tokens:'} + {erc4626Tokens.length === 1 ? 'Tokenized vault:' : 'Tokenized vaults:'} - erc4626 text + ERC-4626 (tokenized vault) is a standard to optimize and unify the technical + parameters of yield-bearing vaults. It provides a standard API for tokenized + yield-bearing vaults that represent shares of a single underlying ERC-20 token. From f7900527887ec307030f4bca998b1662b75f2aaf Mon Sep 17 00:00:00 2001 From: groninge Date: Tue, 26 Nov 2024 08:26:59 +0100 Subject: [PATCH 6/9] update erc4626 info --- .../pool/PoolDetail/PoolInfo/Erc4626Info.tsx | 135 ++++++++++++++++++ .../PoolDetail/PoolInfo/PoolContracts.tsx | 46 +++--- 2 files changed, 164 insertions(+), 17 deletions(-) create mode 100644 packages/lib/modules/pool/PoolDetail/PoolInfo/Erc4626Info.tsx diff --git a/packages/lib/modules/pool/PoolDetail/PoolInfo/Erc4626Info.tsx b/packages/lib/modules/pool/PoolDetail/PoolInfo/Erc4626Info.tsx new file mode 100644 index 000000000..00bf5f12e --- /dev/null +++ b/packages/lib/modules/pool/PoolDetail/PoolInfo/Erc4626Info.tsx @@ -0,0 +1,135 @@ +import { TokenIcon } from '@repo/lib/modules/tokens/TokenIcon' +import { Erc4626ReviewData, GqlToken } from '@repo/lib/shared/services/api/generated/graphql' +import { + Popover, + PopoverTrigger, + PopoverContent, + PopoverArrow, + PopoverBody, + VStack, + HStack, + Text, + Heading, + Box, + Icon, +} from '@chakra-ui/react' +import Link from 'next/link' +import { ArrowUpRight } from 'react-feather' +import { getWarnings } from '../../pool.helpers' +import { PropsWithChildren } from 'react' + +type Erc4626InfoPopOverProps = { + token: GqlToken + data: Erc4626ReviewData | undefined | null + level: number +} & PropsWithChildren + +type PopoverInfoBodyProps = { + data: Erc4626ReviewData + level: number +} + +function PopoverInfoBody({ data, level }: PopoverInfoBodyProps) { + const warnings = getWarnings(data.warnings || []) + return ( + <> + {level === 0 && ( + <> + + This tokenized vault has not been reviewed. +
+ Proceed with caution. +
+ + Learn more about{' '} + + + tokenized vault risks + + + + + )} + {level !== 0 && ( + <> + + + Review summary: + + + {data.summary === 'safe' ? 'No vulnerabilities were reported' : 'Unsafe'} + + + + + Warnings: + + {warnings.length > 0 ? ( + Yes, see review details + ) : ( + + None except{' '} + + + tokenized vault risks + + + + )} + + {data.reviewFile && ( + + + + View review details + + + + + )} + + )} + + ) +} + +export function Erc4626InfoPopOver({ token, data, level, children }: Erc4626InfoPopOverProps) { + const body = data ? ( + + ) : ( + + Rate provider data is missing. +
+ Proceed with caution. +
+ ) + + return ( + + {children} + + + + + + + {token.symbol} tokenized vault + + + + {body} + + + + + ) +} diff --git a/packages/lib/modules/pool/PoolDetail/PoolInfo/PoolContracts.tsx b/packages/lib/modules/pool/PoolDetail/PoolInfo/PoolContracts.tsx index 6dcf70cdc..1be97a509 100644 --- a/packages/lib/modules/pool/PoolDetail/PoolInfo/PoolContracts.tsx +++ b/packages/lib/modules/pool/PoolDetail/PoolInfo/PoolContracts.tsx @@ -26,6 +26,7 @@ import { GqlPriceRateProviderData, GqlToken, GqlHookReviewData, + Erc4626ReviewData, } from '@repo/lib/shared/services/api/generated/graphql' import { Address, zeroAddress } from 'viem' import { useTokens } from '@repo/lib/modules/tokens/TokensProvider' @@ -36,6 +37,7 @@ import { RateProviderInfoPopOver } from './RateProviderInfo' import { getBlockExplorerAddressUrl } from '@repo/lib/shared/hooks/useBlockExplorer' import { getWarnings } from '@repo/lib/modules/pool/pool.helpers' import { HookInfoPopOver } from './HookInfo' +import { Erc4626InfoPopOver } from './Erc4626Info' type RateProvider = { tokenAddress: Address @@ -86,6 +88,20 @@ function getRateProviderIcon(data: GqlPriceRateProviderData | null, token: GqlTo ) } +function getErc4626Icon(data: Erc4626ReviewData | undefined | null, token: GqlToken) { + const hasWarnings = getWarnings(data?.warnings || []).length > 0 + const hasData = !!data + const isSafe = hasData && data?.summary === 'safe' + + const { icon, level } = getIconAndLevel(hasWarnings, isSafe, hasData) + + return ( + + {icon} + + ) +} + function getHookIcon(data: GqlHookReviewData | undefined | null) { const hasWarnings = getWarnings(data?.warnings || []).length > 0 const isSafe = !!data?.summary && data?.summary === 'safe' @@ -252,14 +268,12 @@ export function PoolContracts({ ...props }: CardProps) { return ( token && ( - - - + - - - + - {/* {getRateProviderIcon(erc4626Token.address, token)} */} + {getErc4626Icon(erc4626Token.erc4626ReviewData, token)} ) ) From c73cf1355b9bd2352ee34c2916a7d6839915ee5c Mon Sep 17 00:00:00 2001 From: groninge Date: Tue, 26 Nov 2024 08:40:02 +0100 Subject: [PATCH 7/9] rename --- apps/beets-frontend-v3/package.json | 2 +- apps/frontend-v3/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/beets-frontend-v3/package.json b/apps/beets-frontend-v3/package.json index ddb610fb6..4116f7f6e 100644 --- a/apps/beets-frontend-v3/package.json +++ b/apps/beets-frontend-v3/package.json @@ -6,7 +6,7 @@ "scripts": { "build": "pnpm --filter @repo/lib graphql:gen && next build", "dev": "concurrently \"pnpm --filter @repo/lib graphql:gen --watch\" \"next dev -p 3001\"", - "dev:mock": "next dev -p 3001", + "dev:no-gen": "next dev -p 3001", "gen:wagmi": "pnpm wagmi generate", "lint": "next lint", "lint:fix": "next lint --fix", diff --git a/apps/frontend-v3/package.json b/apps/frontend-v3/package.json index 3162b5cee..b9a9d3067 100644 --- a/apps/frontend-v3/package.json +++ b/apps/frontend-v3/package.json @@ -6,7 +6,7 @@ "scripts": { "build": "pnpm --filter @repo/lib graphql:gen && next build", "dev": "concurrently \"pnpm --filter @repo/lib graphql:gen --watch\" \"next dev\"", - "dev:mock": "next dev", + "dev:no-gen": "next dev", "gen:wagmi": "pnpm wagmi generate", "lint": "next lint", "lint:fix": "next lint --fix", From 19f7cb4e7ab0859aaa28d230e34dc1c16e853f17 Mon Sep 17 00:00:00 2001 From: Alberto Gualis Date: Tue, 26 Nov 2024 09:36:33 +0100 Subject: [PATCH 8/9] chore: update polygon block number for integration tests --- packages/lib/test/anvil/anvil-setup.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/lib/test/anvil/anvil-setup.ts b/packages/lib/test/anvil/anvil-setup.ts index bde834f68..48aefbab1 100644 --- a/packages/lib/test/anvil/anvil-setup.ts +++ b/packages/lib/test/anvil/anvil-setup.ts @@ -58,7 +58,7 @@ export const ANVIL_NETWORKS: Record = { fallBackRpc: 'https://polygon-rpc.com', port: ANVIL_PORTS.Polygon, // Note - this has to be >= highest blockNo used in tests - forkBlockNumber: 60496806n, + forkBlockNumber: 64747630n, }, Sepolia: { networkName: 'Sepolia', From 5a180e6641cd0cb6749a34b85fe2cc1faf185e86 Mon Sep 17 00:00:00 2001 From: Alberto Gualis Date: Tue, 26 Nov 2024 09:55:01 +0100 Subject: [PATCH 9/9] chore: skip integration test until dRPC fixes issue --- .../receipts/receipt.hooks.integration.spec.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/lib/modules/transactions/transaction-steps/receipts/receipt.hooks.integration.spec.ts b/packages/lib/modules/transactions/transaction-steps/receipts/receipt.hooks.integration.spec.ts index 71f9e995c..3e39d82c4 100644 --- a/packages/lib/modules/transactions/transaction-steps/receipts/receipt.hooks.integration.spec.ts +++ b/packages/lib/modules/transactions/transaction-steps/receipts/receipt.hooks.integration.spec.ts @@ -65,7 +65,10 @@ test('queries add liquidity transaction', async () => { expect(result.current.receivedBptUnits).toBe('7.669852124112308228') }) -test('queries add liquidity with native token', async () => { +/* + Skip until dRPC fixes issue with polygon tx queries +*/ +test.skip('queries add liquidity with native token', async () => { // https://polygonscan.com/tx/0x611a0eeeff15c2a5efc587b173fa577475134de2554a452259f112db67bd4de8 const userAddress = '0xf76142b79Db34E57852d68F9c52C0E24f7349647' const txHash = '0x611a0eeeff15c2a5efc587b173fa577475134de2554a452259f112db67bd4de8'