Browse Source

Add tests

psbt
junderw 6 years ago
parent
commit
5f26654802
No known key found for this signature in database GPG Key ID: B256185D3A971908
  1. 20
      src/psbt.js
  2. 28
      test/psbt.js
  3. 22
      ts_src/psbt.ts

20
src/psbt.js

@ -10,6 +10,10 @@ const payments = require('./payments');
const bscript = require('./script');
const transaction_1 = require('./transaction');
const varuint = require('varuint-bitcoin');
const DEFAULT_OPTS = {
network: networks_1.bitcoin,
maximumFeeRate: 5000,
};
class Psbt extends bip174_1.Psbt {
constructor(opts = {}) {
super();
@ -202,11 +206,11 @@ class Psbt extends bip174_1.Psbt {
const satoshis = feeRate * vsize;
if (feeRate >= this.opts.maximumFeeRate) {
throw new Error(
`Warning: You are paying around ${satoshis / 1e8} in fees, which ` +
`is ${feeRate} satoshi per byte for a transaction with a VSize of ` +
`${vsize} bytes (segwit counted as 0.25 byte per byte)\n` +
`Use setMaximumFeeRate method to raise your threshold, or pass ` +
`true to the first arg of extractTransaction.`,
`Warning: You are paying around ${(satoshis / 1e8).toFixed(8)} in ` +
`fees, which is ${feeRate} satoshi per byte for a transaction ` +
`with a VSize of ${vsize} bytes (segwit counted as 0.25 byte per ` +
`byte). Use setMaximumFeeRate method to raise your threshold, or ` +
`pass true to the first arg of extractTransaction.`,
);
}
}
@ -254,8 +258,6 @@ class Psbt extends bip174_1.Psbt {
const vout = this.__TX.ins[idx].index;
const out = cache.__NON_WITNESS_UTXO_TX_CACHE[idx].outs[vout];
inputAmount += out.value;
} else {
throw new Error('Missing input value: index #' + idx);
}
});
this.__EXTRACTED_TX = tx;
@ -341,10 +343,6 @@ class Psbt extends bip174_1.Psbt {
}
}
exports.Psbt = Psbt;
const DEFAULT_OPTS = {
network: networks_1.bitcoin,
maximumFeeRate: 5000,
};
function addNonWitnessTxCache(cache, input, inputIndex) {
cache.__NON_WITNESS_UTXO_BUF_CACHE[inputIndex] = input.nonWitnessUtxo;
const tx = transaction_1.Transaction.fromBuffer(input.nonWitnessUtxo);

28
test/psbt.js

@ -97,6 +97,16 @@ describe(`Psbt`, () => {
arg.forEach(a => adder(i, initBuffers(attr, a)))
} else {
adder(i, initBuffers(attr, arg))
if (attr === 'nonWitnessUtxo') {
const first = psbt.inputs[i].nonWitnessUtxo
psbt.__CACHE.__NON_WITNESS_UTXO_BUF_CACHE[i] = undefined
const second = psbt.inputs[i].nonWitnessUtxo
psbt.inputs[i].nonWitnessUtxo = Buffer.from([1,2,3])
psbt.__CACHE.__NON_WITNESS_UTXO_BUF_CACHE[i] = undefined
const third = psbt.inputs[i].nonWitnessUtxo
assert.ok(first.equals(second))
assert.ok(first.equals(third))
}
}
}
}
@ -140,6 +150,10 @@ describe(`Psbt`, () => {
it('Finalizes inputs and gives the expected PSBT', () => {
const psbt = Psbt.fromBase64(f.psbt)
assert.throws(() => {
psbt.getFeeRate()
}, new RegExp('PSBT must be finalized to calculate fee rate'))
psbt.finalizeAllInputs()
assert.strictEqual(psbt.toBase64(), f.result)
@ -196,6 +210,11 @@ describe(`Psbt`, () => {
ECPair.fromWIF(f.shouldThrow.WIF),
)
}, {message: f.shouldThrow.errorMessage})
assert.rejects(async () => {
await psbtThatShouldThrow.signInputAsync(
f.shouldThrow.inputToCheck,
)
}, new RegExp('Need Signer to sign input'))
})
})
})
@ -218,6 +237,11 @@ describe(`Psbt`, () => {
ECPair.fromWIF(f.shouldThrow.WIF),
)
}, {message: f.shouldThrow.errorMessage})
assert.throws(() => {
psbtThatShouldThrow.signInput(
f.shouldThrow.inputToCheck,
)
}, new RegExp('Need Signer to sign input'))
})
})
})
@ -252,6 +276,9 @@ describe(`Psbt`, () => {
console.log(psbt.toBase64())
}
})
assert.throws(() => {
psbt.addInput(f.inputData)
}, new RegExp('Duplicate input detected.'))
}
})
})
@ -307,6 +334,7 @@ describe(`Psbt`, () => {
index: 0
});
assert.strictEqual(psbt.inputCount, 1)
assert.strictEqual(psbt.__TX.ins[0].sequence, 0xffffffff)
psbt.setSequence(0, 0)
assert.strictEqual(psbt.__TX.ins[0].sequence, 0)

22
ts_src/psbt.ts

@ -17,6 +17,11 @@ import * as bscript from './script';
import { Output, Transaction } from './transaction';
const varuint = require('varuint-bitcoin');
const DEFAULT_OPTS: PsbtOpts = {
network: btcNetwork,
maximumFeeRate: 5000, // satoshi per byte
};
export class Psbt extends PsbtBase {
static fromTransaction<T extends typeof PsbtBase>(
this: T,
@ -250,11 +255,11 @@ export class Psbt extends PsbtBase {
const satoshis = feeRate * vsize;
if (feeRate >= this.opts.maximumFeeRate) {
throw new Error(
`Warning: You are paying around ${satoshis / 1e8} in fees, which ` +
`is ${feeRate} satoshi per byte for a transaction with a VSize of ` +
`${vsize} bytes (segwit counted as 0.25 byte per byte)\n` +
`Use setMaximumFeeRate method to raise your threshold, or pass ` +
`true to the first arg of extractTransaction.`,
`Warning: You are paying around ${(satoshis / 1e8).toFixed(8)} in ` +
`fees, which is ${feeRate} satoshi per byte for a transaction ` +
`with a VSize of ${vsize} bytes (segwit counted as 0.25 byte per ` +
`byte). Use setMaximumFeeRate method to raise your threshold, or ` +
`pass true to the first arg of extractTransaction.`,
);
}
}
@ -303,8 +308,6 @@ export class Psbt extends PsbtBase {
const vout = this.__TX.ins[idx].index;
const out = cache.__NON_WITNESS_UTXO_TX_CACHE[idx].outs[vout] as Output;
inputAmount += out.value;
} else {
throw new Error('Missing input value: index #' + idx);
}
});
this.__EXTRACTED_TX = tx;
@ -436,11 +439,6 @@ interface PsbtOpts {
maximumFeeRate: number;
}
const DEFAULT_OPTS = {
network: btcNetwork,
maximumFeeRate: 5000, // satoshi per byte
};
function addNonWitnessTxCache(
cache: PsbtCache,
input: PsbtInput,

Loading…
Cancel
Save