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