casper_client/cli/
deploy.rs

1use 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
9/// Creates new Deploy with specified payment and session data.
10pub 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
35/// Creates new Transfer with specified data.
36pub 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}