diff --git a/common/json_param.c b/common/json_param.c index bf4ddc92e..85c80d8e0 100644 --- a/common/json_param.c +++ b/common/json_param.c @@ -685,40 +685,6 @@ struct command_result *param_secrets_array(struct command *cmd, return NULL; } -struct command_result *param_feerate_val(struct command *cmd, - const char *name, const char *buffer, - const jsmntok_t *tok, - u32 **feerate_per_kw) -{ - jsmntok_t base = *tok; - enum feerate_style style; - unsigned int num; - - if (json_tok_endswith(buffer, tok, - feerate_style_name(FEERATE_PER_KBYTE))) { - style = FEERATE_PER_KBYTE; - base.end -= strlen(feerate_style_name(FEERATE_PER_KBYTE)); - } else if (json_tok_endswith(buffer, tok, - feerate_style_name(FEERATE_PER_KSIPA))) { - style = FEERATE_PER_KSIPA; - base.end -= strlen(feerate_style_name(FEERATE_PER_KSIPA)); - } else - style = FEERATE_PER_KBYTE; - - if (!json_to_number(buffer, &base, &num)) { - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "'%s' should be an integer with optional perkw/perkb, not '%.*s'", - name, base.end - base.start, - buffer + base.start); - } - - *feerate_per_kw = tal(cmd, u32); - **feerate_per_kw = feerate_from_style(num, style); - if (**feerate_per_kw < FEERATE_FLOOR) - **feerate_per_kw = FEERATE_FLOOR; - return NULL; -} - /** * segwit_addr_net_decode - Try to decode a Bech32 address and detect * testnet/mainnet/regtest/signet @@ -1093,3 +1059,16 @@ struct command_result *param_lease_hex(struct command *cmd, json_tok_full(buffer, tok)); return NULL; } + +struct command_result *param_pubkey(struct command *cmd, const char *name, + const char *buffer, const jsmntok_t *tok, + struct pubkey **pubkey) +{ + *pubkey = tal(cmd, struct pubkey); + if (json_to_pubkey(buffer, tok, *pubkey)) + return NULL; + + return command_fail_badparam(cmd, name, buffer, tok, + "should be a compressed pubkey"); +} + diff --git a/common/json_param.h b/common/json_param.h index c08e466ad..6086d5c2a 100644 --- a/common/json_param.h +++ b/common/json_param.h @@ -268,11 +268,6 @@ struct command_result *param_secrets_array(struct command *cmd, const jsmntok_t *tok, struct secret **secrets); -struct command_result *param_feerate_val(struct command *cmd, - const char *name, const char *buffer, - const jsmntok_t *tok, - u32 **feerate_per_kw); - struct command_result *param_txid(struct command *cmd, const char *name, const char *buffer, @@ -343,4 +338,9 @@ struct command_result *param_lease_hex(struct command *cmd, const char *buffer, const jsmntok_t *tok, struct lease_rates **rates); + +struct command_result *param_pubkey(struct command *cmd, const char *name, + const char *buffer, const jsmntok_t *tok, + struct pubkey **pubkey); + #endif /* LIGHTNING_COMMON_JSON_PARAM_H */ diff --git a/common/json_parse.c b/common/json_parse.c index 74d46f21a..025968d34 100644 --- a/common/json_parse.c +++ b/common/json_parse.c @@ -717,3 +717,12 @@ json_to_reply_path(const tal_t *ctx, const char *buffer, const jsmntok_t *tok) return rpath; } + + +bool +json_tok_channel_id(const char *buffer, const jsmntok_t *tok, + struct channel_id *cid) +{ + return hex_decode(buffer + tok->start, tok->end - tok->start, + cid, sizeof(*cid)); +} diff --git a/common/json_parse.h b/common/json_parse.h index 636ac4d8b..bcca914b2 100644 --- a/common/json_parse.h +++ b/common/json_parse.h @@ -120,6 +120,8 @@ json_to_reply_path(const tal_t *ctx, const char *buffer, const jsmntok_t *tok); struct tlv_obs2_onionmsg_payload_reply_path * json_to_obs2_reply_path(const tal_t *ctx, const char *buffer, const jsmntok_t *tok); +bool json_tok_channel_id(const char *buffer, const jsmntok_t *tok, + struct channel_id *cid); /* Guide is % for a token: each must be followed by JSON_SCAN(). * Returns NULL on error (asserts() on bad guide). */ diff --git a/lightningd/Makefile b/lightningd/Makefile index 559387d2f..afea16752 100644 --- a/lightningd/Makefile +++ b/lightningd/Makefile @@ -10,13 +10,13 @@ LIGHTNINGD_SRC := \ lightningd/dual_open_control.c \ lightningd/connect_control.c \ lightningd/onion_message.c \ + lightningd/feerate.c \ lightningd/gossip_control.c \ lightningd/hsm_control.c \ lightningd/htlc_end.c \ lightningd/htlc_set.c \ lightningd/invoice.c \ lightningd/io_loop_with_timers.c \ - lightningd/json.c \ lightningd/jsonrpc.c \ lightningd/lightningd.c \ lightningd/log.c \ diff --git a/lightningd/chaintopology.c b/lightningd/chaintopology.c index e85f3696f..597a6a4b8 100644 --- a/lightningd/chaintopology.c +++ b/lightningd/chaintopology.c @@ -18,7 +18,6 @@ #include #include #include -#include #include #include #include @@ -311,33 +310,6 @@ static void watch_for_utxo_reconfirmation(struct chain_topology *topo, } } -const char *feerate_name(enum feerate feerate) -{ - switch (feerate) { - case FEERATE_OPENING: return "opening"; - case FEERATE_MUTUAL_CLOSE: return "mutual_close"; - case FEERATE_UNILATERAL_CLOSE: return "unilateral_close"; - case FEERATE_DELAYED_TO_US: return "delayed_to_us"; - case FEERATE_HTLC_RESOLUTION: return "htlc_resolution"; - case FEERATE_PENALTY: return "penalty"; - case FEERATE_MIN: return "min_acceptable"; - case FEERATE_MAX: return "max_acceptable"; - } - abort(); -} - -struct command_result *param_feerate_estimate(struct command *cmd, - u32 **feerate_per_kw, - enum feerate feerate) -{ - *feerate_per_kw = tal(cmd, u32); - **feerate_per_kw = try_get_feerate(cmd->ld->topology, feerate); - if (!**feerate_per_kw) - return command_fail(cmd, LIGHTNINGD, "Cannot estimate fees"); - - return NULL; -} - /* Mutual recursion via timer. */ static void next_updatefee_timer(struct chain_topology *topo); diff --git a/lightningd/chaintopology.h b/lightningd/chaintopology.h index a9125b1c7..65ad3086a 100644 --- a/lightningd/chaintopology.h +++ b/lightningd/chaintopology.h @@ -3,6 +3,7 @@ #include "config.h" #include #include +#include #include struct bitcoin_tx; @@ -12,20 +13,6 @@ struct lightningd; struct peer; struct txwatch; -/* FIXME: move all feerate stuff out to new lightningd/feerate.[ch] files */ -enum feerate { - /* DO NOT REORDER: force-feerates uses this order! */ - FEERATE_OPENING, - FEERATE_MUTUAL_CLOSE, - FEERATE_UNILATERAL_CLOSE, - FEERATE_DELAYED_TO_US, - FEERATE_HTLC_RESOLUTION, - FEERATE_PENALTY, - FEERATE_MIN, - FEERATE_MAX, -}; -#define NUM_FEERATES (FEERATE_MAX+1) - /* We keep the last three in case there are outliers (for min/max) */ #define FEE_HISTORY_NUM 3 @@ -164,13 +151,6 @@ u32 delayed_to_us_feerate(struct chain_topology *topo); u32 htlc_resolution_feerate(struct chain_topology *topo); u32 penalty_feerate(struct chain_topology *topo); -const char *feerate_name(enum feerate feerate); - -/* Set feerate_per_kw to this estimate & return NULL, or fail cmd */ -struct command_result *param_feerate_estimate(struct command *cmd, - u32 **feerate_per_kw, - enum feerate feerate); - /* Broadcast a single tx, and rebroadcast as reqd (copies tx). * If failed is non-NULL, call that and don't rebroadcast. */ void broadcast_tx(struct chain_topology *topo, diff --git a/lightningd/closing_control.c b/lightningd/closing_control.c index fbbf8d426..47b9e39e4 100644 --- a/lightningd/closing_control.c +++ b/lightningd/closing_control.c @@ -27,7 +27,6 @@ #include #include #include -#include #include #include #include diff --git a/lightningd/dual_open_control.c b/lightningd/dual_open_control.c index 9156f027c..d3b9a0c5d 100644 --- a/lightningd/dual_open_control.c +++ b/lightningd/dual_open_control.c @@ -24,7 +24,6 @@ #include #include #include -#include #include #include #include diff --git a/lightningd/feerate.c b/lightningd/feerate.c new file mode 100644 index 000000000..dd0600321 --- /dev/null +++ b/lightningd/feerate.c @@ -0,0 +1,114 @@ +#include "config.h" +#include +#include +#include +#include +#include + +const char *feerate_name(enum feerate feerate) +{ + switch (feerate) { + case FEERATE_OPENING: return "opening"; + case FEERATE_MUTUAL_CLOSE: return "mutual_close"; + case FEERATE_UNILATERAL_CLOSE: return "unilateral_close"; + case FEERATE_DELAYED_TO_US: return "delayed_to_us"; + case FEERATE_HTLC_RESOLUTION: return "htlc_resolution"; + case FEERATE_PENALTY: return "penalty"; + case FEERATE_MIN: return "min_acceptable"; + case FEERATE_MAX: return "max_acceptable"; + } + abort(); +} + +struct command_result *param_feerate_style(struct command *cmd, + const char *name, + const char *buffer, + const jsmntok_t *tok, + enum feerate_style **style) +{ + *style = tal(cmd, enum feerate_style); + if (json_tok_streq(buffer, tok, + feerate_style_name(FEERATE_PER_KSIPA))) { + **style = FEERATE_PER_KSIPA; + return NULL; + } else if (json_tok_streq(buffer, tok, + feerate_style_name(FEERATE_PER_KBYTE))) { + **style = FEERATE_PER_KBYTE; + return NULL; + } + + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "'%s' should be '%s' or '%s', not '%.*s'", + name, + feerate_style_name(FEERATE_PER_KSIPA), + feerate_style_name(FEERATE_PER_KBYTE), + json_tok_full_len(tok), json_tok_full(buffer, tok)); +} + +struct command_result *param_feerate(struct command *cmd, const char *name, + const char *buffer, const jsmntok_t *tok, + u32 **feerate) +{ + for (size_t i = 0; i < NUM_FEERATES; i++) { + if (json_tok_streq(buffer, tok, feerate_name(i))) + return param_feerate_estimate(cmd, feerate, i); + } + /* We used SLOW, NORMAL, and URGENT as feerate targets previously, + * and many commands rely on this syntax now. + * It's also really more natural for an user interface. */ + if (json_tok_streq(buffer, tok, "slow")) + return param_feerate_estimate(cmd, feerate, FEERATE_MIN); + else if (json_tok_streq(buffer, tok, "normal")) + return param_feerate_estimate(cmd, feerate, FEERATE_OPENING); + else if (json_tok_streq(buffer, tok, "urgent")) + return param_feerate_estimate(cmd, feerate, FEERATE_UNILATERAL_CLOSE); + + /* It's a number... */ + return param_feerate_val(cmd, name, buffer, tok, feerate); +} + +struct command_result *param_feerate_estimate(struct command *cmd, + u32 **feerate_per_kw, + enum feerate feerate) +{ + *feerate_per_kw = tal(cmd, u32); + **feerate_per_kw = try_get_feerate(cmd->ld->topology, feerate); + if (!**feerate_per_kw) + return command_fail(cmd, LIGHTNINGD, "Cannot estimate fees"); + + return NULL; +} + +struct command_result *param_feerate_val(struct command *cmd, + const char *name, const char *buffer, + const jsmntok_t *tok, + u32 **feerate_per_kw) +{ + jsmntok_t base = *tok; + enum feerate_style style; + unsigned int num; + + if (json_tok_endswith(buffer, tok, + feerate_style_name(FEERATE_PER_KBYTE))) { + style = FEERATE_PER_KBYTE; + base.end -= strlen(feerate_style_name(FEERATE_PER_KBYTE)); + } else if (json_tok_endswith(buffer, tok, + feerate_style_name(FEERATE_PER_KSIPA))) { + style = FEERATE_PER_KSIPA; + base.end -= strlen(feerate_style_name(FEERATE_PER_KSIPA)); + } else + style = FEERATE_PER_KBYTE; + + if (!json_to_number(buffer, &base, &num)) { + return command_fail(cmd, JSONRPC2_INVALID_PARAMS, + "'%s' should be an integer with optional perkw/perkb, not '%.*s'", + name, base.end - base.start, + buffer + base.start); + } + + *feerate_per_kw = tal(cmd, u32); + **feerate_per_kw = feerate_from_style(num, style); + if (**feerate_per_kw < FEERATE_FLOOR) + **feerate_per_kw = FEERATE_FLOOR; + return NULL; +} diff --git a/lightningd/feerate.h b/lightningd/feerate.h new file mode 100644 index 000000000..80ab365f8 --- /dev/null +++ b/lightningd/feerate.h @@ -0,0 +1,47 @@ +#ifndef LIGHTNING_LIGHTNINGD_FEERATE_H +#define LIGHTNING_LIGHTNINGD_FEERATE_H +#include "config.h" +#include +#include + +struct command; + +enum feerate { + /* DO NOT REORDER: force-feerates uses this order! */ + FEERATE_OPENING, + FEERATE_MUTUAL_CLOSE, + FEERATE_UNILATERAL_CLOSE, + FEERATE_DELAYED_TO_US, + FEERATE_HTLC_RESOLUTION, + FEERATE_PENALTY, + FEERATE_MIN, + FEERATE_MAX, +}; +#define NUM_FEERATES (FEERATE_MAX+1) + +const char *feerate_name(enum feerate feerate); + +/* Extract a feerate style. */ +struct command_result *param_feerate_style(struct command *cmd, + const char *name, + const char *buffer, + const jsmntok_t *tok, + enum feerate_style **style); + +/* Set feerate_per_kw to this estimate & return NULL, or fail cmd */ +struct command_result *param_feerate_estimate(struct command *cmd, + u32 **feerate_per_kw, + enum feerate feerate); + +/* Extract a feerate with optional style suffix. */ +struct command_result *param_feerate_val(struct command *cmd, + const char *name, const char *buffer, + const jsmntok_t *tok, + u32 **feerate_per_kw); + +/* This also accepts names like "slow" etc */ +struct command_result *param_feerate(struct command *cmd, const char *name, + const char *buffer, const jsmntok_t *tok, + u32 **feerate); + +#endif /* LIGHTNING_LIGHTNINGD_FEERATE_H */ diff --git a/lightningd/hsm_control.c b/lightningd/hsm_control.c index d74eee2dd..c4b2a0690 100644 --- a/lightningd/hsm_control.c +++ b/lightningd/hsm_control.c @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include diff --git a/lightningd/json.c b/lightningd/json.c deleted file mode 100644 index b420e47d4..000000000 --- a/lightningd/json.c +++ /dev/null @@ -1,74 +0,0 @@ -#include "config.h" -#include -#include -#include -#include -#include -#include - -struct command_result *param_pubkey(struct command *cmd, const char *name, - const char *buffer, const jsmntok_t *tok, - struct pubkey **pubkey) -{ - *pubkey = tal(cmd, struct pubkey); - if (json_to_pubkey(buffer, tok, *pubkey)) - return NULL; - - return command_fail_badparam(cmd, name, buffer, tok, - "should be a compressed pubkey"); -} - -struct command_result *param_feerate_style(struct command *cmd, - const char *name, - const char *buffer, - const jsmntok_t *tok, - enum feerate_style **style) -{ - *style = tal(cmd, enum feerate_style); - if (json_tok_streq(buffer, tok, - feerate_style_name(FEERATE_PER_KSIPA))) { - **style = FEERATE_PER_KSIPA; - return NULL; - } else if (json_tok_streq(buffer, tok, - feerate_style_name(FEERATE_PER_KBYTE))) { - **style = FEERATE_PER_KBYTE; - return NULL; - } - - return command_fail(cmd, JSONRPC2_INVALID_PARAMS, - "'%s' should be '%s' or '%s', not '%.*s'", - name, - feerate_style_name(FEERATE_PER_KSIPA), - feerate_style_name(FEERATE_PER_KBYTE), - json_tok_full_len(tok), json_tok_full(buffer, tok)); -} - -struct command_result *param_feerate(struct command *cmd, const char *name, - const char *buffer, const jsmntok_t *tok, - u32 **feerate) -{ - for (size_t i = 0; i < NUM_FEERATES; i++) { - if (json_tok_streq(buffer, tok, feerate_name(i))) - return param_feerate_estimate(cmd, feerate, i); - } - /* We used SLOW, NORMAL, and URGENT as feerate targets previously, - * and many commands rely on this syntax now. - * It's also really more natural for an user interface. */ - if (json_tok_streq(buffer, tok, "slow")) - return param_feerate_estimate(cmd, feerate, FEERATE_MIN); - else if (json_tok_streq(buffer, tok, "normal")) - return param_feerate_estimate(cmd, feerate, FEERATE_OPENING); - else if (json_tok_streq(buffer, tok, "urgent")) - return param_feerate_estimate(cmd, feerate, FEERATE_UNILATERAL_CLOSE); - - /* It's a number... */ - return param_feerate_val(cmd, name, buffer, tok, feerate); -} - -bool -json_tok_channel_id(const char *buffer, const jsmntok_t *tok, - struct channel_id *cid) -{ - return hex_decode(buffer + tok->start, tok->end - tok->start, - cid, sizeof(*cid)); -} diff --git a/lightningd/json.h b/lightningd/json.h deleted file mode 100644 index e065570a0..000000000 --- a/lightningd/json.h +++ /dev/null @@ -1,54 +0,0 @@ -/* lightningd/json.h - * Helpers for outputting JSON results that are specific only for - * lightningd. - */ -#ifndef LIGHTNING_LIGHTNINGD_JSON_H -#define LIGHTNING_LIGHTNINGD_JSON_H -#include "config.h" -#include -#include -#include -#include -#include -#include -#include - -#define JSMN_STRICT 1 -# include - -struct bitcoin_txid; -struct chainparams; -struct channel_id; -struct command; -struct json_escape; -struct pubkey; -struct node_id; -struct short_channel_id; - -struct command_result *param_pubkey(struct command *cmd, const char *name, - const char *buffer, const jsmntok_t *tok, - struct pubkey **pubkey); - -struct command_result *param_short_channel_id(struct command *cmd, - const char *name, - const char *buffer, - const jsmntok_t *tok, - struct short_channel_id **scid); - -/* Extract a feerate style. */ -struct command_result *param_feerate_style(struct command *cmd, - const char *name, - const char *buffer, - const jsmntok_t *tok, - enum feerate_style **style); - -const char *json_feerate_style_name(enum feerate_style style); - -/* Extract a feerate with optional style suffix. */ -struct command_result *param_feerate(struct command *cmd, const char *name, - const char *buffer, const jsmntok_t *tok, - u32 **feerate); - -bool json_tok_channel_id(const char *buffer, const jsmntok_t *tok, - struct channel_id *cid); -#endif /* LIGHTNING_LIGHTNINGD_JSON_H */ diff --git a/lightningd/onion_message.c b/lightningd/onion_message.c index 42f61e2fc..b5cdd6d15 100644 --- a/lightningd/onion_message.c +++ b/lightningd/onion_message.c @@ -6,7 +6,6 @@ #include #include #include -#include #include #include #include diff --git a/lightningd/opening_control.c b/lightningd/opening_control.c index e21f61bcf..a89092370 100644 --- a/lightningd/opening_control.c +++ b/lightningd/opening_control.c @@ -20,7 +20,6 @@ #include #include #include -#include #include #include #include diff --git a/lightningd/pay.c b/lightningd/pay.c index e6c3c9c1a..eae50a53d 100644 --- a/lightningd/pay.c +++ b/lightningd/pay.c @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index d265eb2aa..afb4ea0d2 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -45,7 +45,6 @@ #include #include #include -#include #include #include #include diff --git a/lightningd/signmessage.c b/lightningd/signmessage.c index 2624c582c..1e0195a1d 100644 --- a/lightningd/signmessage.c +++ b/lightningd/signmessage.c @@ -4,7 +4,6 @@ #include #include #include -#include #include #include diff --git a/lightningd/test/run-jsonrpc.c b/lightningd/test/run-jsonrpc.c index a3d15eaa7..134fc5e7d 100644 --- a/lightningd/test/run-jsonrpc.c +++ b/lightningd/test/run-jsonrpc.c @@ -1,7 +1,7 @@ #include "config.h" #include "../../common/json_stream.c" #include "../jsonrpc.c" -#include "../json.c" +#include "../feerate.c" #include #include @@ -17,9 +17,6 @@ bool deprecated_apis; /* Generated stub for fatal */ void fatal(const char *fmt UNNEEDED, ...) { fprintf(stderr, "fatal called!\n"); abort(); } -/* Generated stub for feerate_name */ -const char *feerate_name(enum feerate feerate UNNEEDED) -{ fprintf(stderr, "feerate_name called!\n"); abort(); } /* Generated stub for fromwire_bigsize */ bigsize_t fromwire_bigsize(const u8 **cursor UNNEEDED, size_t *max UNNEEDED) { fprintf(stderr, "fromwire_bigsize called!\n"); abort(); } @@ -33,10 +30,10 @@ void fromwire_node_id(const u8 **cursor UNNEEDED, size_t *max UNNEEDED, struct n /* Generated stub for json_to_errcode */ bool json_to_errcode(const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED, errcode_t *errcode UNNEEDED) { fprintf(stderr, "json_to_errcode called!\n"); abort(); } -/* Generated stub for json_to_pubkey */ -bool json_to_pubkey(const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED, - struct pubkey *pubkey UNNEEDED) -{ fprintf(stderr, "json_to_pubkey called!\n"); abort(); } +/* Generated stub for json_to_number */ +bool json_to_number(const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED, + unsigned int *num UNNEEDED) +{ fprintf(stderr, "json_to_number called!\n"); abort(); } /* Generated stub for log_ */ void log_(struct log *log UNNEEDED, enum log_level level UNNEEDED, const struct node_id *node_id UNNEEDED, @@ -73,17 +70,6 @@ struct command_result *param_bool(struct command *cmd UNNEEDED, const char *name const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED, bool **b UNNEEDED) { fprintf(stderr, "param_bool called!\n"); abort(); } -/* Generated stub for param_feerate_estimate */ -struct command_result *param_feerate_estimate(struct command *cmd UNNEEDED, - u32 **feerate_per_kw UNNEEDED, - enum feerate feerate UNNEEDED) -{ fprintf(stderr, "param_feerate_estimate called!\n"); abort(); } -/* Generated stub for param_feerate_val */ -struct command_result *param_feerate_val(struct command *cmd UNNEEDED, - const char *name UNNEEDED, const char *buffer UNNEEDED, - const jsmntok_t *tok UNNEEDED, - u32 **feerate_per_kw UNNEEDED) -{ fprintf(stderr, "param_feerate_val called!\n"); abort(); } /* Generated stub for param_ignore */ struct command_result *param_ignore(struct command *cmd UNNEEDED, const char *name UNNEEDED, const char *buffer UNNEEDED, const jsmntok_t *tok UNNEEDED, @@ -122,6 +108,9 @@ void towire_channel_id(u8 **pptr UNNEEDED, const struct channel_id *channel_id U /* Generated stub for towire_node_id */ void towire_node_id(u8 **pptr UNNEEDED, const struct node_id *id UNNEEDED) { fprintf(stderr, "towire_node_id called!\n"); abort(); } +/* Generated stub for try_get_feerate */ +u32 try_get_feerate(const struct chain_topology *topo UNNEEDED, enum feerate feerate UNNEEDED) +{ fprintf(stderr, "try_get_feerate called!\n"); abort(); } /* AUTOGENERATED MOCKS END */ static int test_json_filter(void) diff --git a/wallet/reservation.c b/wallet/reservation.c index 4f40e4b30..88097636c 100644 --- a/wallet/reservation.c +++ b/wallet/reservation.c @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include