Fix parsing CreateAccountWithSeed instructions (#13513)
* Reduce required num_system_accounts and handle 2-account instructions properly * Update CreateAccountWithSeed account docs to be correct * Add CreateAccountWithSeed test
This commit is contained in:
parent
9ca8e98525
commit
91f4e99b4c
|
@ -479,6 +479,43 @@ mod tests {
|
||||||
assert_eq!(to_account.borrow().data, [0, 0]);
|
assert_eq!(to_account.borrow().data, [0, 0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_create_account_with_seed_separate_base_account() {
|
||||||
|
let new_owner = Pubkey::new(&[9; 32]);
|
||||||
|
let from = solana_sdk::pubkey::new_rand();
|
||||||
|
let base = solana_sdk::pubkey::new_rand();
|
||||||
|
let seed = "shiny pepper";
|
||||||
|
let to = Pubkey::create_with_seed(&base, seed, &new_owner).unwrap();
|
||||||
|
|
||||||
|
let from_account = Account::new_ref(100, 0, &system_program::id());
|
||||||
|
let to_account = Account::new_ref(0, 0, &Pubkey::default());
|
||||||
|
let base_account = Account::new_ref(0, 0, &Pubkey::default());
|
||||||
|
|
||||||
|
assert_eq!(
|
||||||
|
process_instruction(
|
||||||
|
&Pubkey::default(),
|
||||||
|
&[
|
||||||
|
KeyedAccount::new(&from, true, &from_account),
|
||||||
|
KeyedAccount::new(&to, false, &to_account),
|
||||||
|
KeyedAccount::new(&base, true, &base_account)
|
||||||
|
],
|
||||||
|
&bincode::serialize(&SystemInstruction::CreateAccountWithSeed {
|
||||||
|
base,
|
||||||
|
seed: seed.to_string(),
|
||||||
|
lamports: 50,
|
||||||
|
space: 2,
|
||||||
|
owner: new_owner
|
||||||
|
})
|
||||||
|
.unwrap()
|
||||||
|
),
|
||||||
|
Ok(())
|
||||||
|
);
|
||||||
|
assert_eq!(from_account.borrow().lamports, 50);
|
||||||
|
assert_eq!(to_account.borrow().lamports, 50);
|
||||||
|
assert_eq!(to_account.borrow().owner, new_owner);
|
||||||
|
assert_eq!(to_account.borrow().data, [0, 0]);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_address_create_with_seed_mismatch() {
|
fn test_address_create_with_seed_mismatch() {
|
||||||
let from = solana_sdk::pubkey::new_rand();
|
let from = solana_sdk::pubkey::new_rand();
|
||||||
|
|
|
@ -92,7 +92,9 @@ pub enum SystemInstruction {
|
||||||
/// # Account references
|
/// # Account references
|
||||||
/// 0. [WRITE, SIGNER] Funding account
|
/// 0. [WRITE, SIGNER] Funding account
|
||||||
/// 1. [WRITE] Created account
|
/// 1. [WRITE] Created account
|
||||||
/// 2. [SIGNER] Base account
|
/// 2. [SIGNER] (optional) Base account; the account matching the base Pubkey below must be
|
||||||
|
/// provided as a signer, but may be the same as the funding account
|
||||||
|
/// and provided as account 0
|
||||||
CreateAccountWithSeed {
|
CreateAccountWithSeed {
|
||||||
/// Base public key
|
/// Base public key
|
||||||
base: Pubkey,
|
base: Pubkey,
|
||||||
|
|
|
@ -68,12 +68,12 @@ pub fn parse_system(
|
||||||
space,
|
space,
|
||||||
owner,
|
owner,
|
||||||
} => {
|
} => {
|
||||||
check_num_system_accounts(&instruction.accounts, 3)?;
|
check_num_system_accounts(&instruction.accounts, 2)?;
|
||||||
Ok(ParsedInstructionEnum {
|
Ok(ParsedInstructionEnum {
|
||||||
instruction_type: "createAccountWithSeed".to_string(),
|
instruction_type: "createAccountWithSeed".to_string(),
|
||||||
info: json!({
|
info: json!({
|
||||||
"source": account_keys[instruction.accounts[0] as usize].to_string(),
|
"source": account_keys[instruction.accounts[0] as usize].to_string(),
|
||||||
"newAccount": account_keys[instruction.accounts[2] as usize].to_string(),
|
"newAccount": account_keys[instruction.accounts[1] as usize].to_string(),
|
||||||
"base": base.to_string(),
|
"base": base.to_string(),
|
||||||
"seed": seed,
|
"seed": seed,
|
||||||
"lamports": lamports,
|
"lamports": lamports,
|
||||||
|
@ -260,7 +260,7 @@ mod test {
|
||||||
|
|
||||||
let seed = "test_seed";
|
let seed = "test_seed";
|
||||||
let instruction = system_instruction::create_account_with_seed(
|
let instruction = system_instruction::create_account_with_seed(
|
||||||
&keys[0], &keys[1], &keys[2], seed, lamports, space, &keys[3],
|
&keys[0], &keys[2], &keys[1], seed, lamports, space, &keys[3],
|
||||||
);
|
);
|
||||||
let message = Message::new(&[instruction], None);
|
let message = Message::new(&[instruction], None);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
|
@ -269,16 +269,37 @@ mod test {
|
||||||
instruction_type: "createAccountWithSeed".to_string(),
|
instruction_type: "createAccountWithSeed".to_string(),
|
||||||
info: json!({
|
info: json!({
|
||||||
"source": keys[0].to_string(),
|
"source": keys[0].to_string(),
|
||||||
"newAccount": keys[1].to_string(),
|
"newAccount": keys[2].to_string(),
|
||||||
"lamports": lamports,
|
"lamports": lamports,
|
||||||
"base": keys[2].to_string(),
|
"base": keys[1].to_string(),
|
||||||
"seed": seed,
|
"seed": seed,
|
||||||
"owner": keys[3].to_string(),
|
"owner": keys[3].to_string(),
|
||||||
"space": space,
|
"space": space,
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
assert!(parse_system(&message.instructions[0], &keys[0..2]).is_err());
|
|
||||||
|
let seed = "test_seed";
|
||||||
|
let instruction = system_instruction::create_account_with_seed(
|
||||||
|
&keys[0], &keys[1], &keys[0], seed, lamports, space, &keys[3],
|
||||||
|
);
|
||||||
|
let message = Message::new(&[instruction], None);
|
||||||
|
assert_eq!(
|
||||||
|
parse_system(&message.instructions[0], &keys[0..2]).unwrap(),
|
||||||
|
ParsedInstructionEnum {
|
||||||
|
instruction_type: "createAccountWithSeed".to_string(),
|
||||||
|
info: json!({
|
||||||
|
"source": keys[0].to_string(),
|
||||||
|
"newAccount": keys[1].to_string(),
|
||||||
|
"lamports": lamports,
|
||||||
|
"base": keys[0].to_string(),
|
||||||
|
"seed": seed,
|
||||||
|
"owner": keys[3].to_string(),
|
||||||
|
"space": space,
|
||||||
|
}),
|
||||||
|
}
|
||||||
|
);
|
||||||
|
assert!(parse_system(&message.instructions[0], &keys[0..1]).is_err());
|
||||||
|
|
||||||
let instruction = system_instruction::allocate(&keys[0], space);
|
let instruction = system_instruction::allocate(&keys[0], space);
|
||||||
let message = Message::new(&[instruction], None);
|
let message = Message::new(&[instruction], None);
|
||||||
|
|
Loading…
Reference in New Issue