Skip to main content

forest/test_utils/
mod.rs

1// Copyright 2019-2026 ChainSafe Systems
2// SPDX-License-Identifier: Apache-2.0, MIT
3
4use std::str::FromStr;
5
6use crate::{
7    blocks::{Ticket, VRFProof},
8    eth::EVMMethod,
9    message::SignedMessage,
10    shim::{
11        address::Address,
12        crypto::{SECP_SIG_LEN, Signature, SignatureType},
13        message::{Message, Message_v3},
14    },
15};
16use base64::{Engine, prelude::BASE64_STANDARD};
17
18/// Returns a Ticket to be used for testing
19pub fn construct_ticket() -> Ticket {
20    let vrf_result = VRFProof::new(BASE64_STANDARD.decode("lmRJLzDpuVA7cUELHTguK9SFf+IVOaySG8t/0IbVeHHm3VwxzSNhi1JStix7REw6Apu6rcJQV1aBBkd39gQGxP8Abzj8YXH+RdSD5RV50OJHi35f3ixR0uhkY6+G08vV").unwrap());
21    Ticket::new(vrf_result)
22}
23
24/// Returns a deterministic dummy ticket seeded by `seed`. Useful for keeping per-block
25/// tickets distinct within a tipset.
26pub fn dummy_ticket(seed: u8) -> Option<Ticket> {
27    Some(Ticket::new(VRFProof::new(vec![seed])))
28}
29
30/// Returns a tuple of unsigned and signed messages used for testing
31pub fn construct_messages() -> (Message, SignedMessage) {
32    let bls_messages: Message = Message_v3 {
33        to: Address::new_id(1).into(),
34        from: Address::new_id(2).into(),
35        ..Message_v3::default()
36    }
37    .into();
38
39    let secp_messages =
40        SignedMessage::new_unchecked(bls_messages.clone(), Signature::new_secp256k1(vec![0]));
41    (bls_messages, secp_messages)
42}
43
44/// Returns a tuple of unsigned and BLS-signed messages used for testing
45pub fn construct_bls_messages() -> (Message, SignedMessage) {
46    let message: Message = Message_v3 {
47        to: Address::new_id(1).into(),
48        from: Address::new_id(2).into(),
49        ..Message_v3::default()
50    }
51    .into();
52
53    let bls_message = SignedMessage::new_unchecked(message.clone(), Signature::new_bls(vec![0]));
54    (message, bls_message)
55}
56
57/// Returns a tuple of unsigned and signed messages used for testing the Ethereum mapping
58pub fn construct_eth_messages(sequence: u64) -> (Message, SignedMessage) {
59    let mut eth_message: Message = Message_v3 {
60        to: Address::from_str("t410foy6ucbmuujaequ3zsdo6nsubyogp6vtk23t4odq")
61            .unwrap()
62            .into(),
63        from: Address::from_str("t410fse4uvumo6ko46igb6lshg3peztqs3h6755vommy")
64            .unwrap()
65            .into(),
66        ..Message_v3::default()
67    }
68    .into();
69    eth_message.method_num = EVMMethod::InvokeContract as u64;
70    eth_message.sequence = sequence;
71
72    let secp_message = SignedMessage::new_unchecked(
73        eth_message.clone(),
74        Signature::new(SignatureType::Delegated, vec![0; SECP_SIG_LEN]),
75    );
76
77    (eth_message, secp_message)
78}
79
80// Serialize macro used for testing
81#[macro_export]
82macro_rules! to_string_with {
83    ($obj:expr, $serializer:path) => {{
84        let mut writer = Vec::new();
85        $serializer($obj, &mut serde_json::ser::Serializer::new(&mut writer)).unwrap();
86        String::from_utf8(writer).unwrap()
87    }};
88}
89
90// Deserialize macro used for testing
91#[macro_export]
92macro_rules! from_str_with {
93    ($str:expr, $deserializer:path) => {
94        $deserializer(&mut serde_json::de::Deserializer::from_str($str)).unwrap()
95    };
96}