wallet: increaseFee call.
This commit is contained in:
parent
a4a408a18d
commit
cc58b507eb
@ -482,7 +482,7 @@ Wallet.prototype.retoken = co(function* retoken(passphrase) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
Wallet.prototype._retoken = co(function* retoken(passphrase) {
|
Wallet.prototype._retoken = co(function* retoken(passphrase) {
|
||||||
var master = yield this.unlock(passphrase);
|
yield this.unlock(passphrase);
|
||||||
|
|
||||||
this.tokenDepth++;
|
this.tokenDepth++;
|
||||||
this.token = this.getToken(this.tokenDepth);
|
this.token = this.getToken(this.tokenDepth);
|
||||||
@ -1483,6 +1483,99 @@ Wallet.prototype._send = co(function* send(options, passphrase) {
|
|||||||
return tx;
|
return tx;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Intentionally double-spend outputs by
|
||||||
|
* increasing fee for an existing transaction.
|
||||||
|
* @param {Hash} hash
|
||||||
|
* @param {Rate} rate
|
||||||
|
* @param {(String|Buffer)?} passphrase
|
||||||
|
* @returns {Promise} - Returns {@link TX}.
|
||||||
|
*/
|
||||||
|
|
||||||
|
Wallet.prototype.increaseFee = co(function* increaseFee(hash, rate, passphrase) {
|
||||||
|
var tx = yield this.getTX(hash);
|
||||||
|
var i, oldFee, fee, path, input, output, change;
|
||||||
|
|
||||||
|
if (!tx)
|
||||||
|
throw new Error('Transaction not found.');
|
||||||
|
|
||||||
|
if (tx.isCoinbase())
|
||||||
|
throw new Error('Transaction is a coinbase.');
|
||||||
|
|
||||||
|
yield this.fillHistory(tx);
|
||||||
|
|
||||||
|
if (!tx.hasCoins())
|
||||||
|
throw new Error('Not all coins available.');
|
||||||
|
|
||||||
|
if (!utils.isUInt32(rate))
|
||||||
|
throw new Error('Rate must be a number.');
|
||||||
|
|
||||||
|
oldFee = tx.getFee();
|
||||||
|
fee = tx.getMinFee(null, rate);
|
||||||
|
|
||||||
|
if (fee > constants.tx.MAX_FEE)
|
||||||
|
fee = constants.tx.MAX_FEE;
|
||||||
|
|
||||||
|
if (oldFee >= fee)
|
||||||
|
throw new Error('Fee is not increasing.');
|
||||||
|
|
||||||
|
tx = MTX.fromRaw(tx.toRaw());
|
||||||
|
|
||||||
|
for (i = 0; i < tx.inputs.length; i++) {
|
||||||
|
input = tx.inputs[i];
|
||||||
|
input.script.length = 0;
|
||||||
|
input.script.compile();
|
||||||
|
input.witness.length = 0;
|
||||||
|
input.witness.compile();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < tx.outputs.length; i++) {
|
||||||
|
output = tx.outputs[i];
|
||||||
|
path = yield this.getPath(output.getAddress());
|
||||||
|
|
||||||
|
if (!path)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (path.branch === 1) {
|
||||||
|
change = output;
|
||||||
|
tx.changeIndex = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!change)
|
||||||
|
throw new Error('No change output.');
|
||||||
|
|
||||||
|
change.value += oldFee;
|
||||||
|
|
||||||
|
if (tx.getFee() !== 0)
|
||||||
|
throw new Error('Arithmetic error for change.');
|
||||||
|
|
||||||
|
change.value -= fee;
|
||||||
|
|
||||||
|
if (change.value < 0)
|
||||||
|
throw new Error('Fee is too high.');
|
||||||
|
|
||||||
|
if (change.isDust(constants.tx.MIN_RELAY)) {
|
||||||
|
tx.outputs.splice(tx.changeIndex, 1);
|
||||||
|
tx.changeIndex = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
yield this.sign(tx, passphrase);
|
||||||
|
|
||||||
|
if (!tx.isSigned())
|
||||||
|
throw new Error('TX could not be fully signed.');
|
||||||
|
|
||||||
|
tx = tx.toTX();
|
||||||
|
|
||||||
|
this.logger.debug('Increasing fee for wallet tx (%s): %s', this.id, tx.rhash);
|
||||||
|
|
||||||
|
yield this.db.addTX(tx);
|
||||||
|
yield this.db.send(tx);
|
||||||
|
|
||||||
|
return tx;
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Resend pending wallet transactions.
|
* Resend pending wallet transactions.
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
|
|||||||
@ -1724,7 +1724,7 @@ WalletDB.prototype.rollback = co(function* rollback(height) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
WalletDB.prototype.revert = co(function* revert(height) {
|
WalletDB.prototype.revert = co(function* revert(height) {
|
||||||
var i, iter, item, height, block, tx;
|
var i, iter, item, block, tx;
|
||||||
|
|
||||||
iter = this.db.iterator({
|
iter = this.db.iterator({
|
||||||
gte: layout.b(height + 1),
|
gte: layout.b(height + 1),
|
||||||
@ -1739,7 +1739,6 @@ WalletDB.prototype.revert = co(function* revert(height) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
height = layout.bb(item.key);
|
|
||||||
block = BlockMapRecord.fromRaw(item.value);
|
block = BlockMapRecord.fromRaw(item.value);
|
||||||
|
|
||||||
for (i = block.txs.length - 1; i >= 0; i--) {
|
for (i = block.txs.length - 1; i >= 0; i--) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user