use crate::{
blockchain::primitives::DaBlockHeight,
fuel_crypto,
fuel_types::{
BlockHeight,
Bytes32,
Nonce,
},
};
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum RelayedTransaction {
V1(RelayedTransactionV1),
}
impl Default for RelayedTransaction {
fn default() -> Self {
Self::V1(Default::default())
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Default, Debug, Clone, PartialEq, Eq)]
pub struct RelayedTransactionV1 {
pub nonce: Nonce,
pub max_gas: u64,
pub serialized_transaction: Vec<u8>,
pub da_height: DaBlockHeight,
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(
Debug,
Clone,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
derive_more::Display,
derive_more::From,
derive_more::Into,
)]
pub struct RelayedTransactionId(Bytes32);
impl RelayedTransaction {
pub fn id(&self) -> RelayedTransactionId {
match &self {
RelayedTransaction::V1(tx) => tx.id(),
}
}
pub fn nonce(&self) -> Nonce {
match &self {
RelayedTransaction::V1(tx) => tx.nonce,
}
}
#[cfg(any(test, feature = "test-helpers"))]
pub fn set_nonce(&mut self, nonce: Nonce) {
match self {
RelayedTransaction::V1(transaction) => {
transaction.nonce = nonce;
}
}
}
pub fn da_height(&self) -> DaBlockHeight {
match self {
RelayedTransaction::V1(transaction) => transaction.da_height,
}
}
pub fn max_gas(&self) -> u64 {
match self {
RelayedTransaction::V1(transaction) => transaction.max_gas,
}
}
#[cfg(any(test, feature = "test-helpers"))]
pub fn set_da_height(&mut self, height: DaBlockHeight) {
match self {
RelayedTransaction::V1(transaction) => {
transaction.da_height = height;
}
}
}
#[cfg(any(test, feature = "test-helpers"))]
pub fn set_max_gas(&mut self, max_gas: u64) {
match self {
RelayedTransaction::V1(transaction) => {
transaction.max_gas = max_gas;
}
}
}
pub fn serialized_transaction(&self) -> &[u8] {
match self {
RelayedTransaction::V1(transaction) => &transaction.serialized_transaction,
}
}
#[cfg(any(test, feature = "test-helpers"))]
pub fn set_serialized_transaction(&mut self, serialized_bytes: Vec<u8>) {
match self {
RelayedTransaction::V1(transaction) => {
transaction.serialized_transaction = serialized_bytes;
}
}
}
}
impl RelayedTransactionV1 {
pub fn id(&self) -> RelayedTransactionId {
let hasher = fuel_crypto::Hasher::default()
.chain(self.nonce.as_slice())
.chain(self.max_gas.to_be_bytes())
.chain(self.serialized_transaction.as_slice());
RelayedTransactionId((*hasher.finalize()).into())
}
}
impl From<RelayedTransactionV1> for RelayedTransaction {
fn from(relayed_transaction: RelayedTransactionV1) -> Self {
RelayedTransaction::V1(relayed_transaction)
}
}
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum RelayedTransactionStatus {
Failed {
block_height: BlockHeight,
failure: String,
},
}