---
title: Program Deployment
description: How to deploy and call a simple program
---

## Complete Test

```rust title="tests/program_test.rs"
use litesvm::LiteSVM;
use solana_sdk::{
    instruction::{AccountMeta, Instruction},
    pubkey::Pubkey,
    signature::{Keypair, Signer},
    transaction::Transaction,
};

#[test]
fn test_program_deployment() {
    let mut svm = LiteSVM::new();

    // Deploy the program
    let program_id = Pubkey::new_unique();
    let program_bytes = include_bytes!("../target/deploy/hello_world.so");
    svm.add_program(program_id, program_bytes).unwrap();

    // Create payer account
    let payer = Keypair::new();
    svm.airdrop(&payer.pubkey(), 10_000_000_000).unwrap();

    // Create instruction to call program
    let instruction = Instruction {
        program_id,
        accounts: vec![
            AccountMeta::new(payer.pubkey(), true),
        ],
        data: vec![], // Program-specific data
    };

    // Send transaction
    let tx = Transaction::new_signed_with_payer(
        &[instruction],
        Some(&payer.pubkey()),
        &[&payer],
        svm.latest_blockhash(),
    );

    let result = svm.send_transaction(tx).unwrap();

    // Verify program was called
    assert!(result.logs.iter().any(|log|
        log.contains(&format!("Program {} invoke", program_id))
    ));

    println!("Program called successfully!");
    println!("Logs:\n{}", result.pretty_logs());
}
```

## Key Points

1. **Program Deployment**: Use `add_program()` to deploy a program from bytes
2. **include_bytes!**: Embeds the compiled program at compile time
3. **Program ID**: Use the keypair from `target/deploy/`
4. **Instructions**: Create custom instructions with program ID, accounts, and
   data
5. **Log Verification**: Check transaction logs to verify program execution

For more detailed deployment information, read
[this section](/docs/tools/litesvm/testing-your-program/deploy).
