Skip to content

Commit ad5fe3e

Browse files
handle precomputed client expiry case
1 parent d49fbd4 commit ad5fe3e

File tree

1 file changed

+21
-8
lines changed

1 file changed

+21
-8
lines changed

src/mpcCoreKit.ts

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)