Skip to content

Commit 472feca

Browse files
authored
chore: programs cleanup (#1581)
* chore: rename light-utils -> light-compressed-account, move account checks to light-account-checks * chore: compile system program without readonly feature and warnings * chore: rename insert nullify instruction data, remove insert queues context struct * chore: remove account compression program context * chore: add docs insert into queues * test: reactivate cpi context tests * test: add insert into queues instruction data, fix account compression test compilation
1 parent 9169ca3 commit 472feca

File tree

31 files changed

+1126
-1066
lines changed

31 files changed

+1126
-1066
lines changed

program-libs/account-checks/src/error.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use thiserror::Error;
22

3-
#[derive(Debug, Error, PartialEq)]
3+
#[derive(Debug, Clone, Copy, Error, PartialEq)]
44
pub enum AccountError {
55
#[error("Account owned by wrong program.")]
66
AccountOwnedByWrongProgram,
@@ -20,6 +20,8 @@ pub enum AccountError {
2020
InvalidAccountBalance,
2121
#[error("Failed to borrow rent sysvar.")]
2222
FailedBorrowRentSysvar,
23+
#[error("Invalid Signer")]
24+
InvalidSigner,
2325
}
2426

2527
// TODO: reconfigure error codes
@@ -35,6 +37,7 @@ impl From<AccountError> for u32 {
3537
AccountError::AlreadyInitialized => 12012,
3638
AccountError::InvalidAccountBalance => 12013,
3739
AccountError::FailedBorrowRentSysvar => 12014,
40+
AccountError::InvalidSigner => 12015,
3841
}
3942
}
4043
}

program-libs/compressed-account/src/event.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use borsh::{BorshDeserialize, BorshSerialize};
22
use light_zero_copy::{borsh::Deserialize, errors::ZeroCopyError};
33
use solana_program::pubkey::Pubkey;
44

5-
use super::{discriminators::*, insert_into_queues::AppendNullifyCreateAddressInputsIndexer};
5+
use super::{discriminators::*, insert_into_queues::InsertIntoQueuesInstructionData};
66
use crate::instruction_data::{
77
data::OutputCompressedAccountWithPackedContext,
88
zero_copy::{
@@ -116,7 +116,7 @@ pub fn match_account_compression_program_instruction(
116116
match instruction_discriminator {
117117
DISCRIMINATOR_INSERT_INTO_QUEUES => {
118118
let (_, instruction) = instruction.split_at(12);
119-
let (data, _) = AppendNullifyCreateAddressInputsIndexer::zero_copy_at(instruction)?;
119+
let (data, _) = InsertIntoQueuesInstructionData::zero_copy_at(instruction)?;
120120
event.input_compressed_account_hashes =
121121
data.nullifiers.iter().map(|x| x.account_hash).collect();
122122
event.output_compressed_account_hashes = data.leaves.iter().map(|x| x.leaf).collect();
@@ -140,7 +140,7 @@ pub fn match_account_compression_program_instruction(
140140
.iter_mut()
141141
.zip(data.leaves.iter())
142142
.for_each(|(x, y)| {
143-
x.merkle_tree_index = y.tree_account_index;
143+
x.merkle_tree_index = y.account_index;
144144
});
145145
data.addresses.iter().for_each(|x| {
146146
if x.tree_index == x.queue_index {

program-libs/compressed-account/src/insert_into_queues.rs

Lines changed: 96 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ impl InsertNullifierInput {
3636
KnownLayout, IntoBytes, Immutable, Copy, Clone, FromBytes, PartialEq, Debug, Unaligned,
3737
)]
3838
pub struct AppendLeavesInput {
39-
pub tree_account_index: u8,
39+
pub account_index: u8,
4040
pub leaf: [u8; 32],
4141
}
4242
#[repr(C)]
@@ -60,26 +60,33 @@ pub struct MerkleTreeSequenceNumber {
6060
}
6161

6262
#[derive(Debug, Clone)]
63-
pub struct AppendNullifyCreateAddressInputsIndexer<'a> {
64-
meta: Ref<&'a [u8], AppendNullifyCreateAddressInputsMeta>,
63+
pub struct InsertIntoQueuesInstructionData<'a> {
64+
meta: Ref<&'a [u8], InsertIntoQueuesInstructionDataMeta>,
6565
pub leaves: ZeroCopySlice<'a, u8, AppendLeavesInput, false>,
6666
pub nullifiers: ZeroCopySlice<'a, u8, InsertNullifierInput, false>,
6767
pub addresses: ZeroCopySlice<'a, u8, InsertAddressInput, false>,
6868
pub sequence_numbers: ZeroCopySlice<'a, u8, MerkleTreeSequenceNumber, false>,
6969
pub output_leaf_indices: ZeroCopySlice<'a, u8, U32, false>,
7070
}
71-
impl Deref for AppendNullifyCreateAddressInputsIndexer<'_> {
72-
type Target = AppendNullifyCreateAddressInputsMeta;
71+
72+
impl InsertIntoQueuesInstructionData<'_> {
73+
pub fn is_invoked_by_program(&self) -> bool {
74+
self.meta.is_invoked_by_program == 1
75+
}
76+
}
77+
78+
impl Deref for InsertIntoQueuesInstructionData<'_> {
79+
type Target = InsertIntoQueuesInstructionDataMeta;
7380

7481
fn deref(&self) -> &Self::Target {
7582
&self.meta
7683
}
7784
}
7885

79-
impl<'a> Deserialize<'a> for AppendNullifyCreateAddressInputsIndexer<'a> {
86+
impl<'a> Deserialize<'a> for InsertIntoQueuesInstructionData<'a> {
8087
type Output = Self;
8188
fn zero_copy_at(bytes: &'a [u8]) -> std::result::Result<(Self, &'a [u8]), ZeroCopyError> {
82-
let (meta, bytes) = Ref::<&[u8], AppendNullifyCreateAddressInputsMeta>::from_prefix(bytes)?;
89+
let (meta, bytes) = Ref::<&[u8], InsertIntoQueuesInstructionDataMeta>::from_prefix(bytes)?;
8390

8491
let (leaves, bytes) = ZeroCopySlice::<u8, AppendLeavesInput, false>::from_bytes_at(bytes)?;
8592

@@ -94,7 +101,7 @@ impl<'a> Deserialize<'a> for AppendNullifyCreateAddressInputsIndexer<'a> {
94101
let output_leaf_indices =
95102
ZeroCopySlice::<u8, zerocopy::little_endian::U32, false>::from_bytes(bytes)?;
96103
Ok((
97-
AppendNullifyCreateAddressInputsIndexer {
104+
InsertIntoQueuesInstructionData {
98105
meta,
99106
leaves,
100107
nullifiers,
@@ -111,7 +118,7 @@ impl<'a> Deserialize<'a> for AppendNullifyCreateAddressInputsIndexer<'a> {
111118
#[derive(
112119
FromBytes, IntoBytes, KnownLayout, Immutable, Copy, Clone, PartialEq, Debug, Unaligned,
113120
)]
114-
pub struct AppendNullifyCreateAddressInputsMeta {
121+
pub struct InsertIntoQueuesInstructionDataMeta {
115122
is_invoked_by_program: u8,
116123
pub bump: u8,
117124
pub num_queues: u8,
@@ -122,16 +129,16 @@ pub struct AppendNullifyCreateAddressInputsMeta {
122129
}
123130

124131
#[derive(Debug)]
125-
pub struct AppendNullifyCreateAddressInputs<'a> {
126-
meta: Ref<&'a mut [u8], AppendNullifyCreateAddressInputsMeta>,
132+
pub struct InsertIntoQueuesInstructionDataMut<'a> {
133+
meta: Ref<&'a mut [u8], InsertIntoQueuesInstructionDataMeta>,
127134
pub leaves: ZeroCopySliceMut<'a, u8, AppendLeavesInput, false>,
128135
pub nullifiers: ZeroCopySliceMut<'a, u8, InsertNullifierInput, false>,
129136
pub addresses: ZeroCopySliceMut<'a, u8, InsertAddressInput, false>,
130137
pub sequence_numbers: ZeroCopySliceMut<'a, u8, MerkleTreeSequenceNumber, false>,
131138
pub output_leaf_indices: ZeroCopySliceMut<'a, u8, U32, false>,
132139
}
133140

134-
impl<'a> AppendNullifyCreateAddressInputs<'a> {
141+
impl<'a> InsertIntoQueuesInstructionDataMut<'a> {
135142
pub fn is_invoked_by_program(&self) -> bool {
136143
self.meta.is_invoked_by_program == 1
137144
}
@@ -146,7 +153,7 @@ impl<'a> AppendNullifyCreateAddressInputs<'a> {
146153
addresses_capacity: u8,
147154
num_output_trees: u8,
148155
) -> usize {
149-
size_of::<AppendNullifyCreateAddressInputsMeta>()
156+
size_of::<InsertIntoQueuesInstructionDataMeta>()
150157
+ ZeroCopySliceMut::<u8, AppendLeavesInput, false>::required_size_for_capacity(
151158
leaves_capacity,
152159
)
@@ -170,7 +177,7 @@ impl<'a> AppendNullifyCreateAddressInputs<'a> {
170177
num_output_trees: u8,
171178
) -> std::result::Result<Self, ZeroCopyError> {
172179
let (meta, bytes) =
173-
Ref::<&mut [u8], AppendNullifyCreateAddressInputsMeta>::from_prefix(bytes)?;
180+
Ref::<&mut [u8], InsertIntoQueuesInstructionDataMeta>::from_prefix(bytes)?;
174181
let (leaves, bytes) =
175182
ZeroCopySliceMut::<u8, AppendLeavesInput, false>::new_at(leaves_capacity, bytes)?;
176183
let (nullifiers, bytes) = ZeroCopySliceMut::<u8, InsertNullifierInput, false>::new_at(
@@ -185,7 +192,7 @@ impl<'a> AppendNullifyCreateAddressInputs<'a> {
185192
bytes,
186193
)?;
187194
let output_leaf_indices = ZeroCopySliceMut::<u8, U32, false>::new(leaves_capacity, bytes)?;
188-
Ok(AppendNullifyCreateAddressInputs {
195+
Ok(InsertIntoQueuesInstructionDataMut {
189196
meta,
190197
leaves,
191198
nullifiers,
@@ -196,38 +203,89 @@ impl<'a> AppendNullifyCreateAddressInputs<'a> {
196203
}
197204
}
198205

199-
impl Deref for AppendNullifyCreateAddressInputs<'_> {
200-
type Target = AppendNullifyCreateAddressInputsMeta;
206+
impl Deref for InsertIntoQueuesInstructionDataMut<'_> {
207+
type Target = InsertIntoQueuesInstructionDataMeta;
201208

202209
fn deref(&self) -> &Self::Target {
203210
&self.meta
204211
}
205212
}
206213

207-
impl DerefMut for AppendNullifyCreateAddressInputs<'_> {
214+
impl DerefMut for InsertIntoQueuesInstructionDataMut<'_> {
208215
fn deref_mut(&mut self) -> &mut Self::Target {
209216
&mut self.meta
210217
}
211218
}
212219

213-
pub fn deserialize_insert_into_queues(
214-
bytes: &mut [u8],
215-
) -> std::result::Result<AppendNullifyCreateAddressInputs<'_>, ZeroCopyError> {
216-
let (meta, bytes) = Ref::<&mut [u8], AppendNullifyCreateAddressInputsMeta>::from_prefix(bytes)?;
217-
let (leaves, bytes) = ZeroCopySliceMut::<u8, AppendLeavesInput, false>::from_bytes_at(bytes)?;
218-
let (nullifiers, bytes) =
219-
ZeroCopySliceMut::<u8, InsertNullifierInput, false>::from_bytes_at(bytes)?;
220-
let (addresses, bytes) =
221-
ZeroCopySliceMut::<u8, InsertAddressInput, false>::from_bytes_at(bytes)?;
222-
let (sequence_numbers, bytes) =
223-
ZeroCopySliceMut::<u8, MerkleTreeSequenceNumber, false>::from_bytes_at(bytes)?;
224-
let output_leaf_indices = ZeroCopySliceMut::<u8, U32, false>::from_bytes(bytes)?;
225-
Ok(AppendNullifyCreateAddressInputs {
226-
meta,
227-
leaves,
228-
nullifiers,
229-
addresses,
230-
sequence_numbers,
231-
output_leaf_indices,
232-
})
220+
#[test]
221+
fn test_rnd_insert_into_queues_ix_data() {
222+
use rand::{rngs::StdRng, thread_rng, Rng, SeedableRng};
223+
let seed = thread_rng().gen();
224+
println!("seed {}", seed);
225+
let mut rng = StdRng::seed_from_u64(seed);
226+
let num_iters = 1000;
227+
228+
for _ in 0..num_iters {
229+
let leaves_capacity: u8 = rng.gen();
230+
let nullifiers_capacity: u8 = rng.gen();
231+
let addresses_capacity: u8 = rng.gen();
232+
let num_output_trees: u8 = rng.gen();
233+
let size = InsertIntoQueuesInstructionDataMut::required_size_for_capacity(
234+
leaves_capacity,
235+
nullifiers_capacity,
236+
addresses_capacity,
237+
num_output_trees,
238+
);
239+
let mut bytes = vec![0u8; size];
240+
let mut new_data = InsertIntoQueuesInstructionDataMut::new(
241+
&mut bytes,
242+
leaves_capacity,
243+
nullifiers_capacity,
244+
addresses_capacity,
245+
num_output_trees,
246+
)
247+
.unwrap();
248+
*new_data.meta = InsertIntoQueuesInstructionDataMeta {
249+
is_invoked_by_program: rng.gen(),
250+
bump: rng.gen(),
251+
num_queues: rng.gen(),
252+
num_output_queues: rng.gen(),
253+
start_output_appends: rng.gen(),
254+
num_address_queues: rng.gen(),
255+
tx_hash: rng.gen(),
256+
};
257+
for i in 0..leaves_capacity {
258+
new_data.leaves[i as usize] = AppendLeavesInput {
259+
account_index: rng.gen(),
260+
leaf: rng.gen(),
261+
};
262+
}
263+
for i in 0..nullifiers_capacity {
264+
new_data.nullifiers[i as usize] = InsertNullifierInput {
265+
account_hash: rng.gen(),
266+
leaf_index: rng.gen::<u32>().into(),
267+
prove_by_index: rng.gen(),
268+
tree_index: rng.gen(),
269+
queue_index: rng.gen(),
270+
};
271+
}
272+
for i in 0..addresses_capacity {
273+
new_data.addresses[i as usize] = InsertAddressInput {
274+
address: rng.gen(),
275+
tree_index: rng.gen(),
276+
queue_index: rng.gen(),
277+
};
278+
}
279+
let nullifiers = new_data.nullifiers.to_vec();
280+
let leaves = new_data.leaves.to_vec();
281+
let addresses = new_data.addresses.to_vec();
282+
let meta = *new_data.meta;
283+
let zero_copy = InsertIntoQueuesInstructionData::zero_copy_at(&bytes)
284+
.unwrap()
285+
.0;
286+
assert_eq!(meta, *zero_copy.meta);
287+
assert_eq!(leaves.as_slice(), zero_copy.leaves.as_slice());
288+
assert_eq!(nullifiers.as_slice(), zero_copy.nullifiers.as_slice());
289+
assert_eq!(addresses.as_slice(), zero_copy.addresses.as_slice());
290+
}
233291
}

program-tests/account-compression-test/tests/batched_merkle_tree_test.rs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use light_batched_merkle_tree::{
2525
};
2626
use light_compressed_account::{
2727
bigint::bigint_to_be_bytes_array, hash_chain::create_tx_hash,
28-
insert_into_queues::AppendNullifyCreateAddressInputs,
28+
insert_into_queues::InsertIntoQueuesInstructionDataMut,
2929
instruction_data::compressed_proof::CompressedProof,
3030
};
3131
use light_merkle_tree_metadata::errors::MerkleTreeMetadataError;
@@ -543,15 +543,15 @@ pub async fn perform_insert_into_output_queue(
543543
) -> Result<Signature, RpcError> {
544544
let mut bytes = vec![
545545
0u8;
546-
AppendNullifyCreateAddressInputs::required_size_for_capacity(
546+
InsertIntoQueuesInstructionDataMut::required_size_for_capacity(
547547
num_of_leaves as u8,
548548
0,
549549
0,
550550
1
551551
)
552552
];
553553
let mut ix_data =
554-
AppendNullifyCreateAddressInputs::new(&mut bytes, num_of_leaves as u8, 0, 0, 1).unwrap();
554+
InsertIntoQueuesInstructionDataMut::new(&mut bytes, num_of_leaves as u8, 0, 0, 1).unwrap();
555555
ix_data.num_output_queues = 1;
556556
for i in 0..num_of_leaves {
557557
let mut leaf = [0u8; 32];
@@ -729,15 +729,15 @@ pub async fn perform_insert_into_input_queue(
729729
});
730730
let mut bytes = vec![
731731
0u8;
732-
AppendNullifyCreateAddressInputs::required_size_for_capacity(
732+
InsertIntoQueuesInstructionDataMut::required_size_for_capacity(
733733
0,
734734
num_of_leaves as u8,
735735
0,
736736
1
737737
)
738738
];
739739
let mut ix_data =
740-
AppendNullifyCreateAddressInputs::new(&mut bytes, 0, num_of_leaves as u8, 0, 1).unwrap();
740+
InsertIntoQueuesInstructionDataMut::new(&mut bytes, 0, num_of_leaves as u8, 0, 1).unwrap();
741741
ix_data.num_queues = 1;
742742
for (i, ix_nf) in ix_data.nullifiers.iter_mut().enumerate() {
743743
ix_nf.account_hash = leaves[i];
@@ -1631,7 +1631,12 @@ async fn test_batch_address_merkle_trees() {
16311631
addresses.clone(),
16321632
)
16331633
.await;
1634-
assert_rpc_error(result, 0, ErrorCode::AccountDiscriminatorMismatch.into()).unwrap();
1634+
assert_rpc_error(
1635+
result,
1636+
0,
1637+
AccountCompressionErrorCode::AddressMerkleTreeAccountDiscriminatorMismatch.into(),
1638+
)
1639+
.unwrap();
16351640

16361641
let result = insert_addresses(
16371642
&mut context,
@@ -1640,7 +1645,12 @@ async fn test_batch_address_merkle_trees() {
16401645
addresses.clone(),
16411646
)
16421647
.await;
1643-
assert_rpc_error(result, 0, MerkleTreeMetadataError::InvalidTreeType.into()).unwrap();
1648+
assert_rpc_error(
1649+
result,
1650+
0,
1651+
AccountCompressionErrorCode::AddressMerkleTreeAccountDiscriminatorMismatch.into(),
1652+
)
1653+
.unwrap();
16441654
}
16451655
// fill address queue batch
16461656
{

0 commit comments

Comments
 (0)