|
|
@ -205,7 +205,7 @@ Transaction.prototype.getSerializationError = function(opts) { |
|
|
|
unspentError = this._hasFeeError(opts, unspent); |
|
|
|
} |
|
|
|
|
|
|
|
return unspentError || |
|
|
|
return unspentError || |
|
|
|
this._hasDustOutputs(opts) || |
|
|
|
this._isMissingSignatures(opts); |
|
|
|
}; |
|
|
@ -394,7 +394,7 @@ Transaction.prototype._checkConsistency = function() { |
|
|
|
$.checkState(this._changeScript); |
|
|
|
$.checkState(this.outputs[this._changeIndex]); |
|
|
|
$.checkState(this.outputs[this._changeIndex].script.toString() === |
|
|
|
this._changeScript.toString()); |
|
|
|
this._changeScript.toString()); |
|
|
|
} |
|
|
|
// TODO: add other checks
|
|
|
|
}; |
|
|
@ -634,6 +634,21 @@ Transaction.prototype.fee = function(amount) { |
|
|
|
return this; |
|
|
|
}; |
|
|
|
|
|
|
|
/** |
|
|
|
* Manually set the fee per KB for this transaction. Beware that this resets all the signatures |
|
|
|
* for inputs (in further versions, SIGHASH_SINGLE or SIGHASH_NONE signatures will not |
|
|
|
* be reset). |
|
|
|
* |
|
|
|
* @param {number} amount satoshis per KB to be sent |
|
|
|
* @return {Transaction} this, for chaining |
|
|
|
*/ |
|
|
|
Transaction.prototype.feePerKb = function(amount) { |
|
|
|
$.checkArgument(_.isNumber(amount), 'amount must be a number'); |
|
|
|
this._feePerKb = amount; |
|
|
|
this._updateChangeOutput(); |
|
|
|
return this; |
|
|
|
}; |
|
|
|
|
|
|
|
/* Output management */ |
|
|
|
|
|
|
|
/** |
|
|
@ -831,7 +846,7 @@ Transaction.prototype.getFee = function() { |
|
|
|
Transaction.prototype._estimateFee = function() { |
|
|
|
var estimatedSize = this._estimateSize(); |
|
|
|
var available = this._getUnspentValue(); |
|
|
|
return Transaction._estimateFee(estimatedSize, available); |
|
|
|
return Transaction._estimateFee(estimatedSize, available, this._feePerKb); |
|
|
|
}; |
|
|
|
|
|
|
|
Transaction.prototype._getUnspentValue = function() { |
|
|
@ -844,12 +859,12 @@ Transaction.prototype._clearSignatures = function() { |
|
|
|
}); |
|
|
|
}; |
|
|
|
|
|
|
|
Transaction._estimateFee = function(size, amountAvailable) { |
|
|
|
var fee = Math.ceil(size / Transaction.FEE_PER_KB); |
|
|
|
Transaction._estimateFee = function(size, amountAvailable, feePerKb) { |
|
|
|
var fee = Math.ceil(size / 1000) * (feePerKb || Transaction.FEE_PER_KB); |
|
|
|
if (amountAvailable > fee) { |
|
|
|
size += Transaction.CHANGE_OUTPUT_MAX_SIZE; |
|
|
|
} |
|
|
|
return Math.ceil(size / 1000) * Transaction.FEE_PER_KB; |
|
|
|
return Math.ceil(size / 1000) * (feePerKb || Transaction.FEE_PER_KB); |
|
|
|
}; |
|
|
|
|
|
|
|
Transaction.prototype._estimateSize = function() { |
|
|
|