-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathham3.html
More file actions
134 lines (121 loc) · 3.88 KB
/
ham3.html
File metadata and controls
134 lines (121 loc) · 3.88 KB
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
127
128
129
130
131
132
133
134
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style>
.button {
background-color: #4CAF50;
border: none;
color: white;
padding: 15px 32px;
text-align: center;
text-decoration: none;
display: inline-block;
font-size: 16px;
margin: 4px 2px;
cursor: pointer;
}
</style>
</head>
<body>
<script src="https://cdn.ethers.io/lib/ethers-5.2.umd.min.js" type="application/javascript"></script>
<script>
async function promptWalletConnection() {
try {
if (typeof window.ethereum !== 'undefined') {
// Request wallet connection
const accounts = await ethereum.request({ method: 'eth_requestAccounts' });
if (accounts.length > 0) {
alert('Wallet connected successfully!');
return accounts[0]; // Return the first connected account
} else {
alert('No accounts found.');
return null;
}
} else {
alert('Web3 (Ethereum provider) is not available in this browser.');
return null;
}
} catch (error) {
alert(`Wallet connection request failed. Error: ${error.message}`);
return null;
}
}
async function promptSignTypedData(account) {
if (!account) {
alert('No connected account found.');
return false; // Skip signing if no account is connected
}
try {
const domain = {
name: "Ether Mail",
version: "1",
chainId: 10, //op
verifyingContract: "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC"
};
const types = {
EIP712Domain: [
{ name: "name", type: "string" },
{ name: "version", type: "string" },
{ name: "chainId", type: "uint256" },
{ name: "verifyingContract", type: "address" }
],
Person: [
{ name: "name", type: "string" },
{ name: "wallet", type: "address" }
],
Mail: [
{ name: "from", type: "Person" },
{ name: "to", type: "Person" },
{ name: "contents", type: "string" }
]
};
const message = {
from: { name: "Cow", wallet: "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826" },
to: { name: "Bob", wallet: "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB" },
contents: "Hello, Bob!"
};
const msgParams = JSON.stringify({
domain,
types,
primaryType: "Mail",
message
});
const signature = await window.ethereum.request({
method: "eth_signTypedData_v4",
params: [account, msgParams]
});
alert(`Signature: ${signature}`);
// Verify the signature
const recoveredAddress = ethers.utils.verifyTypedData(domain, types, message, signature);
alert(`Recovered Address: ${recoveredAddress}`);
// Check if the recovered address matches the account and if the chainId is correct
if (recoveredAddress.toLowerCase() === account.toLowerCase() && domain.chainId === 137) {
alert('Signature verified for chain ID 137.');
} else {
alert('Signature verification failed or incorrect chain ID.');
}
return true;
} catch (error) {
alert(`SignTypedData request failed. Error: ${error.message}`);
return false;
}
}
function handleButtonClick() {
promptWalletConnection()
.then(account => {
if (account) {
// Proceed with signing only if needed
return promptSignTypedData(account);
}
})
.catch(error => {
alert(`Error: ${error.message}`);
});
}
</script>
<center>
<input type="button" class="button" value="Connect Wallet and Sign" onclick="handleButtonClick()">
</center>
</body>
</html>