use crate::{
error::Error,
types::{MandalaExtrinsics, MandalaTransactionProgress},
};
pub struct ExtrinsicSubmitter;
impl ExtrinsicSubmitter {
pub async fn submit(tx: MandalaExtrinsics) -> Result<MandalaTransactionProgress, Error> {
let result = tx
.into_inner()
.submit_and_watch()
.await
.map_err(Error::Transaction)?
.into();
Ok(result)
}
}
#[cfg(test)]
mod extrinsic_submitter_tests {
use crate::registrar::key_manager::prelude::PublicAddress;
use crate::registrar::signer::TxBuilder;
use crate::tx::extrinsics::extrinsics_submitter::ExtrinsicSubmitter;
use crate::tx::extrinsics::prelude::transfer_balance::constructor::BalanceTransfer;
use crate::types::MandalaConfig;
use crate::types::MandalaExtrinsics;
use crate::types::Unit;
use std::str::FromStr;
use subxt::ext::sp_core::crypto::Pair as CryptoPair;
use subxt::ext::sp_core::sr25519::Pair;
pub(crate) use subxt::OnlineClient;
fn mock_pair() -> subxt::ext::sp_core::sr25519::Pair {
sp_keyring::Sr25519Keyring::Alice.pair()
}
async fn mock_client() -> crate::types::NodeClient {
OnlineClient::<MandalaConfig>::new().await.unwrap()
}
#[tokio::test]
async fn submit_successful_tests() {
let address = "5DJk1gegyQJk6BNs7LceZ1akt5e9fpm4gUYGzcfpKaLG9Mmb";
let new_address = PublicAddress::from_str(address).unwrap();
let pair = mock_pair();
let node_client = mock_client().await;
let value = Unit::new("0.00001", None).expect("static conversion should not fail");
let payload = BalanceTransfer::construct(new_address, value);
let extrinsic = TxBuilder::signed(&node_client.into(), pair.into(), payload)
.await
.unwrap()
.0;
let tx = MandalaExtrinsics::new(extrinsic);
let result = ExtrinsicSubmitter::submit(tx).await;
assert!(result.is_ok());
}
#[tokio::test]
#[should_panic]
async fn submit_failure_tests() {
let address = "5DJk1gegyQJk6BNs7LceZ1akt5e9fpm4gUYGzcfpKaLG9Mmb";
let new_address = PublicAddress::from_str(address).unwrap();
let pair = mock_pair();
let node_client = mock_client().await;
let value = Unit::new("0", None).expect("static conversion should not fail");
let payload = BalanceTransfer::construct(new_address, value);
let extrinsic = TxBuilder::signed(&node_client.into(), pair.into(), payload)
.await
.unwrap()
.0;
let tx = MandalaExtrinsics::new(extrinsic);
let result = ExtrinsicSubmitter::submit(tx).await;
assert!(result.is_err());
}
}