fuel_core_chain_config/config/
message.rs

1use crate::{
2    serialization::HexIfHumanReadable,
3    GenesisCommitment,
4    TableEntry,
5};
6use fuel_core_storage::{
7    tables::Messages,
8    MerkleRoot,
9};
10use fuel_core_types::{
11    blockchain::primitives::DaBlockHeight,
12    entities::relayer::message::{
13        Message,
14        MessageV1,
15    },
16    fuel_asm::Word,
17    fuel_crypto::Hasher,
18    fuel_types::{
19        Address,
20        Nonce,
21    },
22};
23use serde::{
24    Deserialize,
25    Serialize,
26};
27use serde_with::serde_as;
28
29#[serde_as]
30#[derive(Clone, Debug, Default, Deserialize, Serialize, Eq, PartialEq)]
31pub struct MessageConfig {
32    pub sender: Address,
33    pub recipient: Address,
34    pub nonce: Nonce,
35    pub amount: Word,
36    #[serde_as(as = "HexIfHumanReadable")]
37    pub data: Vec<u8>,
38    /// The block height from the parent da layer that originated this message
39    pub da_height: DaBlockHeight,
40}
41
42impl From<TableEntry<Messages>> for MessageConfig {
43    fn from(value: TableEntry<Messages>) -> Self {
44        Self {
45            sender: *value.value.sender(),
46            recipient: *value.value.recipient(),
47            nonce: *value.value.nonce(),
48            amount: value.value.amount(),
49            data: value.value.data().to_vec(),
50            da_height: value.value.da_height(),
51        }
52    }
53}
54
55impl From<MessageConfig> for TableEntry<Messages> {
56    fn from(value: MessageConfig) -> Self {
57        TableEntry {
58            key: value.nonce,
59            value: Message::V1(MessageV1 {
60                sender: value.sender,
61                recipient: value.recipient,
62                nonce: value.nonce,
63                amount: value.amount,
64                data: value.data,
65                da_height: value.da_height,
66            }),
67        }
68    }
69}
70
71#[cfg(feature = "test-helpers")]
72impl crate::Randomize for MessageConfig {
73    fn randomize(mut rng: impl rand::Rng) -> Self {
74        Self {
75            sender: crate::Randomize::randomize(&mut rng),
76            recipient: crate::Randomize::randomize(&mut rng),
77            nonce: crate::Randomize::randomize(&mut rng),
78            amount: crate::Randomize::randomize(&mut rng),
79            data: fuel_core_types::fuel_types::Bytes32::randomize(&mut rng).to_vec(),
80            da_height: crate::Randomize::randomize(&mut rng),
81        }
82    }
83}
84
85impl From<MessageConfig> for Message {
86    fn from(msg: MessageConfig) -> Self {
87        MessageV1 {
88            sender: msg.sender,
89            recipient: msg.recipient,
90            nonce: msg.nonce,
91            amount: msg.amount,
92            data: msg.data,
93            da_height: msg.da_height,
94        }
95        .into()
96    }
97}
98
99impl GenesisCommitment for Message {
100    fn root(&self) -> anyhow::Result<MerkleRoot> {
101        let sender = self.sender();
102        let recipient = self.recipient();
103        let nonce = self.nonce();
104        let amount = self.amount();
105        let data = self.data();
106        let da_height = self.da_height();
107
108        let message_hash = *Hasher::default()
109            .chain(sender)
110            .chain(recipient)
111            .chain(nonce)
112            .chain(amount.to_be_bytes())
113            .chain(data.as_slice())
114            .chain(da_height.to_be_bytes())
115            .finalize();
116        Ok(message_hash)
117    }
118}