casper_client/cli/
deploy.rs1use casper_types::{account::AccountHash, AsymmetricType, PublicKey, UIntParseError, URef, U512};
2
3use super::{parse, CliError, DeployStrParams, PaymentStrParams, SessionStrParams};
4use crate::{
5 types::{Deploy, DeployBuilder, MAX_SERIALIZED_SIZE_OF_DEPLOY},
6 TransferTarget,
7};
8
9pub fn with_payment_and_session(
11 deploy_params: DeployStrParams,
12 payment_params: PaymentStrParams,
13 session_params: SessionStrParams,
14) -> Result<Deploy, CliError> {
15 let chain_name = deploy_params.chain_name.to_string();
16 let session = parse::session_executable_deploy_item(session_params)?;
17 let secret_key = parse::secret_key_from_file(deploy_params.secret_key)?;
18 let payment = parse::payment_executable_deploy_item(payment_params)?;
19 let timestamp = parse::timestamp(deploy_params.timestamp)?;
20 let ttl = parse::ttl(deploy_params.ttl)?;
21 let session_account = parse::session_account(deploy_params.session_account)?;
22
23 let mut deploy_builder = DeployBuilder::new(chain_name, session, &secret_key)
24 .with_payment(payment)
25 .with_timestamp(timestamp)
26 .with_ttl(ttl);
27 if let Some(account) = session_account {
28 deploy_builder = deploy_builder.with_account(account);
29 }
30 let deploy = deploy_builder.build()?;
31 deploy.is_valid_size(MAX_SERIALIZED_SIZE_OF_DEPLOY)?;
32 Ok(deploy)
33}
34
35pub fn new_transfer(
37 amount: &str,
38 source_purse: Option<URef>,
39 target_account: &str,
40 transfer_id: &str,
41 deploy_params: DeployStrParams,
42 payment_params: PaymentStrParams,
43) -> Result<Deploy, CliError> {
44 let chain_name = deploy_params.chain_name.to_string();
45 let secret_key = parse::secret_key_from_file(deploy_params.secret_key)?;
46 let payment = parse::payment_executable_deploy_item(payment_params)?;
47
48 let amount = U512::from_dec_str(amount).map_err(|err| CliError::FailedToParseUint {
49 context: "new_transfer amount",
50 error: UIntParseError::FromDecStr(err),
51 })?;
52
53 let target = if let Ok(public_key) = PublicKey::from_hex(target_account) {
54 TransferTarget::PublicKey(public_key)
55 } else if let Ok(account_hash) = AccountHash::from_formatted_str(target_account) {
56 TransferTarget::AccountHash(account_hash)
57 } else if let Ok(uref) = URef::from_formatted_str(target_account) {
58 TransferTarget::URef(uref)
59 } else {
60 return Err(CliError::InvalidArgument {
61 context: "new_transfer target_account",
62 error: format!(
63 "allowed types: PublicKey, AccountHash or URef, got {}",
64 target_account
65 ),
66 });
67 };
68
69 let transfer_id = parse::transfer_id(transfer_id)?;
70 let maybe_transfer_id = Some(transfer_id);
71
72 let timestamp = parse::timestamp(deploy_params.timestamp)?;
73 let ttl = parse::ttl(deploy_params.ttl)?;
74 let session_account = parse::session_account(deploy_params.session_account)?;
75
76 let mut deploy_builder = DeployBuilder::new_transfer(
77 chain_name,
78 amount,
79 source_purse,
80 target,
81 maybe_transfer_id,
82 &secret_key,
83 )
84 .with_payment(payment)
85 .with_timestamp(timestamp)
86 .with_ttl(ttl);
87 if let Some(account) = session_account {
88 deploy_builder = deploy_builder.with_account(account);
89 }
90 let deploy = deploy_builder.build()?;
91 deploy.is_valid_size(MAX_SERIALIZED_SIZE_OF_DEPLOY)?;
92 Ok(deploy)
93}