| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317 |
- //use super::cli_config::DrkCliConfig;
- use crate::Result;
- use crate::serial::{deserialize, serialize};
- use blake2b_simd::Params;
- use clap::{App, Arg};
- use serde::{Deserialize, Serialize};
- use std::path::PathBuf;
- fn amount_f64(v: String) -> std::result::Result<(), String> {
- if v.parse::<f64>().is_ok() {
- Ok(())
- } else {
- Err(String::from("The value is not an integer of type u64"))
- }
- }
- #[derive(Deserialize, Debug)]
- pub struct TransferParams {
- pub asset_id: Vec<u8>,
- pub pub_key: String,
- pub amount: f64,
- }
- impl TransferParams {
- pub fn new(asset_id: Vec<u8>, pub_key: String, amount: f64) -> Self {
- Self {
- asset_id,
- pub_key,
- amount,
- }
- }
- }
- pub struct Deposit {
- pub asset_id: Vec<u8>,
- }
- impl Deposit {
- pub fn new(asset_id: Vec<u8>) -> Self {
- Self { asset_id }
- }
- }
- #[derive(Deserialize, Debug)]
- pub struct WithdrawParams {
- pub asset_id: Vec<u8>,
- pub pub_key: String,
- pub amount: f64,
- }
- impl WithdrawParams {
- pub fn new(asset_id: Vec<u8>, pub_key: String, amount: f64) -> Self {
- Self {
- asset_id,
- pub_key,
- amount,
- }
- }
- }
- #[derive(Deserialize, Serialize, Debug)]
- pub struct Asset {
- pub name: String,
- pub id: Vec<u8>,
- }
- impl Asset {
- pub fn new(name: String) -> Self {
- let id = Self::id_hash(&name);
- Self { name, id }
- }
- pub fn id_hash(name: &String) -> Vec<u8> {
- let mut hasher = Params::new().hash_length(64).to_state();
- hasher.update(name.as_bytes());
- let result = hasher.finalize();
- let hash = jubjub::Fr::from_bytes_wide(result.as_array());
- let id = serialize(&hash);
- id
- }
- }
- pub struct DrkCli {
- pub verbose: bool,
- pub wallet: bool,
- pub key: bool,
- pub get_key: bool,
- pub info: bool,
- pub hello: bool,
- pub stop: bool,
- pub transfer: Option<TransferParams>,
- pub deposit: Option<Deposit>,
- pub withdraw: Option<WithdrawParams>,
- pub config: Box<Option<PathBuf>>,
- }
- impl DrkCli {
- pub fn load() -> Result<Self> {
- let app = App::new("Drk CLI")
- .version("0.1.0")
- .author("Dark Renaissance Technologies")
- .about("Run Drk Client")
- .arg(
- Arg::with_name("verbose")
- .short("v")
- .help("Increase verbosity")
- .long("verbose")
- .takes_value(false),
- )
- .arg(
- Arg::with_name("hello")
- .long("hello")
- .help("Say hello")
- .takes_value(false),
- )
- .arg(
- Arg::with_name("key")
- .short("k")
- .long("key")
- .help("Generate new keypair")
- .takes_value(false),
- )
- .arg(
- Arg::with_name("getkey")
- .long("getkey")
- .help("Get public key as base-58 encoded string")
- .takes_value(false),
- )
- .arg(
- Arg::with_name("wallet")
- .short("w")
- .long("wallet")
- .help("Create a new wallet")
- .takes_value(false),
- )
- .arg(
- Arg::with_name("info")
- .short("i")
- .long("info")
- .help("Request info from daemon")
- .takes_value(false),
- )
- .arg(
- Arg::with_name("stop")
- .short("s")
- .long("stop")
- .help("Send a stop signal to the daemon")
- .takes_value(false),
- )
- .arg(
- Arg::with_name("config")
- .help("Path for config file")
- .long("config")
- .takes_value(true),
- )
- .subcommand(
- App::new("transfer")
- .about("Transfer dark assets between users")
- .arg(
- Arg::with_name("asset")
- .value_name("ASSET_TYPE")
- .takes_value(true)
- .index(1)
- .help("Desired asset type")
- .required(true),
- )
- .arg(
- Arg::with_name("address")
- .value_name("RECEIVE_ADDRESS")
- .takes_value(true)
- .index(2)
- .help("Address of recipient")
- .required(true),
- )
- .arg(
- Arg::with_name("amount")
- .value_name("AMOUNT")
- .takes_value(true)
- .index(3)
- .validator(amount_f64)
- .help("Amount to send")
- .required(true),
- ),
- )
- .subcommand(
- App::new("deposit")
- .about("Deposit clear assets for dark assets")
- .arg(
- Arg::with_name("asset")
- .value_name("ASSET_TYPE")
- .takes_value(true)
- .index(1)
- .help("Desired asset type")
- .required(true),
- ),
- )
- .subcommand(
- App::new("withdraw")
- .about("Withdraw dark assets for clear assets")
- .arg(
- Arg::with_name("asset")
- .value_name("ASSET_TYPE")
- .takes_value(true)
- .index(1)
- .help("Desired asset type")
- .required(true),
- )
- .arg(
- Arg::with_name("address")
- .value_name("RECEIVE_ADDRESS")
- .takes_value(true)
- .index(2)
- .help("Address of recipient")
- .required(true),
- )
- .arg(
- Arg::with_name("amount")
- .value_name("AMOUNT")
- .takes_value(true)
- .index(3)
- .validator(amount_f64)
- .help("Amount to send")
- .required(true),
- ),
- )
- .get_matches();
- let verbose = app.is_present("verbose");
- let wallet = app.is_present("wallet");
- let key = app.is_present("key");
- let info = app.is_present("info");
- let hello = app.is_present("hello");
- let stop = app.is_present("stop");
- let get_key = app.is_present("getkey");
- let mut deposit = None;
- match app.subcommand_matches("deposit") {
- Some(deposit_sub) => {
- let asset_value = deposit_sub.value_of("asset").unwrap();
- let asset = Asset::new(asset_value.to_string());
- let dep = Deposit::new(asset.id.clone());
- deposit = Some(dep);
- let id: jubjub::Fr = deserialize(&asset.id)?;
- println!(
- "deposit request for asset: {}, asset ID: {:?}",
- asset_value, id
- );
- }
- None => {}
- }
- let mut transfer = None;
- match app.subcommand_matches("transfer") {
- Some(transfer_sub) => {
- let asset_value = transfer_sub.value_of("asset").unwrap().to_string();
- let asset = Asset::new(asset_value.clone());
- let address = transfer_sub.value_of("address").unwrap().to_string();
- let amount = transfer_sub
- .value_of("amount")
- .unwrap()
- .parse()
- .expect("Convert the amount to f64");
- let trn = TransferParams::new(asset.id.clone(), address, amount);
- transfer = Some(trn);
- let id: jubjub::Fr = deserialize(&asset.id)?;
- println!(
- "transfer request for asset: {}, amount: {}, asset ID: {:?}",
- asset_value, amount, id
- );
- }
- None => {}
- }
- let mut withdraw = None;
- match app.subcommand_matches("withdraw") {
- Some(withdraw_sub) => {
- let asset_value = withdraw_sub.value_of("asset").unwrap().to_string();
- let asset = Asset::new(asset_value.clone());
- let address = withdraw_sub.value_of("address").unwrap().to_string();
- let amount = withdraw_sub
- .value_of("amount")
- .unwrap()
- .parse()
- .expect("Convert the amount to f64");
- let wdraw = WithdrawParams::new(asset.id.clone(), address, amount);
- withdraw = Some(wdraw);
- let id: jubjub::Fr = deserialize(&asset.id)?;
- println!(
- "withdraw request for asset: {}, amount: {}, asset ID: {:?}",
- asset_value, amount, id
- );
- }
- None => {}
- }
- let config = Box::new(if let Some(config_path) = app.value_of("config") {
- Some(std::path::Path::new(config_path).to_path_buf())
- } else {
- None
- });
- Ok(Self {
- verbose,
- wallet,
- key,
- get_key,
- info,
- hello,
- stop,
- deposit,
- transfer,
- withdraw,
- config,
- })
- }
- }
|