Skip to content

Commit 04576df

Browse files
authored
fix(message-buffer): address PR feedback from 779, update tests (#784)
* fix(message-buffer): address PR feedback from 779, update tests Add new unit test for reading with cursor, update test setup * refactor(message-buffer): refactor test methods, add big endian doc on MessageBuffer
1 parent d16594c commit 04576df

File tree

8 files changed

+160
-103
lines changed

8 files changed

+160
-103
lines changed

message_buffer/Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

message_buffer/programs/message_buffer/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,6 @@ default = []
1919
anchor-lang = { version = "0.27.0" }
2020
# needed for the new #[account(zero_copy)] in anchor 0.27.0
2121
bytemuck = { version = "1.4.0", features = ["derive", "min_const_generics"]}
22+
23+
[dev-dependencies]
24+
byteorder = "1.4.3"

message_buffer/programs/message_buffer/src/instructions/create_buffer.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,9 @@ pub fn create_buffer<'info>(
7575
*message_buffer = MessageBuffer::new(bump);
7676
}
7777
loader.exit(&crate::ID)?;
78+
} else {
79+
// FIXME: change this to be emit!(Event)
80+
msg!("Buffer account already initialized");
7881
}
7982

8083
Ok(())

message_buffer/programs/message_buffer/src/instructions/delete_buffer.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use {
22
crate::{
3-
instructions::verify_message_buffer,
43
state::*,
54
MessageBufferError,
65
MESSAGE,
@@ -23,7 +22,7 @@ pub fn delete_buffer<'info>(
2322
.whitelist
2423
.is_allowed_program_auth(&allowed_program_auth)?;
2524

26-
verify_message_buffer(message_buffer_account_info)?;
25+
MessageBuffer::check_discriminator(message_buffer_account_info)?;
2726

2827
let expected_key = Pubkey::create_program_address(
2928
&[
Lines changed: 6 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
1-
use {
2-
crate::{
3-
state::MessageBuffer,
4-
MessageBufferError,
5-
},
6-
anchor_lang::{
7-
prelude::*,
8-
system_program,
9-
Discriminator,
10-
},
1+
use anchor_lang::{
2+
prelude::*,
3+
system_program,
114
};
125
pub use {
136
create_buffer::*,
@@ -23,34 +16,12 @@ mod put_all;
2316
mod resize_buffer;
2417

2518
// String constants for deriving PDAs.
19+
//
2620
// An authorized program's message buffer will have PDA seeds [authorized_program_pda, MESSAGE, base_account_key],
27-
// where authorized_program_pda is the
21+
// where authorized_program_pda is the where `allowed_program_auth`
22+
// is the whitelisted pubkey who authorized this call.
2823
pub const MESSAGE: &str = "message";
29-
pub const FUND: &str = "fund";
30-
3124

3225
pub fn is_uninitialized_account(ai: &AccountInfo) -> bool {
3326
ai.data_is_empty() && ai.owner == &system_program::ID
3427
}
35-
36-
/// Verify message buffer account is initialized and has the correct discriminator.
37-
///
38-
/// Note: manually checking because using anchor's `AccountLoader.load()`
39-
/// will panic since the `AccountInfo.data_len()` will not match the
40-
/// size of the `MessageBuffer` since the `MessageBuffer` struct does not
41-
/// include the messages.
42-
pub fn verify_message_buffer(message_buffer_account_info: &AccountInfo) -> Result<()> {
43-
if is_uninitialized_account(message_buffer_account_info) {
44-
return err!(MessageBufferError::MessageBufferUninitialized);
45-
}
46-
let data = message_buffer_account_info.try_borrow_data()?;
47-
if data.len() < MessageBuffer::discriminator().len() {
48-
return Err(ErrorCode::AccountDiscriminatorNotFound.into());
49-
}
50-
51-
let disc_bytes = &data[0..8];
52-
if disc_bytes != &MessageBuffer::discriminator() {
53-
return Err(ErrorCode::AccountDiscriminatorMismatch.into());
54-
}
55-
Ok(())
56-
}

message_buffer/programs/message_buffer/src/instructions/put_all.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use {
22
crate::{
3-
instructions::verify_message_buffer,
43
state::*,
54
MessageBufferError,
65
},
@@ -20,7 +19,7 @@ pub fn put_all<'info>(
2019
.first()
2120
.ok_or(MessageBufferError::MessageBufferNotProvided)?;
2221

23-
verify_message_buffer(message_buffer_account_info)?;
22+
MessageBuffer::check_discriminator(message_buffer_account_info)?;
2423

2524
let account_data = &mut message_buffer_account_info.try_borrow_mut_data()?;
2625
let header_end_index = mem::size_of::<MessageBuffer>() + 8;

message_buffer/programs/message_buffer/src/instructions/resize_buffer.rs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
use {
22
crate::{
3-
instructions::verify_message_buffer,
43
state::*,
54
MessageBufferError,
65
MESSAGE,
@@ -30,7 +29,7 @@ pub fn resize_buffer<'info>(
3029
ctx.accounts
3130
.whitelist
3231
.is_allowed_program_auth(&allowed_program_auth)?;
33-
verify_message_buffer(message_buffer_account_info)?;
32+
MessageBuffer::check_discriminator(message_buffer_account_info)?;
3433

3534
require_gte!(
3635
target_size,
@@ -62,7 +61,10 @@ pub fn resize_buffer<'info>(
6261
MessageBufferError::InvalidPDA
6362
);
6463

65-
if target_size_delta > 0 {
64+
// allow for delta == 0 in case Rent requirements have changed
65+
// and additional lamports need to be transferred.
66+
// the realloc step will be a no-op in this case.
67+
if target_size_delta >= 0 {
6668
let target_rent = Rent::get()?.minimum_balance(target_size);
6769
if message_buffer_account_info.lamports() < target_rent {
6870
system_program::transfer(

0 commit comments

Comments
 (0)