From 68f6218b83c6f6c1112abea044039e6fe261277a Mon Sep 17 00:00:00 2001 From: Agnes Koinange Date: Mon, 12 Jan 2026 15:12:41 +0300 Subject: [PATCH 1/4] fix: Celo gas pricing and React hooks --- .../react-app/src/screens/TrustAction.tsx | 21 ++++++++----------- 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/packages/react-app/src/screens/TrustAction.tsx b/packages/react-app/src/screens/TrustAction.tsx index 0b23af3..aabcf3c 100644 --- a/packages/react-app/src/screens/TrustAction.tsx +++ b/packages/react-app/src/screens/TrustAction.tsx @@ -22,15 +22,16 @@ import { truncateAddress } from "@/utils"; // @ts-expect-error const isMiniPay = window?.ethereum?.isMiniPay; const gasOpts = isMiniPay ? {} : { - maxFeePerGas: BigInt(5e9), - maxPriorityFeePerGas: BigInt(0) -} - + maxFeePerGas: BigInt(60e9), + maxPriorityFeePerGas: BigInt(2e9) +}; + const useGetFlowRate = (sender: string | undefined) => { - if (!sender) return undefined; - const memberData = useGetMember(sender); + const memberData = useGetMember(sender || ""); + if (!sender) return 0n; // @ts-ignore - return memberData.status === "success" ? BigInt(memberData.data?.data?.outFlowRate || 0) : undefined + const flowRate = memberData.data?.data?.outFlowRate; + return flowRate ? BigInt(flowRate) : 0n; }; export const QrScan = () => { @@ -38,7 +39,6 @@ export const QrScan = () => { const account = useAccount(); const existingFlowRate = useGetFlowRate(account.address); - console.log({ existingFlowRate }); const { writeContractAsync } = useWriteContract(); const [result, setResult] = useState(undefined); @@ -50,17 +50,15 @@ export const QrScan = () => { const validRecipient = isAddress(result || ""); const handleScan = (result: IDetectedBarcode[]) => { - console.log(result); if (result.length > 0) { setResult(result[0].rawValue); } }; const trust = async () => { - if (existingFlowRate !== undefined && result) { + if (result) { const monthlyTrustRate = parseEther(amount.toString()) / BigInt(60 * 60 * 24 * 30); - console.log("Trusting:", { existingFlowRate, result, monthlyTrustRate }); const newFlowRate = existingFlowRate + monthlyTrustRate; const userData = encodeAbiParameters( @@ -90,7 +88,6 @@ export const QrScan = () => { }); navigation("/"); } catch (e: any) { - console.log({ e }) setLoading(false); toast({ title: "Transaction failed", From cc9ba8dee8b41ab3218ce7852c04ada10eb37056 Mon Sep 17 00:00:00 2001 From: Agnes Koinange Date: Mon, 12 Jan 2026 15:12:57 +0300 Subject: [PATCH 2/4] fix: Add enabled param to query hook --- packages/react-app/src/hooks/queries/useGenericQuery.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/react-app/src/hooks/queries/useGenericQuery.ts b/packages/react-app/src/hooks/queries/useGenericQuery.ts index 7c44a4b..0777912 100644 --- a/packages/react-app/src/hooks/queries/useGenericQuery.ts +++ b/packages/react-app/src/hooks/queries/useGenericQuery.ts @@ -2,7 +2,8 @@ import { useQuery } from "@tanstack/react-query"; export const useGenericQuery = ( queryKey: string[], - queryFn: () => Promise + queryFn: () => Promise, + enabled: boolean = true ) => { const { data, @@ -12,6 +13,7 @@ export const useGenericQuery = ( } = useQuery({ queryKey: queryKey, queryFn: queryFn, + enabled: enabled, }); const refetch = async () => { From a2c7bd18c8fced73d897a83f2a52fbca84d097fb Mon Sep 17 00:00:00 2001 From: Agnes Koinange Date: Mon, 12 Jan 2026 15:13:06 +0300 Subject: [PATCH 3/4] fix: Prevent empty member queries --- packages/react-app/src/hooks/queries/useGetMember.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/react-app/src/hooks/queries/useGetMember.tsx b/packages/react-app/src/hooks/queries/useGetMember.tsx index 2874011..ddba622 100644 --- a/packages/react-app/src/hooks/queries/useGetMember.tsx +++ b/packages/react-app/src/hooks/queries/useGetMember.tsx @@ -88,8 +88,7 @@ export const useGetMemberTrusters = (memberId: string) => { }; export const useGetMember = (memberId: string) => { - const queryKey = ["member", memberId]; const queryFn = () => fetchMemberData(memberId); - return useGenericQuery(queryKey, queryFn); + return useGenericQuery(queryKey, queryFn, !!memberId && memberId.length > 0); }; From 0bab35ebe344c9cd6560cd6b7b6ba0dc27bd3151 Mon Sep 17 00:00:00 2001 From: Agnes Koinange Date: Thu, 5 Feb 2026 09:28:53 +0300 Subject: [PATCH 4/4] fix: Update gas pricing and read flow rate from blockchain --- .../react-app/src/screens/TrustAction.tsx | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/react-app/src/screens/TrustAction.tsx b/packages/react-app/src/screens/TrustAction.tsx index aabcf3c..ed25d58 100644 --- a/packages/react-app/src/screens/TrustAction.tsx +++ b/packages/react-app/src/screens/TrustAction.tsx @@ -4,7 +4,7 @@ import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { useToast } from "@/hooks/use-toast"; -import { useWriteContract, useAccount } from "wagmi"; +import { useWriteContract, useAccount, useReadContract } from "wagmi"; import ABI from "../abis/CFAv1Forwarder.json"; import { GOODDOLLAR, SF_FORWARDER, POOL_CONTRACT } from "@/env"; import { @@ -16,22 +16,25 @@ import { import { Loader2 } from "lucide-react"; import { useNavigate } from "react-router-dom"; import { PasteInput } from "@/components/PasteInput"; -import { useGetMember } from "@/hooks/queries/useGetMember"; import { truncateAddress } from "@/utils"; // @ts-expect-error const isMiniPay = window?.ethereum?.isMiniPay; const gasOpts = isMiniPay ? {} : { - maxFeePerGas: BigInt(60e9), - maxPriorityFeePerGas: BigInt(2e9) + maxFeePerGas: BigInt(25.1e9), + maxPriorityFeePerGas: BigInt(1e8) }; const useGetFlowRate = (sender: string | undefined) => { - const memberData = useGetMember(sender || ""); - if (!sender) return 0n; - // @ts-ignore - const flowRate = memberData.data?.data?.outFlowRate; - return flowRate ? BigInt(flowRate) : 0n; + const result = useReadContract({ + address: SF_FORWARDER, + abi: [{ name: "getFlowrate", type: "function", stateMutability: "view", inputs: [{ name: "token", type: "address" }, { name: "sender", type: "address" }, { name: "receiver", type: "address" }], outputs: [{ name: "", type: "int96" }] }], + functionName: "getFlowrate", + args: [GOODDOLLAR as `0x${string}`, (sender || "0x0000000000000000000000000000000000000000") as `0x${string}`, POOL_CONTRACT as `0x${string}`], + query: { enabled: !!sender }, + }); + if (!sender || !result.data) return 0n; + return BigInt(result.data); }; export const QrScan = () => {