fuel_core_chain_config/config/
message.rs1use 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 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}