Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 2 additions & 30 deletions src/components/vault/VaultBlock.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import { useAdaptiveInterval, useVaultApy, useVaultPointsRate } from "@/hooks";
import { Vault__factory, ERC20__factory, WhitelistRegistry__factory } from "@/typechain-types";
import { NumberDisplay, TransitionLoader } from "@/components/ui";
import vaultsConfig from "../../../vaults.config.json";
import signaturesConfig from "../../../signatures.config.json";

interface VaultBlockProps {
address: string;
Expand All @@ -23,7 +22,6 @@ interface StaticVaultData {

interface WhitelistData {
isWhitelisted: boolean | null;
hasSignature: boolean;
}

interface DynamicVaultData {
Expand Down Expand Up @@ -82,12 +80,10 @@ export default function VaultBlock({ address }: VaultBlockProps) {

const [whitelistData, setWhitelistData] = useState<WhitelistData>({
isWhitelisted: null,
hasSignature: false,
});

const { publicProvider, currentNetwork, address: userAddress, isConnected } = useAppContext();


const vaultConfig = useMemo(() => {
if (!currentNetwork) return;
const vaults = (vaultsConfig as any)[currentNetwork]?.vaults || [];
Expand Down Expand Up @@ -213,27 +209,6 @@ export default function VaultBlock({ address }: VaultBlockProps) {
}
}, [vaultContract]);

const checkUserSignature = useCallback(() => {
if (!userAddress || !currentNetwork) {
setWhitelistData(prev => ({ ...prev, hasSignature: false }));
return;
}

const networkSignatures = (signaturesConfig as any)[currentNetwork];
const vaultSignatures = networkSignatures?.vaults?.[address.toLowerCase()];
const signaturesMap = vaultSignatures?.signatures;

if (!signaturesMap) {
setWhitelistData(prev => ({ ...prev, hasSignature: false }));
return;
}

const addressLower = userAddress.toLowerCase();
const hasSignature = !!signaturesMap[addressLower];

setWhitelistData(prev => ({ ...prev, hasSignature }));
}, [userAddress, currentNetwork, address]);

const checkUserWhitelist = useCallback(async () => {
if (!vaultContract || !userAddress || !isConnected || staticData.isWhitelistActivated === null) {
return;
Expand Down Expand Up @@ -298,9 +273,7 @@ export default function VaultBlock({ address }: VaultBlockProps) {
}, [vaultContract, loadWhitelistActivation]);

// Check user signature when address or network changes
useEffect(() => {
checkUserSignature();
}, [address, currentNetwork, checkUserSignature]);


// Check user whitelist status when whitelist activation status is known
useEffect(() => {
Expand Down Expand Up @@ -371,8 +344,7 @@ export default function VaultBlock({ address }: VaultBlockProps) {
apy: apyData,
pointsRate,
isWhitelistActivated: staticData.isWhitelistActivated,
isWhitelisted: whitelistData.isWhitelisted,
hasSignature: whitelistData.hasSignature
isWhitelisted: whitelistData.isWhitelisted
}}
className="wrapper block w-full bg-gray-50 transition-colors border border-gray-50 rounded-lg mb-4 last:mb-0 p-3">
<div className="w-full">
Expand Down
78 changes: 20 additions & 58 deletions src/contexts/VaultContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -135,7 +135,6 @@ interface Params {
pointsRate: number | null,
isWhitelistActivated: boolean | null,
isWhitelisted: boolean | null,
hasSignature: boolean | undefined
}

const VaultContext = createContext<VaultContextType | undefined>(undefined);
Expand Down Expand Up @@ -211,7 +210,6 @@ export const VaultContextProvider = ({ children, vaultAddress, params }: { child
const [isCheckingWhitelist, setIsCheckingWhitelist] = useState<boolean>(false);
const [isActivatingWhitelist, setIsActivatingWhitelist] = useState<boolean>(false);
const [whitelistError, setWhitelistError] = useState<string | null>(null);
const [lastCheckedAddressForSignature, setLastCheckedAddressForSignature] = useState<string | null>(null);
const [hasUsedInitialWhitelistParams, setHasUsedInitialWhitelistParams] = useState<boolean>(false);
const [isRefreshingBalances, setIsRefreshingBalances] = useState<boolean>(false);
const [borrowTokenPrice, setBorrowTokenPrice] = useState<number | null>(null);
Expand Down Expand Up @@ -686,69 +684,33 @@ export const VaultContextProvider = ({ children, vaultAddress, params }: { child
}, [vaultLens, params.isWhitelistActivated]);

// Check if user has signature and load signature data
const getSignatureData = useCallback((userAddress: string) => {
if (!currentNetwork || !vaultAddress) return null;

const networkSignatures = (signaturesConfig as any)[currentNetwork];
const vaultSignatures = networkSignatures?.vaults?.[vaultAddress.toLowerCase()];
const signaturesMap = vaultSignatures?.signatures;

if (!signaturesMap) return null;
return signaturesMap[userAddress.toLowerCase()];
}, [currentNetwork, vaultAddress]);

useEffect(() => {
if (!address || !currentNetwork || !vaultAddress) {
if (!address) {
setHasSignature(false);
setSignature(null);
setLastCheckedAddressForSignature(null);
return;
}

// If we have params and haven't checked any address yet, use params
if (!lastCheckedAddressForSignature && params.hasSignature !== undefined) {
setHasSignature(params.hasSignature);
setLastCheckedAddressForSignature(address);

// If params say user has signature, load the signature data
if (params.hasSignature) {
const networkSignatures = (signaturesConfig as any)[currentNetwork];
const vaultSignatures = networkSignatures?.vaults?.[vaultAddress.toLowerCase()];
const signaturesMap = vaultSignatures?.signatures;
const addressLower = address.toLowerCase();
const signatureData = signaturesMap?.[addressLower];

if (signatureData) {
setSignature({
v: signatureData.v,
r: signatureData.r,
s: signatureData.s
});
}
}
return;
}

// If address changed or no params were provided, check signature
if (address !== lastCheckedAddressForSignature) {
const networkSignatures = (signaturesConfig as any)[currentNetwork];
const vaultSignatures = networkSignatures?.vaults?.[vaultAddress.toLowerCase()];
const signaturesMap = vaultSignatures?.signatures;

if (!signaturesMap) {
setHasSignature(false);
setSignature(null);
setLastCheckedAddressForSignature(address);
return;
}

const addressLower = address.toLowerCase();
const signatureData = signaturesMap[addressLower];

if (signatureData) {
setHasSignature(true);
setSignature({
v: signatureData.v,
r: signatureData.r,
s: signatureData.s
});
} else {
setHasSignature(false);
setSignature(null);
}

setLastCheckedAddressForSignature(address);
const data = getSignatureData(address);
if (data) {
setHasSignature(true);
setSignature({ v: data.v, r: data.r, s: data.s });
} else {
setHasSignature(false);
setSignature(null);
}
}, [address, currentNetwork, vaultAddress, params.hasSignature, lastCheckedAddressForSignature]);
}, [address, getSignatureData]);

// NFT Logic
useEffect(() => {
Expand Down