mirror of
https://github.com/aljazceru/lightning.git
synced 2025-12-19 15:14:23 +01:00
option cleanup: --dev-override-fee-rates
Make --override-fee-rates a dev option. We use default-fee-rate in its place, which (since bitcoind won't give fee estimates in regtest mode for short chains) gives an effective feerate of 15000/7500/3750. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
This commit is contained in:
@@ -595,10 +595,13 @@ static u32 guess_feerate(const struct chain_topology *topo, enum feerate feerate
|
|||||||
|
|
||||||
u32 get_feerate(const struct chain_topology *topo, enum feerate feerate)
|
u32 get_feerate(const struct chain_topology *topo, enum feerate feerate)
|
||||||
{
|
{
|
||||||
if (topo->override_fee_rate) {
|
#if DEVELOPER
|
||||||
|
if (topo->dev_override_fee_rate) {
|
||||||
log_debug(topo->log, "Forcing fee rate, ignoring estimate");
|
log_debug(topo->log, "Forcing fee rate, ignoring estimate");
|
||||||
return topo->override_fee_rate[feerate];
|
return topo->dev_override_fee_rate[feerate];
|
||||||
} else if (topo->feerate[feerate] == 0) {
|
}
|
||||||
|
#endif
|
||||||
|
if (topo->feerate[feerate] == 0) {
|
||||||
return guess_feerate(topo, feerate);
|
return guess_feerate(topo, feerate);
|
||||||
}
|
}
|
||||||
return topo->feerate[feerate];
|
return topo->feerate[feerate];
|
||||||
@@ -640,18 +643,18 @@ static void json_dev_setfees(struct command *cmd,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!topo->override_fee_rate) {
|
if (!topo->dev_override_fee_rate) {
|
||||||
u32 fees[NUM_FEERATES];
|
u32 fees[NUM_FEERATES];
|
||||||
for (size_t i = 0; i < ARRAY_SIZE(fees); i++)
|
for (size_t i = 0; i < ARRAY_SIZE(fees); i++)
|
||||||
fees[i] = get_feerate(topo, i);
|
fees[i] = get_feerate(topo, i);
|
||||||
topo->override_fee_rate = tal_dup_arr(topo, u32, fees,
|
topo->dev_override_fee_rate = tal_dup_arr(topo, u32, fees,
|
||||||
ARRAY_SIZE(fees), 0);
|
ARRAY_SIZE(fees), 0);
|
||||||
}
|
}
|
||||||
for (size_t i = 0; i < NUM_FEERATES; i++) {
|
for (size_t i = 0; i < NUM_FEERATES; i++) {
|
||||||
if (!ratetok[i])
|
if (!ratetok[i])
|
||||||
continue;
|
continue;
|
||||||
if (!json_tok_number(buffer, ratetok[i],
|
if (!json_tok_number(buffer, ratetok[i],
|
||||||
&topo->override_fee_rate[i])) {
|
&topo->dev_override_fee_rate[i])) {
|
||||||
command_fail(cmd, "Invalid feerate %.*s",
|
command_fail(cmd, "Invalid feerate %.*s",
|
||||||
ratetok[i]->end - ratetok[i]->start,
|
ratetok[i]->end - ratetok[i]->start,
|
||||||
buffer + ratetok[i]->start);
|
buffer + ratetok[i]->start);
|
||||||
@@ -660,20 +663,20 @@ static void json_dev_setfees(struct command *cmd,
|
|||||||
}
|
}
|
||||||
log_debug(topo->log,
|
log_debug(topo->log,
|
||||||
"dev-setfees: fees now %u/%u/%u",
|
"dev-setfees: fees now %u/%u/%u",
|
||||||
topo->override_fee_rate[FEERATE_IMMEDIATE],
|
topo->dev_override_fee_rate[FEERATE_IMMEDIATE],
|
||||||
topo->override_fee_rate[FEERATE_NORMAL],
|
topo->dev_override_fee_rate[FEERATE_NORMAL],
|
||||||
topo->override_fee_rate[FEERATE_SLOW]);
|
topo->dev_override_fee_rate[FEERATE_SLOW]);
|
||||||
|
|
||||||
notify_feerate_change(cmd->ld);
|
notify_feerate_change(cmd->ld);
|
||||||
|
|
||||||
response = new_json_result(cmd);
|
response = new_json_result(cmd);
|
||||||
json_object_start(response, NULL);
|
json_object_start(response, NULL);
|
||||||
json_add_num(response, "immediate",
|
json_add_num(response, "immediate",
|
||||||
topo->override_fee_rate[FEERATE_IMMEDIATE]);
|
topo->dev_override_fee_rate[FEERATE_IMMEDIATE]);
|
||||||
json_add_num(response, "normal",
|
json_add_num(response, "normal",
|
||||||
topo->override_fee_rate[FEERATE_NORMAL]);
|
topo->dev_override_fee_rate[FEERATE_NORMAL]);
|
||||||
json_add_num(response, "slow",
|
json_add_num(response, "slow",
|
||||||
topo->override_fee_rate[FEERATE_SLOW]);
|
topo->dev_override_fee_rate[FEERATE_SLOW]);
|
||||||
json_object_end(response);
|
json_object_end(response);
|
||||||
command_success(cmd, response);
|
command_success(cmd, response);
|
||||||
}
|
}
|
||||||
@@ -727,10 +730,12 @@ struct chain_topology *new_topology(struct lightningd *ld, struct log *log)
|
|||||||
topo->log = log;
|
topo->log = log;
|
||||||
topo->default_fee_rate = 40000;
|
topo->default_fee_rate = 40000;
|
||||||
memset(topo->feerate, 0, sizeof(topo->feerate));
|
memset(topo->feerate, 0, sizeof(topo->feerate));
|
||||||
topo->override_fee_rate = NULL;
|
|
||||||
topo->bitcoind = new_bitcoind(topo, ld, log);
|
topo->bitcoind = new_bitcoind(topo, ld, log);
|
||||||
topo->wallet = ld->wallet;
|
topo->wallet = ld->wallet;
|
||||||
topo->poll_seconds = 30;
|
topo->poll_seconds = 30;
|
||||||
|
#if DEVELOPER
|
||||||
|
topo->dev_override_fee_rate = NULL;
|
||||||
|
#endif
|
||||||
return topo;
|
return topo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -104,15 +104,17 @@ struct chain_topology {
|
|||||||
/* Bitcoin transactions we're broadcasting */
|
/* Bitcoin transactions we're broadcasting */
|
||||||
struct list_head outgoing_txs;
|
struct list_head outgoing_txs;
|
||||||
|
|
||||||
/* Force a particular fee rate regardless of estimatefee (satoshis/kw) */
|
|
||||||
u32 *override_fee_rate;
|
|
||||||
|
|
||||||
/* What fee we use if estimatefee fails (satoshis/kw) */
|
/* What fee we use if estimatefee fails (satoshis/kw) */
|
||||||
u32 default_fee_rate;
|
u32 default_fee_rate;
|
||||||
|
|
||||||
/* Transactions/txos we are watching. */
|
/* Transactions/txos we are watching. */
|
||||||
struct txwatch_hash txwatches;
|
struct txwatch_hash txwatches;
|
||||||
struct txowatch_hash txowatches;
|
struct txowatch_hash txowatches;
|
||||||
|
|
||||||
|
#if DEVELOPER
|
||||||
|
/* Force a particular fee rate regardless of estimatefee (satoshis/kw) */
|
||||||
|
u32 *dev_override_fee_rate;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Information relevant to locating a TX in a blockchain. */
|
/* Information relevant to locating a TX in a blockchain. */
|
||||||
|
|||||||
@@ -266,29 +266,6 @@ static char *opt_set_alias(const char *arg, struct lightningd *ld)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *opt_set_fee_rates(const char *arg, struct chain_topology *topo)
|
|
||||||
{
|
|
||||||
tal_free(topo->override_fee_rate);
|
|
||||||
topo->override_fee_rate = tal_arr(topo, u32, 3);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < tal_count(topo->override_fee_rate); i++) {
|
|
||||||
char *endp;
|
|
||||||
char term;
|
|
||||||
|
|
||||||
if (i == tal_count(topo->override_fee_rate)-1)
|
|
||||||
term = '\0';
|
|
||||||
else
|
|
||||||
term = '/';
|
|
||||||
topo->override_fee_rate[i] = strtol(arg, &endp, 10);
|
|
||||||
if (endp == arg || *endp != term)
|
|
||||||
return tal_fmt(NULL,
|
|
||||||
"Feerates must be <num>/<num>/<num>");
|
|
||||||
|
|
||||||
arg = endp + 1;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *opt_set_offline(struct lightningd *ld)
|
static char *opt_set_offline(struct lightningd *ld)
|
||||||
{
|
{
|
||||||
ld->reconnect = false;
|
ld->reconnect = false;
|
||||||
@@ -345,9 +322,6 @@ static void config_register_opts(struct lightningd *ld)
|
|||||||
opt_register_arg("--commit-fee=<percent>", opt_set_u32, opt_show_u32,
|
opt_register_arg("--commit-fee=<percent>", opt_set_u32, opt_show_u32,
|
||||||
&ld->config.commitment_fee_percent,
|
&ld->config.commitment_fee_percent,
|
||||||
"Percentage of fee to request for their commitment");
|
"Percentage of fee to request for their commitment");
|
||||||
opt_register_arg("--override-fee-rates", opt_set_fee_rates, NULL,
|
|
||||||
ld->topology,
|
|
||||||
"Force a specific rates (immediate/normal/slow) in satoshis per kw regardless of estimated fees");
|
|
||||||
opt_register_arg("--default-fee-rate", opt_set_u32, opt_show_u32,
|
opt_register_arg("--default-fee-rate", opt_set_u32, opt_show_u32,
|
||||||
&ld->topology->default_fee_rate,
|
&ld->topology->default_fee_rate,
|
||||||
"Satoshis per kw if can't estimate fees");
|
"Satoshis per kw if can't estimate fees");
|
||||||
@@ -427,6 +401,29 @@ static void config_register_opts(struct lightningd *ld)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if DEVELOPER
|
#if DEVELOPER
|
||||||
|
static char *opt_set_fee_rates(const char *arg, struct chain_topology *topo)
|
||||||
|
{
|
||||||
|
tal_free(topo->dev_override_fee_rate);
|
||||||
|
topo->dev_override_fee_rate = tal_arr(topo, u32, 3);
|
||||||
|
|
||||||
|
for (size_t i = 0; i < tal_count(topo->dev_override_fee_rate); i++) {
|
||||||
|
char *endp;
|
||||||
|
char term;
|
||||||
|
|
||||||
|
if (i == tal_count(topo->dev_override_fee_rate)-1)
|
||||||
|
term = '\0';
|
||||||
|
else
|
||||||
|
term = '/';
|
||||||
|
topo->dev_override_fee_rate[i] = strtol(arg, &endp, 10);
|
||||||
|
if (endp == arg || *endp != term)
|
||||||
|
return tal_fmt(NULL,
|
||||||
|
"Feerates must be <num>/<num>/<num>");
|
||||||
|
|
||||||
|
arg = endp + 1;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void dev_register_opts(struct lightningd *ld)
|
static void dev_register_opts(struct lightningd *ld)
|
||||||
{
|
{
|
||||||
opt_register_noarg("--dev-no-reconnect", opt_set_invbool,
|
opt_register_noarg("--dev-no-reconnect", opt_set_invbool,
|
||||||
@@ -447,6 +444,9 @@ static void dev_register_opts(struct lightningd *ld)
|
|||||||
opt_register_arg("--dev-bitcoind-poll", opt_set_u32, opt_show_u32,
|
opt_register_arg("--dev-bitcoind-poll", opt_set_u32, opt_show_u32,
|
||||||
&ld->topology->poll_seconds,
|
&ld->topology->poll_seconds,
|
||||||
"Time between polling for new transactions");
|
"Time between polling for new transactions");
|
||||||
|
opt_register_arg("--dev-override-fee-rates", opt_set_fee_rates, NULL,
|
||||||
|
ld->topology,
|
||||||
|
"Force a specific rates (immediate/normal/slow) in satoshis per kw regardless of estimated fees");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -942,13 +942,6 @@ static void add_config(struct lightningd *ld,
|
|||||||
answer = (const char *)ld->alias;
|
answer = (const char *)ld->alias;
|
||||||
} else if (opt->cb_arg == (void *)arg_log_to_file) {
|
} else if (opt->cb_arg == (void *)arg_log_to_file) {
|
||||||
answer = ld->logfile;
|
answer = ld->logfile;
|
||||||
} else if (opt->cb_arg == (void *)opt_set_fee_rates) {
|
|
||||||
struct chain_topology *topo = ld->topology;
|
|
||||||
if (topo->override_fee_rate)
|
|
||||||
answer = tal_fmt(name0, "%u/%u/%u",
|
|
||||||
topo->override_fee_rate[0],
|
|
||||||
topo->override_fee_rate[1],
|
|
||||||
topo->override_fee_rate[2]);
|
|
||||||
} else if (opt->cb_arg == (void *)opt_set_port) {
|
} else if (opt->cb_arg == (void *)opt_set_port) {
|
||||||
if (!deprecated_apis)
|
if (!deprecated_apis)
|
||||||
answer = tal_fmt(name0, "%u", ld->portnum);
|
answer = tal_fmt(name0, "%u", ld->portnum);
|
||||||
|
|||||||
@@ -1478,6 +1478,7 @@ class LightningDTests(BaseLightningDTests):
|
|||||||
# Get close confirmed
|
# Get close confirmed
|
||||||
l1.bitcoin.generate_block(100)
|
l1.bitcoin.generate_block(100)
|
||||||
|
|
||||||
|
@unittest.skipIf(not DEVELOPER, "needs dev-override-feerates")
|
||||||
def test_closing_different_fees(self):
|
def test_closing_different_fees(self):
|
||||||
l1 = self.node_factory.get_node()
|
l1 = self.node_factory.get_node()
|
||||||
|
|
||||||
@@ -1493,9 +1494,9 @@ class LightningDTests(BaseLightningDTests):
|
|||||||
for feerate in feerates:
|
for feerate in feerates:
|
||||||
for amount in amounts:
|
for amount in amounts:
|
||||||
p = self.node_factory.get_node(options={
|
p = self.node_factory.get_node(options={
|
||||||
'override-fee-rates': '{}/{}/{}'.format(feerate[0],
|
'dev-override-fee-rates': '{}/{}/{}'.format(feerate[0],
|
||||||
feerate[1],
|
feerate[1],
|
||||||
feerate[2])
|
feerate[2])
|
||||||
})
|
})
|
||||||
p.feerate = feerate
|
p.feerate = feerate
|
||||||
p.amount = amount
|
p.amount = amount
|
||||||
@@ -4158,7 +4159,7 @@ class LightningDTests(BaseLightningDTests):
|
|||||||
# L1 asks for stupid low fees
|
# L1 asks for stupid low fees
|
||||||
l1.rpc.dev_setfees(15)
|
l1.rpc.dev_setfees(15)
|
||||||
|
|
||||||
l1.daemon.wait_for_log('Peer permanent failure in CHANNELD_NORMAL: lightning_channeld: received ERROR channel .*: update_fee 15 outside range 500-75000')
|
l1.daemon.wait_for_log('Peer permanent failure in CHANNELD_NORMAL: lightning_channeld: received ERROR channel .*: update_fee 15 outside range 1875-75000')
|
||||||
# Make sure the resolution of this one doesn't interfere with the next!
|
# Make sure the resolution of this one doesn't interfere with the next!
|
||||||
# Note: may succeed, may fail with insufficient fee, depending on how
|
# Note: may succeed, may fail with insufficient fee, depending on how
|
||||||
# bitcoind feels!
|
# bitcoind feels!
|
||||||
@@ -4300,7 +4301,7 @@ class LightningDTests(BaseLightningDTests):
|
|||||||
# Make l2 upset by asking for crazy fee.
|
# Make l2 upset by asking for crazy fee.
|
||||||
l1.rpc.dev_setfees('150000')
|
l1.rpc.dev_setfees('150000')
|
||||||
# Wait for l1 notice
|
# Wait for l1 notice
|
||||||
l1.daemon.wait_for_log(r'Peer permanent failure in CHANNELD_NORMAL: lightning_channeld: received ERROR channel .*: update_fee 150000 outside range 500-75000')
|
l1.daemon.wait_for_log(r'Peer permanent failure in CHANNELD_NORMAL: lightning_channeld: received ERROR channel .*: update_fee 150000 outside range 1875-75000')
|
||||||
|
|
||||||
# Can't pay while its offline.
|
# Can't pay while its offline.
|
||||||
self.assertRaises(ValueError, l1.rpc.sendpay, to_json(route), rhash)
|
self.assertRaises(ValueError, l1.rpc.sendpay, to_json(route), rhash)
|
||||||
@@ -4340,7 +4341,6 @@ class LightningDTests(BaseLightningDTests):
|
|||||||
assert configs['bitcoin-datadir'] == bitcoind.bitcoin_dir
|
assert configs['bitcoin-datadir'] == bitcoind.bitcoin_dir
|
||||||
assert configs['lightning-dir'] == l1.daemon.lightning_dir
|
assert configs['lightning-dir'] == l1.daemon.lightning_dir
|
||||||
assert configs['allow-deprecated-apis'] is False
|
assert configs['allow-deprecated-apis'] is False
|
||||||
assert configs['override-fee-rates'] == '15000/7500/1000'
|
|
||||||
assert configs['network'] == 'regtest'
|
assert configs['network'] == 'regtest'
|
||||||
assert configs['ignore-fee-limits'] is False
|
assert configs['ignore-fee-limits'] is False
|
||||||
|
|
||||||
|
|||||||
@@ -263,7 +263,7 @@ class LightningD(TailableProc):
|
|||||||
'lightning-dir': lightning_dir,
|
'lightning-dir': lightning_dir,
|
||||||
'addr': '127.0.0.1:{}'.format(port),
|
'addr': '127.0.0.1:{}'.format(port),
|
||||||
'allow-deprecated-apis': 'false',
|
'allow-deprecated-apis': 'false',
|
||||||
'override-fee-rates': '15000/7500/1000',
|
'default-fee-rate': 15000,
|
||||||
'network': 'regtest',
|
'network': 'regtest',
|
||||||
'ignore-fee-limits': 'false',
|
'ignore-fee-limits': 'false',
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user