Skip to content

Commit

Permalink
splice: A splice-script test that tests complex corner cases
Browse files Browse the repository at this point in the history
A test that puts some advanced and complex scripts into the parser and validates the results that come out.
  • Loading branch information
ddustin committed Jan 7, 2024
1 parent 98e21b8 commit 2640bd6
Show file tree
Hide file tree
Showing 2 changed files with 297 additions and 0 deletions.
16 changes: 16 additions & 0 deletions common/test/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,22 @@ common/test/run-version: \
wire/towire.o


common/test/run-splice_script: \
common/amount.o \
common/node_id.o \
common/bech32.o \
common/splice_script.o \
common/type_to_string.o \
common/json_stream.o \
common/json_filter.o \
common/json_parse.o \
common/json_parse_simple.o \
common/wireaddr.o \
common/base32.o \
wire/fromwire.o \
wire/towire.o


common/test/run-trace: \
common/amount.o \
common/memleak.o \
Expand Down
281 changes: 281 additions & 0 deletions common/test/run-splice_script.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,281 @@
#include "config.h"
#include "../version.c"
#include <bitcoin/chainparams.h>
#include <common/setup.h>
#include <common/splice_script.h>
#include <common/json_command.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>

struct command_result *command_fail(struct command *cmd, enum jsonrpc_errcode code, const char *fmt, ...)
{ fprintf(stderr, "command_fail called!\n"); abort(); }

struct json_filter **command_filter_ptr(struct command *cmd)
{ fprintf(stderr, "command_filter_ptr called!\n"); abort(); }

const char *mvt_tag_str(enum mvt_tag tag UNNEEDED)
{ fprintf(stderr, "mvt_tag_str called!\n"); abort(); }

int main(int argc, char *argv[])
{
size_t len;
const char *str;
struct splice_script_error *error;
struct splice_script_result **result, **final;
jsmntok_t *toks;

common_setup(argv[0]);

struct splice_script_chan channels[] =
{
{ /* A */
.node_id = { .k = { 0x03, 0x99, 0x06, 0x9f, 0x16, 0x93, 0xfd, 0x89, 0xa4, 0x53, 0xf0, 0xca, 0xf0, 0x3e, 0xe3, 0x6b, 0x6f, 0x6c, 0x8a, 0xba, 0xa7, 0xef, 0x77, 0x8d, 0x3e, 0x2b, 0xcc, 0x7c, 0x2b, 0x44, 0x12, 0x01, 0x00 } },
.chan_id = { .id = { 0xf5, 0x69, 0x9c, 0x3d, 0x53, 0x02, 0xe4, 0x48, 0x6c, 0x83, 0xef, 0x9d, 0x0f, 0x2d, 0x12, 0xa9, 0x69, 0xab, 0x41, 0xcc, 0xc9, 0x30, 0x1b, 0xd0, 0x42, 0xc5, 0x07, 0x60, 0xa8, 0x7b, 0x27, 0x00 } },
},
{ /* B */
.node_id = { .k = { 0x03, 0x93, 0x06, 0x9f, 0x16, 0x93, 0xfd, 0x89, 0xa4, 0x53, 0xf0, 0xca, 0xf0, 0x3e, 0xe3, 0x6b, 0x6f, 0x6c, 0x8a, 0xba, 0xa7, 0xef, 0x77, 0x8d, 0x3e, 0x2b, 0xcc, 0x7c, 0x2b, 0x44, 0x12, 0x01, 0x01 } },
.chan_id = { .id = { 0xf5, 0x69, 0x9c, 0x3d, 0x53, 0x02, 0xe4, 0x48, 0x6c, 0x83, 0xef, 0x9d, 0x0f, 0x2d, 0x12, 0xa9, 0x69, 0xab, 0x41, 0xcc, 0xc9, 0x30, 0x1b, 0xd0, 0x42, 0xc5, 0x07, 0x60, 0xa8, 0x7b, 0x27, 0x01 } },
},
{ /* C */
.node_id = { .k = { 0x03, 0x93, 0x06, 0x9f, 0x16, 0x93, 0xfd, 0x89, 0xa4, 0x53, 0xf0, 0xca, 0xf0, 0x3e, 0xe3, 0x6b, 0x6f, 0x6c, 0x8a, 0xba, 0xa7, 0xef, 0x77, 0x8d, 0x3e, 0x2b, 0xcc, 0x7c, 0x2b, 0x44, 0x12, 0x01, 0x01 } },
.chan_id = { .id = { 0xf5, 0x69, 0x9c, 0x3d, 0x53, 0x02, 0xe4, 0x48, 0x6c, 0x83, 0xef, 0x9d, 0x0f, 0x2d, 0x12, 0xa9, 0x69, 0xab, 0x41, 0xcc, 0xc9, 0x30, 0x1b, 0xd0, 0x42, 0xc5, 0x07, 0x60, 0xa8, 0x7b, 0x27, 0x02 } },
},
{ /* D */
.node_id = { .k = { 0x03, 0x93, 0x06, 0x9f, 0x16, 0x93, 0xfd, 0x89, 0xa4, 0x53, 0xf0, 0xca, 0xf0, 0x3e, 0xe3, 0x6b, 0x6f, 0x6c, 0x8a, 0xba, 0xa7, 0xef, 0x77, 0x8d, 0x3e, 0x2b, 0xcc, 0x7c, 0x2b, 0x44, 0x12, 0x01, 0x01 } },
.chan_id = { .id = { 0xf5, 0x69, 0x9c, 0x3d, 0x53, 0x02, 0xe4, 0x48, 0x6c, 0x83, 0xef, 0x9d, 0x0f, 0x2d, 0x12, 0xa9, 0x69, 0xab, 0x41, 0xcc, 0xc9, 0x30, 0x1b, 0xd0, 0x42, 0xc5, 0x07, 0x60, 0xa8, 0x7b, 0x27, 0x03 } },
},
{ /* E */
.node_id = { .k = { 0x03, 0x93, 0x06, 0x9f, 0x16, 0x93, 0xfd, 0x89, 0xa4, 0x53, 0xf0, 0xca, 0xf0, 0x3e, 0xe3, 0x6b, 0x6f, 0x6c, 0x8a, 0xba, 0xa7, 0xef, 0x77, 0x8d, 0x3e, 0x2b, 0xcc, 0x7c, 0x2b, 0x44, 0x12, 0x01, 0x01 } },
.chan_id = { .id = { 0xf5, 0x69, 0x9c, 0x3d, 0x53, 0x02, 0xe4, 0x48, 0x6c, 0x83, 0xef, 0x9d, 0x0f, 0x2d, 0x12, 0xa9, 0x69, 0xab, 0x41, 0xcc, 0xc9, 0x30, 0x1b, 0xd0, 0x42, 0xc5, 0x07, 0x60, 0xa8, 0x7b, 0x27, 0x04 } },
},
{ /* F */
.node_id = { .k = { 0x03, 0x93, 0x06, 0x9f, 0x16, 0x93, 0xfd, 0x89, 0xa4, 0x53, 0xf0, 0xca, 0xf0, 0x3e, 0xe3, 0x6b, 0x6f, 0x6c, 0x8a, 0xba, 0xa7, 0xef, 0x77, 0x8d, 0x3e, 0x2b, 0xcc, 0x7c, 0x2b, 0x44, 0x12, 0x01, 0x01 } },
.chan_id = { .id = { 0xf5, 0x69, 0x9c, 0x3d, 0x53, 0x02, 0xe4, 0x48, 0x6c, 0x83, 0xef, 0x9d, 0x0f, 0x2d, 0x12, 0xa9, 0x69, 0xab, 0x41, 0xcc, 0xc9, 0x30, 0x1b, 0xd0, 0x42, 0xc5, 0x07, 0x60, 0xa8, 0x7b, 0x27, 0x05 } },
},
{ /* G */
.node_id = { .k = { 0x03, 0x94, 0x06, 0x9f, 0x16, 0x93, 0xfd, 0x89, 0xa4, 0x53, 0xf0, 0xca, 0xf0, 0x3e, 0xe3, 0x6b, 0x6f, 0x6c, 0x8a, 0xba, 0xa7, 0xef, 0x77, 0x8d, 0x3e, 0x2b, 0xcc, 0x7c, 0x2b, 0x44, 0x12, 0x01, 0x01 } },
.chan_id = { .id = { 0xf5, 0x69, 0x9c, 0x3d, 0x53, 0x02, 0xe4, 0x48, 0x6c, 0x83, 0xef, 0x9d, 0x0f, 0x2d, 0x12, 0xa9, 0x69, 0xab, 0x41, 0xcc, 0xc9, 0x30, 0x1b, 0xd0, 0x42, 0xc5, 0x07, 0x60, 0xa8, 0x7b, 0x27, 0x06 } },
},
{ /* H */
.node_id = { .k = { 0x03, 0x94, 0x06, 0x9f, 0x16, 0x93, 0xfd, 0x89, 0xa4, 0x53, 0xf0, 0xca, 0xf0, 0x3e, 0xe3, 0x6b, 0x6f, 0x6c, 0x8a, 0xba, 0xa7, 0xef, 0x77, 0x8d, 0x3e, 0x2b, 0xcc, 0x7c, 0x2b, 0x44, 0x12, 0x01, 0x01 } },
.chan_id = { .id = { 0xf4, 0x69, 0x9c, 0x3d, 0x53, 0x02, 0xe4, 0x48, 0x6c, 0x83, 0xef, 0x9d, 0x0f, 0x2d, 0x12, 0xa9, 0x69, 0xab, 0x41, 0xcc, 0xc9, 0x30, 0x1b, 0xd0, 0x42, 0xc5, 0x07, 0x60, 0xa8, 0x7b, 0x27, 0x00 } },
},
{ /* I */
.node_id = { .k = { 0x03, 0x94, 0x06, 0x9f, 0x16, 0x93, 0xfd, 0x89, 0xa4, 0x53, 0xf0, 0xca, 0xf0, 0x3e, 0xe3, 0x6b, 0x6f, 0x6c, 0x8a, 0xba, 0xa7, 0xef, 0x77, 0x8d, 0x3e, 0x2b, 0xcc, 0x7c, 0x2b, 0x44, 0x12, 0x01, 0x02 } },
.chan_id = { .id = { 0xff, 0xff, 0xff, 0xff, 0x53, 0x02, 0xe4, 0x48, 0x6c, 0x83, 0xef, 0x9d, 0x0f, 0x2d, 0x12, 0xa9, 0x69, 0xab, 0x41, 0xcc, 0xc9, 0x30, 0x1b, 0xd0, 0x42, 0xc5, 0x07, 0x60, 0xa8, 0x7b, 0x27, 0x00 } },
},
{ /* J */
.node_id = { .k = { 0x03, 0x94, 0x06, 0x9f, 0x16, 0x93, 0xfd, 0x89, 0xa4, 0x53, 0xf0, 0xca, 0xf0, 0x3e, 0xe3, 0x6b, 0x6f, 0x6c, 0x8a, 0xba, 0xa7, 0xef, 0x77, 0x8d, 0x3e, 0x2b, 0xcc, 0x7c, 0x2b, 0x44, 0x12, 0x01, 0x03 } },
.chan_id = { .id = { 0xee, 0xee, 0xee, 0xee, 0x53, 0x02, 0xe4, 0x48, 0x6c, 0x83, 0xef, 0x9d, 0x0f, 0x2d, 0x12, 0xa9, 0x69, 0xab, 0x41, 0xcc, 0xc9, 0x30, 0x1b, 0xd0, 0x42, 0xc5, 0x07, 0x60, 0xa8, 0x7b, 0x27, 0x00 } },
},
{ /* K */
.node_id = { .k = { 0x03, 0x94, 0x06, 0x9f, 0x16, 0x93, 0xfd, 0x89, 0xa4, 0x53, 0xf0, 0xca, 0xf0, 0x3e, 0xe3, 0x6b, 0x6f, 0x6c, 0x8a, 0xba, 0xa7, 0xef, 0x77, 0x8d, 0x3e, 0x2b, 0xcc, 0x7c, 0x2b, 0x44, 0x12, 0x01, 0x03 } },
.chan_id = { .id = { 0xee, 0xee, 0xee, 0xee, 0x53, 0x02, 0xe4, 0x48, 0x6c, 0x83, 0xef, 0x9d, 0x0f, 0x2d, 0x12, 0xa9, 0x69, 0xab, 0x41, 0xcc, 0xc9, 0x30, 0x1b, 0xd0, 0x42, 0xc5, 0x07, 0x60, 0xa8, 0x7b, 0x27, 0x01 } },
},
{ /* L */
.node_id = { .k = { 0x03, 0x94, 0x06, 0x9f, 0x16, 0x93, 0xfd, 0x89, 0xa4, 0x53, 0xf0, 0xca, 0xf0, 0x3e, 0xe3, 0x6b, 0x6f, 0x6c, 0x8a, 0xba, 0xa7, 0xef, 0x77, 0x8d, 0x3e, 0x2b, 0xcc, 0x7c, 0x2b, 0x44, 0x12, 0x01, 0x04 } },
.chan_id = { .id = { 0xee, 0xee, 0xee, 0xee, 0x53, 0x02, 0xe4, 0x48, 0x6c, 0x83, 0xef, 0x9d, 0x0f, 0x2d, 0x12, 0xa9, 0x69, 0xab, 0x41, 0xcc, 0xc9, 0x30, 0x1b, 0xd0, 0x42, 0xc5, 0x07, 0x60, 0xa8, 0x7b, 0x27, 0x02 } },
},
};

const char *script = ""
"0->0399:0->3M;\n" /* A */
"3M->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%|100K->*:?;\n" /* I */
"10%->*:*;\n"; /* J, K, L */

chainparams = chainparams_for_network("regtest");

error = parse_splice_script(tmpctx, script, channels,
sizeof(channels) / sizeof(channels[0]),
&result);

if (error) {
printf("%s\n", splice_script_compiler_error(tmpctx, script,
error));
abort();
}

struct json_stream *js = new_json_stream(tmpctx, NULL, NULL);

splice_to_json(tmpctx, result, js);

str = json_out_contents(js->jout, &len);

assert(str);

toks = json_parse_simple(tmpctx, str, len);

assert(toks);

assert(json_to_splice(tmpctx, str, toks, &final));

assert(tal_count(final) == 15);
int i = 0;

assert(amount_sat_eq(final[i]->lease_sat, AMOUNT_SAT(0)));
assert(final[i]->lease_max_ppm == 0);
assert(amount_sat_eq(final[i]->in_sat, AMOUNT_SAT(0)));
assert(final[i]->in_ppm == 0);
assert(channel_id_eq(final[i]->channel_id, &channels[0].chan_id));
assert(final[i]->bitcoin_address == 0);
assert(final[i]->onchain_wallet == 0);
assert(amount_sat_eq(final[i]->out_sat, AMOUNT_SAT(3000000)));
assert(final[i]->out_ppm == 0);
i++;
assert(amount_sat_eq(final[i]->lease_sat, AMOUNT_SAT(0)));
assert(final[i]->lease_max_ppm == 0);
assert(amount_sat_eq(final[i]->in_sat, AMOUNT_SAT(3000000)));
assert(final[i]->in_ppm == 0);
assert(final[i]->channel_id == 0);
assert(strcmp(final[i]->bitcoin_address, "bcrt1pp5ygqjg0q3mmv8ng8ceu59kl5a3etlf2vvryvnnyumvdyr8a77tqx507vk") == 0);
assert(final[i]->onchain_wallet == 0);
assert(amount_sat_eq(final[i]->out_sat, AMOUNT_SAT(0)));
assert(final[i]->out_ppm == 0);
i++;
assert(amount_sat_eq(final[i]->lease_sat, AMOUNT_SAT(0)));
assert(final[i]->lease_max_ppm == 0);
assert(amount_sat_eq(final[i]->in_sat, AMOUNT_SAT(0)));
assert(final[i]->in_ppm == 0);
assert(final[i]->channel_id == 0);
assert(final[i]->bitcoin_address == 0);
assert(final[i]->onchain_wallet == 1);
assert(amount_sat_eq(final[i]->out_sat, AMOUNT_SAT(1000000)));
assert(final[i]->out_ppm == 0);
i++;
assert(amount_sat_eq(final[i]->lease_sat, AMOUNT_SAT(0)));
assert(final[i]->lease_max_ppm == 0);
assert(amount_sat_eq(final[i]->in_sat, AMOUNT_SAT(0)));
assert(final[i]->in_ppm == 0);
assert(channel_id_eq(final[i]->channel_id, &channels[7].chan_id));
assert(final[i]->bitcoin_address == 0);
assert(final[i]->onchain_wallet == 0);
assert(amount_sat_eq(final[i]->out_sat, AMOUNT_SAT(3000000)));
assert(final[i]->out_ppm == 0);
i++;
assert(amount_sat_eq(final[i]->lease_sat, AMOUNT_SAT(0)));
assert(final[i]->lease_max_ppm == 0);
assert(amount_sat_eq(final[i]->in_sat, AMOUNT_SAT(0)));
assert(final[i]->in_ppm == 0);
assert(channel_id_eq(final[i]->channel_id, &channels[1].chan_id));
assert(final[i]->bitcoin_address == 0);
assert(final[i]->onchain_wallet == 0);
assert(amount_sat_eq(final[i]->out_sat, AMOUNT_SAT(0)));
assert(final[i]->out_ppm == 1000000);
i++;
assert(amount_sat_eq(final[i]->lease_sat, AMOUNT_SAT(0)));
assert(final[i]->lease_max_ppm == 0);
assert(amount_sat_eq(final[i]->in_sat, AMOUNT_SAT(0)));
assert(final[i]->in_ppm == 0);
assert(channel_id_eq(final[i]->channel_id, &channels[2].chan_id));
assert(final[i]->bitcoin_address == 0);
assert(final[i]->onchain_wallet == 0);
assert(amount_sat_eq(final[i]->out_sat, AMOUNT_SAT(12000000)));
assert(final[i]->out_ppm == 0);
i++;
assert(amount_sat_eq(final[i]->lease_sat, AMOUNT_SAT(0)));
assert(final[i]->lease_max_ppm == 0);
assert(amount_sat_eq(final[i]->in_sat, AMOUNT_SAT(0)));
assert(final[i]->in_ppm == 0);
assert(channel_id_eq(final[i]->channel_id, &channels[3].chan_id));
assert(final[i]->bitcoin_address == 0);
assert(final[i]->onchain_wallet == 0);
assert(amount_sat_eq(final[i]->out_sat, AMOUNT_SAT(0)));
assert(final[i]->out_ppm == 1000000);
i++;
assert(amount_sat_eq(final[i]->lease_sat, AMOUNT_SAT(0)));
assert(final[i]->lease_max_ppm == 0);
assert(amount_sat_eq(final[i]->in_sat, AMOUNT_SAT(0)));
assert(final[i]->in_ppm == 0);
assert(channel_id_eq(final[i]->channel_id, &channels[4].chan_id));
assert(final[i]->bitcoin_address == 0);
assert(final[i]->onchain_wallet == 0);
assert(amount_sat_eq(final[i]->out_sat, AMOUNT_SAT(0)));
assert(final[i]->out_ppm == 1000000);
i++;
assert(amount_sat_eq(final[i]->lease_sat, AMOUNT_SAT(0)));
assert(final[i]->lease_max_ppm == 0);
assert(amount_sat_eq(final[i]->in_sat, AMOUNT_SAT(0)));
assert(final[i]->in_ppm == 0);
assert(channel_id_eq(final[i]->channel_id, &channels[5].chan_id));
assert(final[i]->bitcoin_address == 0);
assert(final[i]->onchain_wallet == 0);
assert(amount_sat_eq(final[i]->out_sat, AMOUNT_SAT(0)));
assert(final[i]->out_ppm == 1000000);
i++;
assert(amount_sat_eq(final[i]->lease_sat, AMOUNT_SAT(4910000)));
assert(final[i]->lease_max_ppm == 20000);
assert(amount_sat_eq(final[i]->in_sat, AMOUNT_SAT(0)));
assert(final[i]->in_ppm == 0);
assert(channel_id_eq(final[i]->channel_id, &channels[6].chan_id));
assert(final[i]->bitcoin_address == 0);
assert(final[i]->onchain_wallet == 0);
assert(amount_sat_eq(final[i]->out_sat, AMOUNT_SAT(0)));
assert(final[i]->out_ppm == 0);
i++;
assert(amount_sat_eq(final[i]->lease_sat, AMOUNT_SAT(100000)));
assert(final[i]->lease_max_ppm == 0);
assert(amount_sat_eq(final[i]->in_sat, AMOUNT_SAT(0)));
assert(final[i]->in_ppm == 250000);
assert(channel_id_eq(final[i]->channel_id, &channels[8].chan_id));
assert(final[i]->bitcoin_address == 0);
assert(final[i]->onchain_wallet == 0);
assert(amount_sat_eq(final[i]->out_sat, AMOUNT_SAT(0)));
assert(final[i]->out_ppm == 0);
i++;
assert(amount_sat_eq(final[i]->lease_sat, AMOUNT_SAT(0)));
assert(final[i]->lease_max_ppm == 0);
assert(amount_sat_eq(final[i]->in_sat, AMOUNT_SAT(0)));
assert(final[i]->in_ppm == 33333);
assert(channel_id_eq(final[i]->channel_id, &channels[9].chan_id));
assert(final[i]->bitcoin_address == 0);
assert(final[i]->onchain_wallet == 0);
assert(amount_sat_eq(final[i]->out_sat, AMOUNT_SAT(0)));
assert(final[i]->out_ppm == 0);
i++;
assert(amount_sat_eq(final[i]->lease_sat, AMOUNT_SAT(0)));
assert(final[i]->lease_max_ppm == 0);
assert(amount_sat_eq(final[i]->in_sat, AMOUNT_SAT(0)));
assert(final[i]->in_ppm == 33333);
assert(channel_id_eq(final[i]->channel_id, &channels[10].chan_id));
assert(final[i]->bitcoin_address == 0);
assert(final[i]->onchain_wallet == 0);
assert(amount_sat_eq(final[i]->out_sat, AMOUNT_SAT(0)));
assert(final[i]->out_ppm == 0);
i++;
assert(amount_sat_eq(final[i]->lease_sat, AMOUNT_SAT(0)));
assert(final[i]->lease_max_ppm == 0);
assert(amount_sat_eq(final[i]->in_sat, AMOUNT_SAT(0)));
assert(final[i]->in_ppm == 33333);
assert(channel_id_eq(final[i]->channel_id, &channels[11].chan_id));
assert(final[i]->bitcoin_address == 0);
assert(final[i]->onchain_wallet == 0);
assert(amount_sat_eq(final[i]->out_sat, AMOUNT_SAT(0)));
assert(final[i]->out_ppm == 0);
i++;
assert(amount_sat_eq(final[i]->lease_sat, AMOUNT_SAT(0)));
assert(final[i]->lease_max_ppm == 0);
assert(amount_sat_eq(final[i]->in_sat, AMOUNT_SAT(0)));
assert(final[i]->in_ppm == 650001);
assert(final[i]->channel_id == 0);
assert(final[i]->bitcoin_address == 0);
assert(final[i]->onchain_wallet == 1);
assert(amount_sat_eq(final[i]->out_sat, AMOUNT_SAT(0)));
assert(final[i]->out_ppm == 0);
i++;

assert(i == tal_count(final));

common_shutdown();

return 0;
}

0 comments on commit 2640bd6

Please sign in to comment.