From 8f7e2c7247558be08b2684403e2a6ef53654da22 Mon Sep 17 00:00:00 2001 From: Martynas Kazlauskas Date: Wed, 4 Jun 2025 07:39:48 +0300 Subject: [PATCH] fix(wallet): resolve only the own signed portions of the witness set "Only the portions of the witness set that were signed as a result of this call are returned to encourage dApps to verify the contents returned by this endpoint while building the final transaction." --- packages/wallet/src/cip30.ts | 5 ++++- .../wallet/test/integration/cip30mapping.test.ts | 16 +++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/wallet/src/cip30.ts b/packages/wallet/src/cip30.ts index 85716f888cb..ab1a4d59308 100644 --- a/packages/wallet/src/cip30.ts +++ b/packages/wallet/src/cip30.ts @@ -469,7 +469,10 @@ const baseCip30WalletApi = ( ); } - const cbor = Serialization.TransactionWitnessSet.fromCore({ signatures }).toCbor(); + const ownSignatures = new Map( + [...signatures.entries()].filter(([pubKey]) => !coreTx.witness.signatures.has(pubKey)) + ); + const cbor = Serialization.TransactionWitnessSet.fromCore({ signatures: ownSignatures }).toCbor(); return Promise.resolve(cbor); } catch (error) { if (error instanceof TxSignError) { diff --git a/packages/wallet/test/integration/cip30mapping.test.ts b/packages/wallet/test/integration/cip30mapping.test.ts index 82219fb62a5..4b5cac5f7a2 100644 --- a/packages/wallet/test/integration/cip30mapping.test.ts +++ b/packages/wallet/test/integration/cip30mapping.test.ts @@ -512,9 +512,19 @@ describe('cip30', () => { hexTx = Serialization.Transaction.fromCore(finalizedTx).toCbor(); }); - it('resolves with TransactionWitnessSet', async () => { - const cip30witnessSet = await api.signTx(context, hexTx); - expect(() => Serialization.TransactionWitnessSet.fromCbor(HexBlob(cip30witnessSet))).not.toThrow(); + it('resolves own signatures with TransactionWitnessSet', async () => { + const cip30witnessSetCbor = await api.signTx(context, hexTx); + const cip30witnessSet = Serialization.TransactionWitnessSet.fromCbor(HexBlob(cip30witnessSetCbor)); + const resolvedSignedByKeys = cip30witnessSet + .vkeys()! + .toCore() + .map(([pubKey]) => pubKey); + const preExistingSignatures = finalizedTx.witness.signatures.entries(); + + expect(resolvedSignedByKeys.length).toBeGreaterThan(0); + for (const [preExistingKey] of preExistingSignatures) { + expect(resolvedSignedByKeys).not.toContain(preExistingKey); + } }); it('passes through sender from dapp connector context', async () => {