@suilend/sui-fe-next 2.0.12 → 2.0.13
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/contexts/WalletContext.jsx +100 -74
- package/lib/connector.d.ts +7 -2
- package/lib/connector.js +21 -35
- package/package.json +1 -1
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -66,7 +66,7 @@ import BigNumber from "bignumber.js";
|
|
|
66
66
|
import { useLDClient } from "launchdarkly-react-client-sdk";
|
|
67
67
|
import { useLocalStorage } from "usehooks-ts";
|
|
68
68
|
import { API_URL, formatAddress, isInMsafeApp } from "@suilend/sui-fe";
|
|
69
|
-
import {
|
|
69
|
+
import { WC_SUI_METHODS, getWalletConnectProvider } from "../lib/connector";
|
|
70
70
|
import { showErrorToast, showInfoToast } from "../lib/toasts";
|
|
71
71
|
import { useSettingsContext } from "./SettingsContext";
|
|
72
72
|
export var WalletType;
|
|
@@ -211,34 +211,39 @@ export var useWalletContext = function () { return useContext(WalletContext); };
|
|
|
211
211
|
function Inner(_a) {
|
|
212
212
|
var _b;
|
|
213
213
|
var _this = this;
|
|
214
|
-
var _c, _d, _e
|
|
214
|
+
var _c, _d, _e;
|
|
215
215
|
var appName = _a.appName, children = _a.children;
|
|
216
216
|
var router = useRouter();
|
|
217
217
|
var queryParams = (_b = {},
|
|
218
218
|
_b[WalletContextQueryParams.WALLET] = router.query[WalletContextQueryParams.WALLET],
|
|
219
219
|
_b);
|
|
220
|
-
var
|
|
221
|
-
//
|
|
222
|
-
|
|
223
|
-
var
|
|
224
|
-
var
|
|
225
|
-
var sessionAddress =
|
|
226
|
-
|
|
227
|
-
:
|
|
220
|
+
var suiClient = useSettingsContext().suiClient;
|
|
221
|
+
// WalletConnect via @walletconnect/universal-provider
|
|
222
|
+
// Matches the reference implementation: https://github.com/WalletConnect/react-core-up-sui
|
|
223
|
+
var _f = useState(), wcProvider = _f[0], setWcProvider = _f[1];
|
|
224
|
+
var _g = useState(), wcSession = _g[0], setWcSession = _g[1];
|
|
225
|
+
var sessionAddress = useMemo(function () {
|
|
226
|
+
var _a, _b, _c;
|
|
227
|
+
var raw = (_c = (_b = (_a = wcSession === null || wcSession === void 0 ? void 0 : wcSession.namespaces) === null || _a === void 0 ? void 0 : _a.sui) === null || _b === void 0 ? void 0 : _b.accounts) === null || _c === void 0 ? void 0 : _c[0];
|
|
228
|
+
return raw ? raw.split(":").pop() : undefined;
|
|
229
|
+
}, [wcSession]);
|
|
228
230
|
useEffect(function () {
|
|
229
231
|
(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
230
|
-
var
|
|
232
|
+
var provider;
|
|
231
233
|
return __generator(this, function (_a) {
|
|
232
234
|
switch (_a.label) {
|
|
233
|
-
case 0: return [4 /*yield*/,
|
|
235
|
+
case 0: return [4 /*yield*/, getWalletConnectProvider()];
|
|
234
236
|
case 1:
|
|
235
|
-
|
|
236
|
-
|
|
237
|
+
provider = _a.sent();
|
|
238
|
+
setWcProvider(provider);
|
|
239
|
+
if (provider.session) {
|
|
240
|
+
setWcSession(provider.session);
|
|
241
|
+
}
|
|
237
242
|
return [2 /*return*/];
|
|
238
243
|
}
|
|
239
244
|
});
|
|
240
245
|
}); })();
|
|
241
|
-
}, [
|
|
246
|
+
}, []);
|
|
242
247
|
// Impersonated address
|
|
243
248
|
var impersonatedAddress = queryParams[WalletContextQueryParams.WALLET];
|
|
244
249
|
// Wallets
|
|
@@ -352,7 +357,7 @@ function Inner(_a) {
|
|
|
352
357
|
wallets__web,
|
|
353
358
|
]);
|
|
354
359
|
// Wallet
|
|
355
|
-
var
|
|
360
|
+
var _h = useState(false), isConnectWalletDropdownOpen = _h[0], setIsConnectWalletDropdownOpen = _h[1];
|
|
356
361
|
var rawWallet = useCurrentWallet();
|
|
357
362
|
var wallet = useMemo(function () {
|
|
358
363
|
if (sessionAddress) {
|
|
@@ -370,11 +375,11 @@ function Inner(_a) {
|
|
|
370
375
|
return __generator(this, function (_a) {
|
|
371
376
|
switch (_a.label) {
|
|
372
377
|
case 0:
|
|
373
|
-
if (!sessionAddress || !
|
|
378
|
+
if (!sessionAddress || !wcProvider)
|
|
374
379
|
throw new Error("Wallet not connected");
|
|
375
|
-
return [4 /*yield*/,
|
|
376
|
-
method:
|
|
377
|
-
params: { message: message.toString() },
|
|
380
|
+
return [4 /*yield*/, wcProvider.request({
|
|
381
|
+
method: WC_SUI_METHODS.SIGN_PERSONAL_MESSAGE,
|
|
382
|
+
params: { message: message.toString(), address: sessionAddress },
|
|
378
383
|
}, "sui:mainnet")];
|
|
379
384
|
case 1:
|
|
380
385
|
res = _a.sent();
|
|
@@ -384,84 +389,109 @@ function Inner(_a) {
|
|
|
384
389
|
}];
|
|
385
390
|
}
|
|
386
391
|
});
|
|
387
|
-
}); }, [sessionAddress,
|
|
392
|
+
}); }, [sessionAddress, wcProvider]);
|
|
388
393
|
var connectWalletWrapper = useCallback(function (_wallet) { return __awaiter(_this, void 0, void 0, function () {
|
|
389
|
-
var
|
|
390
|
-
return __generator(this, function (
|
|
391
|
-
switch (
|
|
394
|
+
var _a, _b, err_1;
|
|
395
|
+
return __generator(this, function (_c) {
|
|
396
|
+
switch (_c.label) {
|
|
392
397
|
case 0:
|
|
393
|
-
|
|
398
|
+
_c.trys.push([0, 12, , 13]);
|
|
394
399
|
if (!(_wallet === null || _wallet === void 0 ? void 0 : _wallet.walletConnect)) return [3 /*break*/, 6];
|
|
395
|
-
|
|
400
|
+
if (!wcProvider)
|
|
401
|
+
throw new Error("WalletConnect provider not ready");
|
|
402
|
+
// Connect with optionalNamespaces — matches the reference app exactly.
|
|
403
|
+
// Methods are declared at connect time, not at init time.
|
|
404
|
+
return [4 /*yield*/, wcProvider.connect({
|
|
405
|
+
optionalNamespaces: {
|
|
406
|
+
sui: {
|
|
407
|
+
methods: [
|
|
408
|
+
WC_SUI_METHODS.SIGN_TRANSACTION,
|
|
409
|
+
WC_SUI_METHODS.SIGN_AND_EXECUTE_TRANSACTION,
|
|
410
|
+
WC_SUI_METHODS.SIGN_PERSONAL_MESSAGE,
|
|
411
|
+
],
|
|
412
|
+
chains: ["sui:mainnet"],
|
|
413
|
+
events: [],
|
|
414
|
+
},
|
|
415
|
+
},
|
|
416
|
+
})];
|
|
396
417
|
case 1:
|
|
397
|
-
|
|
398
|
-
|
|
418
|
+
// Connect with optionalNamespaces — matches the reference app exactly.
|
|
419
|
+
// Methods are declared at connect time, not at init time.
|
|
420
|
+
_c.sent();
|
|
421
|
+
_c.label = 2;
|
|
399
422
|
case 2:
|
|
400
|
-
|
|
423
|
+
_c.trys.push([2, 4, , 5]);
|
|
401
424
|
return [4 /*yield*/, disconnectWallet()];
|
|
402
425
|
case 3:
|
|
403
|
-
|
|
426
|
+
_c.sent();
|
|
404
427
|
return [3 /*break*/, 5];
|
|
405
428
|
case 4:
|
|
406
|
-
_a =
|
|
429
|
+
_a = _c.sent();
|
|
407
430
|
return [3 /*break*/, 5];
|
|
408
431
|
case 5:
|
|
409
|
-
|
|
432
|
+
setWcSession(wcProvider.session);
|
|
410
433
|
return [2 /*return*/];
|
|
411
434
|
case 6:
|
|
412
435
|
if (!_wallet.raw)
|
|
413
436
|
throw new Error("Missing wallet");
|
|
414
437
|
return [4 /*yield*/, connectWallet({ wallet: _wallet.raw })];
|
|
415
438
|
case 7:
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
439
|
+
_c.sent();
|
|
440
|
+
_c.label = 8;
|
|
441
|
+
case 8:
|
|
442
|
+
_c.trys.push([8, 10, , 11]);
|
|
443
|
+
return [4 /*yield*/, (wcProvider === null || wcProvider === void 0 ? void 0 : wcProvider.disconnect())];
|
|
444
|
+
case 9:
|
|
445
|
+
_c.sent();
|
|
446
|
+
return [3 /*break*/, 11];
|
|
447
|
+
case 10:
|
|
448
|
+
_b = _c.sent();
|
|
449
|
+
return [3 /*break*/, 11];
|
|
450
|
+
case 11:
|
|
451
|
+
setWcSession(null);
|
|
424
452
|
showInfoToast("Connected ".concat(_wallet.name));
|
|
425
453
|
setIsConnectWalletDropdownOpen(false);
|
|
426
|
-
return [3 /*break*/,
|
|
427
|
-
case
|
|
428
|
-
err_1 =
|
|
454
|
+
return [3 /*break*/, 13];
|
|
455
|
+
case 12:
|
|
456
|
+
err_1 = _c.sent();
|
|
429
457
|
showErrorToast("Failed to connect ".concat(_wallet.name), err_1);
|
|
430
458
|
console.error(err_1);
|
|
431
|
-
return [3 /*break*/,
|
|
432
|
-
case
|
|
459
|
+
return [3 /*break*/, 13];
|
|
460
|
+
case 13: return [2 /*return*/];
|
|
433
461
|
}
|
|
434
462
|
});
|
|
435
|
-
}); }, [connectWallet, disconnectWallet,
|
|
463
|
+
}); }, [connectWallet, disconnectWallet, wcProvider]);
|
|
436
464
|
var disconnectWalletWrapper = useCallback(function () { return __awaiter(_this, void 0, void 0, function () {
|
|
437
465
|
var err_2;
|
|
438
466
|
return __generator(this, function (_a) {
|
|
439
467
|
switch (_a.label) {
|
|
440
468
|
case 0:
|
|
441
|
-
_a.trys.push([0,
|
|
442
|
-
if (!sessionAddress) return [3 /*break*/,
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
469
|
+
_a.trys.push([0, 5, , 6]);
|
|
470
|
+
if (!sessionAddress) return [3 /*break*/, 2];
|
|
471
|
+
return [4 /*yield*/, (wcProvider === null || wcProvider === void 0 ? void 0 : wcProvider.disconnect())];
|
|
472
|
+
case 1:
|
|
473
|
+
_a.sent();
|
|
474
|
+
setWcSession(null);
|
|
475
|
+
return [3 /*break*/, 4];
|
|
476
|
+
case 2: return [4 /*yield*/, disconnectWallet()];
|
|
477
|
+
case 3:
|
|
448
478
|
_a.sent();
|
|
449
479
|
showInfoToast("Disconnected wallet");
|
|
450
|
-
_a.label =
|
|
451
|
-
case
|
|
452
|
-
case
|
|
480
|
+
_a.label = 4;
|
|
481
|
+
case 4: return [3 /*break*/, 6];
|
|
482
|
+
case 5:
|
|
453
483
|
err_2 = _a.sent();
|
|
454
484
|
showErrorToast("Failed to disconnect wallet", err_2);
|
|
455
485
|
console.error(err_2);
|
|
456
|
-
return [3 /*break*/,
|
|
457
|
-
case
|
|
486
|
+
return [3 /*break*/, 6];
|
|
487
|
+
case 6: return [2 /*return*/];
|
|
458
488
|
}
|
|
459
489
|
});
|
|
460
|
-
}); }, [sessionAddress,
|
|
490
|
+
}); }, [sessionAddress, wcProvider, disconnectWallet]);
|
|
461
491
|
// Accounts
|
|
462
492
|
var walletConnection = useWalletConnection();
|
|
463
|
-
var accountsRes = useMemo(function () { var _a, _b; return (_b = (_a = walletConnection.wallet) === null || _a === void 0 ? void 0 : _a.accounts) !== null && _b !== void 0 ? _b : []; }, [(
|
|
464
|
-
var accountRes = (
|
|
493
|
+
var accountsRes = useMemo(function () { var _a, _b; return (_b = (_a = walletConnection.wallet) === null || _a === void 0 ? void 0 : _a.accounts) !== null && _b !== void 0 ? _b : []; }, [(_c = walletConnection.wallet) === null || _c === void 0 ? void 0 : _c.accounts]);
|
|
494
|
+
var accountRes = (_d = useCurrentAccount()) !== null && _d !== void 0 ? _d : undefined;
|
|
465
495
|
var walletConnectAccount = useMemo(function () {
|
|
466
496
|
return sessionAddress
|
|
467
497
|
? {
|
|
@@ -497,7 +527,7 @@ function Inner(_a) {
|
|
|
497
527
|
showErrorToast("Failed to switch to ".concat(accountLabel), err);
|
|
498
528
|
console.error(err);
|
|
499
529
|
}
|
|
500
|
-
}, [dAppKit, (
|
|
530
|
+
}, [dAppKit, (_e = walletConnection.wallet) === null || _e === void 0 ? void 0 : _e.accounts]);
|
|
501
531
|
// LaunchDarkly
|
|
502
532
|
var ldClient = useLDClient();
|
|
503
533
|
var ldKeyRef = useRef(undefined);
|
|
@@ -643,13 +673,9 @@ function Inner(_a) {
|
|
|
643
673
|
onSetGasBudget === null || onSetGasBudget === void 0 ? void 0 : onSetGasBudget(transaction);
|
|
644
674
|
// Log
|
|
645
675
|
console.log("[WalletContext] signExecuteAndWaitForTransaction - transaction.getData():", transaction.getData());
|
|
646
|
-
if (!(sessionAddress &&
|
|
647
|
-
// WalletConnect
|
|
648
|
-
//
|
|
649
|
-
// 2. sui_signTransaction — wallet signs only, returns { transactionBytes, signature }
|
|
650
|
-
// Fireblocks and most institutional wallets prefer (1).
|
|
651
|
-
// Ref: https://docs.walletconnect.network/wallet-sdk/chain-support/sui
|
|
652
|
-
// https://github.com/WalletConnect/react-core-up-sui
|
|
676
|
+
if (!(sessionAddress && wcProvider)) return [3 /*break*/, 11];
|
|
677
|
+
// WalletConnect path — uses @walletconnect/universal-provider directly,
|
|
678
|
+
// matching the reference app: https://github.com/WalletConnect/react-core-up-sui
|
|
653
679
|
transaction.setSender(sessionAddress);
|
|
654
680
|
return [4 /*yield*/, transaction.build({ client: suiClient })];
|
|
655
681
|
case 2:
|
|
@@ -663,8 +689,8 @@ function Inner(_a) {
|
|
|
663
689
|
case 3:
|
|
664
690
|
_a.trys.push([3, 6, , 7]);
|
|
665
691
|
console.log("[WalletContext] WalletConnect — trying sui_signAndExecuteTransaction");
|
|
666
|
-
return [4 /*yield*/,
|
|
667
|
-
method:
|
|
692
|
+
return [4 /*yield*/, wcProvider.request({
|
|
693
|
+
method: WC_SUI_METHODS.SIGN_AND_EXECUTE_TRANSACTION,
|
|
668
694
|
params: params,
|
|
669
695
|
}, "sui:mainnet")];
|
|
670
696
|
case 4:
|
|
@@ -679,7 +705,7 @@ function Inner(_a) {
|
|
|
679
705
|
case 7:
|
|
680
706
|
// Fallback: sign-only, then dApp-side execute
|
|
681
707
|
console.log("[WalletContext] WalletConnect — trying sui_signTransaction (sign-only fallback)");
|
|
682
|
-
return [4 /*yield*/,
|
|
708
|
+
return [4 /*yield*/, wcProvider.request({ method: WC_SUI_METHODS.SIGN_TRANSACTION, params: params }, "sui:mainnet")];
|
|
683
709
|
case 8:
|
|
684
710
|
signRes = _a.sent();
|
|
685
711
|
console.log("[WalletContext] WalletConnect — sui_signTransaction succeeded, executing on-chain");
|
|
@@ -739,7 +765,7 @@ function Inner(_a) {
|
|
|
739
765
|
}
|
|
740
766
|
});
|
|
741
767
|
}); }, [
|
|
742
|
-
|
|
768
|
+
wcProvider,
|
|
743
769
|
sessionAddress,
|
|
744
770
|
gasBudget,
|
|
745
771
|
impersonatedAddress,
|
|
@@ -750,7 +776,7 @@ function Inner(_a) {
|
|
|
750
776
|
waitForTransactionWithCheck,
|
|
751
777
|
]);
|
|
752
778
|
// Using Ledger
|
|
753
|
-
var
|
|
779
|
+
var _j = useLocalStorage("isUsingLedger-".concat(impersonatedAddress !== null && impersonatedAddress !== void 0 ? impersonatedAddress : account === null || account === void 0 ? void 0 : account.address), false), isUsingLedger = _j[0], setIsUsingLedger = _j[1];
|
|
754
780
|
// Context
|
|
755
781
|
var contextValue = useMemo(function () {
|
|
756
782
|
return {
|
package/lib/connector.d.ts
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
import UniversalProvider from "@walletconnect/universal-provider";
|
|
2
2
|
export declare const projectId = "eebad6a56ec8b3f08b70175934d35a9d";
|
|
3
|
-
export declare function
|
|
3
|
+
export declare function getWalletConnectProvider(): Promise<UniversalProvider>;
|
|
4
|
+
export declare const WC_SUI_METHODS: {
|
|
5
|
+
readonly SIGN_TRANSACTION: "sui_signTransaction";
|
|
6
|
+
readonly SIGN_AND_EXECUTE_TRANSACTION: "sui_signAndExecuteTransaction";
|
|
7
|
+
readonly SIGN_PERSONAL_MESSAGE: "sui_signPersonalMessage";
|
|
8
|
+
};
|
package/lib/connector.js
CHANGED
|
@@ -34,48 +34,34 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
34
34
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
35
|
}
|
|
36
36
|
};
|
|
37
|
-
import
|
|
38
|
-
// Get projectId from https://dashboard.reown.com
|
|
37
|
+
import UniversalProvider from "@walletconnect/universal-provider";
|
|
39
38
|
export var projectId = "eebad6a56ec8b3f08b70175934d35a9d";
|
|
40
|
-
|
|
39
|
+
var provider;
|
|
40
|
+
export function getWalletConnectProvider() {
|
|
41
41
|
return __awaiter(this, void 0, void 0, function () {
|
|
42
|
-
var universalConnector;
|
|
43
42
|
return __generator(this, function (_a) {
|
|
44
43
|
switch (_a.label) {
|
|
45
|
-
case 0:
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
{
|
|
55
|
-
methods: [
|
|
56
|
-
"sui_signPersonalMessage",
|
|
57
|
-
"sui_signTransaction",
|
|
58
|
-
"sui_signAndExecuteTransaction",
|
|
59
|
-
],
|
|
60
|
-
chains: [
|
|
61
|
-
{
|
|
62
|
-
id: 784,
|
|
63
|
-
chainNamespace: "sui",
|
|
64
|
-
caipNetworkId: "sui:mainnet",
|
|
65
|
-
name: "Sui",
|
|
66
|
-
nativeCurrency: { name: "SUI", symbol: "SUI", decimals: 9 },
|
|
67
|
-
rpcUrls: { default: { http: [rpcUrl] } },
|
|
68
|
-
},
|
|
69
|
-
],
|
|
70
|
-
events: [],
|
|
71
|
-
namespace: "sui",
|
|
44
|
+
case 0:
|
|
45
|
+
if (!!provider) return [3 /*break*/, 2];
|
|
46
|
+
return [4 /*yield*/, UniversalProvider.init({
|
|
47
|
+
projectId: projectId,
|
|
48
|
+
metadata: {
|
|
49
|
+
name: "Suilend",
|
|
50
|
+
description: "Sui's DeFi Suite",
|
|
51
|
+
url: "https://suilend.fi/",
|
|
52
|
+
icons: ["https://suilend.fi/favicon.ico"],
|
|
72
53
|
},
|
|
73
|
-
]
|
|
74
|
-
})];
|
|
54
|
+
})];
|
|
75
55
|
case 1:
|
|
76
|
-
|
|
77
|
-
|
|
56
|
+
provider = _a.sent();
|
|
57
|
+
_a.label = 2;
|
|
58
|
+
case 2: return [2 /*return*/, provider];
|
|
78
59
|
}
|
|
79
60
|
});
|
|
80
61
|
});
|
|
81
62
|
}
|
|
63
|
+
export var WC_SUI_METHODS = {
|
|
64
|
+
SIGN_TRANSACTION: "sui_signTransaction",
|
|
65
|
+
SIGN_AND_EXECUTE_TRANSACTION: "sui_signAndExecuteTransaction",
|
|
66
|
+
SIGN_PERSONAL_MESSAGE: "sui_signPersonalMessage",
|
|
67
|
+
};
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@suilend/sui-fe-next","version":"2.0.
|
|
1
|
+
{"name":"@suilend/sui-fe-next","version":"2.0.13","private":false,"description":"A collection of TypeScript frontend components and hooks","author":"Suilend","license":"MIT","main":"./index.js","exports":{".":"./index.js","./contexts/WalletContext":"./contexts/WalletContext.jsx","./contexts/SettingsContext":"./contexts/SettingsContext.jsx","./contexts":"./contexts/index.js","./fetchers":"./fetchers/index.js","./fetchers/useFetchBalances":"./fetchers/useFetchBalances.js","./hooks/useRefreshOnBalancesChange":"./hooks/useRefreshOnBalancesChange.js","./hooks/useLedgerHashDialog":"./hooks/useLedgerHashDialog.js","./hooks/useIsAndroid":"./hooks/useIsAndroid.jsx","./hooks/useCoinMetadataMap":"./hooks/useCoinMetadataMap.js","./hooks":"./hooks/index.js","./hooks/useIsTouchscreen":"./hooks/useIsTouchscreen.jsx","./hooks/useIsiOS":"./hooks/useIsiOS.jsx","./hooks/keypair":"./hooks/keypair.js","./lib/track":"./lib/track.js","./lib":"./lib/index.js","./lib/router":"./lib/router.js","./lib/toasts":"./lib/toasts.jsx","./lib/connector":"./lib/connector.js"},"types":"./index.js","scripts":{"build":"rm -rf ./dist && bun tsc","eslint":"eslint --fix src/","prettier":"prettier --write src/","lint":"bun eslint && bun prettier && bun tsc --noEmit","release":"bun run build && bun ./release.js && cd ./dist && npm publish --access public"},"repository":{"type":"git","url":"git+https://github.com/suilend/sui-fe.git"},"bugs":{"url":"https://github.com/suilend/sui-fe/issues"},"dependencies":{"@reown/appkit":"1.8.2","@walletconnect/universal-provider":"2.21.1","@tanstack/react-query":"^5.60.2","bignumber.js":"^9.1.2","launchdarkly-react-client-sdk":"^3.6.0","lodash":"^4.17.21","mixpanel-browser":"^2.72.0","next":"^15.0.3","react":"18.3.1","react-dom":"18.3.1","react-responsive":"^10.0.0","sonner":"1.4.41","swr":"^2.2.5","tailwind-merge":"^2.5.4","usehooks-ts":"^3.1.1"},"devDependencies":{"@tsconfig/next":"^2.0.3","@types/lodash":"^4.17.13","@types/node":"^22.9.0","@types/react":"^18.3.12","@types/react-dom":"^18.3.1","@typescript-eslint/eslint-plugin":"^8.14.0","@typescript-eslint/parser":"^8.14.0","eslint":"^9.14.0","eslint-config-next":"^15.0.3","eslint-config-prettier":"^9.1.0","eslint-plugin-import":"^2.31.0","eslint-plugin-prettier":"^5.2.1","prettier":"^3.3.3","ts-node":"^10.9.2","typescript":"^5.6.3"},"peerDependencies":{"@mysten/dapp-kit-core":"1.0.3","@mysten/dapp-kit-react":"1.0.1","@mysten/sui":"2.3.1","@mysten/wallet-standard":"0.20.0","@suilend/sui-fe":"^2.0.10"}}
|