77 lines
2.3 KiB
TypeScript
77 lines
2.3 KiB
TypeScript
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'
|
|
import {
|
|
getStakeQuote,
|
|
getOpCost,
|
|
getEthPositions,
|
|
getSolPositions,
|
|
stake,
|
|
unstakeEth,
|
|
unstakeSol,
|
|
claimUnstake,
|
|
type StakeChain,
|
|
type EthStakePositions,
|
|
type SolStakePositions,
|
|
type EthUnstakeResult,
|
|
type SolUnstakeResult,
|
|
} from '../api/stakingApi'
|
|
|
|
export function useStakeQuote(chain: StakeChain, amountHuman: string) {
|
|
const amount = parseFloat(amountHuman)
|
|
return useQuery({
|
|
queryKey: ['staking', 'quote', chain, amountHuman],
|
|
queryFn: () => getStakeQuote(chain, amountHuman),
|
|
enabled: Number.isFinite(amount) && amount > 0,
|
|
staleTime: 15_000,
|
|
retry: false,
|
|
})
|
|
}
|
|
|
|
export function useOpCost(chain: StakeChain, amountHuman: string) {
|
|
const amount = parseFloat(amountHuman)
|
|
return useQuery({
|
|
queryKey: ['staking', 'op-cost', chain, amountHuman],
|
|
queryFn: () => getOpCost(chain, amountHuman),
|
|
enabled: Number.isFinite(amount) && amount > 0,
|
|
staleTime: 15_000,
|
|
retry: false,
|
|
})
|
|
}
|
|
|
|
export function useStakePositions(chain: StakeChain) {
|
|
return useQuery<EthStakePositions | SolStakePositions>({
|
|
queryKey: ['staking', 'positions', chain],
|
|
queryFn: () => (chain === 'ETH' ? getEthPositions() : getSolPositions()),
|
|
staleTime: 30_000,
|
|
retry: false,
|
|
})
|
|
}
|
|
|
|
export function useStake() {
|
|
const qc = useQueryClient()
|
|
return useMutation({
|
|
mutationFn: ({ chain, amountHuman }: { chain: StakeChain; amountHuman: string }) => stake(chain, amountHuman),
|
|
onSuccess: (_data, { chain }) => qc.invalidateQueries({ queryKey: ['staking', 'positions', chain] }),
|
|
})
|
|
}
|
|
|
|
export type UnstakeVars =
|
|
| { chain: 'ETH'; amountHuman: string; mode: 'swap' | 'queue' }
|
|
| { chain: 'SOL'; stakeAccount: string }
|
|
|
|
export function useUnstake() {
|
|
const qc = useQueryClient()
|
|
return useMutation<EthUnstakeResult | SolUnstakeResult, Error, UnstakeVars>({
|
|
mutationFn: (vars) =>
|
|
vars.chain === 'ETH' ? unstakeEth(vars.amountHuman, vars.mode) : unstakeSol(vars.stakeAccount),
|
|
onSuccess: (_data, vars) => qc.invalidateQueries({ queryKey: ['staking', 'positions', vars.chain] }),
|
|
})
|
|
}
|
|
|
|
export function useClaim() {
|
|
const qc = useQueryClient()
|
|
return useMutation({
|
|
mutationFn: (requestId: string) => claimUnstake(requestId),
|
|
onSuccess: () => qc.invalidateQueries({ queryKey: ['staking', 'positions', 'ETH'] }),
|
|
})
|
|
}
|