@@ -23,70 +23,75 @@ pub fn derive_new_addresses<'info, 'a, 'b: 'a, const ADDRESS_ASSIGNMENT: bool>(
23
23
accounts : & [ AcpAccount < ' info > ] ,
24
24
) -> Result < ( ) > {
25
25
let mut seq_index = 0 ;
26
- let invoking_program_id_clone = context. invoking_program_id ;
26
+ let invoking_program_id_clone = context
27
+ . invoking_program_id
28
+ . ok_or ( SystemProgramError :: DeriveAddressError ) ?;
27
29
28
30
for ( i, new_address_params) in new_address_params. enumerate ( ) {
29
- let ( address, rollover_fee) =
30
- match & accounts[ new_address_params. address_merkle_tree_account_index ( ) as usize ] {
31
- AcpAccount :: AddressTree ( ( pubkey, _) ) => {
32
- cpi_ix_data. addresses [ i] . queue_index = context. get_index_or_insert (
33
- new_address_params. address_queue_index ( ) ,
34
- remaining_accounts,
35
- ) ;
36
- cpi_ix_data. addresses [ i] . tree_index = context. get_index_or_insert (
37
- new_address_params. address_merkle_tree_account_index ( ) ,
38
- remaining_accounts,
39
- ) ;
31
+ let ( address, rollover_fee) = match & accounts
32
+ . get ( new_address_params. address_merkle_tree_account_index ( ) as usize )
33
+ . ok_or ( SystemProgramError :: AddressAssignedAccountIndexOutOfBounds ) ?
34
+ {
35
+ AcpAccount :: AddressTree ( ( pubkey, _) ) => {
36
+ cpi_ix_data. addresses [ i] . queue_index = context. get_index_or_insert (
37
+ new_address_params. address_queue_index ( ) ,
38
+ remaining_accounts,
39
+ ) ;
40
+ cpi_ix_data. addresses [ i] . tree_index = context. get_index_or_insert (
41
+ new_address_params. address_merkle_tree_account_index ( ) ,
42
+ remaining_accounts,
43
+ ) ;
40
44
41
- (
42
- derive_address_legacy ( pubkey, & new_address_params. seed ( ) )
43
- . map_err ( ProgramError :: from) ?,
44
- context
45
- . get_legacy_merkle_context ( new_address_params. address_queue_index ( ) )
46
- . unwrap ( )
47
- . rollover_fee ,
48
- )
49
- }
50
- AcpAccount :: BatchedAddressTree ( tree) => {
51
- let invoking_program_id_bytes = if let Some ( ref bytes) = address_owners[ i] {
52
- Ok ( bytes. to_bytes ( ) )
53
- } else if let Some ( ref bytes) = invoking_program_id_clone {
54
- Ok ( * bytes)
55
- } else {
56
- Err ( SystemProgramError :: DeriveAddressError )
57
- } ?;
45
+ (
46
+ derive_address_legacy ( pubkey, & new_address_params. seed ( ) )
47
+ . map_err ( ProgramError :: from) ?,
48
+ context
49
+ . get_legacy_merkle_context ( new_address_params. address_queue_index ( ) )
50
+ . unwrap ( )
51
+ . rollover_fee ,
52
+ )
53
+ }
54
+ AcpAccount :: BatchedAddressTree ( tree) => {
55
+ let invoking_program_id_bytes = if let Some ( bytes) = & address_owners
56
+ . get ( i)
57
+ . ok_or ( SystemProgramError :: AddressAssignedAccountIndexOutOfBounds ) ?
58
+ {
59
+ bytes. to_bytes ( )
60
+ } else {
61
+ invoking_program_id_clone
62
+ } ;
58
63
59
- cpi_ix_data. addresses [ i] . tree_index = context. get_index_or_insert (
60
- new_address_params. address_merkle_tree_account_index ( ) ,
61
- remaining_accounts,
62
- ) ;
64
+ cpi_ix_data. addresses [ i] . tree_index = context. get_index_or_insert (
65
+ new_address_params. address_merkle_tree_account_index ( ) ,
66
+ remaining_accounts,
67
+ ) ;
63
68
64
- context. set_address_fee (
65
- tree. metadata . rollover_metadata . network_fee ,
66
- new_address_params. address_merkle_tree_account_index ( ) ,
67
- ) ;
69
+ context. set_address_fee (
70
+ tree. metadata . rollover_metadata . network_fee ,
71
+ new_address_params. address_merkle_tree_account_index ( ) ,
72
+ ) ;
68
73
69
- cpi_ix_data. insert_address_sequence_number (
70
- & mut seq_index,
71
- tree. pubkey ( ) ,
72
- tree. queue_batches . next_index ,
73
- ) ;
74
+ cpi_ix_data. insert_address_sequence_number (
75
+ & mut seq_index,
76
+ tree. pubkey ( ) ,
77
+ tree. queue_batches . next_index ,
78
+ ) ;
74
79
75
- (
76
- derive_address (
77
- & new_address_params. seed ( ) ,
78
- & tree. pubkey ( ) . to_bytes ( ) ,
79
- & invoking_program_id_bytes,
80
- ) ,
81
- tree. metadata . rollover_metadata . rollover_fee ,
82
- )
83
- }
84
- _ => {
85
- return Err ( ProgramError :: from (
86
- SystemProgramError :: AddressMerkleTreeAccountDiscriminatorMismatch ,
87
- ) )
88
- }
89
- } ;
80
+ (
81
+ derive_address (
82
+ & new_address_params. seed ( ) ,
83
+ & tree. pubkey ( ) . to_bytes ( ) ,
84
+ & invoking_program_id_bytes,
85
+ ) ,
86
+ tree. metadata . rollover_metadata . rollover_fee ,
87
+ )
88
+ }
89
+ _ => {
90
+ return Err ( ProgramError :: from (
91
+ SystemProgramError :: AddressMerkleTreeAccountDiscriminatorMismatch ,
92
+ ) )
93
+ }
94
+ } ;
90
95
if !ADDRESS_ASSIGNMENT {
91
96
// We are inserting addresses into two vectors to avoid unwrapping
92
97
// the option in following functions.
0 commit comments