@@ -145,8 +145,6 @@ impl State {
145145 if let Some ( info_mut) = info. as_mut ( ) {
146146 info_mut. metadata . cip68_metadata = ref_info. metadata . cip68_metadata ;
147147 info_mut. metadata . cip68_version = ref_info. metadata . cip68_version ;
148- } else {
149- info = Some ( ref_info) ;
150148 }
151149 }
152150
@@ -596,7 +594,7 @@ impl State {
596594 continue ;
597595 } ;
598596
599- let mut cip68_version = None ;
597+ let mut cip68_version = Some ( AssetMetadataStandard :: CIP68v1 ) ;
600598
601599 if let Ok ( serde_cbor:: Value :: Map ( m) ) =
602600 serde_cbor:: from_slice :: < serde_cbor:: Value > ( blob)
@@ -619,7 +617,6 @@ impl State {
619617 continue ;
620618 }
621619
622- // NOTE: CIP68 metadata version is included in the blob and is decoded in REST handler
623620 match registry. lookup_id ( policy_id, name) {
624621 Some ( asset_id) => {
625622 if let Some ( record) =
@@ -689,13 +686,14 @@ mod tests {
689686
690687 use crate :: {
691688 asset_registry:: { AssetId , AssetRegistry } ,
692- state:: { AssetsStorageConfig , State , StoreTransactions } ,
689+ state:: { AssetsStorageConfig , State , StoreTransactions , CIP67_LABEL_222 , CIP68_LABEL_100 } ,
693690 } ;
694691 use acropolis_common:: {
695- Address , AddressDelta , AssetInfoRecord , AssetMetadataStandard , AssetName , Datum ,
696- NativeAsset , NativeAssetDelta , PolicyId , ShelleyAddress , TxIdentifier , TxOutput ,
692+ Address , AddressDelta , AssetInfoRecord , AssetMetadata , AssetMetadataStandard , AssetName ,
693+ Datum , NativeAsset , NativeAssetDelta , PolicyId , ShelleyAddress , TxIdentifier , TxOutput ,
697694 TxUTxODeltas , UTxOIdentifier , Value ,
698695 } ;
696+ use serde_cbor:: Value as CborValue ;
699697
700698 fn dummy_policy ( byte : u8 ) -> PolicyId {
701699 [ byte; 28 ]
@@ -1286,6 +1284,46 @@ mod tests {
12861284 ) ;
12871285 }
12881286
1287+ #[ test]
1288+ fn handle_cip68_version_detection ( ) {
1289+ let mut registry = AssetRegistry :: new ( ) ;
1290+ let policy_id: PolicyId = [ 7u8 ; 28 ] ;
1291+
1292+ let ( state, asset_id, name) = setup_state_with_asset (
1293+ & mut registry,
1294+ policy_id,
1295+ & [ 0x00 , 0x06 , 0x43 , 0xb0 , 0xAA ] ,
1296+ true ,
1297+ false ,
1298+ StoreTransactions :: None ,
1299+ ) ;
1300+
1301+ let mut map = BTreeMap :: new ( ) ;
1302+ map. insert (
1303+ CborValue :: Text ( "version" . to_string ( ) ) ,
1304+ CborValue :: Text ( "2.0" . to_string ( ) ) ,
1305+ ) ;
1306+
1307+ let datum = serde_cbor:: to_vec ( & CborValue :: Map ( map) ) . unwrap ( ) ;
1308+
1309+ let output = make_output ( policy_id, name, Some ( datum. clone ( ) ) ) ;
1310+
1311+ let tx = TxUTxODeltas {
1312+ tx_identifier : TxIdentifier :: new ( 0 , 0 ) ,
1313+ inputs : vec ! [ ] ,
1314+ outputs : vec ! [ output] ,
1315+ } ;
1316+ let new_state = state. handle_cip68_metadata ( & [ tx] , & registry) . unwrap ( ) ;
1317+ let record = new_state. info . as_ref ( ) . unwrap ( ) . get ( & asset_id) . unwrap ( ) ;
1318+
1319+ // CIP68 version should be v2
1320+ assert_eq ! (
1321+ record. metadata. cip68_version,
1322+ Some ( AssetMetadataStandard :: CIP68v2 ) ,
1323+ "CIP68 version should be set as CIP68v2"
1324+ ) ;
1325+ }
1326+
12891327 #[ test]
12901328 fn get_asset_info_reference_nft_strips_metadata ( ) {
12911329 let mut registry = AssetRegistry :: new ( ) ;
@@ -1320,6 +1358,54 @@ mod tests {
13201358 assert ! ( rec. metadata. cip68_version. is_none( ) ) ;
13211359 }
13221360
1361+ #[ test]
1362+ fn get_asset_info_resolves_user_token_metadata_from_reference_nft ( ) {
1363+ let mut registry = AssetRegistry :: new ( ) ;
1364+ let policy_id: PolicyId = [ 5u8 ; 28 ] ;
1365+ let asset_name = [ 0x53 , 0x4E , 0x45 , 0x4B ] ;
1366+
1367+ let mut user_name = CIP67_LABEL_222 . to_vec ( ) ;
1368+ user_name. extend_from_slice ( & asset_name) ;
1369+ let user_token_name = AssetName :: new ( & user_name) . unwrap ( ) ;
1370+ let user_token_id = registry. get_or_insert ( policy_id, user_token_name) ;
1371+
1372+ let mut reference_name = CIP68_LABEL_100 . to_vec ( ) ;
1373+ reference_name. extend_from_slice ( & asset_name) ;
1374+ let reference_nft_name = AssetName :: new ( & reference_name) . unwrap ( ) ;
1375+ let reference_id = registry. get_or_insert ( policy_id, reference_nft_name) ;
1376+
1377+ let mut state = State :: new ( full_config ( ) ) ;
1378+ state. info . as_mut ( ) . unwrap ( ) . insert (
1379+ reference_id,
1380+ AssetInfoRecord {
1381+ initial_mint_tx : dummy_tx_identifier ( 0 ) ,
1382+ mint_or_burn_count : 0 ,
1383+ metadata : AssetMetadata {
1384+ cip25_metadata : None ,
1385+ cip25_version : None ,
1386+ cip68_metadata : Some ( vec ! [ 1 , 2 , 3 ] ) ,
1387+ cip68_version : Some ( AssetMetadataStandard :: CIP68v1 ) ,
1388+ } ,
1389+ } ,
1390+ ) ;
1391+
1392+ let resolved = state. resolve_cip68_metadata ( & user_token_id, & registry) ;
1393+
1394+ let record = resolved. expect ( "User token should resolve to reference NFT metadata" ) ;
1395+
1396+ assert_eq ! (
1397+ record. metadata. cip68_metadata,
1398+ Some ( vec![ 1 , 2 , 3 ] ) ,
1399+ "User token should inherit CIP68 metadata from reference NFT"
1400+ ) ;
1401+
1402+ assert_eq ! (
1403+ record. metadata. cip68_version,
1404+ Some ( AssetMetadataStandard :: CIP68v1 ) ,
1405+ "User token should inherit CIP68 version from reference NFT"
1406+ ) ;
1407+ }
1408+
13231409 #[ test]
13241410 fn handle_transactions_duplicate_tx_ignored ( ) {
13251411 let mut registry = AssetRegistry :: new ( ) ;
0 commit comments