import type { MinerData, QuarryData } from "@quarryprotocol/quarry-sdk"; import type { Token } from "@saberhq/token-utils"; import BN from "bn.js"; import { createQuarryPayroll } from "../contexts/rewarder/useGetAllClaimableAmounts"; const PRECISION_SECONDS = 100_000; export const makeCalculateClaimableAmount = ({ rewardsToken, quarryData, minerData, }: { rewardsToken: Token; quarryData: QuarryData; minerData: MinerData; }): { rewardsPerSecond: number; get: () => number; } => { const payroll = createQuarryPayroll(quarryData); const start = Date.now(); const [startAmount, endAmount] = [0, PRECISION_SECONDS * 1_000].map( (offset) => { return payroll.calculateRewardsEarned( new BN(Math.floor((start + offset) / 1_000)), minerData.balance, minerData.rewardsPerTokenPaid, minerData.rewardsEarned ); } ) as [BN, BN]; const divisor = 10 ** rewardsToken.decimals; const startAmountNumber = startAmount.toNumber() / divisor; const rewardsPerSecond = endAmount.sub(startAmount).toNumber() / divisor / PRECISION_SECONDS; return { rewardsPerSecond, get: () => startAmountNumber + rewardsPerSecond * ((Date.now() - start) / 1_000), }; };