diff --git a/packages/nextjs/app/hooks/_components/HooksCards.tsx b/packages/nextjs/app/hooks/HookDetails.tsx similarity index 70% rename from packages/nextjs/app/hooks/_components/HooksCards.tsx rename to packages/nextjs/app/hooks/HookDetails.tsx index 898bd39f..0a848771 100644 --- a/packages/nextjs/app/hooks/_components/HooksCards.tsx +++ b/packages/nextjs/app/hooks/HookDetails.tsx @@ -2,10 +2,11 @@ import { useState } from "react"; import Link from "next/link"; -import { type HookDetails } from "../page"; +import { type HookInfo } from "./page"; +import { ArrowTopRightOnSquareIcon } from "@heroicons/react/24/outline"; import Modal from "~~/components/common/Modal"; -export const HooksCards = ({ hooks }: { hooks: HookDetails[] }) => { +export const HooksDetails = ({ hooks }: { hooks: HookInfo[] }) => { const [activeModal, setActiveModal] = useState(null); const modalContent = (id: number) => { @@ -14,12 +15,16 @@ export const HooksCards = ({ hooks }: { hooks: HookDetails[] }) => { if (!hook) return null; const categories = hook.category.join(", "); return ( -
-

{hook.title}

-
Created By {hook.created_by}
-

{hook.description}

-
Audited: {hook.audited}
+
+
+

{hook.title}

+
Created By {hook.created_by}
+
+ +
{hook.description}
+
+
Audited: {hook.audited}
Categories: {categories}
{ {hooks.map(hook => (
setActiveModal(hook.id)} > -
{hook.title}
+
{hook.title}
-
+
- {hook.github.slice(0, 40)}... + github
-
{hook.category}
-
{hook.created_by}
+
{hook.category}
+
{hook.created_by}
))} diff --git a/packages/nextjs/app/hooks/page.tsx b/packages/nextjs/app/hooks/page.tsx index fae95863..15dbc20e 100644 --- a/packages/nextjs/app/hooks/page.tsx +++ b/packages/nextjs/app/hooks/page.tsx @@ -1,8 +1,8 @@ import Link from "next/link"; -import { HooksCards } from "./_components/HooksCards"; +import { HooksDetails } from "./HookDetails"; import type { NextPage } from "next"; -export type HookDetails = { +export type HookInfo = { id: number; title: string; source: string; @@ -15,7 +15,7 @@ export type HookDetails = { }; const Hooks: NextPage = async () => { - let hooks: HookDetails[] | null = null; + let hooks: HookInfo[] | null = null; const response = await fetch("https://raw.githubusercontent.com/burns2854/balancer-hooks/main/hook-data.json"); if (response.ok) { hooks = await response.json(); @@ -40,13 +40,13 @@ const Hooks: NextPage = async () => {
-
-
Name
-
Repo URL
-
Category
-
Created By
+
+
Name
+
Repo URL
+
Category
+
Created By
- {hooks ? :
Error fetching hooks data!
} + {hooks ? :
Error fetching hooks data!
}
); diff --git a/packages/nextjs/app/hooks/types.ts b/packages/nextjs/app/hooks/types.ts new file mode 100644 index 00000000..7fca25af --- /dev/null +++ b/packages/nextjs/app/hooks/types.ts @@ -0,0 +1,11 @@ +export type HookDetails = { + id: number; + title: string; + source: string; + description: string; + github: string; + additional_link: string; + created_by: string; + audited: "Yes" | "No"; + category: string[]; +}; diff --git a/packages/nextjs/app/pools/_components/PoolPageSkeleton.tsx b/packages/nextjs/app/pools/_components/PoolPageSkeleton.tsx new file mode 100644 index 00000000..c12e36b9 --- /dev/null +++ b/packages/nextjs/app/pools/_components/PoolPageSkeleton.tsx @@ -0,0 +1,29 @@ +import { SkeletonLoader } from "~~/components/common"; + +export const PoolPageSkeleton = () => { + return ( +
+
+
+
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+ ); +}; diff --git a/packages/nextjs/app/pools/_components/index.tsx b/packages/nextjs/app/pools/_components/index.tsx index bb9c31ed..01f94246 100644 --- a/packages/nextjs/app/pools/_components/index.tsx +++ b/packages/nextjs/app/pools/_components/index.tsx @@ -1,7 +1,4 @@ -export * from "./PoolActions"; -export * from "./PoolComposition"; -export * from "./PoolAttributes"; -export * from "./UserLiquidity"; export * from "./PoolSelector"; -export * from "./PoolConfig"; -export * from "./HooksConfig"; +export * from "./info"; +export * from "./operations"; +export * from "./PoolPageSkeleton"; diff --git a/packages/nextjs/app/pools/_components/HooksConfig.tsx b/packages/nextjs/app/pools/_components/info/HooksConfig.tsx similarity index 100% rename from packages/nextjs/app/pools/_components/HooksConfig.tsx rename to packages/nextjs/app/pools/_components/info/HooksConfig.tsx diff --git a/packages/nextjs/app/pools/_components/PoolAttributes.tsx b/packages/nextjs/app/pools/_components/info/PoolAttributes.tsx similarity index 100% rename from packages/nextjs/app/pools/_components/PoolAttributes.tsx rename to packages/nextjs/app/pools/_components/info/PoolAttributes.tsx diff --git a/packages/nextjs/app/pools/_components/PoolComposition.tsx b/packages/nextjs/app/pools/_components/info/PoolComposition.tsx similarity index 100% rename from packages/nextjs/app/pools/_components/PoolComposition.tsx rename to packages/nextjs/app/pools/_components/info/PoolComposition.tsx diff --git a/packages/nextjs/app/pools/_components/PoolConfig.tsx b/packages/nextjs/app/pools/_components/info/PoolConfig.tsx similarity index 100% rename from packages/nextjs/app/pools/_components/PoolConfig.tsx rename to packages/nextjs/app/pools/_components/info/PoolConfig.tsx diff --git a/packages/nextjs/app/pools/_components/UserLiquidity.tsx b/packages/nextjs/app/pools/_components/info/UserLiquidity.tsx similarity index 100% rename from packages/nextjs/app/pools/_components/UserLiquidity.tsx rename to packages/nextjs/app/pools/_components/info/UserLiquidity.tsx diff --git a/packages/nextjs/app/pools/_components/info/index.tsx b/packages/nextjs/app/pools/_components/info/index.tsx new file mode 100644 index 00000000..251e52bf --- /dev/null +++ b/packages/nextjs/app/pools/_components/info/index.tsx @@ -0,0 +1,5 @@ +export * from "./PoolComposition"; +export * from "./PoolAttributes"; +export * from "./UserLiquidity"; +export * from "./PoolConfig"; +export * from "./HooksConfig"; diff --git a/packages/nextjs/app/pools/_components/actions/AddLiquidityForm.tsx b/packages/nextjs/app/pools/_components/operations/AddLiquidityForm.tsx similarity index 92% rename from packages/nextjs/app/pools/_components/actions/AddLiquidityForm.tsx rename to packages/nextjs/app/pools/_components/operations/AddLiquidityForm.tsx index 2e67a629..b1be7466 100644 --- a/packages/nextjs/app/pools/_components/actions/AddLiquidityForm.tsx +++ b/packages/nextjs/app/pools/_components/operations/AddLiquidityForm.tsx @@ -1,13 +1,14 @@ import React, { useState } from "react"; -import { PoolActionButton, ResultsDisplay, TokenField } from "."; +import { ResultsDisplay, TokenField, TransactionButton } from "."; import { InputAmount, calculateProportionalAmounts } from "@balancer/sdk"; import { useQueryClient } from "@tanstack/react-query"; import { formatUnits, parseUnits } from "viem"; import { useContractEvent } from "wagmi"; import { Alert } from "~~/components/common/"; import abis from "~~/contracts/abis"; -import { useAddLiquidity, useApproveTokens, useQueryAddLiquidity, useReadTokens } from "~~/hooks/balancer/"; +import { useAddLiquidity, useQueryAddLiquidity } from "~~/hooks/balancer/"; import { PoolActionsProps, PoolOperationReceipt, TokenAmountDetails } from "~~/hooks/balancer/types"; +import { useApproveTokens, useReadTokens } from "~~/hooks/token/"; /** * 1. Query adding some amount of liquidity to the pool @@ -123,16 +124,16 @@ export const AddLiquidityForm: React.FC = ({ })} {!queryResponse || addLiquidityReceipt || isFormEmpty ? ( - ) : !sufficientAllowances ? ( - + ) : ( - + )} {queryResponse && ( diff --git a/packages/nextjs/app/pools/_components/PoolActions.tsx b/packages/nextjs/app/pools/_components/operations/PoolOperations.tsx similarity index 58% rename from packages/nextjs/app/pools/_components/PoolActions.tsx rename to packages/nextjs/app/pools/_components/operations/PoolOperations.tsx index 2640f9e0..24dc6f4d 100644 --- a/packages/nextjs/app/pools/_components/PoolActions.tsx +++ b/packages/nextjs/app/pools/_components/operations/PoolOperations.tsx @@ -1,21 +1,18 @@ import { useState } from "react"; -import { AddLiquidityForm, RemoveLiquidityForm, SwapForm } from "./actions"; +import { AddLiquidityForm, RemoveLiquidityForm, SwapForm } from "."; import { useAccount } from "wagmi"; -import { ExclamationTriangleIcon } from "@heroicons/react/24/outline"; -import { useReadTokens } from "~~/hooks/balancer"; -import { type Pool, RefetchPool } from "~~/hooks/balancer"; +import { Alert } from "~~/components/common"; +import { Pool, RefetchPool, TokenBalances } from "~~/hooks/balancer"; import { useAccountBalance, useScaffoldContractWrite } from "~~/hooks/scaffold-eth"; +import { useReadTokens } from "~~/hooks/token"; -type Action = "Swap" | "AddLiquidity" | "RemoveLiquidity"; +type Operation = "Swap" | "AddLiquidity" | "RemoveLiquidity"; /** * Allow user to swap, add liquidity, and remove liquidity from a pool */ -export const PoolActions: React.FC<{ pool: Pool; refetchPool: RefetchPool }> = ({ pool, refetchPool }) => { - const [activeTab, setActiveTab] = useState("Swap"); - - const { address } = useAccount(); - const { balance } = useAccountBalance(address); +export const PoolOperations: React.FC<{ pool: Pool; refetchPool: RefetchPool }> = ({ pool, refetchPool }) => { + const [activeTab, setActiveTab] = useState("Swap"); const tokens = pool.poolTokens.map(token => ({ address: token.address as `0x${string}`, @@ -25,8 +22,6 @@ export const PoolActions: React.FC<{ pool: Pool; refetchPool: RefetchPool }> = ( const { tokenBalances, refetchTokenBalances } = useReadTokens(tokens); - const userHasNoTokens = Object.values(tokenBalances).every(balance => balance === 0n); - const tabs = { Swap: ( = ( return (
-
-
Pool Actions
- {address && !balance ? ( - Click the faucet button in the top right corner! - ) : balance !== 0 && userHasNoTokens ? ( - - ) : pool.poolConfig?.liquidityManagement.disableUnbalancedLiquidity ? ( - This pool only allows proportional liquidity operations - ) : null} +
+
Pool Operations
+
+ +
{Object.keys(tabs).map(tab => (
{pool.poolConfig?.isPoolInitialized && ( - + )}
- - ); -}; - -const PoolPageSkeleton = () => { - return ( -
-
-
-
- -
-
- -
-
- -
-
-
-
- -
-
- -
-
-
-
+ ); }; diff --git a/packages/nextjs/components/common/Alert.tsx b/packages/nextjs/components/common/Alert.tsx index 5ba90236..6bd1bba5 100644 --- a/packages/nextjs/components/common/Alert.tsx +++ b/packages/nextjs/components/common/Alert.tsx @@ -21,7 +21,7 @@ const alertTypeMap = { export const Alert: React.FC = ({ children, type, showIcon = true }) => { const { styles, icon } = alertTypeMap[type]; return ( -
+
{showIcon &&
{icon}
}
{children}
diff --git a/packages/nextjs/hooks/balancer/index.ts b/packages/nextjs/hooks/balancer/index.ts index 97fd83e2..a47625e6 100644 --- a/packages/nextjs/hooks/balancer/index.ts +++ b/packages/nextjs/hooks/balancer/index.ts @@ -5,4 +5,3 @@ export * from "./useFactoryHistory"; export * from "./swap"; export * from "./addLiquidity"; export * from "./removeLiquidity"; -export * from "./token"; diff --git a/packages/nextjs/hooks/balancer/token/useTokenBalanceOfUser.ts b/packages/nextjs/hooks/balancer/token/useTokenBalanceOfUser.ts deleted file mode 100644 index fe0aba72..00000000 --- a/packages/nextjs/hooks/balancer/token/useTokenBalanceOfUser.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { erc20Abi } from "@balancer/sdk"; -import { Address, zeroAddress } from "viem"; -import { useContractRead, useWalletClient } from "wagmi"; - -/** - * Custom hook for dealing with a single token - */ -export const useTokenBalanceOfUser = (token: Address) => { - const { data: walletClient } = useWalletClient(); - const connectedAddress = walletClient?.account.address || zeroAddress; - - // Balance of token for the connected account - return useContractRead({ - address: token, - abi: erc20Abi, - functionName: "balanceOf", - args: [connectedAddress], - }); -}; diff --git a/packages/nextjs/hooks/balancer/token/index.ts b/packages/nextjs/hooks/token/index.ts similarity index 84% rename from packages/nextjs/hooks/balancer/token/index.ts rename to packages/nextjs/hooks/token/index.ts index e8c91fea..03254d4a 100644 --- a/packages/nextjs/hooks/balancer/token/index.ts +++ b/packages/nextjs/hooks/token/index.ts @@ -2,6 +2,5 @@ export * from "./useAllowanceOnPermit2"; export * from "./useAllowanceOnToken"; export * from "./useApproveOnPermit2"; export * from "./useApproveOnToken"; -export * from "./useTokenBalanceOfUser"; export * from "./useApproveTokens"; export * from "./useReadTokens"; diff --git a/packages/nextjs/hooks/balancer/token/useAllowanceOnPermit2.ts b/packages/nextjs/hooks/token/useAllowanceOnPermit2.ts similarity index 100% rename from packages/nextjs/hooks/balancer/token/useAllowanceOnPermit2.ts rename to packages/nextjs/hooks/token/useAllowanceOnPermit2.ts diff --git a/packages/nextjs/hooks/balancer/token/useAllowanceOnToken.ts b/packages/nextjs/hooks/token/useAllowanceOnToken.ts similarity index 100% rename from packages/nextjs/hooks/balancer/token/useAllowanceOnToken.ts rename to packages/nextjs/hooks/token/useAllowanceOnToken.ts diff --git a/packages/nextjs/hooks/balancer/token/useApproveOnPermit2.ts b/packages/nextjs/hooks/token/useApproveOnPermit2.ts similarity index 100% rename from packages/nextjs/hooks/balancer/token/useApproveOnPermit2.ts rename to packages/nextjs/hooks/token/useApproveOnPermit2.ts diff --git a/packages/nextjs/hooks/balancer/token/useApproveOnToken.ts b/packages/nextjs/hooks/token/useApproveOnToken.ts similarity index 100% rename from packages/nextjs/hooks/balancer/token/useApproveOnToken.ts rename to packages/nextjs/hooks/token/useApproveOnToken.ts diff --git a/packages/nextjs/hooks/balancer/token/useApproveTokens.ts b/packages/nextjs/hooks/token/useApproveTokens.ts similarity index 97% rename from packages/nextjs/hooks/balancer/token/useApproveTokens.ts rename to packages/nextjs/hooks/token/useApproveTokens.ts index dc8cb71e..c3eecc0f 100644 --- a/packages/nextjs/hooks/balancer/token/useApproveTokens.ts +++ b/packages/nextjs/hooks/token/useApproveTokens.ts @@ -1,7 +1,8 @@ import { useEffect, useState } from "react"; +import { useReadTokens } from "."; import { BALANCER_ROUTER, InputAmount, PERMIT2, erc20Abi, permit2Abi } from "@balancer/sdk"; import { usePublicClient, useWalletClient } from "wagmi"; -import { useReadTokens, useTargetFork } from "~~/hooks/balancer"; +import { useTargetFork } from "~~/hooks/balancer"; import { useTransactor } from "~~/hooks/scaffold-eth"; import { MaxUint48, MaxUint160, MaxUint256 } from "~~/utils/constants"; diff --git a/packages/nextjs/hooks/balancer/token/useReadTokens.ts b/packages/nextjs/hooks/token/useReadTokens.ts similarity index 100% rename from packages/nextjs/hooks/balancer/token/useReadTokens.ts rename to packages/nextjs/hooks/token/useReadTokens.ts diff --git a/packages/nextjs/tailwind.config.js b/packages/nextjs/tailwind.config.js index b7e792c3..03ab8bd6 100644 --- a/packages/nextjs/tailwind.config.js +++ b/packages/nextjs/tailwind.config.js @@ -20,7 +20,7 @@ module.exports = { "base-200": "rgb(245, 243, 239)", "base-300": "#EBE8E0", // bg color "base-content": "rgb(45, 55, 72)", - info: "#0e7490", + info: "#a78bfa", success: "#047857", warning: "#b45309", error: "#b91c1c", @@ -52,7 +52,7 @@ module.exports = { "base-200": "rgb(63, 70, 80)", "base-300": "rgb(56, 62, 71)", // bg color "base-content": "rgb(229, 211, 190)", - info: "#67e8f9", + info: "#a78bfa", success: "#34d399", warning: "#fcd34d", error: "#fca5a5", @@ -91,7 +91,7 @@ module.exports = { "error-tint": "#ef444433", "warning-tint": "#f59e0b33", "success-tint": "#10b98133", - "info-tint": "#06b6d433", + "info-tint": "#a78bfa33", }, }, },