@@ -1342,25 +1342,38 @@ export class Web3AuthMPCCoreKit implements ICoreKit {
13421342 }
13431343
13441344 private async sign_ECDSA_secp256k1 ( data : Buffer , hashed : boolean = false , precomputedTssClient ?: Secp256k1PrecomputedClient ) {
1345+ const executeSign = async ( client : Client , serverCoeffs : Record < string , string > , hashedData : Buffer , signatures : string [ ] ) => {
1346+ const { r, s, recoveryParam } = await client . sign ( hashedData . toString ( "base64" ) , true , "" , "keccak256" , {
1347+ signatures,
1348+ } ) ;
1349+ // skip await cleanup
1350+ client . cleanup ( { signatures, server_coeffs : serverCoeffs } ) ;
1351+ return { v : recoveryParam , r : scalarBNToBufferSEC1 ( r ) , s : scalarBNToBufferSEC1 ( s ) } ;
1352+ } ;
13451353 if ( ! hashed ) {
13461354 data = keccak256 ( data ) ;
13471355 }
13481356
1349- const { client, serverCoeffs } =
1350- precomputedTssClient ?. client && precomputedTssClient ?. serverCoeffs ? precomputedTssClient : await this . precompute_secp256k1 ( ) ;
1357+ const isAlreadyPrecomputed = precomputedTssClient ?. client && precomputedTssClient ?. serverCoeffs ;
1358+ const { client, serverCoeffs } = isAlreadyPrecomputed ? precomputedTssClient : await this . precompute_secp256k1 ( ) ;
13511359
13521360 const { signatures } = this ;
13531361 if ( ! signatures ) {
13541362 throw CoreKitError . signaturesNotPresent ( ) ;
13551363 }
13561364
1357- const { r, s, recoveryParam } = await client . sign ( data . toString ( "base64" ) , true , "" , "keccak256" , {
1358- signatures,
1359- } ) ;
1365+ try {
1366+ return await executeSign ( client , serverCoeffs , data , signatures ) ;
1367+ } catch ( error ) {
1368+ if ( ! isAlreadyPrecomputed ) {
1369+ throw error ;
1370+ }
1371+ // Retry with new client if precomputed client failed, this is to handle the case when precomputed session might have expired
1372+ const { client : newClient , serverCoeffs : newServerCoeffs } = await this . precompute_secp256k1 ( ) ;
1373+ const result = await executeSign ( newClient , newServerCoeffs , data , signatures ) ;
13601374
1361- // skip await cleanup
1362- client . cleanup ( { signatures, server_coeffs : serverCoeffs } ) ;
1363- return { v : recoveryParam , r : scalarBNToBufferSEC1 ( r ) , s : scalarBNToBufferSEC1 ( s ) } ;
1375+ return result ;
1376+ }
13641377 }
13651378
13661379 private async sign_ed25519 ( data : Buffer , hashed : boolean = false ) : Promise < Buffer > {
0 commit comments