1
1
use light_compressed_account:: Pubkey ;
2
2
use light_hasher:: { errors:: HasherError , sha256:: Sha256BE , Hasher , Poseidon } ;
3
3
use light_zero_copy:: { traits:: ZeroCopyAt , ZeroCopy , ZeroCopyMut } ;
4
+ use solana_msg:: msg;
4
5
use zerocopy:: IntoBytes ;
5
6
6
7
use crate :: {
@@ -124,8 +125,20 @@ where
124
125
125
126
// 5. Handle extensions if present
126
127
if let Some ( extensions) = extensions {
127
- let mut extension_hashchain = [ 0u8 ; 32 ] ;
128
- for extension in extensions {
128
+ let mut extension_hashchain = if let Some ( first_extension) = extensions. first ( ) {
129
+ if version == 0 {
130
+ first_extension. hash_with_hasher :: < Poseidon > ( & hashed_spl_mint, hash_cache)
131
+ } else if version == 1 {
132
+ first_extension. hash_with_hasher :: < Sha256BE > ( & hashed_spl_mint, hash_cache)
133
+ } else {
134
+ Err ( CTokenError :: InvalidTokenDataVersion . into ( ) )
135
+ } ?
136
+ } else {
137
+ msg ! ( "empty extensions" ) ;
138
+ return Err ( CTokenError :: InvalidTokenDataVersion . into ( ) ) ;
139
+ } ;
140
+
141
+ for extension in extensions. iter ( ) . skip ( 1 ) {
129
142
let extension_hash = if version == 0 {
130
143
extension. hash_with_hasher :: < Poseidon > ( & hashed_spl_mint, hash_cache)
131
144
} else if version == 1 {
@@ -181,7 +194,7 @@ impl CompressedMint {
181
194
version : u8 ,
182
195
) -> Result < [ u8 ; 32 ] , CTokenError > {
183
196
if version == 0 {
184
- Ok ( CompressedMint :: hash_with_hashed_values_inner :: < Poseidon > (
197
+ Ok ( CompressedMint :: hash_with_hashed_values_generic :: < Poseidon > (
185
198
hashed_spl_mint,
186
199
supply_bytes,
187
200
decimals,
@@ -191,7 +204,7 @@ impl CompressedMint {
191
204
version,
192
205
) ?)
193
206
} else if version == 1 {
194
- Ok ( CompressedMint :: hash_with_hashed_values_inner :: < Sha256BE > (
207
+ Ok ( CompressedMint :: hash_with_hashed_values_generic :: < Sha256BE > (
195
208
hashed_spl_mint,
196
209
supply_bytes,
197
210
decimals,
@@ -204,7 +217,8 @@ impl CompressedMint {
204
217
Err ( CTokenError :: InvalidTokenDataVersion )
205
218
}
206
219
}
207
- fn hash_with_hashed_values_inner < H : Hasher > (
220
+
221
+ fn hash_with_hashed_values_generic < H : Hasher > (
208
222
hashed_spl_mint : & [ u8 ; 32 ] ,
209
223
supply_bytes : & [ u8 ; 32 ] ,
210
224
decimals : u8 ,
0 commit comments