#include <bitcoin/psbt.h>
#include <bitcoin/tx.h>
#include <channeld/inflight.h>
#include <common/bip32.h>
#include <common/blockheight_states.h>
#include <common/cryptomsg.h>
#include <common/channel_config.h>
#include <common/channel_id.h>
#include <common/channel_type.h>
#include <common/derive_basepoints.h>
#include <common/features.h>
#include <common/fee_states.h>
#include <wire/peer_wire.h>

# Begin!  (passes gossipd-client fd)
msgtype,channeld_init,1000
msgdata,channeld_init,chainparams,chainparams,
msgdata,channeld_init,our_features,feature_set,
msgdata,channeld_init,num_hsm_capabilities,u16,
msgdata,channeld_init,hsm_capabilities,u32,num_hsm_capabilities
msgdata,channeld_init,channel_id,channel_id,
msgdata,channeld_init,funding,bitcoin_outpoint,
msgdata,channeld_init,funding_satoshi,amount_sat,
msgdata,channeld_init,minimum_depth,u32,
msgdata,channeld_init,our_blockheight,u32,
msgdata,channeld_init,blockheight_states,height_states,
msgdata,channeld_init,lease_expiry,u32,
msgdata,channeld_init,our_config,channel_config,
msgdata,channeld_init,their_config,channel_config,
msgdata,channeld_init,fee_states,fee_states,
msgdata,channeld_init,feerate_min,u32,
msgdata,channeld_init,feerate_max,u32,
msgdata,channeld_init,feerate_penalty,u32,
msgdata,channeld_init,first_commit_sig,bitcoin_signature,
msgdata,channeld_init,remote_fundingkey,pubkey,
msgdata,channeld_init,remote_basepoints,basepoints,
msgdata,channeld_init,remote_per_commit,pubkey,
msgdata,channeld_init,old_remote_per_commit,pubkey,
msgdata,channeld_init,opener,enum side,
msgdata,channeld_init,local_msatoshi,amount_msat,
msgdata,channeld_init,our_basepoints,basepoints,
msgdata,channeld_init,our_funding_pubkey,pubkey,
msgdata,channeld_init,commit_msec,u32,
msgdata,channeld_init,last_was_revoke,bool,
msgdata,channeld_init,num_last_sent_commit,u16,
msgdata,channeld_init,last_sent_commit,changed_htlc,num_last_sent_commit
msgdata,channeld_init,next_index_local,u64,
msgdata,channeld_init,next_index_remote,u64,
msgdata,channeld_init,revocations_received,u64,
msgdata,channeld_init,next_htlc_id,u64,
msgdata,channeld_init,num_existing_htlcs,u16,
msgdata,channeld_init,htlcs,existing_htlc,num_existing_htlcs
msgdata,channeld_init,local_channel_ready,bool,
msgdata,channeld_init,remote_channel_ready,bool,
msgdata,channeld_init,funding_short_id,short_channel_id,
msgdata,channeld_init,reestablish,bool,
msgdata,channeld_init,send_shutdown,bool,
msgdata,channeld_init,remote_shutdown_received,bool,
msgdata,channeld_init,final_index,u32,
msgdata,channeld_init,final_ext_key,ext_key,
msgdata,channeld_init,final_scriptpubkey_len,u16,
msgdata,channeld_init,final_scriptpubkey,u8,final_scriptpubkey_len
msgdata,channeld_init,flags,u8,
msgdata,channeld_init,init_peer_pkt_len,u16,
msgdata,channeld_init,init_peer_pkt,u8,init_peer_pkt_len
msgdata,channeld_init,last_remote_secret,secret,
msgdata,channeld_init,flen,u16,
msgdata,channeld_init,their_features,u8,flen
msgdata,channeld_init,upfront_shutdown_script_len,u16,
msgdata,channeld_init,upfront_shutdown_script,u8,upfront_shutdown_script_len
msgdata,channeld_init,desired_type,channel_type,
msgdata,channeld_init,dev_disable_commit,?u32,
msgdata,channeld_init,num_penalty_bases,u32,
msgdata,channeld_init,pbases,penalty_base,num_penalty_bases
msgdata,channeld_init,num_inflights,u16,
msgdata,channeld_init,inflights,inflight,num_inflights
msgdata,channeld_init,scid_alias,short_channel_id,

# channeld->lightningd: successfully negotated reestablishment.
msgtype,channeld_reestablished,1101

# master->channeld funding hit new depth(funding locked if >= lock depth)
# short_channel_id != NULL once we have 3+ confirmations
msgtype,channeld_funding_depth,1002
msgdata,channeld_funding_depth,short_channel_id,?short_channel_id,
msgdata,channeld_funding_depth,depth,u32,
msgdata,channeld_funding_depth,splicing,bool,
msgdata,channeld_funding_depth,txid,bitcoin_txid,

# Tell channel to offer this htlc
msgtype,channeld_offer_htlc,1004
msgdata,channeld_offer_htlc,amount_msat,amount_msat,
msgdata,channeld_offer_htlc,cltv_expiry,u32,
msgdata,channeld_offer_htlc,payment_hash,sha256,
msgdata,channeld_offer_htlc,onion_routing_packet,u8,1366
msgdata,channeld_offer_htlc,path_key,?pubkey,
msgdata,channeld_offer_htlc,extra_tlvs_len,u16,
msgdata,channeld_offer_htlc,extra_tlvs,u8,extra_tlvs_len

# Reply; synchronous since IDs have to increment.
msgtype,channeld_offer_htlc_reply,1104
msgdata,channeld_offer_htlc_reply,id,u64,
# Empty failure message means success.
msgdata,channeld_offer_htlc_reply,len,u16,
msgdata,channeld_offer_htlc_reply,failuremsg,u8,len
msgdata,channeld_offer_htlc_reply,failurestr,wirestring,

# Main daemon found out the preimage for an HTLC
#include <bitcoin/preimage.h>
msgtype,channeld_fulfill_htlc,1005
msgdata,channeld_fulfill_htlc,fulfilled_htlc,fulfilled_htlc,

# Main daemon says HTLC failed
msgtype,channeld_fail_htlc,1006
msgdata,channeld_fail_htlc,failed_htlc,failed_htlc,

# When we receive channel_ready.
msgtype,channeld_got_channel_ready,1019
msgdata,channeld_got_channel_ready,next_per_commit_point,pubkey,
msgdata,channeld_got_channel_ready,alias,?short_channel_id,

# When we receive funding_locked.
msgtype,channeld_got_splice_locked,1119
msgdata,channeld_got_splice_locked,funding_sats,amount_sat,
msgdata,channeld_got_splice_locked,splice_amnt,s64,
msgdata,channeld_got_splice_locked,locked_txid,bitcoin_txid,

#include <common/penalty_base.h>

subtype,local_anchor_info
subtypedata,local_anchor_info,commitment_weight,u32,
subtypedata,local_anchor_info,commitment_fee,amount_sat,
subtypedata,local_anchor_info,anchor_point,bitcoin_outpoint,

# lightningd needs to track our anchor outputs on remote txs.
# This includes splices, so there could be more than one!
msgtype,channeld_local_anchor_info,1003
msgdata,channeld_local_anchor_info,remote_commitnum,u64,
msgdata,channeld_local_anchor_info,num_anchors,u16,
msgdata,channeld_local_anchor_info,anchors,local_anchor_info,num_anchors

# When we send a commitment_signed message, tell master.
msgtype,channeld_sending_commitsig,1020
msgdata,channeld_sending_commitsig,commitnum,u64,
msgdata,channeld_sending_commitsig,pbase,?penalty_base,
msgdata,channeld_sending_commitsig,fee_states,fee_states,
msgdata,channeld_sending_commitsig,blockheight_states,height_states,
# SENT_ADD_COMMIT, SENT_REMOVE_ACK_COMMIT, SENT_ADD_ACK_COMMIT, SENT_REMOVE_COMMIT
msgdata,channeld_sending_commitsig,num_changed,u16,
msgdata,channeld_sending_commitsig,changed,changed_htlc,num_changed


# Wait for reply, to make sure it's on disk before we send commit.
msgtype,channeld_sending_commitsig_reply,1120

# When we have a commitment_signed message, tell master to remember.
msgtype,channeld_got_commitsig,1021
msgdata,channeld_got_commitsig,commitnum,u64,
msgdata,channeld_got_commitsig,fee_states,fee_states,
msgdata,channeld_got_commitsig,blockheight_states,height_states,
msgdata,channeld_got_commitsig,signature,bitcoin_signature,
msgdata,channeld_got_commitsig,num_htlcs,u16,
msgdata,channeld_got_commitsig,htlc_signature,bitcoin_signature,num_htlcs
# RCVD_ADD_COMMIT: we're now committed to their new offered HTLCs.
msgdata,channeld_got_commitsig,num_added,u16,
msgdata,channeld_got_commitsig,added,added_htlc,num_added
# RCVD_REMOVE_COMMIT: we're now no longer committed to these HTLCs.
msgdata,channeld_got_commitsig,num_fulfilled,u16,
msgdata,channeld_got_commitsig,fulfilled,fulfilled_htlc,num_fulfilled
msgdata,channeld_got_commitsig,num_failed,u16,
msgdata,channeld_got_commitsig,failed,failed_htlc,num_failed
# RCVD_ADD_ACK_COMMIT, RCVD_REMOVE_ACK_COMMIT
msgdata,channeld_got_commitsig,num_changed,u16,
msgdata,channeld_got_commitsig,changed,changed_htlc,num_changed
msgdata,channeld_got_commitsig,tx,bitcoin_tx,
# Inflight splice commitments
msgdata,channeld_got_commitsig,num_inflight_commitsigs,u16,
msgdata,channeld_got_commitsig,inflight_commitsigs,commitsig,num_inflight_commitsigs
subtype,commitsig
subtypedata,commitsig,tx,bitcoin_tx,
subtypedata,commitsig,commit_signature,bitcoin_signature,
subtypedata,commitsig,num_htlcs,u16,
subtypedata,commitsig,htlc_signatures,bitcoin_signature,num_htlcs

# Wait for reply, to make sure it's on disk before we send revocation.
msgtype,channeld_got_commitsig_reply,1121

#include <common/htlc_wire.h>

msgtype,channeld_got_revoke,1022
msgdata,channeld_got_revoke,revokenum,u64,
msgdata,channeld_got_revoke,per_commitment_secret,secret,
msgdata,channeld_got_revoke,next_per_commit_point,pubkey,
# RCVD_ADD_ACK_REVOCATION, RCVD_REMOVE_ACK_REVOCATION, RCVD_ADD_REVOCATION, RCVD_REMOVE_REVOCATION
msgdata,channeld_got_revoke,fee_states,fee_states,
msgdata,channeld_got_revoke,blockheight_states,height_states,
msgdata,channeld_got_revoke,num_changed,u16,
msgdata,channeld_got_revoke,changed,changed_htlc,num_changed
msgdata,channeld_got_revoke,pbase,?penalty_base,
msgdata,channeld_got_revoke,penalty_tx,?bitcoin_tx,
# Wait for reply, to make sure it's on disk before we continue
# (eg. if we sent another commitment_signed, that would implicitly ack).
msgtype,channeld_got_revoke_reply,1122

#include <wally_bip32.h>

# master->channeld: hello, I'd like to start a channel splice open
msgtype,channeld_splice_init,7204
msgdata,channeld_splice_init,psbt,wally_psbt,
msgdata,channeld_splice_init,relative_amount,s64,
msgdata,channeld_splice_init,feerate_per_kw,u32,
msgdata,channeld_splice_init,force_feerate,bool,
msgdata,channeld_splice_init,skip_stfu,bool,

# channeld->master: hello, I started a channel splice open
msgtype,channeld_splice_confirmed_init,7205
msgdata,channeld_splice_confirmed_init,psbt,wally_psbt,

# master->channeld: Update an active splice
msgtype,channeld_splice_update,7206
msgdata,channeld_splice_update,psbt,wally_psbt,

# channeld->master: Splice update complete
msgtype,channeld_splice_confirmed_update,7207
msgdata,channeld_splice_confirmed_update,psbt,wally_psbt,
msgdata,channeld_splice_confirmed_update,commitments_secured,bool,
msgdata,channeld_splice_confirmed_update,signatures_secured,bool,

# channeld->master: Lookup a transaction
msgtype,channeld_splice_lookup_tx,7208
msgdata,channeld_splice_lookup_tx,txid,bitcoin_txid,

# master->channeld: Retrieved transaction
msgtype,channeld_splice_lookup_tx_result,7209
msgdata,channeld_splice_lookup_tx_result,tx,bitcoin_tx,

# master->channeld: User has signed psbt and it's ready to complete
msgtype,channeld_splice_signed,7212
msgdata,channeld_splice_signed,psbt,wally_psbt,
msgdata,channeld_splice_signed,force_sign_first,bool,

# channeld->master: Signed psbt is completed
msgtype,channeld_splice_confirmed_signed,7213
msgdata,channeld_splice_confirmed_signed,tx,bitcoin_tx,
msgdata,channeld_splice_confirmed_signed,output_index,u32,

# channeld->master: Splice signatures are about to be sent
msgtype,channeld_splice_sending_sigs,7214
msgdata,channeld_splice_sending_sigs,tx,bitcoin_txid,

# channeld->master: A feerate error has occured
msgtype,channeld_splice_feerate_error,7215
msgdata,channeld_splice_feerate_error,fee,amount_msat,
msgdata,channeld_splice_feerate_error,too_high,bool,

# channeld->master: Add an inflight to the DB
msgtype,channeld_add_inflight,7216
msgdata,channeld_add_inflight,remote_funding,pubkey,
msgdata,channeld_add_inflight,tx_id,bitcoin_txid,
msgdata,channeld_add_inflight,tx_outnum,u32,
msgdata,channeld_add_inflight,feerate,u32,
msgdata,channeld_add_inflight,satoshis,amount_sat,
msgdata,channeld_add_inflight,splice_amount,s64,
msgdata,channeld_add_inflight,psbt,wally_psbt,
msgdata,channeld_add_inflight,i_am_initiator,bool,
msgdata,channeld_add_inflight,force_sign_first,bool,
msgdata,channeld_add_inflight,i_sent_sigs,bool,

# master->channeld: Inflight saved successfully
msgtype,channeld_got_inflight,7217

# channeld->master: Update inflight with sigs
msgtype,channeld_update_inflight,7219
msgdata,channeld_update_inflight,psbt,wally_psbt,
msgdata,channeld_update_inflight,last_tx,?bitcoin_tx,
msgdata,channeld_update_inflight,last_sig,?bitcoin_signature,
msgdata,channeld_update_inflight,locked_scid,?short_channel_id,
msgdata,channeld_update_inflight,i_sent_sigs,bool,

# channeld->master: A funding error has occured
msgtype,channeld_splice_funding_error,7220
msgdata,channeld_splice_funding_error,funding,amount_msat,
msgdata,channeld_splice_funding_error,req_funding,amount_msat,
msgdata,channeld_splice_funding_error,opener_error,bool,

# channeld->master: A splice state error has occured
msgtype,channeld_splice_state_error,7221
msgdata,channeld_splice_state_error,state_error,wirestring,

# channeld->master: Peer rejected our splice
msgtype,channeld_splice_abort,7223
msgdata,channeld_splice_abort,did_i_initiate,bool,
msgdata,channeld_splice_abort,inflight_outpoint,?bitcoin_outpoint,
msgdata,channeld_splice_abort,reason,wirestring,

# master->channeld: Please enter stfu mode
msgtype,channeld_stfu,7224

# channeld->master: Entered stfu result
msgtype,channeld_confirmed_stfu,7225
msgdata,channeld_confirmed_stfu,available_funds,amount_msat,

# master->channeld: Please enter perform tx_abort
msgtype,channeld_abort,7226

# Tell peer to shut down channel.
msgtype,channeld_send_shutdown,1023
msgdata,channeld_send_shutdown,final_index,?u32,
msgdata,channeld_send_shutdown,final_ext_key,?ext_key,
msgdata,channeld_send_shutdown,shutdown_len,u16,
msgdata,channeld_send_shutdown,shutdown_scriptpubkey,u8,shutdown_len
msgdata,channeld_send_shutdown,wrong_funding,?bitcoin_outpoint,

# Peer told us that channel is shutting down
msgtype,channeld_got_shutdown,1024
msgdata,channeld_got_shutdown,scriptpubkey_len,u16,
msgdata,channeld_got_shutdown,scriptpubkey,u8,scriptpubkey_len
msgdata,channeld_got_shutdown,wrong_funding,?bitcoin_outpoint,

# Shutdown is complete, ready for closing negotiation. + peer_fd & gossip_fd.
msgtype,channeld_shutdown_complete,1025

# Re-enable commit timer.
msgtype,channeld_dev_reenable_commit,1026
msgtype,channeld_dev_reenable_commit_reply,1126,

msgtype,channeld_feerates,1027
msgdata,channeld_feerates,feerate,u32,
msgdata,channeld_feerates,min_feerate,u32,
msgdata,channeld_feerates,max_feerate,u32,
msgdata,channeld_feerates,penalty_feerate,u32,

# master -> channeld: do you have a memleak?
msgtype,channeld_dev_memleak,1033

msgtype,channeld_dev_memleak_reply,1133
msgdata,channeld_dev_memleak_reply,leak,bool,

# Peer presented proof it was from the future.
msgtype,channeld_fail_fallen_behind,1028

# When we receive announcement_signatures for channel announce
msgtype,channeld_got_announcement,1017
msgdata,channeld_got_announcement,scid,short_channel_id,
msgdata,channeld_got_announcement,remote_ann_node_sig,secp256k1_ecdsa_signature,
msgdata,channeld_got_announcement,remote_ann_bitcoin_sig,secp256k1_ecdsa_signature,

# Ask channeld to send a error message. Used in forgetting channel case.
msgtype,channeld_send_error,1008
msgdata,channeld_send_error,reason,wirestring,

# Tell master channeld has sent the error message.
msgtype,channeld_send_error_reply,1108

# Ask channeld to quiesce.
msgtype,channeld_dev_quiesce,1009
msgtype,channeld_dev_quiesce_reply,1109

# Tell master we're upgrading the commitment tx.
msgtype,channeld_upgraded,1011
msgdata,channeld_upgraded,new_type,channel_type,

# Tell peer about our latest and greatest blockheight.
msgtype,channeld_blockheight,1012
msgdata,channeld_blockheight,blockheight,u32,

# Tell channeld about peer's shachain seed.
msgtype,channeld_dev_peer_shachain,1013
msgdata,channeld_dev_peer_shachain,seed,sha256,
