added signing prompts

This commit is contained in:
Samuel Andert 2023-08-28 10:39:10 +02:00
parent 405c564880
commit e2a3c680d1
2 changed files with 102 additions and 5 deletions

View File

@ -9,6 +9,7 @@
import { createLitSession } from "./createLitSession"; import { createLitSession } from "./createLitSession";
import { connectProvider } from "./setupLit"; import { connectProvider } from "./setupLit";
import { ethers } from "ethers"; import { ethers } from "ethers";
import Signer from "./Signer.svelte";
const redirectUri = "http://localhost:3000/"; const redirectUri = "http://localhost:3000/";
@ -194,12 +195,16 @@
{/if} {/if}
{#if view === "READY"} {#if view === "READY"}
<div> <div>
<h3>Your PKP Address: {currentPKP.ethAddress}</h3> <h3>Your PKP Address:</h3>
<p>{currentPKP.ethAddress}</p>
<h1>Ready to sign</h1> <h1>Ready to sign</h1>
<button on:click={signMessageWithPKP}>Sign Message</button> <Signer
{#if messageToSign} {litNodeClient}
<pre>{JSON.stringify(messageToSign)}</pre> {currentPKP}
{/if} {sessionSigs}
on:status={(e) => (status = e.detail)}
on:error={(e) => setError(e.detail)}
/>
</div> </div>
{/if} {/if}
<div class="mt-4 text-center"> <div class="mt-4 text-center">

92
src/lib/Signer.svelte Normal file
View File

@ -0,0 +1,92 @@
<!-- SignVerifyMessage.svelte -->
<script lang="ts">
import { ethers } from "ethers";
import { createEventDispatcher } from "svelte";
export let litNodeClient;
export let currentPKP;
export let sessionSigs;
export let messageToSign = { user: "Sam", loggedIn: true };
let status = "";
let jsonObjectToVerify = null;
const dispatch = createEventDispatcher();
async function signMessageWithPKP() {
const userConfirmed = window.confirm(
"Do you want to sign the following message?\n\n" +
JSON.stringify(messageToSign, null, 2)
);
if (!userConfirmed) {
status = "User did not allow to sign the message.";
dispatch("status", status);
return;
}
try {
// Create a specific JSON object
const jsonString = JSON.stringify(messageToSign);
// Convert the JSON string to an array of character codes
const toSign = ethers.getBytes(ethers.hashMessage(jsonString));
const litActionCode = `
const go = async () => {
const sigShare = await LitActions.signEcdsa({ toSign, publicKey, sigName });
};
go();
`;
// Sign message
const results = await litNodeClient.executeJs({
code: litActionCode,
sessionSigs: sessionSigs,
jsParams: {
toSign: toSign,
publicKey: currentPKP.publicKey,
sigName: "sig1",
},
});
// Get signature
const result = results.signatures["sig1"];
const signature = ethers.Signature.from({
r: "0x" + result.r,
s: "0x" + result.s,
v: result.recid,
});
// Add the signature to the JSON object
messageToSign.signature = signature;
jsonObjectToVerify = { ...messageToSign };
// Display the signed JSON
status = JSON.stringify(messageToSign, null, 2);
// Verify the signature
const recoveredAddr = ethers.verifyMessage(jsonString, signature);
// Check if the address associated with the signature is the same as the current PKP
const verified =
currentPKP.ethAddress.toLowerCase() === recoveredAddr.toLowerCase();
if (verified) {
status = "The signature is valid.";
} else {
status = "The signature is invalid.";
}
dispatch("status", status);
} catch (err) {
console.error(err);
dispatch("error", err);
}
}
</script>
<button on:click={signMessageWithPKP}>Sign Message</button>
{#if messageToSign}
<pre>{JSON.stringify(messageToSign)}</pre>
{/if}