UNPKG

@coinmeca/ui

Version:

This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).

88 lines 3.25 kB
"use client"; import { isNumber, parseNumber } from "../../../../lib/utils"; import { useCallback, useMemo, useState } from "react"; export default function useStaking(mode, available, farm) { const [staking, setStaking] = useState({ amount: 0, share: 0, apr: 0, }); const type = farm?.type || true; const now = Math.floor(Date.now() / 1000); const start = parseNumber(farm?.start || 0); const end = parseNumber(farm?.end || 0); const period = parseNumber(farm?.period || 0); // const extra = period > (end - now) ? period - (end - now) : period; const remain = end && now < end ? end - now : period; const duration = useMemo(() => { const d = parseNumber(farm?.duration); return (d && end > now ? d : period) || end - start || 0; }, [now, start, end, period, farm?.duration]); const days = useMemo(() => duration / 86400, [duration]); const next = useMemo(() => period / 86400, [period]); const staked = useMemo(() => parseNumber(farm?.staked) || 0, [farm?.staked]); const yields = useMemo(() => parseNumber(farm?.interest) || 0, [farm?.interest]); const interest = useMemo(() => (yields ? (yields * (remain / duration)) / next : 0), [yields, remain, duration, next]); const value = useMemo(() => ({ stake: type ? 1 : parseNumber(farm?.value?.stake) || 1, earn: type ? 1 : parseNumber(farm?.value?.earn) || 1, }), [type, farm?.value]); const apr = useCallback((amount, staking) => isNumber(amount) ? (((interest * value.earn) / days) * 100) / (((isNumber(staking) ? (staking || 0) + (mode ? amount : -amount || 0) : amount) + staked) * value.stake) : 0, [mode, staked, interest, value, days]); const share = useCallback((amount, staking) => (!mode && (!staking || staking === 0)) || !isNumber(amount) ? 0 : ((isNumber(staking) && staking > 0 ? staking + (mode ? amount : -amount || 0) : amount) * 100) / (staked ? staked + (staking === true ? 0 : mode ? amount : -amount) : amount), [mode, staked]); const getAmount = useCallback((amount) => { return available && available < amount ? available : amount; }, [available]); const maxAmount = useMemo(() => { return available || staking?.amount; }, [available, staking.amount]); const amount = (amount) => { let s; if (!amount) { s = { ...staking, amount: 0, share: 0, apr: 0, }; setStaking(s); return s; } amount = getAmount(amount); const avail = !mode && available; s = { ...staking, amount, share: share(amount, avail), apr: apr(amount, avail), }; setStaking(s); return s; }; const reset = () => setStaking({ ...staking, amount: 0, share: 0, apr: 0, }); return { staking, amount, maxAmount, interest, share, apr, days, reset, }; } //# sourceMappingURL=useStaking.jsx.map