Skip to content

Commit e690188

Browse files
authored
Merge pull request #326 from KnowWhoami/maker-cli
Maker Cli testing
2 parents 9947b21 + f5e8a19 commit e690188

28 files changed

+662
-402
lines changed

src/bin/directory-cli.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ use coinswap::{
1515
#[derive(Parser, Debug)]
1616
#[clap(author, version, about, long_about = None)]
1717
struct App {
18+
/// Sets the rpc-port of DNS
19+
#[clap(long, short = 'p', default_value = "127.0.0.1:4321")]
20+
rpc_port: String,
1821
/// The command to execute
1922
#[clap(subcommand)]
2023
command: Commands,
@@ -26,8 +29,7 @@ enum Commands {
2629
ListAddresses,
2730
}
2831

29-
fn send_rpc_req(req: &RpcMsgReq) -> Result<(), DirectoryServerError> {
30-
let mut stream = TcpStream::connect("127.0.0.1:4321")?;
32+
fn send_rpc_req(mut stream: TcpStream, req: RpcMsgReq) -> Result<(), DirectoryServerError> {
3133
stream.set_read_timeout(Some(Duration::from_secs(20)))?;
3234
stream.set_write_timeout(Some(Duration::from_secs(20)))?;
3335

@@ -44,9 +46,11 @@ fn main() -> Result<(), DirectoryServerError> {
4446
setup_directory_logger(log::LevelFilter::Info);
4547
let cli = App::parse();
4648

49+
let stream = TcpStream::connect(cli.rpc_port)?;
50+
4751
match cli.command {
4852
Commands::ListAddresses => {
49-
send_rpc_req(&RpcMsgReq::ListAddresses)?;
53+
send_rpc_req(stream, RpcMsgReq::ListAddresses)?;
5054
}
5155
}
5256
Ok(())

src/bin/directoryd.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ use std::{path::PathBuf, str::FromStr, sync::Arc};
1111
author = option_env ! ("CARGO_PKG_AUTHORS").unwrap_or(""))]
1212
struct Cli {
1313
/// Optional network type.
14-
#[clap(long, short = 'n', default_value = "clearnet", possible_values = &["tor", "clearnet"])]
14+
#[clap(long, short = 'n', default_value = "tor", possible_values = &["tor", "clearnet"])]
1515
network: String,
16-
/// Optional DNS data directory. Default value : "~/.coinswap/directory"
16+
/// Optional DNS data directory. Default value : "~/.coinswap/dns"
1717
#[clap(long, short = 'd')]
1818
data_directory: Option<PathBuf>,
1919
}

src/bin/maker-cli.rs

Lines changed: 34 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ use coinswap::{
1010
#[derive(Parser, Debug)]
1111
#[clap(author, version, about, long_about = None)]
1212
struct App {
13+
/// Sets the rpc-port of Makerd
14+
#[clap(long, short = 'p', default_value = "127.0.0.1:6103")]
15+
rpc_port: String,
1316
/// The command to execute
1417
#[clap(subcommand)]
1518
command: Commands,
@@ -37,77 +40,86 @@ enum Commands {
3740
FidelityBalance,
3841
/// Gets a new address
3942
NewAddress,
40-
// Send to an external wallet address.
43+
/// Send to an external address and returns the transaction hex.
4144
SendToAddress {
4245
address: String,
4346
amount: u64,
4447
fee: u64,
4548
},
4649
/// Returns the tor address
4750
GetTorAddress,
48-
/// Returns the data dir
51+
/// Returns the data directory path
4952
GetDataDir,
53+
/// Stops the maker server
54+
Stop,
5055
}
5156

5257
fn main() -> Result<(), MakerError> {
5358
setup_maker_logger(log::LevelFilter::Info);
5459
let cli = App::parse();
5560

61+
let stream = TcpStream::connect(cli.rpc_port)?;
62+
5663
match cli.command {
5764
Commands::Ping => {
58-
send_rpc_req(&RpcMsgReq::Ping)?;
65+
send_rpc_req(stream, RpcMsgReq::Ping)?;
5966
}
6067
Commands::ContractUtxo => {
61-
send_rpc_req(&RpcMsgReq::ContractUtxo)?;
68+
send_rpc_req(stream, RpcMsgReq::ContractUtxo)?;
6269
}
6370
Commands::ContractBalance => {
64-
send_rpc_req(&RpcMsgReq::ContractBalance)?;
71+
send_rpc_req(stream, RpcMsgReq::ContractBalance)?;
6572
}
6673
Commands::FidelityBalance => {
67-
send_rpc_req(&RpcMsgReq::FidelityBalance)?;
74+
send_rpc_req(stream, RpcMsgReq::FidelityBalance)?;
6875
}
6976
Commands::FidelityUtxo => {
70-
send_rpc_req(&RpcMsgReq::FidelityUtxo)?;
77+
send_rpc_req(stream, RpcMsgReq::FidelityUtxo)?;
7178
}
7279
Commands::SeedBalance => {
73-
send_rpc_req(&RpcMsgReq::SeedBalance)?;
80+
send_rpc_req(stream, RpcMsgReq::SeedBalance)?;
7481
}
7582
Commands::SeedUtxo => {
76-
send_rpc_req(&RpcMsgReq::SeedUtxo)?;
83+
send_rpc_req(stream, RpcMsgReq::SeedUtxo)?;
7784
}
7885
Commands::SwapBalance => {
79-
send_rpc_req(&RpcMsgReq::SwapBalance)?;
86+
send_rpc_req(stream, RpcMsgReq::SwapBalance)?;
8087
}
8188
Commands::SwapUtxo => {
82-
send_rpc_req(&RpcMsgReq::SwapUtxo)?;
89+
send_rpc_req(stream, RpcMsgReq::SwapUtxo)?;
8390
}
8491
Commands::NewAddress => {
85-
send_rpc_req(&RpcMsgReq::NewAddress)?;
92+
send_rpc_req(stream, RpcMsgReq::NewAddress)?;
8693
}
8794
Commands::SendToAddress {
8895
address,
8996
amount,
9097
fee,
9198
} => {
92-
send_rpc_req(&RpcMsgReq::SendToAddress {
93-
address,
94-
amount,
95-
fee,
96-
})?;
99+
send_rpc_req(
100+
stream,
101+
RpcMsgReq::SendToAddress {
102+
address,
103+
amount,
104+
fee,
105+
},
106+
)?;
97107
}
98108
Commands::GetTorAddress => {
99-
send_rpc_req(&RpcMsgReq::GetTorAddress)?;
109+
send_rpc_req(stream, RpcMsgReq::GetTorAddress)?;
100110
}
101111
Commands::GetDataDir => {
102-
send_rpc_req(&RpcMsgReq::GetDataDir)?;
112+
send_rpc_req(stream, RpcMsgReq::GetDataDir)?;
113+
}
114+
Commands::Stop => {
115+
send_rpc_req(stream, RpcMsgReq::Stop)?;
103116
}
104117
}
105118

106119
Ok(())
107120
}
108121

109-
fn send_rpc_req(req: &RpcMsgReq) -> Result<(), MakerError> {
110-
let mut stream = TcpStream::connect("127.0.0.1:6103")?;
122+
fn send_rpc_req(mut stream: TcpStream, req: RpcMsgReq) -> Result<(), MakerError> {
111123
stream.set_read_timeout(Some(Duration::from_secs(20)))?;
112124
stream.set_write_timeout(Some(Duration::from_secs(20)))?;
113125

@@ -116,7 +128,7 @@ fn send_rpc_req(req: &RpcMsgReq) -> Result<(), MakerError> {
116128
let response_bytes = read_message(&mut stream)?;
117129
let response: RpcMsgResp = serde_cbor::from_slice(&response_bytes)?;
118130

119-
println!("{:?}", response);
131+
println!("{}", response);
120132

121133
Ok(())
122134
}

src/bin/makerd.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use std::{path::PathBuf, str::FromStr, sync::Arc};
1616
author = option_env ! ("CARGO_PKG_AUTHORS").unwrap_or(""))]
1717
struct Cli {
1818
/// Optional Connection Network Type
19-
#[clap(long, default_value = "clearnet", possible_values = &["tor", "clearnet"])]
19+
#[clap(long, default_value = "tor", possible_values = &["tor", "clearnet"])]
2020
network: String,
2121
/// Optional DNS data directory. Default value : "~/.coinswap/maker"
2222
#[clap(long, short = 'd')]

src/maker/api.rs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,8 @@ pub struct Maker {
166166
pub highest_fidelity_proof: RwLock<Option<FidelityProof>>,
167167
/// Is setup complete
168168
pub is_setup_complete: AtomicBool,
169+
/// Path for the data directory.
170+
pub data_dir: PathBuf,
169171
/// Thread pool for managing all spawned threads
170172
pub thread_pool: Arc<ThreadPool>,
171173
}
@@ -201,15 +203,7 @@ impl Maker {
201203
};
202204

203205
// Get provided data directory or the default data directory.
204-
let data_dir = if cfg!(feature = "integration-test") {
205-
// We only append port number in data-dir for integration test
206-
let port = port.expect("port value expected in Int tests");
207-
data_dir.map_or(get_maker_dir().join(port.to_string()), |d| {
208-
d.join("maker").join(port.to_string())
209-
})
210-
} else {
211-
data_dir.unwrap_or(get_maker_dir())
212-
};
206+
let data_dir = data_dir.unwrap_or(get_maker_dir());
213207

214208
let wallet_dir = data_dir.join("wallets");
215209

@@ -284,10 +278,15 @@ impl Maker {
284278
connection_state: Mutex::new(HashMap::new()),
285279
highest_fidelity_proof: RwLock::new(None),
286280
is_setup_complete: AtomicBool::new(false),
281+
data_dir,
287282
thread_pool: Arc::new(ThreadPool::new(thread_pool_port)),
288283
})
289284
}
290285

286+
pub fn get_data_dir(&self) -> &PathBuf {
287+
&self.data_dir
288+
}
289+
291290
/// Returns a reference to the Maker's wallet.
292291
pub fn get_wallet(&self) -> &RwLock<Wallet> {
293292
&self.wallet

src/maker/config.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ impl Default for MakerConfig {
4343
time_relative_fee_ppb: Amount::from_sat(100_000),
4444
min_size: 10_000,
4545
socks_port: 19050,
46-
directory_server_address: "directoryhiddenserviceaddress.onion:8080".to_string(),
46+
directory_server_address: "127.0.0.1:8080".to_string(),
4747
fidelity_value: 5_000_000, // 5 million sats
4848
fidelity_timelock: 26_000, // Approx 6 months of blocks
4949
connection_type: ConnectionType::TOR,

src/maker/rpc/messages.rs

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
use std::fmt::Display;
2+
13
use bitcoind::bitcoincore_rpc::json::ListUnspentResultEntry;
24
use serde::{Deserialize, Serialize};
3-
5+
use std::path::PathBuf;
46
#[derive(Serialize, Deserialize, Debug)]
57
pub enum RpcMsgReq {
68
Ping,
@@ -20,6 +22,7 @@ pub enum RpcMsgReq {
2022
},
2123
GetTorAddress,
2224
GetDataDir,
25+
Stop,
2326
}
2427

2528
#[derive(Serialize, Deserialize, Debug)]
@@ -36,5 +39,27 @@ pub enum RpcMsgResp {
3639
NewAddressResp(String),
3740
SendToAddressResp(String),
3841
GetTorAddressResp(String),
39-
GetDataDirResp(String),
42+
GetDataDirResp(PathBuf),
43+
Shutdown,
44+
}
45+
46+
impl Display for RpcMsgResp {
47+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
48+
match self {
49+
Self::Pong => write!(f, "Pong"),
50+
Self::NewAddressResp(addr) => write!(f, "{}", addr),
51+
Self::SeedBalanceResp(bal) => write!(f, "{} sats", bal),
52+
Self::ContractBalanceResp(bal) => write!(f, "{} sats", bal),
53+
Self::SwapBalanceResp(bal) => write!(f, "{} sats", bal),
54+
Self::FidelityBalanceResp(bal) => write!(f, "{} sats", bal),
55+
Self::SeedUtxoResp { utxos } => write!(f, "{:?}", utxos),
56+
Self::SwapUtxoResp { utxos } => write!(f, "{:?}", utxos),
57+
Self::FidelityUtxoResp { utxos } => write!(f, "{:?}", utxos),
58+
Self::ContractUtxoResp { utxos } => write!(f, "{:?}", utxos),
59+
Self::SendToAddressResp(tx_hex) => write!(f, "{}", tx_hex),
60+
Self::GetTorAddressResp(addr) => write!(f, "{}", addr),
61+
Self::GetDataDirResp(path) => write!(f, "{}", path.display()),
62+
Self::Shutdown => write!(f, "Shutdown Initiated"),
63+
}
64+
}
4065
}

src/maker/rpc/server.rs

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::{
2-
io::ErrorKind,
2+
fs::File,
3+
io::{ErrorKind, Read},
34
net::{TcpListener, TcpStream},
45
sync::{atomic::Ordering::Relaxed, Arc},
56
thread::sleep,
@@ -10,7 +11,7 @@ use bitcoin::{Address, Amount};
1011

1112
use crate::{
1213
maker::{error::MakerError, rpc::messages::RpcMsgResp, Maker},
13-
utill::{get_maker_dir, get_tor_addrs, read_message, send_message},
14+
utill::{read_message, send_message, ConnectionType},
1415
wallet::{Destination, SendAmount},
1516
};
1617
use std::str::FromStr;
@@ -144,16 +145,36 @@ fn handle_request(maker: &Arc<Maker>, socket: &mut TcpStream) -> Result<(), Make
144145
};
145146
}
146147
RpcMsgReq::GetDataDir => {
147-
let path = get_maker_dir().display().to_string();
148-
let resp = RpcMsgResp::GetDataDirResp(path);
148+
let path = maker.get_data_dir();
149+
let resp = RpcMsgResp::GetDataDirResp(path.clone());
149150
if let Err(e) = send_message(socket, &resp) {
150151
log::info!("Error sending RPC response {:?}", e);
151152
};
152153
}
153154
RpcMsgReq::GetTorAddress => {
154-
let path = get_maker_dir().join("tor");
155-
let resp = RpcMsgResp::GetTorAddressResp(get_tor_addrs(&path)?);
156-
if let Err(e) = send_message(socket, &resp) {
155+
if maker.config.connection_type == ConnectionType::CLEARNET {
156+
let resp = RpcMsgResp::GetTorAddressResp("Maker is not running on TOR".to_string());
157+
if let Err(e) = send_message(socket, &resp) {
158+
log::info!("Error sending RPC response {:?}", e);
159+
};
160+
} else {
161+
let maker_hs_path_str =
162+
format!("/tmp/tor-rust-maker{}/hs-dir/hostname", maker.config.port);
163+
let mut maker_file = File::open(maker_hs_path_str)?;
164+
let mut maker_onion_addr: String = String::new();
165+
maker_file.read_to_string(&mut maker_onion_addr)?;
166+
maker_onion_addr.pop(); // Remove `\n` at the end.
167+
let maker_address = format!("{}:{}", maker_onion_addr, maker.config.port);
168+
169+
let resp = RpcMsgResp::GetTorAddressResp(maker_address);
170+
if let Err(e) = send_message(socket, &resp) {
171+
log::info!("Error sending RPC response {:?}", e);
172+
};
173+
}
174+
}
175+
RpcMsgReq::Stop => {
176+
maker.shutdown.store(true, Relaxed);
177+
if let Err(e) = send_message(socket, &RpcMsgResp::Shutdown) {
157178
log::info!("Error sending RPC response {:?}", e);
158179
};
159180
}

0 commit comments

Comments
 (0)