Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change send slash fkey to distribution_id #902

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
2 changes: 1 addition & 1 deletion apps/distributor/src/distributorv2.ts
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@ export class DistributorV2Worker {
const { data: sendSlash, error: sendSlashError } = await supabaseAdmin
.from('send_slash')
.select('*')
.eq('distribution_number', distribution.number)
.eq('distribution_id', distribution.id)
.single()

if (sendSlashError) {
Expand Down
101 changes: 63 additions & 38 deletions packages/app/features/account/rewards/activity/screen.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import formatAmount from 'app/utils/formatAmount'
import { zeroAddress } from 'viem'
import { type PropsWithChildren, useRef, useId, useState } from 'react'
import { DistributionClaimButton } from '../components/DistributionClaimButton'
import { useSendAccount } from 'app/utils/send-accounts'

//@todo get this from the db
const verificationTypesAndTitles = {
Expand Down Expand Up @@ -226,7 +227,10 @@ export function ActivityRewardsScreen() {
<DistributionRequirementsCard distribution={distributions[selectedDistributionIndex]} />
<SendPerksCards distribution={distributions[selectedDistributionIndex]} />
<MultiplierCards distribution={distributions[selectedDistributionIndex]} />
<RewardsProgressCard distribution={distributions[selectedDistributionIndex]} />
<RewardsProgressCard
distribution={distributions[selectedDistributionIndex]}
previousDistribution={distributions[selectedDistributionIndex - 1]}
/>
<ClaimableRewardsCard distribution={distributions[selectedDistributionIndex]} />
</YStack>
)}
Expand Down Expand Up @@ -318,19 +322,29 @@ const Header = () => (

const DistributionRequirementsCard = ({
distribution,
}: { distribution: UseDistributionsResultData[number] }) => {
previousDistribution,
}: {
distribution: UseDistributionsResultData[number]
previousDistribution?: UseDistributionsResultData[number]
}) => {
const hasSent = Boolean(
distribution.distribution_verifications_summary
.at(0)
?.verification_values?.find(({ type }) => type === 'send_ten')
)
const { data: sendAccount } = useSendAccount()
const {
data: snapshotBalance,
isLoading: isLoadingSnapshotBalance,
error: snapshotBalanceError,
} = useReadSendTokenBalanceOf({
chainId: distribution.chain_id as keyof typeof sendTokenAddress,
args: [distribution.distribution_shares.at(0)?.address ?? zeroAddress],
args: [sendAccount?.address ?? zeroAddress],
blockNumber: distribution.snapshot_block_num
? BigInt(distribution.snapshot_block_num)
: undefined,
query: {
enabled: !!distribution.distribution_shares.at(0)?.address,
enabled: hasSent && Boolean(sendAccount?.address),
},
})

Expand All @@ -340,13 +354,36 @@ const DistributionRequirementsCard = ({
.at(0)
?.verification_values?.find(({ type }) => type === 'tag_registration')?.weight

const sendCeiling = distribution.distribution_verifications_summary[0]?.verification_values?.find(
({ type }) => type === 'send_ceiling'
)

const previousReward =
previousDistribution?.distribution_shares?.[0]?.amount_after_slash ??
distribution.hodler_min_balance

let percent = 0
let balanceAfterSlash = 0n

if (sendCeiling?.weight && distribution.send_slash?.scaling_divisor) {
const scaledPreviousReward = previousReward / distribution.send_slash.scaling_divisor
// Multiply by 10000 to get 4 decimal places of precision
percent = Math.min((sendCeiling.weight / scaledPreviousReward) * 10000, 10000)
balanceAfterSlash = snapshotBalance
? percent === 10000
? snapshotBalance
: (BigInt(snapshotBalance) * BigInt(Math.round(percent))) / BigInt(10000)
: 0n
}

return (
<Card br={12} $gtMd={{ gap: '$4', p: '$7' }} p="$5">
<Stack ai="center" jc="space-between" gap="$5" $gtXs={{ flexDirection: 'row' }}>
<YStack gap="$2">
<Label fontSize={'$5'} col={'$color10'}>
Your SEND Balance
Your Qualifying Balance
</Label>

{isLoadingSnapshotBalance ? (
<Spinner size="small" color={'$color11'} />
) : (
Expand All @@ -359,7 +396,7 @@ const DistributionRequirementsCard = ({
fontSize={'$9'}
$gtXl={{ fontSize: '$10' }}
>
{`${formatAmount(snapshotBalance?.toString() ?? 0, 9, 0)} SEND`}
{`${formatAmount(balanceAfterSlash?.toString() ?? 0, 9, 0)} SEND`}
</Paragraph>
</Theme>
)}
Expand Down Expand Up @@ -591,25 +628,33 @@ const MultiplierCard = ({ children }: PropsWithChildren<CardProps>) => {

const RewardsProgressCard = ({
distribution,
previousDistribution,
}: {
distribution: UseDistributionsResultData[number]
previousDistribution?: UseDistributionsResultData[number]
}) => {
const shareAmount = distribution.distribution_shares?.[0]?.amount
const slashedAmount = distribution.distribution_shares?.[0]?.amount_after_slash
const sendCeiling = distribution.distribution_verifications_summary[0]?.verification_values?.find(
({ type }) => type === 'send_ceiling'
)

if (!sendCeiling || !distribution.send_slash) return null

const previousReward =
previousDistribution?.distribution_shares?.[0]?.amount_after_slash ??
distribution.hodler_min_balance

if (!shareAmount || !slashedAmount) return null
const scaledPreviousReward = previousReward / distribution.send_slash.scaling_divisor

const percentage = Math.floor((Number(slashedAmount) / Number(shareAmount)) * 100)
const progress = Math.min(Math.floor((sendCeiling.weight / scaledPreviousReward) * 100), 100)

return (
<YStack f={1} w={'100%'} gap="$5">
<H3 fontWeight={'600'} color={'$color12'}>
Progress
Send Progress
</H3>
<Card br={'$6'} p="$7" w={'100%'}>
<Card br={'$6'} p="$7" $xs={{ p: '$5' }} w={'100%'} maw={500}>
<YStack gap="$4" w="100%">
<XStack jc="space-between" ai="center">
<Paragraph color="$color11">Current Rewards</Paragraph>
<XStack jc="flex-end">
<Paragraph
ff={'$mono'}
py={'$size.0.5'}
Expand All @@ -619,13 +664,12 @@ const RewardsProgressCard = ({
$theme-light={{ borderColor: '$color12' }}
borderRadius={'$4'}
>
{percentage}%
{progress}%
</Paragraph>
</XStack>

<Stack w="100%" h="$1" br="$10" bc="$color3" overflow="hidden">
<Stack w="100%" h="$1" br="$10" bc="$color3">
<Stack
w={`${percentage}%`}
w={`${progress}%`}
h="100%"
br="$10"
animation="quick"
Expand All @@ -637,25 +681,6 @@ const RewardsProgressCard = ({
}}
/>
</Stack>

<XStack jc="space-between" ai="center">
<YStack>
<Paragraph color="$color10" size="$3">
Current
</Paragraph>
<Paragraph fontFamily="$mono" color="$color12">
{formatAmount(slashedAmount, 9, 0)} SEND
</Paragraph>
</YStack>
<YStack ai="flex-end">
<Paragraph color="$color10" size="$3">
Estimated Maximum
</Paragraph>
<Paragraph fontFamily="$mono" color="$color12">
{formatAmount(shareAmount, 9, 0)} SEND
</Paragraph>
</YStack>
</XStack>
</YStack>
</Card>
</YStack>
Expand All @@ -680,7 +705,7 @@ const ClaimableRewardsCard = ({
return (
<YStack f={1} w={'100%'} gap="$5" $sm={{ display: 'none' }}>
<H3 fontWeight={'600'} color={'$color12'}>
{isQualificationOver ? `Total ${distributionMonth}` : `Estimated ${distributionMonth}`}
{isQualificationOver ? `Total ${distributionMonth}` : ` ${distributionMonth} Rewards`}
</H3>
<Card br={'$6'} p="$7" ai={'center'} w={'100%'}>
<Stack ai="center" jc="space-between" fd="row" w="100%">
Expand Down
13 changes: 11 additions & 2 deletions packages/app/utils/distributions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ export type UseDistributionsResultData = (UseDistributionResultDistribution & {
claim_end: Date
distribution_shares: Tables<'distribution_shares'>[]
distribution_verifications_summary: Views<'distribution_verifications_summary'>[]
send_slash: Tables<'send_slash'> | null
})[]

export const useDistributions = (): UseQueryResult<UseDistributionsResultData, PostgrestError> => {
Expand Down Expand Up @@ -77,15 +78,23 @@ export const useDistributions = (): UseQueryResult<UseDistributionsResultData, P
After distribution 6 we switched to monthly distributions
This function cuts out the first 6 distributions
*/
export const useMonthlyDistributions = () => {
export const useMonthlyDistributions = (): UseQueryResult<
UseDistributionsResultData,
PostgrestError
> => {
const supabase = useSupabase()
const { data: sendAccount } = useSendAccount()
return useQuery({
queryKey: ['monthly_distributions', sendAccount?.created_at],
queryFn: async () => {
const { data, error } = await supabase
.from('distributions')
.select('*, distribution_shares(*), distribution_verifications_summary(*)')
.select(`
*,
distribution_shares(*),
distribution_verifications_summary(*),
send_slash(*)
`)
.gt('number', 6)
.gt('qualification_end', sendAccount?.created_at)
.order('number', { ascending: false })
Expand Down
43 changes: 17 additions & 26 deletions supabase/database-generated.types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -861,27 +861,30 @@ export type Database = {
}
send_slash: {
Row: {
distribution_id: number | null
distribution_number: number
minimum_sends: number
scaling_divisor: number
}
Insert: {
distribution_id?: number | null
distribution_number: number
minimum_sends?: number
scaling_divisor?: number
}
Update: {
distribution_id?: number | null
distribution_number?: number
minimum_sends?: number
scaling_divisor?: number
}
Relationships: [
{
foreignKeyName: "send_slash_distribution_number_fkey"
columns: ["distribution_number"]
isOneToOne: true
foreignKeyName: "send_slash_distribution_id_fkey"
columns: ["distribution_id"]
isOneToOne: false
referencedRelation: "distributions"
referencedColumns: ["number"]
referencedColumns: ["id"]
},
]
}
Expand Down Expand Up @@ -1339,28 +1342,16 @@ export type Database = {
user_id: string
}
}
sum_qualification_sends:
| {
Args: {
distribution_number: number
}
Returns: {
user_id: string
amount: number
sent_to: string[]
}[]
}
| {
Args: {
distribution_number: number
send_ceiling: number
}
Returns: {
user_id: string
amount: number
sent_to: string[]
}[]
}
sum_qualification_sends: {
Args: {
distribution_number: number
}
Returns: {
user_id: string
amount: number
sent_to: string[]
}[]
}
tag_search: {
Args: {
query: string
Expand Down
Loading
Loading