Skip to content

Commit

Permalink
Add extra flip and invitation rewards to APY (#889)
Browse files Browse the repository at this point in the history
  • Loading branch information
videnaio authored Feb 20, 2023
1 parent 0c82068 commit 37f078d
Showing 1 changed file with 84 additions and 4 deletions.
88 changes: 84 additions & 4 deletions renderer/screens/home/hooks.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import {IdentityStatus, TxType} from '../../shared/types'
import {useEpochState} from '../../shared/providers/epoch-context'
import {useChainState} from '../../shared/providers/chain-context'
import {apiUrl} from '../../shared/api/api-client'
import {useRpcFetcher} from '../ads/hooks'

export function useIdenaBot() {
const [connected, setConnected] = useState(true)
Expand Down Expand Up @@ -124,7 +125,7 @@ export function useCalculateStakeLoss() {
}

export function useStakingApy() {
const {stake} = useIdentityState()
const {stake, invites, invitees, state} = useIdentityState()

const epoch = useEpochState()

Expand All @@ -137,6 +138,7 @@ export function useStakingApy() {

return result
}, [])
const rpcFetcher = useRpcFetcher()

const {data: stakingData} = useQuery({
queryKey: ['staking'],
Expand Down Expand Up @@ -166,22 +168,94 @@ export function useStakingApy() {
notifyOnChangeProps: 'tracked',
})

const lastInvitee = invitees && invitees.reverse()[0].TxHash
const secondToLastInvitee =
invitees && invitees.length > 1 && invitees.reverse()[1].TxHash
const maxInvitesCount =
// eslint-disable-next-line no-nested-ternary
state === IdentityStatus.Human
? 2
: state === IdentityStatus.Verified
? 1
: 0

const {data: lastInviteTx} = useQuery({
queryKey: ['bcn_transaction', [lastInvitee]],
queryFn: rpcFetcher,
enabled: maxInvitesCount - invites > 0 && Boolean(lastInvitee),
staleTime: Infinity,
notifyOnChangeProps: 'tracked',
})

const {data: secondToLastInviteTx} = useQuery({
queryKey: ['bcn_transaction', [secondToLastInvitee]],
queryFn: rpcFetcher,
enabled: maxInvitesCount - invites > 1 && Boolean(secondToLastInvitee),
staleTime: Infinity,
notifyOnChangeProps: 'tracked',
})

return React.useMemo(() => {
if (
stakingData &&
onlineMinersCount &&
prevEpochData &&
validationRewardsSummaryData
) {
const {weight, averageMinerWeight} = stakingData
const {validation, staking} = validationRewardsSummaryData
const {
weight,
averageMinerWeight,
extraFlipsWeight,
invitationsWeight,
} = stakingData
const {
validation,
staking,
extraFlips,
invitations,
} = validationRewardsSummaryData

// epoch staking
const epochStakingRewardFund = Number(staking) || 0.9 * Number(validation)
const epochReward = (stake ** 0.9 / weight) * epochStakingRewardFund

const myStakeWeight = stake ** 0.9

// available extra flips count
const extraFlipsCount =
// eslint-disable-next-line no-nested-ternary
state === IdentityStatus.Human
? 2
: state === IdentityStatus.Verified
? 1
: 0
const extraFlipsReward =
extraFlipsCount * (myStakeWeight / extraFlipsWeight) * extraFlips

// available invites count
let invitesCount = invites
const hasMoreInvites =
(state === IdentityStatus.Human && invitesCount < 2) ||
(state === IdentityStatus.Verified && invitesCount < 1)
if (
hasMoreInvites &&
lastInviteTx &&
lastInviteTx.epoch === epoch?.epoch
) {
// eslint-disable-next-line no-plusplus
invitesCount++
if (
hasMoreInvites &&
secondToLastInviteTx &&
secondToLastInviteTx.epoch === epoch?.epoch
) {
// eslint-disable-next-line no-plusplus
invitesCount++
}
}
const invitationReward =
invitesCount * ((myStakeWeight / invitationsWeight) * invitations)

const proposerOnlyReward =
(6 * myStakeWeight * 20) /
(myStakeWeight * 20 + averageMinerWeight * 100)
Expand Down Expand Up @@ -218,16 +292,22 @@ export function useStakingApy() {
committeeOnlyProbability * committeeOnlyReward +
proposerAndCommitteeProbability * proposerAndCommitteeReward)

const epy = (estimatedReward + epochReward) / stake
const epy =
(estimatedReward + epochReward + extraFlipsReward + invitationReward) /
stake

return (epy / Math.max(1, epochDays)) * 366
}
}, [
epoch,
invites,
lastInviteTx,
onlineMinersCount,
prevEpochData,
secondToLastInviteTx,
stake,
stakingData,
state,
validationRewardsSummaryData,
])
}
Expand Down

0 comments on commit 37f078d

Please sign in to comment.