@suilend/sui-fe-next 0.1.47

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.
@@ -0,0 +1,5 @@
1
+ import BigNumber from "bignumber.js";
2
+ export default function useFetchBalances(): {
3
+ data: Record<string, BigNumber> | undefined;
4
+ mutateData: import("swr").KeyedMutator<Record<string, BigNumber>>;
5
+ };
@@ -0,0 +1,94 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
23
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ import { normalizeStructTag } from "@mysten/sui/utils";
49
+ import BigNumber from "bignumber.js";
50
+ import useSWR from "swr";
51
+ import { useSettingsContext } from "../contexts/SettingsContext";
52
+ import { useWalletContext } from "../contexts/WalletContext";
53
+ import { showErrorToast } from "../lib/toasts";
54
+ export default function useFetchBalances() {
55
+ var _this = this;
56
+ var suiClient = useSettingsContext().suiClient;
57
+ var address = useWalletContext().address;
58
+ var dataFetcher = function () { return __awaiter(_this, void 0, void 0, function () {
59
+ var balancesMap, rawBalances, _i, rawBalances_1, rawBalance, totalBalance;
60
+ return __generator(this, function (_a) {
61
+ switch (_a.label) {
62
+ case 0:
63
+ balancesMap = {};
64
+ if (!address) return [3 /*break*/, 2];
65
+ return [4 /*yield*/, suiClient.getAllBalances({
66
+ owner: address,
67
+ })];
68
+ case 1:
69
+ rawBalances = (_a.sent())
70
+ .map(function (cb) { return (__assign(__assign({}, cb), { coinType: normalizeStructTag(cb.coinType) })); })
71
+ .sort(function (a, b) { return (a.coinType < b.coinType ? -1 : 1); });
72
+ for (_i = 0, rawBalances_1 = rawBalances; _i < rawBalances_1.length; _i++) {
73
+ rawBalance = rawBalances_1[_i];
74
+ totalBalance = new BigNumber(rawBalance.totalBalance);
75
+ if (totalBalance.gt(0))
76
+ balancesMap[rawBalance.coinType] = totalBalance;
77
+ }
78
+ _a.label = 2;
79
+ case 2: return [2 /*return*/, balancesMap];
80
+ }
81
+ });
82
+ }); };
83
+ var _a = useSWR("balances-".concat(address), dataFetcher, {
84
+ refreshInterval: 15 * 1000,
85
+ onSuccess: function (data) {
86
+ console.log("Refreshed wallet balances", data);
87
+ },
88
+ onError: function (err) {
89
+ showErrorToast("Failed to refresh wallet balances", err);
90
+ console.error(err);
91
+ },
92
+ }), data = _a.data, mutate = _a.mutate;
93
+ return { data: data, mutateData: mutate };
94
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./useCoinMetadataMap";
2
+ export * from "./useIsAndroid";
3
+ export * from "./useIsiOS";
4
+ export * from "./useIsTouchscreen";
5
+ export * from "./useRefreshOnBalancesChange";
package/hooks/index.js ADDED
@@ -0,0 +1,5 @@
1
+ export * from "./useCoinMetadataMap";
2
+ export * from "./useIsAndroid";
3
+ export * from "./useIsiOS";
4
+ export * from "./useIsTouchscreen";
5
+ export * from "./useRefreshOnBalancesChange";
@@ -0,0 +1,3 @@
1
+ import { CoinMetadata } from "@mysten/sui/client";
2
+ declare const useCoinMetadataMap: (coinTypes: string[]) => Record<string, CoinMetadata> | undefined;
3
+ export default useCoinMetadataMap;
@@ -0,0 +1,76 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
23
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ import { useEffect, useRef, useState } from "react";
49
+ import { getCoinMetadataMap } from "@suilend/sui-fe";
50
+ var useCoinMetadataMap = function (coinTypes) {
51
+ // State
52
+ var _a = useState(undefined), coinMetadataMap = _a[0], setCoinMetadataMap = _a[1];
53
+ var coinTypesBeingFetchedRef = useRef([]);
54
+ useEffect(function () {
55
+ (function () { return __awaiter(void 0, void 0, void 0, function () {
56
+ var filteredCoinTypes, coinMetadataMap;
57
+ var _a;
58
+ return __generator(this, function (_b) {
59
+ switch (_b.label) {
60
+ case 0:
61
+ filteredCoinTypes = Array.from(new Set(coinTypes)).filter(function (coinType) { return !coinTypesBeingFetchedRef.current.includes(coinType); });
62
+ if (filteredCoinTypes.length === 0)
63
+ return [2 /*return*/];
64
+ (_a = coinTypesBeingFetchedRef.current).push.apply(_a, filteredCoinTypes);
65
+ return [4 /*yield*/, getCoinMetadataMap(filteredCoinTypes)];
66
+ case 1:
67
+ coinMetadataMap = _b.sent();
68
+ setCoinMetadataMap(function (prev) { return (__assign(__assign({}, (prev !== null && prev !== void 0 ? prev : {})), coinMetadataMap)); });
69
+ return [2 /*return*/];
70
+ }
71
+ });
72
+ }); })();
73
+ }, [coinTypes]);
74
+ return coinMetadataMap;
75
+ };
76
+ export default useCoinMetadataMap;
@@ -0,0 +1,2 @@
1
+ declare const useIsAndroid: () => boolean;
2
+ export default useIsAndroid;
@@ -0,0 +1,2 @@
1
+ var useIsAndroid = function () { return /android/i.test(navigator.userAgent); };
2
+ export default useIsAndroid;
@@ -0,0 +1,2 @@
1
+ declare const useIsTouchscreen: () => boolean;
2
+ export default useIsTouchscreen;
@@ -0,0 +1,7 @@
1
+ import { useMediaQuery } from "react-responsive";
2
+ var useIsTouchscreen = function () {
3
+ return useMediaQuery({
4
+ query: "(pointer: coarse)",
5
+ });
6
+ };
7
+ export default useIsTouchscreen;
@@ -0,0 +1,2 @@
1
+ declare const useIsiOS: () => boolean;
2
+ export default useIsiOS;
@@ -0,0 +1,7 @@
1
+ var useIsiOS = function () {
2
+ return /iPad/i.test(navigator.userAgent) ||
3
+ /iPhone/i.test(navigator.userAgent) ||
4
+ /iPod/i.test(navigator.userAgent) ||
5
+ (navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1);
6
+ }; // iPad iOS 13
7
+ export default useIsiOS;
@@ -0,0 +1,2 @@
1
+ declare const useRefreshOnBalancesChange: (refresh: () => Promise<void>) => void;
2
+ export default useRefreshOnBalancesChange;
@@ -0,0 +1,82 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
12
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ import { useEffect, useRef } from "react";
38
+ import { isEqual } from "lodash";
39
+ import { useSettingsContext, useWalletContext } from "../contexts";
40
+ var useRefreshOnBalancesChange = function (refresh) {
41
+ var suiClient = useSettingsContext().suiClient;
42
+ var address = useWalletContext().address;
43
+ var previousBalancesRef = useRef(undefined);
44
+ useEffect(function () {
45
+ if (!address)
46
+ return;
47
+ previousBalancesRef.current = undefined;
48
+ var interval = setInterval(function () { return __awaiter(void 0, void 0, void 0, function () {
49
+ var balances, err_1;
50
+ return __generator(this, function (_a) {
51
+ switch (_a.label) {
52
+ case 0:
53
+ _a.trys.push([0, 4, , 5]);
54
+ return [4 /*yield*/, suiClient.getAllBalances({
55
+ owner: address,
56
+ })];
57
+ case 1:
58
+ balances = _a.sent();
59
+ if (!(previousBalancesRef.current !== undefined &&
60
+ !isEqual(balances, previousBalancesRef.current))) return [3 /*break*/, 3];
61
+ return [4 /*yield*/, refresh()];
62
+ case 2:
63
+ _a.sent();
64
+ _a.label = 3;
65
+ case 3:
66
+ previousBalancesRef.current = balances;
67
+ return [3 /*break*/, 5];
68
+ case 4:
69
+ err_1 = _a.sent();
70
+ console.error(err_1);
71
+ return [3 /*break*/, 5];
72
+ case 5: return [2 /*return*/];
73
+ }
74
+ });
75
+ }); }, 1000 * 5);
76
+ return function () {
77
+ if (interval !== undefined)
78
+ clearInterval(interval);
79
+ };
80
+ }, [address, suiClient, refresh]);
81
+ };
82
+ export default useRefreshOnBalancesChange;
package/index.d.ts ADDED
@@ -0,0 +1,4 @@
1
+ export * from "./contexts";
2
+ export * from "./fetchers";
3
+ export * from "./hooks";
4
+ export * from "./lib";
package/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from "./contexts";
2
+ export * from "./fetchers";
3
+ export * from "./hooks";
4
+ export * from "./lib";
package/lib/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./router";
2
+ export * from "./toasts";
package/lib/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./router";
2
+ export * from "./toasts";
@@ -0,0 +1,4 @@
1
+ import { UrlObject } from "url";
2
+ import { NextRouter } from "next/router";
3
+ export declare const shallowPushQuery: (router: NextRouter, query: UrlObject["query"]) => Promise<boolean>;
4
+ export declare const shallowReplaceQuery: (router: NextRouter, query: UrlObject["query"]) => Promise<boolean>;
package/lib/router.js ADDED
@@ -0,0 +1,2 @@
1
+ export var shallowPushQuery = function (router, query) { return router.push({ query: query }, undefined, { shallow: true }); };
2
+ export var shallowReplaceQuery = function (router, query) { return router.replace({ query: query }, undefined, { shallow: true }); };
@@ -0,0 +1,5 @@
1
+ import { ExternalToast } from "sonner";
2
+ export declare const showSuccessToast: (title: string, data?: Omit<ExternalToast, "duration">, isTxn?: boolean) => void;
3
+ export declare const showInfoToast: (title: string, data?: Omit<ExternalToast, "duration">) => void;
4
+ export declare const showWarningToast: (title: string, data?: Omit<ExternalToast, "duration">) => void;
5
+ export declare const showErrorToast: (title: string, err: Error, data?: Omit<ExternalToast, "description" | "duration">, isTxn?: boolean) => void;
package/lib/toasts.jsx ADDED
@@ -0,0 +1,55 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ import BigNumber from "bignumber.js";
13
+ import { toast as sonnerToast } from "sonner";
14
+ import { TOAST_DURATION_MS, TX_TOAST_DURATION as TX_TOAST_DURATION_MS, formatToken, } from "@suilend/sui-fe";
15
+ var onDismiss = function (callback) {
16
+ for (var i = 0; i < 10; i++)
17
+ sonnerToast.dismiss();
18
+ setTimeout(function () {
19
+ callback();
20
+ }, 250);
21
+ };
22
+ export var showSuccessToast = function (title, data, isTxn) {
23
+ onDismiss(function () {
24
+ return sonnerToast.success(title, __assign(__assign({}, (data || {})), { duration: isTxn ? TX_TOAST_DURATION_MS : TOAST_DURATION_MS }));
25
+ });
26
+ };
27
+ export var showInfoToast = function (title, data) {
28
+ onDismiss(function () {
29
+ return sonnerToast.info(title, __assign(__assign({}, (data || {})), { duration: TOAST_DURATION_MS }));
30
+ });
31
+ };
32
+ export var showWarningToast = function (title, data) {
33
+ onDismiss(function () {
34
+ return sonnerToast.warning(title, __assign(__assign({}, (data || {})), { duration: TOAST_DURATION_MS }));
35
+ });
36
+ };
37
+ export var showErrorToast = function (title, err, data, isTxn) {
38
+ var description = (err === null || err === void 0 ? void 0 : err.message) || "An unknown error occurred";
39
+ // RPC errors
40
+ if (description.toLowerCase().includes("Invalid u256 value".toLowerCase()))
41
+ return;
42
+ // Insufficient SUI balance to pay for gas
43
+ if (description.toLowerCase().includes("Balance of gas object".toLowerCase())) {
44
+ var match = description.match(/Balance of gas object (\d+) is lower than the needed amount: (\d+)/);
45
+ if (match) {
46
+ var balanceRaw = match[1], neededAmountRaw = match[2];
47
+ description = "Insufficient SUI balance to pay for gas. Balance: ".concat(formatToken(new BigNumber(balanceRaw).div(Math.pow(10, 9)), { dp: 9, trimTrailingZeros: true }), " SUI. Required: ").concat(formatToken(new BigNumber(neededAmountRaw).div(Math.pow(10, 9)), { dp: 9, trimTrailingZeros: true }), " SUI");
48
+ }
49
+ }
50
+ if (description[0].toLowerCase() === description[0])
51
+ description = "".concat(description[0].toUpperCase()).concat(description.slice(1));
52
+ onDismiss(function () {
53
+ return sonnerToast.error(title, __assign(__assign({}, (data || {})), { description: description, duration: isTxn ? TX_TOAST_DURATION_MS : TOAST_DURATION_MS }));
54
+ });
55
+ };
package/package.json ADDED
@@ -0,0 +1 @@
1
+ {"name":"@suilend/sui-fe-next","version":"0.1.47","private":false,"description":"A collection of TypeScript frontend components and hooks","author":"Suilend","license":"MIT","main":"./index.js","exports":{".":"./index.js","./contexts/SettingsContext":"./contexts/SettingsContext.jsx","./contexts/WalletContext":"./contexts/WalletContext.jsx","./contexts":"./contexts/index.js","./fetchers":"./fetchers/index.js","./fetchers/useFetchBalances":"./fetchers/useFetchBalances.js","./hooks":"./hooks/index.js","./hooks/useCoinMetadataMap":"./hooks/useCoinMetadataMap.js","./hooks/useIsAndroid":"./hooks/useIsAndroid.jsx","./hooks/useIsTouchscreen":"./hooks/useIsTouchscreen.jsx","./hooks/useIsiOS":"./hooks/useIsiOS.jsx","./hooks/useRefreshOnBalancesChange":"./hooks/useRefreshOnBalancesChange.js","./lib":"./lib/index.js","./lib/router":"./lib/router.js","./lib/toasts":"./lib/toasts.jsx"},"types":"./index.js","scripts":{"build":"rm -rf ./dist && bun tsc","eslint":"eslint --fix \"./src/**/*.ts\"","prettier":"prettier --write \"./src/**/*\"","lint":"bun eslint && bun prettier && bun tsc --noEmit","release":"bun run build && bun ts-node ./release.ts && 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":{"@sentry/nextjs":"^8.38.0","@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.56.0","next":"^15.0.3","react":"18.3.1","react-dom":"18.3.1","react-responsive":"^10.0.0","shio-sdk":"^1.0.8","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/mixpanel-browser":"^2.50.2","@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":"0.16.0","@mysten/sui":"1.28.2","@mysten/wallet-standard":"0.14.7","@suilend/sui-fe":"^0.2.72"}}