Skip to content

Commit

Permalink
process_estimatefee: fix bad logic.
Browse files Browse the repository at this point in the history
Refactor the fallback to make it more robust.

Fixes: #28
Reported-by: Jacob <jacobdnd@gmail.com>
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
  • Loading branch information
rustyrussell committed Jul 20, 2016
1 parent 6199b88 commit 6015ced
Showing 1 changed file with 28 additions and 12 deletions.
40 changes: 28 additions & 12 deletions daemon/bitcoind.c
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,7 @@ start_bitcoin_cli(struct lightningd_state *dstate,
next_bcli(dstate);
}

static void process_estimatefee(struct bitcoin_cli *bcli)
static void process_estimatefee_6(struct bitcoin_cli *bcli)
{
double fee;
char *p, *end;
Expand All @@ -189,34 +189,50 @@ static void process_estimatefee(struct bitcoin_cli *bcli)
fatal("%s: gave non-numeric fee %s",
bcli_args(bcli), p);

/* Don't know at 2? Try 6... */
if (fee < 0) {
if (streq(bcli->args[3], "2")) {
start_bitcoin_cli(bcli->dstate, process_estimatefee,
false, bcli->cb, bcli->cb_arg,
"estimatefee", "6", NULL);
return;
}
log_unusual(bcli->dstate->base_log,
"Unable to estimate fee, using %"PRIu64,
bcli->dstate->config.closing_fee_rate);
fee_rate = bcli->dstate->config.closing_fee_rate;
} else {
/* If we used 6 as an estimate, double it. */
if (streq(bcli->args[3], "6"))
fee *= 2;
/* Since we used 6 as an estimate, double it. */
fee *= 2;
fee_rate = fee * 100000000;
}

cb(bcli->dstate, fee_rate, bcli->cb_arg);
}

static void process_estimatefee_2(struct bitcoin_cli *bcli)
{
double fee;
char *p, *end;
u64 fee_rate;
void (*cb)(struct lightningd_state *, u64, void *) = bcli->cb;

p = tal_strndup(bcli, bcli->output, bcli->output_bytes);
fee = strtod(p, &end);
if (end == p || *end != '\n')
fatal("%s: gave non-numeric fee %s",
bcli_args(bcli), p);

/* Don't know at 2? Try 6... */
if (fee < 0) {
start_bitcoin_cli(bcli->dstate, process_estimatefee_6,
false, bcli->cb, bcli->cb_arg,
"estimatefee", "6", NULL);
return;
}
fee_rate = fee * 100000000;
cb(bcli->dstate, fee_rate, bcli->cb_arg);
}

void bitcoind_estimate_fee_(struct lightningd_state *dstate,
void (*cb)(struct lightningd_state *dstate,
u64, void *),
void *arg)
{
start_bitcoin_cli(dstate, process_estimatefee, false, cb, arg,
start_bitcoin_cli(dstate, process_estimatefee_2, false, cb, arg,
"estimatefee", "2", NULL);
}

Expand Down

0 comments on commit 6015ced

Please sign in to comment.