Skip to content

Commit e484482

Browse files
committed
Check signatures for finalized inputs too
1 parent 1803b64 commit e484482

File tree

3 files changed

+45
-4
lines changed

3 files changed

+45
-4
lines changed

src/psbt.js

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -626,8 +626,27 @@ function checkFees(psbt, cache, opts) {
626626
function checkInputsForPartialSig(inputs, action) {
627627
inputs.forEach(input => {
628628
let throws = false;
629-
if ((input.partialSig || []).length === 0) return;
630-
input.partialSig.forEach(pSig => {
629+
let pSigs = [];
630+
if ((input.partialSig || []).length === 0) {
631+
if (!input.finalScriptSig && !input.finalScriptWitness) return;
632+
const scriptItems = !input.finalScriptSig
633+
? []
634+
: bscript.decompile(input.finalScriptSig) || [];
635+
const witnessItems = !input.finalScriptWitness
636+
? []
637+
: bscript.decompile(input.finalScriptWitness) || [];
638+
pSigs = scriptItems
639+
.concat(witnessItems)
640+
.filter(item => {
641+
return (
642+
Buffer.isBuffer(item) && bscript.isCanonicalScriptSignature(item)
643+
);
644+
})
645+
.map(sig => ({ signature: sig }));
646+
} else {
647+
pSigs = input.partialSig;
648+
}
649+
pSigs.forEach(pSig => {
631650
const { hashType } = bscript.signature.decode(pSig.signature);
632651
const whitelist = [];
633652
const isAnyoneCanPay =

test/psbt.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,9 @@ describe(`Psbt`, () => {
625625
}, new RegExp('Can not modify transaction, signatures exist.'))
626626
psbt.validateSignaturesOfInput(0)
627627
psbt.finalizeAllInputs()
628+
assert.throws(() => {
629+
psbt.setVersion(3)
630+
}, new RegExp('Can not modify transaction, signatures exist.'))
628631
assert.strictEqual(
629632
psbt.extractTransaction().toHex(),
630633
'02000000013ebc8203037dda39d482bf41ff3be955996c50d9d4f7cfc3d2097a694a7' +

ts_src/psbt.ts

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -795,8 +795,27 @@ function checkFees(psbt: Psbt, cache: PsbtCache, opts: PsbtOpts): void {
795795
function checkInputsForPartialSig(inputs: PsbtInput[], action: string): void {
796796
inputs.forEach(input => {
797797
let throws = false;
798-
if ((input.partialSig || []).length === 0) return;
799-
input.partialSig!.forEach(pSig => {
798+
let pSigs: PartialSig[] = [];
799+
if ((input.partialSig || []).length === 0) {
800+
if (!input.finalScriptSig && !input.finalScriptWitness) return;
801+
const scriptItems = !input.finalScriptSig
802+
? []
803+
: bscript.decompile(input.finalScriptSig) || [];
804+
const witnessItems = !input.finalScriptWitness
805+
? []
806+
: bscript.decompile(input.finalScriptWitness) || [];
807+
pSigs = scriptItems
808+
.concat(witnessItems)
809+
.filter(item => {
810+
return (
811+
Buffer.isBuffer(item) && bscript.isCanonicalScriptSignature(item)
812+
);
813+
})
814+
.map(sig => ({ signature: sig })) as PartialSig[];
815+
} else {
816+
pSigs = input.partialSig!;
817+
}
818+
pSigs.forEach(pSig => {
800819
const { hashType } = bscript.signature.decode(pSig.signature);
801820
const whitelist: string[] = [];
802821
const isAnyoneCanPay = hashType & Transaction.SIGHASH_ANYONECANPAY;

0 commit comments

Comments
 (0)