Skip to main content
The test environment provides utilities for encrypting and submitting test data.

Encrypt and Submit

Submit encrypted values directly to the data store:
// Encrypt and submit u8
let hash = env.encrypt_and_submit_u8(100);

// Encrypt and submit u32
let hash = env.encrypt_and_submit_u32(100000);

// Encrypt and submit u64
let hash = env.encrypt_and_submit_u64(10000000000);
Returns a 32-byte hash that can be used in instructions.

Decrypt and Fetch

Retrieve and decrypt values for verification:
// Fetch and decrypt u8
let value: u8 = env.fetch_and_decrypt_u8(&hash);

// Fetch and decrypt u32
let value: u32 = env.fetch_and_decrypt_u32(&hash);

// Fetch and decrypt u64
let value: u64 = env.fetch_and_decrypt_u64(&hash);

Raw Data Access

For low-level access:
// Submit raw data
let hash = env.submit_data(ciphertext_bytes);

// Get raw data
let data = env.get_data(&hash).unwrap();

Creating EncryptedRef

Create typed references for use in test data structures:
let hash = env.encrypt_and_submit_u8(100);

// Create typed reference
let price_ref: EncryptedRef<u8> = env.encrypted_ref_u8(hash);
let amount_ref: EncryptedRef<u32> = env.encrypted_ref_u32(hash);
let value_ref: EncryptedRef<u64> = env.encrypted_ref_u64(hash);

Data Store Synchronization

Critical for proper test execution:
// Before sending transaction: make data available to program
env.sync_data_store_to_syscalls();

// ... send transaction ...

// After transaction: retrieve program outputs
env.sync_data_store_from_syscalls();

Example: Multiple Values

#[test]
fn test_orderbook_match() {
    let mut env = FheTestEnv::new();
    env.deploy_program(PROGRAM_ID, include_bytes!("../program.so"));

    // Encrypt order data
    let buy_price_hash = env.encrypt_and_submit_u8(100);
    let buy_qty_hash = env.encrypt_and_submit_u8(50);
    let sell_price_hash = env.encrypt_and_submit_u8(95);
    let sell_qty_hash = env.encrypt_and_submit_u8(30);

    // Build instruction with hashes
    let mut data = vec![2u8]; // MatchOrders instruction
    data.extend_from_slice(&buy_price_hash);
    data.extend_from_slice(&buy_qty_hash);
    data.extend_from_slice(&sell_price_hash);
    data.extend_from_slice(&sell_qty_hash);

    // Send transaction and verify...
}

Direct Client Key Access

For advanced testing, access the TFHE keys directly:
// Client key for encryption/decryption
let client_key = &env.client_key;

// Encrypt manually
let encrypted = tfhe::FheUint8::encrypt(100, client_key);
let bytes = bincode::serialize(&encrypted).unwrap();
let hash = env.submit_data(bytes);

// Decrypt manually
let data = env.get_data(&hash).unwrap();
let encrypted: tfhe::FheUint8 = bincode::deserialize(&data).unwrap();
let value: u8 = encrypted.decrypt(client_key);