diff --git a/packages/nextjs/app/dapp/dashboard/page.tsx b/packages/nextjs/app/dapp/dashboard/page.tsx index 578f4082..bdc99944 100644 --- a/packages/nextjs/app/dapp/dashboard/page.tsx +++ b/packages/nextjs/app/dapp/dashboard/page.tsx @@ -20,12 +20,14 @@ import LastDrawResultsCard from "~~/components/dashboard/dashboard/LastDrawResul import { useDrawInfo } from "~~/hooks/scaffold-stark/useDrawInfo"; import { useCurrentDrawId } from "~~/hooks/scaffold-stark/useCurrentDrawId"; +import { useScaffoldReadContract } from "~~/hooks/scaffold-stark/useScaffoldReadContract"; import { fetchDashboardMock, type DashboardMock } from "~~/lib/mocks/dashboard"; +import { formatBalance } from "~~/utils/formatBalance"; export default function DashboardPage() { const navigate = useRouter(); const { scrollY } = useScroll(); - const { status } = useAccount(); + const { address, isConnected } = useAccount(); const heroY = useTransform(scrollY, [0, 500], [0, -100]); const prizeDistributionY = useTransform(scrollY, [0, 2000], [0, -50]); @@ -36,10 +38,81 @@ export default function DashboardPage() { const [selectedNumbers, setSelectedNumbers] = useState([]); const [data, setData] = useState(null); + // State for balances + const [strkBalance, setStrkBalance] = useState(0); + const [strkpBalance, setStrkpBalance] = useState(0); + const [isLoadingBalances, setIsLoadingBalances] = useState(false); + const { currentDrawId } = useCurrentDrawId(); const { timeRemainingFromBlocks, blocksRemaining, currentBlock } = useDrawInfo({ drawId: currentDrawId }); + // Get STRKP contract address from Lottery + const { data: strkpContractAddress, isLoading: loadingStrkpAddress } = + useScaffoldReadContract({ + contractName: "Lottery", + functionName: "GetStarkPlayContractAddress", + args: [], + }); + + // Read STRKP balance + const { + data: strkpBalanceRaw, + isLoading: loadingStrkpBalance, + error: strkpError, + } = useScaffoldReadContract({ + contractName: "StarkPlayERC20", + functionName: "balanceOf", + //always provide a tuple + args: (address ? [address] : [undefined]) as readonly [string | undefined], + enabled: !!address && isConnected, + }); + + // Read STRK balance + const { data: strkBalanceRaw, isLoading: loadingStrkBalance } = + useScaffoldReadContract({ + contractName: "StarkPlayVault", + functionName: "get_total_strk_stored", + args: [], + enabled: !!address && isConnected, + }); + + // Safely handle Starknet typed return values (u256 arrays, etc.) + useEffect(() => { + if (strkpBalanceRaw) { + try { + const raw = strkpBalanceRaw as unknown; + const value = Array.isArray(raw) + ? BigInt((raw as any)[0]?.value ?? 0) + : BigInt(raw as bigint); + const formatted = formatBalance(value, 18, 2); + setStrkpBalance(formatted); + } catch { + setStrkpBalance(0); + } + } + }, [strkpBalanceRaw]); + + useEffect(() => { + if (strkBalanceRaw) { + try { + const raw = strkBalanceRaw as unknown; + const value = Array.isArray(raw) + ? BigInt((raw as any)[0]?.value ?? 0) + : BigInt(raw as bigint); + const formatted = formatBalance(value, 18, 2); + setStrkBalance(formatted); + } catch { + setStrkBalance(0); + } + } + }, [strkBalanceRaw]); + + // Track loading state + useEffect(() => { + setIsLoadingBalances(loadingStrkpBalance || loadingStrkBalance); + }, [loadingStrkpBalance, loadingStrkBalance]); + const jackpot = 250295; const targetDate = new Date(); targetDate.setDate(targetDate.getDate() + 1); @@ -110,7 +183,12 @@ export default function DashboardPage() {
- + {/* Pass real balances instead of mock data */} +
diff --git a/packages/nextjs/public/sw.js b/packages/nextjs/public/sw.js index 0e685d1a..73079303 100644 --- a/packages/nextjs/public/sw.js +++ b/packages/nextjs/public/sw.js @@ -1,30 +1,30 @@ if (!self.define) { let e, s = {}; - const a = (a, t) => ( - (a = new URL(a + ".js", t).href), - s[a] || + const n = (n, a) => ( + (n = new URL(n + ".js", a).href), + s[n] || new Promise((s) => { if ("document" in self) { const e = document.createElement("script"); - ((e.src = a), (e.onload = s), document.head.appendChild(e)); - } else ((e = a), importScripts(a), s()); + ((e.src = n), (e.onload = s), document.head.appendChild(e)); + } else ((e = n), importScripts(n), s()); }).then(() => { - let e = s[a]; - if (!e) throw new Error(`Module ${a} didn’t register its module`); + let e = s[n]; + if (!e) throw new Error(`Module ${n} didn’t register its module`); return e; }) ); - self.define = (t, n) => { - const i = + self.define = (a, i) => { + const t = e || ("document" in self ? document.currentScript.src : "") || location.href; - if (s[i]) return; + if (s[t]) return; let c = {}; - const r = (e) => a(e, i), - f = { module: { uri: i }, exports: c, require: r }; - s[i] = Promise.all(t.map((e) => f[e] || r(e))).then((e) => (n(...e), c)); + const r = (e) => n(e, t), + l = { module: { uri: t }, exports: c, require: r }; + s[t] = Promise.all(a.map((e) => l[e] || r(e))).then((e) => (i(...e), c)); }; } define(["./workbox-4754cb34"], function (e) { @@ -58,35 +58,27 @@ define(["./workbox-4754cb34"], function (e) { }, { url: "/_next/app-build-manifest.json", - revision: "789803e92a83da13102d782c0caf32ea", - }, - { - url: "/_next/static/aS3jJLfkGqftpm8ZKCFrw/_buildManifest.js", - revision: "d551238b042369e750acb6722dccfe58", - }, - { - url: "/_next/static/aS3jJLfkGqftpm8ZKCFrw/_ssgManifest.js", - revision: "b6652df95db52feb4daf4eca35380933", + revision: "bb0b4ba27f16bc2877076316c2bfdd85", }, { url: "/_next/static/chunks/1186-9a65c2a5586b201c.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/1218-eb34d217f148215b.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/1684-dc4632b38f8aec56.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/2077-0faa45e0724c5fa6.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/2200-57c1f5c2ae1dad70.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/2347.ef36ce4322b451d1.js", @@ -94,63 +86,59 @@ define(["./workbox-4754cb34"], function (e) { }, { url: "/_next/static/chunks/2564-5a8dcdfb20abd6a8.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/277-4b92422e0dd77f4b.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/2878-bb61f0752e5f06e6.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/2f0b94e8-009c4fe7d09feb3b.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/3063-392cf10d902d1d57.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/30a37ab2-c194af7319be38d5.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", - }, - { - url: "/_next/static/chunks/3340-eb992131d15aa06e.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/4026-0c1450ede9e9d058.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/4139-ae1bd859311056aa.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/4191-17511b5bb8d710a2.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/4277-23d3626bb2535746.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/473f56c0-6b03c6907205fb07.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/4bd1b696-29c1d99d049afc50.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/5274-4fc2df354ce7ef88.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/5331-6c1e3d4f6f57f119.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/5470-88842a1e3eb51b04.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/5728.12b88c9a7cf9f3d8.js", @@ -158,55 +146,59 @@ define(["./workbox-4754cb34"], function (e) { }, { url: "/_next/static/chunks/6047-230155c320ecccab.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/6281-8e20ce5aa13ccbbf.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/6281-88eea553f9a87ab0.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/658-5fd6cdc383acd9d5.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/6874-3389db82a2c367e3.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/6885-085169be9377ee78.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/7022-4eb19c5647273d0b.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/70646a03-49307dd85cd81a56.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/7248-f5f3aca7ad687091.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/8225-e9e280387ece4bd2.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", + }, + { + url: "/_next/static/chunks/8252-125ae14c1f773066.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/8260-a2d6da7ba3d8f3da.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/8844-f28ae56012058f65.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/930-5a91f7079bfc6aed.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/930-63713162fb98c1f9.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/9608-7ebebc96817e5764.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/972.9dee389435e21097.js", @@ -214,135 +206,139 @@ define(["./workbox-4754cb34"], function (e) { }, { url: "/_next/static/chunks/app/_not-found/page-e021c69819b6c202.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/about-us/page-4583d77c87d493e0.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/about-us/page-733cc13964489540.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/admin-lottery/page-84c8f4b59fad9691.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/admin-lottery/page-0872504be0c5ce86.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/app/admin/layout-b34a32a6c44d9c2f.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/admin/page-b4e235a319d79ca9.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/admin/page-ba3501461696b75a.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/app/api/price/route-d7ff5854924f6fdc.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", + }, + { + url: "/_next/static/chunks/app/configure/page-9db3d8831e9168bf.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/configure/page-bfb441c2344ad329.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/contact-us/page-62ade46c57388c09.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/contact-us/page-c6543c084f18fb68.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/dapp/buy-tickets/page-e78b023de6169ef5.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/dapp/buy-tickets/page-f445cd3093c6c3cd.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/dapp/claim/page-aeeca46d691088bd.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/dapp/claim/page-ededd898e10a69cf.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/dapp/dashboard/page-586fd77169bd0750.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/dapp/dashboard/page-5a5790e0df457ed3.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/dapp/layout-f80554f204e1d958.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/dapp/layout-9dea3d3ebc9f5f49.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/dapp/mint/page-134c618992e23663.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/dapp/mint/page-36aedf876eac1bfd.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/dapp/page-41d42d77a83ebacb.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/dapp/unmint/page-361a1afce8ad42a8.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/dapp/unmint/page-da4152c53b71bace.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/debug/page-57e6944ad4ba96b9.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/debug/page-1142d1559c7b206d.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/how-it-works/page-d3810add71ff6732.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/how-it-works/page-03189833d8fe55ad.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/i18n-demo/page-ca4866fe65c65fb8.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/i18n-demo/page-a15b2b017158ab1e.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/jackpot-report/page-bcbd89bea8745201.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/jackpot-report/page-9b71ed7bb679fffc.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/layout-6406cd050a7b8689.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/layout-a098e52d49134f15.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/not-found-fbae5fddd370c916.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/not-found-5095b03fcdaa1009.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/page-3d9e60cce6cb1745.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/page-2a76d79592010369.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/play/confirmation/page-6b8b4c6dcfeaa5b3.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/play/confirmation/page-cd1c54eaca96a4c4.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/play/page-852db567c52fb7d6.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/play/page-2a4a57e2265e5e69.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/prizes/page-1493797cf2970510.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/prizes/page-accf0412f40674e5.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/profile/page-970a27402b904ebf.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/profile/page-eb4046598a37c38b.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/results/%5BdrawId%5D/page-0b3d6f69667e247a.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/results/%5BdrawId%5D/page-c28ef5663ff02cc1.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/app/results/page-af13201a8429ca70.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/app/results/page-18e303c64cc09a13.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/e6909d18-d1e7bf26fe24aa96.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/framework-fc63273ed5a51da5.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/main-a460c7fac429e573.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { - url: "/_next/static/chunks/main-app-a07d235cc2ec6b59.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + url: "/_next/static/chunks/main-app-e4c6a0453a83baa7.js", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/pages/_app-5d1abe03d322390c.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/pages/_error-3b2a1d523de49635.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", }, { url: "/_next/static/chunks/polyfills-42372ed130431b0a.js", @@ -350,11 +346,19 @@ define(["./workbox-4754cb34"], function (e) { }, { url: "/_next/static/chunks/webpack-c8b3617e853d3c50.js", - revision: "aS3jJLfkGqftpm8ZKCFrw", + revision: "iCaUWjtmr8nS2ABz6lyYO", + }, + { + url: "/_next/static/css/a3548ace7fb40a91.css", + revision: "a3548ace7fb40a91", + }, + { + url: "/_next/static/iCaUWjtmr8nS2ABz6lyYO/_buildManifest.js", + revision: "f45e51bfddb1d656d7abd0bfc4679fa5", }, { - url: "/_next/static/css/f397428739d6ce55.css", - revision: "f397428739d6ce55", + url: "/_next/static/iCaUWjtmr8nS2ABz6lyYO/_ssgManifest.js", + revision: "b6652df95db52feb4daf4eca35380933", }, { url: "/blast-icon-color.svg", @@ -427,8 +431,8 @@ define(["./workbox-4754cb34"], function (e) { cacheWillUpdate: async ({ request: e, response: s, - event: a, - state: t, + event: n, + state: a, }) => s && "opaqueredirect" === s.type ? new Response(s.body, { diff --git a/packages/nextjs/utils/formatBalance.ts b/packages/nextjs/utils/formatBalance.ts new file mode 100644 index 00000000..bc8a1331 --- /dev/null +++ b/packages/nextjs/utils/formatBalance.ts @@ -0,0 +1,57 @@ +/** + * Converts balance from wei (with 18 decimals) to readable decimal format + * @param balance Balance in wei as bigint or number + * @param decimals Number of decimals (default: 18) + * @param displayDecimals Number of decimals to show (default: 2) + * @returns Formatted balance as number + */ +export function formatBalance( + balance: bigint | number | undefined | null, + decimals: number = 18, + displayDecimals: number = 2, +): number { + if (!balance) return 0; + + try { + // Convert to bigint if it's a number + const balanceBigInt = + typeof balance === "bigint" ? balance : BigInt(balance); + + // Calculate divisor (10^decimals) + const divisor = BigInt(10 ** decimals); + + // Get integer and fractional parts + const integerPart = balanceBigInt / divisor; + const fractionalPart = balanceBigInt % divisor; + + // Convert to decimal + const formatted = + Number(integerPart) + Number(fractionalPart) / Number(divisor); + + // Round to display decimals + const multiplier = Math.pow(10, displayDecimals); + return Math.round(formatted * multiplier) / multiplier; + } catch (error) { + console.error("Error formatting balance:", error); + return 0; + } +} + +/** + * Formats balance to a readable string with optional thousand separators + * @param balance Balance in wei + * @param decimals Number of decimals (default: 18) + * @param displayDecimals Number of decimals to show (default: 2) + * @returns Formatted balance string like "1,234.56" + */ +export function formatBalanceToString( + balance: bigint | number | undefined | null, + decimals: number = 18, + displayDecimals: number = 2, +): string { + const formatted = formatBalance(balance, decimals, displayDecimals); + return formatted.toLocaleString("en-US", { + minimumFractionDigits: displayDecimals, + maximumFractionDigits: displayDecimals, + }); +}