use secp256k1::SecretKey;
use crate::clarity::FnArguments;
use crate::clarity::PrincipalContract;
use crate::crypto::c32::Mode;
use crate::transaction::AnchorMode;
use crate::transaction::Auth;
use crate::transaction::ContractCallPayload;
use crate::transaction::Error;
use crate::transaction::Network;
use crate::transaction::PostConditionMode;
use crate::transaction::PostConditions;
use crate::transaction::SpendingConditionStandard;
use crate::transaction::Transaction;
use crate::transaction::TransactionSigner;
#[derive(Debug, Clone)]
pub struct STXContractCall {
transaction: Transaction,
sender_key: SecretKey,
}
impl STXContractCall {
pub fn new<T, N>(
contract: PrincipalContract,
function_name: T,
function_args: FnArguments,
sender_key: SecretKey,
fee: u64,
nonce: u64,
network: &N,
anchor_mode: AnchorMode,
post_condition_mode: PostConditionMode,
post_conditions: PostConditions,
sponsored: bool,
) -> Self
where
T: Into<String>,
N: Network,
{
let pk = sender_key.public_key(&secp256k1::Secp256k1::new());
let payload = ContractCallPayload::new(contract, function_name, function_args);
let condition = SpendingConditionStandard::new(pk, fee, nonce, Mode::P2PKH);
let auth = if sponsored {
unimplemented!("Sponsored transactions are not yet supported")
} else {
Auth::Standard(Box::new(condition))
};
let transaction = Transaction::new(
network.version(),
network.chain_id(),
auth,
anchor_mode,
post_condition_mode,
post_conditions,
Box::new(payload),
);
Self {
transaction,
sender_key,
}
}
pub fn sign(self) -> Result<Transaction, Error> {
let mut signer = TransactionSigner::new(self.transaction)?;
signer.sign_origin(self.sender_key)?;
Ok(signer.transaction())
}
}