refactor: updates eth_signTypedData
example
This commit is contained in:
parent
f5814d4d1a
commit
5ea671281f
@ -1,15 +1,13 @@
|
|||||||
import { BigNumber } from "ethers";
|
import { BigNumber, utils } from "ethers";
|
||||||
import { createContext, ReactNode, useContext, useEffect, useState } from "react";
|
import { createContext, ReactNode, useContext, useEffect, useState } from "react";
|
||||||
import * as encoding from "@walletconnect/encoding";
|
import * as encoding from "@walletconnect/encoding";
|
||||||
import { formatDirectSignDoc, stringifySignDocValues } from "cosmos-wallet";
|
import { formatDirectSignDoc, stringifySignDocValues } from "cosmos-wallet";
|
||||||
|
|
||||||
import {
|
import {
|
||||||
ChainNamespaces,
|
ChainNamespaces,
|
||||||
eip712,
|
|
||||||
formatTestTransaction,
|
formatTestTransaction,
|
||||||
getAllChainNamespaces,
|
getAllChainNamespaces,
|
||||||
hashPersonalMessage,
|
hashPersonalMessage,
|
||||||
hashTypedDataMessage,
|
|
||||||
verifySignature,
|
verifySignature,
|
||||||
} from "../helpers";
|
} from "../helpers";
|
||||||
import { useWalletConnectClient } from "./ClientContext";
|
import { useWalletConnectClient } from "./ClientContext";
|
||||||
@ -303,16 +301,46 @@ export function JsonRpcContextProvider({ children }: { children: ReactNode | Rea
|
|||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
testSignTypedData: _createJsonRpcRequestHandler(async (chainId: string) => {
|
testSignTypedData: _createJsonRpcRequestHandler(async (chainId: string) => {
|
||||||
// test message
|
const typedData = {
|
||||||
const message = JSON.stringify(eip712.example);
|
types: {
|
||||||
|
Person: [
|
||||||
|
{ name: "name", type: "string" },
|
||||||
|
{ name: "wallet", type: "address" },
|
||||||
|
],
|
||||||
|
Mail: [
|
||||||
|
{ name: "from", type: "Person" },
|
||||||
|
{ name: "to", type: "Person" },
|
||||||
|
{ name: "contents", type: "string" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
primaryType: "Mail",
|
||||||
|
domain: {
|
||||||
|
name: "Ether Mail",
|
||||||
|
version: "1",
|
||||||
|
chainId: 1,
|
||||||
|
verifyingContract: "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC",
|
||||||
|
},
|
||||||
|
message: {
|
||||||
|
from: {
|
||||||
|
name: "Cow",
|
||||||
|
wallet: "0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826",
|
||||||
|
},
|
||||||
|
to: {
|
||||||
|
name: "Bob",
|
||||||
|
wallet: "0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB",
|
||||||
|
},
|
||||||
|
contents: "Hello, Bob!",
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
const address = getAddressByChainId(chainId);
|
const address = getAddressByChainId(chainId);
|
||||||
|
const message = JSON.stringify(typedData);
|
||||||
|
|
||||||
// eth_signTypedData params
|
// eth_signTypedData params
|
||||||
const params = [address, message];
|
const params = [address, message];
|
||||||
|
|
||||||
// send message
|
// send message
|
||||||
const result = await client!.request({
|
const signature = await client!.request({
|
||||||
topic: session!.topic,
|
topic: session!.topic,
|
||||||
chainId,
|
chainId,
|
||||||
request: {
|
request: {
|
||||||
@ -320,28 +348,15 @@ export function JsonRpcContextProvider({ children }: { children: ReactNode | Rea
|
|||||||
params,
|
params,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
const valid =
|
||||||
|
utils.verifyTypedData(typedData.domain, typedData.types, typedData.message, signature) ===
|
||||||
|
address;
|
||||||
|
|
||||||
// split chainId
|
|
||||||
const [namespace, reference] = chainId.split(":");
|
|
||||||
|
|
||||||
const targetChainData = chainData[namespace][reference];
|
|
||||||
|
|
||||||
if (typeof targetChainData === "undefined") {
|
|
||||||
throw new Error(`Missing chain data for chainId: ${chainId}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const rpcUrl = targetChainData.rpc[0];
|
|
||||||
|
|
||||||
// verify signature
|
|
||||||
const hash = hashTypedDataMessage(message);
|
|
||||||
const valid = await verifySignature(address, result, hash, rpcUrl);
|
|
||||||
|
|
||||||
// format displayed result
|
|
||||||
return {
|
return {
|
||||||
method: "eth_signTypedData",
|
method: "eth_signTypedData",
|
||||||
address,
|
address,
|
||||||
valid,
|
valid,
|
||||||
result,
|
result: signature,
|
||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user