diff --git a/web3.js/src/transaction.js b/web3.js/src/transaction.js index 894945d6cf..f8013858db 100644 --- a/web3.js/src/transaction.js +++ b/web3.js/src/transaction.js @@ -163,10 +163,10 @@ export class Transaction { instruction.keys.forEach(keySignerPair => { const keyStr = keySignerPair.pubkey.toString(); - if (keySignerPair.isSigner) { - numRequiredSignatures += 1; - } if (!keys.includes(keyStr)) { + if (keySignerPair.isSigner) { + numRequiredSignatures += 1; + } keys.push(keyStr); } }); diff --git a/web3.js/test/transaction.test.js b/web3.js/test/transaction.test.js index cac5a73164..6bf505f646 100644 --- a/web3.js/test/transaction.test.js +++ b/web3.js/test/transaction.test.js @@ -56,6 +56,28 @@ test('transfer signatures', () => { expect(newTransaction).toEqual(orgTransaction); }); +test('dedup signatures', () => { + const account1 = new Account(); + const account2 = new Account(); + const recentBlockhash = account1.publicKey.toBase58(); // Fake recentBlockhash + const transfer1 = SystemProgram.transfer( + account1.publicKey, + account2.publicKey, + 123, + ); + const transfer2 = SystemProgram.transfer( + account1.publicKey, + account2.publicKey, + 123, + ); + + const orgTransaction = new Transaction({recentBlockhash}).add( + transfer1, + transfer2, + ); + orgTransaction.sign(account1); +}); + test('parse wire format and serialize', () => { const keypair = nacl.sign.keyPair.fromSeed( Uint8Array.from(Array(32).fill(8)),