import {
Accordion,
AccordionDetails,
AccordionSummary,
Box,
Button,
Typography,
Skeleton,
useTheme,
} from "@mui/material";
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
import { ChangeEvent, useState, useEffect } from "react";
import { useNavigate, createSearchParams } from "react-router-dom";
import { useQuery } from "react-query";
import { formatCurrency, formatNumber } from "../../../helpers";
import GhostStyledIcon from "../../Icon/GhostIcon";
import TokenStack from "../../TokenStack/TokenStack";
import { PrimaryButton, SecondaryButton } from "../../Button";
import { useBalance, useTokenSymbol } from "../../../hooks/tokens";
import { useDaiPrice, useFtsoPrice, useStnkPrice, useGhstPrice } from "../../../hooks/prices";
import { useLpValuation } from "../../../hooks/treasury";
import { useAccount } from "wagmi";
const addTokenToWallet = async (token, userAddress) => {
if (!window.ethereum) return;
try {
await window.ethereum.request({
method: "wallet_watchAsset",
params: {
type: "ERC20",
options: {
address: token.address,
symbol: token.symbol,
decimals: token.balance._decimals,
image: token.externalUrl, // external host
},
},
});
} catch (error) {
console.log(error);
}
};
const BalanceValue = ({
balance,
balanceValueUSD,
isLoading = false,
}) => (
{formatNumber(balance, 5)}
{formatCurrency(balanceValueUSD, 2)}
);
export const Token = (props) => {
const {
symbol,
icons,
address,
price = 0,
balance,
onAddTokenToWallet,
expanded,
onChangeExpanded,
daiAddress,
onClose,
isPool
} = props;
const theme = useTheme();
const navigate = useNavigate();
const useLink = (symbol, fromAddress, toAddress, isPool) => {
if (symbol.toUpperCase() === "GDAI") {
navigate({ pathname: "/faucet" })
} else {
navigate({
pathname: "/dex/uniswap",
search: isPool ?
createSearchParams({
pool: "true",
from: `${fromAddress}`,
to: `${toAddress}`,
}).toString()
:
createSearchParams({
from: `${fromAddress}`,
to: `${toAddress}`,
}).toString()
})
}
onClose();
}
return (
}>
{symbol}
Add to Wallet
useLink(symbol, daiAddress, address, isPool)}
fullWidth
>
Get on {symbol.toUpperCase() === "GDAI" ? "Faucet" : "Uniswap"}
);
};
const sumObjValues = (obj: Record = {}) =>
Object.values(obj).reduce((sum, b = "0.0") => sum + (parseFloat(b) || 0), 0);
export const useWallet = (chainId, userAddress) => {
const {
balance: daiBalance,
refetch: daiRefetch,
contractAddress: daiAddress,
} = useBalance(chainId, "GDAI", userAddress);
const {
balance: ftsoBalance,
refetch: ftsoRefetch,
contractAddress: ftsoAddress,
} = useBalance(chainId, "FTSO", userAddress);
const {
balance: stnkBalance,
refetch: stnkRefetch,
contractAddress: stnkAddress,
} = useBalance(chainId, "STNK", userAddress);
const {
balance: ghstBalance,
refetch: ghstRefetch,
contractAddress: ghstAddress,
} = useBalance(chainId, "GHST", userAddress);
const {
balance: lpDaiFtsoBalance,
refetch: lpDaiFtsoRefetch,
contractAddress: lpDaiFtsoBalanceAddress,
} = useBalance(chainId, "GDAI_FTSO", userAddress);
const daiPrice = useDaiPrice(chainId);
const ftsoPrice = useFtsoPrice(chainId);
const stnkPrice = useStnkPrice(chainId);
const ghstPrice = useGhstPrice(chainId);
const lpDaiFtsoPrice = useLpValuation(chainId, "GDAI_FTSO", 1000000000000000000n);
const { symbol: daiSymbol } = useTokenSymbol(chainId, "GDAI");
const { symbol: ftsoSymbol } = useTokenSymbol(chainId, "FTSO");
const { symbol: stnkSymbol } = useTokenSymbol(chainId, "STNK");
const { symbol: ghstSymbol } = useTokenSymbol(chainId, "GHST");
const { symbol: lpDaiFtsoSymbol } = useTokenSymbol(chainId, "GDAI_FTSO");
const tokens = {
dai: {
symbol: daiSymbol,
address: daiAddress,
balance: daiBalance,
price: daiPrice,
icons: ["GDAI"],
externalUrl: "https://ghostchain.io/wp-content/uploads/2025/03/gDAI.svg",
refetch: daiRefetch,
},
ftso: {
symbol: ftsoSymbol,
address: ftsoAddress,
balance: ftsoBalance,
price: ftsoPrice,
icons: ["FTSO"],
externalUrl: "https://ghostchain.io/wp-content/uploads/2025/03/eGHST.svg",
refetch: ftsoRefetch,
},
stnk: {
symbol: stnkSymbol,
address: stnkAddress,
balance: stnkBalance,
price: stnkPrice,
icons: ["STNK"],
externalUrl: "https://ghostchain.io/wp-content/uploads/2025/03/sGHST.svg",
refetch: stnkRefetch,
},
ghst: {
symbol: ghstSymbol,
address: ghstAddress,
balance: ghstBalance,
price: ghstPrice,
icons: ["GHST"],
externalUrl: "https://ghostchain.io/wp-content/uploads/2025/03/GHST.svg",
refetch: ghstRefetch,
},
daiFtso: {
isPool: true,
symbol: lpDaiFtsoSymbol,
address: lpDaiFtsoBalanceAddress,
balance: lpDaiFtsoBalance,
price: lpDaiFtsoPrice,
icons: ["GDAI", "FTSO"],
externalUrl: "https://ghostchain.io/wp-content/uploads/2025/03/uni-v2.svg",
refetch: lpDaiFtsoRefetch,
}
};
return Object.entries(tokens).reduce((wallet, [key, token]) => {
return {
...wallet,
[key]: {
...token,
totalBalance: "0",
},
};
}, {});
};
export const Tokens = ({ address, tokens, onClose }) => {
const [expanded, setExpanded] = useState(null);
const alwaysShowTokens = [tokens.dai, tokens.ftso, tokens.stnk, tokens.ghst, tokens.daiFtso];
const tokenProps = (token) => ({
...token,
expanded: expanded === token.symbol,
daiAddress: tokens.dai.address,
onChangeExpanded: (e, isExpanded) => setExpanded(isExpanded ? token.symbol : null),
onAddTokenToWallet: () => addTokenToWallet(token, address),
onClose: () => onClose(),
});
return (
<>
{alwaysShowTokens.map((token, i) => (
))}
>
);
};