@@ -2,8 +2,75 @@ import { log } from '@lit-protocol/misc';
22import { TinnyEnvironment } from 'local-tests/setup/tinny-environment' ;
33import { api } from '@lit-protocol/wrapped-keys' ;
44import { getPkpSessionSigs } from 'local-tests/setup/session-sigs/get-pkp-session-sigs' ;
5+ import nacl from 'tweetnacl' ;
6+ import bs58 from 'bs58' ;
7+ import { ethers } from 'ethers' ;
8+ import { BatchGeneratePrivateKeysActionResult } from '../../../packages/wrapped-keys/src/lib/types' ;
59
6- const { batchGeneratePrivateKeys } = api ;
10+ const { batchGeneratePrivateKeys, exportPrivateKey } = api ;
11+
12+ async function verifySolanaSignature (
13+ solanaResult : BatchGeneratePrivateKeysActionResult ,
14+ solanaMessageToSign
15+ ) {
16+ const {
17+ signedMessage : { signature } ,
18+ generatedPrivateKey : { generatedPublicKey } ,
19+ } = solanaResult ;
20+ const signatureIsValidForPublicKey = nacl . sign . detached . verify (
21+ Buffer . from ( solanaMessageToSign ) ,
22+ bs58 . decode ( signature ) ,
23+ bs58 . decode ( generatedPublicKey )
24+ ) ;
25+
26+ console . log ( { signatureIsValidForPublicKey, signature } ) ;
27+ if ( ! signatureIsValidForPublicKey ) {
28+ throw new Error (
29+ `signature: ${ signature } doesn't validate for the Solana public key: ${ generatedPublicKey } `
30+ ) ;
31+ }
32+ }
33+ async function verifyEvmSignature (
34+ litNodeClient ,
35+ evmResult ,
36+ messageToSign ,
37+ pkpSessionSigs
38+ ) {
39+ function verifyMessageSignature ( ) {
40+ try {
41+ return ethers . utils . verifyMessage (
42+ messageToSign ,
43+ evmResult . signedMessage . signature
44+ ) ;
45+ } catch ( err ) {
46+ throw new Error (
47+ `When validating signed Ethereum message is valid: ${ err . message } `
48+ ) ;
49+ }
50+ }
51+
52+ const { decryptedPrivateKey } = await exportPrivateKey ( {
53+ litNodeClient,
54+ network : 'evm' ,
55+ id : evmResult . generatedPrivateKey . id ,
56+ pkpSessionSigs,
57+ } ) ;
58+
59+ const recoveredAddress = verifyMessageSignature ( ) ;
60+
61+ const wallet = new ethers . Wallet ( decryptedPrivateKey ) ;
62+
63+ console . log ( {
64+ recoveredAddress,
65+ walletAddress : wallet . address ,
66+ signature : evmResult . signedMessage . signature ,
67+ } ) ;
68+ if ( recoveredAddress !== wallet . address ) {
69+ throw new Error (
70+ "Recovered address from verifyMessage doesn't match the wallet address"
71+ ) ;
72+ }
73+ }
774
875/**
976 * Test Commands:
@@ -24,17 +91,19 @@ export const testBatchGeneratePrivateKeys = async (
2491 new Date ( Date . now ( ) + 1000 * 60 * 10 ) . toISOString ( )
2592 ) ; // 10 mins expiry
2693
94+ const solanaMessageToSign = 'This is a test solana message' ;
95+ const evmMessageToSign = 'This is a test evm message' ;
2796 const results = await batchGeneratePrivateKeys ( {
2897 pkpSessionSigs : pkpSessionSigsSigning ,
2998 actions : [
3099 {
31100 network : 'evm' ,
32- signMessageParams : { messageToSign : 'This is a test evm message' } ,
101+ signMessageParams : { messageToSign : evmMessageToSign } ,
33102 generateKeyParams : { memo : 'Test evm key' } ,
34103 } ,
35104 {
36105 network : 'solana' ,
37- signMessageParams : { messageToSign : 'This is a test solana message' } ,
106+ signMessageParams : { messageToSign : solanaMessageToSign } ,
38107 generateKeyParams : { memo : 'Test solana key' } ,
39108 } ,
40109 ] ,
@@ -63,6 +132,16 @@ export const testBatchGeneratePrivateKeys = async (
63132 throw new Error ( 'Missing message signature in response' ) ;
64133 }
65134
135+ console . log ( 'solana verify sig' ) ;
136+ await verifySolanaSignature ( results [ 1 ] , solanaMessageToSign ) ;
137+
138+ console . log ( 'evm verify sig' ) ;
139+ await verifyEvmSignature (
140+ devEnv . litNodeClient ,
141+ results [ 0 ] ,
142+ evmMessageToSign ,
143+ pkpSessionSigsSigning
144+ ) ;
66145 console . log ( 'results' , results ) ;
67146
68147 log ( '✅ testBatchGenerateEncryptedKeys' ) ;
0 commit comments