Skip to content

Commit a28fa6d

Browse files
committed
Adds solana hooks
1 parent 6c0e7d5 commit a28fa6d

17 files changed

+340
-2
lines changed

package-lock.json

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/modal/package.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
"@babel/runtime": "^7.x",
5353
"@coinbase/wallet-sdk": "^4.3.x",
5454
"@tanstack/react-query": "^5.72.x",
55+
"@solana/web3.js": ">=1.98",
5556
"react": ">=18",
5657
"react-dom": ">=18",
5758
"viem": "^2.23.x",
@@ -65,6 +66,7 @@
6566
"@rollup/plugin-json": "^6.1.0",
6667
"@rollup/plugin-replace": "^6.0.2",
6768
"@rollup/plugin-url": "^8.0.2",
69+
"@solana/web3.js": "^1.98.0",
6870
"@svgr/rollup": "^8.1.0",
6971
"@svgr/webpack": "^8.1.0",
7072
"@tanstack/react-query": "^5.74.3",
@@ -121,6 +123,11 @@
121123
"require": "./dist/lib.cjs/packages/modal/src/react/wagmi/index.js",
122124
"types": "./dist/lib.cjs/types/react/wagmi/index.d.ts"
123125
},
126+
"./react/solana": {
127+
"import": "./dist/lib.esm/packages/modal/src/react/solana/index.js",
128+
"require": "./dist/lib.cjs/packages/modal/src/react/solana/index.js",
129+
"types": "./dist/lib.cjs/types/react/solana/index.d.ts"
130+
},
124131
"./vue": {
125132
"import": "./dist/lib.esm/packages/modal/src/vue/index.js",
126133
"require": "./dist/lib.cjs/packages/modal/src/vue/index.js",
@@ -135,6 +142,9 @@
135142
"react/wagmi": [
136143
"./dist/lib.cjs/types/react/wagmi/index.d.ts"
137144
],
145+
"react/solana": [
146+
"./dist/lib.cjs/types/react/solana/index.d.ts"
147+
],
138148
"vue": [
139149
"./dist/lib.cjs/types/vue/index.d.ts"
140150
]

packages/modal/rollup.config.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const pkg = await readJSONFile(path.resolve("./package.json"));
1111
// TODO: use ssr module for cjs build
1212

1313
export const baseConfig = {
14-
input: ["./src/index.ts", "./src/react/index.ts", "./src/vue/index.ts", "./src/react/wagmi/index.ts"],
14+
input: ["./src/index.ts", "./src/react/index.ts", "./src/vue/index.ts", "./src/react/wagmi/index.ts", "./src/react/solana/index.ts"],
1515
plugins: [
1616
replace({
1717
"process.env.WEB3AUTH_VERSION": `"${pkg.version}"`,
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export * from "./useSignAndSendTransaction";
2+
export * from "./useSignMessage";
3+
export * from "./useSignTransaction";
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import type { Transaction } from "@solana/web3.js";
2+
import { Web3AuthError } from "@web3auth/no-modal";
3+
import { useCallback, useState } from "react";
4+
5+
import { useSolanaWallet } from "./useSolanaWallet";
6+
7+
export type IUseSignAndSendTransaction = {
8+
loading: boolean;
9+
error: Web3AuthError | null;
10+
data: string | null;
11+
signAndSendTransaction: (transaction: Transaction) => Promise<string>;
12+
};
13+
14+
export const useSignAndSendTransaction = (): IUseSignAndSendTransaction => {
15+
const { solanaWallet } = useSolanaWallet();
16+
const [loading, setLoading] = useState(false);
17+
const [error, setError] = useState<Web3AuthError | null>(null);
18+
const [data, setData] = useState<string | null>(null);
19+
20+
const signAndSendTransaction = useCallback(
21+
async (transaction: Transaction) => {
22+
setLoading(true);
23+
setError(null);
24+
try {
25+
if (!solanaWallet) throw new Error("Solana wallet not found");
26+
const signature = await solanaWallet.signAndSendTransaction(transaction);
27+
setData(signature);
28+
return signature;
29+
} catch (error) {
30+
setError(error as Web3AuthError);
31+
} finally {
32+
setLoading(false);
33+
}
34+
},
35+
[solanaWallet]
36+
);
37+
38+
return { loading, error, data, signAndSendTransaction };
39+
};
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import { Web3AuthError } from "@web3auth/no-modal";
2+
import { useCallback, useState } from "react";
3+
4+
import { useSolanaWallet } from "./useSolanaWallet";
5+
6+
export type IUseSignMessage = {
7+
loading: boolean;
8+
error: Web3AuthError | null;
9+
data: string | null;
10+
signMessage: (message: string) => Promise<string>;
11+
};
12+
13+
export const useSignMessage = (): IUseSignMessage => {
14+
const { solanaWallet, address } = useSolanaWallet();
15+
const [loading, setLoading] = useState(false);
16+
const [error, setError] = useState<Web3AuthError | null>(null);
17+
const [data, setData] = useState<string | null>(null);
18+
19+
const signMessage = useCallback(
20+
async (message: string, from?: string) => {
21+
setLoading(true);
22+
setError(null);
23+
try {
24+
if (!solanaWallet) throw new Error("Solana wallet not found");
25+
const signature = await solanaWallet.signMessage(message, from ?? address[0]);
26+
setData(signature);
27+
return signature;
28+
} catch (error) {
29+
setError(error as Web3AuthError);
30+
} finally {
31+
setLoading(false);
32+
}
33+
},
34+
[solanaWallet, address]
35+
);
36+
37+
return { loading, error, data, signMessage };
38+
};
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { Transaction } from "@solana/web3.js";
2+
import { Web3AuthError } from "@web3auth/no-modal";
3+
import { useCallback, useState } from "react";
4+
5+
import { useSolanaWallet } from "./useSolanaWallet";
6+
7+
export type IUseSignTransaction = {
8+
loading: boolean;
9+
error: Web3AuthError | null;
10+
data: string | null;
11+
signTransaction: (transaction: Transaction) => Promise<string>;
12+
};
13+
14+
export const useSignTransaction = () => {
15+
const { solanaWallet } = useSolanaWallet();
16+
const [loading, setLoading] = useState(false);
17+
const [error, setError] = useState<Web3AuthError | null>(null);
18+
const [data, setData] = useState<string | null>(null);
19+
20+
const signTransaction = useCallback(
21+
async (transaction: Transaction) => {
22+
setLoading(true);
23+
setError(null);
24+
try {
25+
const signedTransaction = await solanaWallet.signTransaction(transaction);
26+
setData(signedTransaction);
27+
return signedTransaction;
28+
} catch (error) {
29+
setError(error as Web3AuthError);
30+
} finally {
31+
setLoading(false);
32+
}
33+
},
34+
[solanaWallet]
35+
);
36+
37+
return {
38+
loading,
39+
error,
40+
data,
41+
signTransaction,
42+
};
43+
};
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import { SolanaWallet } from "@web3auth/no-modal";
2+
import { useEffect, useMemo, useState } from "react";
3+
4+
import { useWeb3Auth } from "../../hooks/useWeb3Auth";
5+
6+
export type IUseSolanaWallet = {
7+
address: string[] | null;
8+
solanaWallet: SolanaWallet | null;
9+
};
10+
11+
export const useSolanaWallet = (): IUseSolanaWallet => {
12+
const { provider } = useWeb3Auth();
13+
const [address, setAddress] = useState<string[] | null>(null);
14+
15+
const solanaWallet = useMemo(() => {
16+
if (!provider) return null;
17+
return new SolanaWallet(provider);
18+
}, [provider]);
19+
20+
useEffect(() => {
21+
const fetchAccounts = async () => {
22+
if (!solanaWallet) return;
23+
const accounts = await solanaWallet.requestAccounts();
24+
if (accounts?.length > 0) {
25+
setAddress(accounts);
26+
}
27+
};
28+
29+
if (solanaWallet) fetchAccounts();
30+
}, [solanaWallet]);
31+
32+
return { solanaWallet, address };
33+
};
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export * from "./hooks";

packages/no-modal/package.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,11 @@
119119
"require": "./dist/lib.cjs/react/wagmi/index.js",
120120
"types": "./dist/lib.cjs/types/react/wagmi/index.d.ts"
121121
},
122+
"./react/solana": {
123+
"import": "./dist/lib.esm/packages/modal/src/react/solana/index.js",
124+
"require": "./dist/lib.cjs/packages/modal/src/react/solana/index.js",
125+
"types": "./dist/lib.cjs/types/react/solana/index.d.ts"
126+
},
122127
"./vue": {
123128
"import": "./dist/lib.esm/vue/index.js",
124129
"require": "./dist/lib.cjs/vue/index.js",
@@ -133,6 +138,9 @@
133138
"react/wagmi": [
134139
"./dist/lib.cjs/types/react/wagmi/index.d.ts"
135140
],
141+
"react/solana": [
142+
"./dist/lib.cjs/types/react/solana/index.d.ts"
143+
],
136144
"vue": [
137145
"./dist/lib.cjs/types/vue/index.d.ts"
138146
]

0 commit comments

Comments
 (0)