@@ -65,7 +65,9 @@ pub struct InsertIntoQueuesInstructionData<'a> {
65
65
pub leaves : ZeroCopySlice < ' a , u8 , AppendLeavesInput , false > ,
66
66
pub nullifiers : ZeroCopySlice < ' a , u8 , InsertNullifierInput , false > ,
67
67
pub addresses : ZeroCopySlice < ' a , u8 , InsertAddressInput , false > ,
68
- pub sequence_numbers : ZeroCopySlice < ' a , u8 , MerkleTreeSequenceNumber , false > ,
68
+ pub output_sequence_numbers : ZeroCopySlice < ' a , u8 , MerkleTreeSequenceNumber , false > ,
69
+ pub input_sequence_numbers : ZeroCopySlice < ' a , u8 , MerkleTreeSequenceNumber , false > ,
70
+ pub address_sequence_numbers : ZeroCopySlice < ' a , u8 , MerkleTreeSequenceNumber , false > ,
69
71
pub output_leaf_indices : ZeroCopySlice < ' a , u8 , U32 , false > ,
70
72
}
71
73
@@ -95,9 +97,12 @@ impl<'a> Deserialize<'a> for InsertIntoQueuesInstructionData<'a> {
95
97
96
98
let ( addresses, bytes) =
97
99
ZeroCopySlice :: < u8 , InsertAddressInput , false > :: from_bytes_at ( bytes) ?;
98
- let ( sequence_numbers, bytes) =
100
+ let ( output_sequence_numbers, bytes) =
101
+ ZeroCopySlice :: < u8 , MerkleTreeSequenceNumber , false > :: from_bytes_at ( bytes) ?;
102
+ let ( input_sequence_numbers, bytes) =
103
+ ZeroCopySlice :: < u8 , MerkleTreeSequenceNumber , false > :: from_bytes_at ( bytes) ?;
104
+ let ( address_sequence_numbers, bytes) =
99
105
ZeroCopySlice :: < u8 , MerkleTreeSequenceNumber , false > :: from_bytes_at ( bytes) ?;
100
-
101
106
let output_leaf_indices =
102
107
ZeroCopySlice :: < u8 , zerocopy:: little_endian:: U32 , false > :: from_bytes ( bytes) ?;
103
108
Ok ( (
@@ -106,7 +111,9 @@ impl<'a> Deserialize<'a> for InsertIntoQueuesInstructionData<'a> {
106
111
leaves,
107
112
nullifiers,
108
113
addresses,
109
- sequence_numbers,
114
+ output_sequence_numbers,
115
+ input_sequence_numbers,
116
+ address_sequence_numbers,
110
117
output_leaf_indices,
111
118
} ,
112
119
bytes,
@@ -134,7 +141,9 @@ pub struct InsertIntoQueuesInstructionDataMut<'a> {
134
141
pub leaves : ZeroCopySliceMut < ' a , u8 , AppendLeavesInput , false > ,
135
142
pub nullifiers : ZeroCopySliceMut < ' a , u8 , InsertNullifierInput , false > ,
136
143
pub addresses : ZeroCopySliceMut < ' a , u8 , InsertAddressInput , false > ,
137
- pub sequence_numbers : ZeroCopySliceMut < ' a , u8 , MerkleTreeSequenceNumber , false > ,
144
+ pub output_sequence_numbers : ZeroCopySliceMut < ' a , u8 , MerkleTreeSequenceNumber , false > ,
145
+ pub input_sequence_numbers : ZeroCopySliceMut < ' a , u8 , MerkleTreeSequenceNumber , false > ,
146
+ pub address_sequence_numbers : ZeroCopySliceMut < ' a , u8 , MerkleTreeSequenceNumber , false > ,
138
147
pub output_leaf_indices : ZeroCopySliceMut < ' a , u8 , U32 , false > ,
139
148
}
140
149
@@ -147,11 +156,35 @@ impl<'a> InsertIntoQueuesInstructionDataMut<'a> {
147
156
self . meta . is_invoked_by_program = value as u8 ;
148
157
}
149
158
159
+ pub fn insert_input_sequence_number ( & mut self , index : & mut usize , pubkey : & Pubkey , seq : u64 ) {
160
+ Self :: insert_sequence_number ( & mut self . input_sequence_numbers , index, pubkey, seq) ;
161
+ }
162
+
163
+ pub fn insert_address_sequence_number ( & mut self , index : & mut usize , pubkey : & Pubkey , seq : u64 ) {
164
+ Self :: insert_sequence_number ( & mut self . address_sequence_numbers , index, pubkey, seq) ;
165
+ }
166
+
167
+ fn insert_sequence_number (
168
+ sequence_numbers : & mut ZeroCopySliceMut < ' a , u8 , MerkleTreeSequenceNumber , false > ,
169
+ index : & mut usize ,
170
+ pubkey : & Pubkey ,
171
+ seq : u64 ,
172
+ ) {
173
+ let pos = sequence_numbers. iter ( ) . position ( |x| x. pubkey == * pubkey) ;
174
+ if pos. is_none ( ) {
175
+ sequence_numbers[ * index] . pubkey = * pubkey;
176
+ sequence_numbers[ * index] . seq = seq. into ( ) ;
177
+ * index += 1 ;
178
+ }
179
+ }
180
+
150
181
pub fn required_size_for_capacity (
151
182
leaves_capacity : u8 ,
152
183
nullifiers_capacity : u8 ,
153
184
addresses_capacity : u8 ,
154
185
num_output_trees : u8 ,
186
+ num_input_trees : u8 ,
187
+ num_address_trees : u8 ,
155
188
) -> usize {
156
189
size_of :: < InsertIntoQueuesInstructionDataMeta > ( )
157
190
+ ZeroCopySliceMut :: < u8 , AppendLeavesInput , false > :: required_size_for_capacity (
@@ -166,6 +199,12 @@ impl<'a> InsertIntoQueuesInstructionDataMut<'a> {
166
199
+ ZeroCopySliceMut :: < u8 , MerkleTreeSequenceNumber , false > :: required_size_for_capacity (
167
200
num_output_trees,
168
201
)
202
+ + ZeroCopySliceMut :: < u8 , MerkleTreeSequenceNumber , false > :: required_size_for_capacity (
203
+ num_input_trees,
204
+ )
205
+ + ZeroCopySliceMut :: < u8 , MerkleTreeSequenceNumber , false > :: required_size_for_capacity (
206
+ num_address_trees,
207
+ )
169
208
+ ZeroCopySliceMut :: < u8 , U32 , false > :: required_size_for_capacity ( leaves_capacity)
170
209
}
171
210
@@ -175,6 +214,8 @@ impl<'a> InsertIntoQueuesInstructionDataMut<'a> {
175
214
nullifiers_capacity : u8 ,
176
215
addresses_capacity : u8 ,
177
216
num_output_trees : u8 ,
217
+ num_input_trees : u8 ,
218
+ num_address_trees : u8 ,
178
219
) -> std:: result:: Result < Self , ZeroCopyError > {
179
220
let ( meta, bytes) =
180
221
Ref :: < & mut [ u8 ] , InsertIntoQueuesInstructionDataMeta > :: from_prefix ( bytes) ?;
@@ -186,18 +227,30 @@ impl<'a> InsertIntoQueuesInstructionDataMut<'a> {
186
227
) ?;
187
228
let ( addresses, bytes) =
188
229
ZeroCopySliceMut :: < u8 , InsertAddressInput , false > :: new_at ( addresses_capacity, bytes) ?;
189
- let ( sequence_numbers, bytes) =
190
- ZeroCopySliceMut :: < u8 , MerkleTreeSequenceNumber , false > :: new_at (
191
- num_output_trees,
192
- bytes,
193
- ) ?;
230
+ let ( output_sequence_numbers, bytes) = ZeroCopySliceMut :: <
231
+ u8 ,
232
+ MerkleTreeSequenceNumber ,
233
+ false ,
234
+ > :: new_at ( num_output_trees, bytes) ?;
235
+ let ( input_sequence_numbers, bytes) = ZeroCopySliceMut :: <
236
+ u8 ,
237
+ MerkleTreeSequenceNumber ,
238
+ false ,
239
+ > :: new_at ( num_input_trees, bytes) ?;
240
+ let ( address_sequence_numbers, bytes) = ZeroCopySliceMut :: <
241
+ u8 ,
242
+ MerkleTreeSequenceNumber ,
243
+ false ,
244
+ > :: new_at ( num_address_trees, bytes) ?;
194
245
let output_leaf_indices = ZeroCopySliceMut :: < u8 , U32 , false > :: new ( leaves_capacity, bytes) ?;
195
246
Ok ( InsertIntoQueuesInstructionDataMut {
196
247
meta,
197
248
leaves,
198
249
nullifiers,
199
250
addresses,
200
- sequence_numbers,
251
+ output_sequence_numbers,
252
+ input_sequence_numbers,
253
+ address_sequence_numbers,
201
254
output_leaf_indices,
202
255
} )
203
256
}
@@ -230,11 +283,15 @@ fn test_rnd_insert_into_queues_ix_data() {
230
283
let nullifiers_capacity: u8 = rng. gen ( ) ;
231
284
let addresses_capacity: u8 = rng. gen ( ) ;
232
285
let num_output_trees: u8 = rng. gen ( ) ;
286
+ let num_input_trees: u8 = rng. gen ( ) ;
287
+ let num_address_trees: u8 = rng. gen ( ) ;
233
288
let size = InsertIntoQueuesInstructionDataMut :: required_size_for_capacity (
234
289
leaves_capacity,
235
290
nullifiers_capacity,
236
291
addresses_capacity,
237
292
num_output_trees,
293
+ num_input_trees,
294
+ num_address_trees,
238
295
) ;
239
296
let mut bytes = vec ! [ 0u8 ; size] ;
240
297
let mut new_data = InsertIntoQueuesInstructionDataMut :: new (
@@ -243,6 +300,8 @@ fn test_rnd_insert_into_queues_ix_data() {
243
300
nullifiers_capacity,
244
301
addresses_capacity,
245
302
num_output_trees,
303
+ num_input_trees,
304
+ num_address_trees,
246
305
)
247
306
. unwrap ( ) ;
248
307
* new_data. meta = InsertIntoQueuesInstructionDataMeta {
0 commit comments