@@ -9,9 +9,17 @@ import {
99} from "@mui/material" ;
1010import { useAccount , useReadContract , useReadContracts } from "wagmi" ;
1111import { useSearchParams } from "next/navigation" ;
12- import { zeroAddress } from "viem" ;
12+ import { zeroAddress , encodePacked , keccak256 , getAddress } from "viem" ;
1313import { CONTRACTS , REWARDS_PROGRAM_ABI , MemberRoleLabels , MemberTypeLabels } from "@/config/contracts" ;
1414import { toBytes12 , fromBytes12 , fromBytes8 , shortenAddress , formatFula , formatContractError , fromBytes16 } from "@/lib/utils" ;
15+
16+ /** Compute the virtual storage key for a walletless member (mirrors _virtualAddr in contract) */
17+ function virtualAddr ( memberID : string , programId : number ) : `0x${string } ` {
18+ const memberIDBytes = toBytes12 ( memberID ) ;
19+ const hash = keccak256 ( encodePacked ( [ "bytes12" , "uint32" ] , [ memberIDBytes , programId ] ) ) ;
20+ // Take last 20 bytes (address = uint160 of uint256)
21+ return getAddress ( "0x" + hash . slice ( - 40 ) ) as `0x${string } `;
22+ }
1523import { useProgramCount , useProgram , useTransferToParent , useWithdraw , useDepositTokens , useRewardTypes , useTransferLimit , useClaimMember } from "@/hooks/useRewardsProgram" ;
1624import { OnChainDisclaimer } from "@/components/common/OnChainDisclaimer" ;
1725import { QRCodeDisplay } from "@/components/common/QRCodeDisplay" ;
@@ -32,12 +40,19 @@ function MemberProgramRow({ memberID, programId }: { memberID: string; programId
3240
3341 const { data : program } = useProgram ( programId ) ;
3442
43+ // For walletless members, compute the virtual storage key to query balance
44+ const balanceKey : `0x${string } ` | undefined = member ?. active
45+ ? ( member . wallet && member . wallet !== zeroAddress
46+ ? member . wallet as `0x${string } `
47+ : virtualAddr ( memberID , programId ) )
48+ : undefined ;
49+
3550 const { data : balance } = useReadContract ( {
3651 address : CONTRACTS . rewardsProgram ,
3752 abi : REWARDS_PROGRAM_ABI ,
3853 functionName : "getBalance" ,
39- args : member ?. wallet && member . wallet !== zeroAddress ? [ programId , member . wallet as `0x${ string } ` ] : undefined ,
40- query : { enabled : ! ! member ?. wallet && member . wallet !== zeroAddress } ,
54+ args : balanceKey ? [ programId , balanceKey ] : undefined ,
55+ query : { enabled : ! ! balanceKey } ,
4156 } ) ;
4257
4358 if ( ! member || ! member . active ) return null ;
0 commit comments