use rialo_s_message::{
v0::{self, Message as V0Message},
CompileError, ConfigHashPrefix, VersionedMessage,
};
use rialo_s_sdk::{instruction::Instruction, pubkey::Pubkey};
pub fn create_v0_message(
instructions: &[Instruction],
payer: &Pubkey,
valid_from: i64,
config_hash_prefix: ConfigHashPrefix,
occ: bool,
) -> Result<V0Message, CompileError> {
v0::Message::try_compile(payer, instructions, valid_from, config_hash_prefix, occ)
}
pub fn create_versioned_v0_message(
instructions: &[Instruction],
payer: &Pubkey,
valid_from: i64,
config_hash_prefix: ConfigHashPrefix,
occ: bool,
) -> Result<VersionedMessage, CompileError> {
Ok(VersionedMessage::V0(create_v0_message(
instructions,
payer,
valid_from,
config_hash_prefix,
occ,
)?))
}
pub fn create_signed_v0_transaction(
signers: &[&rialo_s_sdk::signature::Keypair],
instructions: &[Instruction],
payer: &Pubkey,
valid_from: i64,
config_hash_prefix: ConfigHashPrefix,
occ: bool,
) -> Result<rialo_s_sdk::transaction::VersionedTransaction, Box<dyn std::error::Error>> {
let message =
create_versioned_v0_message(instructions, payer, valid_from, config_hash_prefix, occ)?;
let tx = rialo_s_sdk::transaction::VersionedTransaction::try_new(message, signers)?;
Ok(tx)
}
pub fn create_v0_transaction(
signers: &[&rialo_s_sdk::signature::Keypair],
instructions: &[Instruction],
payer: &Pubkey,
valid_from: i64,
config_hash_prefix: ConfigHashPrefix,
occ: bool,
) -> Result<rialo_s_sdk::transaction::VersionedTransaction, Box<dyn std::error::Error>> {
create_signed_v0_transaction(
signers,
instructions,
payer,
valid_from,
config_hash_prefix,
occ,
)
}
#[cfg(test)]
mod tests {
use rialo_s_sdk::system_instruction;
use super::*;
#[test]
fn test_create_v0_message_simple() {
let from = Pubkey::new_unique();
let to = Pubkey::new_unique();
let instruction = system_instruction::transfer(&from, &to, 100);
let valid_from = 0;
let config_hash_prefix = ConfigHashPrefix::new(1);
let message =
create_v0_message(&[instruction], &from, valid_from, config_hash_prefix, false)
.unwrap();
assert_eq!(message.valid_from, valid_from);
assert_eq!(message.config_hash_prefix, config_hash_prefix);
assert_eq!(message.instructions.len(), 1);
assert!(message.account_keys.contains(&from));
assert!(message.account_keys.contains(&to));
}
#[test]
fn test_create_v0_message_multiple_instructions() {
let payer = Pubkey::new_unique();
let to1 = Pubkey::new_unique();
let to2 = Pubkey::new_unique();
let instructions = vec![
system_instruction::transfer(&payer, &to1, 100),
system_instruction::transfer(&payer, &to2, 200),
];
let valid_from = 0;
let config_hash_prefix = ConfigHashPrefix::new(1);
let message =
create_v0_message(&instructions, &payer, valid_from, config_hash_prefix, false)
.unwrap();
assert_eq!(message.instructions.len(), 2);
}
#[test]
fn test_create_versioned_v0_message() {
let from = Pubkey::new_unique();
let to = Pubkey::new_unique();
let instruction = system_instruction::transfer(&from, &to, 100);
let valid_from = 0;
let config_hash_prefix = ConfigHashPrefix::new(1);
let versioned_message = create_versioned_v0_message(
&[instruction],
&from,
valid_from,
config_hash_prefix,
false,
)
.unwrap();
match versioned_message {
VersionedMessage::V0(msg) => {
assert_eq!(msg.valid_from, valid_from);
assert_eq!(msg.config_hash_prefix, config_hash_prefix);
assert_eq!(msg.instructions.len(), 1);
}
VersionedMessage::Legacy(_) => panic!("Expected V0 message, got Legacy"),
}
}
}