refactor: abstracts common rpc handling into createJsonRpcRequestHandler

This commit is contained in:
Ben Kremer 2022-02-04 15:08:29 +01:00
parent 55fff706cf
commit 575f21e814

View File

@ -53,6 +53,13 @@ import {
SToggleContainer, SToggleContainer,
} from "./components/app"; } from "./components/app";
interface FormattedRpcResponse {
method: string;
address: string;
valid: boolean;
result: string;
}
export default function App() { export default function App() {
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [pending, setPending] = useState(false); const [pending, setPending] = useState(false);
@ -317,7 +324,11 @@ export default function App() {
setChainData(chainData); setChainData(chainData);
}; };
const testSendTransaction = async (chainId: string) => { // ----- EVM RPC -----
const createJsonRpcRequestHandler =
(rpcRequest: (...requestArgs: [any]) => Promise<FormattedRpcResponse>) =>
async (chainId: string) => {
if (typeof client === "undefined") { if (typeof client === "undefined") {
throw new Error("WalletConnect is not initialized"); throw new Error("WalletConnect is not initialized");
} }
@ -327,6 +338,17 @@ export default function App() {
try { try {
setPending(true); setPending(true);
const result = await rpcRequest(chainId);
setResult(result);
} catch (err) {
console.error(err);
setResult(null);
} finally {
setPending(false);
}
};
const testSendTransaction = createJsonRpcRequestHandler(async (chainId: string) => {
// get ethereum address // get ethereum address
const account = accounts.find(account => account.startsWith(chainId)); const account = accounts.find(account => account.startsWith(chainId));
if (account === undefined) throw new Error("Account is not found"); if (account === undefined) throw new Error("Account is not found");
@ -340,18 +362,16 @@ export default function App() {
const balance = BigNumber.from(balances[account][0].balance || "0"); const balance = BigNumber.from(balances[account][0].balance || "0");
if (balance.lt(BigNumber.from(tx.gasPrice).mul(tx.gasLimit))) { if (balance.lt(BigNumber.from(tx.gasPrice).mul(tx.gasLimit))) {
const formattedResult = { return {
method: "eth_sendTransaction", method: "eth_sendTransaction",
address, address,
valid: false, valid: false,
result: "Insufficient funds for intrinsic transaction cost", result: "Insufficient funds for intrinsic transaction cost",
}; };
setResult(formattedResult);
return;
} }
const result = await client.request({ const result: string = await client!.request({
topic: session.topic, topic: session!.topic,
chainId, chainId,
request: { request: {
method: "eth_sendTransaction", method: "eth_sendTransaction",
@ -360,33 +380,15 @@ export default function App() {
}); });
// format displayed result // format displayed result
const formattedResult = { return {
method: "eth_sendTransaction", method: "eth_sendTransaction",
address, address,
valid: true, valid: true,
result, result,
}; };
});
// display result const testSignPersonalMessage = createJsonRpcRequestHandler(async (chainId: string) => {
setResult(formattedResult);
} catch (e) {
console.error(e);
setResult(null);
} finally {
setPending(false);
}
};
const testSignPersonalMessage = async (chainId: string) => {
if (typeof client === "undefined") {
throw new Error("WalletConnect is not initialized");
}
if (typeof session === "undefined") {
throw new Error("Session is not connected");
}
try {
setPending(true);
// test message // test message
const message = `My email is john@doe.com - ${Date.now()}`; const message = `My email is john@doe.com - ${Date.now()}`;
@ -406,8 +408,8 @@ export default function App() {
openRequestModal(); openRequestModal();
// send message // send message
const result = await client.request({ const result: string = await client!.request({
topic: session.topic, topic: session!.topic,
chainId, chainId,
request: { request: {
method: "personal_sign", method: "personal_sign",
@ -431,33 +433,15 @@ export default function App() {
const valid = await verifySignature(address, result, hash, rpcUrl); const valid = await verifySignature(address, result, hash, rpcUrl);
// format displayed result // format displayed result
const formattedResult = { return {
method: "personal_sign", method: "personal_sign",
address, address,
valid, valid,
result, result,
}; };
});
// display result const testSignTypedData = createJsonRpcRequestHandler(async (chainId: string) => {
setResult(formattedResult);
} catch (e) {
console.error(e);
setResult(null);
} finally {
setPending(false);
}
};
const testSignTypedData = async (chainId: string) => {
if (typeof client === "undefined") {
throw new Error("WalletConnect is not initialized");
}
if (typeof session === "undefined") {
throw new Error("Session is not connected");
}
try {
setPending(true);
// test message // test message
const message = JSON.stringify(eip712.example); const message = JSON.stringify(eip712.example);
@ -474,8 +458,8 @@ export default function App() {
openRequestModal(); openRequestModal();
// send message // send message
const result = await client.request({ const result = await client!.request({
topic: session.topic, topic: session!.topic,
chainId, chainId,
request: { request: {
method: "eth_signTypedData", method: "eth_signTypedData",
@ -499,22 +483,15 @@ export default function App() {
const valid = await verifySignature(address, result, hash, rpcUrl); const valid = await verifySignature(address, result, hash, rpcUrl);
// format displayed result // format displayed result
const formattedResult = { return {
method: "eth_signTypedData", method: "eth_signTypedData",
address, address,
valid, valid,
result, result,
}; };
});
// display result // ------ COSMOS RPC ------
setResult(formattedResult);
} catch (e) {
console.error(e);
setResult(null);
} finally {
setPending(false);
}
};
const testSignDirect = async (chainId: string) => { const testSignDirect = async (chainId: string) => {
if (typeof client === "undefined") { if (typeof client === "undefined") {