diff --git a/channeld/channeld.c b/channeld/channeld.c index ca3eae79d..7913198f6 100644 --- a/channeld/channeld.c +++ b/channeld/channeld.c @@ -156,6 +156,8 @@ struct peer { bool send_shutdown; /* Has shutdown been sent by each side? */ bool shutdown_sent[NUM_SIDES]; + /* If master told us to send wrong_funding */ + struct bitcoin_outpoint *shutdown_wrong_funding; /* Information used for reestablishment. */ bool last_was_revoke; @@ -740,6 +742,7 @@ static bool shutdown_complete(const struct peer *peer) static void maybe_send_shutdown(struct peer *peer) { u8 *msg; + struct tlv_shutdown_tlvs *tlvs; if (!peer->send_shutdown) return; @@ -748,9 +751,17 @@ static void maybe_send_shutdown(struct peer *peer) * over us */ send_channel_update(peer, ROUTING_FLAGS_DISABLED); - /* FIXME: send wrong_funding */ + if (peer->shutdown_wrong_funding) { + tlvs = tlv_shutdown_tlvs_new(tmpctx); + tlvs->wrong_funding + = tal(tlvs, struct tlv_shutdown_tlvs_wrong_funding); + tlvs->wrong_funding->txid = peer->shutdown_wrong_funding->txid; + tlvs->wrong_funding->outnum = peer->shutdown_wrong_funding->n; + } else + tlvs = NULL; + msg = towire_shutdown(NULL, &peer->channel_id, peer->final_scriptpubkey, - NULL); + tlvs); sync_crypto_write(peer->pps, take(msg)); peer->send_shutdown = false; peer->shutdown_sent[LOCAL] = true; @@ -2867,7 +2878,8 @@ static void handle_shutdown_cmd(struct peer *peer, const u8 *inmsg) { u8 *local_shutdown_script; - if (!fromwire_channeld_send_shutdown(peer, inmsg, &local_shutdown_script)) + if (!fromwire_channeld_send_shutdown(peer, inmsg, &local_shutdown_script, + &peer->shutdown_wrong_funding)) master_badmsg(WIRE_CHANNELD_SEND_SHUTDOWN, inmsg); tal_free(peer->final_scriptpubkey); @@ -3228,6 +3240,7 @@ int main(int argc, char *argv[]) peer->channel_local_active = false; peer->from_master = msg_queue_new(peer); peer->shutdown_sent[LOCAL] = false; + peer->shutdown_wrong_funding = NULL; peer->last_update_timestamp = 0; /* We actually received it in the previous daemon, but near enough */ peer->last_recv = time_now(); diff --git a/channeld/channeld_wire.csv b/channeld/channeld_wire.csv index cd94c22a6..25083fb08 100644 --- a/channeld/channeld_wire.csv +++ b/channeld/channeld_wire.csv @@ -168,6 +168,7 @@ msgtype,channeld_got_revoke_reply,1122 msgtype,channeld_send_shutdown,1023 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 diff --git a/channeld/channeld_wiregen.c b/channeld/channeld_wiregen.c index 3c91557cc..11bc0e143 100644 --- a/channeld/channeld_wiregen.c +++ b/channeld/channeld_wiregen.c @@ -738,7 +738,7 @@ bool fromwire_channeld_got_revoke_reply(const void *p) /* WIRE: CHANNELD_SEND_SHUTDOWN */ /* Tell peer to shut down channel. */ -u8 *towire_channeld_send_shutdown(const tal_t *ctx, const u8 *shutdown_scriptpubkey) +u8 *towire_channeld_send_shutdown(const tal_t *ctx, const u8 *shutdown_scriptpubkey, const struct bitcoin_outpoint *wrong_funding) { u16 shutdown_len = tal_count(shutdown_scriptpubkey); u8 *p = tal_arr(ctx, u8, 0); @@ -746,10 +746,16 @@ u8 *towire_channeld_send_shutdown(const tal_t *ctx, const u8 *shutdown_scriptpub towire_u16(&p, WIRE_CHANNELD_SEND_SHUTDOWN); towire_u16(&p, shutdown_len); towire_u8_array(&p, shutdown_scriptpubkey, shutdown_len); + if (!wrong_funding) + towire_bool(&p, false); + else { + towire_bool(&p, true); + towire_bitcoin_outpoint(&p, wrong_funding); + } return memcheck(p, tal_count(p)); } -bool fromwire_channeld_send_shutdown(const tal_t *ctx, const void *p, u8 **shutdown_scriptpubkey) +bool fromwire_channeld_send_shutdown(const tal_t *ctx, const void *p, u8 **shutdown_scriptpubkey, struct bitcoin_outpoint **wrong_funding) { u16 shutdown_len; @@ -762,6 +768,12 @@ bool fromwire_channeld_send_shutdown(const tal_t *ctx, const void *p, u8 **shutd // 2nd case shutdown_scriptpubkey *shutdown_scriptpubkey = shutdown_len ? tal_arr(ctx, u8, shutdown_len) : NULL; fromwire_u8_array(&cursor, &plen, *shutdown_scriptpubkey, shutdown_len); + if (!fromwire_bool(&cursor, &plen)) + *wrong_funding = NULL; + else { + *wrong_funding = tal(ctx, struct bitcoin_outpoint); + fromwire_bitcoin_outpoint(&cursor, &plen, *wrong_funding); + } return cursor != NULL; } @@ -1058,4 +1070,4 @@ bool fromwire_channeld_send_error_reply(const void *p) return false; return cursor != NULL; } -// SHA256STAMP:09bf2ecffadb3ef3959ba8f1154d9b160780e2dd9515b12478bf3155fa34e9ad +// SHA256STAMP:60143693b0c3611c8ecdf7f3549ef9f4c280e359cac0cd1f4df38cdca2dad3cb diff --git a/channeld/channeld_wiregen.h b/channeld/channeld_wiregen.h index 13904a5ec..356551707 100644 --- a/channeld/channeld_wiregen.h +++ b/channeld/channeld_wiregen.h @@ -151,8 +151,8 @@ bool fromwire_channeld_got_revoke_reply(const void *p); /* WIRE: CHANNELD_SEND_SHUTDOWN */ /* Tell peer to shut down channel. */ -u8 *towire_channeld_send_shutdown(const tal_t *ctx, const u8 *shutdown_scriptpubkey); -bool fromwire_channeld_send_shutdown(const tal_t *ctx, const void *p, u8 **shutdown_scriptpubkey); +u8 *towire_channeld_send_shutdown(const tal_t *ctx, const u8 *shutdown_scriptpubkey, const struct bitcoin_outpoint *wrong_funding); +bool fromwire_channeld_send_shutdown(const tal_t *ctx, const void *p, u8 **shutdown_scriptpubkey, struct bitcoin_outpoint **wrong_funding); /* WIRE: CHANNELD_GOT_SHUTDOWN */ /* Peer told us that channel is shutting down */ @@ -213,4 +213,4 @@ bool fromwire_channeld_send_error_reply(const void *p); #endif /* LIGHTNING_CHANNELD_CHANNELD_WIREGEN_H */ -// SHA256STAMP:09bf2ecffadb3ef3959ba8f1154d9b160780e2dd9515b12478bf3155fa34e9ad +// SHA256STAMP:60143693b0c3611c8ecdf7f3549ef9f4c280e359cac0cd1f4df38cdca2dad3cb diff --git a/lightningd/peer_control.c b/lightningd/peer_control.c index 48a34b5e1..f504609dd 100644 --- a/lightningd/peer_control.c +++ b/lightningd/peer_control.c @@ -1647,7 +1647,8 @@ static struct command_result *json_close(struct command *cmd, } else msg = towire_channeld_send_shutdown( NULL, - channel->shutdown_scriptpubkey[LOCAL]); + channel->shutdown_scriptpubkey[LOCAL], + channel->shutdown_wrong_funding); subd_send_msg(channel->owner, take(msg)); } diff --git a/lightningd/test/run-invoice-select-inchan.c b/lightningd/test/run-invoice-select-inchan.c index 575a8f0bc..681cdf762 100644 --- a/lightningd/test/run-invoice-select-inchan.c +++ b/lightningd/test/run-invoice-select-inchan.c @@ -604,7 +604,7 @@ u8 *towire_channeld_dev_memleak(const tal_t *ctx UNNEEDED) u8 *towire_channeld_dev_reenable_commit(const tal_t *ctx UNNEEDED) { fprintf(stderr, "towire_channeld_dev_reenable_commit called!\n"); abort(); } /* Generated stub for towire_channeld_send_shutdown */ -u8 *towire_channeld_send_shutdown(const tal_t *ctx UNNEEDED, const u8 *shutdown_scriptpubkey UNNEEDED) +u8 *towire_channeld_send_shutdown(const tal_t *ctx UNNEEDED, const u8 *shutdown_scriptpubkey UNNEEDED, const struct bitcoin_outpoint *wrong_funding UNNEEDED) { fprintf(stderr, "towire_channeld_send_shutdown called!\n"); abort(); } /* Generated stub for towire_channeld_specific_feerates */ u8 *towire_channeld_specific_feerates(const tal_t *ctx UNNEEDED, u32 feerate_base UNNEEDED, u32 feerate_ppm UNNEEDED) diff --git a/wallet/db_postgres_sqlgen.c b/wallet/db_postgres_sqlgen.c index 16155376d..c115c3adf 100644 --- a/wallet/db_postgres_sqlgen.c +++ b/wallet/db_postgres_sqlgen.c @@ -1888,4 +1888,4 @@ struct db_query db_postgres_queries[] = { #endif /* LIGHTNINGD_WALLET_GEN_DB_POSTGRES */ -// SHA256STAMP:7eea03944a711e7f4660ef2d02e6ad1af12938d123e4585d179c0c31be1d4278 +// SHA256STAMP:2456747feb02494cb6237921d03c41c45fc86cf20289f4b5c379db7e548761f7 diff --git a/wallet/db_sqlite3_sqlgen.c b/wallet/db_sqlite3_sqlgen.c index 3f386d5fe..388a3462c 100644 --- a/wallet/db_sqlite3_sqlgen.c +++ b/wallet/db_sqlite3_sqlgen.c @@ -1888,4 +1888,4 @@ struct db_query db_sqlite3_queries[] = { #endif /* LIGHTNINGD_WALLET_GEN_DB_SQLITE3 */ -// SHA256STAMP:7eea03944a711e7f4660ef2d02e6ad1af12938d123e4585d179c0c31be1d4278 +// SHA256STAMP:2456747feb02494cb6237921d03c41c45fc86cf20289f4b5c379db7e548761f7 diff --git a/wallet/statements_gettextgen.po b/wallet/statements_gettextgen.po index 6fb759f44..a91c6b0ca 100644 --- a/wallet/statements_gettextgen.po +++ b/wallet/statements_gettextgen.po @@ -1245,4 +1245,4 @@ msgstr "" #: wallet/test/run-wallet.c:1632 msgid "INSERT INTO channels (id) VALUES (1);" msgstr "" -# SHA256STAMP:8da50eaa6605e1f68e9cfa47733d265cc60040f859941eb9358af99720138142 +# SHA256STAMP:6a7cda25fc90182775e1fd2a4055e2c1e74ddca42f8a0160fea20e7aa3d045cb diff --git a/wallet/test/run-wallet.c b/wallet/test/run-wallet.c index 3a475a740..93da0057e 100644 --- a/wallet/test/run-wallet.c +++ b/wallet/test/run-wallet.c @@ -731,7 +731,7 @@ u8 *towire_channeld_got_revoke_reply(const tal_t *ctx UNNEEDED) u8 *towire_channeld_offer_htlc(const tal_t *ctx UNNEEDED, struct amount_msat amount_msat UNNEEDED, u32 cltv_expiry UNNEEDED, const struct sha256 *payment_hash UNNEEDED, const u8 onion_routing_packet[1366] UNNEEDED, const struct pubkey *blinding UNNEEDED) { fprintf(stderr, "towire_channeld_offer_htlc called!\n"); abort(); } /* Generated stub for towire_channeld_send_shutdown */ -u8 *towire_channeld_send_shutdown(const tal_t *ctx UNNEEDED, const u8 *shutdown_scriptpubkey UNNEEDED) +u8 *towire_channeld_send_shutdown(const tal_t *ctx UNNEEDED, const u8 *shutdown_scriptpubkey UNNEEDED, const struct bitcoin_outpoint *wrong_funding UNNEEDED) { fprintf(stderr, "towire_channeld_send_shutdown called!\n"); abort(); } /* Generated stub for towire_channeld_sending_commitsig_reply */ u8 *towire_channeld_sending_commitsig_reply(const tal_t *ctx UNNEEDED)