fuel_contract_message_predicate/
script_asm.rs1use fuel_asm::{op, RegId};
2use sha2::{Digest, Sha256};
3
4const PROCESS_MESSAGE_FUNCTION_SIGNATURE: &str = "process_message(u8)";
5const GTF_MSG_DATA: u16 = 0x11D;
6const GTF_REG_MSG_AMOUNT: u16 = 0x117;
7
8const BYTES_PER_INSTR: u16 = 4;
9
10pub fn bytecode() -> Vec<u8> {
12 let mut fn_sel_hasher = Sha256::new();
14 fn_sel_hasher.update(PROCESS_MESSAGE_FUNCTION_SIGNATURE);
15 let fn_sel_hash: [u8; 32] = fn_sel_hasher.finalize().into();
16
17 const REG_MEMORY_START_PTR: u8 = 0x10;
19 const REG_ASSET_PTR: u8 = REG_MEMORY_START_PTR;
20 const REG_DATA_PTR: u8 = 0x11;
21 const REG_DATA_FN_SEL_PTR: u8 = 0x12;
22 const REG_CONTRACT_ADDR_PTR: u8 = 0x13;
23 const REG_FN_SELECTOR_PTR: u8 = 0x14;
24 const REG_MSG_AMOUNT: u8 = 0x15;
25
26 const REF_DATA_START_PTR: u16 = 11 * BYTES_PER_INSTR;
28
29 let mut script: Vec<u8> = vec![
37 op::move_(REG_MEMORY_START_PTR, RegId::SP), op::cfei(32 + 32 + 8 + 8), op::addi(REG_DATA_PTR, REG_MEMORY_START_PTR, 32), op::addi(REG_DATA_FN_SEL_PTR, REG_DATA_PTR, 32 + 4), op::gtf(REG_MSG_AMOUNT, RegId::ZERO, GTF_REG_MSG_AMOUNT), op::gtf(REG_CONTRACT_ADDR_PTR, RegId::ZERO, GTF_MSG_DATA), op::addi(REG_FN_SELECTOR_PTR, RegId::IS, REF_DATA_START_PTR), op::mcpi(REG_DATA_PTR, REG_CONTRACT_ADDR_PTR, 32), op::mcpi(REG_DATA_FN_SEL_PTR, REG_FN_SELECTOR_PTR, 4), op::call(REG_DATA_PTR, REG_MSG_AMOUNT, REG_ASSET_PTR, RegId::CGAS),
50 op::ret(RegId::ZERO),
51 ]
54 .into_iter()
55 .collect();
56
57 script.append(&mut fn_sel_hash[0..4].to_vec());
59 script
60}
61
62#[cfg(test)]
63mod tests {
64 use super::*;
65
66 #[test]
68 fn snapshot_script_bytecode() {
69 let bytecode = bytecode();
70 let serialized = hex::encode(&bytecode);
71 insta::assert_snapshot!(serialized);
72 }
73}