mirror of
https://github.com/ElementsProject/lightning.git
synced 2025-02-25 07:27:23 +01:00
The `send_outreq` function is a good place to suspend and resume traces, since these are usually the places where we hand off control back to the `io_loop`. This assumes that we do not continue doing heavy liftin after we have queued an `outreq` call, but that is most likely the case anyway. This frees us from having to track suspensions whenever we call the RPC from a plugin.
385 lines
13 KiB
C
385 lines
13 KiB
C
#include "config.h"
|
|
#include "../version.c"
|
|
#include "../json_command.c"
|
|
#include "../json_filter.c"
|
|
#include "../json_parse.c"
|
|
#include "../json_stream.c"
|
|
#include "../json_parse_simple.c"
|
|
#include <bitcoin/chainparams.h>
|
|
#include <common/setup.h>
|
|
#include <common/splice_script.h>
|
|
#include <assert.h>
|
|
#include <stdio.h>
|
|
#include <ccan/json_out/json_out.h>
|
|
/* Include the C files directly. */
|
|
#include <ccan/json_out/json_out.c>
|
|
#include <ccan/str/hex/hex.h>
|
|
|
|
/* AUTOGENERATED MOCKS START */
|
|
/* Generated stub for command_check_only */
|
|
bool command_check_only(const struct command *cmd UNNEEDED)
|
|
{ fprintf(stderr, "command_check_only called!\n"); abort(); }
|
|
/* Generated stub for command_dev_apis */
|
|
bool command_dev_apis(const struct command *cmd UNNEEDED)
|
|
{ fprintf(stderr, "command_dev_apis called!\n"); abort(); }
|
|
/* Generated stub for command_fail */
|
|
struct command_result *command_fail(struct command *cmd UNNEEDED, enum jsonrpc_errcode code UNNEEDED,
|
|
const char *fmt UNNEEDED, ...)
|
|
|
|
{ fprintf(stderr, "command_fail called!\n"); abort(); }
|
|
/* Generated stub for command_filter_ptr */
|
|
struct json_filter **command_filter_ptr(struct command *cmd UNNEEDED)
|
|
{ fprintf(stderr, "command_filter_ptr called!\n"); abort(); }
|
|
/* Generated stub for command_log */
|
|
void command_log(struct command *cmd UNNEEDED, enum log_level level UNNEEDED,
|
|
const char *fmt UNNEEDED, ...)
|
|
|
|
{ fprintf(stderr, "command_log called!\n"); abort(); }
|
|
/* Generated stub for mvt_tag_str */
|
|
const char *mvt_tag_str(enum mvt_tag tag UNNEEDED)
|
|
{ fprintf(stderr, "mvt_tag_str called!\n"); abort(); }
|
|
/* AUTOGENERATED MOCKS END */
|
|
|
|
static void set_node_id(struct splice_script_chan *chan, const char *hexstr)
|
|
{
|
|
int result = hex_decode(hexstr, strlen(hexstr), &chan->node_id,
|
|
sizeof(chan->node_id));
|
|
assert(result);
|
|
}
|
|
|
|
static void set_chan_id(struct splice_script_chan *chan, const char *hexstr)
|
|
{
|
|
int result = hex_decode(hexstr, strlen(hexstr), &chan->chan_id,
|
|
sizeof(chan->chan_id));
|
|
assert(result);
|
|
}
|
|
|
|
|
|
int main(int argc, char *argv[])
|
|
{
|
|
size_t i, len;
|
|
const char *str;
|
|
struct splice_script_error *error;
|
|
struct splice_script_result **result, **final;
|
|
jsmntok_t *toks;
|
|
struct splice_script_chan **channels;
|
|
const char *script;
|
|
struct splice_script_result *expect;
|
|
|
|
common_setup(argv[0]);
|
|
|
|
i = 0;
|
|
channels = tal_arr(tmpctx, struct splice_script_chan*, 0);
|
|
/* A */
|
|
tal_arr_expand(&channels, tal(channels, struct splice_script_chan));
|
|
set_node_id(channels[i], "0399069f1693fd89a453f0caf03ee36b6f6c8abaa7ef778d3e2bcc7c2b44120100");
|
|
set_chan_id(channels[i], "f5699c3d5302e4486c83ef9d0f2d12a969ab41ccc9301bd042c50760a87b2700");
|
|
i++;
|
|
/* B */
|
|
tal_arr_expand(&channels, tal(channels, struct splice_script_chan));
|
|
set_node_id(channels[i], "0393069f1693fd89a453f0caf03ee36b6f6c8abaa7ef778d3e2bcc7c2b44120101");
|
|
set_chan_id(channels[i], "f5699c3d5302e4486c83ef9d0f2d12a969ab41ccc9301bd042c50760a87b2701");
|
|
i++;
|
|
/* C */
|
|
tal_arr_expand(&channels, tal(channels, struct splice_script_chan));
|
|
set_node_id(channels[i], "0393069f1693fd89a453f0caf03ee36b6f6c8abaa7ef778d3e2bcc7c2b44120101");
|
|
set_chan_id(channels[i], "f5699c3d5302e4486c83ef9d0f2d12a969ab41ccc9301bd042c50760a87b2702");
|
|
i++;
|
|
/* D */
|
|
tal_arr_expand(&channels, tal(channels, struct splice_script_chan));
|
|
set_node_id(channels[i], "0393069f1693fd89a453f0caf03ee36b6f6c8abaa7ef778d3e2bcc7c2b44120101");
|
|
set_chan_id(channels[i], "f5699c3d5302e4486c83ef9d0f2d12a969ab41ccc9301bd042c50760a87b2703");
|
|
i++;
|
|
/* E */
|
|
tal_arr_expand(&channels, tal(channels, struct splice_script_chan));
|
|
set_node_id(channels[i], "0393069f1693fd89a453f0caf03ee36b6f6c8abaa7ef778d3e2bcc7c2b44120101");
|
|
set_chan_id(channels[i], "f5699c3d5302e4486c83ef9d0f2d12a969ab41ccc9301bd042c50760a87b2704");
|
|
i++;
|
|
/* F */
|
|
tal_arr_expand(&channels, tal(channels, struct splice_script_chan));
|
|
set_node_id(channels[i], "0393069f1693fd89a453f0caf03ee36b6f6c8abaa7ef778d3e2bcc7c2b44120101");
|
|
set_chan_id(channels[i], "f5699c3d5302e4486c83ef9d0f2d12a969ab41ccc9301bd042c50760a87b2705");
|
|
i++;
|
|
/* G */
|
|
tal_arr_expand(&channels, tal(channels, struct splice_script_chan));
|
|
set_node_id(channels[i], "0394069f1693fd89a453f0caf03ee36b6f6c8abaa7ef778d3e2bcc7c2b44120101");
|
|
set_chan_id(channels[i], "f5699c3d5302e4486c83ef9d0f2d12a969ab41ccc9301bd042c50760a87b2706");
|
|
i++;
|
|
/* H */
|
|
tal_arr_expand(&channels, tal(channels, struct splice_script_chan));
|
|
set_node_id(channels[i], "0394069f1693fd89a453f0caf03ee36b6f6c8abaa7ef778d3e2bcc7c2b44120101");
|
|
set_chan_id(channels[i], "f4699c3d5302e4486c83ef9d0f2d12a969ab41ccc9301bd042c50760a87b2700");
|
|
i++;
|
|
/* I */
|
|
tal_arr_expand(&channels, tal(channels, struct splice_script_chan));
|
|
set_node_id(channels[i], "0394069f1693fd89a453f0caf03ee36b6f6c8abaa7ef778d3e2bcc7c2b44120102");
|
|
set_chan_id(channels[i], "ffffffff5302e4486c83ef9d0f2d12a969ab41ccc9301bd042c50760a87b2700");
|
|
i++;
|
|
/* J */
|
|
tal_arr_expand(&channels, tal(channels, struct splice_script_chan));
|
|
set_node_id(channels[i], "0394069f1693fd89a453f0caf03ee36b6f6c8abaa7ef778d3e2bcc7c2b44120103");
|
|
set_chan_id(channels[i], "eeeeeeee5302e4486c83ef9d0f2d12a969ab41ccc9301bd042c50760a87b2700");
|
|
i++;
|
|
/* K */
|
|
tal_arr_expand(&channels, tal(channels, struct splice_script_chan));
|
|
set_node_id(channels[i], "0394069f1693fd89a453f0caf03ee36b6f6c8abaa7ef778d3e2bcc7c2b44120103");
|
|
set_chan_id(channels[i], "eeeeeeee5302e4486c83ef9d0f2d12a969ab41ccc9301bd042c50760a87b2701");
|
|
i++;
|
|
/* L */
|
|
tal_arr_expand(&channels, tal(channels, struct splice_script_chan));
|
|
set_node_id(channels[i], "0394069f1693fd89a453f0caf03ee36b6f6c8abaa7ef778d3e2bcc7c2b44120104");
|
|
set_chan_id(channels[i], "eeeeeeee5302e4486c83ef9d0f2d12a969ab41ccc9301bd042c50760a87b2702");
|
|
i++;
|
|
|
|
script = ""
|
|
"0->0399:0->3M;\n" /* A */
|
|
"3.000001M->bcrt1pp5ygqjg0q3mmv8ng8ceu59kl5a3etlf2vvryvnnyumvdyr8a77tqx507vk;\n"
|
|
"wallet->1M;\n"
|
|
"0->f4699c->3M;\n" /* H */
|
|
"0->0393069f1693fd89a453f0caf03ee36b6f6c8abaa7ef778d3e2bcc7c2b44120101:0->*;\n" /* B */
|
|
"0->0393069f1693fd89a453f0caf03ee36b6f6c8abaa7ef778d3e2bcc7c2b44120101:?->12M;\n" /* C */
|
|
"0->03930:*->*\n" /* D, E, F */
|
|
"|4.91M@2%->*:?;\n" /* G */
|
|
"25.010%|100K->*:?;\n" /* I */
|
|
"*:?->+fee@40000;\n" /* J */
|
|
"10.0003%->*:*;\n"; /* K, L */
|
|
|
|
expect = tal_arr(tmpctx, struct splice_script_result, 15);
|
|
i = 0;
|
|
expect[i].lease_sat = AMOUNT_SAT(0);
|
|
expect[i].lease_max_ppm = 0;
|
|
expect[i].in_sat = AMOUNT_SAT(0);
|
|
expect[i].in_ppm = 0;
|
|
expect[i].channel_id = &channels[0]->chan_id;
|
|
expect[i].bitcoin_address = 0;
|
|
expect[i].onchain_wallet = 0;
|
|
expect[i].out_sat = AMOUNT_SAT(3000000);
|
|
expect[i].out_ppm = 0;
|
|
expect[i].pays_fee = 0;
|
|
expect[i].feerate_per_kw = 0;
|
|
i++;
|
|
expect[i].lease_sat = AMOUNT_SAT(0);
|
|
expect[i].lease_max_ppm = 0;
|
|
expect[i].in_sat = AMOUNT_SAT(3000001);
|
|
expect[i].in_ppm = 0;
|
|
expect[i].channel_id = 0;
|
|
expect[i].bitcoin_address = "bcrt1pp5ygqjg0q3mmv8ng8ceu59kl5a3etlf2vvryvnnyumvdyr8a77tqx507vk";
|
|
expect[i].onchain_wallet = 0;
|
|
expect[i].out_sat = AMOUNT_SAT(0);
|
|
expect[i].out_ppm = 0;
|
|
expect[i].pays_fee = 0;
|
|
expect[i].feerate_per_kw = 0;
|
|
i++;
|
|
expect[i].lease_sat = AMOUNT_SAT(0);
|
|
expect[i].lease_max_ppm = 0;
|
|
expect[i].in_sat = AMOUNT_SAT(0);
|
|
expect[i].in_ppm = 0;
|
|
expect[i].channel_id = 0;
|
|
expect[i].bitcoin_address = 0;
|
|
expect[i].onchain_wallet = 1;
|
|
expect[i].out_sat = AMOUNT_SAT(1000000);
|
|
expect[i].out_ppm = 0;
|
|
expect[i].pays_fee = 0;
|
|
expect[i].feerate_per_kw = 0;
|
|
i++;
|
|
expect[i].lease_sat = AMOUNT_SAT(0);
|
|
expect[i].lease_max_ppm = 0;
|
|
expect[i].in_sat = AMOUNT_SAT(0);
|
|
expect[i].in_ppm = 0;
|
|
expect[i].channel_id = &channels[7]->chan_id;
|
|
expect[i].bitcoin_address = 0;
|
|
expect[i].onchain_wallet = 0;
|
|
expect[i].out_sat = AMOUNT_SAT(3000000);
|
|
expect[i].out_ppm = 0;
|
|
expect[i].pays_fee = 0;
|
|
expect[i].feerate_per_kw = 0;
|
|
i++;
|
|
expect[i].lease_sat = AMOUNT_SAT(0);
|
|
expect[i].lease_max_ppm = 0;
|
|
expect[i].in_sat = AMOUNT_SAT(0);
|
|
expect[i].in_ppm = 0;
|
|
expect[i].channel_id = &channels[1]->chan_id;
|
|
expect[i].bitcoin_address = 0;
|
|
expect[i].onchain_wallet = 0;
|
|
expect[i].out_sat = AMOUNT_SAT(0);
|
|
expect[i].out_ppm = UINT32_MAX;
|
|
expect[i].pays_fee = 0;
|
|
expect[i].feerate_per_kw = 0;
|
|
i++;
|
|
expect[i].lease_sat = AMOUNT_SAT(0);
|
|
expect[i].lease_max_ppm = 0;
|
|
expect[i].in_sat = AMOUNT_SAT(0);
|
|
expect[i].in_ppm = 0;
|
|
expect[i].channel_id = &channels[2]->chan_id;
|
|
expect[i].bitcoin_address = 0;
|
|
expect[i].onchain_wallet = 0;
|
|
expect[i].out_sat = AMOUNT_SAT(12000000);
|
|
expect[i].out_ppm = 0;
|
|
expect[i].pays_fee = 0;
|
|
expect[i].feerate_per_kw = 0;
|
|
i++;
|
|
expect[i].lease_sat = AMOUNT_SAT(0);
|
|
expect[i].lease_max_ppm = 0;
|
|
expect[i].in_sat = AMOUNT_SAT(0);
|
|
expect[i].in_ppm = 0;
|
|
expect[i].channel_id = &channels[3]->chan_id;
|
|
expect[i].bitcoin_address = 0;
|
|
expect[i].onchain_wallet = 0;
|
|
expect[i].out_sat = AMOUNT_SAT(0);
|
|
expect[i].out_ppm = UINT32_MAX;
|
|
expect[i].pays_fee = 0;
|
|
expect[i].feerate_per_kw = 0;
|
|
i++;
|
|
expect[i].lease_sat = AMOUNT_SAT(0);
|
|
expect[i].lease_max_ppm = 0;
|
|
expect[i].in_sat = AMOUNT_SAT(0);
|
|
expect[i].in_ppm = 0;
|
|
expect[i].channel_id = &channels[4]->chan_id;
|
|
expect[i].bitcoin_address = 0;
|
|
expect[i].onchain_wallet = 0;
|
|
expect[i].out_sat = AMOUNT_SAT(0);
|
|
expect[i].out_ppm = UINT32_MAX;
|
|
expect[i].pays_fee = 0;
|
|
expect[i].feerate_per_kw = 0;
|
|
i++;
|
|
expect[i].lease_sat = AMOUNT_SAT(0);
|
|
expect[i].lease_max_ppm = 0;
|
|
expect[i].in_sat = AMOUNT_SAT(0);
|
|
expect[i].in_ppm = 0;
|
|
expect[i].channel_id = &channels[5]->chan_id;
|
|
expect[i].bitcoin_address = 0;
|
|
expect[i].onchain_wallet = 0;
|
|
expect[i].out_sat = AMOUNT_SAT(0);
|
|
expect[i].out_ppm = UINT32_MAX;
|
|
expect[i].pays_fee = 0;
|
|
expect[i].feerate_per_kw = 0;
|
|
i++;
|
|
expect[i].lease_sat = AMOUNT_SAT(4910000);
|
|
expect[i].lease_max_ppm = 20000;
|
|
expect[i].in_sat = AMOUNT_SAT(0);
|
|
expect[i].in_ppm = 0;
|
|
expect[i].channel_id = &channels[6]->chan_id;
|
|
expect[i].bitcoin_address = 0;
|
|
expect[i].onchain_wallet = 0;
|
|
expect[i].out_sat = AMOUNT_SAT(0);
|
|
expect[i].out_ppm = 0;
|
|
expect[i].pays_fee = 0;
|
|
expect[i].feerate_per_kw = 0;
|
|
i++;
|
|
expect[i].lease_sat = AMOUNT_SAT(100000);
|
|
expect[i].lease_max_ppm = 0;
|
|
expect[i].in_sat = AMOUNT_SAT(0);
|
|
expect[i].in_ppm = 250100;
|
|
expect[i].channel_id = &channels[8]->chan_id;
|
|
expect[i].bitcoin_address = 0;
|
|
expect[i].onchain_wallet = 0;
|
|
expect[i].out_sat = AMOUNT_SAT(0);
|
|
expect[i].out_ppm = 0;
|
|
expect[i].pays_fee = 0;
|
|
expect[i].feerate_per_kw = 0;
|
|
i++;
|
|
expect[i].lease_sat = AMOUNT_SAT(0);
|
|
expect[i].lease_max_ppm = 0;
|
|
expect[i].in_sat = AMOUNT_SAT(0);
|
|
expect[i].in_ppm = 0;
|
|
expect[i].channel_id = &channels[9]->chan_id;
|
|
expect[i].bitcoin_address = 0;
|
|
expect[i].onchain_wallet = 0;
|
|
expect[i].out_sat = AMOUNT_SAT(0);
|
|
expect[i].out_ppm = 0;
|
|
expect[i].pays_fee = 1;
|
|
expect[i].feerate_per_kw = 40000;
|
|
i++;
|
|
expect[i].lease_sat = AMOUNT_SAT(0);
|
|
expect[i].lease_max_ppm = 0;
|
|
expect[i].in_sat = AMOUNT_SAT(0);
|
|
expect[i].in_ppm = 50001;
|
|
expect[i].channel_id = &channels[10]->chan_id;
|
|
expect[i].bitcoin_address = 0;
|
|
expect[i].onchain_wallet = 0;
|
|
expect[i].out_sat = AMOUNT_SAT(0);
|
|
expect[i].out_ppm = 0;
|
|
expect[i].pays_fee = 0;
|
|
expect[i].feerate_per_kw = 0;
|
|
i++;
|
|
expect[i].lease_sat = AMOUNT_SAT(0);
|
|
expect[i].lease_max_ppm = 0;
|
|
expect[i].in_sat = AMOUNT_SAT(0);
|
|
expect[i].in_ppm = 50002;
|
|
expect[i].channel_id = &channels[11]->chan_id;
|
|
expect[i].bitcoin_address = 0;
|
|
expect[i].onchain_wallet = 0;
|
|
expect[i].out_sat = AMOUNT_SAT(0);
|
|
expect[i].out_ppm = 0;
|
|
expect[i].pays_fee = 0;
|
|
expect[i].feerate_per_kw = 0;
|
|
i++;
|
|
expect[i].lease_sat = AMOUNT_SAT(0);
|
|
expect[i].lease_max_ppm = 0;
|
|
expect[i].in_sat = AMOUNT_SAT(0);
|
|
expect[i].in_ppm = 649897;
|
|
expect[i].channel_id = 0;
|
|
expect[i].bitcoin_address = 0;
|
|
expect[i].onchain_wallet = 1;
|
|
expect[i].out_sat = AMOUNT_SAT(0);
|
|
expect[i].out_ppm = 0;
|
|
expect[i].pays_fee = 0;
|
|
expect[i].feerate_per_kw = 0;
|
|
i++;
|
|
|
|
assert(i == tal_count(expect));
|
|
|
|
chainparams = chainparams_for_network("regtest");
|
|
|
|
error = parse_splice_script(tmpctx, script, channels, &result);
|
|
|
|
if (error) {
|
|
printf("%s\n", fmt_splice_script_compiler_error(tmpctx, script,
|
|
error));
|
|
common_shutdown();
|
|
abort();
|
|
}
|
|
|
|
struct json_stream *js = new_json_stream(tmpctx, NULL, NULL);
|
|
|
|
splice_to_json(tmpctx, result, js);
|
|
|
|
str = json_out_contents(js->jout, &len);
|
|
|
|
printf("%.*s\n", (int)len, str);
|
|
|
|
assert(str);
|
|
|
|
toks = json_parse_simple(tmpctx, str, len);
|
|
|
|
assert(toks);
|
|
|
|
assert(json_to_splice(tmpctx, str, toks, &final));
|
|
|
|
assert(tal_count(final) == tal_count(expect));
|
|
|
|
for (i = 0; i < tal_count(expect); i++) {
|
|
assert(amount_sat_eq(final[i]->lease_sat, expect[i].lease_sat));
|
|
assert(final[i]->lease_max_ppm == expect[i].lease_max_ppm);
|
|
assert(amount_sat_eq(final[i]->in_sat, expect[i].in_sat));
|
|
assert(final[i]->in_ppm == expect[i].in_ppm);
|
|
if (final[i]->channel_id != expect[i].channel_id)
|
|
assert(channel_id_eq(final[i]->channel_id, expect[i].channel_id));
|
|
if (final[i]->bitcoin_address != expect[i].bitcoin_address)
|
|
assert(!strcmp(final[i]->bitcoin_address, expect[i].bitcoin_address));
|
|
assert(final[i]->onchain_wallet == expect[i].onchain_wallet);
|
|
assert(amount_sat_eq(final[i]->out_sat, expect[i].out_sat));
|
|
assert(final[i]->out_ppm == expect[i].out_ppm);
|
|
if (expect[i].pays_fee)
|
|
assert(final[i]->pays_fee);
|
|
else
|
|
assert(!final[i]->pays_fee);
|
|
assert(final[i]->feerate_per_kw == expect[i].feerate_per_kw);
|
|
}
|
|
|
|
printf("DRY RUN:\n%s", splicearr_to_string(tmpctx, final));
|
|
|
|
common_shutdown();
|
|
|
|
return 0;
|
|
}
|