Compare commits

..

6 Commits

Author SHA1 Message Date
5c7546b0d9
refetch token balances on each wallet open
Signed-off-by: Uncle Fatso <uncle.fatso@ghostchain.io>
2025-08-20 21:39:28 +03:00
46ef25613c
update available bonds after claim
Signed-off-by: Uncle Fatso <uncle.fatso@ghostchain.io>
2025-08-20 21:38:42 +03:00
37c447ece5
disable buttons during bond claims
Signed-off-by: Uncle Fatso <uncle.fatso@ghostchain.io>
2025-08-20 21:15:49 +03:00
c3dbe0666f
refetch balance after confirmation popup closed during bond purchase
Signed-off-by: Uncle Fatso <uncle.fatso@ghostchain.io>
2025-08-20 21:15:01 +03:00
e8342708c4
fix issue during UNSTAKE and avoid false warmup popup
Signed-off-by: Uncle Fatso <uncle.fatso@ghostchain.io>
2025-08-16 16:53:54 +03:00
13a05bf0dd
fix issues with bond representation and bond purchase
Signed-off-by: Uncle Fatso <uncle.fatso@ghostchain.io>
2025-08-14 16:13:40 +03:00
9 changed files with 32 additions and 16 deletions

View File

@ -1,7 +1,7 @@
{
"name": "ghost-dao-interface",
"private": true,
"version": "0.2.4",
"version": "0.2.10",
"type": "module",
"scripts": {
"dev": "vite",

View File

@ -12,7 +12,7 @@ import {
import { styled } from '@mui/material/styles';
import CloseIcon from '@mui/icons-material/Close';
import LoopIcon from '@mui/icons-material/Loop';
import { ReactElement, useState } from "react";
import { ReactElement, useState, useEffect } from "react";
import { useNavigate, createSearchParams } from "react-router-dom";
import GhostStyledIcon from "../../Icon/GhostIcon";
@ -105,7 +105,7 @@ const WalletTotalValue = ({ address, tokens }) => {
);
};
function InitialWalletView({ address, chainId, onClose }) {
function InitialWalletView({ isWalletOpen, address, chainId, onClose }) {
const theme = useTheme();
const navigate = useNavigate();
const tokens = useWallet(chainId, address);
@ -122,6 +122,12 @@ function InitialWalletView({ address, chainId, onClose }) {
onClose();
}
useEffect(() => {
if (isWalletOpen) {
Object.values(tokens ?? {}).forEach(token => token.refetch());
}
}, [isWalletOpen, tokens])
return (
<Paper>
<Box sx={{ padding: theme.spacing(0, 3), display: "flex", flexDirection: "column", minHeight: "100vh" }}>

View File

@ -192,6 +192,7 @@ export const useWallet = (chainId, userAddress) => {
price: daiPrice,
icons: ["GDAI"],
externalUrl: "https://ghostchain.io/wp-content/uploads/2025/03/gDAI.svg",
refetch: daiRefetch,
},
ftso: {
symbol: ftsoSymbol,
@ -200,6 +201,7 @@ export const useWallet = (chainId, userAddress) => {
price: ftsoPrice,
icons: ["FTSO"],
externalUrl: "https://ghostchain.io/wp-content/uploads/2025/03/eGHST.svg",
refetch: ftsoRefetch,
},
stnk: {
symbol: stnkSymbol,
@ -208,6 +210,7 @@ export const useWallet = (chainId, userAddress) => {
price: stnkPrice,
icons: ["STNK"],
externalUrl: "https://ghostchain.io/wp-content/uploads/2025/03/sGHST.svg",
refetch: stnkRefetch,
},
ghst: {
symbol: ghstSymbol,
@ -216,6 +219,7 @@ export const useWallet = (chainId, userAddress) => {
price: ghstPrice,
icons: ["GHST"],
externalUrl: "https://ghostchain.io/wp-content/uploads/2025/03/GHST.svg",
refetch: ghstRefetch,
},
daiFtso: {
isPool: true,
@ -225,6 +229,7 @@ export const useWallet = (chainId, userAddress) => {
price: lpDaiFtsoPrice,
icons: ["GDAI", "FTSO"],
externalUrl: "https://ghostchain.io/wp-content/uploads/2025/03/uni-v2.svg",
refetch: lpDaiFtsoRefetch,
}
};

View File

@ -76,7 +76,7 @@ export function Wallet({ address, chainId, connect }) {
onOpen={openWallet}
onClose={closeWallet}
>
<InitialWalletView address={address} chainId={chainId} onClose={closeWallet} />
<InitialWalletView isWalletOpen={isWalletOpen} address={address} chainId={chainId} onClose={closeWallet} />
</StyledSwipeableDrawer>
</>
);

View File

@ -34,6 +34,7 @@ const BondConfirmModal = ({
spendAmountValue,
spendAmount,
receiveAmount,
sender,
handleSettingsOpen,
isOpen,
handleConfirmClose
@ -58,6 +59,7 @@ const BondConfirmModal = ({
spendAmountValue._value.toBigInt(),
maxPrice,
recipientAddress,
sender,
referral
);

View File

@ -20,7 +20,7 @@ import DataRow from "../../../components/DataRow/DataRow";
import Paper from "../../../components/Paper/Paper";
import { useCurrentIndex } from "../../../hooks/staking";
import { useBalance } from "../../../hooks/tokens";
import { useBalance, useTokenSymbol } from "../../../hooks/tokens";
const BondInputArea = ({
bond,
@ -35,7 +35,7 @@ const BondInputArea = ({
const { pathname } = useLocation();
const { currentIndex } = useCurrentIndex(chainId);
const { balance } = useBalance(chainId, bond.quoteToken.quoteTokenAddress, address);
const { balance, refetch } = useBalance(chainId, bond.quoteToken.quoteTokenAddress, address);
const { symbol: ftsoSymbol } = useTokenSymbol(chainId, "FTSO");
const { symbol: ghstSymbol } = useTokenSymbol(chainId, "GHST");
@ -60,6 +60,7 @@ const BondInputArea = ({
const handleConfirmClose = () => {
setAmount("");
setConfirmOpen(false);
refetch();
}
const setMax = () => {
@ -220,6 +221,7 @@ const BondInputArea = ({
receiveAmount={formatNumber(amountInBaseToken, formatDecimals)}
handleSettingsOpen={handleSettingsOpen}
isOpen={confirmOpen}
sender={address}
handleConfirmClose={() => handleConfirmClose()}
/>
</Box>

View File

@ -59,7 +59,7 @@ export const ClaimBonds = ({ chainId, address, secondsTo }) => {
const onSubmit = async (indexes) => {
const isFundsInWarmup = warmupInfo.deposit._value > 0n;
if ((warmupExists && isFundsInWarmup) || !isPreClaimConfirmed) {
if (warmupExists && isFundsInWarmup && !isPreClaimConfirmed) {
setIsWapmup(true);
} else {
setIsPending(true);
@ -69,6 +69,7 @@ export const ClaimBonds = ({ chainId, address, secondsTo }) => {
isPayoutGhst,
indexes
);
await notesRefetch();
setIsPending(false);
}
}
@ -117,7 +118,7 @@ export const ClaimBonds = ({ chainId, address, secondsTo }) => {
</Box>
<PrimaryButton
disabled={totalClaimableBalance._value === 0n}
disabled={isPending || totalClaimableBalance._value === 0n}
fullWidth
className=""
onClick={() => onSubmit(notes.filter((note) => secondsTo > note.matured).map(note => note.id))}
@ -166,7 +167,7 @@ export const ClaimBonds = ({ chainId, address, secondsTo }) => {
<Box mt="16px">
<TertiaryButton
fullWidth
disabled={secondsTo < note.matured}
disabled={isPending || secondsTo < note.matured}
onClick={() => onSubmit([note.id])}
>
Claim
@ -222,7 +223,7 @@ export const ClaimBonds = ({ chainId, address, secondsTo }) => {
<TableCell style={{ padding: "8px 0" }}>
<TertiaryButton
fullWidth
disabled={secondsTo < note.matured}
disabled={isPending || secondsTo < note.matured}
onClick={() => onSubmit([note.id])}
>
Claim

View File

@ -84,7 +84,7 @@ const StakeConfirmationModal = (props) => {
);
break;
case "UNSTAKE":
isRebase = props.upperToken === stnkSymbol;
isRebase = props.upperToken === props.stnkSymbol;
await unstake(
props.chainId,
props.address,

View File

@ -152,13 +152,13 @@ export const useLiveBonds = (chainId) => {
discount,
displayName: getBondNameDisplayName(chainId, bondName, quoteTokenAddress),
baseToken: {
name: quoteTokenSymbol,
name: baseTokenSymbol,
purchaseUrl: getTokenPurchaseLink(chainId, ""),
icons: ["FTSO"],
tokenAddress: getTokenAddress(chainId, "FTSO")
},
quoteToken: {
name: quoteTokenName,
name: quoteTokenSymbol,
purchaseUrl: getTokenPurchaseLink(chainId, quoteTokenAddress),
icons: getTokenIcons(chainId, quoteTokenAddress),
decimals: quoteTokenDecimals,
@ -258,10 +258,10 @@ export const useNotes = (chainId, address) => {
}
}) : [];
return { notes };
return { notes, refetch };
}
export const purchaseBond = async (chainId, bondId, amount, maxPrice, user, referral) => {
export const purchaseBond = async (chainId, bondId, amount, maxPrice, user, sender, referral) => {
const args = [
bondId,
amount,
@ -278,7 +278,7 @@ export const purchaseBond = async (chainId, bondId, amount, maxPrice, user, refe
chainId,
"deposit",
args,
user,
sender,
messages
);
}