Skip to content

Commit

Permalink
feat(emergency kit): Add resend settle finalize message
Browse files Browse the repository at this point in the history
  • Loading branch information
holzeis committed Mar 4, 2024
1 parent 07a82f8 commit 9783f94
Show file tree
Hide file tree
Showing 4 changed files with 81 additions and 0 deletions.
5 changes: 5 additions & 0 deletions crates/ln-dlc-node/src/bitcoin_conversion.rs
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,11 @@ pub fn to_secp_sk_30(sk: bitcoin_old::secp256k1::SecretKey) -> bitcoin::secp256k
bitcoin::secp256k1::SecretKey::from_slice(&sk).expect("valid conversion")
}

pub fn to_secp_sk_29(sk: bitcoin::secp256k1::SecretKey) -> bitcoin_old::secp256k1::SecretKey {
let sk = sk.secret_bytes();
bitcoin_old::secp256k1::SecretKey::from_slice(&sk).expect("valid conversion")
}

pub fn to_ecdsa_signature_30(signature: bitcoin_old::secp256k1::ecdsa::Signature) -> Signature {
let sig = signature.serialize_compact();
Signature::from_compact(&sig).expect("valid conversion")
Expand Down
18 changes: 18 additions & 0 deletions mobile/lib/common/settings/emergency_kit_screen.dart
Original file line number Diff line number Diff line change
Expand Up @@ -163,6 +163,24 @@ class _EmergencyKitScreenState extends State<EmergencyKitScreen> {
goRouter.pop();
}),
const SizedBox(height: 30),
EmergencyKitButton(
icon: const Icon(FontAwesomeIcons.broom),
title: "Resend SettleFinalize Message",
onPressed: () async {
final messenger = ScaffoldMessenger.of(context);
final goRouter = GoRouter.of(context);

try {
await rust.api.resendSettleFinalizeMessage();
showSnackBar(messenger, "Successfully resend SettleFinalize message");
} catch (e) {
showSnackBar(
messenger, "Failed to resend SettleFinalize message. Error: $e");
}

goRouter.pop();
}),
const SizedBox(height: 30),
Visibility(
visible: config.network == "regtest",
child: EmergencyKitButton(
Expand Down
4 changes: 4 additions & 0 deletions mobile/native/src/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,10 @@ pub fn delete_position() -> Result<()> {
emergency_kit::delete_position()
}

pub fn resend_settle_finalize_message() -> Result<()> {
emergency_kit::resend_settle_finalize_message()
}

pub fn subscribe(stream: StreamSink<event::api::Event>) {
tracing::debug!("Subscribing flutter to event hub");
event::subscribe(FlutterSubscriber::new(stream))
Expand Down
54 changes: 54 additions & 0 deletions mobile/native/src/emergency_kit.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,22 @@
use crate::config;
use crate::db;
use crate::db::connection;
use crate::event;
use crate::event::EventInternal;
use crate::ln_dlc;
use crate::state::get_node;
use anyhow::ensure;
use anyhow::Result;
use bitcoin::secp256k1::SecretKey;
use dlc_manager::DlcChannelId;
use dlc_manager::Signer;
use dlc_messages::channel::SettleFinalize;
use dlc_messages::ChannelMessage;
use dlc_messages::Message;
use hex::FromHex;
use lightning::ln::chan_utils::build_commitment_secret;
use ln_dlc_node::bitcoin_conversion::to_secp_sk_29;
use ln_dlc_node::node::event::NodeEvent;
use trade::ContractSymbol;

pub fn set_filling_orders_to_failed() -> Result<()> {
Expand All @@ -32,3 +43,46 @@ pub fn delete_position() -> Result<()> {
));
Ok(())
}

pub fn resend_settle_finalize_message() -> Result<()> {
tracing::warn!("Executing emergency kit! Resending settle finalize message");
let coordinator_pubkey = config::get_coordinator_info().pubkey;

let node = get_node();
let signed_channel = node
.inner
.get_signed_channel_by_trader_id(coordinator_pubkey)?;

ensure!(
matches!(
signed_channel.state,
dlc_manager::channel::signed_channel::SignedChannelState::Settled { .. }
),
"Signed channel state must be settled to resend settle finalize message!"
);

let per_update_seed_pk = signed_channel.own_per_update_seed;
let per_update_seed = node
.inner
.dlc_wallet
.get_secret_key_for_pubkey(&per_update_seed_pk)?;
let prev_per_update_secret = SecretKey::from_slice(&build_commitment_secret(
per_update_seed.as_ref(),
signed_channel.update_idx + 1,
))?;

let msg = Message::Channel(ChannelMessage::SettleFinalize(SettleFinalize {
channel_id: signed_channel.channel_id,
prev_per_update_secret: to_secp_sk_29(prev_per_update_secret),
reference_id: signed_channel.reference_id,
}));

node.inner
.event_handler
.publish(NodeEvent::SendDlcMessage {
peer: coordinator_pubkey,
msg: msg.clone(),
})?;

Ok(())
}

0 comments on commit 9783f94

Please sign in to comment.