Skip to content

Commit 2a7b58e

Browse files
authored
fix: solana redpacket (#12051)
* fixup! fix: mf-6573 solana and evm redpackets coexist (#12050) * fix: mf-6572 redpacket parse result could be null * fix: claim redpacket mf-6570 claim amount mf-6556 claim and refresh * fix: mf-6565 format token amount * fixup! fix: claim redpacket
1 parent 5562a5d commit 2a7b58e

File tree

16 files changed

+75
-44
lines changed

16 files changed

+75
-44
lines changed

packages/plugins/RedPacket/src/SiteAdaptor/SolanaRedPacket/SolanaRedPacketCard.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import {
1616
} from '@masknet/web3-hooks-base'
1717
import { FireflyRedPacket, SolanaChainResolver } from '@masknet/web3-providers'
1818
import { FireflyRedPacketAPI, RedPacketStatus, type SolanaRedPacketJSONPayload } from '@masknet/web3-providers/types'
19-
import { TokenType, formatBalance } from '@masknet/web3-shared-base'
19+
import { TokenType, formatBalance, minus } from '@masknet/web3-shared-base'
2020
import { ChainId } from '@masknet/web3-shared-solana'
2121
import { Card } from '@mui/material'
2222
import { memo, useCallback, useMemo } from 'react'
@@ -80,7 +80,7 @@ export const SolanaRedPacketCard = memo(function SolanaRedPacketCard({
8080
const {
8181
availability,
8282
computed: availabilityComputed,
83-
checkAvailability,
83+
refresh: refreshRedPacket,
8484
} = useSolanaAvailability(payload, payloadChainId)
8585

8686
// #endregion
@@ -169,7 +169,7 @@ export const SolanaRedPacketCard = memo(function SolanaRedPacketCard({
169169
tokenType: TokenType.Fungible,
170170
messageTextForNFT: _(msg`1 NFT claimed.`),
171171
messageTextForFT: _(
172-
msg`You claimed ${formatBalance(claimRecord.amount.toNumber(), token?.decimals, { significant: 2 })} $${token?.symbol}.`,
172+
msg`You claimed ${formatBalance(claimRecord.amount.toString(), token?.decimals, { significant: 2 })} $${token?.symbol}.`,
173173
),
174174
title: _(msg`Lucky Drop`),
175175
share: (text) => share?.(text, source ? source : undefined),
@@ -179,9 +179,9 @@ export const SolanaRedPacketCard = memo(function SolanaRedPacketCard({
179179
})
180180
}
181181
if (typeof hash === 'string') {
182-
checkAvailability()
182+
refreshRedPacket()
183183
}
184-
}, [canClaim, canRefund, claimCallback, checkAvailability, payload.rpid, myProfileId, myHandle])
184+
}, [canClaim, canRefund, claimCallback, refreshRedPacket, payload.rpid, myProfileId, myHandle, account])
185185

186186
const outdated = availability?.isEmpty || (!canRefund && listOfStatus.includes(RedPacketStatus.expired))
187187

@@ -216,7 +216,7 @@ export const SolanaRedPacketCard = memo(function SolanaRedPacketCard({
216216
isExpired={availability.expired}
217217
claimedCount={+availability.claimed}
218218
total={payload.total}
219-
totalClaimed={availability.claimed}
219+
totalClaimed={minus(payload.total, availability.balance).toFixed()}
220220
claimedAmount={availability.claimed_amount}
221221
creator={payload.sender.name}
222222
/>

packages/plugins/RedPacket/src/SiteAdaptor/SolanaRedPacket/hooks/useAvailability.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { getRpProgram } from '../../helpers/getRpProgram.js'
66
import { minus } from '@masknet/web3-shared-base'
77
import { useClaimRecord } from './useClaimRecord.js'
88
import { useParseRedPacket } from '../../hooks/useParseRedPacket.js'
9+
import { useCallback } from 'react'
910

1011
export function useSolanaAvailability(payload: SolanaRedPacketJSONPayload, chainId: number) {
1112
const account = useAccount(NetworkPluginID.PLUGIN_SOLANA)
@@ -27,9 +28,19 @@ export function useSolanaAvailability(payload: SolanaRedPacketJSONPayload, chain
2728
return 30_000
2829
},
2930
})
30-
const parsed = useParseRedPacket()
31+
const { data: parsed, refetch: recheckParse } = useParseRedPacket()
32+
33+
const { data: claimRecord, refetch: checkClaimRecord } = useClaimRecord(
34+
account,
35+
payload.accountId,
36+
payload?.network ?? 'mainnet-beta',
37+
)
38+
const refresh = useCallback(() => {
39+
checkAvailability()
40+
recheckParse()
41+
checkClaimRecord()
42+
}, [checkAvailability, recheckParse, checkClaimRecord])
3143

32-
const { data: claimRecord } = useClaimRecord(account, payload.accountId, payload?.network ?? 'mainnet-beta')
3344
if (!data) {
3445
return {
3546
parsedChainId: chainId,
@@ -38,12 +49,12 @@ export function useSolanaAvailability(payload: SolanaRedPacketJSONPayload, chain
3849
computed: { canClaim: false, canRefund: false, listOfStatus: [] as RedPacketStatus[] },
3950
isEmpty: true,
4051
isClaimed: false,
41-
checkAvailability,
52+
refresh,
4253
}
4354
}
4455
const isExpired = data.duration.add(data.createTime).muln(1000).ltn(Date.now())
4556
const isEmpty = data.claimedAmount.gt(data.totalAmount)
46-
const isClaimed = !!claimRecord || !!parsed?.redpacket.isClaimed
57+
const isClaimed = !!claimRecord || !!parsed?.redpacket?.isClaimed
4758

4859
const availability = {
4960
token_address: data.tokenAddress.toBase58(),
@@ -70,6 +81,6 @@ export function useSolanaAvailability(payload: SolanaRedPacketJSONPayload, chain
7081
computed: { canClaim, canRefund, listOfStatus },
7182
isEmpty: isEmpty || false,
7283
isClaimed,
73-
checkAvailability,
84+
refresh,
7485
}
7586
}

packages/plugins/RedPacket/src/SiteAdaptor/components/RedPacketEnvelope.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ interface Props extends HTMLProps<HTMLDivElement> {
141141
shares?: number
142142
/** claimed entities */
143143
claimedCount: number
144+
/** Total claimed amount */
144145
totalClaimed: string
145146
total: string
146147
/** claimed amount by current user */

packages/plugins/RedPacket/src/SiteAdaptor/components/RedPacketRecord.tsx

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
} from '@masknet/web3-hooks-base'
1212
import { EVMExplorerResolver, SolanaExplorerResolver } from '@masknet/web3-providers'
1313
import { FireflyRedPacketAPI, type RedPacketJSONPayload } from '@masknet/web3-providers/types'
14-
import { formatBalance, TokenType } from '@masknet/web3-shared-base'
14+
import { TokenType } from '@masknet/web3-shared-base'
1515
import {
1616
ChainId,
1717
isNativeTokenAddress,
@@ -249,8 +249,7 @@ export const RedPacketRecord = memo(function RedPacketRecord({
249249
/>
250250
<div className={classes.status}>
251251
<Typography className={classes.total}>
252-
{formatBalance(amount, token_decimal, { significant: 2, isPrecise: true })}{' '}
253-
{tokenSymbol ?? token_symbol ?? '--'}
252+
{formatTokenAmount(amount || 0, token_decimal, false)} {tokenSymbol ?? token_symbol ?? '--'}
254253
</Typography>
255254
<Typography className={classes.progress} component="div">
256255
{!onlyView ?
@@ -260,8 +259,8 @@ export const RedPacketRecord = memo(function RedPacketRecord({
260259
{claim_numbers}/{total_numbers}
261260
</b>{' '}
262261
<b>
263-
{formatTokenAmount(claim_amounts || 0, token_decimal)}/
264-
{formatTokenAmount(total_amounts || 0, token_decimal)}
262+
{formatTokenAmount(claim_amounts || 0, token_decimal, false)}/
263+
{formatTokenAmount(total_amounts || 0, token_decimal, false)}
265264
</b>
266265
<span>{tokenSymbol}</span>
267266
</Trans>
Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
import { formatCompact, isLessThan, isZero, leftShift } from '@masknet/web3-shared-base'
22
import { type BigNumber } from 'bignumber.js'
33

4-
export function formatTokenAmount(raw: BigNumber.Value, decimals = 0) {
5-
const amount = leftShift(raw, decimals).toNumber()
4+
export function formatTokenAmount(raw: BigNumber.Value, decimals = 0, round = true) {
5+
let amount = leftShift(raw, decimals).toNumber()
66

77
if (isZero(amount)) return '0'
88
if (isLessThan(amount, 0.0001)) return '<0.0001'
99

10+
const maximumFractionDigits = amount < 100 ? 4 : 2
11+
if (!round) {
12+
const [integer, decimal] = amount.toString().split('.')
13+
if (decimal?.length > maximumFractionDigits) {
14+
amount = +(integer + '.' + decimal.slice(0, maximumFractionDigits))
15+
}
16+
}
17+
1018
return formatCompact(amount, {
1119
minimumFractionDigits: 2,
12-
maximumFractionDigits: amount < 100 ? 4 : 2,
20+
maximumFractionDigits,
1321
})
1422
}

packages/plugins/RedPacket/src/SiteAdaptor/hooks/useAvailabilityComputed.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export function useAvailabilityComputed(account: string, payload: RedPacketJSONP
2929
chainId: parsedChainId,
3030
},
3131
)
32-
const parsed = useParseRedPacket()
32+
const { data: parsed, refetch: recheckParse } = useParseRedPacket()
3333
const checkAvailability = recheckAvailability as (
3434
options?: RefetchOptions,
3535
) => Promise<QueryObserverResult<typeof availability>>
@@ -42,6 +42,12 @@ export function useAvailabilityComputed(account: string, payload: RedPacketJSONP
4242
return data?.data?.canClaim
4343
}, [refetch])
4444

45+
const refresh = useCallback(() => {
46+
checkAvailability()
47+
recheckClaimStatus()
48+
recheckParse()
49+
}, [checkAvailability, recheckClaimStatus, recheckParse])
50+
4551
if (!availability || (!payload.password && !data))
4652
return {
4753
availability,
@@ -59,16 +65,17 @@ export function useAvailabilityComputed(account: string, payload: RedPacketJSONP
5965
}
6066
const isEmpty = availability.balance === '0'
6167
const isExpired = availability.expired
62-
const isClaimed = parsed?.redpacket.isClaimed || availability.claimed_amount !== '0'
68+
const isClaimed = parsed?.redpacket?.isClaimed || availability.claimed_amount !== '0'
6369
const isRefunded = isEmpty && availability.claimed < availability.total
6470
const isCreator = isSameAddress(payload?.sender.address ?? '', account)
6571
const isPasswordValid = !!(password && password !== 'PASSWORD INVALID')
6672
// For a central RedPacket, we don't need to check about if the password is valid
6773
const canClaimByContract = !isExpired && !isEmpty && !isClaimed
6874
const canClaim = payload.password ? canClaimByContract && isPasswordValid : canClaimByContract
75+
6976
return {
7077
availability,
71-
checkAvailability,
78+
checkAvailability: refresh,
7279
claimStrategyStatus: data?.data,
7380
recheckClaimStatus,
7481
checkingClaimStatus: isFetching,
@@ -88,7 +95,7 @@ export function useAvailabilityComputed(account: string, payload: RedPacketJSONP
8895
isRefunded ? RedPacketStatus.refunded : undefined,
8996
isExpired ? RedPacketStatus.expired : undefined,
9097
]),
91-
myClaimedAmount: parsed?.redpacket.claimedAmount,
98+
myClaimedAmount: parsed?.redpacket?.claimedAmount,
9299
},
93100
}
94101
}

packages/plugins/RedPacket/src/SiteAdaptor/hooks/useParseRedPacket.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export function useParseRedPacket() {
2020
const myProfileId = me?.profileId
2121
const linksWithPayload = links.filter((x) => /\bPostData_v\d=/.test(x))
2222

23-
const query = useQuery({
23+
return useQuery({
2424
enabled: images.length > 0 || linksWithPayload.length > 0,
2525
queryKey: ['red-packet', 'parse', images[0], linksWithPayload, account, myProfileId],
2626
queryFn: async () => {
@@ -38,5 +38,4 @@ export function useParseRedPacket() {
3838
})
3939
},
4040
})
41-
return query.data
4241
}

packages/plugins/RedPacket/src/constants.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export const RED_PACKET_MAX_SHARES = 255
1313

1414
export const SOL_REDPACKET_MAX_SHARES = 200
1515
export const SOL_REDPACKET_CREATE_DEFAULT_GAS = '1000000'
16-
export const DEFAULT_DURATION = 60 * 5 // 24 hours
16+
export const DEFAULT_DURATION = 1000 * 60 * 60 * 24 // 24 hours
1717
export const enum RoutePaths {
1818
Create = '/create',
1919
CreateErc20RedPacket = '/create/erc20',

packages/plugins/RedPacket/src/idl/redpacket.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,10 @@
628628
"type": {
629629
"kind": "struct",
630630
"fields": [
631+
{
632+
"name": "red_packet_key",
633+
"type": "pubkey"
634+
},
631635
{
632636
"name": "claimer",
633637
"type": "pubkey"

packages/plugins/RedPacket/src/idl/redpacket.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,10 @@ export type Redpacket = {
814814
type: {
815815
kind: 'struct'
816816
fields: [
817+
{
818+
name: 'redPacketKey'
819+
type: 'pubkey'
820+
},
817821
{
818822
name: 'claimer'
819823
type: 'pubkey'

0 commit comments

Comments
 (0)