mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-19 15:14:23 +01:00
Added wallet related error codes
New codes: FUND_MAX_EXCEEDED, FUND_CANNOT_AFFORD, FUND_DUST_LIMIT_UNMET. The error message "Cannot afford fee" was not exactly correct because it would also occur if the amount requested could not be afforded. So I changed it to the more generic "Cannot afford transaction". Other things: * Fixed off-by-one satoshi in fundchannel manpage. * Changed 'arror' to 'error' because we are not pirates.
This commit is contained in:
committed by
Christian Decker
parent
2d95ed738e
commit
8f0ef1636f
@@ -12,6 +12,21 @@ void wtx_init(struct command *cmd, struct wallet_tx * wtx)
|
|||||||
wtx->all_funds = false;
|
wtx->all_funds = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool check_amount(const struct wallet_tx *tx)
|
||||||
|
{
|
||||||
|
if (!tx->utxos) {
|
||||||
|
command_fail(tx->cmd, FUND_CANNOT_AFFORD,
|
||||||
|
"Cannot afford funding transaction");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (tx->amount < 546) {
|
||||||
|
command_fail(tx->cmd, FUND_DUST_LIMIT_UNMET,
|
||||||
|
"Dust limit unmet");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool wtx_select_utxos(struct wallet_tx * tx, u32 fee_rate_per_kw,
|
bool wtx_select_utxos(struct wallet_tx * tx, u32 fee_rate_per_kw,
|
||||||
size_t out_len)
|
size_t out_len)
|
||||||
{
|
{
|
||||||
@@ -21,23 +36,18 @@ bool wtx_select_utxos(struct wallet_tx * tx, u32 fee_rate_per_kw,
|
|||||||
fee_rate_per_kw, out_len,
|
fee_rate_per_kw, out_len,
|
||||||
&tx->amount,
|
&tx->amount,
|
||||||
&fee_estimate);
|
&fee_estimate);
|
||||||
if (!tx->utxos || tx->amount < 546) {
|
if (!check_amount(tx))
|
||||||
command_fail(tx->cmd, LIGHTNINGD,
|
|
||||||
"Cannot afford fee %"PRIu64,
|
|
||||||
fee_estimate);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
tx->change = 0;
|
tx->change = 0;
|
||||||
} else {
|
} else {
|
||||||
tx->utxos = wallet_select_coins(tx->cmd, tx->cmd->ld->wallet,
|
tx->utxos = wallet_select_coins(tx->cmd, tx->cmd->ld->wallet,
|
||||||
tx->amount,
|
tx->amount,
|
||||||
fee_rate_per_kw, out_len,
|
fee_rate_per_kw, out_len,
|
||||||
&fee_estimate, &tx->change);
|
&fee_estimate, &tx->change);
|
||||||
if (!tx->utxos || tx->amount < 546) {
|
if (!check_amount(tx))
|
||||||
command_fail(tx->cmd, LIGHTNINGD,
|
|
||||||
"Cannot afford funding transaction");
|
|
||||||
return false;
|
return false;
|
||||||
}
|
|
||||||
if (tx->change < 546) {
|
if (tx->change < 546) {
|
||||||
tx->change = 0;
|
tx->change = 0;
|
||||||
tx->change_key_index = 0;
|
tx->change_key_index = 0;
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ for the channel.
|
|||||||
|
|
||||||
'satoshi' is the amount in satoshis taken from the internal wallet to fund the channel.
|
'satoshi' is the amount in satoshis taken from the internal wallet to fund the channel.
|
||||||
The string 'all' can be used to specify all available funds.
|
The string 'all' can be used to specify all available funds.
|
||||||
This value must be greater than the dust limit, currently set to 546.
|
This value cannot be less than the dust limit, currently set to 546.
|
||||||
And it must be less than 1<<24 (approximately 0.16778 BTC).
|
And it must be less than 1<<24 (approximately 0.16778 BTC).
|
||||||
|
|
||||||
RETURN VALUE
|
RETURN VALUE
|
||||||
@@ -35,14 +35,11 @@ On failure, an error is reported and the channel is not funded.
|
|||||||
|
|
||||||
The following error codes may occur:
|
The following error codes may occur:
|
||||||
|
|
||||||
* -1. Catchall nonspecific arror.
|
* -1. Catchall nonspecific error.
|
||||||
|
* 300. The maximum allowed funding amount is exceeded.
|
||||||
The above error may include a descriptive message indicating:
|
* 301. There are not enough funds in the internal wallet (including fees) to
|
||||||
|
create the transaction.
|
||||||
* The 'id' is invalid.
|
* 302. The dust limit is not met.
|
||||||
* There are not enough funds in the internal wallet to create the transaction.
|
|
||||||
* The maximum allowed funding amount is exceeded.
|
|
||||||
* 'satoshi' is less than the dust limit.
|
|
||||||
|
|
||||||
Failure may also occur if *lightningd* and the peer cannot agree on channel
|
Failure may also occur if *lightningd* and the peer cannot agree on channel
|
||||||
parameters (funding limits, channel reserves, fees, etc.).
|
parameters (funding limits, channel reserves, fees, etc.).
|
||||||
|
|||||||
@@ -33,11 +33,14 @@ be returned.
|
|||||||
'tx' represents the raw bitcoin, fully signed, transaction
|
'tx' represents the raw bitcoin, fully signed, transaction
|
||||||
and 'txid' represent the bitcoin transaction id.
|
and 'txid' represent the bitcoin transaction id.
|
||||||
|
|
||||||
ERRORS
|
On failure, an error is reported and the channel is not funded.
|
||||||
------
|
|
||||||
If an incorrect address is supplied or the 'satoshi'
|
The following error codes may occur:
|
||||||
parameter exceeds the amount in the internal wallet
|
|
||||||
an error message will be returned.
|
* -1. Catchall nonspecific error.
|
||||||
|
* 301. There are not enough funds in the internal wallet (including fees) to
|
||||||
|
create the transaction.
|
||||||
|
* 302. The dust limit is not met.
|
||||||
|
|
||||||
AUTHOR
|
AUTHOR
|
||||||
------
|
------
|
||||||
|
|||||||
@@ -29,6 +29,11 @@
|
|||||||
#define PAY_UNSPECIFIED_ERROR 209
|
#define PAY_UNSPECIFIED_ERROR 209
|
||||||
#define PAY_STOPPED_RETRYING 210
|
#define PAY_STOPPED_RETRYING 210
|
||||||
|
|
||||||
|
/* `fundchannel` or `withdraw` errors */
|
||||||
|
#define FUND_MAX_EXCEEDED 300
|
||||||
|
#define FUND_CANNOT_AFFORD 301
|
||||||
|
#define FUND_DUST_LIMIT_UNMET 302
|
||||||
|
|
||||||
/* Errors from `invoice` command */
|
/* Errors from `invoice` command */
|
||||||
#define INVOICE_LABEL_ALREADY_EXISTS 900
|
#define INVOICE_LABEL_ALREADY_EXISTS 900
|
||||||
#define INVOICE_PREIMAGE_ALREADY_EXISTS 901
|
#define INVOICE_PREIMAGE_ALREADY_EXISTS 901
|
||||||
|
|||||||
@@ -922,7 +922,7 @@ static void json_fund_channel(struct command *cmd,
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
if (fc->wtx.amount > MAX_FUNDING_SATOSHI) {
|
if (fc->wtx.amount > MAX_FUNDING_SATOSHI) {
|
||||||
command_fail(cmd, JSONRPC2_INVALID_PARAMS,
|
command_fail(cmd, FUND_MAX_EXCEEDED,
|
||||||
"Funding satoshi must be <= %d",
|
"Funding satoshi must be <= %d",
|
||||||
MAX_FUNDING_SATOSHI);
|
MAX_FUNDING_SATOSHI);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -3915,7 +3915,7 @@ class LightningDTests(BaseLightningDTests):
|
|||||||
|
|
||||||
# This should fail, can't even afford fee.
|
# This should fail, can't even afford fee.
|
||||||
self.assertRaises(ValueError, l1.rpc.withdraw, waddr, 'all')
|
self.assertRaises(ValueError, l1.rpc.withdraw, waddr, 'all')
|
||||||
l1.daemon.wait_for_log('Cannot afford fee')
|
l1.daemon.wait_for_log('Cannot afford funding transaction')
|
||||||
|
|
||||||
def test_funding_change(self):
|
def test_funding_change(self):
|
||||||
"""Add some funds, fund a channel, and make sure we remember the change
|
"""Add some funds, fund a channel, and make sure we remember the change
|
||||||
|
|||||||
Reference in New Issue
Block a user