diff --git a/kairos-cli/build.rs b/kairos-cli/build.rs new file mode 100644 index 00000000..3bce4324 --- /dev/null +++ b/kairos-cli/build.rs @@ -0,0 +1,20 @@ +use std::env; +use std::fs; +use std::path::Path; + +fn main() { + // Path + let session_binaries_dir = env::var("PATH_TO_SESSION_BINARIES") + .expect("PATH_TO_SESSION_BINARIES environment variable is not set"); + + // Get the output directory set by Cargo. + let out_dir = env::var("OUT_DIR").expect("OUT_DIR not set"); + let source_path = Path::new(&session_binaries_dir).join("deposit-session-optimized.wasm"); + let dest_path = Path::new(&out_dir).join("deposit-session-optimized.wasm"); + + // Copy the file from the source to the destination + fs::copy(&source_path, dest_path).expect("Failed to copy WASM file"); + + // Print out a message to re-run this script if the source file changes. + println!("cargo:rerun-if-changed={}", source_path.display()); +} diff --git a/kairos-cli/src/client.rs b/kairos-cli/src/client.rs index 7ef6af13..69cc5494 100644 --- a/kairos-cli/src/client.rs +++ b/kairos-cli/src/client.rs @@ -9,8 +9,6 @@ use kairos_server::PublicKey; use reqwest::Url; use serde::{Deserialize, Serialize}; use std::fmt; -use std::fs; -use std::path::Path; #[cfg(feature = "database")] use kairos_data::transaction::{TransactionFilter, Transactions}; @@ -55,20 +53,13 @@ impl From for KairosClientError { pub fn deposit( base_url: &Url, + deposit_session_wasm_bytes: &[u8], depositor_secret_key: &SecretKey, chain_name: &str, contract_hash: &ContractHash, amount: impl Into, recipient: casper_client_types::PublicKey, ) -> Result { - let deposit_session_wasm_path = - Path::new(env!("PATH_TO_SESSION_BINARIES")).join("deposit-session-optimized.wasm"); - let deposit_session_wasm_bytes = fs::read(&deposit_session_wasm_path).unwrap_or_else(|err| { - panic!( - "Failed to read the deposit session wasm as bytes from file: {:?}.\n{}", - deposit_session_wasm_path, err - ) - }); let deposit_session = ExecutableDeployItem::new_module_bytes( deposit_session_wasm_bytes.into(), runtime_args! { diff --git a/kairos-cli/src/commands/deposit.rs b/kairos-cli/src/commands/deposit.rs index 6f2b6f84..8fd01cd8 100644 --- a/kairos-cli/src/commands/deposit.rs +++ b/kairos-cli/src/commands/deposit.rs @@ -1,3 +1,6 @@ +use std::fs; +use std::path::PathBuf; + use crate::client; use crate::common::args::{ AmountArg, ChainNameArg, ContractHashArg, PrivateKeyPathArg, RecipientArg, @@ -5,12 +8,15 @@ use crate::common::args::{ use crate::error::CliError; use casper_client_types::{crypto::SecretKey, ContractHash}; -use clap::Parser; +use clap::{Args as ClapArgs, Parser}; use hex::FromHex; use reqwest::Url; use kairos_crypto::error::CryptoError; +const DEFAULT_DEPOSIT_SESSION_WASM: &[u8] = + include_bytes!(concat!(env!("OUT_DIR"), "/deposit-session-optimized.wasm")); + #[derive(Parser, Debug)] pub struct Args { #[clap(flatten)] @@ -22,6 +28,8 @@ pub struct Args { #[clap(flatten)] recipient: RecipientArg, #[clap(flatten)] + session_path: SessionPathArg, + #[clap(flatten)] chain_name: ChainNameArg, } @@ -46,8 +54,21 @@ pub fn run(args: Args, kairos_server_address: Url) -> Result { Some(name) => name, }; + let deposit_session_wasm: Vec = match args.session_path.field { + Some(deposit_session_wasm_path) => { + fs::read(&deposit_session_wasm_path).unwrap_or_else(|err| { + panic!( + "Failed to read the deposit session wasm as bytes from file: {:?}.\n{}", + deposit_session_wasm_path, err + ) + }) + } + None => DEFAULT_DEPOSIT_SESSION_WASM.to_vec(), + }; + client::deposit( &kairos_server_address, + &deposit_session_wasm, &depositor_secret_key, &chain_name, &contract_hash, @@ -68,3 +89,15 @@ pub fn run(args: Args, kairos_server_address: Url) -> Result { output }) } + +#[derive(ClapArgs, Debug)] +pub struct SessionPathArg { + #[arg( + id = "session-path", + long, + short = 's', + value_name = "PATH", + help = "Path to the custom WASM session code for deposit" + )] + pub field: Option, +}