Skip to main content

thru_base/
lib.rs

1pub mod bintrie;
2pub mod bintrie_error;
3pub mod bintrie_proof;
4pub mod bintrie_types;
5pub mod block_parser;
6pub mod crypto_utils;
7pub mod rpc_types;
8pub mod tn_account;
9pub mod tn_block_packet;
10pub mod tn_public_address;
11pub mod tn_runtime_utils;
12pub mod tn_signature;
13pub mod tn_signature_encoding;
14pub mod tn_state_proof;
15pub mod tn_tools;
16pub mod txn_lib;
17pub mod txn_tools;
18pub mod version;
19
20#[cfg(test)]
21mod txn_tools_test;
22
23#[cfg(test)]
24mod bintrie_tests;
25
26pub const TN_VM_ERROR_REVERT: i32 = -765; /* TN_RUNTIME_TXN_VM_REVERT fffffd03 */
27pub const TN_VM_ERROR_FEE_PAYER_ACCOUNT_DOES_NOT_EXIST: i32 = -508; /* TN_RUNTIME_TXN_ERR_FEE_PAYER_ACCOUNT_DOES_NOT_EXIST fffffe04 */
28
29pub const TN_EXECUTION_RESULT: u64 = 0xfffffffffffffffc; /* TN_VM_ERR_SIGFAULT  */
30pub const TN_USER_ERROR_CODE_SYSCALL_INSUFFICIENT_BALANCE: u64 = 0xffffffffffffffdc; /* TN_VM_ERR_SYSCALL_INSUFFICIENT_BALANCE */
31
32// re-export types
33pub use bintrie::{BinTrie, BinTriePair};
34pub use tn_state_proof::{StateProof, StateProofBody, StateProofHeader, StateProofType};
35pub use tn_tools::KeyPair;
36pub use tn_tools::Pubkey;
37pub use tn_tools::Signature;
38pub use txn_lib::Transaction;
39pub use txn_tools::TransactionBuilder;
40
41// re-export crypto utilities
42pub use crypto_utils::{derive_manager_program_accounts, derive_uploader_program_accounts};
43
44// re-export public address utilities
45pub use tn_public_address::{
46    create_program_defined_account_address, create_program_defined_account_address_string,
47    pack_seed, tn_pubkey_to_address_string, tn_public_address_decode, tn_public_address_encode,
48};
49
50// re-export runtime utilities
51pub use bintrie_error::BinTrieError;
52pub use bintrie_proof::{NonExistenceProof, Proof};
53pub use bintrie_types::{Hash as BinTrieHash, Pubkey as BinTriePubkey};
54pub use tn_runtime_utils::tn_vm_error_str;
55
56/// Checks if the given byte slice is a valid C-style null-terminated string containing only printable ASCII characters.
57pub fn is_c_printable_ascii_null_terminated(bytes: &[u8]) -> bool {
58    // Must contain at least one null byte
59    let Some(pos) = bytes.iter().position(|&b| b == 0) else {
60        return false;
61    };
62    // All bytes before the first null must be printable ASCII (0x20..=0x7E)
63    for &b in &bytes[..pos] {
64        if !(b >= 0x20 && b <= 0x7E) {
65            return false;
66        }
67    }
68    true
69}
70
71#[cfg(test)]
72mod tests {
73    use super::*;
74
75    #[test]
76    fn test_is_c_printable_ascii_null_terminated() {
77        // Valid cases
78        assert!(is_c_printable_ascii_null_terminated(b"hello\0"));
79        assert!(is_c_printable_ascii_null_terminated(b"!@#$%^&*()_+\0"));
80        assert!(is_c_printable_ascii_null_terminated(b" \0")); // space is printable
81        assert!(is_c_printable_ascii_null_terminated(b"~\0")); // tilde is printable
82        assert!(is_c_printable_ascii_null_terminated(b"\0")); // empty string
83        // Valid: data after null is ignored
84        assert!(is_c_printable_ascii_null_terminated(
85            b"hello\0not_printed\x01\x02"
86        ));
87
88        // Invalid: not null-terminated
89        assert!(!is_c_printable_ascii_null_terminated(b"hello"));
90        // Invalid: contains non-printable ASCII (tab)
91        assert!(!is_c_printable_ascii_null_terminated(b"hel\tlo\0"));
92        // Invalid: contains non-printable ASCII (DEL)
93        assert!(!is_c_printable_ascii_null_terminated(b"hel\x7Flo\0"));
94        // Invalid: empty slice
95        assert!(!is_c_printable_ascii_null_terminated(b""));
96        // Invalid: non-printable before null
97        assert!(!is_c_printable_ascii_null_terminated(b"foo\x19\0"));
98    }
99}