@@ -113,7 +113,7 @@ impl SnapshotQuery {
113
113
. enumerate ( )
114
114
. filter_map ( |( index, js_value) | {
115
115
if let Some ( s) = js_value. as_string ( ) {
116
- // Detect if the string contains a nonce to indicate it's a plaintext record.
116
+ // Detect if the string contains a nonce to indicate the input is a plaintext record.
117
117
if !s. contains ( "_nonce" ) {
118
118
return None ;
119
119
} ;
@@ -125,13 +125,15 @@ impl SnapshotQuery {
125
125
let program_id = program. id ( ) ;
126
126
let function = program. get_function ( function_id) . ok ( ) ?;
127
127
let input = function. inputs ( ) . get_index ( index) ?;
128
- let record_name = match input. value_type ( ) {
129
- & ValueTypeNative :: Record ( record_name) => record_name,
130
- _ => return None ,
131
- } ;
132
-
133
- // Compute the commitment.
134
- record. to_commitment ( program_id, & record_name, & record_view_key) . ok ( )
128
+ match input. value_type ( ) {
129
+ & ValueTypeNative :: Record ( record_name) => {
130
+ record. to_commitment ( program_id, & record_name, & record_view_key) . ok ( )
131
+ }
132
+ & ValueTypeNative :: ExternalRecord ( locator) => {
133
+ record. to_commitment ( locator. program_id ( ) , locator. resource ( ) , & record_view_key) . ok ( )
134
+ }
135
+ _ => None ,
136
+ }
135
137
} else {
136
138
None
137
139
}
@@ -246,7 +248,12 @@ impl QueryTrait<CurrentNetwork> for SnapshotQuery {
246
248
247
249
mod tests {
248
250
use super :: * ;
249
- use crate :: { test:: PROVABLE_API , utilities:: rest:: get_network} ;
251
+ use crate :: {
252
+ test:: { PROVABLE_API , TOKEN_REGISTRY_RECORD_OWNER_VIEW_KEY , TOKEN_REGISTRY_RECORD_V1 } ,
253
+ types:: native:: ProgramIDNative ,
254
+ utilities:: { rest:: get_network, test:: programs:: EXTERNAL_RECORDS_DEMO } ,
255
+ } ;
256
+ use snarkvm_synthesizer_program:: Program ;
250
257
use wasm_bindgen_test:: * ;
251
258
252
259
#[ wasm_bindgen_test]
@@ -274,4 +281,25 @@ mod tests {
274
281
assert ! ( height > 10_000_000 ) ;
275
282
}
276
283
}
284
+
285
+ #[ wasm_bindgen_test]
286
+ fn test_correct_commitment_computation ( ) {
287
+ let record = RecordPlaintextNative :: from_str ( TOKEN_REGISTRY_RECORD_V1 ) . unwrap ( ) ;
288
+ let view_key = ViewKeyNative :: from_str ( TOKEN_REGISTRY_RECORD_OWNER_VIEW_KEY ) . unwrap ( ) ;
289
+ let program_id = ProgramIDNative :: from_str ( "token_registry.aleo" ) . unwrap ( ) ;
290
+ let record_name = IdentifierNative :: from_str ( "Token" ) . unwrap ( ) ;
291
+ let rvk = ( * record. nonce ( ) * * view_key) . to_x_coordinate ( ) ;
292
+ let commitment = record. to_commitment ( & program_id, & record_name, & rvk) . unwrap ( ) ;
293
+ let program = Program :: from_str ( EXTERNAL_RECORDS_DEMO ) . unwrap ( ) ;
294
+ let function_id = IdentifierNative :: from_str ( "deposit_private_token" ) . unwrap ( ) ;
295
+
296
+ let input_1 = JsValue :: from_str ( "aleo1s3ws5tra87fjycnjrwsjcrnw2qxr8jfqqdugnf0xzqqw29q9m5pqem2u4t" ) ;
297
+ let input_2 = JsValue :: from_str ( "5u128" ) ;
298
+ let input_3 = JsValue :: from_str ( TOKEN_REGISTRY_RECORD_V1 ) ;
299
+ let inputs = vec ! [ input_1, input_2, input_3] ;
300
+
301
+ let commitments =
302
+ SnapshotQuery :: collect_commitments_from_inputs ( & program, & function_id, & view_key, & inputs) . unwrap ( ) ;
303
+ assert_eq ! ( commitments[ 0 ] , commitment) ;
304
+ }
277
305
}
0 commit comments