From efc100fb91c4f40578c01a78dd9699d56e75bdd7 Mon Sep 17 00:00:00 2001 From: bennyhodl Date: Tue, 17 Dec 2024 15:44:13 -0500 Subject: [PATCH] onchain walet sync --- ddk-node/src/cli_opts.rs | 2 + ddk-node/src/command.rs | 16 +++---- ddk-node/src/ddkrpc.rs | 81 +++++++++++++++++++++++++++++++++ ddk-node/src/lib.rs | 13 +++++- ddk-node/src/proto/ddkrpc.proto | 4 ++ 5 files changed, 107 insertions(+), 9 deletions(-) diff --git a/ddk-node/src/cli_opts.rs b/ddk-node/src/cli_opts.rs index 5eb75d1..a005b52 100644 --- a/ddk-node/src/cli_opts.rs +++ b/ddk-node/src/cli_opts.rs @@ -55,6 +55,8 @@ pub enum WalletCommand { /// Fee rate in sats/vbyte fee_rate: u64, }, + #[command(about = "Sync the on-chain wallet.")] + Sync, } #[derive(Clone, Debug, Subcommand)] diff --git a/ddk-node/src/command.rs b/ddk-node/src/command.rs index a8eb72e..b4a18f8 100644 --- a/ddk-node/src/command.rs +++ b/ddk-node/src/command.rs @@ -5,7 +5,7 @@ use crate::ddkrpc::{ AcceptOfferRequest, ConnectRequest, GetWalletTransactionsRequest, InfoRequest, ListContractsRequest, ListOffersRequest, ListOraclesRequest, ListPeersRequest, ListUtxosRequest, NewAddressRequest, OracleAnnouncementsRequest, SendOfferRequest, SendRequest, - WalletBalanceRequest, + WalletBalanceRequest, WalletSyncRequest, }; use anyhow::anyhow; use bitcoin::Transaction; @@ -172,8 +172,6 @@ pub async fn cli_command( }) .await? .into_inner(); - let offer_hex = hex::encode(&offer.offer_dlc); - println!("{}", offer_hex); let offer_dlc: OfferDlc = serde_json::from_slice(&offer.offer_dlc)?; let offer = serde_json::to_string_pretty(&offer_dlc)?; print!("{}", offer); @@ -195,8 +193,6 @@ pub async fn cli_command( .await? .into_inner(); let accept_dlc: AcceptDlc = serde_json::from_slice(&accept.accept_dlc)?; - let accept_hex = hex::encode(&accept.accept_dlc); - println!("{}", accept_hex); let accept_dlc = serde_json::to_string_pretty(&accept_dlc)?; print!("{}", accept_dlc) } @@ -222,7 +218,7 @@ pub async fn cli_command( .await? .into_inner(); let pretty_string = serde_json::to_string_pretty(&balance)?; - println!("{}", pretty_string); + print!("{}", pretty_string); } WalletCommand::NewAddress => { let address = client @@ -230,7 +226,7 @@ pub async fn cli_command( .await? .into_inner(); let pretty_string = serde_json::to_string_pretty(&address)?; - println!("{}", pretty_string); + print!("{}", pretty_string); } WalletCommand::Transactions => { let transactions = client @@ -273,6 +269,10 @@ pub async fn cli_command( .into_inner(); print!("{}", serde_json::to_string_pretty(&txid)?) } + WalletCommand::Sync => { + let _ = client.wallet_sync(WalletSyncRequest {}).await?.into_inner(); + println!("Wallet synced.") + } }, CliCommand::Oracle(command) => match command { OracleCommand::Announcements => { @@ -303,7 +303,7 @@ pub async fn cli_command( host: parts[1].to_string(), }) .await?; - println!("Connected to {}", parts[0]) + print!("Connected to {}", parts[0]) } } diff --git a/ddk-node/src/ddkrpc.rs b/ddk-node/src/ddkrpc.rs index 71b308f..c578079 100644 --- a/ddk-node/src/ddkrpc.rs +++ b/ddk-node/src/ddkrpc.rs @@ -191,6 +191,14 @@ pub struct OracleAnnouncementsResponse { #[prost(bytes = "vec", repeated, tag = "1")] pub announcements: ::prost::alloc::vec::Vec<::prost::alloc::vec::Vec>, } +#[derive(serde::Serialize, serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct WalletSyncRequest {} +#[derive(serde::Serialize, serde::Deserialize)] +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct WalletSyncResponse {} /// Generated client implementations. pub mod ddk_rpc_client { #![allow(unused_variables, dead_code, missing_docs, clippy::let_unit_value)] @@ -410,6 +418,28 @@ pub mod ddk_rpc_client { .insert(GrpcMethod::new("ddkrpc.DdkRpc", "WalletBalance")); self.inner.unary(req, path, codec).await } + pub async fn wallet_sync( + &mut self, + request: impl tonic::IntoRequest, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + > { + self.inner + .ready() + .await + .map_err(|e| { + tonic::Status::new( + tonic::Code::Unknown, + format!("Service was not ready: {}", e.into()), + ) + })?; + let codec = tonic::codec::ProstCodec::default(); + let path = http::uri::PathAndQuery::from_static("/ddkrpc.DdkRpc/WalletSync"); + let mut req = request.into_request(); + req.extensions_mut().insert(GrpcMethod::new("ddkrpc.DdkRpc", "WalletSync")); + self.inner.unary(req, path, codec).await + } pub async fn get_wallet_transactions( &mut self, request: impl tonic::IntoRequest, @@ -644,6 +674,13 @@ pub mod ddk_rpc_server { tonic::Response, tonic::Status, >; + async fn wallet_sync( + &self, + request: tonic::Request, + ) -> std::result::Result< + tonic::Response, + tonic::Status, + >; async fn get_wallet_transactions( &self, request: tonic::Request, @@ -1042,6 +1079,50 @@ pub mod ddk_rpc_server { }; Box::pin(fut) } + "/ddkrpc.DdkRpc/WalletSync" => { + #[allow(non_camel_case_types)] + struct WalletSyncSvc(pub Arc); + impl tonic::server::UnaryService + for WalletSyncSvc { + type Response = super::WalletSyncResponse; + type Future = BoxFuture< + tonic::Response, + tonic::Status, + >; + fn call( + &mut self, + request: tonic::Request, + ) -> Self::Future { + let inner = Arc::clone(&self.0); + let fut = async move { + ::wallet_sync(&inner, request).await + }; + Box::pin(fut) + } + } + let accept_compression_encodings = self.accept_compression_encodings; + let send_compression_encodings = self.send_compression_encodings; + let max_decoding_message_size = self.max_decoding_message_size; + let max_encoding_message_size = self.max_encoding_message_size; + let inner = self.inner.clone(); + let fut = async move { + let inner = inner.0; + let method = WalletSyncSvc(inner); + let codec = tonic::codec::ProstCodec::default(); + let mut grpc = tonic::server::Grpc::new(codec) + .apply_compression_config( + accept_compression_encodings, + send_compression_encodings, + ) + .apply_max_message_size_config( + max_decoding_message_size, + max_encoding_message_size, + ); + let res = grpc.unary(method, req).await; + Ok(res) + }; + Box::pin(fut) + } "/ddkrpc.DdkRpc/GetWalletTransactions" => { #[allow(non_camel_case_types)] struct GetWalletTransactionsSvc(pub Arc); diff --git a/ddk-node/src/lib.rs b/ddk-node/src/lib.rs index 9ba6235..ad9d171 100644 --- a/ddk-node/src/lib.rs +++ b/ddk-node/src/lib.rs @@ -25,7 +25,7 @@ use ddkrpc::{ ListOraclesResponse, ListPeersRequest, ListPeersResponse, ListUtxosRequest, ListUtxosResponse, NewAddressRequest, NewAddressResponse, OracleAnnouncementsRequest, OracleAnnouncementsResponse, Peer, SendOfferRequest, SendOfferResponse, SendRequest, SendResponse, WalletBalanceRequest, - WalletBalanceResponse, + WalletBalanceResponse, WalletSyncRequest, WalletSyncResponse, }; use ddkrpc::{InfoRequest, InfoResponse}; use opts::NodeOpts; @@ -359,4 +359,15 @@ impl DdkRpc for DdkNode { .collect(); Ok(Response::new(OracleAnnouncementsResponse { announcements })) } + + async fn wallet_sync( + &self, + _request: Request, + ) -> Result, Status> { + self.node + .wallet + .sync() + .map_err(|_| Status::new(Code::Aborted, "Did not sync wallet."))?; + Ok(Response::new(WalletSyncResponse {})) + } } diff --git a/ddk-node/src/proto/ddkrpc.proto b/ddk-node/src/proto/ddkrpc.proto index 0a5b292..0b446b1 100644 --- a/ddk-node/src/proto/ddkrpc.proto +++ b/ddk-node/src/proto/ddkrpc.proto @@ -8,6 +8,7 @@ service DdkRpc { rpc ListOffers (ListOffersRequest) returns (ListOffersResponse); rpc NewAddress (NewAddressRequest) returns (NewAddressResponse); rpc WalletBalance (WalletBalanceRequest) returns (WalletBalanceResponse); + rpc WalletSync (WalletSyncRequest) returns (WalletSyncResponse); rpc GetWalletTransactions (GetWalletTransactionsRequest) returns (GetWalletTransactionsResponse); rpc ListUtxos (ListUtxosRequest) returns (ListUtxosResponse); rpc ListPeers (ListPeersRequest) returns (ListPeersResponse); @@ -122,3 +123,6 @@ message OracleAnnouncementsRequest {} message OracleAnnouncementsResponse { repeated bytes announcements = 1; } + +message WalletSyncRequest {} +message WalletSyncResponse {} \ No newline at end of file