Skip to content

Commit 3649f72

Browse files
committed
added direct interaction with contract
1 parent 66a33f9 commit 3649f72

File tree

10 files changed

+1073
-63
lines changed

10 files changed

+1073
-63
lines changed

apps/box/src/components/Cards/EarningCard.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { ActivityIndicator, StyleSheet } from 'react-native';
1313
import { useTranslation } from 'react-i18next';
1414
import { useFulaBalance, useFormattedFulaBalance } from '../../hooks/useFulaBalance';
1515
import { useClaimableTokens } from '../../hooks/useClaimableTokens';
16+
import { useUserProfileStore } from '../../stores/useUserProfileStore';
1617

1718
type EarningCardProps = React.ComponentProps<typeof FxBox> & {
1819
data: { totalFula: string };
@@ -44,6 +45,11 @@ export const EarningCard = ({
4445
// MetaMask SDK for wallet connection
4546
const { sdk, account, connecting } = useSDK();
4647

48+
// Get manual wallet address
49+
const manualSignatureWalletAddress = useUserProfileStore(
50+
(state) => state.manualSignatureWalletAddress
51+
);
52+
4753
// Use claimable rewards hook
4854
const {
4955
totalUnclaimed,
@@ -64,7 +70,8 @@ export const EarningCard = ({
6470

6571
// Handler for refresh icon click
6672
const handleRefresh = async () => {
67-
if (!account) {
73+
// Only try to connect MetaMask if no account is available (neither MetaMask nor manual signature)
74+
if (!account && !manualSignatureWalletAddress) {
6875
try {
6976
await sdk?.connect();
7077
queueToast({

apps/box/src/hooks/useClaimableTokens.ts

Lines changed: 81 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@ import { useState, useEffect, useCallback } from 'react';
22
import { useContractIntegration } from './useContractIntegration';
33
import { useBloxsStore } from '../stores/useBloxsStore';
44
import { usePools } from './usePools';
5+
import { useUserProfileStore } from '../stores/useUserProfileStore';
6+
import { useSettingsStore } from '../stores/useSettingsStore';
7+
import { ethers } from 'ethers';
8+
import { getChainConfigByName } from '../contracts/config';
9+
import { REWARD_ENGINE_ABI } from '../contracts/abis';
10+
import { peerIdToBytes32 } from '../utils/peerIdConversion';
511

612
export interface ClaimableRewardsState {
713
unclaimedMining: string;
@@ -18,6 +24,10 @@ export const useClaimableTokens = () => {
1824
const { contractService, isReady, connectedAccount } = useContractIntegration();
1925
const currentBloxPeerId = useBloxsStore((state) => state.currentBloxPeerId);
2026
const { userPoolId } = usePools();
27+
const manualSignatureWalletAddress = useUserProfileStore(
28+
(state) => state.manualSignatureWalletAddress
29+
);
30+
const selectedChain = useSettingsStore((state) => state.selectedChain);
2131

2232
const [state, setState] = useState<ClaimableRewardsState>({
2333
unclaimedMining: '0',
@@ -30,17 +40,22 @@ export const useClaimableTokens = () => {
3040
canClaim: false,
3141
});
3242

43+
// Determine effective account (MetaMask or manual signature)
44+
const effectiveAccount = connectedAccount || manualSignatureWalletAddress;
45+
const useReadOnlyService = !isReady && !!manualSignatureWalletAddress;
46+
3347
const fetchClaimableTokens = useCallback(async () => {
3448
console.log('🚀 useClaimableTokens: fetchClaimableTokens called');
3549
console.log('🔍 useClaimableTokens: Dependencies check:', {
3650
contractService: !!contractService,
3751
isReady,
3852
currentBloxPeerId,
39-
connectedAccount,
40-
userPoolId
53+
effectiveAccount,
54+
userPoolId,
55+
useReadOnlyService,
4156
});
4257

43-
if (!contractService || !isReady || !currentBloxPeerId || !connectedAccount || !userPoolId) {
58+
if (!currentBloxPeerId || !effectiveAccount || !userPoolId) {
4459
console.log('⚠️ useClaimableTokens: Missing dependencies, resetting state to zeros');
4560
setState(prev => ({
4661
...prev,
@@ -60,34 +75,70 @@ export const useClaimableTokens = () => {
6075
setState(prev => ({ ...prev, loading: true, error: null }));
6176

6277
try {
63-
console.log('📞 useClaimableTokens: Calling getUnclaimedRewards with params:', {
64-
account: connectedAccount,
65-
peerId: currentBloxPeerId,
66-
poolId: userPoolId
67-
});
68-
69-
// Get unclaimed rewards
70-
const unclaimedRewards = await contractService.getUnclaimedRewards(
71-
connectedAccount,
72-
currentBloxPeerId,
73-
userPoolId
74-
);
78+
let unclaimedRewards: any;
79+
let claimedInfo: any;
80+
81+
if (contractService && isReady) {
82+
// Use contractService when MetaMask is connected
83+
console.log('📞 useClaimableTokens: Using contractService (MetaMask connected)');
84+
85+
unclaimedRewards = await contractService.getUnclaimedRewards(
86+
effectiveAccount,
87+
currentBloxPeerId,
88+
userPoolId
89+
);
90+
91+
claimedInfo = await contractService.getClaimedRewardsInfo(
92+
effectiveAccount,
93+
currentBloxPeerId,
94+
userPoolId
95+
);
96+
} else if (useReadOnlyService) {
97+
// Use RPC provider when MetaMask is not connected
98+
console.log('📞 useClaimableTokens: Using RPC provider (manual signature fallback)');
99+
100+
const chainConfig = getChainConfigByName(selectedChain);
101+
const readOnlyProvider = new ethers.providers.JsonRpcProvider(chainConfig.rpcUrl);
102+
const rewardContract = new ethers.Contract(
103+
chainConfig.contracts.rewardEngine,
104+
REWARD_ENGINE_ABI,
105+
readOnlyProvider
106+
);
107+
108+
const peerIdBytes32 = await peerIdToBytes32(currentBloxPeerId);
109+
110+
// Get unclaimed rewards
111+
const [unclaimedMining, unclaimedStorage] = await rewardContract.getUnclaimedRewards(
112+
effectiveAccount,
113+
peerIdBytes32,
114+
userPoolId
115+
);
116+
117+
unclaimedRewards = {
118+
unclaimedMining: ethers.utils.formatEther(unclaimedMining),
119+
unclaimedStorage: ethers.utils.formatEther(unclaimedStorage),
120+
totalUnclaimed: ethers.utils.formatEther(unclaimedMining.add(unclaimedStorage)),
121+
};
122+
123+
// Get claimed rewards info
124+
const [lastClaimedTimestamp] = await rewardContract.getClaimedRewardsInfo(
125+
effectiveAccount,
126+
peerIdBytes32,
127+
userPoolId
128+
);
129+
130+
const now = Math.floor(Date.now() / 1000);
131+
const timeSinceLastClaim = Math.max(0, now - lastClaimedTimestamp.toNumber());
132+
133+
claimedInfo = {
134+
lastClaimedTimestamp: lastClaimedTimestamp.toNumber(),
135+
timeSinceLastClaim,
136+
};
137+
} else {
138+
throw new Error('No service available for fetching rewards');
139+
}
75140

76141
console.log('📥 useClaimableTokens: getUnclaimedRewards response:', unclaimedRewards);
77-
78-
console.log('📞 useClaimableTokens: Calling getClaimedRewardsInfo with params:', {
79-
account: connectedAccount,
80-
peerId: currentBloxPeerId,
81-
poolId: userPoolId
82-
});
83-
84-
// Get claimed rewards info
85-
const claimedInfo = await contractService.getClaimedRewardsInfo(
86-
connectedAccount,
87-
currentBloxPeerId,
88-
userPoolId
89-
);
90-
91142
console.log('📥 useClaimableTokens: getClaimedRewardsInfo response:', claimedInfo);
92143

93144
const canClaim = parseFloat(unclaimedRewards.totalUnclaimed) > 0;
@@ -137,7 +188,7 @@ export const useClaimableTokens = () => {
137188
canClaim: false,
138189
});
139190
}
140-
}, [contractService, isReady, currentBloxPeerId, connectedAccount, userPoolId]);
191+
}, [contractService, isReady, currentBloxPeerId, effectiveAccount, userPoolId, useReadOnlyService, selectedChain]);
141192

142193
const claimTokens = useCallback(async () => {
143194
if (!contractService || !isReady || !currentBloxPeerId || !userPoolId || !state.canClaim) {

apps/box/src/hooks/useFulaBalance.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { useState, useEffect, useCallback } from 'react';
22
import { useContractIntegration } from './useContractIntegration';
33
import { useSettingsStore } from '../stores/useSettingsStore';
4+
import { useUserProfileStore } from '../stores/useUserProfileStore';
45
import { ethers } from 'ethers';
56
import { getChainConfigByName } from '../contracts/config';
67
import { FULA_TOKEN_ABI } from '../contracts/abis';
@@ -31,9 +32,12 @@ export const useFulaBalance = (account?: string) => {
3132
const { connectedAccount } = useContractIntegration();
3233
const selectedChain = useSettingsStore((state) => state.selectedChain);
3334
const { account: metamaskAccount } = useSDK();
35+
const manualSignatureWalletAddress = useUserProfileStore(
36+
(state) => state.manualSignatureWalletAddress
37+
);
3438

3539
const loadBalance = useCallback(async () => {
36-
const targetAccount = account || metamaskAccount || connectedAccount;
40+
const targetAccount = account || metamaskAccount || connectedAccount || manualSignatureWalletAddress;
3741
if (!targetAccount) {
3842
setState(prev => ({ ...prev, error: 'No account available' }));
3943
return;
@@ -89,29 +93,29 @@ export const useFulaBalance = (account?: string) => {
8993
error: errorMessage,
9094
}));
9195
}
92-
}, [selectedChain, account, metamaskAccount, connectedAccount]);
96+
}, [selectedChain, account, metamaskAccount, connectedAccount, manualSignatureWalletAddress]);
9397

9498
const refreshBalance = useCallback(() => {
9599
loadBalance();
96100
}, [loadBalance]);
97101

98102
// Load balance when dependencies change
99103
useEffect(() => {
100-
if (account || metamaskAccount || connectedAccount) {
104+
if (account || metamaskAccount || connectedAccount || manualSignatureWalletAddress) {
101105
loadBalance();
102106
}
103-
}, [selectedChain, account, metamaskAccount, connectedAccount, loadBalance]);
107+
}, [account, metamaskAccount, connectedAccount, manualSignatureWalletAddress, loadBalance]);
104108

105109
// Auto-refresh balance every 30 seconds
106110
useEffect(() => {
107-
if (!(account || metamaskAccount || connectedAccount)) return;
111+
if (!(account || metamaskAccount || connectedAccount || manualSignatureWalletAddress)) return;
108112

109113
const interval = setInterval(() => {
110114
loadBalance();
111115
}, 30000);
112116

113117
return () => clearInterval(interval);
114-
}, [account, metamaskAccount, connectedAccount, loadBalance]);
118+
}, [account, metamaskAccount, connectedAccount, manualSignatureWalletAddress, loadBalance]);
115119

116120
return {
117121
...state,

0 commit comments

Comments
 (0)