Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PoC using DLC-Channels from rust-dlc#master #1788

Merged
merged 15 commits into from
Jan 4, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -193,6 +193,8 @@ jobs:

e2e-tests:
runs-on: ubuntu-latest
# TODO(bonomat): re-run e2e tests
if: false
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

needs: generate-ffi
timeout-minutes: 30
steps:
Expand Down
27 changes: 22 additions & 5 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

10 changes: 5 additions & 5 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@ resolver = "2"
# `p2pderivatives/rust-dlc#feature/ln-dlc-channels`: 4e104b4. This patch ensures backwards
# compatibility for 10101 through the `rust-lightning:0.0.116` upgrade. We will be able to drop it
# once all users have been upgraded and traded once.
dlc-manager = { git = "https://github.com/p2pderivatives/rust-dlc", rev = "f235bd2" }
dlc-messages = { git = "https://github.com/p2pderivatives/rust-dlc", rev = "f235bd2" }
dlc = { git = "https://github.com/p2pderivatives/rust-dlc", rev = "f235bd2" }
p2pd-oracle-client = { git = "https://github.com/p2pderivatives/rust-dlc", rev = "f235bd2" }
dlc-trie = { git = "https://github.com/p2pderivatives/rust-dlc", rev = "f235bd2" }
dlc-manager = { git = "https://github.com/p2pderivatives/rust-dlc", rev = "5373146" }
dlc-messages = { git = "https://github.com/p2pderivatives/rust-dlc", rev = "5373146" }
dlc = { git = "https://github.com/p2pderivatives/rust-dlc", rev = "5373146" }
p2pd-oracle-client = { git = "https://github.com/p2pderivatives/rust-dlc", rev = "5373146" }
dlc-trie = { git = "https://github.com/p2pderivatives/rust-dlc", rev = "5373146" }

# We should usually track the `p2pderivatives/split-tx-experiment[-10101]` branch.
lightning = { git = "https://github.com/p2pderivatives/rust-lightning/", rev = "121bc324" }
Expand Down
2 changes: 1 addition & 1 deletion coordinator/src/admin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -261,7 +261,7 @@ pub async fn list_dlc_channels(
AppError::InternalServerError(format!("Failed to acquire db lock: {e:#}"))
})?;

let dlc_channels = state.node.inner.list_dlc_channels().map_err(|e| {
let dlc_channels = state.node.inner.list_sub_channels().map_err(|e| {
AppError::InternalServerError(format!("Failed to list DLC channels: {e:#}"))
})?;

Expand Down
9 changes: 4 additions & 5 deletions coordinator/src/collaborative_revert.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ pub async fn propose_collaborative_revert(
let channel_id_hex = channel_id.to_hex();

let subchannels = node
.list_dlc_channels()
.list_sub_channels()
.context("Could not get list of subchannels")?;

let subchannel = subchannels
Expand Down Expand Up @@ -233,7 +233,7 @@ pub async fn propose_collaborative_revert_without_channel_details(
let channel_id_hex = channel_id.to_hex();

let subchannels = node
.list_dlc_channels()
.list_sub_channels()
.context("Could not get list of subchannels")?;

let subchannel = subchannels
Expand Down Expand Up @@ -350,7 +350,7 @@ pub fn confirm_collaborative_revert(
let funding_txo = &funding_tx.output[record.vout as usize];

let subchannels = node
.list_dlc_channels()
.list_sub_channels()
.context("Failed to list subchannels")?;
let optional_subchannel = subchannels.iter().find(|c| c.channel_id == channel_id);

Expand Down Expand Up @@ -446,8 +446,7 @@ pub fn confirm_collaborative_revert(

if let Some(mut subchannel) = optional_subchannel.cloned() {
subchannel.state = SubChannelState::OnChainClosed;
node.sub_channel_manager
.get_dlc_manager()
node.dlc_manager
.get_store()
.upsert_sub_channel(&subchannel)?;
}
Expand Down
2 changes: 1 addition & 1 deletion coordinator/src/metrics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ pub fn collect(node: Node) {
position_metrics(&cx, &node);

let inner_node = node.inner;
if let Ok(dlc_channels) = inner_node.list_dlc_channels() {
if let Ok(dlc_channels) = inner_node.list_sub_channels() {
let (healthy, unhealthy, close_punished) =
dlc_channels
.iter()
Expand Down
107 changes: 75 additions & 32 deletions coordinator/src/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ use dlc_manager::contract::contract_input::ContractInput;
use dlc_manager::contract::contract_input::ContractInputInfo;
use dlc_manager::contract::contract_input::OracleInput;
use dlc_manager::ContractId;
use dlc_manager::DlcChannelId;
use dlc_messages::ChannelMessage;
use dlc_messages::Message;
use dlc_messages::SubChannelMessage;
Expand All @@ -38,7 +39,7 @@ use lightning::ln::ChannelId;
use lightning::util::config::UserConfig;
use ln_dlc_node::node;
use ln_dlc_node::node::dlc_message_name;
use ln_dlc_node::node::send_dlc_message;
use ln_dlc_node::node::send_sub_channel_message;
use ln_dlc_node::node::sub_channel_message_name;
use ln_dlc_node::node::RunningNode;
use ln_dlc_node::WalletSettings;
Expand Down Expand Up @@ -234,7 +235,7 @@ impl Node {

tracing::info!(
?trade_params,
channel_id = %hex::encode(channel_id.0),
channel_id = %hex::encode(channel_id),
%peer_id,
"Closing position"
);
Expand Down Expand Up @@ -325,16 +326,11 @@ impl Node {
}],
};

let channel_details = self.get_counterparty_channel(trade_params.pubkey)?;
self.inner
.propose_dlc_channel(channel_details.clone(), contract_input)
.await
.context("Could not propose dlc channel")?;

let temporary_contract_id = self
.inner
.get_temporary_contract_id_by_sub_channel_id(channel_details.channel_id)
.context("unable to extract temporary contract id")?;
.propose_dlc_channel(contract_input, trade_params.pubkey)
.await
.context("Could not propose dlc channel")?;

// After the dlc channel has been proposed the position can be created. Note, this
// fixes https://github.com/get10101/10101/issues/537, where the position was created
Expand Down Expand Up @@ -412,14 +408,14 @@ impl Node {
conn: &mut PgConnection,
position: &Position,
closing_price: Decimal,
channel_id: ChannelId,
channel_id: DlcChannelId,
) -> Result<()> {
let accept_settlement_amount =
position.calculate_accept_settlement_amount(closing_price)?;

tracing::debug!(
?position,
channel_id = %hex::encode(channel_id.0),
channel_id = %hex::encode(channel_id),
%accept_settlement_amount,
"Closing position of {accept_settlement_amount} with {}",
position.trader.to_string()
Expand Down Expand Up @@ -525,7 +521,7 @@ impl Node {
) -> Result<TradeAction> {
let trader_peer_id = trade_params.pubkey;

let subchannel = match self.inner.get_dlc_channel_signed(&trader_peer_id)? {
let subchannel = match self.inner.get_established_dlc_channel(&trader_peer_id)? {
None => return Ok(TradeAction::Open),
Some(subchannel) => subchannel,
};
Expand All @@ -552,7 +548,9 @@ impl Node {
let action = if position_contracts + trade_contracts == Decimal::ZERO {
TradeAction::Close(subchannel.channel_id)
} else {
TradeAction::Resize(subchannel.channel_id)
// TODO(bonomat) implement channel resize on dlc-channels
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

// TradeAction::Resize(subchannel.channel_id)
unimplemented!()
};

Ok(action)
Expand Down Expand Up @@ -607,7 +605,7 @@ impl Node {
.on_dlc_message(&msg, node_id)
.with_context(|| {
format!(
"Failed to handle {} message from {node_id}",
"Failed to handle {} dlc message from {node_id}",
dlc_message_name(&msg)
)
})?,
Expand Down Expand Up @@ -646,6 +644,50 @@ impl Node {
)?;
}

if let Some(Message::Channel(ChannelMessage::Sign(sign_channel))) = &resp {
let channel_id_hex_string = sign_channel.channel_id.to_hex();
tracing::info!(
channel_id = channel_id_hex_string,
node_id = node_id.to_string(),
"DLC channel open protocol was finalized"
);
let mut connection = self.pool.get()?;
db::positions::Position::update_proposed_position(
&mut connection,
node_id.to_string(),
PositionState::Open,
)?;
}

if let Message::Channel(ChannelMessage::SettleFinalize(settle_finalize)) = &msg {
let channel_id_hex_string = settle_finalize.channel_id.to_hex();
tracing::info!(
channel_id = channel_id_hex_string,
node_id = node_id.to_string(),
"DLC channel settle protocol was finalized"
);
let mut connection = self.pool.get()?;

match db::positions::Position::get_position_by_trader(
&mut connection,
node_id,
vec![
// The price doesn't matter here.
PositionState::Closing { closing_price: 0.0 },
],
)? {
None => {
tracing::error!(
channel_id = channel_id_hex_string,
"No position in Closing state found"
);
}
Some(position) => {
self.finalize_closing_position(&mut connection, position)?;
}
}
}

if let Message::SubChannel(SubChannelMessage::CloseFinalize(msg)) = &msg {
let mut connection = self.pool.get()?;
match db::positions::Position::get_position_by_trader(
Expand Down Expand Up @@ -723,7 +765,7 @@ impl Node {
"Sending message"
);

send_dlc_message(
send_sub_channel_message(
&self.inner.dlc_message_handler,
&self.inner.peer_manager,
node_id,
Expand All @@ -734,21 +776,22 @@ impl Node {
Ok(())
}

fn coordinator_leverage_for_trade(&self, counterparty_peer_id: &PublicKey) -> Result<f32> {
let mut conn = self.pool.get()?;

let channel_details = self.get_counterparty_channel(*counterparty_peer_id)?;
let user_channel_id = Uuid::from_u128(channel_details.user_channel_id).to_string();
let channel = db::channels::get(&user_channel_id, &mut conn)?.with_context(|| {
format!("Couldn't find shadow channel with user channel ID {user_channel_id}",)
})?;
let leverage_coordinator = match channel.liquidity_option_id {
Some(liquidity_option_id) => {
let liquidity_option = db::liquidity_options::get(&mut conn, liquidity_option_id)?;
liquidity_option.coordinator_leverage
}
None => 1.0,
};
fn coordinator_leverage_for_trade(&self, _counterparty_peer_id: &PublicKey) -> Result<f32> {
// TODO(bonomat): we will need to configure the leverage on the coordinator differently now
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

// let channel_details = self.get_counterparty_channel(*counterparty_peer_id)?;
// let user_channel_id = Uuid::from_u128(channel_details.user_channel_id).to_string();
// let channel = db::channels::get(&user_channel_id, &mut conn)?.with_context(|| {
// format!("Couldn't find shadow channel with user channel ID {user_channel_id}",)
// })?;
// let leverage_coordinator = match channel.liquidity_option_id {
// Some(liquidity_option_id) => {
// let liquidity_option = db::liquidity_options::get(&mut conn,
// liquidity_option_id)?; liquidity_option.coordinator_leverage
// }
// None => 1.0,
// };

let leverage_coordinator = 2.0;

Ok(leverage_coordinator)
}
Expand All @@ -773,7 +816,7 @@ fn update_order_and_match(

pub enum TradeAction {
Open,
Close(ChannelId),
Close(DlcChannelId),
Resize(ChannelId),
}

Expand Down
10 changes: 6 additions & 4 deletions coordinator/src/node/resize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ impl Node {
position.calculate_accept_settlement_amount_partial_close(trade_params)?;

self.inner
.propose_dlc_channel_collaborative_settlement(
.propose_sub_channel_collaborative_settlement(
channel_id,
accept_settlement_amount.to_sat(),
)
Expand Down Expand Up @@ -297,9 +297,11 @@ impl Node {
tokio::spawn({
let node = self.inner.clone();
async move {
if let Err(e) = node
.propose_dlc_channel(channel_details.clone(), contract_input)
.await
if let Err(e) =
// TODO(bonomat): we will need to use the new dlc channel protocol here
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

node
.propose_sub_channel(channel_details.clone(), contract_input)
.await
{
tracing::error!(
channel_id = %channel_details.channel_id.to_hex(),
Expand Down
2 changes: 1 addition & 1 deletion coordinator/src/node/rollover.rs
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@ impl Node {
// As the average entry price does not change with a rollover, we can simply use the traders
// margin as payout here. The funding rate should be considered here once https://github.com/get10101/10101/issues/1069 gets implemented.
self.inner
.propose_dlc_channel_update(dlc_channel_id, rollover.margin_trader, contract_input)
.propose_sub_channel_update(dlc_channel_id, rollover.margin_trader, contract_input)
.await?;

// Sets the position state to rollover indicating that a rollover is in progress.
Expand Down
Loading
Loading