2022-10-28 11:30:31 -07:00
|
|
|
//! Example Rust-based SBF program that tests duplicate accounts passed via accounts
|
2020-01-21 10:59:19 -08:00
|
|
|
|
2020-10-23 17:22:10 -07:00
|
|
|
extern crate solana_program;
|
|
|
|
use solana_program::{
|
2021-03-05 20:36:27 -08:00
|
|
|
account_info::AccountInfo,
|
|
|
|
entrypoint::ProgramResult,
|
|
|
|
instruction::{AccountMeta, Instruction},
|
|
|
|
msg,
|
|
|
|
program::invoke,
|
|
|
|
program_error::ProgramError,
|
|
|
|
pubkey::Pubkey,
|
2020-01-21 10:59:19 -08:00
|
|
|
};
|
|
|
|
|
2022-02-21 19:59:06 -08:00
|
|
|
solana_program::entrypoint!(process_instruction);
|
2020-01-24 13:41:14 -08:00
|
|
|
fn process_instruction(
|
2021-03-05 20:36:27 -08:00
|
|
|
program_id: &Pubkey,
|
2020-01-27 18:27:44 -08:00
|
|
|
accounts: &[AccountInfo],
|
2020-01-24 13:41:14 -08:00
|
|
|
instruction_data: &[u8],
|
2020-02-04 12:25:42 -08:00
|
|
|
) -> ProgramResult {
|
2020-01-24 13:41:14 -08:00
|
|
|
match instruction_data[0] {
|
2020-01-21 10:59:19 -08:00
|
|
|
1 => {
|
2021-03-05 20:36:27 -08:00
|
|
|
msg!("modify account (2) data");
|
2020-01-29 21:15:04 -08:00
|
|
|
accounts[2].data.borrow_mut()[0] = 1;
|
2020-01-21 10:59:19 -08:00
|
|
|
}
|
|
|
|
2 => {
|
2021-03-05 20:36:27 -08:00
|
|
|
msg!("modify account (3) data");
|
2020-01-29 21:15:04 -08:00
|
|
|
accounts[3].data.borrow_mut()[0] = 2;
|
2020-01-21 10:59:19 -08:00
|
|
|
}
|
|
|
|
3 => {
|
2021-03-05 20:36:27 -08:00
|
|
|
msg!("modify account (2,3) data");
|
2020-01-29 21:15:04 -08:00
|
|
|
accounts[2].data.borrow_mut()[0] += 1;
|
|
|
|
accounts[3].data.borrow_mut()[0] += 2;
|
2020-01-21 10:59:19 -08:00
|
|
|
}
|
|
|
|
4 => {
|
2021-03-05 20:36:27 -08:00
|
|
|
msg!("modify account (1,2) lamports");
|
2020-01-29 21:15:04 -08:00
|
|
|
**accounts[1].lamports.borrow_mut() -= 1;
|
|
|
|
**accounts[2].lamports.borrow_mut() += 1;
|
2020-01-21 10:59:19 -08:00
|
|
|
}
|
|
|
|
5 => {
|
2021-03-05 20:36:27 -08:00
|
|
|
msg!("modify account (1,3) lamports");
|
2020-01-29 21:15:04 -08:00
|
|
|
**accounts[1].lamports.borrow_mut() -= 2;
|
|
|
|
**accounts[3].lamports.borrow_mut() += 2;
|
2020-01-21 10:59:19 -08:00
|
|
|
}
|
|
|
|
6 => {
|
2021-03-05 20:36:27 -08:00
|
|
|
msg!("modify account (1,2,3) lamports");
|
2020-01-29 21:15:04 -08:00
|
|
|
**accounts[1].lamports.borrow_mut() -= 3;
|
|
|
|
**accounts[2].lamports.borrow_mut() += 1;
|
|
|
|
**accounts[3].lamports.borrow_mut() += 2;
|
2020-01-21 10:59:19 -08:00
|
|
|
}
|
2021-03-05 20:36:27 -08:00
|
|
|
7 => {
|
|
|
|
msg!("check account (0,1,2,3) privs");
|
|
|
|
assert!(accounts[0].is_signer);
|
|
|
|
assert!(!accounts[1].is_signer);
|
|
|
|
assert!(accounts[2].is_signer);
|
|
|
|
assert!(accounts[3].is_signer);
|
|
|
|
|
|
|
|
assert!(accounts[0].is_writable);
|
|
|
|
assert!(accounts[1].is_writable);
|
|
|
|
assert!(accounts[2].is_writable);
|
|
|
|
assert!(accounts[3].is_writable);
|
|
|
|
|
|
|
|
if accounts.len() > 4 {
|
|
|
|
let instruction = Instruction::new_with_bytes(
|
|
|
|
*program_id,
|
|
|
|
&[7],
|
|
|
|
vec![
|
|
|
|
AccountMeta::new(*accounts[0].key, true),
|
|
|
|
AccountMeta::new(*accounts[1].key, false),
|
|
|
|
AccountMeta::new(*accounts[2].key, false),
|
|
|
|
AccountMeta::new_readonly(*accounts[3].key, true),
|
|
|
|
],
|
|
|
|
);
|
2021-06-18 14:06:14 -07:00
|
|
|
invoke(&instruction, accounts)?;
|
2021-03-05 20:36:27 -08:00
|
|
|
|
|
|
|
let instruction = Instruction::new_with_bytes(
|
|
|
|
*program_id,
|
|
|
|
&[3],
|
|
|
|
vec![
|
|
|
|
AccountMeta::new(*accounts[0].key, true),
|
|
|
|
AccountMeta::new(*accounts[1].key, false),
|
|
|
|
AccountMeta::new(*accounts[2].key, false),
|
|
|
|
AccountMeta::new(*accounts[3].key, false),
|
|
|
|
],
|
|
|
|
);
|
2021-06-18 14:06:14 -07:00
|
|
|
invoke(&instruction, accounts)?;
|
2021-03-05 20:36:27 -08:00
|
|
|
assert_eq!(accounts[2].try_borrow_mut_data()?[0], 3);
|
|
|
|
assert_eq!(accounts[3].try_borrow_mut_data()?[0], 3);
|
|
|
|
}
|
|
|
|
}
|
2020-01-21 10:59:19 -08:00
|
|
|
_ => {
|
2020-11-30 13:28:58 -08:00
|
|
|
msg!("Unrecognized command");
|
2020-01-30 09:47:22 -08:00
|
|
|
return Err(ProgramError::InvalidArgument);
|
2020-01-21 10:59:19 -08:00
|
|
|
}
|
|
|
|
}
|
2020-01-30 09:47:22 -08:00
|
|
|
Ok(())
|
2020-01-21 10:59:19 -08:00
|
|
|
}
|