@suilend/sui-fe-next 3.0.9 → 3.1.0
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/README.md +110 -5
- package/contexts/SettingsContext.d.ts +8 -1
- package/contexts/SettingsContext.jsx +55 -51
- package/contexts/WalletContext.d.ts +1 -1
- package/contexts/WalletContext.jsx +330 -463
- package/fetchers/useFetchBalances.js +32 -92
- package/hooks/keypair.d.ts +1 -1
- package/hooks/keypair.js +7 -7
- package/hooks/useCoinMetadataMap.js +12 -69
- package/hooks/useIsAndroid.jsx +1 -1
- package/hooks/useIsTouchscreen.jsx +3 -5
- package/hooks/useIsiOS.jsx +4 -6
- package/hooks/useLedgerHashDialog.js +16 -61
- package/hooks/useRefreshOnBalancesChange.js +28 -81
- package/lib/connector.js +32 -77
- package/lib/router.d.ts +1 -1
- package/lib/router.js +2 -2
- package/lib/toasts.jsx +32 -40
- package/lib/track.js +3 -3
- package/package.json +85 -1
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -1,50 +1,3 @@
|
|
|
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
1
|
import { normalizeStructTag } from "@mysten/sui/utils";
|
|
49
2
|
import BigNumber from "bignumber.js";
|
|
50
3
|
import useSWR from "swr";
|
|
@@ -52,56 +5,43 @@ import { useSettingsContext } from "../contexts/SettingsContext";
|
|
|
52
5
|
import { useWalletContext } from "../contexts/WalletContext";
|
|
53
6
|
import { showErrorToast } from "../lib/toasts";
|
|
54
7
|
export default function useFetchBalances() {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
cursor
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return [4 /*yield*/, suiGrpcClient.listBalances({
|
|
72
|
-
owner: address,
|
|
73
|
-
cursor: cursor,
|
|
74
|
-
})];
|
|
75
|
-
case 2:
|
|
76
|
-
result = _a.sent();
|
|
77
|
-
allBalances = allBalances.concat(result.balances);
|
|
78
|
-
cursor = result.cursor;
|
|
79
|
-
hasNextPage = result.hasNextPage;
|
|
80
|
-
return [3 /*break*/, 1];
|
|
81
|
-
case 3:
|
|
82
|
-
rawBalances = allBalances
|
|
83
|
-
.map(function (b) { return (__assign(__assign({}, b), { coinType: normalizeStructTag(b.coinType) })); })
|
|
84
|
-
.sort(function (a, b) { return (a.coinType < b.coinType ? -1 : 1); });
|
|
85
|
-
for (_i = 0, rawBalances_1 = rawBalances; _i < rawBalances_1.length; _i++) {
|
|
86
|
-
rawBalance = rawBalances_1[_i];
|
|
87
|
-
totalBalance = new BigNumber(rawBalance.balance);
|
|
88
|
-
if (totalBalance.gt(0))
|
|
89
|
-
balancesMap[rawBalance.coinType] = totalBalance;
|
|
90
|
-
}
|
|
91
|
-
_a.label = 4;
|
|
92
|
-
case 4: return [2 /*return*/, balancesMap];
|
|
8
|
+
const { suiGrpcClient } = useSettingsContext();
|
|
9
|
+
const { address } = useWalletContext();
|
|
10
|
+
const dataFetcher = async () => {
|
|
11
|
+
const balancesMap = {};
|
|
12
|
+
if (address) {
|
|
13
|
+
let allBalances = [];
|
|
14
|
+
let cursor = null;
|
|
15
|
+
let hasNextPage = true;
|
|
16
|
+
while (hasNextPage) {
|
|
17
|
+
const result = await suiGrpcClient.listBalances({
|
|
18
|
+
owner: address,
|
|
19
|
+
cursor,
|
|
20
|
+
});
|
|
21
|
+
allBalances = allBalances.concat(result.balances);
|
|
22
|
+
cursor = result.cursor;
|
|
23
|
+
hasNextPage = result.hasNextPage;
|
|
93
24
|
}
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
25
|
+
const rawBalances = allBalances
|
|
26
|
+
.map((b) => ({ ...b, coinType: normalizeStructTag(b.coinType) }))
|
|
27
|
+
.sort((a, b) => (a.coinType < b.coinType ? -1 : 1));
|
|
28
|
+
for (const rawBalance of rawBalances) {
|
|
29
|
+
const totalBalance = new BigNumber(rawBalance.balance);
|
|
30
|
+
if (totalBalance.gt(0))
|
|
31
|
+
balancesMap[rawBalance.coinType] = totalBalance;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return balancesMap;
|
|
35
|
+
};
|
|
36
|
+
const { data, mutate } = useSWR(`balances-${address}`, dataFetcher, {
|
|
97
37
|
refreshInterval: 15 * 1000,
|
|
98
|
-
onSuccess:
|
|
38
|
+
onSuccess: (data) => {
|
|
99
39
|
console.log("Refreshed wallet balances", data);
|
|
100
40
|
},
|
|
101
|
-
onError:
|
|
41
|
+
onError: (err) => {
|
|
102
42
|
showErrorToast("Failed to refresh wallet balances", err);
|
|
103
43
|
console.error(err);
|
|
104
44
|
},
|
|
105
|
-
})
|
|
106
|
-
return { data
|
|
45
|
+
});
|
|
46
|
+
return { data, mutateData: mutate };
|
|
107
47
|
}
|
package/hooks/keypair.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { LastSignedTransaction } from "@suilend/sui-fe";
|
|
2
2
|
export declare const useLastSignedTransaction: <T>(prefix: string) => {
|
|
3
|
-
lastSignedTransactionRef: import("react").
|
|
3
|
+
lastSignedTransactionRef: import("react").RefObject<LastSignedTransaction<T> | undefined>;
|
|
4
4
|
setLastSignedTransaction: (value: LastSignedTransaction<T> | undefined) => void;
|
|
5
5
|
};
|
package/hooks/keypair.js
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import { useRef } from "react";
|
|
2
2
|
// LAST SIGNED TRANSACTION
|
|
3
|
-
export
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
export const useLastSignedTransaction = (prefix) => {
|
|
4
|
+
const lastSignedTransactionRef = useRef((() => {
|
|
5
|
+
const value = window.localStorage.getItem(`${prefix}-lastSignedTransaction`);
|
|
6
6
|
return value !== null
|
|
7
7
|
? JSON.parse(value)
|
|
8
8
|
: undefined;
|
|
9
9
|
})());
|
|
10
|
-
|
|
10
|
+
const setLastSignedTransaction = (value) => {
|
|
11
11
|
console.log("[setLastSignedTransaction]", value);
|
|
12
12
|
lastSignedTransactionRef.current = value;
|
|
13
13
|
if (value === undefined)
|
|
14
|
-
window.localStorage.removeItem(
|
|
14
|
+
window.localStorage.removeItem(`${prefix}-lastSignedTransaction`);
|
|
15
15
|
else
|
|
16
|
-
window.localStorage.setItem(
|
|
16
|
+
window.localStorage.setItem(`${prefix}-lastSignedTransaction`, JSON.stringify(value));
|
|
17
17
|
};
|
|
18
|
-
return { lastSignedTransactionRef
|
|
18
|
+
return { lastSignedTransactionRef, setLastSignedTransaction };
|
|
19
19
|
};
|
|
@@ -1,75 +1,18 @@
|
|
|
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
1
|
import { useEffect, useRef, useState } from "react";
|
|
49
2
|
import { getCoinMetadataMap } from "@suilend/sui-fe";
|
|
50
|
-
|
|
3
|
+
const useCoinMetadataMap = (coinTypes) => {
|
|
51
4
|
// State
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
useEffect(
|
|
55
|
-
(
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
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
|
-
}); })();
|
|
5
|
+
const [coinMetadataMap, setCoinMetadataMap] = useState(undefined);
|
|
6
|
+
const coinTypesBeingFetchedRef = useRef([]);
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
(async () => {
|
|
9
|
+
const filteredCoinTypes = Array.from(new Set(coinTypes)).filter((coinType) => !coinTypesBeingFetchedRef.current.includes(coinType));
|
|
10
|
+
if (filteredCoinTypes.length === 0)
|
|
11
|
+
return;
|
|
12
|
+
coinTypesBeingFetchedRef.current.push(...filteredCoinTypes);
|
|
13
|
+
const coinMetadataMap = await getCoinMetadataMap(filteredCoinTypes);
|
|
14
|
+
setCoinMetadataMap((prev) => ({ ...(prev ?? {}), ...coinMetadataMap }));
|
|
15
|
+
})();
|
|
73
16
|
}, [coinTypes]);
|
|
74
17
|
return coinMetadataMap;
|
|
75
18
|
};
|
package/hooks/useIsAndroid.jsx
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
const useIsAndroid = () => /android/i.test(navigator.userAgent);
|
|
2
2
|
export default useIsAndroid;
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { useMediaQuery } from "react-responsive";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
});
|
|
6
|
-
};
|
|
2
|
+
const useIsTouchscreen = () => useMediaQuery({
|
|
3
|
+
query: "(pointer: coarse)",
|
|
4
|
+
});
|
|
7
5
|
export default useIsTouchscreen;
|
package/hooks/useIsiOS.jsx
CHANGED
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
(navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1);
|
|
6
|
-
}; // iPad iOS 13
|
|
1
|
+
const useIsiOS = () => /iPad/i.test(navigator.userAgent) ||
|
|
2
|
+
/iPhone/i.test(navigator.userAgent) ||
|
|
3
|
+
/iPod/i.test(navigator.userAgent) ||
|
|
4
|
+
(navigator.platform === "MacIntel" && navigator.maxTouchPoints > 1); // iPad iOS 13
|
|
7
5
|
export default useIsiOS;
|
|
@@ -1,71 +1,26 @@
|
|
|
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
1
|
import { useCallback, useState } from "react";
|
|
38
2
|
import { getLedgerHash } from "@suilend/sui-fe";
|
|
39
3
|
import { useSettingsContext } from "../contexts/SettingsContext";
|
|
40
4
|
import { useWalletContext } from "../contexts/WalletContext";
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
case 1:
|
|
57
|
-
transactionLedgerHash = _a.sent();
|
|
58
|
-
setLedgerHash(transactionLedgerHash);
|
|
59
|
-
setIsOpen(true);
|
|
60
|
-
return [2 /*return*/];
|
|
61
|
-
}
|
|
62
|
-
});
|
|
63
|
-
}); }, [address, isUsingLedger, suiGrpcClient]);
|
|
64
|
-
var close = useCallback(function () {
|
|
5
|
+
const useLedgerHashDialog = () => {
|
|
6
|
+
const { suiGrpcClient } = useSettingsContext();
|
|
7
|
+
const { address, isUsingLedger } = useWalletContext();
|
|
8
|
+
const [ledgerHash, setLedgerHash] = useState(undefined);
|
|
9
|
+
const [isOpen, setIsOpen] = useState(false);
|
|
10
|
+
const open = useCallback(async (transaction) => {
|
|
11
|
+
if (!address)
|
|
12
|
+
return;
|
|
13
|
+
if (!isUsingLedger)
|
|
14
|
+
return;
|
|
15
|
+
const transactionLedgerHash = await getLedgerHash(address, transaction, suiGrpcClient);
|
|
16
|
+
setLedgerHash(transactionLedgerHash);
|
|
17
|
+
setIsOpen(true);
|
|
18
|
+
}, [address, isUsingLedger, suiGrpcClient]);
|
|
19
|
+
const close = useCallback(() => {
|
|
65
20
|
setIsOpen(false);
|
|
66
21
|
}, []);
|
|
67
22
|
return {
|
|
68
|
-
ledgerHash
|
|
23
|
+
ledgerHash,
|
|
69
24
|
isLedgerHashDialogOpen: isOpen,
|
|
70
25
|
openLedgerHashDialog: open,
|
|
71
26
|
closeLedgerHashDialog: close,
|
|
@@ -1,92 +1,39 @@
|
|
|
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
1
|
import { useEffect, useRef } from "react";
|
|
38
2
|
import { isEqual } from "lodash";
|
|
39
3
|
import { useSettingsContext } from "../contexts/SettingsContext";
|
|
40
4
|
import { useWalletContext } from "../contexts/WalletContext";
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
useEffect(
|
|
5
|
+
const useRefreshOnBalancesChange = (refresh) => {
|
|
6
|
+
const { suiGrpcClient } = useSettingsContext();
|
|
7
|
+
const { address } = useWalletContext();
|
|
8
|
+
const previousBalancesRef = useRef(undefined);
|
|
9
|
+
useEffect(() => {
|
|
46
10
|
if (!address)
|
|
47
11
|
return;
|
|
48
12
|
previousBalancesRef.current = undefined;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
owner: address,
|
|
63
|
-
cursor: cursor,
|
|
64
|
-
})];
|
|
65
|
-
case 2:
|
|
66
|
-
result = _a.sent();
|
|
67
|
-
allBalances = allBalances.concat(result.balances);
|
|
68
|
-
cursor = result.cursor;
|
|
69
|
-
hasNextPage = result.hasNextPage;
|
|
70
|
-
return [3 /*break*/, 1];
|
|
71
|
-
case 3:
|
|
72
|
-
if (!(previousBalancesRef.current !== undefined &&
|
|
73
|
-
!isEqual(allBalances, previousBalancesRef.current))) return [3 /*break*/, 5];
|
|
74
|
-
return [4 /*yield*/, refresh()];
|
|
75
|
-
case 4:
|
|
76
|
-
_a.sent();
|
|
77
|
-
_a.label = 5;
|
|
78
|
-
case 5:
|
|
79
|
-
previousBalancesRef.current = allBalances;
|
|
80
|
-
return [3 /*break*/, 7];
|
|
81
|
-
case 6:
|
|
82
|
-
err_1 = _a.sent();
|
|
83
|
-
console.error(err_1);
|
|
84
|
-
return [3 /*break*/, 7];
|
|
85
|
-
case 7: return [2 /*return*/];
|
|
13
|
+
const interval = setInterval(async () => {
|
|
14
|
+
try {
|
|
15
|
+
let allBalances = [];
|
|
16
|
+
let cursor = null;
|
|
17
|
+
let hasNextPage = true;
|
|
18
|
+
while (hasNextPage) {
|
|
19
|
+
const result = await suiGrpcClient.listBalances({
|
|
20
|
+
owner: address,
|
|
21
|
+
cursor,
|
|
22
|
+
});
|
|
23
|
+
allBalances = allBalances.concat(result.balances);
|
|
24
|
+
cursor = result.cursor;
|
|
25
|
+
hasNextPage = result.hasNextPage;
|
|
86
26
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
27
|
+
if (previousBalancesRef.current !== undefined &&
|
|
28
|
+
!isEqual(allBalances, previousBalancesRef.current))
|
|
29
|
+
await refresh();
|
|
30
|
+
previousBalancesRef.current = allBalances;
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
console.error(err);
|
|
34
|
+
}
|
|
35
|
+
}, 1000 * 5);
|
|
36
|
+
return () => {
|
|
90
37
|
if (interval !== undefined)
|
|
91
38
|
clearInterval(interval);
|
|
92
39
|
};
|
package/lib/connector.js
CHANGED
|
@@ -1,81 +1,36 @@
|
|
|
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
1
|
import { UniversalConnector } from "@reown/appkit-universal-connector";
|
|
38
2
|
// Get projectId from https://dashboard.reown.com
|
|
39
|
-
export
|
|
40
|
-
export function getUniversalConnector(rpcUrl) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
events: [],
|
|
71
|
-
namespace: "sui",
|
|
72
|
-
},
|
|
73
|
-
],
|
|
74
|
-
})];
|
|
75
|
-
case 1:
|
|
76
|
-
universalConnector = _a.sent();
|
|
77
|
-
return [2 /*return*/, universalConnector];
|
|
78
|
-
}
|
|
79
|
-
});
|
|
3
|
+
export const projectId = "eebad6a56ec8b3f08b70175934d35a9d";
|
|
4
|
+
export async function getUniversalConnector(rpcUrl) {
|
|
5
|
+
const universalConnector = await UniversalConnector.init({
|
|
6
|
+
projectId,
|
|
7
|
+
metadata: {
|
|
8
|
+
name: "Suilend",
|
|
9
|
+
description: "Sui's DeFi Suite",
|
|
10
|
+
url: "https://suilend.fi/",
|
|
11
|
+
icons: ["https://suilend.fi/favicon.ico"],
|
|
12
|
+
},
|
|
13
|
+
networks: [
|
|
14
|
+
{
|
|
15
|
+
methods: [
|
|
16
|
+
"sui_signPersonalMessage",
|
|
17
|
+
"sui_signTransaction",
|
|
18
|
+
"sui_signAndExecuteTransaction",
|
|
19
|
+
],
|
|
20
|
+
chains: [
|
|
21
|
+
{
|
|
22
|
+
id: 784,
|
|
23
|
+
chainNamespace: "sui",
|
|
24
|
+
caipNetworkId: "sui:mainnet",
|
|
25
|
+
name: "Sui",
|
|
26
|
+
nativeCurrency: { name: "SUI", symbol: "SUI", decimals: 9 },
|
|
27
|
+
rpcUrls: { default: { http: [rpcUrl] } },
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
events: [],
|
|
31
|
+
namespace: "sui",
|
|
32
|
+
},
|
|
33
|
+
],
|
|
80
34
|
});
|
|
35
|
+
return universalConnector;
|
|
81
36
|
}
|
package/lib/router.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { UrlObject } from "url";
|
|
1
|
+
import { UrlObject } from "node:url";
|
|
2
2
|
import { NextRouter } from "next/router";
|
|
3
3
|
export declare const shallowPushQuery: (router: NextRouter, query: UrlObject["query"]) => Promise<boolean>;
|
|
4
4
|
export declare const shallowReplaceQuery: (router: NextRouter, query: UrlObject["query"]) => Promise<boolean>;
|
package/lib/router.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export
|
|
2
|
-
export
|
|
1
|
+
export const shallowPushQuery = (router, query) => router.push({ query }, undefined, { shallow: true });
|
|
2
|
+
export const shallowReplaceQuery = (router, query) => router.replace({ query }, undefined, { shallow: true });
|