pub use self::{
create::CheckedMetadata as CreateCheckedMetadata,
script::CheckedMetadata as ScriptCheckedMetadata,
upgrade::CheckedMetadata as UpgradeCheckedMetadata,
upload::CheckedMetadata as UploadCheckedMetadata,
};
use alloc::collections::BTreeMap;
use fuel_types::{
AssetId,
Word,
};
#[derive(Default, Debug, Clone, Eq, PartialEq, Hash)]
pub struct NonRetryableFreeBalances(pub(crate) BTreeMap<AssetId, Word>);
impl From<NonRetryableFreeBalances> for BTreeMap<AssetId, Word> {
fn from(value: NonRetryableFreeBalances) -> Self {
value.0
}
}
impl core::ops::Deref for NonRetryableFreeBalances {
type Target = BTreeMap<AssetId, Word>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
#[derive(Default, Debug, Copy, Clone, Eq, PartialEq, Hash)]
pub struct RetryableAmount {
pub(crate) amount: Word,
pub(crate) base_asset_id: AssetId,
}
impl From<RetryableAmount> for Word {
fn from(value: RetryableAmount) -> Self {
value.amount
}
}
impl core::ops::Deref for RetryableAmount {
type Target = Word;
fn deref(&self) -> &Self::Target {
&self.amount
}
}
pub mod create {
use super::super::{
balances::{
initial_free_balances,
AvailableBalances,
},
Checked,
IntoChecked,
};
use crate::checked_transaction::{
CheckError,
NonRetryableFreeBalances,
};
use fuel_tx::{
Cacheable,
Chargeable,
ConsensusParameters,
Create,
FormatValidityChecks,
};
use fuel_types::BlockHeight;
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
pub struct CheckedMetadata {
pub free_balances: NonRetryableFreeBalances,
pub block_height: BlockHeight,
pub min_gas: u64,
pub max_gas: u64,
}
impl IntoChecked for Create {
type Metadata = CheckedMetadata;
fn into_checked_basic(
mut self,
block_height: BlockHeight,
consensus_params: &ConsensusParameters,
) -> Result<Checked<Self>, CheckError> {
let chain_id = consensus_params.chain_id();
self.precompute(&chain_id)?;
self.check_without_signatures(block_height, consensus_params)?;
let AvailableBalances {
non_retryable_balances,
retryable_balance,
} = initial_free_balances(&self, consensus_params.base_asset_id())?;
debug_assert_eq!(
retryable_balance, 0,
"The `check_without_signatures` should return `TransactionInputContainsMessageData` above"
);
let metadata = CheckedMetadata {
free_balances: NonRetryableFreeBalances(non_retryable_balances),
block_height,
min_gas: self
.min_gas(consensus_params.gas_costs(), consensus_params.fee_params()),
max_gas: self
.max_gas(consensus_params.gas_costs(), consensus_params.fee_params()),
};
Ok(Checked::basic(self, metadata))
}
}
}
pub mod mint {
use super::super::{
Checked,
IntoChecked,
};
use crate::checked_transaction::CheckError;
use fuel_tx::{
Cacheable,
ConsensusParameters,
FormatValidityChecks,
Mint,
};
use fuel_types::BlockHeight;
impl IntoChecked for Mint {
type Metadata = ();
fn into_checked_basic(
mut self,
block_height: BlockHeight,
consensus_params: &ConsensusParameters,
) -> Result<Checked<Self>, CheckError> {
let chain_id = consensus_params.chain_id();
self.precompute(&chain_id)?;
self.check_without_signatures(block_height, consensus_params)?;
Ok(Checked::basic(self, ()))
}
}
}
pub mod script {
use super::super::{
balances::{
initial_free_balances,
AvailableBalances,
},
Checked,
IntoChecked,
};
use crate::checked_transaction::{
CheckError,
NonRetryableFreeBalances,
RetryableAmount,
};
use fuel_tx::{
Cacheable,
Chargeable,
ConsensusParameters,
FormatValidityChecks,
Script,
};
use fuel_types::BlockHeight;
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
pub struct CheckedMetadata {
pub non_retryable_balances: NonRetryableFreeBalances,
pub retryable_balance: RetryableAmount,
pub block_height: BlockHeight,
pub min_gas: u64,
pub max_gas: u64,
}
impl IntoChecked for Script {
type Metadata = CheckedMetadata;
fn into_checked_basic(
mut self,
block_height: BlockHeight,
consensus_params: &ConsensusParameters,
) -> Result<Checked<Self>, CheckError> {
let chain_id = consensus_params.chain_id();
self.precompute(&chain_id)?;
self.check_without_signatures(block_height, consensus_params)?;
let AvailableBalances {
non_retryable_balances,
retryable_balance,
} = initial_free_balances(&self, consensus_params.base_asset_id())?;
let metadata = CheckedMetadata {
non_retryable_balances: NonRetryableFreeBalances(non_retryable_balances),
retryable_balance: RetryableAmount {
amount: retryable_balance,
base_asset_id: *consensus_params.base_asset_id(),
},
block_height,
min_gas: self
.min_gas(consensus_params.gas_costs(), consensus_params.fee_params()),
max_gas: self
.max_gas(consensus_params.gas_costs(), consensus_params.fee_params()),
};
Ok(Checked::basic(self, metadata))
}
}
}
pub mod upgrade {
use super::super::{
balances::{
initial_free_balances,
AvailableBalances,
},
Checked,
IntoChecked,
};
use crate::checked_transaction::{
CheckError,
NonRetryableFreeBalances,
};
use fuel_tx::{
Cacheable,
Chargeable,
ConsensusParameters,
FormatValidityChecks,
Upgrade,
};
use fuel_types::BlockHeight;
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
pub struct CheckedMetadata {
pub free_balances: NonRetryableFreeBalances,
pub block_height: BlockHeight,
pub min_gas: u64,
pub max_gas: u64,
}
impl IntoChecked for Upgrade {
type Metadata = CheckedMetadata;
fn into_checked_basic(
mut self,
block_height: BlockHeight,
consensus_params: &ConsensusParameters,
) -> Result<Checked<Self>, CheckError> {
let chain_id = consensus_params.chain_id();
self.precompute(&chain_id)?;
self.check_without_signatures(block_height, consensus_params)?;
let AvailableBalances {
non_retryable_balances,
retryable_balance,
} = initial_free_balances(&self, consensus_params.base_asset_id())?;
debug_assert_eq!(
retryable_balance, 0,
"The `check_without_signatures` should return `TransactionInputContainsMessageData` above"
);
let metadata = CheckedMetadata {
free_balances: NonRetryableFreeBalances(non_retryable_balances),
block_height,
min_gas: self
.min_gas(consensus_params.gas_costs(), consensus_params.fee_params()),
max_gas: self
.max_gas(consensus_params.gas_costs(), consensus_params.fee_params()),
};
Ok(Checked::basic(self, metadata))
}
}
}
pub mod upload {
use super::super::{
balances::{
initial_free_balances,
AvailableBalances,
},
Checked,
IntoChecked,
};
use crate::checked_transaction::{
CheckError,
NonRetryableFreeBalances,
};
use fuel_tx::{
Cacheable,
Chargeable,
ConsensusParameters,
FormatValidityChecks,
Upload,
};
use fuel_types::BlockHeight;
#[derive(Debug, Clone, Eq, PartialEq, Hash)]
pub struct CheckedMetadata {
pub free_balances: NonRetryableFreeBalances,
pub block_height: BlockHeight,
pub min_gas: u64,
pub max_gas: u64,
}
impl IntoChecked for Upload {
type Metadata = CheckedMetadata;
fn into_checked_basic(
mut self,
block_height: BlockHeight,
consensus_params: &ConsensusParameters,
) -> Result<Checked<Self>, CheckError> {
let chain_id = consensus_params.chain_id();
self.precompute(&chain_id)?;
self.check_without_signatures(block_height, consensus_params)?;
let AvailableBalances {
non_retryable_balances,
retryable_balance,
} = initial_free_balances(&self, consensus_params.base_asset_id())?;
debug_assert_eq!(
retryable_balance, 0,
"The `check_without_signatures` should return `TransactionInputContainsMessageData` above"
);
let metadata = CheckedMetadata {
free_balances: NonRetryableFreeBalances(non_retryable_balances),
block_height,
min_gas: self
.min_gas(consensus_params.gas_costs(), consensus_params.fee_params()),
max_gas: self
.max_gas(consensus_params.gas_costs(), consensus_params.fee_params()),
};
Ok(Checked::basic(self, metadata))
}
}
}