Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,662 changes: 1,238 additions & 424 deletions Cargo.lock

Large diffs are not rendered by default.

15 changes: 8 additions & 7 deletions program/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,14 @@ solana-program-log = { version = "1.0", default-features = false }
solana-security-txt = "1.1.3"

[dev-dependencies]
mollusk-svm = { version = "0.4" }
solana-account = "2.2.1"
solana-instruction = "2.2.1"
solana-program-error = "2.2.1"
solana-pubkey = "2.2.1"
solana-rent = "2.2.1"
solana-sdk-ids = "2.2.1"
mollusk-svm = "0.13"
solana-account = "3.4"
solana-instruction = "3.2"
solana-logger = "3.0"
solana-program-error = "3.0"
solana-pubkey = "4.1"
solana-rent = "3.1"
solana-sdk-ids = "3.1"

[features]
logging = []
74 changes: 30 additions & 44 deletions program/src/processor/allocate.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
use pinocchio::{
cpi::{Seed, Signer},
error::ProgramError,
AccountView, ProgramResult,
};
use pinocchio_system::instructions::{Allocate, Assign};
use pinocchio::{cpi::Signer, error::ProgramError, instruction::seeds, AccountView, ProgramResult};
use pinocchio_system::instructions::{Assign, CreateAccountAllowPrefund};

use crate::{
error::ProgramMetadataError,
Expand Down Expand Up @@ -90,28 +86,38 @@ pub fn allocate(accounts: &mut [AccountView], instruction_data: &[u8]) -> Progra

match (is_pda, canonical) {
// canonical
(true, true) => allocate_and_assign(
buffer,
(true, true) => CreateAccountAllowPrefund {
to: buffer,
space,
&[
Seed::from(program.address().as_array()),
Seed::from(instruction_data),
Seed::from(&[bump]),
],
)?,
owner: &crate::ID,
funding: None,
}
.invoke_signed(&[Signer::from(&seeds!(
program.address().as_ref(),
instruction_data,
&[bump]
))])?,
// non-canonical
(true, false) => allocate_and_assign(
buffer,
(true, false) => CreateAccountAllowPrefund {
to: buffer,
space,
&[
Seed::from(program.address().as_array()),
Seed::from(authority.address().as_array()),
Seed::from(instruction_data),
Seed::from(&[bump]),
],
)?,
owner: &crate::ID,
funding: None,
}
.invoke_signed(&[Signer::from(&seeds!(
program.address().as_ref(),
authority.address().as_ref(),
instruction_data,
&[bump]
))])?,
// keypair
(false, _) => allocate_and_assign(buffer, space, &[])?,
(false, _) => CreateAccountAllowPrefund {
to: buffer,
space,
owner: &crate::ID,
funding: None,
}
.invoke()?,
}
}
n if n >= Buffer::LEN => {
Expand Down Expand Up @@ -163,23 +169,3 @@ pub fn allocate(accounts: &mut [AccountView], instruction_data: &[u8]) -> Progra

Ok(())
}

/// Allocates the space for the account and assigns it to the program.
///
/// When the `account` is a PDA, the `seeds` are used to create the signer.
#[inline(always)]
fn allocate_and_assign(account: &AccountView, space: u64, seeds: &[Seed]) -> ProgramResult {
let signer: &[Signer] = if seeds.is_empty() {
&[]
} else {
&[Signer::from(seeds)]
};

Allocate { account, space }.invoke_signed(signer)?;

Assign {
account,
owner: &crate::ID,
}
.invoke_signed(signer)
}
12 changes: 4 additions & 8 deletions program/src/processor/initialize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ use pinocchio::{
instruction::seeds,
AccountView, Address, ProgramResult,
};
use pinocchio_system::instructions::{Allocate, Assign};
use pinocchio_system::instructions::CreateAccountAllowPrefund;

use crate::{
processor::derive_program_address,
Expand Down Expand Up @@ -139,15 +139,11 @@ pub fn initialize(accounts: &mut [AccountView], instruction_data: &[u8]) -> Prog
// Instruction data is limited to ~1232 bytes.
let space = Header::LEN + remaining_data.len();

Allocate {
account: metadata,
CreateAccountAllowPrefund {
to: metadata,
space: space as u64,
}
.invoke_signed(signer)?;

Assign {
account: metadata,
owner: &crate::ID,
funding: None,
}
.invoke_signed(signer)?;

Expand Down
8 changes: 0 additions & 8 deletions program/tests/allocate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,6 @@ fn test_allocate_keypair() {
),
&[
(buffer_key, buffer_account),
(PROGRAM_ID, Account::default()),
keyed_account_for_system_program(),
],
);
Expand All @@ -148,7 +147,6 @@ fn test_allocate_with_empty_account() {
),
&[
(buffer_key, buffer_account),
(PROGRAM_ID, Account::default()),
keyed_account_for_system_program(),
],
);
Expand All @@ -168,7 +166,6 @@ fn test_allocate_with_unsufficient_length() {
),
&[
(buffer_key, buffer_account),
(PROGRAM_ID, Account::default()),
keyed_account_for_system_program(),
],
);
Expand Down Expand Up @@ -287,7 +284,6 @@ fn test_allocate_with_funded_keypair_account() {
),
&[
(buffer_key, buffer_account),
(PROGRAM_ID, Account::default()),
keyed_account_for_system_program(),
],
);
Expand All @@ -313,7 +309,6 @@ fn test_allocate_with_allocated_keypair_account() {
),
&[
(buffer_key, buffer_account),
(PROGRAM_ID, Account::default()),
keyed_account_for_system_program(),
],
);
Expand Down Expand Up @@ -412,7 +407,6 @@ fn test_allocate_with_unfunded_account() {
),
&[
(buffer_key, buffer_account),
(PROGRAM_ID, Account::default()),
keyed_account_for_system_program(),
],
);
Expand All @@ -434,7 +428,6 @@ fn fail_allocate_keypair_with_seed() {
),
&[
(buffer_key, buffer_account),
(PROGRAM_ID, Account::default()),
keyed_account_for_system_program(),
],
);
Expand Down Expand Up @@ -541,7 +534,6 @@ fn fail_allocate_already_initialized_buffer() {
],
&[
(buffer_key, buffer_account),
(PROGRAM_ID, Account::default()),
keyed_account_for_system_program(),
],
);
Expand Down
6 changes: 0 additions & 6 deletions program/tests/close.rs
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,6 @@ fn test_close_metadata() {
],
&[
(metadata_key, metadata_account),
(PROGRAM_ID, Account::default()),
(authority_key, Account::default()),
(program_key, program_account),
(program_data_key, program_data_account),
Expand Down Expand Up @@ -120,7 +119,6 @@ fn test_close_buffer() {
],
&[
(buffer_key, buffer_account),
(PROGRAM_ID, Account::default()),
(destination_key, Account::default()),
keyed_account_for_system_program(),
],
Expand Down Expand Up @@ -155,7 +153,6 @@ fn fail_close_with_wrong_authority() {
],
&[
(buffer_key, buffer_account),
(PROGRAM_ID, Account::default()),
(wrong_authority_key, Account::default()),
(destination_key, Account::default()),
keyed_account_for_system_program(),
Expand All @@ -175,7 +172,6 @@ fn fail_close_uninitialized_account() {
),
&[
(account_key, Account::default()),
(PROGRAM_ID, Account::default()),
(destination_key, Account::default()),
],
);
Expand All @@ -194,7 +190,6 @@ fn fail_close_account_with_empty_discriminator() {
),
&[
(account_key, account),
(PROGRAM_ID, Account::default()),
(destination_key, Account::default()),
],
);
Expand Down Expand Up @@ -265,7 +260,6 @@ fn fail_close_immutable_metadata() {
],
&[
(metadata_key, metadata_account),
(PROGRAM_ID, Account::default()),
(authority_key, Account::default()),
(program_key, program_account),
(program_data_key, program_data_account),
Expand Down
13 changes: 2 additions & 11 deletions program/tests/extend.rs
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,6 @@ fn test_extend_keypair_buffer() {
],
&[
(buffer_key, buffer_account),
(PROGRAM_ID, Account::default()),
keyed_account_for_system_program(),
],
);
Expand Down Expand Up @@ -255,7 +254,6 @@ fn test_extend_metadata() {
],
&[
(metadata_key, metadata_account),
(PROGRAM_ID, Account::default()),
(authority_key, Account::default()),
(program_key, program_account),
(program_data_key, program_data_account),
Expand Down Expand Up @@ -292,7 +290,6 @@ fn fail_extend_with_wrong_authority() {
],
&[
(buffer_key, buffer_account),
(PROGRAM_ID, Account::default()),
(wrong_authority_key, Account::default()),
keyed_account_for_system_program(),
],
Expand All @@ -308,10 +305,7 @@ fn fail_extend_uninitialized_account() {
&extend(&account_key, &account_key, None, None, EXTEND_LENGTH as u16),
&[Check::err(ProgramError::InvalidAccountData)],
),
&[
(account_key, Account::default()),
(PROGRAM_ID, Account::default()),
],
&[(account_key, Account::default())],
);
}

Expand All @@ -326,9 +320,6 @@ fn fail_extend_with_invalid_instruction_data() {
&instruction,
&[Check::err(ProgramError::InvalidInstructionData)],
),
&[
(buffer_key, Account::default()),
(PROGRAM_ID, Account::default()),
],
&[(buffer_key, Account::default())],
);
}
10 changes: 0 additions & 10 deletions program/tests/initialize.rs
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ fn test_initialize_canonical() {
),
&[
(metadata_key, metadata_account),
(PROGRAM_ID, Account::default()),
(authority_key, Account::default()),
(program_key, program_account),
(program_data_key, program_data_account),
Expand Down Expand Up @@ -118,7 +117,6 @@ fn test_initialize_non_canonical() {
),
&[
(metadata_key, metadata_account),
(PROGRAM_ID, Account::default()),
(authority_key, Account::default()),
(program_key, program_account),
(program_data_key, program_data_account),
Expand Down Expand Up @@ -198,7 +196,6 @@ fn test_initialize_from_buffer() {
],
&[
(metadata_key, metadata_account),
(PROGRAM_ID, Account::default()),
(authority_key, Account::default()),
(program_key, program_account),
(program_data_key, program_data_account),
Expand Down Expand Up @@ -255,7 +252,6 @@ fn fail_initialize_already_initialized_metadata() {
],
&[
(metadata_key, metadata_account),
(PROGRAM_ID, Account::default()),
(authority_key, Account::default()),
(program_key, program_account),
(program_data_key, program_data_account),
Expand Down Expand Up @@ -322,7 +318,6 @@ fn fail_initialize_from_buffer_with_instruction_data() {
],
&[
(metadata_key, buffer_account),
(PROGRAM_ID, Account::default()),
(authority_key, Account::default()),
(program_key, program_account),
(program_data_key, program_data_account),
Expand Down Expand Up @@ -368,7 +363,6 @@ fn fail_initialize_with_wrong_metadata_pda() {
(&instruction, &[Check::err(ProgramError::InvalidSeeds)]),
&[
(wrong_metadata_key, metadata_account),
(PROGRAM_ID, Account::default()),
(authority_key, Account::default()),
(program_key, program_account),
(program_data_key, program_data_account),
Expand Down Expand Up @@ -414,7 +408,6 @@ fn fail_initialize_unfunded_metadata() {
),
&[
(metadata_key, metadata_account),
(PROGRAM_ID, Account::default()),
(authority_key, Account::default()),
(program_key, program_account),
(program_data_key, program_data_account),
Expand Down Expand Up @@ -461,7 +454,6 @@ fn fail_initialize_without_data() {
),
&[
(metadata_key, metadata_account),
(PROGRAM_ID, Account::default()),
(authority_key, Account::default()),
(program_key, program_account),
(program_data_key, program_data_account),
Expand Down Expand Up @@ -508,7 +500,6 @@ fn fail_initialize_with_invalid_encoding() {
),
&[
(metadata_key, metadata_account),
(PROGRAM_ID, Account::default()),
(authority_key, Account::default()),
(program_key, program_account),
(program_data_key, program_data_account),
Expand Down Expand Up @@ -557,7 +548,6 @@ fn fail_initialize_external_data_with_wrong_length() {
),
&[
(metadata_key, metadata_account),
(PROGRAM_ID, Account::default()),
(authority_key, Account::default()),
(program_key, program_account),
(program_data_key, program_data_account),
Expand Down
Loading
Loading