use secp256k1::SecretKey;
use crate::clarity::Clarity;
use crate::crypto::c32::Mode;
use crate::transaction::AnchorMode;
use crate::transaction::Auth;
use crate::transaction::Error;
use crate::transaction::Network;
use crate::transaction::PostConditionMode;
use crate::transaction::PostConditions;
use crate::transaction::SpendingConditionStandard;
use crate::transaction::TokenTransferPayload;
use crate::transaction::Transaction;
use crate::transaction::TransactionSigner;
#[derive(Debug, Clone)]
pub struct STXTokenTransfer {
transaction: Transaction,
sender_key: SecretKey,
}
impl STXTokenTransfer {
pub fn new<T, N, M>(
recipient: T,
sender_key: SecretKey,
amount: u64,
fee: u64,
nonce: u64,
network: &N,
anchor_mode: AnchorMode,
memo: M,
post_condition_mode: PostConditionMode,
post_conditions: PostConditions,
sponsored: bool,
) -> Self
where
T: Clarity,
N: Network,
M: Into<String>,
{
let pk = sender_key.public_key(&secp256k1::Secp256k1::new());
let payload = TokenTransferPayload::new(recipient, amount, memo);
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())
}
}