diff --git a/modules/utxo-lib/src/bitgo/wallet/Unspent.ts b/modules/utxo-lib/src/bitgo/wallet/Unspent.ts index af5f190d25..7d675be66e 100644 --- a/modules/utxo-lib/src/bitgo/wallet/Unspent.ts +++ b/modules/utxo-lib/src/bitgo/wallet/Unspent.ts @@ -193,6 +193,11 @@ export function updateReplayProtectionUnspentToPsbt( } else if (!isZcash && !input.nonWitnessUtxo) { psbt.updateInput(inputIndex, { nonWitnessUtxo: (u as UnspentWithPrevTx).prevTx }); } + + const sighashType = getDefaultSigHash(psbt.network); + if (psbt.data.inputs[inputIndex].sighashType === undefined) { + psbt.updateInput(inputIndex, { sighashType }); + } } function addUnspentToPsbt( diff --git a/modules/utxo-lib/test/bitgo/psbt/Psbt.ts b/modules/utxo-lib/test/bitgo/psbt/Psbt.ts index 639a930390..b14f027454 100644 --- a/modules/utxo-lib/test/bitgo/psbt/Psbt.ts +++ b/modules/utxo-lib/test/bitgo/psbt/Psbt.ts @@ -35,6 +35,7 @@ import { withUnsafeNonSegwit, getTransactionAmountsFromPsbt, WalletUnspent, + getDefaultSigHash, } from '../../../src/bitgo'; import { createOutputScript2of3, @@ -432,8 +433,8 @@ describe('isTransactionWithKeyPathSpendInput', function () { describe('Parse PSBT', function () { it('p2shP2pk parsing', function () { const signer = rootWalletKeys['user']; - const psbt = createPsbtForNetwork({ network }); - const unspent = mockReplayProtectionUnspent(network, BigInt(1e8), { key: signer }); + const psbt = createPsbtForNetwork({ network: networks.bitcoincash }); + const unspent = mockReplayProtectionUnspent(networks.bitcoincash, BigInt(1e8), { key: signer }); const { redeemScript } = createOutputScriptP2shP2pk(signer.publicKey); assert(redeemScript); addReplayProtectionUnspentToPsbt(psbt, unspent, redeemScript); @@ -454,10 +455,12 @@ describe('Parse PSBT', function () { assert.strictEqual(parsed.scriptType, 'p2shP2pk'); assert.strictEqual(parsed.signatures?.length, 1); - assert.strictEqual(parsed.signatures[0].length, 72); assert.strictEqual(parsed.publicKeys.length, 1); assert.ok(parsed.publicKeys[0].length === 33); assert.ok(parsed.pubScript.equals(redeemScript)); + + const sighash: number = parsed.signatures[0][parsed.signatures[0].length - 1]; + assert.strictEqual(sighash, getDefaultSigHash(psbt.network)); }); it('fail to parse finalized psbt', function () {