core-lightning/wire/peer_wiregen.c
niftynei 23a6c00496 Makefile: import latest spec, which includes quickclose.
It also gets rid of the requirement that close negotiation fee maximum
is the old commitment transaction.  We still do that, however, to
avoid surprising old peers.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
2021-09-09 12:04:48 +09:30

2593 lines
90 KiB
C
Generated

/* This file was generated by generate-wire.py */
/* Do not modify this file! Modify the .csv file it was generated from. */
/* Original template can be found at tools/gen/impl_template */
#include <wire/peer_wiregen.h>
#include <assert.h>
#include <ccan/array_size/array_size.h>
#include <ccan/mem/mem.h>
#include <ccan/tal/str/str.h>
#include <common/utils.h>
#include <stdio.h>
#ifndef SUPERVERBOSE
#define SUPERVERBOSE(...)
#endif
const char *peer_wire_name(int e)
{
static char invalidbuf[sizeof("INVALID ") + STR_MAX_CHARS(e)];
switch ((enum peer_wire)e) {
case WIRE_INIT: return "WIRE_INIT";
case WIRE_ERROR: return "WIRE_ERROR";
case WIRE_WARNING: return "WIRE_WARNING";
case WIRE_PING: return "WIRE_PING";
case WIRE_PONG: return "WIRE_PONG";
case WIRE_TX_ADD_INPUT: return "WIRE_TX_ADD_INPUT";
case WIRE_TX_ADD_OUTPUT: return "WIRE_TX_ADD_OUTPUT";
case WIRE_TX_REMOVE_INPUT: return "WIRE_TX_REMOVE_INPUT";
case WIRE_TX_REMOVE_OUTPUT: return "WIRE_TX_REMOVE_OUTPUT";
case WIRE_TX_COMPLETE: return "WIRE_TX_COMPLETE";
case WIRE_TX_SIGNATURES: return "WIRE_TX_SIGNATURES";
case WIRE_OPEN_CHANNEL: return "WIRE_OPEN_CHANNEL";
case WIRE_ACCEPT_CHANNEL: return "WIRE_ACCEPT_CHANNEL";
case WIRE_FUNDING_CREATED: return "WIRE_FUNDING_CREATED";
case WIRE_FUNDING_SIGNED: return "WIRE_FUNDING_SIGNED";
case WIRE_FUNDING_LOCKED: return "WIRE_FUNDING_LOCKED";
case WIRE_OPEN_CHANNEL2: return "WIRE_OPEN_CHANNEL2";
case WIRE_ACCEPT_CHANNEL2: return "WIRE_ACCEPT_CHANNEL2";
case WIRE_INIT_RBF: return "WIRE_INIT_RBF";
case WIRE_ACK_RBF: return "WIRE_ACK_RBF";
case WIRE_SHUTDOWN: return "WIRE_SHUTDOWN";
case WIRE_CLOSING_SIGNED: return "WIRE_CLOSING_SIGNED";
case WIRE_UPDATE_ADD_HTLC: return "WIRE_UPDATE_ADD_HTLC";
case WIRE_UPDATE_FULFILL_HTLC: return "WIRE_UPDATE_FULFILL_HTLC";
case WIRE_UPDATE_FAIL_HTLC: return "WIRE_UPDATE_FAIL_HTLC";
case WIRE_UPDATE_FAIL_MALFORMED_HTLC: return "WIRE_UPDATE_FAIL_MALFORMED_HTLC";
case WIRE_COMMITMENT_SIGNED: return "WIRE_COMMITMENT_SIGNED";
case WIRE_REVOKE_AND_ACK: return "WIRE_REVOKE_AND_ACK";
case WIRE_UPDATE_FEE: return "WIRE_UPDATE_FEE";
case WIRE_UPDATE_BLOCKHEIGHT: return "WIRE_UPDATE_BLOCKHEIGHT";
case WIRE_CHANNEL_REESTABLISH: return "WIRE_CHANNEL_REESTABLISH";
case WIRE_ANNOUNCEMENT_SIGNATURES: return "WIRE_ANNOUNCEMENT_SIGNATURES";
case WIRE_CHANNEL_ANNOUNCEMENT: return "WIRE_CHANNEL_ANNOUNCEMENT";
case WIRE_NODE_ANNOUNCEMENT: return "WIRE_NODE_ANNOUNCEMENT";
case WIRE_CHANNEL_UPDATE: return "WIRE_CHANNEL_UPDATE";
case WIRE_QUERY_SHORT_CHANNEL_IDS: return "WIRE_QUERY_SHORT_CHANNEL_IDS";
case WIRE_REPLY_SHORT_CHANNEL_IDS_END: return "WIRE_REPLY_SHORT_CHANNEL_IDS_END";
case WIRE_QUERY_CHANNEL_RANGE: return "WIRE_QUERY_CHANNEL_RANGE";
case WIRE_REPLY_CHANNEL_RANGE: return "WIRE_REPLY_CHANNEL_RANGE";
case WIRE_GOSSIP_TIMESTAMP_FILTER: return "WIRE_GOSSIP_TIMESTAMP_FILTER";
case WIRE_ONION_MESSAGE: return "WIRE_ONION_MESSAGE";
}
snprintf(invalidbuf, sizeof(invalidbuf), "INVALID %i", e);
return invalidbuf;
}
bool peer_wire_is_defined(u16 type)
{
switch ((enum peer_wire)type) {
case WIRE_INIT:;
case WIRE_ERROR:;
case WIRE_WARNING:;
case WIRE_PING:;
case WIRE_PONG:;
case WIRE_TX_ADD_INPUT:;
case WIRE_TX_ADD_OUTPUT:;
case WIRE_TX_REMOVE_INPUT:;
case WIRE_TX_REMOVE_OUTPUT:;
case WIRE_TX_COMPLETE:;
case WIRE_TX_SIGNATURES:;
case WIRE_OPEN_CHANNEL:;
case WIRE_ACCEPT_CHANNEL:;
case WIRE_FUNDING_CREATED:;
case WIRE_FUNDING_SIGNED:;
case WIRE_FUNDING_LOCKED:;
case WIRE_OPEN_CHANNEL2:;
case WIRE_ACCEPT_CHANNEL2:;
case WIRE_INIT_RBF:;
case WIRE_ACK_RBF:;
case WIRE_SHUTDOWN:;
case WIRE_CLOSING_SIGNED:;
case WIRE_UPDATE_ADD_HTLC:;
case WIRE_UPDATE_FULFILL_HTLC:;
case WIRE_UPDATE_FAIL_HTLC:;
case WIRE_UPDATE_FAIL_MALFORMED_HTLC:;
case WIRE_COMMITMENT_SIGNED:;
case WIRE_REVOKE_AND_ACK:;
case WIRE_UPDATE_FEE:;
case WIRE_UPDATE_BLOCKHEIGHT:;
case WIRE_CHANNEL_REESTABLISH:;
case WIRE_ANNOUNCEMENT_SIGNATURES:;
case WIRE_CHANNEL_ANNOUNCEMENT:;
case WIRE_NODE_ANNOUNCEMENT:;
case WIRE_CHANNEL_UPDATE:;
case WIRE_QUERY_SHORT_CHANNEL_IDS:;
case WIRE_REPLY_SHORT_CHANNEL_IDS_END:;
case WIRE_QUERY_CHANNEL_RANGE:;
case WIRE_REPLY_CHANNEL_RANGE:;
case WIRE_GOSSIP_TIMESTAMP_FILTER:;
case WIRE_ONION_MESSAGE:;
return true;
}
return false;
}
/* SUBTYPE: WITNESS_ELEMENT */
void towire_witness_element(u8 **p, const struct witness_element *witness_element)
{
u16 len = tal_count(witness_element->witness);
towire_u16(p, len);
towire_u8_array(p, witness_element->witness, len);
}
struct witness_element *
fromwire_witness_element(const tal_t *ctx, const u8 **cursor, size_t *plen)
{
struct witness_element *witness_element = tal(ctx, struct witness_element);
u16 len;
len = fromwire_u16(cursor, plen);
witness_element->witness = tal_arr(witness_element, u8, len);
fromwire_u8_array(cursor, plen, witness_element->witness, len);
return witness_element;
}
/* SUBTYPE: LEASE_RATES */
void towire_lease_rates(u8 **p, const struct lease_rates *lease_rates)
{
towire_u16(p, lease_rates->funding_weight);
towire_u16(p, lease_rates->lease_fee_basis);
towire_u16(p, lease_rates->channel_fee_max_proportional_thousandths);
towire_u32(p, lease_rates->lease_fee_base_sat);
towire_tu32(p, lease_rates->channel_fee_max_base_msat);
}
void fromwire_lease_rates(const u8 **cursor, size_t *plen, struct lease_rates *lease_rates)
{
lease_rates->funding_weight = fromwire_u16(cursor, plen);
lease_rates->lease_fee_basis = fromwire_u16(cursor, plen);
lease_rates->channel_fee_max_proportional_thousandths = fromwire_u16(cursor, plen);
lease_rates->lease_fee_base_sat = fromwire_u32(cursor, plen);
lease_rates->channel_fee_max_base_msat = fromwire_tu32(cursor, plen);
}
/* SUBTYPE: CHANNEL_UPDATE_CHECKSUMS */
void towire_channel_update_checksums(u8 **p, const struct channel_update_checksums *channel_update_checksums)
{
towire_u32(p, channel_update_checksums->checksum_node_id_1);
towire_u32(p, channel_update_checksums->checksum_node_id_2);
}
void fromwire_channel_update_checksums(const u8 **cursor, size_t *plen, struct channel_update_checksums *channel_update_checksums)
{
channel_update_checksums->checksum_node_id_1 = fromwire_u32(cursor, plen);
channel_update_checksums->checksum_node_id_2 = fromwire_u32(cursor, plen);
}
/* SUBTYPE: CHANNEL_UPDATE_TIMESTAMPS */
void towire_channel_update_timestamps(u8 **p, const struct channel_update_timestamps *channel_update_timestamps)
{
towire_u32(p, channel_update_timestamps->timestamp_node_id_1);
towire_u32(p, channel_update_timestamps->timestamp_node_id_2);
}
void fromwire_channel_update_timestamps(const u8 **cursor, size_t *plen, struct channel_update_timestamps *channel_update_timestamps)
{
channel_update_timestamps->timestamp_node_id_1 = fromwire_u32(cursor, plen);
channel_update_timestamps->timestamp_node_id_2 = fromwire_u32(cursor, plen);
}
/* SUBTYPE: WITNESS_STACK */
void towire_witness_stack(u8 **p, const struct witness_stack *witness_stack)
{
u16 num_input_witness = tal_count(witness_stack->witness_element);
towire_u16(p, num_input_witness);
for (size_t i = 0; i < num_input_witness; i++)
towire_witness_element(p, witness_stack->witness_element[i]);
}
struct witness_stack *
fromwire_witness_stack(const tal_t *ctx, const u8 **cursor, size_t *plen)
{
struct witness_stack *witness_stack = tal(ctx, struct witness_stack);
u16 num_input_witness;
num_input_witness = fromwire_u16(cursor, plen);
witness_stack->witness_element = num_input_witness ? tal_arr(witness_stack, struct witness_element *, 0) : NULL;
for (size_t i = 0; i < num_input_witness; i++) {
struct witness_element * tmp;
tmp = fromwire_witness_element(witness_stack, cursor, plen);
tal_arr_expand(&witness_stack->witness_element, tmp);
}
return witness_stack;
}
struct tlv_init_tlvs *tlv_init_tlvs_new(const tal_t *ctx)
{
/* Initialize everything to NULL. (Quiet, C pedants!) */
struct tlv_init_tlvs *inst = talz(ctx, struct tlv_init_tlvs);
/* Initialized the fields to an empty array. */
inst->fields = tal_arr(inst, struct tlv_field, 0);
return inst;
}
/* INIT_TLVS MSG: networks */
static u8 *towire_tlv_init_tlvs_networks(const tal_t *ctx, const void *vrecord)
{
const struct tlv_init_tlvs *r = vrecord;
u8 *ptr;
if (!r->networks)
return NULL;
ptr = tal_arr(ctx, u8, 0);
for (size_t i = 0; i < tal_count(r->networks); i++)
towire_bitcoin_blkid(&ptr, r->networks + i);
return ptr;
}
static void fromwire_tlv_init_tlvs_networks(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_init_tlvs *r = vrecord;
r->networks = *plen ? tal_arr(r, struct bitcoin_blkid, 0) : NULL;
for (size_t i = 0; *plen != 0; i++) {
struct bitcoin_blkid tmp;
fromwire_bitcoin_blkid(cursor, plen, &tmp);
tal_arr_expand(&r->networks, tmp);
}
}
static const struct tlv_record_type tlvs_init_tlvs[] = {
{ 1, towire_tlv_init_tlvs_networks, fromwire_tlv_init_tlvs_networks },
};
void towire_init_tlvs(u8 **pptr, const struct tlv_init_tlvs *record)
{
towire_tlv(pptr, tlvs_init_tlvs, 1, record);
}
bool fromwire_init_tlvs(const u8 **cursor, size_t *max, struct tlv_init_tlvs *record)
{
return fromwire_tlv(cursor, max, tlvs_init_tlvs, 1, record, &record->fields);
}
bool init_tlvs_is_valid(const struct tlv_init_tlvs *record, size_t *err_index)
{
return tlv_fields_valid(record->fields, NULL, err_index);
}
struct tlv_n1 *tlv_n1_new(const tal_t *ctx)
{
/* Initialize everything to NULL. (Quiet, C pedants!) */
struct tlv_n1 *inst = talz(ctx, struct tlv_n1);
/* Initialized the fields to an empty array. */
inst->fields = tal_arr(inst, struct tlv_field, 0);
return inst;
}
/* N1 MSG: tlv1 */
static u8 *towire_tlv_n1_tlv1(const tal_t *ctx, const void *vrecord)
{
const struct tlv_n1 *r = vrecord;
u8 *ptr;
if (!r->tlv1)
return NULL;
ptr = tal_arr(ctx, u8, 0);
towire_tu64(&ptr, *r->tlv1);
return ptr;
}
static void fromwire_tlv_n1_tlv1(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_n1 *r = vrecord;
r->tlv1 = tal(r, u64);
*r->tlv1 = fromwire_tu64(cursor, plen);
}
/* N1 MSG: tlv2 */
static u8 *towire_tlv_n1_tlv2(const tal_t *ctx, const void *vrecord)
{
const struct tlv_n1 *r = vrecord;
u8 *ptr;
if (!r->tlv2)
return NULL;
ptr = tal_arr(ctx, u8, 0);
towire_short_channel_id(&ptr, r->tlv2);
return ptr;
}
static void fromwire_tlv_n1_tlv2(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_n1 *r = vrecord;
r->tlv2 = tal(r, struct short_channel_id);
fromwire_short_channel_id(cursor, plen, &*r->tlv2);
}
/* N1 MSG: tlv3 */
static u8 *towire_tlv_n1_tlv3(const tal_t *ctx, const void *vrecord)
{
const struct tlv_n1 *r = vrecord;
u8 *ptr;
if (!r->tlv3)
return NULL;
ptr = tal_arr(ctx, u8, 0);
towire_pubkey(&ptr, &r->tlv3->node_id);
towire_amount_msat(&ptr, r->tlv3->amount_msat_1);
towire_amount_msat(&ptr, r->tlv3->amount_msat_2);
return ptr;
}
static void fromwire_tlv_n1_tlv3(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_n1 *r = vrecord;
r->tlv3 = tal(r, struct tlv_n1_tlv3);
fromwire_pubkey(cursor, plen, &r->tlv3->node_id);
r->tlv3->amount_msat_1 = fromwire_amount_msat(cursor, plen);
r->tlv3->amount_msat_2 = fromwire_amount_msat(cursor, plen);
}
/* N1 MSG: tlv4 */
static u8 *towire_tlv_n1_tlv4(const tal_t *ctx, const void *vrecord)
{
const struct tlv_n1 *r = vrecord;
u8 *ptr;
if (!r->tlv4)
return NULL;
ptr = tal_arr(ctx, u8, 0);
towire_u16(&ptr, *r->tlv4);
return ptr;
}
static void fromwire_tlv_n1_tlv4(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_n1 *r = vrecord;
r->tlv4 = tal(r, u16);
*r->tlv4 = fromwire_u16(cursor, plen);
}
const struct tlv_record_type tlvs_n1[] = {
{ 1, towire_tlv_n1_tlv1, fromwire_tlv_n1_tlv1 },
{ 2, towire_tlv_n1_tlv2, fromwire_tlv_n1_tlv2 },
{ 3, towire_tlv_n1_tlv3, fromwire_tlv_n1_tlv3 },
{ 254, towire_tlv_n1_tlv4, fromwire_tlv_n1_tlv4 },
};
void towire_n1(u8 **pptr, const struct tlv_n1 *record)
{
towire_tlv(pptr, tlvs_n1, 4, record);
}
bool fromwire_n1(const u8 **cursor, size_t *max, struct tlv_n1 *record)
{
return fromwire_tlv(cursor, max, tlvs_n1, 4, record, &record->fields);
}
bool n1_is_valid(const struct tlv_n1 *record, size_t *err_index)
{
return tlv_fields_valid(record->fields, NULL, err_index);
}
struct tlv_n2 *tlv_n2_new(const tal_t *ctx)
{
/* Initialize everything to NULL. (Quiet, C pedants!) */
struct tlv_n2 *inst = talz(ctx, struct tlv_n2);
/* Initialized the fields to an empty array. */
inst->fields = tal_arr(inst, struct tlv_field, 0);
return inst;
}
/* N2 MSG: tlv1 */
static u8 *towire_tlv_n2_tlv1(const tal_t *ctx, const void *vrecord)
{
const struct tlv_n2 *r = vrecord;
u8 *ptr;
if (!r->tlv1)
return NULL;
ptr = tal_arr(ctx, u8, 0);
towire_tu64(&ptr, *r->tlv1);
return ptr;
}
static void fromwire_tlv_n2_tlv1(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_n2 *r = vrecord;
r->tlv1 = tal(r, u64);
*r->tlv1 = fromwire_tu64(cursor, plen);
}
/* N2 MSG: tlv2 */
static u8 *towire_tlv_n2_tlv2(const tal_t *ctx, const void *vrecord)
{
const struct tlv_n2 *r = vrecord;
u8 *ptr;
if (!r->tlv2)
return NULL;
ptr = tal_arr(ctx, u8, 0);
towire_tu32(&ptr, *r->tlv2);
return ptr;
}
static void fromwire_tlv_n2_tlv2(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_n2 *r = vrecord;
r->tlv2 = tal(r, u32);
*r->tlv2 = fromwire_tu32(cursor, plen);
}
const struct tlv_record_type tlvs_n2[] = {
{ 0, towire_tlv_n2_tlv1, fromwire_tlv_n2_tlv1 },
{ 11, towire_tlv_n2_tlv2, fromwire_tlv_n2_tlv2 },
};
void towire_n2(u8 **pptr, const struct tlv_n2 *record)
{
towire_tlv(pptr, tlvs_n2, 2, record);
}
bool fromwire_n2(const u8 **cursor, size_t *max, struct tlv_n2 *record)
{
return fromwire_tlv(cursor, max, tlvs_n2, 2, record, &record->fields);
}
bool n2_is_valid(const struct tlv_n2 *record, size_t *err_index)
{
return tlv_fields_valid(record->fields, NULL, err_index);
}
struct tlv_open_channel_tlvs *tlv_open_channel_tlvs_new(const tal_t *ctx)
{
/* Initialize everything to NULL. (Quiet, C pedants!) */
struct tlv_open_channel_tlvs *inst = talz(ctx, struct tlv_open_channel_tlvs);
/* Initialized the fields to an empty array. */
inst->fields = tal_arr(inst, struct tlv_field, 0);
return inst;
}
/* OPEN_CHANNEL_TLVS MSG: upfront_shutdown_script */
static u8 *towire_tlv_open_channel_tlvs_upfront_shutdown_script(const tal_t *ctx, const void *vrecord)
{
const struct tlv_open_channel_tlvs *r = vrecord;
u8 *ptr;
if (!r->upfront_shutdown_script)
return NULL;
ptr = tal_arr(ctx, u8, 0);
towire_u8_array(&ptr, r->upfront_shutdown_script, tal_count(r->upfront_shutdown_script));
return ptr;
}
static void fromwire_tlv_open_channel_tlvs_upfront_shutdown_script(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_open_channel_tlvs *r = vrecord;
r->upfront_shutdown_script = tal_arr(r, u8, *plen);
fromwire_u8_array(cursor, plen, r->upfront_shutdown_script, *plen);
}
/* OPEN_CHANNEL_TLVS MSG: channel_type */
static u8 *towire_tlv_open_channel_tlvs_channel_type(const tal_t *ctx, const void *vrecord)
{
const struct tlv_open_channel_tlvs *r = vrecord;
u8 *ptr;
if (!r->channel_type)
return NULL;
ptr = tal_arr(ctx, u8, 0);
towire_u8_array(&ptr, r->channel_type, tal_count(r->channel_type));
return ptr;
}
static void fromwire_tlv_open_channel_tlvs_channel_type(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_open_channel_tlvs *r = vrecord;
r->channel_type = tal_arr(r, u8, *plen);
fromwire_u8_array(cursor, plen, r->channel_type, *plen);
}
static const struct tlv_record_type tlvs_open_channel_tlvs[] = {
{ 0, towire_tlv_open_channel_tlvs_upfront_shutdown_script, fromwire_tlv_open_channel_tlvs_upfront_shutdown_script },
{ 1, towire_tlv_open_channel_tlvs_channel_type, fromwire_tlv_open_channel_tlvs_channel_type },
};
void towire_open_channel_tlvs(u8 **pptr, const struct tlv_open_channel_tlvs *record)
{
towire_tlv(pptr, tlvs_open_channel_tlvs, 2, record);
}
bool fromwire_open_channel_tlvs(const u8 **cursor, size_t *max, struct tlv_open_channel_tlvs *record)
{
return fromwire_tlv(cursor, max, tlvs_open_channel_tlvs, 2, record, &record->fields);
}
bool open_channel_tlvs_is_valid(const struct tlv_open_channel_tlvs *record, size_t *err_index)
{
return tlv_fields_valid(record->fields, NULL, err_index);
}
struct tlv_accept_channel_tlvs *tlv_accept_channel_tlvs_new(const tal_t *ctx)
{
/* Initialize everything to NULL. (Quiet, C pedants!) */
struct tlv_accept_channel_tlvs *inst = talz(ctx, struct tlv_accept_channel_tlvs);
/* Initialized the fields to an empty array. */
inst->fields = tal_arr(inst, struct tlv_field, 0);
return inst;
}
/* ACCEPT_CHANNEL_TLVS MSG: upfront_shutdown_script */
static u8 *towire_tlv_accept_channel_tlvs_upfront_shutdown_script(const tal_t *ctx, const void *vrecord)
{
const struct tlv_accept_channel_tlvs *r = vrecord;
u8 *ptr;
if (!r->upfront_shutdown_script)
return NULL;
ptr = tal_arr(ctx, u8, 0);
towire_u8_array(&ptr, r->upfront_shutdown_script, tal_count(r->upfront_shutdown_script));
return ptr;
}
static void fromwire_tlv_accept_channel_tlvs_upfront_shutdown_script(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_accept_channel_tlvs *r = vrecord;
r->upfront_shutdown_script = tal_arr(r, u8, *plen);
fromwire_u8_array(cursor, plen, r->upfront_shutdown_script, *plen);
}
/* ACCEPT_CHANNEL_TLVS MSG: channel_type */
static u8 *towire_tlv_accept_channel_tlvs_channel_type(const tal_t *ctx, const void *vrecord)
{
const struct tlv_accept_channel_tlvs *r = vrecord;
u8 *ptr;
if (!r->channel_type)
return NULL;
ptr = tal_arr(ctx, u8, 0);
towire_u8_array(&ptr, r->channel_type, tal_count(r->channel_type));
return ptr;
}
static void fromwire_tlv_accept_channel_tlvs_channel_type(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_accept_channel_tlvs *r = vrecord;
r->channel_type = tal_arr(r, u8, *plen);
fromwire_u8_array(cursor, plen, r->channel_type, *plen);
}
static const struct tlv_record_type tlvs_accept_channel_tlvs[] = {
{ 0, towire_tlv_accept_channel_tlvs_upfront_shutdown_script, fromwire_tlv_accept_channel_tlvs_upfront_shutdown_script },
{ 1, towire_tlv_accept_channel_tlvs_channel_type, fromwire_tlv_accept_channel_tlvs_channel_type },
};
void towire_accept_channel_tlvs(u8 **pptr, const struct tlv_accept_channel_tlvs *record)
{
towire_tlv(pptr, tlvs_accept_channel_tlvs, 2, record);
}
bool fromwire_accept_channel_tlvs(const u8 **cursor, size_t *max, struct tlv_accept_channel_tlvs *record)
{
return fromwire_tlv(cursor, max, tlvs_accept_channel_tlvs, 2, record, &record->fields);
}
bool accept_channel_tlvs_is_valid(const struct tlv_accept_channel_tlvs *record, size_t *err_index)
{
return tlv_fields_valid(record->fields, NULL, err_index);
}
struct tlv_opening_tlvs *tlv_opening_tlvs_new(const tal_t *ctx)
{
/* Initialize everything to NULL. (Quiet, C pedants!) */
struct tlv_opening_tlvs *inst = talz(ctx, struct tlv_opening_tlvs);
/* Initialized the fields to an empty array. */
inst->fields = tal_arr(inst, struct tlv_field, 0);
return inst;
}
/* OPENING_TLVS MSG: option_upfront_shutdown_script */
static u8 *towire_tlv_opening_tlvs_option_upfront_shutdown_script(const tal_t *ctx, const void *vrecord)
{
const struct tlv_opening_tlvs *r = vrecord;
u8 *ptr;
if (!r->option_upfront_shutdown_script)
return NULL;
u16 shutdown_len = tal_count(r->option_upfront_shutdown_script->shutdown_scriptpubkey);
ptr = tal_arr(ctx, u8, 0);
towire_u16(&ptr, shutdown_len);
towire_u8_array(&ptr, r->option_upfront_shutdown_script->shutdown_scriptpubkey, shutdown_len);
return ptr;
}
static void fromwire_tlv_opening_tlvs_option_upfront_shutdown_script(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_opening_tlvs *r = vrecord;
u16 shutdown_len;
r->option_upfront_shutdown_script = tal(r, struct tlv_opening_tlvs_option_upfront_shutdown_script);
shutdown_len = fromwire_u16(cursor, plen);
r->option_upfront_shutdown_script->shutdown_scriptpubkey = tal_arr(r->option_upfront_shutdown_script, u8, shutdown_len);
fromwire_u8_array(cursor, plen, r->option_upfront_shutdown_script->shutdown_scriptpubkey, shutdown_len);
}
/* OPENING_TLVS MSG: request_funds */
static u8 *towire_tlv_opening_tlvs_request_funds(const tal_t *ctx, const void *vrecord)
{
const struct tlv_opening_tlvs *r = vrecord;
u8 *ptr;
if (!r->request_funds)
return NULL;
ptr = tal_arr(ctx, u8, 0);
towire_u64(&ptr, r->request_funds->requested_sats);
towire_u32(&ptr, r->request_funds->blockheight);
return ptr;
}
static void fromwire_tlv_opening_tlvs_request_funds(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_opening_tlvs *r = vrecord;
r->request_funds = tal(r, struct tlv_opening_tlvs_request_funds);
r->request_funds->requested_sats = fromwire_u64(cursor, plen);
r->request_funds->blockheight = fromwire_u32(cursor, plen);
}
static const struct tlv_record_type tlvs_opening_tlvs[] = {
{ 1, towire_tlv_opening_tlvs_option_upfront_shutdown_script, fromwire_tlv_opening_tlvs_option_upfront_shutdown_script },
{ 3, towire_tlv_opening_tlvs_request_funds, fromwire_tlv_opening_tlvs_request_funds },
};
void towire_opening_tlvs(u8 **pptr, const struct tlv_opening_tlvs *record)
{
towire_tlv(pptr, tlvs_opening_tlvs, 2, record);
}
bool fromwire_opening_tlvs(const u8 **cursor, size_t *max, struct tlv_opening_tlvs *record)
{
return fromwire_tlv(cursor, max, tlvs_opening_tlvs, 2, record, &record->fields);
}
bool opening_tlvs_is_valid(const struct tlv_opening_tlvs *record, size_t *err_index)
{
return tlv_fields_valid(record->fields, NULL, err_index);
}
struct tlv_accept_tlvs *tlv_accept_tlvs_new(const tal_t *ctx)
{
/* Initialize everything to NULL. (Quiet, C pedants!) */
struct tlv_accept_tlvs *inst = talz(ctx, struct tlv_accept_tlvs);
/* Initialized the fields to an empty array. */
inst->fields = tal_arr(inst, struct tlv_field, 0);
return inst;
}
/* ACCEPT_TLVS MSG: option_upfront_shutdown_script */
static u8 *towire_tlv_accept_tlvs_option_upfront_shutdown_script(const tal_t *ctx, const void *vrecord)
{
const struct tlv_accept_tlvs *r = vrecord;
u8 *ptr;
if (!r->option_upfront_shutdown_script)
return NULL;
u16 shutdown_len = tal_count(r->option_upfront_shutdown_script->shutdown_scriptpubkey);
ptr = tal_arr(ctx, u8, 0);
towire_u16(&ptr, shutdown_len);
towire_u8_array(&ptr, r->option_upfront_shutdown_script->shutdown_scriptpubkey, shutdown_len);
return ptr;
}
static void fromwire_tlv_accept_tlvs_option_upfront_shutdown_script(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_accept_tlvs *r = vrecord;
u16 shutdown_len;
r->option_upfront_shutdown_script = tal(r, struct tlv_accept_tlvs_option_upfront_shutdown_script);
shutdown_len = fromwire_u16(cursor, plen);
r->option_upfront_shutdown_script->shutdown_scriptpubkey = tal_arr(r->option_upfront_shutdown_script, u8, shutdown_len);
fromwire_u8_array(cursor, plen, r->option_upfront_shutdown_script->shutdown_scriptpubkey, shutdown_len);
}
/* ACCEPT_TLVS MSG: will_fund */
static u8 *towire_tlv_accept_tlvs_will_fund(const tal_t *ctx, const void *vrecord)
{
const struct tlv_accept_tlvs *r = vrecord;
u8 *ptr;
if (!r->will_fund)
return NULL;
ptr = tal_arr(ctx, u8, 0);
towire_secp256k1_ecdsa_signature(&ptr, &r->will_fund->signature);
towire_lease_rates(&ptr, &r->will_fund->lease_rates);
return ptr;
}
static void fromwire_tlv_accept_tlvs_will_fund(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_accept_tlvs *r = vrecord;
r->will_fund = tal(r, struct tlv_accept_tlvs_will_fund);
fromwire_secp256k1_ecdsa_signature(cursor, plen, &r->will_fund->signature);
fromwire_lease_rates(cursor, plen, &r->will_fund->lease_rates);
}
static const struct tlv_record_type tlvs_accept_tlvs[] = {
{ 1, towire_tlv_accept_tlvs_option_upfront_shutdown_script, fromwire_tlv_accept_tlvs_option_upfront_shutdown_script },
{ 2, towire_tlv_accept_tlvs_will_fund, fromwire_tlv_accept_tlvs_will_fund },
};
void towire_accept_tlvs(u8 **pptr, const struct tlv_accept_tlvs *record)
{
towire_tlv(pptr, tlvs_accept_tlvs, 2, record);
}
bool fromwire_accept_tlvs(const u8 **cursor, size_t *max, struct tlv_accept_tlvs *record)
{
return fromwire_tlv(cursor, max, tlvs_accept_tlvs, 2, record, &record->fields);
}
bool accept_tlvs_is_valid(const struct tlv_accept_tlvs *record, size_t *err_index)
{
return tlv_fields_valid(record->fields, NULL, err_index);
}
struct tlv_shutdown_tlvs *tlv_shutdown_tlvs_new(const tal_t *ctx)
{
/* Initialize everything to NULL. (Quiet, C pedants!) */
struct tlv_shutdown_tlvs *inst = talz(ctx, struct tlv_shutdown_tlvs);
/* Initialized the fields to an empty array. */
inst->fields = tal_arr(inst, struct tlv_field, 0);
return inst;
}
/* SHUTDOWN_TLVS MSG: wrong_funding */
static u8 *towire_tlv_shutdown_tlvs_wrong_funding(const tal_t *ctx, const void *vrecord)
{
const struct tlv_shutdown_tlvs *r = vrecord;
u8 *ptr;
if (!r->wrong_funding)
return NULL;
ptr = tal_arr(ctx, u8, 0);
towire_bitcoin_txid(&ptr, &r->wrong_funding->txid);
towire_u32(&ptr, r->wrong_funding->outnum);
return ptr;
}
static void fromwire_tlv_shutdown_tlvs_wrong_funding(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_shutdown_tlvs *r = vrecord;
r->wrong_funding = tal(r, struct tlv_shutdown_tlvs_wrong_funding);
fromwire_bitcoin_txid(cursor, plen, &r->wrong_funding->txid);
r->wrong_funding->outnum = fromwire_u32(cursor, plen);
}
static const struct tlv_record_type tlvs_shutdown_tlvs[] = {
{ 100, towire_tlv_shutdown_tlvs_wrong_funding, fromwire_tlv_shutdown_tlvs_wrong_funding },
};
void towire_shutdown_tlvs(u8 **pptr, const struct tlv_shutdown_tlvs *record)
{
towire_tlv(pptr, tlvs_shutdown_tlvs, 1, record);
}
bool fromwire_shutdown_tlvs(const u8 **cursor, size_t *max, struct tlv_shutdown_tlvs *record)
{
return fromwire_tlv(cursor, max, tlvs_shutdown_tlvs, 1, record, &record->fields);
}
bool shutdown_tlvs_is_valid(const struct tlv_shutdown_tlvs *record, size_t *err_index)
{
return tlv_fields_valid(record->fields, NULL, err_index);
}
struct tlv_closing_signed_tlvs *tlv_closing_signed_tlvs_new(const tal_t *ctx)
{
/* Initialize everything to NULL. (Quiet, C pedants!) */
struct tlv_closing_signed_tlvs *inst = talz(ctx, struct tlv_closing_signed_tlvs);
/* Initialized the fields to an empty array. */
inst->fields = tal_arr(inst, struct tlv_field, 0);
return inst;
}
/* CLOSING_SIGNED_TLVS MSG: fee_range */
static u8 *towire_tlv_closing_signed_tlvs_fee_range(const tal_t *ctx, const void *vrecord)
{
const struct tlv_closing_signed_tlvs *r = vrecord;
u8 *ptr;
if (!r->fee_range)
return NULL;
ptr = tal_arr(ctx, u8, 0);
towire_amount_sat(&ptr, r->fee_range->min_fee_satoshis);
towire_amount_sat(&ptr, r->fee_range->max_fee_satoshis);
return ptr;
}
static void fromwire_tlv_closing_signed_tlvs_fee_range(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_closing_signed_tlvs *r = vrecord;
r->fee_range = tal(r, struct tlv_closing_signed_tlvs_fee_range);
r->fee_range->min_fee_satoshis = fromwire_amount_sat(cursor, plen);
r->fee_range->max_fee_satoshis = fromwire_amount_sat(cursor, plen);
}
static const struct tlv_record_type tlvs_closing_signed_tlvs[] = {
{ 1, towire_tlv_closing_signed_tlvs_fee_range, fromwire_tlv_closing_signed_tlvs_fee_range },
};
void towire_closing_signed_tlvs(u8 **pptr, const struct tlv_closing_signed_tlvs *record)
{
towire_tlv(pptr, tlvs_closing_signed_tlvs, 1, record);
}
bool fromwire_closing_signed_tlvs(const u8 **cursor, size_t *max, struct tlv_closing_signed_tlvs *record)
{
return fromwire_tlv(cursor, max, tlvs_closing_signed_tlvs, 1, record, &record->fields);
}
bool closing_signed_tlvs_is_valid(const struct tlv_closing_signed_tlvs *record, size_t *err_index)
{
return tlv_fields_valid(record->fields, NULL, err_index);
}
struct tlv_node_ann_tlvs *tlv_node_ann_tlvs_new(const tal_t *ctx)
{
/* Initialize everything to NULL. (Quiet, C pedants!) */
struct tlv_node_ann_tlvs *inst = talz(ctx, struct tlv_node_ann_tlvs);
/* Initialized the fields to an empty array. */
inst->fields = tal_arr(inst, struct tlv_field, 0);
return inst;
}
/* NODE_ANN_TLVS MSG: option_will_fund */
static u8 *towire_tlv_node_ann_tlvs_option_will_fund(const tal_t *ctx, const void *vrecord)
{
const struct tlv_node_ann_tlvs *r = vrecord;
u8 *ptr;
if (!r->option_will_fund)
return NULL;
ptr = tal_arr(ctx, u8, 0);
towire_lease_rates(&ptr, r->option_will_fund);
return ptr;
}
static void fromwire_tlv_node_ann_tlvs_option_will_fund(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_node_ann_tlvs *r = vrecord;
r->option_will_fund = tal(r, struct lease_rates);
fromwire_lease_rates(cursor, plen, &*r->option_will_fund);
}
static const struct tlv_record_type tlvs_node_ann_tlvs[] = {
{ 1, towire_tlv_node_ann_tlvs_option_will_fund, fromwire_tlv_node_ann_tlvs_option_will_fund },
};
void towire_node_ann_tlvs(u8 **pptr, const struct tlv_node_ann_tlvs *record)
{
towire_tlv(pptr, tlvs_node_ann_tlvs, 1, record);
}
bool fromwire_node_ann_tlvs(const u8 **cursor, size_t *max, struct tlv_node_ann_tlvs *record)
{
return fromwire_tlv(cursor, max, tlvs_node_ann_tlvs, 1, record, &record->fields);
}
bool node_ann_tlvs_is_valid(const struct tlv_node_ann_tlvs *record, size_t *err_index)
{
return tlv_fields_valid(record->fields, NULL, err_index);
}
struct tlv_query_short_channel_ids_tlvs *tlv_query_short_channel_ids_tlvs_new(const tal_t *ctx)
{
/* Initialize everything to NULL. (Quiet, C pedants!) */
struct tlv_query_short_channel_ids_tlvs *inst = talz(ctx, struct tlv_query_short_channel_ids_tlvs);
/* Initialized the fields to an empty array. */
inst->fields = tal_arr(inst, struct tlv_field, 0);
return inst;
}
/* QUERY_SHORT_CHANNEL_IDS_TLVS MSG: query_flags */
static u8 *towire_tlv_query_short_channel_ids_tlvs_query_flags(const tal_t *ctx, const void *vrecord)
{
const struct tlv_query_short_channel_ids_tlvs *r = vrecord;
u8 *ptr;
if (!r->query_flags)
return NULL;
ptr = tal_arr(ctx, u8, 0);
towire_u8(&ptr, r->query_flags->encoding_type);
towire_u8_array(&ptr, r->query_flags->encoded_query_flags, tal_count(r->query_flags->encoded_query_flags));
return ptr;
}
static void fromwire_tlv_query_short_channel_ids_tlvs_query_flags(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_query_short_channel_ids_tlvs *r = vrecord;
r->query_flags = tal(r, struct tlv_query_short_channel_ids_tlvs_query_flags);
r->query_flags->encoding_type = fromwire_u8(cursor, plen);
r->query_flags->encoded_query_flags = tal_arr(r->query_flags, u8, *plen);
fromwire_u8_array(cursor, plen, r->query_flags->encoded_query_flags, *plen);
}
static const struct tlv_record_type tlvs_query_short_channel_ids_tlvs[] = {
{ 1, towire_tlv_query_short_channel_ids_tlvs_query_flags, fromwire_tlv_query_short_channel_ids_tlvs_query_flags },
};
void towire_query_short_channel_ids_tlvs(u8 **pptr, const struct tlv_query_short_channel_ids_tlvs *record)
{
towire_tlv(pptr, tlvs_query_short_channel_ids_tlvs, 1, record);
}
bool fromwire_query_short_channel_ids_tlvs(const u8 **cursor, size_t *max, struct tlv_query_short_channel_ids_tlvs *record)
{
return fromwire_tlv(cursor, max, tlvs_query_short_channel_ids_tlvs, 1, record, &record->fields);
}
bool query_short_channel_ids_tlvs_is_valid(const struct tlv_query_short_channel_ids_tlvs *record, size_t *err_index)
{
return tlv_fields_valid(record->fields, NULL, err_index);
}
struct tlv_query_channel_range_tlvs *tlv_query_channel_range_tlvs_new(const tal_t *ctx)
{
/* Initialize everything to NULL. (Quiet, C pedants!) */
struct tlv_query_channel_range_tlvs *inst = talz(ctx, struct tlv_query_channel_range_tlvs);
/* Initialized the fields to an empty array. */
inst->fields = tal_arr(inst, struct tlv_field, 0);
return inst;
}
/* QUERY_CHANNEL_RANGE_TLVS MSG: query_option */
static u8 *towire_tlv_query_channel_range_tlvs_query_option(const tal_t *ctx, const void *vrecord)
{
const struct tlv_query_channel_range_tlvs *r = vrecord;
u8 *ptr;
if (!r->query_option)
return NULL;
ptr = tal_arr(ctx, u8, 0);
towire_bigsize(&ptr, *r->query_option);
return ptr;
}
static void fromwire_tlv_query_channel_range_tlvs_query_option(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_query_channel_range_tlvs *r = vrecord;
r->query_option = tal(r, bigsize);
*r->query_option = fromwire_bigsize(cursor, plen);
}
static const struct tlv_record_type tlvs_query_channel_range_tlvs[] = {
{ 1, towire_tlv_query_channel_range_tlvs_query_option, fromwire_tlv_query_channel_range_tlvs_query_option },
};
void towire_query_channel_range_tlvs(u8 **pptr, const struct tlv_query_channel_range_tlvs *record)
{
towire_tlv(pptr, tlvs_query_channel_range_tlvs, 1, record);
}
bool fromwire_query_channel_range_tlvs(const u8 **cursor, size_t *max, struct tlv_query_channel_range_tlvs *record)
{
return fromwire_tlv(cursor, max, tlvs_query_channel_range_tlvs, 1, record, &record->fields);
}
bool query_channel_range_tlvs_is_valid(const struct tlv_query_channel_range_tlvs *record, size_t *err_index)
{
return tlv_fields_valid(record->fields, NULL, err_index);
}
struct tlv_reply_channel_range_tlvs *tlv_reply_channel_range_tlvs_new(const tal_t *ctx)
{
/* Initialize everything to NULL. (Quiet, C pedants!) */
struct tlv_reply_channel_range_tlvs *inst = talz(ctx, struct tlv_reply_channel_range_tlvs);
/* Initialized the fields to an empty array. */
inst->fields = tal_arr(inst, struct tlv_field, 0);
return inst;
}
/* REPLY_CHANNEL_RANGE_TLVS MSG: timestamps_tlv */
static u8 *towire_tlv_reply_channel_range_tlvs_timestamps_tlv(const tal_t *ctx, const void *vrecord)
{
const struct tlv_reply_channel_range_tlvs *r = vrecord;
u8 *ptr;
if (!r->timestamps_tlv)
return NULL;
ptr = tal_arr(ctx, u8, 0);
towire_u8(&ptr, r->timestamps_tlv->encoding_type);
towire_u8_array(&ptr, r->timestamps_tlv->encoded_timestamps, tal_count(r->timestamps_tlv->encoded_timestamps));
return ptr;
}
static void fromwire_tlv_reply_channel_range_tlvs_timestamps_tlv(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_reply_channel_range_tlvs *r = vrecord;
r->timestamps_tlv = tal(r, struct tlv_reply_channel_range_tlvs_timestamps_tlv);
r->timestamps_tlv->encoding_type = fromwire_u8(cursor, plen);
r->timestamps_tlv->encoded_timestamps = tal_arr(r->timestamps_tlv, u8, *plen);
fromwire_u8_array(cursor, plen, r->timestamps_tlv->encoded_timestamps, *plen);
}
/* REPLY_CHANNEL_RANGE_TLVS MSG: checksums_tlv */
static u8 *towire_tlv_reply_channel_range_tlvs_checksums_tlv(const tal_t *ctx, const void *vrecord)
{
const struct tlv_reply_channel_range_tlvs *r = vrecord;
u8 *ptr;
if (!r->checksums_tlv)
return NULL;
ptr = tal_arr(ctx, u8, 0);
for (size_t i = 0; i < tal_count(r->checksums_tlv); i++)
towire_channel_update_checksums(&ptr, r->checksums_tlv + i);
return ptr;
}
static void fromwire_tlv_reply_channel_range_tlvs_checksums_tlv(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_reply_channel_range_tlvs *r = vrecord;
r->checksums_tlv = *plen ? tal_arr(r, struct channel_update_checksums, 0) : NULL;
for (size_t i = 0; *plen != 0; i++) {
struct channel_update_checksums tmp;
fromwire_channel_update_checksums(cursor, plen, &tmp);
tal_arr_expand(&r->checksums_tlv, tmp);
}
}
static const struct tlv_record_type tlvs_reply_channel_range_tlvs[] = {
{ 1, towire_tlv_reply_channel_range_tlvs_timestamps_tlv, fromwire_tlv_reply_channel_range_tlvs_timestamps_tlv },
{ 3, towire_tlv_reply_channel_range_tlvs_checksums_tlv, fromwire_tlv_reply_channel_range_tlvs_checksums_tlv },
};
void towire_reply_channel_range_tlvs(u8 **pptr, const struct tlv_reply_channel_range_tlvs *record)
{
towire_tlv(pptr, tlvs_reply_channel_range_tlvs, 2, record);
}
bool fromwire_reply_channel_range_tlvs(const u8 **cursor, size_t *max, struct tlv_reply_channel_range_tlvs *record)
{
return fromwire_tlv(cursor, max, tlvs_reply_channel_range_tlvs, 2, record, &record->fields);
}
bool reply_channel_range_tlvs_is_valid(const struct tlv_reply_channel_range_tlvs *record, size_t *err_index)
{
return tlv_fields_valid(record->fields, NULL, err_index);
}
struct tlv_onion_message_tlvs *tlv_onion_message_tlvs_new(const tal_t *ctx)
{
/* Initialize everything to NULL. (Quiet, C pedants!) */
struct tlv_onion_message_tlvs *inst = talz(ctx, struct tlv_onion_message_tlvs);
/* Initialized the fields to an empty array. */
inst->fields = tal_arr(inst, struct tlv_field, 0);
return inst;
}
/* ONION_MESSAGE_TLVS MSG: blinding */
static u8 *towire_tlv_onion_message_tlvs_blinding(const tal_t *ctx, const void *vrecord)
{
const struct tlv_onion_message_tlvs *r = vrecord;
u8 *ptr;
if (!r->blinding)
return NULL;
ptr = tal_arr(ctx, u8, 0);
towire_pubkey(&ptr, r->blinding);
return ptr;
}
static void fromwire_tlv_onion_message_tlvs_blinding(const u8 **cursor, size_t *plen, void *vrecord)
{
struct tlv_onion_message_tlvs *r = vrecord;
r->blinding = tal(r, struct pubkey);
fromwire_pubkey(cursor, plen, &*r->blinding);
}
static const struct tlv_record_type tlvs_onion_message_tlvs[] = {
{ 2, towire_tlv_onion_message_tlvs_blinding, fromwire_tlv_onion_message_tlvs_blinding },
};
void towire_onion_message_tlvs(u8 **pptr, const struct tlv_onion_message_tlvs *record)
{
towire_tlv(pptr, tlvs_onion_message_tlvs, 1, record);
}
bool fromwire_onion_message_tlvs(const u8 **cursor, size_t *max, struct tlv_onion_message_tlvs *record)
{
return fromwire_tlv(cursor, max, tlvs_onion_message_tlvs, 1, record, &record->fields);
}
bool onion_message_tlvs_is_valid(const struct tlv_onion_message_tlvs *record, size_t *err_index)
{
return tlv_fields_valid(record->fields, NULL, err_index);
}
/* WIRE: INIT */
u8 *towire_init(const tal_t *ctx, const u8 *globalfeatures, const u8 *features, const struct tlv_init_tlvs *tlvs)
{
u16 gflen = tal_count(globalfeatures);
u16 flen = tal_count(features);
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_INIT);
towire_u16(&p, gflen);
towire_u8_array(&p, globalfeatures, gflen);
towire_u16(&p, flen);
towire_u8_array(&p, features, flen);
towire_init_tlvs(&p, tlvs);
return memcheck(p, tal_count(p));
}
bool fromwire_init(const tal_t *ctx, const void *p, u8 **globalfeatures, u8 **features, struct tlv_init_tlvs *tlvs)
{
u16 gflen;
u16 flen;
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_INIT)
return false;
gflen = fromwire_u16(&cursor, &plen);
// 2nd case globalfeatures
*globalfeatures = gflen ? tal_arr(ctx, u8, gflen) : NULL;
fromwire_u8_array(&cursor, &plen, *globalfeatures, gflen);
flen = fromwire_u16(&cursor, &plen);
// 2nd case features
*features = flen ? tal_arr(ctx, u8, flen) : NULL;
fromwire_u8_array(&cursor, &plen, *features, flen);
fromwire_init_tlvs(&cursor, &plen, tlvs);
return cursor != NULL;
}
/* WIRE: ERROR */
u8 *towire_error(const tal_t *ctx, const struct channel_id *channel_id, const u8 *data)
{
u16 len = tal_count(data);
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_ERROR);
towire_channel_id(&p, channel_id);
towire_u16(&p, len);
towire_u8_array(&p, data, len);
return memcheck(p, tal_count(p));
}
bool fromwire_error(const tal_t *ctx, const void *p, struct channel_id *channel_id, u8 **data)
{
u16 len;
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_ERROR)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
len = fromwire_u16(&cursor, &plen);
// 2nd case data
*data = len ? tal_arr(ctx, u8, len) : NULL;
fromwire_u8_array(&cursor, &plen, *data, len);
return cursor != NULL;
}
/* WIRE: WARNING */
u8 *towire_warning(const tal_t *ctx, const struct channel_id *channel_id, const u8 *data)
{
u16 len = tal_count(data);
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_WARNING);
towire_channel_id(&p, channel_id);
towire_u16(&p, len);
towire_u8_array(&p, data, len);
return memcheck(p, tal_count(p));
}
bool fromwire_warning(const tal_t *ctx, const void *p, struct channel_id *channel_id, u8 **data)
{
u16 len;
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_WARNING)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
len = fromwire_u16(&cursor, &plen);
// 2nd case data
*data = len ? tal_arr(ctx, u8, len) : NULL;
fromwire_u8_array(&cursor, &plen, *data, len);
return cursor != NULL;
}
/* WIRE: PING */
u8 *towire_ping(const tal_t *ctx, u16 num_pong_bytes, const u8 *ignored)
{
u16 byteslen = tal_count(ignored);
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_PING);
towire_u16(&p, num_pong_bytes);
towire_u16(&p, byteslen);
towire_u8_array(&p, ignored, byteslen);
return memcheck(p, tal_count(p));
}
bool fromwire_ping(const tal_t *ctx, const void *p, u16 *num_pong_bytes, u8 **ignored)
{
u16 byteslen;
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_PING)
return false;
*num_pong_bytes = fromwire_u16(&cursor, &plen);
byteslen = fromwire_u16(&cursor, &plen);
// 2nd case ignored
*ignored = byteslen ? tal_arr(ctx, u8, byteslen) : NULL;
fromwire_u8_array(&cursor, &plen, *ignored, byteslen);
return cursor != NULL;
}
/* WIRE: PONG */
u8 *towire_pong(const tal_t *ctx, const u8 *ignored)
{
u16 byteslen = tal_count(ignored);
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_PONG);
towire_u16(&p, byteslen);
towire_u8_array(&p, ignored, byteslen);
return memcheck(p, tal_count(p));
}
bool fromwire_pong(const tal_t *ctx, const void *p, u8 **ignored)
{
u16 byteslen;
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_PONG)
return false;
byteslen = fromwire_u16(&cursor, &plen);
// 2nd case ignored
*ignored = byteslen ? tal_arr(ctx, u8, byteslen) : NULL;
fromwire_u8_array(&cursor, &plen, *ignored, byteslen);
return cursor != NULL;
}
/* WIRE: TX_ADD_INPUT */
u8 *towire_tx_add_input(const tal_t *ctx, const struct channel_id *channel_id, u64 serial_id, const u8 *prevtx, u32 prevtx_vout, u32 sequence, const u8 *script_sig)
{
u16 prevtx_len = tal_count(prevtx);
u16 script_sig_len = tal_count(script_sig);
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_TX_ADD_INPUT);
towire_channel_id(&p, channel_id);
towire_u64(&p, serial_id);
towire_u16(&p, prevtx_len);
towire_u8_array(&p, prevtx, prevtx_len);
towire_u32(&p, prevtx_vout);
towire_u32(&p, sequence);
towire_u16(&p, script_sig_len);
towire_u8_array(&p, script_sig, script_sig_len);
return memcheck(p, tal_count(p));
}
bool fromwire_tx_add_input(const tal_t *ctx, const void *p, struct channel_id *channel_id, u64 *serial_id, u8 **prevtx, u32 *prevtx_vout, u32 *sequence, u8 **script_sig)
{
u16 prevtx_len;
u16 script_sig_len;
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_TX_ADD_INPUT)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
*serial_id = fromwire_u64(&cursor, &plen);
prevtx_len = fromwire_u16(&cursor, &plen);
// 2nd case prevtx
*prevtx = prevtx_len ? tal_arr(ctx, u8, prevtx_len) : NULL;
fromwire_u8_array(&cursor, &plen, *prevtx, prevtx_len);
*prevtx_vout = fromwire_u32(&cursor, &plen);
*sequence = fromwire_u32(&cursor, &plen);
script_sig_len = fromwire_u16(&cursor, &plen);
// 2nd case script_sig
*script_sig = script_sig_len ? tal_arr(ctx, u8, script_sig_len) : NULL;
fromwire_u8_array(&cursor, &plen, *script_sig, script_sig_len);
return cursor != NULL;
}
/* WIRE: TX_ADD_OUTPUT */
u8 *towire_tx_add_output(const tal_t *ctx, const struct channel_id *channel_id, u64 serial_id, u64 sats, const u8 *script)
{
u16 scriptlen = tal_count(script);
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_TX_ADD_OUTPUT);
towire_channel_id(&p, channel_id);
towire_u64(&p, serial_id);
towire_u64(&p, sats);
towire_u16(&p, scriptlen);
towire_u8_array(&p, script, scriptlen);
return memcheck(p, tal_count(p));
}
bool fromwire_tx_add_output(const tal_t *ctx, const void *p, struct channel_id *channel_id, u64 *serial_id, u64 *sats, u8 **script)
{
u16 scriptlen;
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_TX_ADD_OUTPUT)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
*serial_id = fromwire_u64(&cursor, &plen);
*sats = fromwire_u64(&cursor, &plen);
scriptlen = fromwire_u16(&cursor, &plen);
// 2nd case script
*script = scriptlen ? tal_arr(ctx, u8, scriptlen) : NULL;
fromwire_u8_array(&cursor, &plen, *script, scriptlen);
return cursor != NULL;
}
/* WIRE: TX_REMOVE_INPUT */
u8 *towire_tx_remove_input(const tal_t *ctx, const struct channel_id *channel_id, u64 serial_id)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_TX_REMOVE_INPUT);
towire_channel_id(&p, channel_id);
towire_u64(&p, serial_id);
return memcheck(p, tal_count(p));
}
bool fromwire_tx_remove_input(const void *p, struct channel_id *channel_id, u64 *serial_id)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_TX_REMOVE_INPUT)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
*serial_id = fromwire_u64(&cursor, &plen);
return cursor != NULL;
}
/* WIRE: TX_REMOVE_OUTPUT */
u8 *towire_tx_remove_output(const tal_t *ctx, const struct channel_id *channel_id, u64 serial_id)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_TX_REMOVE_OUTPUT);
towire_channel_id(&p, channel_id);
towire_u64(&p, serial_id);
return memcheck(p, tal_count(p));
}
bool fromwire_tx_remove_output(const void *p, struct channel_id *channel_id, u64 *serial_id)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_TX_REMOVE_OUTPUT)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
*serial_id = fromwire_u64(&cursor, &plen);
return cursor != NULL;
}
/* WIRE: TX_COMPLETE */
u8 *towire_tx_complete(const tal_t *ctx, const struct channel_id *channel_id)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_TX_COMPLETE);
towire_channel_id(&p, channel_id);
return memcheck(p, tal_count(p));
}
bool fromwire_tx_complete(const void *p, struct channel_id *channel_id)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_TX_COMPLETE)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
return cursor != NULL;
}
/* WIRE: TX_SIGNATURES */
u8 *towire_tx_signatures(const tal_t *ctx, const struct channel_id *channel_id, const struct bitcoin_txid *txid, const struct witness_stack **witness_stack)
{
u16 num_witnesses = tal_count(witness_stack);
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_TX_SIGNATURES);
towire_channel_id(&p, channel_id);
towire_bitcoin_txid(&p, txid);
towire_u16(&p, num_witnesses);
for (size_t i = 0; i < num_witnesses; i++)
towire_witness_stack(&p, witness_stack[i]);
return memcheck(p, tal_count(p));
}
bool fromwire_tx_signatures(const tal_t *ctx, const void *p, struct channel_id *channel_id, struct bitcoin_txid *txid, struct witness_stack ***witness_stack)
{
u16 num_witnesses;
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_TX_SIGNATURES)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
fromwire_bitcoin_txid(&cursor, &plen, txid);
num_witnesses = fromwire_u16(&cursor, &plen);
// 2nd case witness_stack
*witness_stack = num_witnesses ? tal_arr(ctx, struct witness_stack *, num_witnesses) : NULL;
for (size_t i = 0; i < num_witnesses; i++)
(*witness_stack)[i] = fromwire_witness_stack(*witness_stack, &cursor, &plen);
return cursor != NULL;
}
/* WIRE: OPEN_CHANNEL */
u8 *towire_open_channel(const tal_t *ctx, const struct bitcoin_blkid *chain_hash, const struct channel_id *temporary_channel_id, struct amount_sat funding_satoshis, struct amount_msat push_msat, struct amount_sat dust_limit_satoshis, struct amount_msat max_htlc_value_in_flight_msat, struct amount_sat channel_reserve_satoshis, struct amount_msat htlc_minimum_msat, u32 feerate_per_kw, u16 to_self_delay, u16 max_accepted_htlcs, const struct pubkey *funding_pubkey, const struct pubkey *revocation_basepoint, const struct pubkey *payment_basepoint, const struct pubkey *delayed_payment_basepoint, const struct pubkey *htlc_basepoint, const struct pubkey *first_per_commitment_point, u8 channel_flags, const struct tlv_open_channel_tlvs *tlvs)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_OPEN_CHANNEL);
towire_bitcoin_blkid(&p, chain_hash);
towire_channel_id(&p, temporary_channel_id);
towire_amount_sat(&p, funding_satoshis);
towire_amount_msat(&p, push_msat);
towire_amount_sat(&p, dust_limit_satoshis);
towire_amount_msat(&p, max_htlc_value_in_flight_msat);
towire_amount_sat(&p, channel_reserve_satoshis);
towire_amount_msat(&p, htlc_minimum_msat);
towire_u32(&p, feerate_per_kw);
towire_u16(&p, to_self_delay);
towire_u16(&p, max_accepted_htlcs);
towire_pubkey(&p, funding_pubkey);
towire_pubkey(&p, revocation_basepoint);
towire_pubkey(&p, payment_basepoint);
towire_pubkey(&p, delayed_payment_basepoint);
towire_pubkey(&p, htlc_basepoint);
towire_pubkey(&p, first_per_commitment_point);
towire_u8(&p, channel_flags);
towire_open_channel_tlvs(&p, tlvs);
return memcheck(p, tal_count(p));
}
bool fromwire_open_channel(const void *p, struct bitcoin_blkid *chain_hash, struct channel_id *temporary_channel_id, struct amount_sat *funding_satoshis, struct amount_msat *push_msat, struct amount_sat *dust_limit_satoshis, struct amount_msat *max_htlc_value_in_flight_msat, struct amount_sat *channel_reserve_satoshis, struct amount_msat *htlc_minimum_msat, u32 *feerate_per_kw, u16 *to_self_delay, u16 *max_accepted_htlcs, struct pubkey *funding_pubkey, struct pubkey *revocation_basepoint, struct pubkey *payment_basepoint, struct pubkey *delayed_payment_basepoint, struct pubkey *htlc_basepoint, struct pubkey *first_per_commitment_point, u8 *channel_flags, struct tlv_open_channel_tlvs *tlvs)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_OPEN_CHANNEL)
return false;
fromwire_bitcoin_blkid(&cursor, &plen, chain_hash);
fromwire_channel_id(&cursor, &plen, temporary_channel_id);
*funding_satoshis = fromwire_amount_sat(&cursor, &plen);
*push_msat = fromwire_amount_msat(&cursor, &plen);
*dust_limit_satoshis = fromwire_amount_sat(&cursor, &plen);
*max_htlc_value_in_flight_msat = fromwire_amount_msat(&cursor, &plen);
*channel_reserve_satoshis = fromwire_amount_sat(&cursor, &plen);
*htlc_minimum_msat = fromwire_amount_msat(&cursor, &plen);
*feerate_per_kw = fromwire_u32(&cursor, &plen);
*to_self_delay = fromwire_u16(&cursor, &plen);
*max_accepted_htlcs = fromwire_u16(&cursor, &plen);
fromwire_pubkey(&cursor, &plen, funding_pubkey);
fromwire_pubkey(&cursor, &plen, revocation_basepoint);
fromwire_pubkey(&cursor, &plen, payment_basepoint);
fromwire_pubkey(&cursor, &plen, delayed_payment_basepoint);
fromwire_pubkey(&cursor, &plen, htlc_basepoint);
fromwire_pubkey(&cursor, &plen, first_per_commitment_point);
*channel_flags = fromwire_u8(&cursor, &plen);
fromwire_open_channel_tlvs(&cursor, &plen, tlvs);
return cursor != NULL;
}
/* WIRE: ACCEPT_CHANNEL */
u8 *towire_accept_channel(const tal_t *ctx, const struct channel_id *temporary_channel_id, struct amount_sat dust_limit_satoshis, struct amount_msat max_htlc_value_in_flight_msat, struct amount_sat channel_reserve_satoshis, struct amount_msat htlc_minimum_msat, u32 minimum_depth, u16 to_self_delay, u16 max_accepted_htlcs, const struct pubkey *funding_pubkey, const struct pubkey *revocation_basepoint, const struct pubkey *payment_basepoint, const struct pubkey *delayed_payment_basepoint, const struct pubkey *htlc_basepoint, const struct pubkey *first_per_commitment_point, const struct tlv_accept_channel_tlvs *tlvs)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_ACCEPT_CHANNEL);
towire_channel_id(&p, temporary_channel_id);
towire_amount_sat(&p, dust_limit_satoshis);
towire_amount_msat(&p, max_htlc_value_in_flight_msat);
towire_amount_sat(&p, channel_reserve_satoshis);
towire_amount_msat(&p, htlc_minimum_msat);
towire_u32(&p, minimum_depth);
towire_u16(&p, to_self_delay);
towire_u16(&p, max_accepted_htlcs);
towire_pubkey(&p, funding_pubkey);
towire_pubkey(&p, revocation_basepoint);
towire_pubkey(&p, payment_basepoint);
towire_pubkey(&p, delayed_payment_basepoint);
towire_pubkey(&p, htlc_basepoint);
towire_pubkey(&p, first_per_commitment_point);
towire_accept_channel_tlvs(&p, tlvs);
return memcheck(p, tal_count(p));
}
bool fromwire_accept_channel(const void *p, struct channel_id *temporary_channel_id, struct amount_sat *dust_limit_satoshis, struct amount_msat *max_htlc_value_in_flight_msat, struct amount_sat *channel_reserve_satoshis, struct amount_msat *htlc_minimum_msat, u32 *minimum_depth, u16 *to_self_delay, u16 *max_accepted_htlcs, struct pubkey *funding_pubkey, struct pubkey *revocation_basepoint, struct pubkey *payment_basepoint, struct pubkey *delayed_payment_basepoint, struct pubkey *htlc_basepoint, struct pubkey *first_per_commitment_point, struct tlv_accept_channel_tlvs *tlvs)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_ACCEPT_CHANNEL)
return false;
fromwire_channel_id(&cursor, &plen, temporary_channel_id);
*dust_limit_satoshis = fromwire_amount_sat(&cursor, &plen);
*max_htlc_value_in_flight_msat = fromwire_amount_msat(&cursor, &plen);
*channel_reserve_satoshis = fromwire_amount_sat(&cursor, &plen);
*htlc_minimum_msat = fromwire_amount_msat(&cursor, &plen);
*minimum_depth = fromwire_u32(&cursor, &plen);
*to_self_delay = fromwire_u16(&cursor, &plen);
*max_accepted_htlcs = fromwire_u16(&cursor, &plen);
fromwire_pubkey(&cursor, &plen, funding_pubkey);
fromwire_pubkey(&cursor, &plen, revocation_basepoint);
fromwire_pubkey(&cursor, &plen, payment_basepoint);
fromwire_pubkey(&cursor, &plen, delayed_payment_basepoint);
fromwire_pubkey(&cursor, &plen, htlc_basepoint);
fromwire_pubkey(&cursor, &plen, first_per_commitment_point);
fromwire_accept_channel_tlvs(&cursor, &plen, tlvs);
return cursor != NULL;
}
/* WIRE: FUNDING_CREATED */
u8 *towire_funding_created(const tal_t *ctx, const struct channel_id *temporary_channel_id, const struct bitcoin_txid *funding_txid, u16 funding_output_index, const secp256k1_ecdsa_signature *signature)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_FUNDING_CREATED);
towire_channel_id(&p, temporary_channel_id);
towire_bitcoin_txid(&p, funding_txid);
towire_u16(&p, funding_output_index);
towire_secp256k1_ecdsa_signature(&p, signature);
return memcheck(p, tal_count(p));
}
bool fromwire_funding_created(const void *p, struct channel_id *temporary_channel_id, struct bitcoin_txid *funding_txid, u16 *funding_output_index, secp256k1_ecdsa_signature *signature)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_FUNDING_CREATED)
return false;
fromwire_channel_id(&cursor, &plen, temporary_channel_id);
fromwire_bitcoin_txid(&cursor, &plen, funding_txid);
*funding_output_index = fromwire_u16(&cursor, &plen);
fromwire_secp256k1_ecdsa_signature(&cursor, &plen, signature);
return cursor != NULL;
}
/* WIRE: FUNDING_SIGNED */
u8 *towire_funding_signed(const tal_t *ctx, const struct channel_id *channel_id, const secp256k1_ecdsa_signature *signature)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_FUNDING_SIGNED);
towire_channel_id(&p, channel_id);
towire_secp256k1_ecdsa_signature(&p, signature);
return memcheck(p, tal_count(p));
}
bool fromwire_funding_signed(const void *p, struct channel_id *channel_id, secp256k1_ecdsa_signature *signature)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_FUNDING_SIGNED)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
fromwire_secp256k1_ecdsa_signature(&cursor, &plen, signature);
return cursor != NULL;
}
/* WIRE: FUNDING_LOCKED */
u8 *towire_funding_locked(const tal_t *ctx, const struct channel_id *channel_id, const struct pubkey *next_per_commitment_point)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_FUNDING_LOCKED);
towire_channel_id(&p, channel_id);
towire_pubkey(&p, next_per_commitment_point);
return memcheck(p, tal_count(p));
}
bool fromwire_funding_locked(const void *p, struct channel_id *channel_id, struct pubkey *next_per_commitment_point)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_FUNDING_LOCKED)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
fromwire_pubkey(&cursor, &plen, next_per_commitment_point);
return cursor != NULL;
}
/* WIRE: OPEN_CHANNEL2 */
u8 *towire_open_channel2(const tal_t *ctx, const struct bitcoin_blkid *chain_hash, const struct channel_id *channel_id, u32 funding_feerate_perkw, u32 commitment_feerate_perkw, struct amount_sat funding_satoshis, struct amount_sat dust_limit_satoshis, struct amount_msat max_htlc_value_in_flight_msat, struct amount_msat htlc_minimum_msat, u16 to_self_delay, u16 max_accepted_htlcs, u32 locktime, const struct pubkey *funding_pubkey, const struct pubkey *revocation_basepoint, const struct pubkey *payment_basepoint, const struct pubkey *delayed_payment_basepoint, const struct pubkey *htlc_basepoint, const struct pubkey *first_per_commitment_point, u8 channel_flags, const struct tlv_opening_tlvs *tlvs)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_OPEN_CHANNEL2);
towire_bitcoin_blkid(&p, chain_hash);
towire_channel_id(&p, channel_id);
towire_u32(&p, funding_feerate_perkw);
towire_u32(&p, commitment_feerate_perkw);
towire_amount_sat(&p, funding_satoshis);
towire_amount_sat(&p, dust_limit_satoshis);
towire_amount_msat(&p, max_htlc_value_in_flight_msat);
towire_amount_msat(&p, htlc_minimum_msat);
towire_u16(&p, to_self_delay);
towire_u16(&p, max_accepted_htlcs);
towire_u32(&p, locktime);
towire_pubkey(&p, funding_pubkey);
towire_pubkey(&p, revocation_basepoint);
towire_pubkey(&p, payment_basepoint);
towire_pubkey(&p, delayed_payment_basepoint);
towire_pubkey(&p, htlc_basepoint);
towire_pubkey(&p, first_per_commitment_point);
towire_u8(&p, channel_flags);
towire_opening_tlvs(&p, tlvs);
return memcheck(p, tal_count(p));
}
bool fromwire_open_channel2(const void *p, struct bitcoin_blkid *chain_hash, struct channel_id *channel_id, u32 *funding_feerate_perkw, u32 *commitment_feerate_perkw, struct amount_sat *funding_satoshis, struct amount_sat *dust_limit_satoshis, struct amount_msat *max_htlc_value_in_flight_msat, struct amount_msat *htlc_minimum_msat, u16 *to_self_delay, u16 *max_accepted_htlcs, u32 *locktime, struct pubkey *funding_pubkey, struct pubkey *revocation_basepoint, struct pubkey *payment_basepoint, struct pubkey *delayed_payment_basepoint, struct pubkey *htlc_basepoint, struct pubkey *first_per_commitment_point, u8 *channel_flags, struct tlv_opening_tlvs *tlvs)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_OPEN_CHANNEL2)
return false;
fromwire_bitcoin_blkid(&cursor, &plen, chain_hash);
fromwire_channel_id(&cursor, &plen, channel_id);
*funding_feerate_perkw = fromwire_u32(&cursor, &plen);
*commitment_feerate_perkw = fromwire_u32(&cursor, &plen);
*funding_satoshis = fromwire_amount_sat(&cursor, &plen);
*dust_limit_satoshis = fromwire_amount_sat(&cursor, &plen);
*max_htlc_value_in_flight_msat = fromwire_amount_msat(&cursor, &plen);
*htlc_minimum_msat = fromwire_amount_msat(&cursor, &plen);
*to_self_delay = fromwire_u16(&cursor, &plen);
*max_accepted_htlcs = fromwire_u16(&cursor, &plen);
*locktime = fromwire_u32(&cursor, &plen);
fromwire_pubkey(&cursor, &plen, funding_pubkey);
fromwire_pubkey(&cursor, &plen, revocation_basepoint);
fromwire_pubkey(&cursor, &plen, payment_basepoint);
fromwire_pubkey(&cursor, &plen, delayed_payment_basepoint);
fromwire_pubkey(&cursor, &plen, htlc_basepoint);
fromwire_pubkey(&cursor, &plen, first_per_commitment_point);
*channel_flags = fromwire_u8(&cursor, &plen);
fromwire_opening_tlvs(&cursor, &plen, tlvs);
return cursor != NULL;
}
/* WIRE: ACCEPT_CHANNEL2 */
u8 *towire_accept_channel2(const tal_t *ctx, const struct channel_id *channel_id, struct amount_sat funding_satoshis, struct amount_sat dust_limit_satoshis, struct amount_msat max_htlc_value_in_flight_msat, struct amount_msat htlc_minimum_msat, u32 minimum_depth, u16 to_self_delay, u16 max_accepted_htlcs, const struct pubkey *funding_pubkey, const struct pubkey *revocation_basepoint, const struct pubkey *payment_basepoint, const struct pubkey *delayed_payment_basepoint, const struct pubkey *htlc_basepoint, const struct pubkey *first_per_commitment_point, const struct tlv_accept_tlvs *tlvs)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_ACCEPT_CHANNEL2);
towire_channel_id(&p, channel_id);
towire_amount_sat(&p, funding_satoshis);
towire_amount_sat(&p, dust_limit_satoshis);
towire_amount_msat(&p, max_htlc_value_in_flight_msat);
towire_amount_msat(&p, htlc_minimum_msat);
towire_u32(&p, minimum_depth);
towire_u16(&p, to_self_delay);
towire_u16(&p, max_accepted_htlcs);
towire_pubkey(&p, funding_pubkey);
towire_pubkey(&p, revocation_basepoint);
towire_pubkey(&p, payment_basepoint);
towire_pubkey(&p, delayed_payment_basepoint);
towire_pubkey(&p, htlc_basepoint);
towire_pubkey(&p, first_per_commitment_point);
towire_accept_tlvs(&p, tlvs);
return memcheck(p, tal_count(p));
}
bool fromwire_accept_channel2(const void *p, struct channel_id *channel_id, struct amount_sat *funding_satoshis, struct amount_sat *dust_limit_satoshis, struct amount_msat *max_htlc_value_in_flight_msat, struct amount_msat *htlc_minimum_msat, u32 *minimum_depth, u16 *to_self_delay, u16 *max_accepted_htlcs, struct pubkey *funding_pubkey, struct pubkey *revocation_basepoint, struct pubkey *payment_basepoint, struct pubkey *delayed_payment_basepoint, struct pubkey *htlc_basepoint, struct pubkey *first_per_commitment_point, struct tlv_accept_tlvs *tlvs)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_ACCEPT_CHANNEL2)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
*funding_satoshis = fromwire_amount_sat(&cursor, &plen);
*dust_limit_satoshis = fromwire_amount_sat(&cursor, &plen);
*max_htlc_value_in_flight_msat = fromwire_amount_msat(&cursor, &plen);
*htlc_minimum_msat = fromwire_amount_msat(&cursor, &plen);
*minimum_depth = fromwire_u32(&cursor, &plen);
*to_self_delay = fromwire_u16(&cursor, &plen);
*max_accepted_htlcs = fromwire_u16(&cursor, &plen);
fromwire_pubkey(&cursor, &plen, funding_pubkey);
fromwire_pubkey(&cursor, &plen, revocation_basepoint);
fromwire_pubkey(&cursor, &plen, payment_basepoint);
fromwire_pubkey(&cursor, &plen, delayed_payment_basepoint);
fromwire_pubkey(&cursor, &plen, htlc_basepoint);
fromwire_pubkey(&cursor, &plen, first_per_commitment_point);
fromwire_accept_tlvs(&cursor, &plen, tlvs);
return cursor != NULL;
}
/* WIRE: INIT_RBF */
u8 *towire_init_rbf(const tal_t *ctx, const struct channel_id *channel_id, struct amount_sat funding_satoshis, u32 locktime, u32 funding_feerate_perkw)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_INIT_RBF);
towire_channel_id(&p, channel_id);
towire_amount_sat(&p, funding_satoshis);
towire_u32(&p, locktime);
towire_u32(&p, funding_feerate_perkw);
return memcheck(p, tal_count(p));
}
bool fromwire_init_rbf(const void *p, struct channel_id *channel_id, struct amount_sat *funding_satoshis, u32 *locktime, u32 *funding_feerate_perkw)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_INIT_RBF)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
*funding_satoshis = fromwire_amount_sat(&cursor, &plen);
*locktime = fromwire_u32(&cursor, &plen);
*funding_feerate_perkw = fromwire_u32(&cursor, &plen);
return cursor != NULL;
}
/* WIRE: ACK_RBF */
u8 *towire_ack_rbf(const tal_t *ctx, const struct channel_id *channel_id, struct amount_sat funding_satoshis)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_ACK_RBF);
towire_channel_id(&p, channel_id);
towire_amount_sat(&p, funding_satoshis);
return memcheck(p, tal_count(p));
}
bool fromwire_ack_rbf(const void *p, struct channel_id *channel_id, struct amount_sat *funding_satoshis)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_ACK_RBF)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
*funding_satoshis = fromwire_amount_sat(&cursor, &plen);
return cursor != NULL;
}
/* WIRE: SHUTDOWN */
u8 *towire_shutdown(const tal_t *ctx, const struct channel_id *channel_id, const u8 *scriptpubkey, const struct tlv_shutdown_tlvs *tlvs)
{
u16 len = tal_count(scriptpubkey);
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_SHUTDOWN);
towire_channel_id(&p, channel_id);
towire_u16(&p, len);
towire_u8_array(&p, scriptpubkey, len);
towire_shutdown_tlvs(&p, tlvs);
return memcheck(p, tal_count(p));
}
bool fromwire_shutdown(const tal_t *ctx, const void *p, struct channel_id *channel_id, u8 **scriptpubkey, struct tlv_shutdown_tlvs *tlvs)
{
u16 len;
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_SHUTDOWN)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
len = fromwire_u16(&cursor, &plen);
// 2nd case scriptpubkey
*scriptpubkey = len ? tal_arr(ctx, u8, len) : NULL;
fromwire_u8_array(&cursor, &plen, *scriptpubkey, len);
fromwire_shutdown_tlvs(&cursor, &plen, tlvs);
return cursor != NULL;
}
/* WIRE: CLOSING_SIGNED */
u8 *towire_closing_signed(const tal_t *ctx, const struct channel_id *channel_id, struct amount_sat fee_satoshis, const secp256k1_ecdsa_signature *signature, const struct tlv_closing_signed_tlvs *tlvs)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_CLOSING_SIGNED);
towire_channel_id(&p, channel_id);
towire_amount_sat(&p, fee_satoshis);
towire_secp256k1_ecdsa_signature(&p, signature);
towire_closing_signed_tlvs(&p, tlvs);
return memcheck(p, tal_count(p));
}
bool fromwire_closing_signed(const void *p, struct channel_id *channel_id, struct amount_sat *fee_satoshis, secp256k1_ecdsa_signature *signature, struct tlv_closing_signed_tlvs *tlvs)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_CLOSING_SIGNED)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
*fee_satoshis = fromwire_amount_sat(&cursor, &plen);
fromwire_secp256k1_ecdsa_signature(&cursor, &plen, signature);
fromwire_closing_signed_tlvs(&cursor, &plen, tlvs);
return cursor != NULL;
}
/* WIRE: UPDATE_ADD_HTLC */
u8 *towire_update_add_htlc(const tal_t *ctx, const struct channel_id *channel_id, u64 id, struct amount_msat amount_msat, const struct sha256 *payment_hash, u32 cltv_expiry, const u8 onion_routing_packet[1366])
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_UPDATE_ADD_HTLC);
towire_channel_id(&p, channel_id);
towire_u64(&p, id);
towire_amount_msat(&p, amount_msat);
towire_sha256(&p, payment_hash);
towire_u32(&p, cltv_expiry);
towire_u8_array(&p, onion_routing_packet, 1366);
return memcheck(p, tal_count(p));
}
bool fromwire_update_add_htlc(const void *p, struct channel_id *channel_id, u64 *id, struct amount_msat *amount_msat, struct sha256 *payment_hash, u32 *cltv_expiry, u8 onion_routing_packet[1366])
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_UPDATE_ADD_HTLC)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
*id = fromwire_u64(&cursor, &plen);
*amount_msat = fromwire_amount_msat(&cursor, &plen);
fromwire_sha256(&cursor, &plen, payment_hash);
*cltv_expiry = fromwire_u32(&cursor, &plen);
fromwire_u8_array(&cursor, &plen, onion_routing_packet, 1366);
return cursor != NULL;
}
/* WIRE: UPDATE_FULFILL_HTLC */
u8 *towire_update_fulfill_htlc(const tal_t *ctx, const struct channel_id *channel_id, u64 id, const struct preimage *payment_preimage)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_UPDATE_FULFILL_HTLC);
towire_channel_id(&p, channel_id);
towire_u64(&p, id);
towire_preimage(&p, payment_preimage);
return memcheck(p, tal_count(p));
}
bool fromwire_update_fulfill_htlc(const void *p, struct channel_id *channel_id, u64 *id, struct preimage *payment_preimage)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_UPDATE_FULFILL_HTLC)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
*id = fromwire_u64(&cursor, &plen);
fromwire_preimage(&cursor, &plen, payment_preimage);
return cursor != NULL;
}
/* WIRE: UPDATE_FAIL_HTLC */
u8 *towire_update_fail_htlc(const tal_t *ctx, const struct channel_id *channel_id, u64 id, const u8 *reason)
{
u16 len = tal_count(reason);
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_UPDATE_FAIL_HTLC);
towire_channel_id(&p, channel_id);
towire_u64(&p, id);
towire_u16(&p, len);
towire_u8_array(&p, reason, len);
return memcheck(p, tal_count(p));
}
bool fromwire_update_fail_htlc(const tal_t *ctx, const void *p, struct channel_id *channel_id, u64 *id, u8 **reason)
{
u16 len;
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_UPDATE_FAIL_HTLC)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
*id = fromwire_u64(&cursor, &plen);
len = fromwire_u16(&cursor, &plen);
// 2nd case reason
*reason = len ? tal_arr(ctx, u8, len) : NULL;
fromwire_u8_array(&cursor, &plen, *reason, len);
return cursor != NULL;
}
/* WIRE: UPDATE_FAIL_MALFORMED_HTLC */
u8 *towire_update_fail_malformed_htlc(const tal_t *ctx, const struct channel_id *channel_id, u64 id, const struct sha256 *sha256_of_onion, u16 failure_code)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_UPDATE_FAIL_MALFORMED_HTLC);
towire_channel_id(&p, channel_id);
towire_u64(&p, id);
towire_sha256(&p, sha256_of_onion);
towire_u16(&p, failure_code);
return memcheck(p, tal_count(p));
}
bool fromwire_update_fail_malformed_htlc(const void *p, struct channel_id *channel_id, u64 *id, struct sha256 *sha256_of_onion, u16 *failure_code)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_UPDATE_FAIL_MALFORMED_HTLC)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
*id = fromwire_u64(&cursor, &plen);
fromwire_sha256(&cursor, &plen, sha256_of_onion);
*failure_code = fromwire_u16(&cursor, &plen);
return cursor != NULL;
}
/* WIRE: COMMITMENT_SIGNED */
u8 *towire_commitment_signed(const tal_t *ctx, const struct channel_id *channel_id, const secp256k1_ecdsa_signature *signature, const secp256k1_ecdsa_signature *htlc_signature)
{
u16 num_htlcs = tal_count(htlc_signature);
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_COMMITMENT_SIGNED);
towire_channel_id(&p, channel_id);
towire_secp256k1_ecdsa_signature(&p, signature);
towire_u16(&p, num_htlcs);
for (size_t i = 0; i < num_htlcs; i++)
towire_secp256k1_ecdsa_signature(&p, htlc_signature + i);
return memcheck(p, tal_count(p));
}
bool fromwire_commitment_signed(const tal_t *ctx, const void *p, struct channel_id *channel_id, secp256k1_ecdsa_signature *signature, secp256k1_ecdsa_signature **htlc_signature)
{
u16 num_htlcs;
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_COMMITMENT_SIGNED)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
fromwire_secp256k1_ecdsa_signature(&cursor, &plen, signature);
num_htlcs = fromwire_u16(&cursor, &plen);
// 2nd case htlc_signature
*htlc_signature = num_htlcs ? tal_arr(ctx, secp256k1_ecdsa_signature, num_htlcs) : NULL;
for (size_t i = 0; i < num_htlcs; i++)
fromwire_secp256k1_ecdsa_signature(&cursor, &plen, *htlc_signature + i);
return cursor != NULL;
}
/* WIRE: REVOKE_AND_ACK */
u8 *towire_revoke_and_ack(const tal_t *ctx, const struct channel_id *channel_id, const struct secret *per_commitment_secret, const struct pubkey *next_per_commitment_point)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_REVOKE_AND_ACK);
towire_channel_id(&p, channel_id);
towire_secret(&p, per_commitment_secret);
towire_pubkey(&p, next_per_commitment_point);
return memcheck(p, tal_count(p));
}
bool fromwire_revoke_and_ack(const void *p, struct channel_id *channel_id, struct secret *per_commitment_secret, struct pubkey *next_per_commitment_point)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_REVOKE_AND_ACK)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
fromwire_secret(&cursor, &plen, per_commitment_secret);
fromwire_pubkey(&cursor, &plen, next_per_commitment_point);
return cursor != NULL;
}
/* WIRE: UPDATE_FEE */
u8 *towire_update_fee(const tal_t *ctx, const struct channel_id *channel_id, u32 feerate_per_kw)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_UPDATE_FEE);
towire_channel_id(&p, channel_id);
towire_u32(&p, feerate_per_kw);
return memcheck(p, tal_count(p));
}
bool fromwire_update_fee(const void *p, struct channel_id *channel_id, u32 *feerate_per_kw)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_UPDATE_FEE)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
*feerate_per_kw = fromwire_u32(&cursor, &plen);
return cursor != NULL;
}
/* WIRE: UPDATE_BLOCKHEIGHT */
u8 *towire_update_blockheight(const tal_t *ctx, const struct channel_id *channel_id, u32 blockheight)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_UPDATE_BLOCKHEIGHT);
towire_channel_id(&p, channel_id);
towire_u32(&p, blockheight);
return memcheck(p, tal_count(p));
}
bool fromwire_update_blockheight(const void *p, struct channel_id *channel_id, u32 *blockheight)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_UPDATE_BLOCKHEIGHT)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
*blockheight = fromwire_u32(&cursor, &plen);
return cursor != NULL;
}
/* WIRE: CHANNEL_REESTABLISH */
u8 *towire_channel_reestablish(const tal_t *ctx, const struct channel_id *channel_id, u64 next_commitment_number, u64 next_revocation_number, const struct secret *your_last_per_commitment_secret, const struct pubkey *my_current_per_commitment_point)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_CHANNEL_REESTABLISH);
towire_channel_id(&p, channel_id);
towire_u64(&p, next_commitment_number);
towire_u64(&p, next_revocation_number);
towire_secret(&p, your_last_per_commitment_secret);
towire_pubkey(&p, my_current_per_commitment_point);
return memcheck(p, tal_count(p));
}
bool fromwire_channel_reestablish(const void *p, struct channel_id *channel_id, u64 *next_commitment_number, u64 *next_revocation_number, struct secret *your_last_per_commitment_secret, struct pubkey *my_current_per_commitment_point)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_CHANNEL_REESTABLISH)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
*next_commitment_number = fromwire_u64(&cursor, &plen);
*next_revocation_number = fromwire_u64(&cursor, &plen);
fromwire_secret(&cursor, &plen, your_last_per_commitment_secret);
fromwire_pubkey(&cursor, &plen, my_current_per_commitment_point);
return cursor != NULL;
}
/* WIRE: ANNOUNCEMENT_SIGNATURES */
u8 *towire_announcement_signatures(const tal_t *ctx, const struct channel_id *channel_id, const struct short_channel_id *short_channel_id, const secp256k1_ecdsa_signature *node_signature, const secp256k1_ecdsa_signature *bitcoin_signature)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_ANNOUNCEMENT_SIGNATURES);
towire_channel_id(&p, channel_id);
towire_short_channel_id(&p, short_channel_id);
towire_secp256k1_ecdsa_signature(&p, node_signature);
towire_secp256k1_ecdsa_signature(&p, bitcoin_signature);
return memcheck(p, tal_count(p));
}
bool fromwire_announcement_signatures(const void *p, struct channel_id *channel_id, struct short_channel_id *short_channel_id, secp256k1_ecdsa_signature *node_signature, secp256k1_ecdsa_signature *bitcoin_signature)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_ANNOUNCEMENT_SIGNATURES)
return false;
fromwire_channel_id(&cursor, &plen, channel_id);
fromwire_short_channel_id(&cursor, &plen, short_channel_id);
fromwire_secp256k1_ecdsa_signature(&cursor, &plen, node_signature);
fromwire_secp256k1_ecdsa_signature(&cursor, &plen, bitcoin_signature);
return cursor != NULL;
}
/* WIRE: CHANNEL_ANNOUNCEMENT */
u8 *towire_channel_announcement(const tal_t *ctx, const secp256k1_ecdsa_signature *node_signature_1, const secp256k1_ecdsa_signature *node_signature_2, const secp256k1_ecdsa_signature *bitcoin_signature_1, const secp256k1_ecdsa_signature *bitcoin_signature_2, const u8 *features, const struct bitcoin_blkid *chain_hash, const struct short_channel_id *short_channel_id, const struct node_id *node_id_1, const struct node_id *node_id_2, const struct pubkey *bitcoin_key_1, const struct pubkey *bitcoin_key_2)
{
u16 len = tal_count(features);
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_CHANNEL_ANNOUNCEMENT);
towire_secp256k1_ecdsa_signature(&p, node_signature_1);
towire_secp256k1_ecdsa_signature(&p, node_signature_2);
towire_secp256k1_ecdsa_signature(&p, bitcoin_signature_1);
towire_secp256k1_ecdsa_signature(&p, bitcoin_signature_2);
towire_u16(&p, len);
towire_u8_array(&p, features, len);
towire_bitcoin_blkid(&p, chain_hash);
towire_short_channel_id(&p, short_channel_id);
towire_node_id(&p, node_id_1);
towire_node_id(&p, node_id_2);
towire_pubkey(&p, bitcoin_key_1);
towire_pubkey(&p, bitcoin_key_2);
return memcheck(p, tal_count(p));
}
bool fromwire_channel_announcement(const tal_t *ctx, const void *p, secp256k1_ecdsa_signature *node_signature_1, secp256k1_ecdsa_signature *node_signature_2, secp256k1_ecdsa_signature *bitcoin_signature_1, secp256k1_ecdsa_signature *bitcoin_signature_2, u8 **features, struct bitcoin_blkid *chain_hash, struct short_channel_id *short_channel_id, struct node_id *node_id_1, struct node_id *node_id_2, struct pubkey *bitcoin_key_1, struct pubkey *bitcoin_key_2)
{
u16 len;
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_CHANNEL_ANNOUNCEMENT)
return false;
fromwire_secp256k1_ecdsa_signature(&cursor, &plen, node_signature_1);
fromwire_secp256k1_ecdsa_signature(&cursor, &plen, node_signature_2);
fromwire_secp256k1_ecdsa_signature(&cursor, &plen, bitcoin_signature_1);
fromwire_secp256k1_ecdsa_signature(&cursor, &plen, bitcoin_signature_2);
len = fromwire_u16(&cursor, &plen);
// 2nd case features
*features = len ? tal_arr(ctx, u8, len) : NULL;
fromwire_u8_array(&cursor, &plen, *features, len);
fromwire_bitcoin_blkid(&cursor, &plen, chain_hash);
fromwire_short_channel_id(&cursor, &plen, short_channel_id);
fromwire_node_id(&cursor, &plen, node_id_1);
fromwire_node_id(&cursor, &plen, node_id_2);
fromwire_pubkey(&cursor, &plen, bitcoin_key_1);
fromwire_pubkey(&cursor, &plen, bitcoin_key_2);
return cursor != NULL;
}
/* WIRE: NODE_ANNOUNCEMENT */
u8 *towire_node_announcement(const tal_t *ctx, const secp256k1_ecdsa_signature *signature, const u8 *features, u32 timestamp, const struct node_id *node_id, const u8 rgb_color[3], const u8 alias[32], const u8 *addresses, const struct tlv_node_ann_tlvs *tlvs)
{
u16 flen = tal_count(features);
u16 addrlen = tal_count(addresses);
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_NODE_ANNOUNCEMENT);
towire_secp256k1_ecdsa_signature(&p, signature);
towire_u16(&p, flen);
towire_u8_array(&p, features, flen);
towire_u32(&p, timestamp);
towire_node_id(&p, node_id);
towire_u8_array(&p, rgb_color, 3);
towire_u8_array(&p, alias, 32);
towire_u16(&p, addrlen);
towire_u8_array(&p, addresses, addrlen);
towire_node_ann_tlvs(&p, tlvs);
return memcheck(p, tal_count(p));
}
bool fromwire_node_announcement(const tal_t *ctx, const void *p, secp256k1_ecdsa_signature *signature, u8 **features, u32 *timestamp, struct node_id *node_id, u8 rgb_color[3], u8 alias[32], u8 **addresses, struct tlv_node_ann_tlvs *tlvs)
{
u16 flen;
u16 addrlen;
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_NODE_ANNOUNCEMENT)
return false;
fromwire_secp256k1_ecdsa_signature(&cursor, &plen, signature);
flen = fromwire_u16(&cursor, &plen);
// 2nd case features
*features = flen ? tal_arr(ctx, u8, flen) : NULL;
fromwire_u8_array(&cursor, &plen, *features, flen);
*timestamp = fromwire_u32(&cursor, &plen);
fromwire_node_id(&cursor, &plen, node_id);
fromwire_u8_array(&cursor, &plen, rgb_color, 3);
fromwire_u8_array(&cursor, &plen, alias, 32);
addrlen = fromwire_u16(&cursor, &plen);
// 2nd case addresses
*addresses = addrlen ? tal_arr(ctx, u8, addrlen) : NULL;
fromwire_u8_array(&cursor, &plen, *addresses, addrlen);
fromwire_node_ann_tlvs(&cursor, &plen, tlvs);
return cursor != NULL;
}
/* WIRE: CHANNEL_UPDATE */
u8 *towire_channel_update(const tal_t *ctx, const secp256k1_ecdsa_signature *signature, const struct bitcoin_blkid *chain_hash, const struct short_channel_id *short_channel_id, u32 timestamp, u8 message_flags, u8 channel_flags, u16 cltv_expiry_delta, struct amount_msat htlc_minimum_msat, u32 fee_base_msat, u32 fee_proportional_millionths)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_CHANNEL_UPDATE);
towire_secp256k1_ecdsa_signature(&p, signature);
towire_bitcoin_blkid(&p, chain_hash);
towire_short_channel_id(&p, short_channel_id);
towire_u32(&p, timestamp);
towire_u8(&p, message_flags);
towire_u8(&p, channel_flags);
towire_u16(&p, cltv_expiry_delta);
towire_amount_msat(&p, htlc_minimum_msat);
towire_u32(&p, fee_base_msat);
towire_u32(&p, fee_proportional_millionths);
return memcheck(p, tal_count(p));
}
bool fromwire_channel_update(const void *p, secp256k1_ecdsa_signature *signature, struct bitcoin_blkid *chain_hash, struct short_channel_id *short_channel_id, u32 *timestamp, u8 *message_flags, u8 *channel_flags, u16 *cltv_expiry_delta, struct amount_msat *htlc_minimum_msat, u32 *fee_base_msat, u32 *fee_proportional_millionths)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_CHANNEL_UPDATE)
return false;
fromwire_secp256k1_ecdsa_signature(&cursor, &plen, signature);
fromwire_bitcoin_blkid(&cursor, &plen, chain_hash);
fromwire_short_channel_id(&cursor, &plen, short_channel_id);
*timestamp = fromwire_u32(&cursor, &plen);
*message_flags = fromwire_u8(&cursor, &plen);
*channel_flags = fromwire_u8(&cursor, &plen);
*cltv_expiry_delta = fromwire_u16(&cursor, &plen);
*htlc_minimum_msat = fromwire_amount_msat(&cursor, &plen);
*fee_base_msat = fromwire_u32(&cursor, &plen);
*fee_proportional_millionths = fromwire_u32(&cursor, &plen);
return cursor != NULL;
}
/* WIRE: QUERY_SHORT_CHANNEL_IDS */
u8 *towire_query_short_channel_ids(const tal_t *ctx, const struct bitcoin_blkid *chain_hash, const u8 *encoded_short_ids, const struct tlv_query_short_channel_ids_tlvs *tlvs)
{
u16 len = tal_count(encoded_short_ids);
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_QUERY_SHORT_CHANNEL_IDS);
towire_bitcoin_blkid(&p, chain_hash);
towire_u16(&p, len);
towire_u8_array(&p, encoded_short_ids, len);
towire_query_short_channel_ids_tlvs(&p, tlvs);
return memcheck(p, tal_count(p));
}
bool fromwire_query_short_channel_ids(const tal_t *ctx, const void *p, struct bitcoin_blkid *chain_hash, u8 **encoded_short_ids, struct tlv_query_short_channel_ids_tlvs *tlvs)
{
u16 len;
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_QUERY_SHORT_CHANNEL_IDS)
return false;
fromwire_bitcoin_blkid(&cursor, &plen, chain_hash);
len = fromwire_u16(&cursor, &plen);
// 2nd case encoded_short_ids
*encoded_short_ids = len ? tal_arr(ctx, u8, len) : NULL;
fromwire_u8_array(&cursor, &plen, *encoded_short_ids, len);
fromwire_query_short_channel_ids_tlvs(&cursor, &plen, tlvs);
return cursor != NULL;
}
/* WIRE: REPLY_SHORT_CHANNEL_IDS_END */
u8 *towire_reply_short_channel_ids_end(const tal_t *ctx, const struct bitcoin_blkid *chain_hash, u8 full_information)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_REPLY_SHORT_CHANNEL_IDS_END);
towire_bitcoin_blkid(&p, chain_hash);
towire_u8(&p, full_information);
return memcheck(p, tal_count(p));
}
bool fromwire_reply_short_channel_ids_end(const void *p, struct bitcoin_blkid *chain_hash, u8 *full_information)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_REPLY_SHORT_CHANNEL_IDS_END)
return false;
fromwire_bitcoin_blkid(&cursor, &plen, chain_hash);
*full_information = fromwire_u8(&cursor, &plen);
return cursor != NULL;
}
/* WIRE: QUERY_CHANNEL_RANGE */
u8 *towire_query_channel_range(const tal_t *ctx, const struct bitcoin_blkid *chain_hash, u32 first_blocknum, u32 number_of_blocks, const struct tlv_query_channel_range_tlvs *tlvs)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_QUERY_CHANNEL_RANGE);
towire_bitcoin_blkid(&p, chain_hash);
towire_u32(&p, first_blocknum);
towire_u32(&p, number_of_blocks);
towire_query_channel_range_tlvs(&p, tlvs);
return memcheck(p, tal_count(p));
}
bool fromwire_query_channel_range(const void *p, struct bitcoin_blkid *chain_hash, u32 *first_blocknum, u32 *number_of_blocks, struct tlv_query_channel_range_tlvs *tlvs)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_QUERY_CHANNEL_RANGE)
return false;
fromwire_bitcoin_blkid(&cursor, &plen, chain_hash);
*first_blocknum = fromwire_u32(&cursor, &plen);
*number_of_blocks = fromwire_u32(&cursor, &plen);
fromwire_query_channel_range_tlvs(&cursor, &plen, tlvs);
return cursor != NULL;
}
/* WIRE: REPLY_CHANNEL_RANGE */
u8 *towire_reply_channel_range(const tal_t *ctx, const struct bitcoin_blkid *chain_hash, u32 first_blocknum, u32 number_of_blocks, u8 sync_complete, const u8 *encoded_short_ids, const struct tlv_reply_channel_range_tlvs *tlvs)
{
u16 len = tal_count(encoded_short_ids);
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_REPLY_CHANNEL_RANGE);
towire_bitcoin_blkid(&p, chain_hash);
towire_u32(&p, first_blocknum);
towire_u32(&p, number_of_blocks);
towire_u8(&p, sync_complete);
towire_u16(&p, len);
towire_u8_array(&p, encoded_short_ids, len);
towire_reply_channel_range_tlvs(&p, tlvs);
return memcheck(p, tal_count(p));
}
bool fromwire_reply_channel_range(const tal_t *ctx, const void *p, struct bitcoin_blkid *chain_hash, u32 *first_blocknum, u32 *number_of_blocks, u8 *sync_complete, u8 **encoded_short_ids, struct tlv_reply_channel_range_tlvs *tlvs)
{
u16 len;
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_REPLY_CHANNEL_RANGE)
return false;
fromwire_bitcoin_blkid(&cursor, &plen, chain_hash);
*first_blocknum = fromwire_u32(&cursor, &plen);
*number_of_blocks = fromwire_u32(&cursor, &plen);
*sync_complete = fromwire_u8(&cursor, &plen);
len = fromwire_u16(&cursor, &plen);
// 2nd case encoded_short_ids
*encoded_short_ids = len ? tal_arr(ctx, u8, len) : NULL;
fromwire_u8_array(&cursor, &plen, *encoded_short_ids, len);
fromwire_reply_channel_range_tlvs(&cursor, &plen, tlvs);
return cursor != NULL;
}
/* WIRE: GOSSIP_TIMESTAMP_FILTER */
u8 *towire_gossip_timestamp_filter(const tal_t *ctx, const struct bitcoin_blkid *chain_hash, u32 first_timestamp, u32 timestamp_range)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_GOSSIP_TIMESTAMP_FILTER);
towire_bitcoin_blkid(&p, chain_hash);
towire_u32(&p, first_timestamp);
towire_u32(&p, timestamp_range);
return memcheck(p, tal_count(p));
}
bool fromwire_gossip_timestamp_filter(const void *p, struct bitcoin_blkid *chain_hash, u32 *first_timestamp, u32 *timestamp_range)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_GOSSIP_TIMESTAMP_FILTER)
return false;
fromwire_bitcoin_blkid(&cursor, &plen, chain_hash);
*first_timestamp = fromwire_u32(&cursor, &plen);
*timestamp_range = fromwire_u32(&cursor, &plen);
return cursor != NULL;
}
/* WIRE: ONION_MESSAGE */
u8 *towire_onion_message(const tal_t *ctx, const u8 *onionmsg, const struct tlv_onion_message_tlvs *onion_message_tlvs)
{
u16 len = tal_count(onionmsg);
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_ONION_MESSAGE);
towire_u16(&p, len);
towire_u8_array(&p, onionmsg, len);
towire_onion_message_tlvs(&p, onion_message_tlvs);
return memcheck(p, tal_count(p));
}
bool fromwire_onion_message(const tal_t *ctx, const void *p, u8 **onionmsg, struct tlv_onion_message_tlvs *onion_message_tlvs)
{
u16 len;
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_ONION_MESSAGE)
return false;
len = fromwire_u16(&cursor, &plen);
// 2nd case onionmsg
*onionmsg = len ? tal_arr(ctx, u8, len) : NULL;
fromwire_u8_array(&cursor, &plen, *onionmsg, len);
fromwire_onion_message_tlvs(&cursor, &plen, onion_message_tlvs);
return cursor != NULL;
}
/* WIRE: CHANNEL_UPDATE_OPTION_CHANNEL_HTLC_MAX */
u8 *towire_channel_update_option_channel_htlc_max(const tal_t *ctx, const secp256k1_ecdsa_signature *signature, const struct bitcoin_blkid *chain_hash, const struct short_channel_id *short_channel_id, u32 timestamp, u8 message_flags, u8 channel_flags, u16 cltv_expiry_delta, struct amount_msat htlc_minimum_msat, u32 fee_base_msat, u32 fee_proportional_millionths, struct amount_msat htlc_maximum_msat)
{
u8 *p = tal_arr(ctx, u8, 0);
towire_u16(&p, WIRE_CHANNEL_UPDATE);
towire_secp256k1_ecdsa_signature(&p, signature);
towire_bitcoin_blkid(&p, chain_hash);
towire_short_channel_id(&p, short_channel_id);
towire_u32(&p, timestamp);
towire_u8(&p, message_flags);
towire_u8(&p, channel_flags);
towire_u16(&p, cltv_expiry_delta);
towire_amount_msat(&p, htlc_minimum_msat);
towire_u32(&p, fee_base_msat);
towire_u32(&p, fee_proportional_millionths);
towire_amount_msat(&p, htlc_maximum_msat);
return memcheck(p, tal_count(p));
}
bool fromwire_channel_update_option_channel_htlc_max(const void *p, secp256k1_ecdsa_signature *signature, struct bitcoin_blkid *chain_hash, struct short_channel_id *short_channel_id, u32 *timestamp, u8 *message_flags, u8 *channel_flags, u16 *cltv_expiry_delta, struct amount_msat *htlc_minimum_msat, u32 *fee_base_msat, u32 *fee_proportional_millionths, struct amount_msat *htlc_maximum_msat)
{
const u8 *cursor = p;
size_t plen = tal_count(p);
if (fromwire_u16(&cursor, &plen) != WIRE_CHANNEL_UPDATE)
return false;
fromwire_secp256k1_ecdsa_signature(&cursor, &plen, signature);
fromwire_bitcoin_blkid(&cursor, &plen, chain_hash);
fromwire_short_channel_id(&cursor, &plen, short_channel_id);
*timestamp = fromwire_u32(&cursor, &plen);
*message_flags = fromwire_u8(&cursor, &plen);
*channel_flags = fromwire_u8(&cursor, &plen);
*cltv_expiry_delta = fromwire_u16(&cursor, &plen);
*htlc_minimum_msat = fromwire_amount_msat(&cursor, &plen);
*fee_base_msat = fromwire_u32(&cursor, &plen);
*fee_proportional_millionths = fromwire_u32(&cursor, &plen);
*htlc_maximum_msat = fromwire_amount_msat(&cursor, &plen);
return cursor != NULL;
}
// SHA256STAMP:c55c98a2d8cac53c9f0db9ca4eb5ef1caac507e2f7cf4d1988cfc548efe40bbf