@coin-voyage/crypto 2.4.4 → 2.4.5-beta.1
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/evm/use-sign-in-with-evm.js +2 -2
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/use-account-disconnect.js +3 -3
- package/dist/hooks/use-account.d.ts +2 -2
- package/dist/hooks/use-account.js +14 -26
- package/dist/hooks/use-connect-callback.js +2 -1
- package/dist/hooks/use-installed-wallets.js +9 -6
- package/dist/hooks/use-sui-ns-name.d.ts +3 -0
- package/dist/hooks/use-sui-ns-name.js +18 -0
- package/dist/hooks/use-universal-connect.js +7 -11
- package/dist/sui/index.d.ts +1 -1
- package/dist/sui/index.js +1 -1
- package/dist/sui/provider/base-provider.js +4 -6
- package/dist/sui/provider/dapp-kit.d.ts +9 -0
- package/dist/sui/provider/dapp-kit.js +28 -0
- package/dist/sui/provider/provider.js +3 -3
- package/dist/sui/use-sign-in-with-sui.js +40 -24
- package/dist/sui/use-sui-transaction.js +27 -40
- package/dist/types/wallet-connector.d.ts +2 -2
- package/dist/types/wallet.d.ts +6 -3
- package/dist/utils/connector.d.ts +1 -1
- package/dist/utils/connector.js +3 -4
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.js +1 -0
- package/dist/utils/nonce.d.ts +1 -0
- package/dist/utils/nonce.js +4 -0
- package/dist/utxo/create-utxo-transport.d.ts +1 -1
- package/package.json +14 -8
- package/dist/sui/client.d.ts +0 -2
- package/dist/sui/client.js +0 -2
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { randomStringForEntropy } from "@stablelib/random";
|
|
2
1
|
import { useCallback, useMemo } from "react";
|
|
3
2
|
import { useAccount, useConnect, useConnectors, useSignMessage } from "wagmi";
|
|
4
3
|
import { isWalletInstalled } from "../utils/is-wallet-installed";
|
|
5
4
|
import { toMessage } from "../utils/message";
|
|
5
|
+
import { generateNonce as generateDefaultNonce } from "../utils/nonce";
|
|
6
6
|
import { toBaseConnector } from "./utils";
|
|
7
7
|
export function useSignInWithEvm({ signIn, onError, generateNonce }) {
|
|
8
8
|
const { address, connector, isConnected } = useAccount();
|
|
@@ -13,7 +13,7 @@ export function useSignInWithEvm({ signIn, onError, generateNonce }) {
|
|
|
13
13
|
.filter((c) => isWalletInstalled(c.id))
|
|
14
14
|
.map(toBaseConnector), [connectors]);
|
|
15
15
|
const handleSignature = useCallback(async (address) => {
|
|
16
|
-
const nonce = generateNonce ? await generateNonce() :
|
|
16
|
+
const nonce = generateNonce ? await generateNonce() : generateDefaultNonce();
|
|
17
17
|
const msg = {
|
|
18
18
|
domain: window.location.host,
|
|
19
19
|
address,
|
package/dist/hooks/index.d.ts
CHANGED
package/dist/hooks/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { disconnect as utxoDisconnect } from "@bigmi/client";
|
|
2
2
|
import { useConfig as useBigmiConfig } from "@bigmi/react";
|
|
3
3
|
import { ChainType } from "@coin-voyage/shared/types";
|
|
4
|
-
import {
|
|
4
|
+
import { useDAppKit } from "@mysten/dapp-kit-react";
|
|
5
5
|
import { useWallet } from "@solana/wallet-adapter-react";
|
|
6
6
|
import { useDisconnect } from "wagmi";
|
|
7
7
|
import { useAccount } from "./use-account";
|
|
@@ -10,7 +10,7 @@ export const useAccountDisconnect = () => {
|
|
|
10
10
|
const bigmiConfig = useBigmiConfig();
|
|
11
11
|
const { disconnectAsync } = useDisconnect();
|
|
12
12
|
const { disconnect: solanaDisconnect } = useWallet();
|
|
13
|
-
const {
|
|
13
|
+
const { disconnectWallet } = useDAppKit();
|
|
14
14
|
const disconnect = async (chainType) => {
|
|
15
15
|
switch (chainType) {
|
|
16
16
|
case ChainType.EVM:
|
|
@@ -20,7 +20,7 @@ export const useAccountDisconnect = () => {
|
|
|
20
20
|
case ChainType.SOL:
|
|
21
21
|
return solanaDisconnect();
|
|
22
22
|
case ChainType.SUI:
|
|
23
|
-
return
|
|
23
|
+
return disconnectWallet();
|
|
24
24
|
default:
|
|
25
25
|
return Promise.resolve();
|
|
26
26
|
}
|
|
@@ -4,7 +4,7 @@ import { ChainType } from "@coin-voyage/shared/types";
|
|
|
4
4
|
import type { Connector } from "wagmi";
|
|
5
5
|
import type { WalletAdapterExtended } from "../solana/types";
|
|
6
6
|
import type { WalletProps } from "../types/wallet";
|
|
7
|
-
import { SuiConnector } from "../types/wallet-connector";
|
|
7
|
+
import type { SuiConnector } from "../types/wallet-connector";
|
|
8
8
|
interface AccountBase<CT extends ChainType, ConnectorType = undefined> {
|
|
9
9
|
address?: string;
|
|
10
10
|
addresses?: readonly string[];
|
|
@@ -63,7 +63,7 @@ interface UseAccountArgs {
|
|
|
63
63
|
* 4. Falls back to a default disconnected account if no accounts are connected
|
|
64
64
|
*
|
|
65
65
|
* The hook internally queries all chain-specific wallet providers (wagmi for EVM, @solana/wallet-adapter-react for Solana,
|
|
66
|
-
* @bigmi/react for Bitcoin, and @mysten/dapp-kit for Sui) and normalizes their responses into a unified Account type.
|
|
66
|
+
* @bigmi/react for Bitcoin, and @mysten/dapp-kit-react for Sui) and normalizes their responses into a unified Account type.
|
|
67
67
|
*/
|
|
68
68
|
export declare const useAccount: (args?: UseAccountArgs) => {
|
|
69
69
|
account: Account;
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { useConfig as useBigmiConfig } from "@bigmi/react";
|
|
1
|
+
import { useAccount as useBTCAccount } from "@bigmi/react";
|
|
3
2
|
import { ChainId, ChainType } from "@coin-voyage/shared/types";
|
|
4
|
-
import {
|
|
3
|
+
import { useWalletConnection } from "@mysten/dapp-kit-react";
|
|
5
4
|
import { useWallet } from "@solana/wallet-adapter-react";
|
|
6
|
-
import { useCallback, useRef, useSyncExternalStore } from "react";
|
|
7
5
|
import { useAccount as useAccountInternal } from "wagmi";
|
|
8
6
|
import { getConnector } from "../utils/connector";
|
|
9
7
|
import { extendsWalletAdapter } from "../solana/utils";
|
|
@@ -39,13 +37,13 @@ const buildSolanaAccount = (wallet) => {
|
|
|
39
37
|
status: wallet?.adapter.connecting ? "connecting" : "disconnected",
|
|
40
38
|
};
|
|
41
39
|
};
|
|
42
|
-
const buildSuiAccount = (
|
|
43
|
-
if (
|
|
40
|
+
const buildSuiAccount = (suiConnection) => {
|
|
41
|
+
if (suiConnection && suiConnection.isConnected) {
|
|
44
42
|
return {
|
|
45
|
-
address:
|
|
43
|
+
address: suiConnection.account.address,
|
|
46
44
|
chainId: ChainId.SUI,
|
|
47
45
|
chainType: ChainType.SUI,
|
|
48
|
-
connector:
|
|
46
|
+
connector: suiConnection.wallet,
|
|
49
47
|
isConnected: true,
|
|
50
48
|
isConnecting: false,
|
|
51
49
|
isReconnecting: false,
|
|
@@ -56,10 +54,10 @@ const buildSuiAccount = (suiWallet, suiAccount) => {
|
|
|
56
54
|
return {
|
|
57
55
|
chainType: ChainType.SUI,
|
|
58
56
|
isConnected: false,
|
|
59
|
-
isConnecting:
|
|
60
|
-
isReconnecting:
|
|
61
|
-
isDisconnected:
|
|
62
|
-
status:
|
|
57
|
+
isConnecting: suiConnection.isConnecting,
|
|
58
|
+
isReconnecting: suiConnection.isReconnecting,
|
|
59
|
+
isDisconnected: suiConnection.isDisconnected,
|
|
60
|
+
status: suiConnection.status,
|
|
63
61
|
};
|
|
64
62
|
};
|
|
65
63
|
const buildEvmAccount = (wagmiAccount) => {
|
|
@@ -108,31 +106,21 @@ const buildUtxoAccount = (btcAccount) => {
|
|
|
108
106
|
* 4. Falls back to a default disconnected account if no accounts are connected
|
|
109
107
|
*
|
|
110
108
|
* The hook internally queries all chain-specific wallet providers (wagmi for EVM, @solana/wallet-adapter-react for Solana,
|
|
111
|
-
* @bigmi/react for Bitcoin, and @mysten/dapp-kit for Sui) and normalizes their responses into a unified Account type.
|
|
109
|
+
* @bigmi/react for Bitcoin, and @mysten/dapp-kit-react for Sui) and normalizes their responses into a unified Account type.
|
|
112
110
|
*/
|
|
113
111
|
export const useAccount = (args) => {
|
|
114
112
|
const { lastConnector } = useLastConnector();
|
|
115
113
|
const wagmiAccount = useAccountInternal();
|
|
116
114
|
const { wallet } = useWallet();
|
|
117
|
-
const
|
|
118
|
-
const
|
|
119
|
-
const btcConfig = useBigmiConfig();
|
|
120
|
-
const btcSnapshotCache = useRef(getBtcAccount(btcConfig));
|
|
121
|
-
const btcSubscribe = useCallback((onChange) => watchBtcAccount(btcConfig, {
|
|
122
|
-
onChange: () => {
|
|
123
|
-
btcSnapshotCache.current = getBtcAccount(btcConfig);
|
|
124
|
-
onChange();
|
|
125
|
-
},
|
|
126
|
-
}), [btcConfig]);
|
|
127
|
-
const btcGetSnapshot = useCallback(() => btcSnapshotCache.current, []);
|
|
128
|
-
const btcAccount = useSyncExternalStore(btcSubscribe, btcGetSnapshot, btcGetSnapshot);
|
|
115
|
+
const suiConnection = useWalletConnection();
|
|
116
|
+
const btcAccount = useBTCAccount();
|
|
129
117
|
const lastConnectedAccount = args?.selectedWallet
|
|
130
118
|
? getConnector(args?.selectedWallet.connectors, args.chainType ?? lastConnector?.chainType)
|
|
131
119
|
: undefined;
|
|
132
120
|
const accounts = [
|
|
133
121
|
buildEvmAccount(wagmiAccount),
|
|
134
122
|
buildSolanaAccount(wallet),
|
|
135
|
-
buildSuiAccount(
|
|
123
|
+
buildSuiAccount(suiConnection),
|
|
136
124
|
buildUtxoAccount(btcAccount),
|
|
137
125
|
];
|
|
138
126
|
const connectedAccounts = accounts.filter((account) => account.isConnected);
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { useEffect, useRef } from "react";
|
|
2
2
|
import { useAccount } from "./use-account";
|
|
3
|
+
import { getConnectorId } from "../utils";
|
|
3
4
|
export const useConnectCallback = ({ onConnect, onDisconnect, onConnectValidation, setAllowedWallets, }) => {
|
|
4
5
|
const { account } = useAccount();
|
|
5
6
|
const address = account?.address;
|
|
6
7
|
const chainId = account?.chainId;
|
|
7
8
|
const chainType = account?.chainType;
|
|
8
|
-
const connectorId = account?.connector
|
|
9
|
+
const connectorId = getConnectorId(account?.connector);
|
|
9
10
|
const isConnected = !!account?.isConnected;
|
|
10
11
|
const activeAccountRef = useRef(null);
|
|
11
12
|
// keep stable references for callbacks
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { useConfig as useBigmiConfig } from "@bigmi/react";
|
|
2
2
|
import { ChainType } from "@coin-voyage/shared/types";
|
|
3
|
-
import { useWallets } from "@mysten/dapp-kit";
|
|
3
|
+
import { useWallets } from "@mysten/dapp-kit-react";
|
|
4
4
|
import { WalletReadyState } from "@solana/wallet-adapter-base";
|
|
5
5
|
import { useWallet } from "@solana/wallet-adapter-react";
|
|
6
6
|
import { useContext, useMemo } from "react";
|
|
7
7
|
import { WagmiContext } from "wagmi";
|
|
8
|
+
import { extendsWalletAdapter } from "../solana/utils";
|
|
8
9
|
import { getConnectorIcon } from "../utils/get-connector-icon";
|
|
9
10
|
import { getWalletPriority } from "../utils/get-wallet-priority";
|
|
10
11
|
import { isWalletInstalled } from "../utils/is-wallet-installed";
|
|
11
|
-
|
|
12
|
-
// canonical wallet ID for multi-chain wallets
|
|
12
|
+
// canonical wallet ID for multi-chain wallets
|
|
13
13
|
const getCanonicalWalletId = (idOrName) => {
|
|
14
14
|
const lower = idOrName.toLowerCase();
|
|
15
15
|
// Explicit multi-chain wallet mapping
|
|
@@ -24,12 +24,12 @@ const getCanonicalWalletId = (idOrName) => {
|
|
|
24
24
|
export const useInstalledWallets = (filterChainType) => {
|
|
25
25
|
const bigmiConfig = useBigmiConfig?.() ?? null;
|
|
26
26
|
const wagmiConfig = useContext(WagmiContext) ?? null;
|
|
27
|
-
const suiWallets = useWallets
|
|
27
|
+
const suiWallets = useWallets();
|
|
28
28
|
const solanaWallets = useWallet()?.wallets;
|
|
29
29
|
return useMemo(() => {
|
|
30
30
|
const shouldInclude = (chainType) => !filterChainType || filterChainType === chainType;
|
|
31
31
|
const installedUTXO = shouldInclude(ChainType.UTXO)
|
|
32
|
-
? bigmiConfig?.connectors.filter((c) => isWalletInstalled(c.id)) ?? []
|
|
32
|
+
? (bigmiConfig?.connectors.filter((c) => isWalletInstalled(c.id)) ?? [])
|
|
33
33
|
: [];
|
|
34
34
|
const installedEVM = shouldInclude(ChainType.EVM)
|
|
35
35
|
? Array.from(wagmiConfig?.connectors ?? []).filter((c) => isWalletInstalled(c.id))
|
|
@@ -56,7 +56,10 @@ const combineWalletLists = (utxoConnectorList, evmConnectorList, solanaWalletLis
|
|
|
56
56
|
}
|
|
57
57
|
};
|
|
58
58
|
utxoConnectorList.forEach((utxo) => {
|
|
59
|
-
addConnector(utxo.id, utxo.name, getConnectorIcon(utxo), {
|
|
59
|
+
addConnector(utxo.id, utxo.name, getConnectorIcon(utxo), {
|
|
60
|
+
connector: utxo,
|
|
61
|
+
chainType: ChainType.UTXO,
|
|
62
|
+
});
|
|
60
63
|
});
|
|
61
64
|
evmConnectorList.forEach((evm) => {
|
|
62
65
|
const name = evm?.displayName || evm?.name;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { useCurrentClient } from "@mysten/dapp-kit-react";
|
|
2
|
+
import { useQuery } from "@tanstack/react-query";
|
|
3
|
+
export function useSuiNSName(address, options) {
|
|
4
|
+
const client = useCurrentClient();
|
|
5
|
+
return useQuery({
|
|
6
|
+
queryKey: ["sui-default-name", client.network, address],
|
|
7
|
+
queryFn: async ({ signal }) => {
|
|
8
|
+
if (!address)
|
|
9
|
+
return null;
|
|
10
|
+
const result = await client.core.defaultNameServiceName({
|
|
11
|
+
address,
|
|
12
|
+
signal,
|
|
13
|
+
});
|
|
14
|
+
return result.data.name;
|
|
15
|
+
},
|
|
16
|
+
enabled: (options?.enabled ?? true) && Boolean(address),
|
|
17
|
+
});
|
|
18
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useConfig as useBigmiConfig, useConnect as useUTXOConnect } from "@bigmi/react";
|
|
2
2
|
import { ChainId, ChainType } from "@coin-voyage/shared/types";
|
|
3
|
-
import {
|
|
3
|
+
import { useDAppKit } from "@mysten/dapp-kit-react";
|
|
4
4
|
import { useWallet } from "@solana/wallet-adapter-react";
|
|
5
5
|
import { useCallback } from "react";
|
|
6
6
|
import { useConfig as useWagmiConfig, useConnect as useWagmiConnect } from "wagmi";
|
|
@@ -10,7 +10,7 @@ export const useUniversalConnect = (props) => {
|
|
|
10
10
|
const evmConfig = useWagmiConfig();
|
|
11
11
|
const { updateLastConnectorId } = useLastConnector();
|
|
12
12
|
const { select, disconnect, connected } = useWallet();
|
|
13
|
-
const {
|
|
13
|
+
const { connectWallet } = useDAppKit();
|
|
14
14
|
const { onError, onSuccess, onSettled, onMutate } = props || {};
|
|
15
15
|
const { connectAsync } = useWagmiConnect({
|
|
16
16
|
config: evmConfig,
|
|
@@ -87,16 +87,12 @@ export const useUniversalConnect = (props) => {
|
|
|
87
87
|
break;
|
|
88
88
|
}
|
|
89
89
|
case ChainType.SUI:
|
|
90
|
-
await
|
|
90
|
+
const data = await connectWallet({
|
|
91
91
|
wallet: connector,
|
|
92
|
-
}, {
|
|
93
|
-
onError,
|
|
94
|
-
onSuccess: async (data) => {
|
|
95
|
-
updateLastConnectorId(connector, ChainType.SUI);
|
|
96
|
-
onSuccess?.(data, { connector });
|
|
97
|
-
},
|
|
98
|
-
onSettled: onSettled,
|
|
99
92
|
});
|
|
93
|
+
updateLastConnectorId(connector, ChainType.SUI);
|
|
94
|
+
onSuccess?.(data, { connector });
|
|
95
|
+
onSettled?.(data);
|
|
100
96
|
break;
|
|
101
97
|
default:
|
|
102
98
|
throw new Error(`Unsupported chain type: ${chainType}`);
|
|
@@ -108,7 +104,7 @@ export const useUniversalConnect = (props) => {
|
|
|
108
104
|
}, [
|
|
109
105
|
connectAsync,
|
|
110
106
|
utxoConnectAsync,
|
|
111
|
-
|
|
107
|
+
connectWallet,
|
|
112
108
|
connected,
|
|
113
109
|
disconnect,
|
|
114
110
|
select,
|
package/dist/sui/index.d.ts
CHANGED
package/dist/sui/index.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { DAppKitProvider } from "@mysten/dapp-kit-react";
|
|
3
3
|
import { useMemo } from "react";
|
|
4
|
+
import { createCoinVoyageDAppKit, dAppKit as defaultDAppKit } from "./dapp-kit";
|
|
4
5
|
export function SuiBaseProvider({ children, config, }) {
|
|
5
|
-
const
|
|
6
|
-
return
|
|
7
|
-
mainnet: { url: config?.rpcUrl ?? "https://fullnode.mainnet.sui.io:443" },
|
|
8
|
-
devnet: { url: "https://fullnode.devnet.sui.io:443" },
|
|
9
|
-
}, defaultNetwork: "mainnet", children: _jsx(WalletProvider, { ...suiConfig?.walletConfiguration, storageKey: suiConfig?.walletConfiguration?.storageKey || "@coin-voyage/sui-wallet", autoConnect: suiConfig?.walletConfiguration?.autoConnect, children: children }) }));
|
|
6
|
+
const dAppKit = useMemo(() => (config ? createCoinVoyageDAppKit(config) : defaultDAppKit), [config]);
|
|
7
|
+
return _jsx(DAppKitProvider, { dAppKit: dAppKit, children: children });
|
|
10
8
|
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { SuiGrpcClient } from "@mysten/sui/grpc";
|
|
2
|
+
import type { SuiConfiguration } from "../../types/wallet";
|
|
3
|
+
export declare function createCoinVoyageDAppKit(config?: SuiConfiguration): import("@mysten/dapp-kit-react").DAppKit<("mainnet" | "devnet")[], SuiGrpcClient>;
|
|
4
|
+
export declare const dAppKit: import("@mysten/dapp-kit-react").DAppKit<("mainnet" | "devnet")[], SuiGrpcClient>;
|
|
5
|
+
declare module "@mysten/dapp-kit-react" {
|
|
6
|
+
interface Register {
|
|
7
|
+
dAppKit: typeof dAppKit;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { createDAppKit } from "@mysten/dapp-kit-react";
|
|
2
|
+
import { SuiGrpcClient } from "@mysten/sui/grpc";
|
|
3
|
+
const DEFAULT_STORAGE_KEY = "@coin-voyage/sui-wallet";
|
|
4
|
+
const GRPC_URLS = {
|
|
5
|
+
mainnet: "https://fullnode.mainnet.sui.io:443",
|
|
6
|
+
devnet: "https://fullnode.devnet.sui.io:443",
|
|
7
|
+
};
|
|
8
|
+
export function createCoinVoyageDAppKit(config) {
|
|
9
|
+
const walletConfiguration = config?.walletConfiguration;
|
|
10
|
+
const grpcUrls = {
|
|
11
|
+
...GRPC_URLS,
|
|
12
|
+
...(config?.grpcUrl ? { mainnet: config.grpcUrl } : {}),
|
|
13
|
+
};
|
|
14
|
+
return createDAppKit({
|
|
15
|
+
networks: ["mainnet", "devnet"],
|
|
16
|
+
defaultNetwork: "mainnet",
|
|
17
|
+
createClient(network) {
|
|
18
|
+
return new SuiGrpcClient({ network, baseUrl: grpcUrls[network] });
|
|
19
|
+
},
|
|
20
|
+
autoConnect: walletConfiguration?.autoConnect ?? false,
|
|
21
|
+
enableBurnerWallet: walletConfiguration?.enableBurnerWallet,
|
|
22
|
+
slushWalletConfig: walletConfiguration?.slushWalletConfig,
|
|
23
|
+
storage: walletConfiguration?.storage,
|
|
24
|
+
storageKey: walletConfiguration?.storageKey ?? DEFAULT_STORAGE_KEY,
|
|
25
|
+
walletInitializers: walletConfiguration?.walletInitializers,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
export const dAppKit = createCoinVoyageDAppKit();
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { useDAppKit } from "@mysten/dapp-kit-react";
|
|
3
3
|
import { SuiBaseProvider } from "./base-provider";
|
|
4
4
|
import { SuiExternalContext } from "./external-context";
|
|
5
5
|
export function useInSuiContext() {
|
|
6
6
|
try {
|
|
7
|
-
|
|
8
|
-
return
|
|
7
|
+
useDAppKit();
|
|
8
|
+
return true;
|
|
9
9
|
}
|
|
10
10
|
catch {
|
|
11
11
|
return false;
|
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { randomStringForEntropy } from "@stablelib/random";
|
|
1
|
+
import { getWalletUniqueIdentifier, useCurrentAccount, useCurrentWallet, useDAppKit, useWalletConnection, useWallets, } from "@mysten/dapp-kit-react";
|
|
3
2
|
import { toMessage } from "../utils/message";
|
|
3
|
+
import { generateNonce as generateDefaultNonce } from "../utils/nonce";
|
|
4
4
|
export function useSignInWithSui({ signIn, onError, generateNonce }) {
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const
|
|
5
|
+
const dAppKit = useDAppKit();
|
|
6
|
+
const currentWallet = useCurrentWallet();
|
|
7
|
+
const currentAccount = useCurrentAccount();
|
|
8
|
+
const connection = useWalletConnection();
|
|
8
9
|
const wallets = useWallets();
|
|
10
|
+
const handleError = (error) => {
|
|
11
|
+
onError?.(error instanceof Error ? error : new Error(String(error)));
|
|
12
|
+
};
|
|
9
13
|
const handleSignature = async (address) => {
|
|
10
|
-
const nonce = generateNonce ? await generateNonce() :
|
|
14
|
+
const nonce = generateNonce ? await generateNonce() : generateDefaultNonce();
|
|
11
15
|
const msg = {
|
|
12
16
|
domain: window.location.host,
|
|
13
17
|
address,
|
|
@@ -17,32 +21,44 @@ export function useSignInWithSui({ signIn, onError, generateNonce }) {
|
|
|
17
21
|
version: "1",
|
|
18
22
|
};
|
|
19
23
|
const message = toMessage(msg, "Sui");
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
24
|
+
try {
|
|
25
|
+
const result = await dAppKit.signPersonalMessage({ message: new TextEncoder().encode(message) });
|
|
26
|
+
signIn({
|
|
27
|
+
address,
|
|
28
|
+
message,
|
|
29
|
+
domain: window.location.host,
|
|
30
|
+
signature: result.signature,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
handleError(error);
|
|
35
|
+
}
|
|
31
36
|
};
|
|
32
37
|
const onSelect = async (id) => {
|
|
33
|
-
const selectedWallet = wallets.find((w) => w
|
|
38
|
+
const selectedWallet = wallets.find((w) => getWalletUniqueIdentifier(w) === id);
|
|
34
39
|
if (!selectedWallet)
|
|
35
40
|
return;
|
|
36
|
-
if (currentWallet
|
|
37
|
-
|
|
41
|
+
if (currentWallet &&
|
|
42
|
+
getWalletUniqueIdentifier(currentWallet) === getWalletUniqueIdentifier(selectedWallet) &&
|
|
43
|
+
connection.isConnected &&
|
|
44
|
+
currentAccount?.address) {
|
|
45
|
+
await handleSignature(currentAccount.address);
|
|
38
46
|
return;
|
|
39
47
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
48
|
+
try {
|
|
49
|
+
const res = await dAppKit.connectWallet({ wallet: selectedWallet });
|
|
50
|
+
const address = res.accounts[0]?.address;
|
|
51
|
+
if (!address) {
|
|
52
|
+
throw new Error("No Sui account returned from wallet connection");
|
|
53
|
+
}
|
|
54
|
+
await handleSignature(address);
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
handleError(error);
|
|
58
|
+
}
|
|
43
59
|
};
|
|
44
60
|
const toBaseConnector = (wallet) => ({
|
|
45
|
-
id: wallet
|
|
61
|
+
id: getWalletUniqueIdentifier(wallet),
|
|
46
62
|
name: wallet.name,
|
|
47
63
|
icon: wallet.icon,
|
|
48
64
|
});
|
|
@@ -1,32 +1,29 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useCurrentClient, useDAppKit } from "@mysten/dapp-kit-react";
|
|
2
2
|
import { Transaction } from "@mysten/sui/transactions";
|
|
3
|
+
import { fromBase64 } from "@mysten/sui/utils";
|
|
3
4
|
import { SUI_PACKAGE_IDS } from "./constants";
|
|
4
5
|
export function useSUITransaction() {
|
|
5
|
-
const client =
|
|
6
|
-
const {
|
|
7
|
-
const {
|
|
6
|
+
const client = useCurrentClient();
|
|
7
|
+
const { signTransaction } = useDAppKit();
|
|
8
|
+
const executeSignedTransaction = async ({ bytes, signature }) => {
|
|
9
|
+
const executeResult = await client.core.executeTransaction({
|
|
10
|
+
transaction: fromBase64(bytes),
|
|
11
|
+
signatures: [signature],
|
|
12
|
+
});
|
|
13
|
+
return executeResult.$kind === "Transaction"
|
|
14
|
+
? executeResult.Transaction.digest
|
|
15
|
+
: executeResult.FailedTransaction.digest;
|
|
16
|
+
};
|
|
8
17
|
const execute = async (params) => {
|
|
9
18
|
const preparedPayment = params.paymentData?.sui;
|
|
10
19
|
if (preparedPayment) {
|
|
11
20
|
const transaction = typeof preparedPayment.transaction === "string"
|
|
12
21
|
? preparedPayment.transaction
|
|
13
22
|
: Transaction.from(preparedPayment.transaction);
|
|
14
|
-
const
|
|
23
|
+
const signedTransaction = await signTransaction({
|
|
15
24
|
transaction,
|
|
16
25
|
});
|
|
17
|
-
|
|
18
|
-
transactionBlock: bytes,
|
|
19
|
-
signature,
|
|
20
|
-
options: {
|
|
21
|
-
showRawEffects: true,
|
|
22
|
-
},
|
|
23
|
-
});
|
|
24
|
-
if (executeResult.rawEffects) {
|
|
25
|
-
reportTransactionEffects({
|
|
26
|
-
effects: executeResult.rawEffects,
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
return executeResult.digest;
|
|
26
|
+
return executeSignedTransaction(signedTransaction);
|
|
30
27
|
}
|
|
31
28
|
const { from: owner, to, amount, token } = params;
|
|
32
29
|
if (!to || amount == undefined) {
|
|
@@ -37,25 +34,25 @@ export function useSUITransaction() {
|
|
|
37
34
|
const tx = new Transaction();
|
|
38
35
|
const value = BigInt(amount);
|
|
39
36
|
if (isNative) {
|
|
40
|
-
const
|
|
37
|
+
const balanceResponse = await client.core.getBalance({
|
|
41
38
|
owner,
|
|
42
39
|
coinType: SUI_PACKAGE_IDS["sui"],
|
|
43
40
|
});
|
|
44
|
-
if (BigInt(balance.
|
|
45
|
-
throw new Error(`[CHECKOUT] Insufficient balance: ${balance}`);
|
|
41
|
+
if (BigInt(balanceResponse.balance.balance) < value) {
|
|
42
|
+
throw new Error(`[CHECKOUT] Insufficient balance: ${balanceResponse.balance.balance}`);
|
|
46
43
|
}
|
|
47
44
|
const [coin] = tx.splitCoins(tx.gas, [value]);
|
|
48
45
|
tx.transferObjects([coin], to);
|
|
49
46
|
}
|
|
50
47
|
else {
|
|
51
|
-
const coins = await client.
|
|
48
|
+
const coins = await client.core.listCoins({
|
|
52
49
|
owner,
|
|
53
50
|
coinType: tokenAddress,
|
|
54
51
|
});
|
|
55
52
|
let total = BigInt(0);
|
|
56
53
|
const coinInputs = [];
|
|
57
|
-
for (const c of coins.
|
|
58
|
-
coinInputs.push(tx.object(c.
|
|
54
|
+
for (const c of coins.objects) {
|
|
55
|
+
coinInputs.push(tx.object(c.objectId));
|
|
59
56
|
total += BigInt(c.balance);
|
|
60
57
|
if (total >= value)
|
|
61
58
|
break;
|
|
@@ -63,30 +60,20 @@ export function useSUITransaction() {
|
|
|
63
60
|
if (total < value)
|
|
64
61
|
throw new Error("Insufficient balance");
|
|
65
62
|
const coinInput = coinInputs[0];
|
|
63
|
+
if (!coinInput)
|
|
64
|
+
throw new Error("Insufficient balance");
|
|
66
65
|
if (coinInputs.length > 1) {
|
|
67
66
|
tx.mergeCoins(coinInput, coinInputs.slice(1));
|
|
68
67
|
}
|
|
69
68
|
const [paymentCoin] = tx.splitCoins(coinInput, [value]);
|
|
70
69
|
tx.transferObjects([paymentCoin], to);
|
|
71
70
|
}
|
|
72
|
-
const gasPrice = await client.getReferenceGasPrice();
|
|
73
|
-
tx.setGasPrice(gasPrice);
|
|
74
|
-
const
|
|
71
|
+
const gasPrice = await client.core.getReferenceGasPrice();
|
|
72
|
+
tx.setGasPrice(gasPrice.referenceGasPrice);
|
|
73
|
+
const signedTransaction = await signTransaction({
|
|
75
74
|
transaction: tx,
|
|
76
75
|
});
|
|
77
|
-
|
|
78
|
-
transactionBlock: bytes,
|
|
79
|
-
signature,
|
|
80
|
-
options: {
|
|
81
|
-
showRawEffects: true,
|
|
82
|
-
},
|
|
83
|
-
});
|
|
84
|
-
if (executeResult.rawEffects) {
|
|
85
|
-
reportTransactionEffects({
|
|
86
|
-
effects: executeResult.rawEffects,
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
return executeResult.digest;
|
|
76
|
+
return executeSignedTransaction(signedTransaction);
|
|
90
77
|
};
|
|
91
78
|
return { execute };
|
|
92
79
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Connector as UTXOConnector } from "@bigmi/client";
|
|
2
|
-
import type {
|
|
2
|
+
import type { UiWallet } from "@mysten/dapp-kit-react";
|
|
3
3
|
import type { Connector } from "wagmi";
|
|
4
4
|
import { CreateConnectorFnExtended } from "../evm/types";
|
|
5
5
|
import type { WalletAdapterExtended } from "../solana/types";
|
|
6
|
-
export type SuiConnector =
|
|
6
|
+
export type SuiConnector = UiWallet;
|
|
7
7
|
export type WalletConnector = Connector | UTXOConnector | WalletAdapterExtended | CreateConnectorFnExtended | SuiConnector;
|
package/dist/types/wallet.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ChainId, ChainType } from "@coin-voyage/shared/types";
|
|
2
|
-
import type {
|
|
2
|
+
import type { createDAppKit } from "@mysten/dapp-kit-react";
|
|
3
3
|
import type { WalletProviderProps } from "@solana/wallet-adapter-react";
|
|
4
4
|
import type { EVMConfiguration } from "../evm/create-default-evm-config";
|
|
5
5
|
import type { UTXOConfiguration } from "../utxo/create-default-utxo-config";
|
|
@@ -26,9 +26,11 @@ export type SolanaConfiguration = {
|
|
|
26
26
|
rpcUrl?: string;
|
|
27
27
|
walletConfiguration?: Omit<WalletProviderProps, "children">;
|
|
28
28
|
};
|
|
29
|
+
type SuiDAppKitOptions = Parameters<typeof createDAppKit>[0];
|
|
30
|
+
export type SuiDAppKitConfiguration = Pick<SuiDAppKitOptions, "autoConnect" | "enableBurnerWallet" | "slushWalletConfig" | "storage" | "storageKey" | "walletInitializers">;
|
|
29
31
|
export type SuiConfiguration = {
|
|
30
|
-
|
|
31
|
-
walletConfiguration?:
|
|
32
|
+
grpcUrl?: string;
|
|
33
|
+
walletConfiguration?: SuiDAppKitConfiguration;
|
|
32
34
|
};
|
|
33
35
|
export type ChainTypeWalletConnector = {
|
|
34
36
|
connector: WalletConnector;
|
|
@@ -74,3 +76,4 @@ export type WalletPermission = {
|
|
|
74
76
|
chainType: ChainType;
|
|
75
77
|
allowed: boolean;
|
|
76
78
|
};
|
|
79
|
+
export {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ChainType } from "@coin-voyage/shared/types";
|
|
2
2
|
import type { ChainTypeWalletConnector } from "../types/wallet";
|
|
3
3
|
import type { WalletConnector } from "../types/wallet-connector";
|
|
4
|
-
export declare const getConnectorId: (connector
|
|
4
|
+
export declare const getConnectorId: (connector?: WalletConnector) => string | undefined;
|
|
5
5
|
export declare const getConnector: (walletConnector: ChainTypeWalletConnector[], chainType?: ChainType) => WalletConnector;
|
package/dist/utils/connector.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
export const getConnectorId = (connector) => {
|
|
2
|
-
if (
|
|
3
|
-
return
|
|
4
|
-
|
|
5
|
-
return connector.name;
|
|
2
|
+
if (!connector)
|
|
3
|
+
return undefined;
|
|
4
|
+
return "id" in connector ? connector.id : connector.name;
|
|
6
5
|
};
|
|
7
6
|
export const getConnector = (walletConnector, chainType) => {
|
|
8
7
|
let connector = walletConnector[0];
|
package/dist/utils/index.d.ts
CHANGED
package/dist/utils/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function generateNonce(entropyBits?: number): string;
|
|
@@ -3,4 +3,4 @@ export interface UTXORpcConfig {
|
|
|
3
3
|
url?: string | undefined;
|
|
4
4
|
config?: HttpTransportConfig;
|
|
5
5
|
}
|
|
6
|
-
export declare function createUTXOTransport(rpcConfig?: UTXORpcConfig): import("@bigmi/core").FallbackTransport<readonly [import("@bigmi/core").HttpTransport<undefined, false>, import("@bigmi/core").HttpTransport<import("@bigmi/core").RpcSchema, false>, import("@bigmi/core").HttpTransport
|
|
6
|
+
export declare function createUTXOTransport(rpcConfig?: UTXORpcConfig): import("@bigmi/core").FallbackTransport<readonly [import("@bigmi/core").HttpTransport<undefined, false>, import("@bigmi/core").HttpTransport<import("@bigmi/core").RpcSchema, false>, import("@bigmi/core").HttpTransport, import("@bigmi/core").HttpTransport, import("@bigmi/core").HttpTransport, import("@bigmi/core").HttpTransport]>;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coin-voyage/crypto",
|
|
3
3
|
"description": "Crypto utilities for Coin Voyage",
|
|
4
|
-
"version": "2.4.
|
|
4
|
+
"version": "2.4.5-beta.1",
|
|
5
5
|
"private": false,
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"author": "Lars <lars@coinvoyage.io>",
|
|
@@ -39,6 +39,10 @@
|
|
|
39
39
|
"types": "./dist/utils/index.d.ts",
|
|
40
40
|
"default": "./dist/utils/index.js"
|
|
41
41
|
},
|
|
42
|
+
"./utils/nonce": {
|
|
43
|
+
"types": "./dist/utils/nonce.d.ts",
|
|
44
|
+
"default": "./dist/utils/nonce.js"
|
|
45
|
+
},
|
|
42
46
|
"./utxo": {
|
|
43
47
|
"types": "./dist/utxo/index.d.ts",
|
|
44
48
|
"default": "./dist/utxo/index.js"
|
|
@@ -77,6 +81,9 @@
|
|
|
77
81
|
"utils": [
|
|
78
82
|
"dist/utils/index.d.ts"
|
|
79
83
|
],
|
|
84
|
+
"utils/nonce": [
|
|
85
|
+
"dist/utils/nonce.d.ts"
|
|
86
|
+
],
|
|
80
87
|
"utxo": [
|
|
81
88
|
"dist/utxo/index.d.ts"
|
|
82
89
|
],
|
|
@@ -86,8 +93,8 @@
|
|
|
86
93
|
}
|
|
87
94
|
},
|
|
88
95
|
"dependencies": {
|
|
89
|
-
"@bigmi/client": "0.
|
|
90
|
-
"@bigmi/core": "0.
|
|
96
|
+
"@bigmi/client": "0.8.0",
|
|
97
|
+
"@bigmi/core": "0.8.0",
|
|
91
98
|
"@noble/secp256k1": "1.7.1",
|
|
92
99
|
"@noble/ed25519": "2.3.0",
|
|
93
100
|
"@scure/base": "1.1.1",
|
|
@@ -97,8 +104,7 @@
|
|
|
97
104
|
"bitcoinjs-lib": "6.1.7",
|
|
98
105
|
"bitcoinjs-message": "2.2.0",
|
|
99
106
|
"bitcoin-address-validation": "3.0.0",
|
|
100
|
-
"@mysten/sui": "
|
|
101
|
-
"@mysten/wallet-standard": "0.19.6",
|
|
107
|
+
"@mysten/sui": "2.16.2",
|
|
102
108
|
"@solana/web3.js": "1.98.4",
|
|
103
109
|
"@solana/spl-token": "0.4.14",
|
|
104
110
|
"@solana/wallet-standard-features": "1.3.0",
|
|
@@ -106,14 +112,14 @@
|
|
|
106
112
|
"@solana/wallet-adapter-walletconnect": "0.1.21",
|
|
107
113
|
"@solana/wallet-adapter-base": "0.9.27",
|
|
108
114
|
"@solana/wallet-adapter-coinbase": "0.1.23",
|
|
109
|
-
"@coin-voyage/shared": "2.4.
|
|
115
|
+
"@coin-voyage/shared": "2.4.5-beta.0"
|
|
110
116
|
},
|
|
111
117
|
"devDependencies": {
|
|
112
118
|
"@types/elliptic": "6.4.18"
|
|
113
119
|
},
|
|
114
120
|
"peerDependencies": {
|
|
115
|
-
"@bigmi/react": "^0.
|
|
116
|
-
"@mysten/dapp-kit": "^0.
|
|
121
|
+
"@bigmi/react": "^0.8.0",
|
|
122
|
+
"@mysten/dapp-kit-react": "^2.0.3",
|
|
117
123
|
"@solana/wallet-adapter-react": "^0.15.39",
|
|
118
124
|
"@tanstack/react-query": "^5.90.6",
|
|
119
125
|
"react": "^18 || ^19",
|
package/dist/sui/client.d.ts
DELETED
package/dist/sui/client.js
DELETED