-
Notifications
You must be signed in to change notification settings - Fork 371
/
Copy pathApp.tsx
126 lines (109 loc) · 3.31 KB
/
App.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
import UniversalProvider from "@walletconnect/universal-provider";
import { WalletConnectModal } from "@walletconnect/modal";
import { useState, useEffect } from "react";
import { signMessage, sendTransaction, SolanaChains } from "./utils/helpers";
const projectId = import.meta.env.VITE_PROJECT_ID;
const events: string[] = [];
// 1. select chains (solana)
const chains = [`solana:${SolanaChains.MainnetBeta}`];
// 2. select methods (solana)
const methods = ["solana_signMessage", "solana_signTransaction"];
// 3. create modal instance
const modal = new WalletConnectModal({
projectId,
chains,
});
// 4. create provider instance
const App = () => {
const [isConnected, setIsConnected] = useState(false);
const [provider, setProvider] = useState<UniversalProvider | null>(null);
const [address, setAddress] = useState<string | null>(null);
useEffect(() => {
const initProvider = async () => {
const newProvider = await UniversalProvider.init({
logger: "error",
projectId: projectId,
metadata: {
name: "WalletConnect x Solana",
description: "Solana integration with WalletConnect's Universal Provider",
url: "https://walletconnect.com/",
icons: ["https://avatars.githubusercontent.com/u/37784886"],
},
});
setProvider(newProvider);
// Set up event listener
newProvider.on("display_uri", async (uri: string) => {
console.log("uri", uri);
await modal.openModal({ uri });
});
};
initProvider();
}, []);
useEffect(() => {
if (provider && provider.session) {
const newAddress = provider.session?.namespaces.solana?.accounts[0].split(":")[2];
setAddress(newAddress);
}
}, [provider, provider?.session]);
// 7. handle connect event
const connect = async () => {
if (!provider) return;
try {
await provider.connect({
namespaces: {
solana: {
methods,
chains,
events,
},
},
});
setIsConnected(true);
console.log("::::::: session", provider.session);
} catch {
console.log("####### Something went wrong, request cancelled");
}
modal.closeModal();
};
// 8. handle disconnect event
const disconnect = async () => {
if (!provider) return;
await provider.disconnect();
setIsConnected(false);
};
// 9. handle signMessage and sendTransaction
const handleSign = async () => {
if (!provider || !address) return;
const res = await signMessage(
`Can i have authorize this request pls bossman - ${Date.now()}`,
provider,
address
);
console.log(res);
};
const handleSend = async () => {
if (!provider || !address) return;
const res = await sendTransaction(address, 1000, provider, address);
console.log(res);
};
return (
<div className="App">
{isConnected ? (
<>
<p>
<b>Public Key: </b>
{address}
</p>
<div className="btn-container">
<button onClick={handleSign}>Sign</button>
<button onClick={handleSend}>Send</button>
<button onClick={disconnect}>Disconnect</button>
</div>
</>
) : (
<button onClick={connect}>Connect</button>
)}
</div>
);
};
export default App;