use super::{Config, HashFor};
use super::{TransactionExtensions, transaction_extensions};
use crate::config::transaction_extensions::CheckMortalityParams;
pub type DefaultTransactionExtensions<T> = (
transaction_extensions::VerifySignature<T>,
transaction_extensions::CheckSpecVersion,
transaction_extensions::CheckTxVersion,
transaction_extensions::CheckNonce,
transaction_extensions::CheckGenesis<T>,
transaction_extensions::CheckMortality<T>,
transaction_extensions::ChargeAssetTxPayment<T>,
transaction_extensions::ChargeTransactionPayment,
transaction_extensions::CheckMetadataHash,
);
pub struct DefaultExtrinsicParamsBuilder<T: Config> {
mortality: transaction_extensions::CheckMortalityParams<T>,
nonce: Option<u64>,
tip_of_asset_id: Option<T::AssetId>,
tip_of: u128,
tip: u128,
}
impl<T: Config> Default for DefaultExtrinsicParamsBuilder<T> {
fn default() -> Self {
Self {
mortality: CheckMortalityParams::<T>::default(),
tip: 0,
tip_of: 0,
tip_of_asset_id: None,
nonce: None,
}
}
}
impl<T: Config> DefaultExtrinsicParamsBuilder<T> {
pub fn new() -> Self {
Default::default()
}
pub fn immortal(mut self) -> Self {
self.mortality = transaction_extensions::CheckMortalityParams::<T>::immortal();
self
}
pub fn mortal(mut self, for_n_blocks: u64) -> Self {
self.mortality = transaction_extensions::CheckMortalityParams::<T>::mortal(for_n_blocks);
self
}
pub fn mortal_from_unchecked(
mut self,
for_n_blocks: u64,
from_block_n: u64,
from_block_hash: HashFor<T>,
) -> Self {
self.mortality = transaction_extensions::CheckMortalityParams::mortal_from_unchecked(
for_n_blocks,
from_block_n,
from_block_hash,
);
self
}
pub fn nonce(mut self, nonce: u64) -> Self {
self.nonce = Some(nonce);
self
}
pub fn tip(mut self, tip: u128) -> Self {
self.tip = tip;
self.tip_of = tip;
self.tip_of_asset_id = None;
self
}
pub fn tip_of(mut self, tip: u128, asset_id: T::AssetId) -> Self {
self.tip_of = tip;
self.tip_of_asset_id = Some(asset_id);
self
}
pub fn build(self) -> <DefaultTransactionExtensions<T> as TransactionExtensions<T>>::Params {
let check_mortality_params = self.mortality;
let charge_asset_tx_params = if let Some(asset_id) = self.tip_of_asset_id {
transaction_extensions::ChargeAssetTxPaymentParams::tip_of(self.tip_of, asset_id)
} else {
transaction_extensions::ChargeAssetTxPaymentParams::tip(self.tip_of)
};
let charge_transaction_params =
transaction_extensions::ChargeTransactionPaymentParams::tip(self.tip);
let check_nonce_params = if let Some(nonce) = self.nonce {
transaction_extensions::CheckNonceParams::with_nonce(nonce)
} else {
transaction_extensions::CheckNonceParams::from_chain()
};
(
(),
(),
(),
check_nonce_params,
(),
check_mortality_params,
charge_asset_tx_params,
charge_transaction_params,
(),
)
}
}
#[cfg(test)]
mod test {
use super::*;
use crate::config::PolkadotConfig;
fn assert_default<T: Default>(_t: T) {}
#[test]
fn params_are_default() {
let params = DefaultExtrinsicParamsBuilder::<PolkadotConfig>::new().build();
assert_default(params)
}
#[test]
fn tip_of_sets_correct_tip_on_charge_asset_tx_payment() {
let params = DefaultExtrinsicParamsBuilder::<PolkadotConfig>::new()
.tip(100) .tip_of(200, 42) .build();
let charge_asset_params: &transaction_extensions::ChargeAssetTxPaymentParams<_> = ¶ms.6;
let charge_transaction_params: &transaction_extensions::ChargeTransactionPaymentParams =
¶ms.7;
assert_eq!(
*charge_asset_params,
transaction_extensions::ChargeAssetTxPaymentParams::tip_of(200, 42)
);
assert_eq!(
*charge_transaction_params,
transaction_extensions::ChargeTransactionPaymentParams::tip(100)
)
}
}