Skip to content

Commit

Permalink
Cli: Make/Take offer commands yaml serializable
Browse files Browse the repository at this point in the history
  • Loading branch information
TheCharlatan committed May 15, 2022
1 parent ee95c19 commit c4762da
Show file tree
Hide file tree
Showing 3 changed files with 172 additions and 136 deletions.
14 changes: 3 additions & 11 deletions src/cli/command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -156,16 +156,8 @@ impl Exec for Command {
accordant_addr: accordant_addr.to_string(),
};
runtime.request(ServiceId::Farcasterd, Request::MakeOffer(proto_offer))?;
// report success of failure of the request to cli
runtime.report_progress()?;
// TODO: activate when we do client side offer validation, must
// be activated on farcasterd as well
// let public_offer = runtime.response()?;
// let instruction =
// format!("Share the following offer with taker:",);
// let hex = format!("{:?}", &public_offer);
// println!("{} \n {}", instruction.green_bold(),
// hex.bright_yellow_bold());
// report success or failure of the request to cli
runtime.report_response()?;
}

Command::Take {
Expand Down Expand Up @@ -221,7 +213,7 @@ impl Exec for Command {
),
)?;
// report success of failure of the request to cli
runtime.report_progress()?;
runtime.report_response()?;
}
}

Expand Down
256 changes: 131 additions & 125 deletions src/farcasterd/runtime.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
// along with this software.
// If not, see <https://opensource.org/licenses/MIT>.

use crate::farcasterd::runtime::request::MadeOffer;
use crate::farcasterd::runtime::request::TookOffer;
use crate::{
error::SyncerError,
rpc::request::{
Expand Down Expand Up @@ -855,7 +857,7 @@ impl Runtime {
} else {
(None, peer_public_key.clone())
};
let resp = match (bindaddr, peer_secret_key, peer_public_key) {
let res = match (bindaddr, peer_secret_key, peer_public_key) {
(None, None, None) => {
trace!("Push MakeOffer to pending_requests and requesting a secret from Wallet");
return self.get_secret(senders, source, request);
Expand All @@ -879,55 +881,51 @@ impl Runtime {
Ok(())
}
_ => unreachable!(),
};
let res = match resp {
Ok(_) => {
info!(
"Connection daemon {} for incoming peer connections on {}",
"listens".bright_green_bold(),
bind_addr
);
let node_id = self.node_ids.get(&offer.id()).cloned().unwrap();
let public_offer = offer.to_public_v1(node_id, public_addr.into());
let pub_offer_id = public_offer.id();
let serialized_offer = public_offer.to_string();
if !self.public_offers.insert(public_offer) {
let msg = s!("This Public offer was previously registered");
error!("{}", msg.err());
return Err(Error::Other(msg));
}
let msg = format!(
"{} {}",
"Public offer registered, please share with taker: ".bright_blue_bold(),
serialized_offer.bright_yellow_bold()
);
info!(
"{}: {:#}",
"Public offer registered".bright_green_bold(),
pub_offer_id.bright_yellow_bold()
);
report_to.push((
Some(source.clone()),
Request::Success(OptionDetails(Some(msg))),
));
self.arb_addrs.insert(pub_offer_id, arbitrating_addr);
self.acc_addrs
.insert(pub_offer_id, monero::Address::from_str(&accordant_addr)?);
Ok(())
}
Err(err) => {
error!("{}", err.err());
Err(err)
}.and_then(|_| {
info!(
"Connection daemon {} for incoming peer connections on {}",
"listens".bright_green_bold(),
bind_addr
);
let node_id = self.node_ids.get(&offer.id()).cloned().unwrap();
let public_offer = offer.to_public_v1(node_id, public_addr.into());
let pub_offer_id = public_offer.id();
let serialized_offer = public_offer.to_string();
if !self.public_offers.insert(public_offer) {
let msg = s!("This Public offer was previously registered");
error!("{}", msg.err());
return Err(Error::Other(msg));
}
};
if res.is_err() {
report_to.push((
Some(source.clone()),
let msg = s!("Public offer registered, please share with taker.");
info!(
"{}: {:#}",
"Public offer registered".bright_green_bold(),
pub_offer_id.bright_yellow_bold()
);
self.arb_addrs.insert(pub_offer_id, arbitrating_addr);
self.acc_addrs
.insert(pub_offer_id, monero::Address::from_str(&accordant_addr)?);
senders.send_to(
ServiceBus::Ctl,
ServiceId::Farcasterd, // source
source.clone(), // destination
Request::MadeOffer(MadeOffer {
offer: serialized_offer,
message: msg,
}),
)?;
Ok(())
});
if let Err(err) = res {
senders.send_to(
ServiceBus::Ctl,
ServiceId::Farcasterd,
source.clone(),
Request::Failure(Failure {
code: 1,
info: res.err().unwrap().to_string(),
info: err.to_string(),
}),
));
)?
}
}

Expand All @@ -945,90 +943,98 @@ impl Runtime {
&public_offer.to_string()
);
warn!("{}", msg.err());
report_to.push((
Some(source.clone()),
senders.send_to(
ServiceBus::Ctl,
ServiceId::Farcasterd, // source
source.clone(), // destination
Request::Failure(Failure { code: 1, info: msg }),
));
} else {
let PublicOffer {
version: _,
offer: _,
node_id, // bitcoin::Pubkey
peer_address, // InetSocketAddr
} = public_offer;

let daemon_service = internet2::RemoteNodeAddr {
node_id, // checked above
remote_addr: RemoteSocketAddr::Ftcp(peer_address), /* expected RemoteSocketAddr */
};
let peer = daemon_service
.to_node_addr(LIGHTNING_P2P_DEFAULT_PORT)
.ok_or(internet2::presentation::Error::InvalidEndpoint)?;

// Connect
let peer_connected_is_ok =
match (self.connections.contains(&peer), peer_secret_key) {
(false, None) => return self.get_secret(senders, source, request),
(false, Some(sk)) => {
debug!(
"{} to remote peer {}",
"Connecting".bright_blue_bold(),
peer.bright_blue_italic()
);
match self.connect_peer(source.clone(), &peer, sk) {
Err(err) => {
report_to.push((
Some(source.clone()),
Request::Failure(Failure {
code: 1,
info: err.to_string(),
}),
));
false
}
Ok(()) => true,
}
}
(true, _) => {
let msg = format!(
"Already connected to remote peer {}",
peer.bright_blue_italic()
);
warn!("{}", &msg);
true
}
};

if peer_connected_is_ok {
let offer_registered = format!(
"{}: {:#}",
"Public offer registered".bright_green_bold(),
&public_offer.id().bright_yellow_bold()
)?;
return Ok(());
}
let PublicOffer {
version: _,
offer: _,
node_id, // bitcoin::Pubkey
peer_address, // InetSocketAddr
} = public_offer;

let daemon_service = internet2::RemoteNodeAddr {
node_id, // checked above
remote_addr: RemoteSocketAddr::Ftcp(peer_address), /* expected RemoteSocketAddr */
};
let peer = daemon_service
.to_node_addr(LIGHTNING_P2P_DEFAULT_PORT)
.ok_or(internet2::presentation::Error::InvalidEndpoint)?;

// Connect
info!("going twice?????????????");
let res = match (self.connections.contains(&peer), peer_secret_key) {
(false, None) => {
return self.get_secret(senders, source, request);
}
(false, Some(sk)) => {
debug!(
"{} to remote peer {}",
"Connecting".bright_blue_bold(),
peer.bright_blue_italic()
);
// not yet in the set
self.public_offers.insert(public_offer.clone());
info!("{}", offer_registered);
let progress = (
Some(source.clone()),
Request::Success(OptionDetails(Some(offer_registered))),
self.connect_peer(source.clone(), &peer, sk)
}
(true, _) => {
let msg = format!(
"Already connected to remote peer {}",
peer.bright_blue_italic()
);
report_to.push(progress);
// reconstruct original request, by drop peer_secret_key
// from offer
let request = Request::TakeOffer(PubOffer {
public_offer,
external_address,
internal_address,
peer_secret_key: None,
});
senders.send_to(
ServiceBus::Ctl,
self.identity(),
ServiceId::Wallet,
request,
)?;
warn!("{}", &msg);
Ok(())
}
}
.and_then(|_| {
let offer_registered = format!("{}", "Public offer registered",);
// not yet in the set
self.public_offers.insert(public_offer.clone());
info!(
"{}: {:#}",
offer_registered.bright_green_bold(),
&public_offer.id().bright_yellow_bold()
);

// reconstruct original request, but drop peer_secret_key
// from offer
let request = Request::TakeOffer(PubOffer {
public_offer: public_offer.clone(),
external_address,
internal_address,
peer_secret_key: None,
});
senders.send_to(
ServiceBus::Ctl,
self.identity(),
ServiceId::Wallet,
request,
)?;
senders.send_to(
ServiceBus::Ctl,
ServiceId::Farcasterd, // source
source.clone(), // destination
Request::TookOffer(TookOffer {
offerid: public_offer.id(),
message: offer_registered,
}),
)?;
Ok(())
});
if let Err(err) = res {
senders.send_to(
ServiceBus::Ctl,
ServiceId::Farcasterd,
source.clone(),
Request::Failure(Failure {
code: 1,
info: err.to_string(),
}),
)?
}
}

Request::Progress(..) | Request::Success(..) | Request::Failure(..) => {
Expand Down
38 changes: 38 additions & 0 deletions src/rpc/request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -439,6 +439,14 @@ pub enum Request {
#[display("proto_puboffer({0:#})")]
MakeOffer(ProtoPublicOffer),

#[api(type = 206)]
#[display("made_offer({0})", alt = "{0:#}")]
MadeOffer(MadeOffer),

#[api(type = 207)]
#[display("took_offer({0})", alt = "{0:#}")]
TookOffer(TookOffer),

#[api(type = 197)]
#[display("params({0:#})")]
Params(Params),
Expand Down Expand Up @@ -790,6 +798,32 @@ pub struct ProtoPublicOffer {
pub peer_public_key: Option<secp256k1::PublicKey>,
}

#[cfg_attr(feature = "serde", serde_as)]
#[derive(Clone, PartialEq, Eq, Debug, Display, StrictEncode, StrictDecode)]
#[cfg_attr(
feature = "serde",
derive(Serialize, Deserialize),
serde(crate = "serde_crate")
)]
#[display(MadeOffer::to_yaml_string)]
pub struct MadeOffer {
pub offer: String,
pub message: String,
}

#[cfg_attr(feature = "serde", serde_as)]
#[derive(Clone, PartialEq, Eq, Debug, Display, StrictEncode, StrictDecode)]
#[cfg_attr(
feature = "serde",
derive(Serialize, Deserialize),
serde(crate = "serde_crate")
)]
#[display(TookOffer::to_yaml_string)]
pub struct TookOffer {
pub offerid: PublicOfferId,
pub message: String,
}

#[cfg_attr(feature = "serde", serde_as)]
#[derive(Clone, PartialEq, Eq, Debug, Display, StrictEncode, StrictDecode)]
#[cfg_attr(
Expand Down Expand Up @@ -865,6 +899,10 @@ impl ToYamlString for PeerInfo {}
impl ToYamlString for SwapInfo {}
#[cfg(feature = "serde")]
impl ToYamlString for SyncerInfo {}
#[cfg(feature = "serde")]
impl ToYamlString for MadeOffer {}
#[cfg(feature = "serde")]
impl ToYamlString for TookOffer {}

#[derive(Wrapper, Clone, PartialEq, Eq, Debug, From, StrictEncode, StrictDecode)]
#[wrapper(IndexRange)]
Expand Down

0 comments on commit c4762da

Please sign in to comment.