provider-connect 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs ADDED
@@ -0,0 +1,2373 @@
1
+ "use client";
2
+ var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
4
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
5
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
8
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
+ var __spreadValues = (a, b) => {
10
+ for (var prop in b || (b = {}))
11
+ if (__hasOwnProp.call(b, prop))
12
+ __defNormalProp(a, prop, b[prop]);
13
+ if (__getOwnPropSymbols)
14
+ for (var prop of __getOwnPropSymbols(b)) {
15
+ if (__propIsEnum.call(b, prop))
16
+ __defNormalProp(a, prop, b[prop]);
17
+ }
18
+ return a;
19
+ };
20
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
21
+ var __objRest = (source, exclude) => {
22
+ var target = {};
23
+ for (var prop in source)
24
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
25
+ target[prop] = source[prop];
26
+ if (source != null && __getOwnPropSymbols)
27
+ for (var prop of __getOwnPropSymbols(source)) {
28
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
29
+ target[prop] = source[prop];
30
+ }
31
+ return target;
32
+ };
33
+
34
+ // components/ConnectWalletHandler.tsx
35
+ import { useEffect as useEffect2, useState as useState2, useCallback as useCallback2 } from "react";
36
+
37
+ // components/ui/dialog.tsx
38
+ import * as React from "react";
39
+ import * as DialogPrimitive from "@radix-ui/react-dialog";
40
+ import { X } from "lucide-react";
41
+
42
+ // lib/utils.ts
43
+ import { clsx } from "clsx";
44
+ import { twMerge } from "tailwind-merge";
45
+ function cn(...inputs) {
46
+ return twMerge(clsx(inputs));
47
+ }
48
+
49
+ // components/ui/dialog.tsx
50
+ import { jsx, jsxs } from "react/jsx-runtime";
51
+ var Dialog = DialogPrimitive.Root;
52
+ var DialogTrigger = DialogPrimitive.Trigger;
53
+ var DialogPortal = DialogPrimitive.Portal;
54
+ var DialogClose = DialogPrimitive.Close;
55
+ var DialogOverlay = React.forwardRef((_a, ref) => {
56
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
57
+ return /* @__PURE__ */ jsx(DialogPortal, { children: /* @__PURE__ */ jsx(
58
+ DialogPrimitive.Overlay,
59
+ __spreadValues({
60
+ ref,
61
+ className: cn(
62
+ "fixed inset-0 z-50 bg-black/80 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0",
63
+ className
64
+ )
65
+ }, props)
66
+ ) });
67
+ });
68
+ DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
69
+ var DialogContent = React.forwardRef((_a, ref) => {
70
+ var _b = _a, { className, children } = _b, props = __objRest(_b, ["className", "children"]);
71
+ return /* @__PURE__ */ jsxs(DialogPortal, { children: [
72
+ /* @__PURE__ */ jsx(DialogOverlay, {}),
73
+ /* @__PURE__ */ jsxs(
74
+ DialogPrimitive.Content,
75
+ __spreadProps(__spreadValues({
76
+ ref,
77
+ className: cn(
78
+ "fixed left-[50%] top-[50%] z-50 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border bg-background p-6 shadow-lg duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[state=closed]:slide-out-to-left-1/2 data-[state=closed]:slide-out-to-top-[48%] data-[state=open]:slide-in-from-left-1/2 data-[state=open]:slide-in-from-top-[48%] sm:rounded-lg",
79
+ className
80
+ )
81
+ }, props), {
82
+ children: [
83
+ children,
84
+ /* @__PURE__ */ jsxs(DialogPrimitive.Close, { className: "absolute right-4 top-4 rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground", children: [
85
+ /* @__PURE__ */ jsx(X, { className: "h-4 w-4" }),
86
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Close" })
87
+ ] })
88
+ ]
89
+ })
90
+ )
91
+ ] });
92
+ });
93
+ DialogContent.displayName = DialogPrimitive.Content.displayName;
94
+ var DialogHeader = (_a) => {
95
+ var _b = _a, {
96
+ className
97
+ } = _b, props = __objRest(_b, [
98
+ "className"
99
+ ]);
100
+ return /* @__PURE__ */ jsx(
101
+ "div",
102
+ __spreadValues({
103
+ className: cn(
104
+ "flex flex-col space-y-1.5 text-center sm:text-left",
105
+ className
106
+ )
107
+ }, props)
108
+ );
109
+ };
110
+ DialogHeader.displayName = "DialogHeader";
111
+ var DialogFooter = (_a) => {
112
+ var _b = _a, {
113
+ className
114
+ } = _b, props = __objRest(_b, [
115
+ "className"
116
+ ]);
117
+ return /* @__PURE__ */ jsx(
118
+ "div",
119
+ __spreadValues({
120
+ className: cn(
121
+ "flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2",
122
+ className
123
+ )
124
+ }, props)
125
+ );
126
+ };
127
+ DialogFooter.displayName = "DialogFooter";
128
+ var DialogTitle = React.forwardRef((_a, ref) => {
129
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
130
+ return /* @__PURE__ */ jsx(
131
+ DialogPrimitive.Title,
132
+ __spreadValues({
133
+ ref,
134
+ className: cn(
135
+ "text-lg font-semibold leading-none tracking-tight",
136
+ className
137
+ )
138
+ }, props)
139
+ );
140
+ });
141
+ DialogTitle.displayName = DialogPrimitive.Title.displayName;
142
+ var DialogDescription = React.forwardRef((_a, ref) => {
143
+ var _b = _a, { className } = _b, props = __objRest(_b, ["className"]);
144
+ return /* @__PURE__ */ jsx(
145
+ DialogPrimitive.Description,
146
+ __spreadValues({
147
+ ref,
148
+ className: cn("text-sm text-muted-foreground", className)
149
+ }, props)
150
+ );
151
+ });
152
+ DialogDescription.displayName = DialogPrimitive.Description.displayName;
153
+
154
+ // components/ConnectWalletHandler.tsx
155
+ import { VisuallyHidden } from "@radix-ui/react-visually-hidden";
156
+ import { toast as toast2 } from "sonner";
157
+
158
+ // components/ui/button.tsx
159
+ import * as React2 from "react";
160
+ import { Slot } from "@radix-ui/react-slot";
161
+ import { cva } from "class-variance-authority";
162
+ import { jsx as jsx2 } from "react/jsx-runtime";
163
+ var buttonVariants = cva(
164
+ "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50",
165
+ {
166
+ variants: {
167
+ variant: {
168
+ default: "bg-primary text-primary-foreground hover:bg-primary/90",
169
+ destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90",
170
+ outline: "border border-input bg-background hover:bg-accent hover:text-accent-foreground",
171
+ secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80",
172
+ ghost: "hover:bg-accent hover:text-accent-foreground",
173
+ link: "text-primary underline-offset-4 hover:underline"
174
+ },
175
+ size: {
176
+ default: "h-10 px-4 py-2",
177
+ sm: "h-9 rounded-md px-3",
178
+ lg: "h-11 rounded-md px-8",
179
+ icon: "h-10 w-10"
180
+ }
181
+ },
182
+ defaultVariants: {
183
+ variant: "default",
184
+ size: "default"
185
+ }
186
+ }
187
+ );
188
+ var Button = React2.forwardRef(
189
+ (_a, ref) => {
190
+ var _b = _a, { className, variant, size, asChild = false } = _b, props = __objRest(_b, ["className", "variant", "size", "asChild"]);
191
+ const Comp = asChild ? Slot : "button";
192
+ return /* @__PURE__ */ jsx2(
193
+ Comp,
194
+ __spreadValues({
195
+ className: cn(buttonVariants({ variant, size, className })),
196
+ ref
197
+ }, props)
198
+ );
199
+ }
200
+ );
201
+ Button.displayName = "Button";
202
+
203
+ // components/ConnectWalletHandler.tsx
204
+ import { motion } from "framer-motion";
205
+ import {
206
+ Loader2,
207
+ X as X2,
208
+ ExternalLink
209
+ } from "lucide-react";
210
+
211
+ // hooks/useSupraMultiWallet.ts
212
+ import { useState, useEffect, useCallback } from "react";
213
+ import nacl from "tweetnacl";
214
+ import { useRouter } from "next/navigation";
215
+ import { toast } from "sonner";
216
+ import {
217
+ SupraChainId,
218
+ initSdk
219
+ } from "ribbit-wallet-connect";
220
+
221
+ // lib/logger.ts
222
+ var Logger = class {
223
+ constructor() {
224
+ this.isDevelopment = process.env.NODE_ENV === "development";
225
+ }
226
+ log(level, message, context, error) {
227
+ if (!this.isDevelopment && level === "debug") {
228
+ return;
229
+ }
230
+ const entry = {
231
+ level,
232
+ message,
233
+ timestamp: Date.now(),
234
+ context,
235
+ error
236
+ };
237
+ const logMethod = level === "error" ? console.error : level === "warn" ? console.warn : console.log;
238
+ if (error) {
239
+ logMethod(`[${level.toUpperCase()}] ${message}`, __spreadProps(__spreadValues({}, context), {
240
+ error: {
241
+ name: error.name,
242
+ message: error.message,
243
+ stack: error.stack
244
+ }
245
+ }));
246
+ } else {
247
+ logMethod(`[${level.toUpperCase()}] ${message}`, context || {});
248
+ }
249
+ }
250
+ debug(message, context) {
251
+ this.log("debug", message, context);
252
+ }
253
+ info(message, context) {
254
+ this.log("info", message, context);
255
+ }
256
+ warn(message, context) {
257
+ this.log("warn", message, context);
258
+ }
259
+ error(message, error, context) {
260
+ this.log("error", message, context, error);
261
+ }
262
+ };
263
+ var logger = new Logger();
264
+
265
+ // lib/errors.ts
266
+ var WalletError = class _WalletError extends Error {
267
+ constructor(message, code, cause) {
268
+ super(message);
269
+ this.code = code;
270
+ this.cause = cause;
271
+ this.name = "WalletError";
272
+ Object.setPrototypeOf(this, _WalletError.prototype);
273
+ }
274
+ };
275
+ var WalletConnectionError = class _WalletConnectionError extends WalletError {
276
+ constructor(message, cause) {
277
+ super(message, "WALLET_CONNECTION_ERROR", cause);
278
+ this.name = "WalletConnectionError";
279
+ Object.setPrototypeOf(this, _WalletConnectionError.prototype);
280
+ }
281
+ };
282
+ var TransactionError = class _TransactionError extends WalletError {
283
+ constructor(message, txHash, cause) {
284
+ super(message, "TRANSACTION_ERROR", cause);
285
+ this.txHash = txHash;
286
+ this.name = "TransactionError";
287
+ Object.setPrototypeOf(this, _TransactionError.prototype);
288
+ }
289
+ };
290
+ var SignMessageError = class _SignMessageError extends WalletError {
291
+ constructor(message, cause) {
292
+ super(message, "SIGN_MESSAGE_ERROR", cause);
293
+ this.name = "SignMessageError";
294
+ Object.setPrototypeOf(this, _SignMessageError.prototype);
295
+ }
296
+ };
297
+ var WalletNotInstalledError = class _WalletNotInstalledError extends WalletError {
298
+ constructor(walletType) {
299
+ super(`Wallet ${walletType} is not installed`, "WALLET_NOT_INSTALLED");
300
+ this.name = "WalletNotInstalledError";
301
+ Object.setPrototypeOf(this, _WalletNotInstalledError.prototype);
302
+ }
303
+ };
304
+ var NetworkError = class _NetworkError extends WalletError {
305
+ constructor(message, cause) {
306
+ super(message, "NETWORK_ERROR", cause);
307
+ this.name = "NetworkError";
308
+ Object.setPrototypeOf(this, _NetworkError.prototype);
309
+ }
310
+ };
311
+
312
+ // lib/storage.ts
313
+ function setStorageItem(key, value, preferredType = "localStorage") {
314
+ const types = preferredType === "localStorage" ? ["localStorage", "sessionStorage", "cookie"] : preferredType === "sessionStorage" ? ["sessionStorage", "localStorage", "cookie"] : ["cookie", "localStorage", "sessionStorage"];
315
+ for (const type of types) {
316
+ try {
317
+ switch (type) {
318
+ case "localStorage":
319
+ if (typeof window !== "undefined" && window.localStorage) {
320
+ window.localStorage.setItem(key, value);
321
+ return true;
322
+ }
323
+ break;
324
+ case "sessionStorage":
325
+ if (typeof window !== "undefined" && window.sessionStorage) {
326
+ window.sessionStorage.setItem(key, value);
327
+ return true;
328
+ }
329
+ break;
330
+ case "cookie":
331
+ if (typeof document !== "undefined") {
332
+ document.cookie = `${key}=${encodeURIComponent(value)}; path=/; max-age=${60 * 60 * 24 * 30}; SameSite=Lax`;
333
+ return true;
334
+ }
335
+ break;
336
+ }
337
+ } catch (error) {
338
+ logger.warn(`Failed to set ${key} in ${type}`, { error });
339
+ }
340
+ }
341
+ return false;
342
+ }
343
+ function getStorageItem(key) {
344
+ try {
345
+ if (typeof window !== "undefined" && window.localStorage) {
346
+ const value = window.localStorage.getItem(key);
347
+ if (value !== null) return value;
348
+ }
349
+ } catch (error) {
350
+ logger.warn(`Failed to read ${key} from localStorage`, { error });
351
+ }
352
+ try {
353
+ if (typeof window !== "undefined" && window.sessionStorage) {
354
+ const value = window.sessionStorage.getItem(key);
355
+ if (value !== null) return value;
356
+ }
357
+ } catch (error) {
358
+ logger.warn(`Failed to read ${key} from sessionStorage`, { error });
359
+ }
360
+ try {
361
+ if (typeof document !== "undefined") {
362
+ const match = document.cookie.split("; ").find((r) => r.startsWith(key + "="));
363
+ if (match) {
364
+ return decodeURIComponent(match.split("=").slice(1).join("="));
365
+ }
366
+ }
367
+ } catch (error) {
368
+ logger.warn(`Failed to read ${key} from cookie`, { error });
369
+ }
370
+ return null;
371
+ }
372
+ function removeStorageItem(key) {
373
+ try {
374
+ if (typeof window !== "undefined" && window.localStorage) {
375
+ window.localStorage.removeItem(key);
376
+ }
377
+ } catch (error) {
378
+ }
379
+ try {
380
+ if (typeof window !== "undefined" && window.sessionStorage) {
381
+ window.sessionStorage.removeItem(key);
382
+ }
383
+ } catch (error) {
384
+ }
385
+ try {
386
+ if (typeof document !== "undefined") {
387
+ document.cookie = `${key}=; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT`;
388
+ }
389
+ } catch (error) {
390
+ }
391
+ }
392
+
393
+ // lib/constants.ts
394
+ var STORAGE_KEYS = {
395
+ SELECTED_WALLET: "multiwallet.selectedWallet",
396
+ RECENT_WALLET: "recent_wallet_type",
397
+ USER_PROFILE_CACHE: "user_profile_cache",
398
+ USER_PROFILE_CACHE_TIMESTAMP: "user_profile_cache_timestamp",
399
+ IS_SIGNING_WALLET: "isSigningWallet",
400
+ STARKEY_ACCOUNTS: "starkey.accounts.0"
401
+ };
402
+ var CACHE_TTL = {
403
+ PROFILE: 600 * 1e3,
404
+ // 10 minutes
405
+ BALANCE: 30 * 1e3
406
+ // 30 seconds
407
+ };
408
+ var TIMEOUTS = {
409
+ WALLET_DETECTION_POLL: 3e3,
410
+ // 3 seconds (reduced from 5s)
411
+ WALLET_CHECK_INTERVAL: 2e3,
412
+ // 2 seconds
413
+ WALLET_CHECK_MAX_DURATION: 3e4,
414
+ // 30 seconds
415
+ CONNECTION_TIMEOUT: 3e4,
416
+ // 30 seconds
417
+ BALANCE_POLL_INTERVAL: 3e4,
418
+ // 30 seconds
419
+ MODAL_CLOSE_DELAY: 2500,
420
+ // 2.5 seconds
421
+ CLICK_OUTSIDE_DELAY: 2e3
422
+ // 2 seconds
423
+ };
424
+ var WALLET_DOWNLOAD_URLS = {
425
+ starkey: "https://chromewebstore.google.com/detail/starkey-wallet-the-offici/hcjhpkgbmechpabifbggldplacolbkoh",
426
+ ribbit: "https://ribbitwallet.com"
427
+ };
428
+ var DEFAULT_CHAIN_IDS = {
429
+ TESTNET: "6",
430
+ MAINNET: "8"
431
+ };
432
+ var ERROR_MESSAGES = {
433
+ WALLET_NOT_INSTALLED: "Wallet extension not installed",
434
+ CONNECTION_FAILED: "Failed to connect wallet",
435
+ CONNECTION_REJECTED: "Connection rejected by user",
436
+ NO_ACCOUNT_FOUND: "No account found",
437
+ SIGNING_FAILED: "Message signing failed",
438
+ SIGNING_REJECTED: "Message signing rejected",
439
+ TRANSACTION_FAILED: "Transaction failed",
440
+ TRANSACTION_REJECTED: "Transaction rejected",
441
+ NETWORK_ERROR: "Network error occurred",
442
+ UNSUPPORTED_WALLET: "Unsupported wallet type",
443
+ INVALID_ADDRESS: "Invalid wallet address"
444
+ };
445
+ var CONNECTION_MESSAGES = {
446
+ CONNECTING: "Connecting to wallet...",
447
+ SIGNING: "Please sign the message to verify your account",
448
+ SUCCESS: "Successfully connected",
449
+ ERROR: "Connection failed",
450
+ CONNECTED_NOT_SIGNED: "Connected but signature rejected"
451
+ };
452
+
453
+ // lib/crypto.ts
454
+ function generateNonce() {
455
+ if (typeof window !== "undefined" && window.crypto && window.crypto.getRandomValues) {
456
+ const array = new Uint32Array(1);
457
+ window.crypto.getRandomValues(array);
458
+ return array[0].toString(36) + Date.now().toString(36);
459
+ }
460
+ return Math.random().toString(36).substring(2) + Date.now().toString(36);
461
+ }
462
+
463
+ // lib/config.ts
464
+ var defaultConfig = {
465
+ rpcUrl: {
466
+ testnet: "https://rpc-testnet.supra.com",
467
+ mainnet: "https://rpc-mainnet.supra.com"
468
+ },
469
+ chainId: process.env.NEXT_PUBLIC_SUPRA_CHAIN_ID || DEFAULT_CHAIN_IDS.TESTNET,
470
+ enableLogging: process.env.NODE_ENV === "development",
471
+ balancePollInterval: 3e4,
472
+ walletDetectionTimeout: 3e3
473
+ };
474
+ var config = __spreadValues({}, defaultConfig);
475
+ function initConfig(userConfig) {
476
+ var _a, _b, _c;
477
+ config = {
478
+ rpcUrl: {
479
+ testnet: ((_a = userConfig == null ? void 0 : userConfig.rpcUrl) == null ? void 0 : _a.testnet) || defaultConfig.rpcUrl.testnet,
480
+ mainnet: ((_b = userConfig == null ? void 0 : userConfig.rpcUrl) == null ? void 0 : _b.mainnet) || defaultConfig.rpcUrl.mainnet
481
+ },
482
+ chainId: (userConfig == null ? void 0 : userConfig.chainId) || defaultConfig.chainId,
483
+ enableLogging: (_c = userConfig == null ? void 0 : userConfig.enableLogging) != null ? _c : defaultConfig.enableLogging,
484
+ balancePollInterval: (userConfig == null ? void 0 : userConfig.balancePollInterval) || defaultConfig.balancePollInterval,
485
+ walletDetectionTimeout: (userConfig == null ? void 0 : userConfig.walletDetectionTimeout) || defaultConfig.walletDetectionTimeout
486
+ };
487
+ }
488
+ function getRpcUrl(chainId) {
489
+ const targetChainId = chainId || config.chainId;
490
+ const isMainnet = targetChainId === DEFAULT_CHAIN_IDS.MAINNET;
491
+ return isMainnet ? config.rpcUrl.mainnet : config.rpcUrl.testnet;
492
+ }
493
+ function getChainId() {
494
+ return config.chainId;
495
+ }
496
+ initConfig();
497
+
498
+ // hooks/useSupraMultiWallet.ts
499
+ var WALLET_CONFIGS = {
500
+ starkey: {
501
+ capabilities: {
502
+ signMessage: true,
503
+ accountSwitching: true,
504
+ networkSwitching: true,
505
+ rawTransactions: true,
506
+ eventListeners: true,
507
+ tokenRevalidation: true
508
+ },
509
+ provider: () => {
510
+ var _a;
511
+ return typeof window !== "undefined" && ((_a = window == null ? void 0 : window.starkey) == null ? void 0 : _a.supra);
512
+ }
513
+ },
514
+ ribbit: {
515
+ capabilities: {
516
+ signMessage: true,
517
+ accountSwitching: false,
518
+ // Ribbit doesn't support account switching
519
+ networkSwitching: false,
520
+ // Ribbit network switching happens in-app
521
+ rawTransactions: true,
522
+ eventListeners: false,
523
+ tokenRevalidation: false
524
+ // Ribbit doesn't support token revalidation
525
+ },
526
+ provider: () => initSdk()
527
+ }
528
+ };
529
+ var WALLET_EVENTS = {
530
+ CONNECTED: "wallet-connected",
531
+ PRESIGNED_STATE: "presigned-state",
532
+ POSTSIGNED_STATE: "postsigned-state",
533
+ ERROR: "wallet-error"
534
+ };
535
+ var setStoredWalletType = (walletType) => {
536
+ setStorageItem(STORAGE_KEYS.SELECTED_WALLET, walletType);
537
+ };
538
+ var getStoredWalletType = () => {
539
+ const stored = getStorageItem(STORAGE_KEYS.SELECTED_WALLET);
540
+ if (stored && ["starkey", "ribbit"].includes(stored)) {
541
+ return stored;
542
+ }
543
+ return "starkey";
544
+ };
545
+ var clearStoredWalletType = () => {
546
+ removeStorageItem(STORAGE_KEYS.SELECTED_WALLET);
547
+ };
548
+ var useSupraMultiWallet = (enabledWallets) => {
549
+ const router = useRouter();
550
+ const [selectedWallet, setSelectedWallet] = useState("starkey");
551
+ const [walletCapabilities, setWalletCapabilities] = useState(
552
+ WALLET_CONFIGS["starkey"].capabilities
553
+ );
554
+ useEffect(() => {
555
+ const stored = getStoredWalletType();
556
+ if (stored !== "starkey") {
557
+ setSelectedWallet(stored);
558
+ setWalletCapabilities(WALLET_CONFIGS[stored].capabilities);
559
+ }
560
+ }, []);
561
+ const [supraProvider, setSupraProvider] = useState(
562
+ WALLET_CONFIGS.starkey.provider()
563
+ );
564
+ const [ribbitProvider, setRibbitProvider] = useState(
565
+ WALLET_CONFIGS.ribbit.provider()
566
+ );
567
+ const [isExtensionInstalled, setIsExtensionInstalled] = useState(false);
568
+ const [accounts, setAccounts] = useState([]);
569
+ const [networkData, setNetworkData] = useState();
570
+ const [balance, setBalance] = useState("");
571
+ const [loading, setLoading] = useState(false);
572
+ const [justRequestedRelative, setJustRequestedRelative] = useState(false);
573
+ const [transactions, setTransactions] = useState([]);
574
+ const [selectedChainId, setSelectedChainId] = useState("");
575
+ const addTransactions = (hash) => {
576
+ setTransactions((prev) => [{ hash }, ...prev]);
577
+ };
578
+ const getCurrentProvider = () => {
579
+ switch (selectedWallet) {
580
+ case "starkey": {
581
+ return supraProvider;
582
+ }
583
+ case "ribbit": {
584
+ return ribbitProvider;
585
+ }
586
+ default: {
587
+ return supraProvider;
588
+ }
589
+ }
590
+ };
591
+ const checkExtensionInstalled = useCallback(async () => {
592
+ switch (selectedWallet) {
593
+ case "starkey": {
594
+ const provider = WALLET_CONFIGS.starkey.provider();
595
+ setSupraProvider(provider);
596
+ setIsExtensionInstalled(!!provider);
597
+ return !!provider;
598
+ }
599
+ case "ribbit": {
600
+ const provider = WALLET_CONFIGS.ribbit.provider();
601
+ if (!provider) {
602
+ setRibbitProvider(null);
603
+ setIsExtensionInstalled(false);
604
+ return false;
605
+ }
606
+ try {
607
+ setRibbitProvider(provider);
608
+ setIsExtensionInstalled(true);
609
+ return true;
610
+ } catch (error) {
611
+ logger.error("Error checking Ribbit wallet readiness", error);
612
+ setRibbitProvider(null);
613
+ setIsExtensionInstalled(false);
614
+ return false;
615
+ }
616
+ }
617
+ default: {
618
+ return false;
619
+ }
620
+ }
621
+ }, [selectedWallet]);
622
+ const updateAccounts = useCallback(async () => {
623
+ const provider = getCurrentProvider();
624
+ if (!provider) return;
625
+ try {
626
+ switch (selectedWallet) {
627
+ case "starkey": {
628
+ const responseAcc = await provider.account();
629
+ const newAccounts = responseAcc.length > 0 ? responseAcc : [];
630
+ setAccounts(newAccounts);
631
+ if (responseAcc.length > 0) {
632
+ setStorageItem(STORAGE_KEYS.STARKEY_ACCOUNTS, responseAcc[0]);
633
+ }
634
+ if (newAccounts.length > 0) {
635
+ const balance2 = await provider.balance();
636
+ if (balance2) {
637
+ setBalance(`${balance2.formattedBalance} ${balance2.displayUnit}`);
638
+ }
639
+ const networkData2 = await provider.getChainId();
640
+ setNetworkData(networkData2 || {});
641
+ }
642
+ break;
643
+ }
644
+ case "ribbit": {
645
+ const wallet = provider.getWalletInfo();
646
+ if (wallet == null ? void 0 : wallet.connected) {
647
+ setAccounts([wallet.walletAddress]);
648
+ const walletBalanceRequest = {
649
+ chainId: parseInt(getChainId()),
650
+ resourceType: "0x1::supra_coin::SupraCoin",
651
+ decimals: 8
652
+ };
653
+ const balanceStr = await provider.getWalletBalance(walletBalanceRequest);
654
+ logger.debug("Ribbit balance response", { balance: balanceStr });
655
+ setBalance(`${(balanceStr == null ? void 0 : balanceStr.balance) || 0} SUPRA`);
656
+ } else {
657
+ setAccounts([]);
658
+ }
659
+ break;
660
+ }
661
+ default: {
662
+ setAccounts([]);
663
+ break;
664
+ }
665
+ }
666
+ } catch (error) {
667
+ logger.error("Failed to update accounts", error, { walletType: selectedWallet });
668
+ setAccounts([]);
669
+ switch (selectedWallet) {
670
+ case "starkey": {
671
+ removeStorageItem(STORAGE_KEYS.STARKEY_ACCOUNTS);
672
+ break;
673
+ }
674
+ case "ribbit": {
675
+ break;
676
+ }
677
+ }
678
+ }
679
+ }, [selectedWallet]);
680
+ useEffect(() => {
681
+ let mounted = true;
682
+ const initProvider = async () => {
683
+ const isInstalled = await checkExtensionInstalled();
684
+ if (mounted && isInstalled) {
685
+ updateAccounts();
686
+ }
687
+ };
688
+ initProvider();
689
+ return () => {
690
+ mounted = false;
691
+ };
692
+ }, [selectedWallet, checkExtensionInstalled, updateAccounts]);
693
+ useEffect(() => {
694
+ const checkExtension = async () => {
695
+ return await checkExtensionInstalled();
696
+ };
697
+ checkExtension().then((isInstalled) => {
698
+ if (isInstalled && selectedWallet === "ribbit") {
699
+ updateAccounts();
700
+ }
701
+ });
702
+ const intv = setInterval(async () => {
703
+ const isInstalled = await checkExtension();
704
+ if (isInstalled) {
705
+ clearInterval(intv);
706
+ if (selectedWallet === "ribbit") {
707
+ updateAccounts();
708
+ }
709
+ }
710
+ }, 1e3);
711
+ setTimeout(() => {
712
+ clearInterval(intv);
713
+ }, TIMEOUTS.WALLET_DETECTION_POLL);
714
+ return () => clearInterval(intv);
715
+ }, [selectedWallet, updateAccounts, checkExtensionInstalled]);
716
+ const checkIsExtensionInstalled = useCallback(() => {
717
+ const intervalId = setInterval(async () => {
718
+ const isInstalled = await checkExtensionInstalled();
719
+ if (isInstalled) {
720
+ clearInterval(intervalId);
721
+ updateAccounts();
722
+ }
723
+ }, 500);
724
+ setTimeout(() => clearInterval(intervalId), TIMEOUTS.WALLET_DETECTION_POLL);
725
+ }, [updateAccounts, checkExtensionInstalled]);
726
+ const updateBalance = useCallback(async () => {
727
+ const provider = getCurrentProvider();
728
+ if (!provider || !accounts.length) {
729
+ setBalance("");
730
+ return;
731
+ }
732
+ try {
733
+ switch (selectedWallet) {
734
+ case "starkey": {
735
+ const balance2 = await provider.balance();
736
+ if (balance2) {
737
+ setBalance(`${balance2.formattedBalance} ${balance2.displayUnit}`);
738
+ }
739
+ break;
740
+ }
741
+ case "ribbit": {
742
+ const walletBalanceRequest = {
743
+ chainId: parseInt(getChainId()),
744
+ resourceType: "0x1::supra_coin::SupraCoin",
745
+ decimals: 8
746
+ };
747
+ const balanceStr = await provider.getWalletBalance(
748
+ walletBalanceRequest
749
+ );
750
+ logger.debug("Ribbit balance response", { balance: balanceStr });
751
+ setBalance(`${(balanceStr == null ? void 0 : balanceStr.balance) || 0} SUPRA`);
752
+ break;
753
+ }
754
+ default: {
755
+ setBalance("");
756
+ break;
757
+ }
758
+ }
759
+ } catch (error) {
760
+ logger.error("Failed to update balance", error, { walletType: selectedWallet });
761
+ setBalance("");
762
+ }
763
+ }, [selectedWallet, accounts]);
764
+ const getNetworkData = useCallback(async () => {
765
+ const provider = getCurrentProvider();
766
+ if (!provider) return {};
767
+ try {
768
+ switch (selectedWallet) {
769
+ case "starkey": {
770
+ const data = await provider.getChainId();
771
+ setNetworkData(data || {});
772
+ return data || {};
773
+ }
774
+ case "ribbit": {
775
+ const chainId = parseInt(getChainId());
776
+ const mockNetworkData = { chainId: chainId.toString() };
777
+ setNetworkData(mockNetworkData);
778
+ return mockNetworkData;
779
+ }
780
+ default: {
781
+ setNetworkData({});
782
+ return {};
783
+ }
784
+ }
785
+ } catch (error) {
786
+ logger.error("Failed to get network data", error, { walletType: selectedWallet });
787
+ setNetworkData({});
788
+ return {};
789
+ }
790
+ }, [selectedWallet]);
791
+ const connectWallet = async (walletType) => {
792
+ if (walletType) {
793
+ updateSelectedWallet(walletType);
794
+ }
795
+ const provider = walletType ? WALLET_CONFIGS[walletType].provider() : getCurrentProvider();
796
+ if (!provider) {
797
+ const error = new WalletNotInstalledError(walletType || selectedWallet);
798
+ logger.warn("Wallet not installed", { walletType: walletType || selectedWallet });
799
+ toast.error(ERROR_MESSAGES.WALLET_NOT_INSTALLED, {
800
+ description: `Please install the ${walletType || selectedWallet} extension`
801
+ });
802
+ return false;
803
+ }
804
+ setLoading(true);
805
+ try {
806
+ switch (walletType || selectedWallet) {
807
+ case "starkey": {
808
+ await provider.connect();
809
+ logger.info("Starkey wallet connection approved");
810
+ await updateAccounts();
811
+ const responseAcc = await provider.account();
812
+ if (responseAcc.length === 0) {
813
+ throw new WalletConnectionError(ERROR_MESSAGES.NO_ACCOUNT_FOUND);
814
+ }
815
+ if (responseAcc.length) {
816
+ setAccounts(responseAcc);
817
+ setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, "false");
818
+ setStorageItem(STORAGE_KEYS.STARKEY_ACCOUNTS, responseAcc[0]);
819
+ window.dispatchEvent(
820
+ new CustomEvent(WALLET_EVENTS.PRESIGNED_STATE, {
821
+ detail: {
822
+ timestamp: Date.now(),
823
+ account: responseAcc[0]
824
+ }
825
+ })
826
+ );
827
+ window.dispatchEvent(
828
+ new CustomEvent(WALLET_EVENTS.CONNECTED, {
829
+ detail: {
830
+ timestamp: Date.now(),
831
+ account: responseAcc[0],
832
+ wallet: "starkey"
833
+ }
834
+ })
835
+ );
836
+ try {
837
+ const message = "To verify your account, please sign this message.";
838
+ const nonce = generateNonce();
839
+ const hexMessage = "0x" + Buffer.from(message, "utf8").toString("hex");
840
+ logger.debug("Signature request initiated", { account: responseAcc[0] });
841
+ const signatureResponse = await provider.signMessage({
842
+ message: hexMessage,
843
+ nonce
844
+ });
845
+ if (signatureResponse) {
846
+ logger.info("Signature approved", { account: responseAcc[0] });
847
+ window.dispatchEvent(
848
+ new CustomEvent(WALLET_EVENTS.POSTSIGNED_STATE, {
849
+ detail: {
850
+ timestamp: Date.now(),
851
+ account: responseAcc[0]
852
+ }
853
+ })
854
+ );
855
+ }
856
+ } catch (signError) {
857
+ const error = new SignMessageError(ERROR_MESSAGES.SIGNING_FAILED, signError);
858
+ logger.error("Signing failed", error, { account: responseAcc[0] });
859
+ window.dispatchEvent(
860
+ new CustomEvent(WALLET_EVENTS.ERROR, {
861
+ detail: {
862
+ timestamp: Date.now(),
863
+ error
864
+ }
865
+ })
866
+ );
867
+ throw error;
868
+ }
869
+ }
870
+ break;
871
+ }
872
+ case "ribbit": {
873
+ const dappMetadata = {
874
+ name: "multiwallet",
875
+ description: "NFT Marketplace and Lootbox Platform",
876
+ logo: window.location.origin + "/favicon.ico",
877
+ url: window.location.origin
878
+ };
879
+ const response = await provider.connectToWallet(
880
+ dappMetadata
881
+ );
882
+ if (response == null ? void 0 : response.connected) {
883
+ logger.info("Ribbit wallet connection approved");
884
+ }
885
+ if (response.walletAddress == null) {
886
+ throw new WalletConnectionError(ERROR_MESSAGES.NO_ACCOUNT_FOUND);
887
+ }
888
+ if (response == null ? void 0 : response.connected) {
889
+ await updateAccounts();
890
+ if (response.walletAddress) {
891
+ setAccounts([response.walletAddress]);
892
+ setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, "false");
893
+ window.dispatchEvent(
894
+ new CustomEvent(WALLET_EVENTS.PRESIGNED_STATE, {
895
+ detail: {
896
+ timestamp: Date.now(),
897
+ account: response.walletAddress
898
+ }
899
+ })
900
+ );
901
+ window.dispatchEvent(
902
+ new CustomEvent(WALLET_EVENTS.CONNECTED, {
903
+ detail: {
904
+ timestamp: Date.now(),
905
+ account: response.walletAddress,
906
+ wallet: "ribbit"
907
+ }
908
+ })
909
+ );
910
+ try {
911
+ const message = "To verify your account, please sign this message.";
912
+ const nonce = generateNonce();
913
+ const hexMessage = "0x" + Buffer.from(message, "utf8").toString("hex");
914
+ logger.debug("Signature request initiated", { account: response.walletAddress });
915
+ const signatureResponse = await provider.signMessage({
916
+ message: hexMessage,
917
+ nonce: parseInt(nonce),
918
+ chainId: parseInt(getChainId())
919
+ });
920
+ if (signatureResponse && signatureResponse.approved) {
921
+ logger.info("Signature approved", { account: response.walletAddress });
922
+ window.dispatchEvent(
923
+ new CustomEvent(WALLET_EVENTS.POSTSIGNED_STATE, {
924
+ detail: {
925
+ timestamp: Date.now(),
926
+ account: response.walletAddress
927
+ }
928
+ })
929
+ );
930
+ } else {
931
+ throw new SignMessageError(signatureResponse.error || ERROR_MESSAGES.SIGNING_REJECTED);
932
+ }
933
+ } catch (signError) {
934
+ const error = new SignMessageError(ERROR_MESSAGES.SIGNING_FAILED, signError);
935
+ logger.error("Signing failed", error, { account: response.walletAddress });
936
+ window.dispatchEvent(
937
+ new CustomEvent(WALLET_EVENTS.ERROR, {
938
+ detail: {
939
+ timestamp: Date.now(),
940
+ error
941
+ }
942
+ })
943
+ );
944
+ throw error;
945
+ }
946
+ }
947
+ } else {
948
+ throw new WalletConnectionError(ERROR_MESSAGES.CONNECTION_REJECTED);
949
+ }
950
+ break;
951
+ }
952
+ default: {
953
+ throw new WalletConnectionError(
954
+ `${ERROR_MESSAGES.UNSUPPORTED_WALLET}: ${walletType || selectedWallet}`
955
+ );
956
+ }
957
+ }
958
+ return true;
959
+ } catch (error) {
960
+ const walletError = error instanceof WalletConnectionError ? error : new WalletConnectionError(ERROR_MESSAGES.CONNECTION_FAILED, error);
961
+ logger.error("Wallet connection failed", walletError, {
962
+ walletType: walletType || selectedWallet
963
+ });
964
+ window.dispatchEvent(
965
+ new CustomEvent(WALLET_EVENTS.ERROR, {
966
+ detail: {
967
+ timestamp: Date.now(),
968
+ error: walletError
969
+ }
970
+ })
971
+ );
972
+ return false;
973
+ } finally {
974
+ setLoading(false);
975
+ }
976
+ };
977
+ const disconnectWallet = async () => {
978
+ const provider = getCurrentProvider();
979
+ if (!provider) return;
980
+ try {
981
+ switch (selectedWallet) {
982
+ case "starkey": {
983
+ await provider.disconnect();
984
+ break;
985
+ }
986
+ case "ribbit": {
987
+ await provider.disconnect();
988
+ break;
989
+ }
990
+ }
991
+ resetWalletData();
992
+ clearStoredWalletType();
993
+ router.push("/");
994
+ } catch (error) {
995
+ logger.error("Wallet disconnect failed", error, { walletType: selectedWallet });
996
+ resetWalletData();
997
+ clearStoredWalletType();
998
+ }
999
+ };
1000
+ const resetWalletData = () => {
1001
+ setAccounts([]);
1002
+ setBalance("");
1003
+ setNetworkData({});
1004
+ switch (selectedWallet) {
1005
+ case "starkey": {
1006
+ setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, "false");
1007
+ removeStorageItem(STORAGE_KEYS.STARKEY_ACCOUNTS);
1008
+ break;
1009
+ }
1010
+ case "ribbit": {
1011
+ break;
1012
+ }
1013
+ }
1014
+ };
1015
+ const getSequenceNumber = async (address) => {
1016
+ const rpcUrl = getRpcUrl();
1017
+ const data = await fetch(`${rpcUrl}/rpc/v1/accounts/${address}`);
1018
+ if (!data.ok) {
1019
+ throw new NetworkError(`Failed to fetch sequence number for ${address}`);
1020
+ }
1021
+ const accountData = await data.json();
1022
+ return accountData.sequence_number;
1023
+ };
1024
+ const sendRawTransaction = async (moduleAddress, moduleName, functionName, params, runTimeParams = [], txExpiryTime = Math.ceil(Date.now() / 1e3) + 3e3) => {
1025
+ const provider = getCurrentProvider();
1026
+ if (!provider || !accounts.length || !moduleAddress || !moduleName || !functionName)
1027
+ return;
1028
+ try {
1029
+ switch (selectedWallet) {
1030
+ case "starkey": {
1031
+ if (!walletCapabilities.rawTransactions) {
1032
+ throw new TransactionError("Raw transactions not supported by current wallet");
1033
+ }
1034
+ let networkData2 = await getNetworkData();
1035
+ const currentChainId = getChainId();
1036
+ if (networkData2.chainId !== currentChainId) {
1037
+ setSelectedChainId(currentChainId);
1038
+ await provider.changeNetwork({
1039
+ chainId: currentChainId
1040
+ });
1041
+ }
1042
+ const rawTxPayload = [
1043
+ accounts[0],
1044
+ 0,
1045
+ // sequence number
1046
+ moduleAddress,
1047
+ moduleName,
1048
+ functionName,
1049
+ runTimeParams,
1050
+ params,
1051
+ {}
1052
+ ];
1053
+ const data = await provider.createRawTransactionData(rawTxPayload);
1054
+ const txHash = await provider.sendTransaction({
1055
+ data,
1056
+ from: accounts[0],
1057
+ to: moduleAddress,
1058
+ chainId: currentChainId,
1059
+ value: ""
1060
+ });
1061
+ addTransactions(txHash || "failed");
1062
+ logger.info("Transaction sent successfully", { txHash, walletType: "starkey" });
1063
+ return txHash;
1064
+ }
1065
+ case "ribbit": {
1066
+ if (!walletCapabilities.rawTransactions) {
1067
+ throw new TransactionError("Raw transactions not supported by current wallet");
1068
+ }
1069
+ const currentChainId = getChainId();
1070
+ let chainId = SupraChainId.TESTNET;
1071
+ if (currentChainId === DEFAULT_CHAIN_IDS.TESTNET) {
1072
+ chainId = SupraChainId.TESTNET;
1073
+ } else if (currentChainId === DEFAULT_CHAIN_IDS.MAINNET) {
1074
+ chainId = SupraChainId.MAINNET;
1075
+ }
1076
+ const rawTxnRequest = {
1077
+ sender: accounts[0],
1078
+ // Use actual sender address
1079
+ moduleAddress,
1080
+ // Use provided module address
1081
+ moduleName,
1082
+ // Use provided module name
1083
+ functionName,
1084
+ // Use provided function name
1085
+ typeArgs: runTimeParams,
1086
+ // Use converted runtime parameters
1087
+ args: params || [],
1088
+ // Use provided parameters
1089
+ chainId
1090
+ };
1091
+ const rawTxnBase64 = await provider.createRawTransactionBuffer(rawTxnRequest);
1092
+ const response = await provider.signAndSendRawTransaction({
1093
+ rawTxn: rawTxnBase64,
1094
+ chainId,
1095
+ meta: {
1096
+ description: `Call ${moduleName}::${functionName}`
1097
+ // Dynamic description
1098
+ }
1099
+ });
1100
+ if (response.approved) {
1101
+ const txHash = response.txHash || response.result || "success";
1102
+ addTransactions(txHash);
1103
+ logger.info("Transaction sent successfully", { txHash, walletType: "ribbit" });
1104
+ return txHash;
1105
+ } else {
1106
+ throw new TransactionError(response.error || ERROR_MESSAGES.TRANSACTION_REJECTED);
1107
+ }
1108
+ }
1109
+ default: {
1110
+ throw new TransactionError(
1111
+ `Raw transactions not supported for wallet: ${selectedWallet}`
1112
+ );
1113
+ }
1114
+ }
1115
+ } catch (error) {
1116
+ const txError = error instanceof TransactionError ? error : new TransactionError(ERROR_MESSAGES.TRANSACTION_FAILED, void 0, error);
1117
+ logger.error("Transaction failed", txError, {
1118
+ walletType: selectedWallet,
1119
+ moduleAddress,
1120
+ moduleName,
1121
+ functionName
1122
+ });
1123
+ throw txError;
1124
+ }
1125
+ };
1126
+ const signMessage = async (message, nonce, account, forceSign = false) => {
1127
+ const provider = getCurrentProvider();
1128
+ if (!provider) return;
1129
+ const secureNonce = nonce || generateNonce();
1130
+ switch (selectedWallet) {
1131
+ case "starkey": {
1132
+ if (!walletCapabilities.signMessage) {
1133
+ throw new SignMessageError("Message signing not supported by current wallet");
1134
+ }
1135
+ if (!accounts.length && !account) return;
1136
+ if (!accounts.length && account) {
1137
+ accounts[0] = account;
1138
+ }
1139
+ if (getStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET) === "true" && !forceSign) {
1140
+ return;
1141
+ }
1142
+ setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, "true");
1143
+ try {
1144
+ const hexMessage = "0x" + Buffer.from(message, "utf8").toString("hex");
1145
+ const response = await provider.signMessage({
1146
+ message: hexMessage,
1147
+ nonce: secureNonce
1148
+ });
1149
+ const { publicKey, signature } = response;
1150
+ const verified = nacl.sign.detached.verify(
1151
+ new TextEncoder().encode(message),
1152
+ Uint8Array.from(Buffer.from(signature.slice(2), "hex")),
1153
+ Uint8Array.from(Buffer.from(publicKey.slice(2), "hex"))
1154
+ );
1155
+ setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, "false");
1156
+ logger.info("Message signed successfully", { walletType: "starkey" });
1157
+ return __spreadProps(__spreadValues({}, response), { verified });
1158
+ } catch (error) {
1159
+ setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, "false");
1160
+ throw new SignMessageError(ERROR_MESSAGES.SIGNING_FAILED, error);
1161
+ }
1162
+ }
1163
+ case "ribbit": {
1164
+ if (!walletCapabilities.signMessage) {
1165
+ throw new SignMessageError("Message signing not supported by current wallet");
1166
+ }
1167
+ if (!accounts.length && !account) return;
1168
+ if (!accounts.length && account) {
1169
+ accounts[0] = account;
1170
+ }
1171
+ if (getStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET) === "true" && !forceSign) {
1172
+ return;
1173
+ }
1174
+ setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, "true");
1175
+ try {
1176
+ const hexMessage = "0x" + Buffer.from(message, "utf8").toString("hex");
1177
+ const response = await provider.signMessage({
1178
+ message: hexMessage,
1179
+ nonce: parseInt(secureNonce),
1180
+ chainId: parseInt(getChainId())
1181
+ });
1182
+ if (response.approved && response.publicKey && response.signature) {
1183
+ const { publicKey, signature } = response;
1184
+ const verified = nacl.sign.detached.verify(
1185
+ new TextEncoder().encode(message),
1186
+ Uint8Array.from(Buffer.from(signature.slice(2), "hex")),
1187
+ Uint8Array.from(Buffer.from(publicKey.slice(2), "hex"))
1188
+ );
1189
+ setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, "false");
1190
+ logger.info("Message signed successfully", { walletType: "ribbit" });
1191
+ return __spreadProps(__spreadValues({}, response), { verified });
1192
+ } else {
1193
+ setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, "false");
1194
+ throw new SignMessageError(response.error || ERROR_MESSAGES.SIGNING_REJECTED);
1195
+ }
1196
+ } catch (error) {
1197
+ setStorageItem(STORAGE_KEYS.IS_SIGNING_WALLET, "false");
1198
+ throw new SignMessageError(ERROR_MESSAGES.SIGNING_FAILED, error);
1199
+ }
1200
+ }
1201
+ default: {
1202
+ throw new SignMessageError(
1203
+ `Message signing not supported for wallet: ${selectedWallet}`
1204
+ );
1205
+ }
1206
+ }
1207
+ };
1208
+ useEffect(() => {
1209
+ if (selectedWallet === "starkey" && walletCapabilities.eventListeners) {
1210
+ const handleExtensionEvents = (event) => {
1211
+ var _a, _b, _c;
1212
+ if ((_b = (_a = event == null ? void 0 : event.data) == null ? void 0 : _a.name) == null ? void 0 : _b.startsWith("starkey-")) {
1213
+ switch ((_c = event == null ? void 0 : event.data) == null ? void 0 : _c.name) {
1214
+ case "starkey-extension-installed": {
1215
+ checkIsExtensionInstalled();
1216
+ break;
1217
+ }
1218
+ case "starkey-wallet-updated": {
1219
+ (async () => {
1220
+ const responseAcc = await supraProvider.account();
1221
+ if (responseAcc.length) {
1222
+ setAccounts(responseAcc);
1223
+ window.dispatchEvent(
1224
+ new CustomEvent(WALLET_EVENTS.CONNECTED, {
1225
+ detail: {
1226
+ timestamp: Date.now(),
1227
+ account: responseAcc[0]
1228
+ }
1229
+ })
1230
+ );
1231
+ await updateBalance();
1232
+ await getNetworkData();
1233
+ } else {
1234
+ logger.debug("Starkey wallet updated: No accounts found - Resetting");
1235
+ resetWalletData();
1236
+ }
1237
+ setLoading(false);
1238
+ })();
1239
+ break;
1240
+ }
1241
+ case "starkey-wallet-disconnected": {
1242
+ resetWalletData();
1243
+ router.push("/");
1244
+ setLoading(false);
1245
+ break;
1246
+ }
1247
+ case "starkey-window-removed": {
1248
+ setLoading(false);
1249
+ break;
1250
+ }
1251
+ }
1252
+ }
1253
+ };
1254
+ checkIsExtensionInstalled();
1255
+ window.addEventListener("message", handleExtensionEvents);
1256
+ return () => window.removeEventListener("message", handleExtensionEvents);
1257
+ }
1258
+ }, [selectedWallet, walletCapabilities, supraProvider]);
1259
+ const getAvailableWallets = useCallback(() => {
1260
+ const allWallets = [];
1261
+ Object.entries(WALLET_CONFIGS).forEach(([walletType, config2]) => {
1262
+ if (enabledWallets && !enabledWallets.includes(walletType)) {
1263
+ return;
1264
+ }
1265
+ const provider = config2.provider();
1266
+ const isInstalled = !!provider;
1267
+ switch (walletType) {
1268
+ case "starkey": {
1269
+ allWallets.push({
1270
+ type: "starkey",
1271
+ name: "Starkey Wallet",
1272
+ isInstalled,
1273
+ capabilities: config2.capabilities
1274
+ });
1275
+ break;
1276
+ }
1277
+ case "ribbit": {
1278
+ allWallets.push({
1279
+ type: "ribbit",
1280
+ name: "Ribbit Wallet",
1281
+ isInstalled,
1282
+ capabilities: config2.capabilities
1283
+ });
1284
+ break;
1285
+ }
1286
+ }
1287
+ });
1288
+ return allWallets;
1289
+ }, [enabledWallets]);
1290
+ const updateSelectedWallet = (walletType) => {
1291
+ setSelectedWallet(walletType);
1292
+ setWalletCapabilities(WALLET_CONFIGS[walletType].capabilities);
1293
+ setStoredWalletType(walletType);
1294
+ };
1295
+ return {
1296
+ // New wallet selection functionality
1297
+ selectedWallet,
1298
+ walletCapabilities,
1299
+ getAvailableWallets,
1300
+ // Add this new function
1301
+ // Existing interface (unchanged)
1302
+ getCurrentProvider,
1303
+ isExtensionInstalled,
1304
+ accounts,
1305
+ networkData,
1306
+ balance,
1307
+ transactions,
1308
+ selectedChainId,
1309
+ connectWallet,
1310
+ // Now accepts optional walletType parameter
1311
+ disconnectWallet,
1312
+ sendRawTransaction,
1313
+ signMessage,
1314
+ setSelectedChainId,
1315
+ // switchToChain,
1316
+ loading
1317
+ // authFetch,
1318
+ // checkAndRevalidateToken,
1319
+ // signIn,
1320
+ };
1321
+ };
1322
+ var useSupraMultiWallet_default = useSupraMultiWallet;
1323
+
1324
+ // components/ConnectWalletHandler.tsx
1325
+ import { Fragment, jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
1326
+ var starkeyIcon = "/walletIcons/Starkey.png";
1327
+ var ribbitIcon = "/walletIcons/Ribbit.jpg";
1328
+ var PROFILE_CACHE_KEY = STORAGE_KEYS.USER_PROFILE_CACHE;
1329
+ var PROFILE_CACHE_TIMESTAMP_KEY = STORAGE_KEYS.USER_PROFILE_CACHE_TIMESTAMP;
1330
+ var WALLET_INFO = {
1331
+ starkey: {
1332
+ name: "Starkey Wallet",
1333
+ icon: /* @__PURE__ */ jsx3(
1334
+ "img",
1335
+ {
1336
+ src: starkeyIcon,
1337
+ alt: "Starkey Wallet",
1338
+ className: "w-10 h-10 rounded-full"
1339
+ }
1340
+ ),
1341
+ downloadUrl: WALLET_DOWNLOAD_URLS.starkey
1342
+ },
1343
+ ribbit: {
1344
+ name: "Ribbit Wallet",
1345
+ icon: /* @__PURE__ */ jsx3(
1346
+ "img",
1347
+ {
1348
+ src: ribbitIcon,
1349
+ alt: "Ribbit Wallet",
1350
+ className: "w-10 h-10 rounded-full"
1351
+ }
1352
+ ),
1353
+ downloadUrl: WALLET_DOWNLOAD_URLS.ribbit
1354
+ }
1355
+ };
1356
+ var ConnectWalletHandler = ({
1357
+ onConnect,
1358
+ onDisconnect,
1359
+ enabledWallets,
1360
+ // Destructure the new prop
1361
+ children
1362
+ }) => {
1363
+ const starKeyWalletHook = useSupraMultiWallet_default(enabledWallets);
1364
+ const getAvailableWallets = starKeyWalletHook.getAvailableWallets;
1365
+ const [loading, setLoading] = useState2(false);
1366
+ const [showWalletModal, setShowWalletModal] = useState2(false);
1367
+ const [userProfile, setUserProfile] = useState2(null);
1368
+ const [walletBalance, setWalletBalance] = useState2("0.00");
1369
+ const [availableWallets, setAvailableWallets] = useState2([]);
1370
+ const [recentWallet, setRecentWallet] = useState2(null);
1371
+ const [selectedWallet, setSelectedWallet] = useState2(null);
1372
+ const [hoveredWallet, setHoveredWallet] = useState2(null);
1373
+ const [connectionStage, setConnectionStage] = useState2("idle");
1374
+ const [connectionStageStartTime, setConnectionStageStartTime] = useState2(null);
1375
+ const [canClickOutside, setCanClickOutside] = useState2(false);
1376
+ const getProfileFromCache = useCallback2(() => {
1377
+ try {
1378
+ if (typeof window === "undefined") return null;
1379
+ const cachedData = getStorageItem(PROFILE_CACHE_KEY);
1380
+ const timestamp = getStorageItem(PROFILE_CACHE_TIMESTAMP_KEY);
1381
+ if (!cachedData || !timestamp) return null;
1382
+ const now = Date.now();
1383
+ const cacheTime = parseInt(timestamp);
1384
+ if (now - cacheTime > CACHE_TTL.PROFILE) {
1385
+ return null;
1386
+ }
1387
+ return JSON.parse(cachedData);
1388
+ } catch (error) {
1389
+ logger.error("Failed to read profile from cache", error);
1390
+ return null;
1391
+ }
1392
+ }, []);
1393
+ const updateWalletBalance = useCallback2(async () => {
1394
+ const provider = starKeyWalletHook.getCurrentProvider();
1395
+ if (!provider) return;
1396
+ try {
1397
+ await new Promise((resolve) => setTimeout(resolve, 1));
1398
+ switch (starKeyWalletHook.selectedWallet) {
1399
+ case "starkey": {
1400
+ const balance = await provider.balance();
1401
+ if (balance && balance.formattedBalance) {
1402
+ setWalletBalance(balance.formattedBalance);
1403
+ }
1404
+ break;
1405
+ }
1406
+ case "ribbit": {
1407
+ const walletBalanceRequest = {
1408
+ chainId: parseInt(process.env.NEXT_PUBLIC_SUPRA_CHAIN_ID || "6"),
1409
+ resourceType: "0x1::supra_coin::SupraCoin",
1410
+ decimals: 8
1411
+ };
1412
+ try {
1413
+ const balance = await provider.getWalletBalance(walletBalanceRequest);
1414
+ const balanceStr = balance.balance;
1415
+ logger.debug("Ribbit balance fetched", { balance: balanceStr });
1416
+ if (balanceStr) {
1417
+ setWalletBalance(balanceStr);
1418
+ }
1419
+ } catch (error) {
1420
+ logger.error("Failed to fetch Ribbit balance", error);
1421
+ }
1422
+ break;
1423
+ }
1424
+ }
1425
+ } catch (error) {
1426
+ logger.error("Failed to update wallet balance", error);
1427
+ }
1428
+ }, [starKeyWalletHook.selectedWallet, starKeyWalletHook.getCurrentProvider]);
1429
+ const connectWallet = useCallback2(async (walletType) => {
1430
+ if (walletType) {
1431
+ setLoading(true);
1432
+ setSelectedWallet(walletType);
1433
+ setConnectionStage("connecting");
1434
+ try {
1435
+ const success = await starKeyWalletHook.connectWallet(walletType);
1436
+ if (success) {
1437
+ setStorageItem(STORAGE_KEYS.RECENT_WALLET, walletType);
1438
+ setRecentWallet(walletType);
1439
+ if (starKeyWalletHook.accounts.length > 0) {
1440
+ onConnect == null ? void 0 : onConnect(starKeyWalletHook.accounts[0]);
1441
+ }
1442
+ }
1443
+ } catch (error) {
1444
+ logger.error("Failed to connect wallet", error, { walletType });
1445
+ toast2.error(`Connection failed: ${error.message || "Unknown error"}`);
1446
+ setConnectionStage("idle");
1447
+ } finally {
1448
+ setLoading(false);
1449
+ }
1450
+ } else {
1451
+ handleConnectClick();
1452
+ }
1453
+ }, [starKeyWalletHook, onConnect]);
1454
+ const handleConnectClick = () => {
1455
+ const installedWallets = availableWallets.filter((w) => w.isInstalled);
1456
+ if (installedWallets.length === 0) {
1457
+ setShowWalletModal(true);
1458
+ } else if (installedWallets.length === 1) {
1459
+ setShowWalletModal(true);
1460
+ } else {
1461
+ setShowWalletModal(true);
1462
+ }
1463
+ };
1464
+ const handleDisconnectWallet = useCallback2(async () => {
1465
+ setLoading(true);
1466
+ try {
1467
+ await starKeyWalletHook.disconnectWallet();
1468
+ setUserProfile(null);
1469
+ setWalletBalance("0.00");
1470
+ onDisconnect == null ? void 0 : onDisconnect();
1471
+ } catch (error) {
1472
+ logger.error("Failed to disconnect wallet", error);
1473
+ } finally {
1474
+ setLoading(false);
1475
+ }
1476
+ }, [starKeyWalletHook, onDisconnect]);
1477
+ const getConnectionStageInfo = useCallback2(() => {
1478
+ const wallet = selectedWallet ? WALLET_INFO[selectedWallet] : null;
1479
+ switch (connectionStage) {
1480
+ case "connecting":
1481
+ return {
1482
+ title: `Waiting for ${(wallet == null ? void 0 : wallet.name) || "Wallet"}`,
1483
+ subtitle: CONNECTION_MESSAGES.CONNECTING,
1484
+ buttonText: "Connecting"
1485
+ };
1486
+ case "signing":
1487
+ return {
1488
+ title: "Sign to verify",
1489
+ subtitle: CONNECTION_MESSAGES.SIGNING,
1490
+ buttonText: "Signing"
1491
+ };
1492
+ case "success":
1493
+ return {
1494
+ title: `Connected to ${(wallet == null ? void 0 : wallet.name.replace(" Wallet", "")) || "Wallet"}`,
1495
+ subtitle: CONNECTION_MESSAGES.SUCCESS,
1496
+ buttonText: "Connected"
1497
+ };
1498
+ case "error":
1499
+ return {
1500
+ title: "Error",
1501
+ subtitle: CONNECTION_MESSAGES.ERROR,
1502
+ buttonText: "Close"
1503
+ };
1504
+ case "connected-not-signed":
1505
+ return {
1506
+ title: `Connected to ${(wallet == null ? void 0 : wallet.name.replace(" Wallet", "")) || "Wallet"}`,
1507
+ subtitle: CONNECTION_MESSAGES.CONNECTED_NOT_SIGNED,
1508
+ buttonText: "Connected"
1509
+ };
1510
+ default:
1511
+ return null;
1512
+ }
1513
+ }, [connectionStage, selectedWallet]);
1514
+ useEffect2(() => {
1515
+ const recent = getStorageItem(STORAGE_KEYS.RECENT_WALLET);
1516
+ if (recent && ["starkey", "ribbit"].includes(recent)) {
1517
+ setRecentWallet(recent);
1518
+ }
1519
+ }, []);
1520
+ useEffect2(() => {
1521
+ const checkWallets = () => {
1522
+ const wallets = getAvailableWallets();
1523
+ setAvailableWallets(wallets);
1524
+ };
1525
+ checkWallets();
1526
+ const interval = setInterval(checkWallets, TIMEOUTS.WALLET_CHECK_INTERVAL);
1527
+ const timeout = setTimeout(() => clearInterval(interval), TIMEOUTS.WALLET_CHECK_MAX_DURATION);
1528
+ return () => {
1529
+ clearInterval(interval);
1530
+ clearTimeout(timeout);
1531
+ };
1532
+ }, [getAvailableWallets]);
1533
+ useEffect2(() => {
1534
+ if (starKeyWalletHook.accounts.length > 0) {
1535
+ updateWalletBalance();
1536
+ }
1537
+ }, [starKeyWalletHook.accounts, starKeyWalletHook.selectedWallet]);
1538
+ useEffect2(() => {
1539
+ const handlePresignedState = () => {
1540
+ setConnectionStage(() => "signing");
1541
+ };
1542
+ const handlePostsignedState = () => {
1543
+ setConnectionStage("success");
1544
+ setTimeout(() => {
1545
+ setConnectionStage("idle");
1546
+ setShowWalletModal(false);
1547
+ updateWalletBalance();
1548
+ }, TIMEOUTS.MODAL_CLOSE_DELAY);
1549
+ };
1550
+ const handleWalletError = () => {
1551
+ if (connectionStage == "signing") {
1552
+ setConnectionStage(() => "connected-not-signed");
1553
+ } else {
1554
+ setConnectionStage(() => "error");
1555
+ }
1556
+ setTimeout(() => {
1557
+ setShowWalletModal(false);
1558
+ setSelectedWallet(null);
1559
+ setConnectionStage("idle");
1560
+ setLoading(false);
1561
+ }, TIMEOUTS.MODAL_CLOSE_DELAY);
1562
+ };
1563
+ const handleStarkeyEvents = (event) => {
1564
+ var _a, _b, _c;
1565
+ if ((_b = (_a = event == null ? void 0 : event.data) == null ? void 0 : _a.name) == null ? void 0 : _b.startsWith("starkey-")) {
1566
+ switch ((_c = event == null ? void 0 : event.data) == null ? void 0 : _c.name) {
1567
+ case "starkey-wallet-updated":
1568
+ case "starkey-wallet-connected":
1569
+ setTimeout(updateWalletBalance, 1);
1570
+ break;
1571
+ case "starkey-wallet-disconnected":
1572
+ setWalletBalance("0.00");
1573
+ break;
1574
+ }
1575
+ }
1576
+ };
1577
+ window.addEventListener("presigned-state", handlePresignedState);
1578
+ window.addEventListener("postsigned-state", handlePostsignedState);
1579
+ window.addEventListener("wallet-error", handleWalletError);
1580
+ window.addEventListener("message", handleStarkeyEvents);
1581
+ return () => {
1582
+ window.removeEventListener("presigned-state", handlePresignedState);
1583
+ window.removeEventListener("postsigned-state", handlePostsignedState);
1584
+ window.removeEventListener("wallet-error", handleWalletError);
1585
+ window.removeEventListener("message", handleStarkeyEvents);
1586
+ };
1587
+ }, [connectionStage]);
1588
+ useEffect2(() => {
1589
+ const handleProfileUpdated = (event) => {
1590
+ const { address, username, profileImage } = event.detail;
1591
+ if (starKeyWalletHook.accounts[0] === address) {
1592
+ setUserProfile({ address, username, profileImage });
1593
+ }
1594
+ };
1595
+ window.addEventListener("profile-updated", handleProfileUpdated);
1596
+ return () => {
1597
+ window.removeEventListener("profile-updated", handleProfileUpdated);
1598
+ };
1599
+ }, [starKeyWalletHook.accounts]);
1600
+ useEffect2(() => {
1601
+ if (starKeyWalletHook.accounts.length > 0) {
1602
+ const handleVisibilityChange = () => {
1603
+ if (!document.hidden) {
1604
+ updateWalletBalance();
1605
+ }
1606
+ };
1607
+ document.addEventListener("visibilitychange", handleVisibilityChange);
1608
+ const balanceInterval = setInterval(() => {
1609
+ if (!document.hidden) {
1610
+ updateWalletBalance();
1611
+ }
1612
+ }, TIMEOUTS.BALANCE_POLL_INTERVAL);
1613
+ return () => {
1614
+ clearInterval(balanceInterval);
1615
+ document.removeEventListener("visibilitychange", handleVisibilityChange);
1616
+ };
1617
+ }
1618
+ }, [starKeyWalletHook.accounts, updateWalletBalance]);
1619
+ useEffect2(() => {
1620
+ if (connectionStage === "connecting" || connectionStage === "signing") {
1621
+ setConnectionStageStartTime(Date.now());
1622
+ setCanClickOutside(false);
1623
+ const timer = setTimeout(() => {
1624
+ setCanClickOutside(true);
1625
+ }, TIMEOUTS.CLICK_OUTSIDE_DELAY);
1626
+ return () => clearTimeout(timer);
1627
+ } else {
1628
+ setConnectionStageStartTime(null);
1629
+ setCanClickOutside(false);
1630
+ }
1631
+ }, [connectionStage]);
1632
+ const handleModalClose = useCallback2((open) => {
1633
+ if (!open) {
1634
+ if (connectionStage === "idle" || connectionStage === "success" || connectionStage === "connected-not-signed" || connectionStage === "error" || canClickOutside && (connectionStage === "connecting" || connectionStage === "signing")) {
1635
+ setShowWalletModal(false);
1636
+ setSelectedWallet(null);
1637
+ setLoading(false);
1638
+ setCanClickOutside(false);
1639
+ setConnectionStageStartTime(null);
1640
+ setTimeout(() => {
1641
+ setConnectionStage("idle");
1642
+ }, 100);
1643
+ }
1644
+ }
1645
+ }, [connectionStage, canClickOutside]);
1646
+ return /* @__PURE__ */ jsxs2(Fragment, { children: [
1647
+ children({
1648
+ isConnected: starKeyWalletHook.accounts.length > 0,
1649
+ accounts: starKeyWalletHook.accounts,
1650
+ loading: loading || starKeyWalletHook.loading,
1651
+ balance: walletBalance,
1652
+ userProfile,
1653
+ handleConnect: handleConnectClick,
1654
+ handleDisconnect: handleDisconnectWallet
1655
+ }),
1656
+ /* @__PURE__ */ jsxs2(
1657
+ Dialog,
1658
+ {
1659
+ open: showWalletModal,
1660
+ onOpenChange: handleModalClose,
1661
+ children: [
1662
+ /* @__PURE__ */ jsx3(VisuallyHidden, { asChild: true, children: /* @__PURE__ */ jsx3(DialogTitle, { children: "Select a wallet" }) }),
1663
+ /* @__PURE__ */ jsx3(VisuallyHidden, { asChild: true, children: /* @__PURE__ */ jsx3(DialogDescription, { children: "Select a wallet to connect to MyDApp" }) }),
1664
+ /* @__PURE__ */ jsxs2(
1665
+ DialogContent,
1666
+ {
1667
+ className: "z-[100] px-4 py-6 w-[90%] mx-auto max-w-sm bg-gradient-to-br from-brand-dark via-gray-900 to-brand-dark border border-brand-dark sm:rounded-3xl rounded-3xl",
1668
+ children: [
1669
+ canClickOutside && (connectionStage === "connecting" || connectionStage === "signing") && /* @__PURE__ */ jsx3("div", { className: "absolute top-4 right-4", children: /* @__PURE__ */ jsx3(X2, { className: "h-5 w-5" }) }),
1670
+ /* @__PURE__ */ jsx3("div", { className: "", children: connectionStage === "idle" ? /* @__PURE__ */ jsxs2(Fragment, { children: [
1671
+ /* @__PURE__ */ jsx3("p", { className: "text-center text-sm text-brand-light/75 mb-6 text-white", children: "Select Wallet" }),
1672
+ /* @__PURE__ */ jsx3("div", { className: "space-y-3", children: availableWallets.map((wallet) => {
1673
+ return /* @__PURE__ */ jsx3("div", { className: "w-full relative", children: /* @__PURE__ */ jsxs2(
1674
+ motion.button,
1675
+ {
1676
+ initial: { opacity: 0, y: 20 },
1677
+ animate: { opacity: 1, y: 0 },
1678
+ transition: { duration: 0.05, ease: "easeInOut" },
1679
+ onClick: () => {
1680
+ wallet.isInstalled ? connectWallet(wallet.type) : window.open(WALLET_INFO[wallet.type].downloadUrl, "_blank");
1681
+ },
1682
+ type: "button",
1683
+ disabled: loading && wallet.isInstalled,
1684
+ onMouseEnter: () => setHoveredWallet(wallet.type),
1685
+ onMouseLeave: () => setHoveredWallet(null),
1686
+ className: "w-full px-4 py-2 rounded-2xl border border-gray-950/60 hover:border-gray-800/80 bg-gray-950/20 hover:bg-gray-900/40 transition-all duration-300 flex items-center gap-4 group",
1687
+ children: [
1688
+ /* @__PURE__ */ jsx3("div", { className: "flex-shrink-0", children: WALLET_INFO[wallet.type].icon }),
1689
+ /* @__PURE__ */ jsxs2("div", { className: "flex-1 text-left", children: [
1690
+ /* @__PURE__ */ jsx3("h3", { className: "font-medium text-white", children: WALLET_INFO[wallet.type].name }),
1691
+ !wallet.isInstalled && /* @__PURE__ */ jsx3("p", { className: "text-sm text-gray-400", children: "Not installed - Click to download" })
1692
+ ] }),
1693
+ /* @__PURE__ */ jsx3("div", { className: "flex-shrink-0", children: recentWallet === wallet.type && wallet.isInstalled ? /* @__PURE__ */ jsx3("span", { className: "bg-gray-800/60 text-gray-300 text-xs px-3 py-1 rounded-full border border-gray-700/40", children: "Recent" }) : wallet.isInstalled ? loading && wallet.type === selectedWallet ? /* @__PURE__ */ jsx3(Loader2, { className: "h-4 w-4 animate-spin text-gray-400" }) : hoveredWallet === wallet.type && /* @__PURE__ */ jsx3("span", { className: "text-gray-400 text-sm font-medium", children: "Connect" }) : /* @__PURE__ */ jsx3(ExternalLink, { className: "h-4 w-4 text-gray-500" }) })
1694
+ ]
1695
+ }
1696
+ ) }, wallet.type);
1697
+ }) })
1698
+ ] }) : /* @__PURE__ */ jsx3("div", { className: "w-full text-center py-8", children: (() => {
1699
+ const stageInfo = getConnectionStageInfo();
1700
+ const wallet = selectedWallet ? WALLET_INFO[selectedWallet] : null;
1701
+ return /* @__PURE__ */ jsxs2(Fragment, { children: [
1702
+ /* @__PURE__ */ jsx3("div", { className: "relative flex justify-center mb-6", children: connectionStage === "success" || connectionStage === "connected-not-signed" ? /* @__PURE__ */ jsx3("div", { className: "w-20 h-20 rounded-full border-4 border-green-500 flex items-center justify-center", children: wallet && /* @__PURE__ */ jsx3("div", { className: "w-12 h-12 flex items-center justify-center", children: wallet.icon }) }) : connectionStage === "error" ? /* @__PURE__ */ jsx3("div", { className: "w-20 h-20 rounded-full border-4 border-red-500 flex items-center justify-center", children: wallet && /* @__PURE__ */ jsx3("div", { className: "w-12 h-12 flex items-center justify-center", children: wallet.icon }) }) : /* @__PURE__ */ jsxs2("div", { className: "relative", children: [
1703
+ /* @__PURE__ */ jsx3("div", { className: "w-20 h-20 rounded-full border-4 border-gray-600 border-t-gray-400 animate-spin" }),
1704
+ /* @__PURE__ */ jsx3("div", { className: "absolute inset-0 flex items-center justify-center", children: wallet && /* @__PURE__ */ jsx3("div", { className: "w-12 h-12 flex items-center justify-center", children: wallet.icon }) })
1705
+ ] }) }),
1706
+ /* @__PURE__ */ jsx3("h3", { className: "text-lg font-semibold text-white mb-2", children: stageInfo == null ? void 0 : stageInfo.title }),
1707
+ /* @__PURE__ */ jsx3("p", { className: "text-sm text-gray-400 mb-6", children: stageInfo == null ? void 0 : stageInfo.subtitle }),
1708
+ /* @__PURE__ */ jsx3(
1709
+ Button,
1710
+ {
1711
+ disabled: true,
1712
+ className: "w-full bg-gray-700 text-gray-400 cursor-not-allowed rounded-2xl py-3",
1713
+ children: stageInfo == null ? void 0 : stageInfo.buttonText
1714
+ }
1715
+ )
1716
+ ] });
1717
+ })() }) })
1718
+ ]
1719
+ }
1720
+ )
1721
+ ]
1722
+ }
1723
+ )
1724
+ ] });
1725
+ };
1726
+
1727
+ // src/hooks/useConversionUtils.ts
1728
+ import { useCallback as useCallback3 } from "react";
1729
+ import { BCS as BCS2, TxnBuilderTypes } from "supra-l1-sdk-core";
1730
+
1731
+ // src/lib/abis/supra_account.ts
1732
+ var supraAccountABI = {
1733
+ address: "0x1",
1734
+ name: "supra_account",
1735
+ friends: [
1736
+ "0x1::genesis",
1737
+ "0x1::resource_account",
1738
+ "0x1::transaction_fee",
1739
+ "0x1::transaction_validation"
1740
+ ],
1741
+ exposed_functions: [
1742
+ {
1743
+ name: "assert_account_exists",
1744
+ visibility: "public",
1745
+ is_entry: false,
1746
+ is_view: false,
1747
+ generic_type_params: [],
1748
+ params: ["address"],
1749
+ return: []
1750
+ },
1751
+ {
1752
+ name: "assert_account_is_registered_for_apt",
1753
+ visibility: "public",
1754
+ is_entry: false,
1755
+ is_view: false,
1756
+ generic_type_params: [],
1757
+ params: ["address"],
1758
+ return: []
1759
+ },
1760
+ {
1761
+ name: "assert_account_is_registered_for_supra",
1762
+ visibility: "public",
1763
+ is_entry: false,
1764
+ is_view: false,
1765
+ generic_type_params: [],
1766
+ params: ["address"],
1767
+ return: []
1768
+ },
1769
+ {
1770
+ name: "batch_transfer",
1771
+ visibility: "public",
1772
+ is_entry: true,
1773
+ is_view: false,
1774
+ generic_type_params: [],
1775
+ params: ["&signer", "vector<address>", "vector<u64>"],
1776
+ return: []
1777
+ },
1778
+ {
1779
+ name: "batch_transfer_coins",
1780
+ visibility: "public",
1781
+ is_entry: true,
1782
+ is_view: false,
1783
+ generic_type_params: [{ constraints: [] }],
1784
+ params: ["&signer", "vector<address>", "vector<u64>"],
1785
+ return: []
1786
+ },
1787
+ {
1788
+ name: "burn_from_fungible_store",
1789
+ visibility: "friend",
1790
+ is_entry: false,
1791
+ is_view: false,
1792
+ generic_type_params: [],
1793
+ params: ["&0x1::fungible_asset::BurnRef", "address", "u64"],
1794
+ return: []
1795
+ },
1796
+ {
1797
+ name: "can_receive_direct_coin_transfers",
1798
+ visibility: "public",
1799
+ is_entry: false,
1800
+ is_view: true,
1801
+ generic_type_params: [],
1802
+ params: ["address"],
1803
+ return: ["bool"]
1804
+ },
1805
+ {
1806
+ name: "create_account",
1807
+ visibility: "public",
1808
+ is_entry: true,
1809
+ is_view: false,
1810
+ generic_type_params: [],
1811
+ params: ["address"],
1812
+ return: []
1813
+ },
1814
+ {
1815
+ name: "deposit_coins",
1816
+ visibility: "public",
1817
+ is_entry: false,
1818
+ is_view: false,
1819
+ generic_type_params: [{ constraints: [] }],
1820
+ params: ["address", "0x1::coin::Coin<T0>"],
1821
+ return: []
1822
+ },
1823
+ {
1824
+ name: "is_fungible_balance_at_least",
1825
+ visibility: "friend",
1826
+ is_entry: false,
1827
+ is_view: false,
1828
+ generic_type_params: [],
1829
+ params: ["address", "u64"],
1830
+ return: ["bool"]
1831
+ },
1832
+ {
1833
+ name: "register_supra",
1834
+ visibility: "friend",
1835
+ is_entry: false,
1836
+ is_view: false,
1837
+ generic_type_params: [],
1838
+ params: ["&signer"],
1839
+ return: []
1840
+ },
1841
+ {
1842
+ name: "set_allow_direct_coin_transfers",
1843
+ visibility: "public",
1844
+ is_entry: true,
1845
+ is_view: false,
1846
+ generic_type_params: [],
1847
+ params: ["&signer", "bool"],
1848
+ return: []
1849
+ },
1850
+ {
1851
+ name: "transfer",
1852
+ visibility: "public",
1853
+ is_entry: true,
1854
+ is_view: false,
1855
+ generic_type_params: [],
1856
+ params: ["&signer", "address", "u64"],
1857
+ return: []
1858
+ },
1859
+ {
1860
+ name: "transfer_coins",
1861
+ visibility: "public",
1862
+ is_entry: true,
1863
+ is_view: false,
1864
+ generic_type_params: [{ constraints: [] }],
1865
+ params: ["&signer", "address", "u64"],
1866
+ return: []
1867
+ }
1868
+ ],
1869
+ structs: [
1870
+ {
1871
+ name: "DirectCoinTransferConfigUpdated",
1872
+ is_native: false,
1873
+ abilities: ["drop", "store"],
1874
+ generic_type_params: [],
1875
+ fields: [
1876
+ { name: "account", type: "address" },
1877
+ { name: "new_allow_direct_transfers", type: "bool" }
1878
+ ]
1879
+ },
1880
+ {
1881
+ name: "DirectCoinTransferConfigUpdatedEvent",
1882
+ is_native: false,
1883
+ abilities: ["drop", "store"],
1884
+ generic_type_params: [],
1885
+ fields: [{ name: "new_allow_direct_transfers", type: "bool" }]
1886
+ },
1887
+ {
1888
+ name: "DirectTransferConfig",
1889
+ is_native: false,
1890
+ abilities: ["key"],
1891
+ generic_type_params: [],
1892
+ fields: [
1893
+ { name: "allow_arbitrary_coin_transfers", type: "bool" },
1894
+ {
1895
+ name: "update_coin_transfer_events",
1896
+ type: "0x1::event::EventHandle<0x1::supra_account::DirectCoinTransferConfigUpdatedEvent>"
1897
+ }
1898
+ ]
1899
+ }
1900
+ ]
1901
+ };
1902
+
1903
+ // src/lib/utils.ts
1904
+ import { clsx as clsx2 } from "clsx";
1905
+ import { twMerge as twMerge2 } from "tailwind-merge";
1906
+ function cn2(...inputs) {
1907
+ return twMerge2(clsx2(inputs));
1908
+ }
1909
+ function standardizeAddress(address) {
1910
+ let cleanAddress = address.replace(/^0x/, "");
1911
+ if (cleanAddress.length < 64) {
1912
+ cleanAddress = cleanAddress.padStart(64, "0");
1913
+ }
1914
+ if (cleanAddress.length > 64) {
1915
+ throw new Error(`Address ${address} is not a valid address`);
1916
+ }
1917
+ return `0x${cleanAddress}`;
1918
+ }
1919
+
1920
+ // src/lib/abiStorage.ts
1921
+ var abiStorage = {
1922
+ [standardizeAddress("0x1")]: {
1923
+ supra_account: supraAccountABI
1924
+ }
1925
+ };
1926
+ function getStoredABI(moduleAddress, moduleName) {
1927
+ var _a;
1928
+ const standardizedAddress = standardizeAddress(moduleAddress);
1929
+ const normalizedName = moduleName;
1930
+ if ((_a = abiStorage[standardizedAddress]) == null ? void 0 : _a[normalizedName]) {
1931
+ return abiStorage[standardizedAddress][normalizedName];
1932
+ }
1933
+ return null;
1934
+ }
1935
+
1936
+ // src/hooks/useConversionUtils.ts
1937
+ var useConversionUtils = () => {
1938
+ const stringToUint8Array = useCallback3((humanReadableStr) => {
1939
+ return BCS2.bcsToBytes(new TxnBuilderTypes.Identifier(humanReadableStr));
1940
+ }, []);
1941
+ const serializeString = useCallback3((humanReadableStr) => {
1942
+ return BCS2.bcsSerializeStr(humanReadableStr);
1943
+ }, []);
1944
+ const addressToUint8Array = useCallback3((cryptoAddress) => {
1945
+ return BCS2.bcsToBytes(TxnBuilderTypes.AccountAddress.fromHex(cryptoAddress));
1946
+ }, []);
1947
+ const deserializeString = (uint8Array) => {
1948
+ return BCS2.bcsSerializeStr(uint8Array);
1949
+ };
1950
+ const deserializeVector = (uint8Array) => {
1951
+ const deserializer = new BCS2.Deserializer(uint8Array);
1952
+ return BCS2.deserializeVector(deserializer, BCS2.bcsSerializeU8);
1953
+ };
1954
+ const serializeUint8 = useCallback3((value) => {
1955
+ const num = typeof value === "string" ? parseInt(value, 10) : value;
1956
+ if (num < 0 || num > 255) {
1957
+ throw new Error(`u8 value out of range: ${num}`);
1958
+ }
1959
+ return BCS2.bcsSerializeU8(num);
1960
+ }, []);
1961
+ const serializeUint16 = useCallback3((value) => {
1962
+ let num;
1963
+ if (typeof value === "string") {
1964
+ num = parseInt(value, 10);
1965
+ } else if (typeof value === "bigint") {
1966
+ num = Number(value);
1967
+ } else {
1968
+ num = value;
1969
+ }
1970
+ if (num < 0 || num > 65535) {
1971
+ throw new Error(`u16 value out of range: ${num}`);
1972
+ }
1973
+ return BCS2.bcsSerializeU16(num);
1974
+ }, []);
1975
+ const serializeUint32 = useCallback3((value) => {
1976
+ let num;
1977
+ if (typeof value === "string") {
1978
+ num = parseInt(value, 10);
1979
+ } else if (typeof value === "bigint") {
1980
+ num = Number(value);
1981
+ } else {
1982
+ num = value;
1983
+ }
1984
+ if (num < 0 || num > 4294967295) {
1985
+ throw new Error(`u32 value out of range: ${num}`);
1986
+ }
1987
+ return BCS2.bcsSerializeU32(num);
1988
+ }, []);
1989
+ const serializeUint64 = useCallback3((value) => {
1990
+ let num;
1991
+ if (typeof value === "string") {
1992
+ num = BigInt(value);
1993
+ } else if (typeof value === "number") {
1994
+ num = BigInt(value);
1995
+ } else {
1996
+ num = value;
1997
+ }
1998
+ if (num < 0) {
1999
+ throw new Error(`u64 value cannot be negative: ${num}`);
2000
+ }
2001
+ return BCS2.bcsSerializeUint64(num);
2002
+ }, []);
2003
+ const serializeUint128 = useCallback3((value) => {
2004
+ let num;
2005
+ if (typeof value === "string") {
2006
+ num = BigInt(value);
2007
+ } else if (typeof value === "number") {
2008
+ num = BigInt(value);
2009
+ } else {
2010
+ num = value;
2011
+ }
2012
+ if (num < 0) {
2013
+ throw new Error(`u128 value cannot be negative: ${num}`);
2014
+ }
2015
+ return BCS2.bcsSerializeU128(num);
2016
+ }, []);
2017
+ const serializeU256 = useCallback3((value) => {
2018
+ return BCS2.bcsSerializeU256(value);
2019
+ }, []);
2020
+ const serializeBool = useCallback3((value) => {
2021
+ return BCS2.bcsSerializeBool(value);
2022
+ }, []);
2023
+ const serializeVector = useCallback3((values, type) => {
2024
+ const serializer = new BCS2.Serializer();
2025
+ serializer.serializeU32AsUleb128(values.length);
2026
+ values.forEach((value) => {
2027
+ if (type === "u64") {
2028
+ serializer.serializeU64(value);
2029
+ } else if (type === "bool") {
2030
+ serializer.serializeBool(value);
2031
+ } else if (type === "string") {
2032
+ serializer.serializeStr(value);
2033
+ } else if (type === "address") {
2034
+ const accountAddress = TxnBuilderTypes.AccountAddress.fromHex(value);
2035
+ serializer.serializeFixedBytes(accountAddress.address);
2036
+ } else {
2037
+ serializer.serializeStr(value);
2038
+ }
2039
+ });
2040
+ return serializer.getBytes();
2041
+ }, []);
2042
+ const hexToString = (hex, type) => {
2043
+ if (!hex) {
2044
+ return "";
2045
+ }
2046
+ if (type !== "String") {
2047
+ try {
2048
+ return BigInt(hex).toString();
2049
+ } catch (error) {
2050
+ console.error("Error converting hex to string:", error);
2051
+ return hex;
2052
+ }
2053
+ }
2054
+ try {
2055
+ const cleanHex = hex.slice(2);
2056
+ return Buffer.from(cleanHex, "hex").toString().slice(1);
2057
+ } catch (error) {
2058
+ console.error("Error converting hex to string:", error);
2059
+ return hex;
2060
+ }
2061
+ };
2062
+ const stringToHex = (str) => {
2063
+ const encoder = new TextEncoder();
2064
+ const bytes = encoder.encode(str);
2065
+ let hexString = "";
2066
+ for (let i = 0; i < bytes.length; i++) {
2067
+ const hex = bytes[i].toString(16).padStart(2, "0");
2068
+ hexString += hex;
2069
+ }
2070
+ return hexString;
2071
+ };
2072
+ const serializeValueByType = useCallback3(
2073
+ (value, type, serializer) => {
2074
+ var _a;
2075
+ const ser = serializer || new BCS2.Serializer();
2076
+ const shouldReturnBytes = !serializer;
2077
+ if (type.startsWith("0x1::option::Option<")) {
2078
+ if (value === null || value === void 0) {
2079
+ ser.serializeU8(0);
2080
+ } else {
2081
+ ser.serializeU8(1);
2082
+ const innerType = type.slice(21, -1);
2083
+ serializeValueByType(value, innerType, ser);
2084
+ }
2085
+ return shouldReturnBytes ? ser.getBytes() : new Uint8Array(0);
2086
+ }
2087
+ if (type.startsWith("vector<")) {
2088
+ const vectorMatch = type.match(/vector<(.+)>$/);
2089
+ if (!vectorMatch) {
2090
+ throw new Error(`Invalid vector type format: ${type}`);
2091
+ }
2092
+ const innerType = vectorMatch[1];
2093
+ if (innerType === "u8") {
2094
+ let bytes;
2095
+ if (typeof value === "string") {
2096
+ const cleanHex = value.startsWith("0x") ? value.slice(2) : value;
2097
+ bytes = new Uint8Array(
2098
+ ((_a = cleanHex.match(/.{1,2}/g)) == null ? void 0 : _a.map((byte) => parseInt(byte, 16))) || []
2099
+ );
2100
+ } else if (value instanceof Uint8Array) {
2101
+ bytes = value;
2102
+ } else if (Array.isArray(value)) {
2103
+ bytes = new Uint8Array(
2104
+ value.map((item) => {
2105
+ const u8 = typeof item === "string" ? parseInt(item, 10) : item;
2106
+ if (u8 < 0 || u8 > 255) {
2107
+ throw new Error(`u8 value out of range in vector: ${u8}`);
2108
+ }
2109
+ return u8;
2110
+ })
2111
+ );
2112
+ } else {
2113
+ throw new Error(
2114
+ `Expected string, Uint8Array, or number[] for vector<u8>, got ${typeof value}`
2115
+ );
2116
+ }
2117
+ ser.serializeU32AsUleb128(bytes.length);
2118
+ for (let i = 0; i < bytes.length; i++) {
2119
+ ser.serializeU8(bytes[i]);
2120
+ }
2121
+ } else {
2122
+ if (!Array.isArray(value)) {
2123
+ throw new Error(
2124
+ `Expected array for vector<${innerType}>, got ${typeof value}`
2125
+ );
2126
+ }
2127
+ ser.serializeU32AsUleb128(value.length);
2128
+ for (const item of value) {
2129
+ serializeValueByType(item, innerType, ser);
2130
+ }
2131
+ }
2132
+ return shouldReturnBytes ? ser.getBytes() : new Uint8Array(0);
2133
+ }
2134
+ if (type.startsWith("0x1::object::Object")) {
2135
+ if (typeof value !== "string") {
2136
+ throw new Error(`Expected string for Object, got ${typeof value}`);
2137
+ }
2138
+ const objectAddress = TxnBuilderTypes.AccountAddress.fromHex(value);
2139
+ ser.serializeFixedBytes(objectAddress.address);
2140
+ return shouldReturnBytes ? ser.getBytes() : new Uint8Array(0);
2141
+ }
2142
+ switch (type) {
2143
+ case "address":
2144
+ if (typeof value !== "string") {
2145
+ throw new Error(`Expected string for address, got ${typeof value}`);
2146
+ }
2147
+ const accountAddress = TxnBuilderTypes.AccountAddress.fromHex(value);
2148
+ ser.serializeFixedBytes(accountAddress.address);
2149
+ break;
2150
+ case "u8":
2151
+ const u8 = typeof value === "string" ? parseInt(value, 10) : value;
2152
+ if (u8 < 0 || u8 > 255) {
2153
+ throw new Error(`u8 value out of range: ${u8}`);
2154
+ }
2155
+ ser.serializeU8(u8);
2156
+ break;
2157
+ case "u16":
2158
+ const u16 = typeof value === "string" ? parseInt(value, 10) : typeof value === "bigint" ? Number(value) : value;
2159
+ if (u16 < 0 || u16 > 65535) {
2160
+ throw new Error(`u16 value out of range: ${u16}`);
2161
+ }
2162
+ ser.serializeU16(u16);
2163
+ break;
2164
+ case "u32":
2165
+ const u32 = typeof value === "string" ? parseInt(value, 10) : typeof value === "bigint" ? Number(value) : value;
2166
+ if (u32 < 0 || u32 > 4294967295) {
2167
+ throw new Error(`u32 value out of range: ${u32}`);
2168
+ }
2169
+ ser.serializeU32(u32);
2170
+ break;
2171
+ case "u64":
2172
+ const u64 = typeof value === "string" ? BigInt(value) : typeof value === "number" ? BigInt(value) : value;
2173
+ if (u64 < 0) {
2174
+ throw new Error(`u64 value cannot be negative: ${u64}`);
2175
+ }
2176
+ ser.serializeU64(u64);
2177
+ break;
2178
+ case "u128":
2179
+ const u128 = typeof value === "string" ? BigInt(value) : typeof value === "number" ? BigInt(value) : value;
2180
+ if (u128 < 0) {
2181
+ throw new Error(`u128 value cannot be negative: ${u128}`);
2182
+ }
2183
+ ser.serializeU128(u128);
2184
+ break;
2185
+ case "u256":
2186
+ if (typeof value !== "bigint") {
2187
+ throw new Error(`Expected bigint for u256, got ${typeof value}`);
2188
+ }
2189
+ ser.serializeU256(value);
2190
+ break;
2191
+ case "bool":
2192
+ if (typeof value !== "boolean") {
2193
+ throw new Error(`Expected boolean, got ${typeof value}`);
2194
+ }
2195
+ ser.serializeBool(value);
2196
+ break;
2197
+ case "0x1::string::String":
2198
+ if (typeof value !== "string") {
2199
+ throw new Error(`Expected string, got ${typeof value}`);
2200
+ }
2201
+ ser.serializeStr(value);
2202
+ break;
2203
+ default:
2204
+ throw new Error(`Unsupported type: ${type}`);
2205
+ }
2206
+ return shouldReturnBytes ? ser.getBytes() : new Uint8Array(0);
2207
+ },
2208
+ []
2209
+ );
2210
+ const serializeArgsFromTypes = useCallback3(
2211
+ (args, paramTypes) => {
2212
+ if (args.length !== paramTypes.length) {
2213
+ throw new Error(
2214
+ `Argument count mismatch: expected ${paramTypes.length}, got ${args.length}`
2215
+ );
2216
+ }
2217
+ return args.map((arg, index) => {
2218
+ try {
2219
+ const paramType = paramTypes[index].replace("&signer", "").trim();
2220
+ return serializeValueByType(arg, paramType);
2221
+ } catch (error) {
2222
+ const errorMessage = error instanceof Error ? error.message : String(error);
2223
+ throw new Error(
2224
+ `Failed to serialize argument ${index} (${paramTypes[index]}): ${errorMessage}`
2225
+ );
2226
+ }
2227
+ });
2228
+ },
2229
+ [serializeValueByType]
2230
+ );
2231
+ const fetchModuleABI = useCallback3(
2232
+ async (moduleAddress, moduleName, rpcUrl) => {
2233
+ const storedABI = getStoredABI(moduleAddress, moduleName);
2234
+ if (storedABI) {
2235
+ return storedABI;
2236
+ }
2237
+ const baseUrl = rpcUrl || (process.env.NEXT_PUBLIC_SUPRA_CHAIN_ID === "8" ? "https://rpc-mainnet.supra.com" : "https://rpc-testnet.supra.com");
2238
+ const url = `${baseUrl}/rpc/v3/accounts/${moduleAddress}/modules/${moduleName}`;
2239
+ try {
2240
+ const response = await fetch(url);
2241
+ if (!response.ok) {
2242
+ throw new Error(`Failed to fetch ABI: ${response.statusText}`);
2243
+ }
2244
+ const data = await response.json();
2245
+ return data.abi;
2246
+ } catch (error) {
2247
+ console.error("Error fetching module ABI:", error);
2248
+ throw new Error(
2249
+ `Failed to fetch module ABI: ${error instanceof Error ? error.message : String(error)}`
2250
+ );
2251
+ }
2252
+ },
2253
+ []
2254
+ );
2255
+ const getFunctionParamTypes = useCallback3(
2256
+ async (moduleAddress, moduleName, functionName, rpcUrl) => {
2257
+ const moduleABI = await fetchModuleABI(moduleAddress, moduleName, rpcUrl);
2258
+ if (!moduleABI.exposed_functions) {
2259
+ throw new Error("Invalid module ABI response");
2260
+ }
2261
+ const functionDef = moduleABI.exposed_functions.find(
2262
+ (func) => func.name === functionName
2263
+ );
2264
+ if (!functionDef) {
2265
+ throw new Error(`Function ${functionName} not found in module ${moduleName}`);
2266
+ }
2267
+ return functionDef.params.filter((param) => {
2268
+ const trimmed = param.trim();
2269
+ return trimmed !== "signer" && trimmed !== "&signer";
2270
+ });
2271
+ },
2272
+ [fetchModuleABI]
2273
+ );
2274
+ const serializeTransactionArgs = useCallback3(
2275
+ async (args, moduleAddress, moduleName, functionName, rpcUrl) => {
2276
+ const paramTypes = await getFunctionParamTypes(
2277
+ moduleAddress,
2278
+ moduleName,
2279
+ functionName,
2280
+ rpcUrl
2281
+ );
2282
+ return serializeArgsFromTypes(args, paramTypes);
2283
+ },
2284
+ [getFunctionParamTypes, serializeArgsFromTypes]
2285
+ );
2286
+ return {
2287
+ stringToUint8Array,
2288
+ addressToUint8Array,
2289
+ serializeString,
2290
+ serializeUint8,
2291
+ serializeUint16,
2292
+ serializeUint32,
2293
+ serializeUint64,
2294
+ serializeUint128,
2295
+ serializeU256,
2296
+ serializeBool,
2297
+ serializeVector,
2298
+ deserializeString,
2299
+ deserializeVector,
2300
+ hexToString,
2301
+ stringToHex,
2302
+ // ABI-based serialization
2303
+ serializeValueByType,
2304
+ serializeArgsFromTypes,
2305
+ fetchModuleABI,
2306
+ getFunctionParamTypes,
2307
+ serializeTransactionArgs
2308
+ // Main function to use
2309
+ };
2310
+ };
2311
+ var useConversionUtils_default = useConversionUtils;
2312
+
2313
+ // components/ui/sonner.tsx
2314
+ import { useTheme } from "next-themes";
2315
+ import { Toaster as Sonner } from "sonner";
2316
+ import { jsx as jsx4 } from "react/jsx-runtime";
2317
+ var Toaster = (_a) => {
2318
+ var props = __objRest(_a, []);
2319
+ const { theme = "system" } = useTheme();
2320
+ return /* @__PURE__ */ jsx4(
2321
+ Sonner,
2322
+ __spreadValues({
2323
+ theme,
2324
+ className: "toaster group",
2325
+ toastOptions: {
2326
+ classNames: {
2327
+ toast: "group toast group-[.toaster]:bg-background group-[.toaster]:text-foreground group-[.toaster]:border-border group-[.toaster]:shadow-lg",
2328
+ description: "group-[.toast]:text-muted-foreground",
2329
+ actionButton: "group-[.toast]:bg-primary group-[.toast]:text-primary-foreground",
2330
+ cancelButton: "group-[.toast]:bg-muted group-[.toast]:text-muted-foreground"
2331
+ }
2332
+ }
2333
+ }, props)
2334
+ );
2335
+ };
2336
+
2337
+ // src/assets/walletIcons/Starkey.png
2338
+ var Starkey_default = "data:image/png;base64,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";
2339
+
2340
+ // src/assets/walletIcons/Ribbit.jpg
2341
+ var Ribbit_default = "data:image/jpeg;base64,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XgUI/Cojt9XIq+0ORb6HugAg2KoXeUjjgUFiuBhegVf2soPalH3iGy1MdeAQjvEhlQZGa6UlbArMZbhRt2mXIkRhKkSO197XztIncgu5vVOXIhEu/mqFIAoYZbcdfW2JpWja8llrSm2ZdpJES5KC1gmj7uTSkkSEy3eybKcy/OazhtEuSwAvoMGuF1TCmwpeXRMauXQSipW+MY879q9qv84xrBnofuj33gCjGoDhVhnekocsnAVLWN7bxnba4FTExP2dDDUQGLRa5QXVMKTDrxdExpQ4GES7YKMl9X+rMZSzkdx3a7RZ5tXKArQJ97TRWZuCx/Z7RpyMGS56eKWa2R3g+vllRZoNUr6o2chJmvennaSq2MxFz+y2pH9xX0u7Fbg8BPqlduK2pWQgLMufW2MEUgyAg8vSke6dZ9fKwdxXc9VPICdQiHwddsNBlZkXHva9pnDzH00YX1Duopc3Uin9bW9eds6iSOejVnicQ8Mas8bgPjU0KW5GhR+2NPxx5/LMz/ANfNTxpZro1x8YPhVljcA8alxS3TQ22WR05bvdCBcrvut53JyLWhwsBShj7iwff8XvyluMwNM6AAQFx8p43FYjTVC4D3a/x+nm5qBiRAYUGcKDXdbIjMmL+DrsvYehTpaLz0iufDd7oCJGSA91A2bbuflok7QCA+cRFQORoaM7cE4UeHGu90JLHIAoU6NHmb3tRtfgEBs/DAHrf13QEZHxloirGNdflaLZbgAibeZTK5CWCMPikYuE+JVBW/Dm2JsefyqcMSwF1IiISzc7hw7QvzGjLBGwRzLpoKjmVIlaEsqzfmFqBH13MbieSzfwYSrwTuafBlGDUJGGMMR130/OD7Cll3RzEtVu/wB99lavaLsTpd13UqFkLT62u945LD8NLLLu8IvsvuPmVckWWTeLuWBt+1p9LZRtXebXM1eIU6S7v32USVrpBunHf65VFzWssbPVw4FY75qMtaEEG/7BQsZyR6Grg4xp0JSTzR88KNHzwiVLQkYLQ6AMIHY+6dsHifdBNr8lM2boPtTsaUfOKjQTk9BOuTZo2S9MqXndfrTozn/0dqw0lD/TpSJavSV/8OXOp+HUal/sB//aAAwDAQACAAMAAAAQ888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888880V0ms888jqr9788888888888pzDl+e9A8k/hDxo8888888888d8+o/9999959q848888888888bmL999999950m+m888888888D+PNN994109989f/APPPPPPPPPE//ffffb3fffffffv/ADzzzzzzzzz3333333333333jzzzzzzzzzyXT333333333337PzzzzzzzzzzzQrPjTLvfnfaZDzzzzzzzzzzzzzzyyzzzyw1zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz/8QAJhEBAAIBAgQHAQEAAAAAAAAAAQARITFBIDBRYRBwcZGhscFAgf/aAAgBAwEBPxDzOPELehE5o9o1C9yI0V32g3wALYY0L7ymP4mUuP8ALh9j0deZUo1dIcG26jEG/wAjstSVNr6j1fid99p3fiNsPtGM7wDFr9htu4LneWHLtHYvg07jBgmLt9cQNfSNO4xV4ezHl+k8NJiaTzFss734lA7Q18ppPMZJiXbvXKWsx2hDOYNCKW78QAZYJjzpHGoeKGcwaEQtxDdt+VfF0eNHapgjJmIrdeIl6305TIbbc5RNjXmHEaTHXmURlJa78wBQsmUdTZ79JqC9oM0E0/8AEOzNuuaqEE0mkqIyq9JVmv4a4aPLn//EACkRAQACAAMGBgMBAAAAAAAAAAEAESExQTBRYXGBsRAgkaHR4XDB8ED/2gAIAQIBAT8Q/JztDuD97piRjoveX4x3IRYC2/SCJZ5AClEZpvi/EtRbwD4mOgOYP90mkomY4O0YAZuBBKM9XfDLqjkQ8dSIM4lXO0O76iX0Zxn0mBm9GLou6ZzDAZNd2GXZCxamTKl67OzdE+4eCy0VXKoUtWfKEKOHbzAcW5jWaMuUCWq75V4B0D6n1s6E3Y8rYfexlfTE1M4497ny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";
2342
+
2343
+ // src/assets/walletIcons/index.ts
2344
+ var WALLET_ICONS = {
2345
+ starkey: Starkey_default,
2346
+ ribbit: Ribbit_default
2347
+ };
2348
+ export {
2349
+ Button,
2350
+ ConnectWalletHandler,
2351
+ Dialog,
2352
+ DialogClose,
2353
+ DialogContent,
2354
+ DialogDescription,
2355
+ DialogFooter,
2356
+ DialogHeader,
2357
+ DialogOverlay,
2358
+ DialogPortal,
2359
+ DialogTitle,
2360
+ DialogTrigger,
2361
+ Toaster,
2362
+ WALLET_EVENTS,
2363
+ WALLET_ICONS,
2364
+ buttonVariants,
2365
+ cn2 as cn,
2366
+ getStoredABI,
2367
+ Ribbit_default as ribbitIcon,
2368
+ standardizeAddress,
2369
+ Starkey_default as starkeyIcon,
2370
+ useConversionUtils_default as useConversionUtils,
2371
+ useSupraMultiWallet_default as useSupraMultiWallet
2372
+ };
2373
+ //# sourceMappingURL=index.mjs.map