From 932a977ae704fd67bf08e7c0ac122c8c24ec2a1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lech=20G=C5=82owiak?= Date: Fri, 18 Jul 2025 14:15:57 +0200 Subject: [PATCH 1/3] feat: write plutus data v1 for permissioned candidates and registerations --- .../migrations/6_insert_transactions.sql | 6 +- toolkit/sidechain/domain/src/lib.rs | 5 + .../src/permissioned_candidates.rs | 157 ++++++++++++++---- .../plutus-data/src/registered_candidates.rs | 52 ++++-- 4 files changed, 178 insertions(+), 42 deletions(-) diff --git a/toolkit/data-sources/db-sync/testdata/migrations/6_insert_transactions.sql b/toolkit/data-sources/db-sync/testdata/migrations/6_insert_transactions.sql index 6ea276dc04..5bae7a1da0 100644 --- a/toolkit/data-sources/db-sync/testdata/migrations/6_insert_transactions.sql +++ b/toolkit/data-sources/db-sync/testdata/migrations/6_insert_transactions.sql @@ -94,7 +94,7 @@ registration_SPO_C jsonb := ' {"bytes": "1fd2f1e5ad14c829c7359474764701cd74ab9c433c29b0bbafaa6bcf22376e9d651391d08ae6f40b418d2abf827c4c1fcb007e779a2beba7894d68012942c708"} ] }, - {"list": [{"bytes": "63726368"}, {"bytes": "02333e47cab242fefe88d7da1caa713307290291897f100efb911672d317147f72"}]}, + {"bytes": "02333e47cab242fefe88d7da1caa713307290291897f100efb911672d317147f72"}, {"bytes": "3e8a8b29e513a08d0a66e22422a1a85d1bf409987f30a8c6fcab85ba38a85d0d27793df7e7fb63ace12203b062feb7edb5e6664ac1810b94c38182acc6167425"}, { "constructor": 0, @@ -306,14 +306,14 @@ DO $$ {"constructor": 0, "fields": [] }, {"list": [ {"list": [ - {"list":[{"bytes": "63726368"}, {"bytes": "cb6df9de1efca7a3998a8ead4e02159d5fa99c3e0d4fd6432667390bb4726854"}]}, + {"bytes": "cb6df9de1efca7a3998a8ead4e02159d5fa99c3e0d4fd6432667390bb4726854"}, {"list":[ {"list":[{"bytes": "61757261"}, {"bytes": "bf20afa1c1a72af3341fa7a447e3f9eada9f3d054a7408fb9e49ad4d6e6559ec"}]}, {"list":[{"bytes": "6772616e"}, {"bytes": "9042a40b0b1baa9adcead024432a923eac706be5e1a89d7f2f2d58bfa8f3c26d"}]} ]} ]}, {"list": [ - {"list":[{"bytes": "63726368"}, {"bytes": "79c3b7fc0b7697b9414cb87adcb37317d1cab32818ae18c0e97ad76395d1fdcf"}]}, + {"bytes": "79c3b7fc0b7697b9414cb87adcb37317d1cab32818ae18c0e97ad76395d1fdcf"}, {"list":[ {"list":[{"bytes": "61757261"}, {"bytes": "56d1da82e56e4cb35b13de25f69a3e9db917f3e13d6f786321f4b0a9dc153b19"}]}, {"list":[{"bytes": "6772616e"}, {"bytes": "7392f3ea668aa2be7997d82c07bcfbec3ee4a9a4e01e3216d92b8f0d0a086c32"}]} diff --git a/toolkit/sidechain/domain/src/lib.rs b/toolkit/sidechain/domain/src/lib.rs index 4e64710db3..f08869c779 100644 --- a/toolkit/sidechain/domain/src/lib.rs +++ b/toolkit/sidechain/domain/src/lib.rs @@ -1226,6 +1226,11 @@ impl CandidateKeys { pub fn find_or_empty(&self, id: KeyTypeId) -> Vec { self.find(id).unwrap_or_default() } + + /// True for keys that are only AURA and Grandpa + pub fn has_only_aura_and_grandpa_keys(&self) -> bool { + self.0.len() == 2 && self.find(AURA).is_some() && self.find(GRANDPA).is_some() + } } impl From)>> for CandidateKeys { diff --git a/toolkit/smart-contracts/plutus-data/src/permissioned_candidates.rs b/toolkit/smart-contracts/plutus-data/src/permissioned_candidates.rs index f43a8bcc34..969dffa504 100644 --- a/toolkit/smart-contracts/plutus-data/src/permissioned_candidates.rs +++ b/toolkit/smart-contracts/plutus-data/src/permissioned_candidates.rs @@ -32,8 +32,7 @@ impl From for PermissionedCandidateData { // with T: OpaqueKeys, this function will be re-implemented. fn from(value: PermissionedCandidateDatumV1) -> Self { let PermissionedCandidateDatumV1 { partner_chains_key, keys } = value; - let sidechain_public_key = SidechainPublicKey(partner_chains_key.bytes); - PermissionedCandidateData { sidechain_public_key, keys } + PermissionedCandidateData { sidechain_public_key: partner_chains_key, keys } } } @@ -41,7 +40,7 @@ impl From for PermissionedCandidateData { /// Datum representing a permissioned candidate with arbitrary set of keys pub struct PermissionedCandidateDatumV1 { /// Partner Chains key identifier and bytes - pub partner_chains_key: CandidateKey, + pub partner_chains_key: SidechainPublicKey, /// Represents arbitrary set of keys with 4 character identifier pub keys: CandidateKeys, } @@ -75,11 +74,12 @@ impl From for Vec { } /// Converts a list of [PermissionedCandidateData] values to [VersionedGenericDatum] encoded as [PlutusData]. -/// +/// Version 0 is used for specific set of Partner Chains Key: partner chains key, AURA, Grandpa +/// If other set of key is used, then version 1 is used. /// Encoding: /// ```ignore /// VersionedGenericDatum: -/// - datum: () +/// - datum: Constr 0 [] /// - appendix: /// [ /// [ candidates[0].sidechain_public_key @@ -94,31 +94,89 @@ impl From for Vec { /// // etc. /// ] /// - version: 0 +/// or: +/// VersionedGenericDatum: +/// - datum: Constr 0 [] +/// - appendix: +/// [ +/// [ candidates[0].sidechain_public_key +/// , +/// [ +/// [ candidates[0].keys[0].id, +/// , candidates[0].keys[0].bytes +/// ] +/// , [ candidates[0].keys[1].id, +/// , candidates[0].keys[1].bytes +/// ] +/// // etc. +/// ] +/// ] +/// , +/// [ candidates[1].sidechain_public_key +/// , +/// [ +/// [ candidates[1].keys[0].id, +/// , candidates[1].keys[0].bytes +/// ] +/// , [ candidates[1].keys[1].id, +/// , candidates[1].keys[1].bytes +/// ] +/// // etc. +/// ] +/// ] +/// // etc. +/// ] +/// - version: 1 /// ``` + pub fn permissioned_candidates_to_plutus_data( candidates: &[PermissionedCandidateData], ) -> PlutusData { - let mut list = PlutusList::new(); - for candidate in candidates { - let mut candidate_datum = PlutusList::new(); - candidate_datum.add(&PlutusData::new_bytes(candidate.sidechain_public_key.0.clone())); - for key in candidate.keys.0.iter() { - candidate_datum.add(&PlutusData::new_bytes(key.bytes.clone())); + fn candidates_to_plutus_data_v0(candidates: &[PermissionedCandidateData]) -> PlutusData { + let mut list = PlutusList::new(); + for candidate in candidates { + let mut candidate_datum = PlutusList::new(); + candidate_datum.add(&PlutusData::new_bytes(candidate.sidechain_public_key.0.clone())); + for key in candidate.keys.0.iter() { + candidate_datum.add(&PlutusData::new_bytes(key.bytes.clone())); + } + list.add(&PlutusData::new_list(&candidate_datum)); + } + let appendix = PlutusData::new_list(&list); + VersionedGenericDatum { + datum: PlutusData::new_empty_constr_plutus_data(&BigNum::zero()), + appendix, + version: 0, } - list.add(&PlutusData::new_list(&candidate_datum)); + .into() } - let appendix = PlutusData::new_list(&list); - VersionedGenericDatum { - datum: PlutusData::new_empty_constr_plutus_data(&BigNum::zero()), - appendix, - version: 0, + + fn candidates_to_plutus_data_v1(candidates: &[PermissionedCandidateData]) -> PlutusData { + let mut list = PlutusList::new(); + for candidate in candidates { + let mut candidate_datum = PlutusList::new(); + candidate_datum.add(&PlutusData::new_bytes(candidate.sidechain_public_key.0.clone())); + candidate_datum.add(&candidate_keys_to_plutus(&candidate.keys)); + list.add(&PlutusData::new_list(&candidate_datum)); + } + VersionedGenericDatum { + datum: PlutusData::new_empty_constr_plutus_data(&BigNum::zero()), + appendix: PlutusData::new_list(&list), + version: 1, + } + .into() + } + + if candidates.iter().all(|c| c.keys.has_only_aura_and_grandpa_keys()) { + candidates_to_plutus_data_v0(candidates) + } else { + candidates_to_plutus_data_v1(candidates) } - .into() } impl PermissionedCandidateDatums { /// Parses plutus data schema in accordance with V1 schema - fn decode_v1(data: &PlutusData) -> Result { + fn decode_v1_appendix(data: &PlutusData) -> Result { let permissioned_candidates = data .as_list() .and_then(|list_datums| { @@ -156,9 +214,10 @@ impl VersionedDatumWithLegacy for PermissionedCandidateDatums { appendix: &PlutusData, ) -> Result { match version { + // v0 appendix is the same as legacy format of whole plutus data 0 => PermissionedCandidateDatums::decode_legacy(appendix) .map_err(|msg| format!("Cannot parse appendix: {msg}")), - 1 => PermissionedCandidateDatums::decode_v1(appendix) + 1 => PermissionedCandidateDatums::decode_v1_appendix(appendix) .map_err(|msg| format!("Cannot parse appendix: {msg}")), _ => Err(format!("Unknown version: {version}")), } @@ -184,7 +243,7 @@ fn decode_legacy_candidate_datum(datum: &PlutusData) -> Option Option { // The first element has Partner Chains key, second contains all other keys let outer_list = datum.as_list().filter(|l| l.len() == 2)?; - let partner_chains_key = decode_candidate_key(&outer_list.get(0))?; + let partner_chains_key = SidechainPublicKey(outer_list.get(0).as_bytes()?); let keys = decode_candidate_keys(&outer_list.get(1))?; Some(PermissionedCandidateDatumV1 { partner_chains_key, keys }) } @@ -267,14 +326,14 @@ mod tests { { "constructor": 0, "fields": [] }, {"list": [ {"list":[ - {"list": [{"bytes": hex::encode(b"crch")}, {"bytes": "cb6df9de1efca7a3998a8ead4e02159d5fa99c3e0d4fd6432667390bb4726854"}]}, + {"bytes": "cb6df9de1efca7a3998a8ead4e02159d5fa99c3e0d4fd6432667390bb4726854"}, {"list": [ {"list": [{"bytes": hex::encode(b"aura")}, {"bytes": "bf20afa1c1a72af3341fa7a447e3f9eada9f3d054a7408fb9e49ad4d6e6559ec"}]}, {"list": [{"bytes": hex::encode(b"gran")}, {"bytes": "9042a40b0b1baa9adcead024432a923eac706be5e1a89d7f2f2d58bfa8f3c26d"}]} ]} ]}, {"list":[ - {"list": [{"bytes": hex::encode(b"crch")}, {"bytes": "79c3b7fc0b7697b9414cb87adcb37317d1cab32818ae18c0e97ad76395d1fdcf"}]}, + {"bytes": "79c3b7fc0b7697b9414cb87adcb37317d1cab32818ae18c0e97ad76395d1fdcf"}, {"list": [ {"list": [{"bytes": hex::encode(b"aura")}, {"bytes": "56d1da82e56e4cb35b13de25f69a3e9db917f3e13d6f786321f4b0a9dc153b19"}]}, {"list": [{"bytes": hex::encode(b"gran")}, {"bytes": "7392f3ea668aa2be7997d82c07bcfbec3ee4a9a4e01e3216d92b8f0d0a086c32"}]} @@ -287,7 +346,7 @@ mod tests { } #[test] - fn test_permissioned_candidates_to_plutus_data() { + fn permissioned_candidates_to_plutus_data_outputs_v0_for_aura_and_grandpa_keys() { let expected_plutus_data = json_to_plutus_data(v0_datum_json()); let domain_data = vec![ @@ -331,6 +390,50 @@ mod tests { assert_eq!(permissioned_candidates_to_plutus_data(&domain_data), expected_plutus_data) } + #[test] + fn permissioned_candidates_to_plutus_data_outputs_v1() { + let domain_data = vec![ + PermissionedCandidateData { + sidechain_public_key: SidechainPublicKey([1; 33].to_vec()), + keys: CandidateKeys(vec![ + CandidateKey { id: [2; 4], bytes: [3; 32].to_vec() }, + CandidateKey { id: [4; 4], bytes: [5; 32].to_vec() }, + ]), + }, + PermissionedCandidateData { + sidechain_public_key: SidechainPublicKey([6; 33].to_vec()), + keys: CandidateKeys(vec![ + CandidateKey { id: [7; 4], bytes: [8; 32].to_vec() }, + CandidateKey { id: [9; 4], bytes: [10u8; 32].to_vec() }, + ]), + }, + ]; + let json = serde_json::json!({ + "list": [ + { "constructor": 0, "fields": [] }, + {"list": [ + {"list":[ + {"bytes": "010101010101010101010101010101010101010101010101010101010101010101"}, + {"list": [ + {"list": [{"bytes": "02020202"}, {"bytes": "0303030303030303030303030303030303030303030303030303030303030303"}]}, + {"list": [{"bytes": "04040404"}, {"bytes": "0505050505050505050505050505050505050505050505050505050505050505"}]} + ]} + ]}, + {"list":[ + {"bytes": "060606060606060606060606060606060606060606060606060606060606060606"}, + {"list": [ + {"list": [{"bytes": "07070707"}, {"bytes": "0808080808080808080808080808080808080808080808080808080808080808"}]}, + {"list": [{"bytes": "09090909"}, {"bytes": "0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a"}]} + ]} + ]} + ]}, + { "int": 1 } + ] + }); + let expected_plutus_data = json_to_plutus_data(json); + assert_eq!(permissioned_candidates_to_plutus_data(&domain_data), expected_plutus_data) + } + #[test] fn valid_v0_permissioned_candidates() { let plutus_data = json_to_plutus_data(v0_datum_json()); @@ -369,8 +472,7 @@ mod tests { let expected_datum = PermissionedCandidateDatums::V1(vec![ PermissionedCandidateDatumV1 { - partner_chains_key: CandidateKey::new( - CROSS_CHAIN_KEY_TYPE_ID, + partner_chains_key: SidechainPublicKey( hex!("cb6df9de1efca7a3998a8ead4e02159d5fa99c3e0d4fd6432667390bb4726854").into(), ), keys: CandidateKeys(vec![ @@ -387,8 +489,7 @@ mod tests { ]), }, PermissionedCandidateDatumV1 { - partner_chains_key: CandidateKey::new( - CROSS_CHAIN_KEY_TYPE_ID, + partner_chains_key: SidechainPublicKey( hex!("79c3b7fc0b7697b9414cb87adcb37317d1cab32818ae18c0e97ad76395d1fdcf").into(), ), keys: CandidateKeys(vec![ diff --git a/toolkit/smart-contracts/plutus-data/src/registered_candidates.rs b/toolkit/smart-contracts/plutus-data/src/registered_candidates.rs index 214ae791d0..d0663fd082 100644 --- a/toolkit/smart-contracts/plutus-data/src/registered_candidates.rs +++ b/toolkit/smart-contracts/plutus-data/src/registered_candidates.rs @@ -200,7 +200,7 @@ fn decode_v1_register_validator_datum( .data(); let stake_ownership = decode_ada_based_staking_datum(fields.get(0))?; - let sidechain_pub_key = SidechainPublicKey(decode_candidate_key(&fields.get(1))?.bytes); + let sidechain_pub_key = fields.get(1).as_bytes().map(SidechainPublicKey)?; let sidechain_signature = fields.get(2).as_bytes().map(SidechainSignature)?; let registration_utxo = decode_utxo_id_datum(fields.get(3))?; let keys = decode_candidate_keys(&fields.get(4))?; @@ -309,18 +309,22 @@ impl From for PlutusData { } => { let mut appendix_fields = PlutusList::new(); appendix_fields.add(&stake_ownership_to_plutus_data(stake_ownership)); - appendix_fields.add(&candidate_key_to_plutus(&CandidateKey::new( - CROSS_CHAIN_KEY_TYPE_ID, - sidechain_pub_key.0, - ))); + appendix_fields.add(&PlutusData::new_bytes(sidechain_pub_key.0)); appendix_fields.add(&PlutusData::new_bytes(sidechain_signature.0)); appendix_fields.add(&utxo_id_to_plutus_data(registration_utxo)); - appendix_fields.add(&candidate_keys_to_plutus(&keys)); + let version = if keys.has_only_aura_and_grandpa_keys() { + appendix_fields.add(&PlutusData::new_bytes(keys.find_or_empty(AURA))); + appendix_fields.add(&PlutusData::new_bytes(keys.find_or_empty(GRANDPA))); + 0 + } else { + appendix_fields.add(&candidate_keys_to_plutus(&keys)); + 1 + }; let appendix = ConstrPlutusData::new(&BigNum::zero(), &appendix_fields); VersionedGenericDatum { datum: PlutusData::new_bytes(own_pkh.0.to_vec()), appendix: PlutusData::new_constr_plutus_data(&appendix), - version: 1, + version, } .into() }, @@ -373,7 +377,7 @@ mod tests { } } - fn test_datum_v1() -> RegisterValidatorDatum { + fn test_datum_v1_aura_and_grandpa_only() -> RegisterValidatorDatum { RegisterValidatorDatum::V1 { stake_ownership: AdaBasedStaking { pub_key: StakePoolPublicKey(hex!("bfbee74ab533f40979101057f96de62e95233f2a5216eb16b54106f09fd7350d")), @@ -400,6 +404,26 @@ mod tests { } } + fn test_datum_v1() -> RegisterValidatorDatum { + RegisterValidatorDatum::V1 { + stake_ownership: AdaBasedStaking { + pub_key: StakePoolPublicKey(hex!("bfbee74ab533f40979101057f96de62e95233f2a5216eb16b54106f09fd7350d")), + signature: MainchainSignature(hex!("28d1c3b7df297a60d24a3f88bc53d7029a8af35e8dd876764fd9e7a24203a3482a98263cc8ba2ddc7dc8e7faea31c2e7bad1f00e28c43bc863503e3172dc6b0a").into()), + }, + sidechain_pub_key: SidechainPublicKey(hex!("02fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af").into()), + sidechain_signature: SidechainSignature(hex!("f8ec6c7f935d387aaa1693b3bf338cbb8f53013da8a5a234f9c488bacac01af259297e69aee0df27f553c0a1164df827d016125c16af93c99be2c19f36d2f66e").into()), + registration_utxo: UtxoId { + tx_hash: McTxHash(hex!("cdefe62b0a0016c2ccf8124d7dda71f6865283667850cc7b471f761d2bc1eb13")), + index: UtxoIndex(1), + }, + own_pkh: MainchainKeyHash(hex!("aabbccddeeff00aabbccddeeff00aabbccddeeff00aabbccddeeff00")), + keys: CandidateKeys(vec![ + CandidateKey { id: [0; 4], bytes: [1; 32].to_vec() }, + CandidateKey { id: [2; 4], bytes: [3; 32].to_vec() }, + ]), + } + } + #[test] fn valid_legacy_registration() { let plutus_data = test_plutus_data!({ @@ -481,7 +505,7 @@ mod tests { {"bytes": "28d1c3b7df297a60d24a3f88bc53d7029a8af35e8dd876764fd9e7a24203a3482a98263cc8ba2ddc7dc8e7faea31c2e7bad1f00e28c43bc863503e3172dc6b0a" } ] }, - {"list": [{"bytes": "63726368"}, { "bytes": "02fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af" }]}, + {"bytes": "02fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af"}, {"bytes": "f8ec6c7f935d387aaa1693b3bf338cbb8f53013da8a5a234f9c488bacac01af259297e69aee0df27f553c0a1164df827d016125c16af93c99be2c19f36d2f66e" }, { "fields": [ @@ -494,8 +518,8 @@ mod tests { "constructor": 0 }, {"list": [ - {"list": [{"bytes": "61757261"}, {"bytes": "d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d" }]}, - {"list": [{"bytes": "6772616e"}, {"bytes": "88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee" }]} + {"list": [{"bytes": "00000000"}, {"bytes": "0101010101010101010101010101010101010101010101010101010101010101" }]}, + {"list": [{"bytes": "02020202"}, {"bytes": "0303030303030303030303030303030303030303030303030303030303030303" }]} ]} ] }, @@ -522,6 +546,12 @@ mod tests { assert_eq!(plutus_data_to_json(plutus_data), test_versioned_datum_v1_json()) } + #[test] + fn valid_v1_registration_to_plutus_data_outputs_v0_for_aura_and_grandpa_only() { + let plutus_data: PlutusData = test_datum_v1_aura_and_grandpa_only().into(); + assert_eq!(plutus_data_to_json(plutus_data), test_versioned_datum_v0_json()) + } + #[test] fn v0_registration_to_plutus_data() { let plutus_data: PlutusData = test_datum_v0().into(); From 8cb698560c6741be1424ae2dc582dfaa027de141 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lech=20G=C5=82owiak?= Date: Fri, 25 Jul 2025 11:37:43 +0200 Subject: [PATCH 2/3] Move check for aura/grandpa only keys one level higher --- .../plutus-data/src/registered_candidates.rs | 85 ++++++------------- 1 file changed, 28 insertions(+), 57 deletions(-) diff --git a/toolkit/smart-contracts/plutus-data/src/registered_candidates.rs b/toolkit/smart-contracts/plutus-data/src/registered_candidates.rs index d0663fd082..2ea6cd15ad 100644 --- a/toolkit/smart-contracts/plutus-data/src/registered_candidates.rs +++ b/toolkit/smart-contracts/plutus-data/src/registered_candidates.rs @@ -111,16 +111,27 @@ impl VersionedDatumWithLegacy for RegisterValidatorDatum { pub fn candidate_registration_to_plutus_data( candidate_registration: &CandidateRegistration, ) -> PlutusData { - RegisterValidatorDatum::V0 { - stake_ownership: candidate_registration.stake_ownership.clone(), - sidechain_pub_key: candidate_registration.partner_chain_pub_key.clone(), - sidechain_signature: candidate_registration.partner_chain_signature.clone(), - registration_utxo: candidate_registration.registration_utxo, - own_pkh: candidate_registration.own_pkh, - aura_pub_key: AuraPublicKey(candidate_registration.keys.find_or_empty(AURA)), - grandpa_pub_key: GrandpaPublicKey(candidate_registration.keys.find_or_empty(GRANDPA)), - } - .into() + let datum = if candidate_registration.keys.has_only_aura_and_grandpa_keys() { + RegisterValidatorDatum::V0 { + stake_ownership: candidate_registration.stake_ownership.clone(), + sidechain_pub_key: candidate_registration.partner_chain_pub_key.clone(), + sidechain_signature: candidate_registration.partner_chain_signature.clone(), + registration_utxo: candidate_registration.registration_utxo, + own_pkh: candidate_registration.own_pkh, + aura_pub_key: AuraPublicKey(candidate_registration.keys.find_or_empty(AURA)), + grandpa_pub_key: GrandpaPublicKey(candidate_registration.keys.find_or_empty(GRANDPA)), + } + } else { + RegisterValidatorDatum::V1 { + stake_ownership: candidate_registration.stake_ownership.clone(), + sidechain_pub_key: candidate_registration.partner_chain_pub_key.clone(), + sidechain_signature: candidate_registration.partner_chain_signature.clone(), + registration_utxo: candidate_registration.registration_utxo, + own_pkh: candidate_registration.own_pkh, + keys: candidate_registration.keys.clone(), + } + }; + datum.into() } impl From for CandidateRegistration { @@ -312,19 +323,12 @@ impl From for PlutusData { appendix_fields.add(&PlutusData::new_bytes(sidechain_pub_key.0)); appendix_fields.add(&PlutusData::new_bytes(sidechain_signature.0)); appendix_fields.add(&utxo_id_to_plutus_data(registration_utxo)); - let version = if keys.has_only_aura_and_grandpa_keys() { - appendix_fields.add(&PlutusData::new_bytes(keys.find_or_empty(AURA))); - appendix_fields.add(&PlutusData::new_bytes(keys.find_or_empty(GRANDPA))); - 0 - } else { - appendix_fields.add(&candidate_keys_to_plutus(&keys)); - 1 - }; + appendix_fields.add(&candidate_keys_to_plutus(&keys)); let appendix = ConstrPlutusData::new(&BigNum::zero(), &appendix_fields); VersionedGenericDatum { datum: PlutusData::new_bytes(own_pkh.0.to_vec()), appendix: PlutusData::new_constr_plutus_data(&appendix), - version, + version: 1, } .into() }, @@ -377,33 +381,6 @@ mod tests { } } - fn test_datum_v1_aura_and_grandpa_only() -> RegisterValidatorDatum { - RegisterValidatorDatum::V1 { - stake_ownership: AdaBasedStaking { - pub_key: StakePoolPublicKey(hex!("bfbee74ab533f40979101057f96de62e95233f2a5216eb16b54106f09fd7350d")), - signature: MainchainSignature(hex!("28d1c3b7df297a60d24a3f88bc53d7029a8af35e8dd876764fd9e7a24203a3482a98263cc8ba2ddc7dc8e7faea31c2e7bad1f00e28c43bc863503e3172dc6b0a").into()), - }, - sidechain_pub_key: SidechainPublicKey(hex!("02fe8d1eb1bcb3432b1db5833ff5f2226d9cb5e65cee430558c18ed3a3c86ce1af").into()), - sidechain_signature: SidechainSignature(hex!("f8ec6c7f935d387aaa1693b3bf338cbb8f53013da8a5a234f9c488bacac01af259297e69aee0df27f553c0a1164df827d016125c16af93c99be2c19f36d2f66e").into()), - registration_utxo: UtxoId { - tx_hash: McTxHash(hex!("cdefe62b0a0016c2ccf8124d7dda71f6865283667850cc7b471f761d2bc1eb13")), - index: UtxoIndex(1), - }, - own_pkh: MainchainKeyHash(hex!("aabbccddeeff00aabbccddeeff00aabbccddeeff00aabbccddeeff00")), - keys: CandidateKeys(vec![ - CandidateKey::new(AURA, - hex!("d43593c715fdd31c61141abd04a99fd6822c8558854ccde39a5684e7a56da27d") - .into(), - ), - CandidateKey::new( - GRANDPA, - hex!("88dc3417d5058ec4b4503e0c12ea1a0a89be200fe98922423d4334014fa6b0ee") - .into(), - ), - ]) - } - } - fn test_datum_v1() -> RegisterValidatorDatum { RegisterValidatorDatum::V1 { stake_ownership: AdaBasedStaking { @@ -541,20 +518,14 @@ mod tests { } #[test] - fn valid_v1_registration_to_plutus_data() { - let plutus_data: PlutusData = test_datum_v1().into(); - assert_eq!(plutus_data_to_json(plutus_data), test_versioned_datum_v1_json()) - } - - #[test] - fn valid_v1_registration_to_plutus_data_outputs_v0_for_aura_and_grandpa_only() { - let plutus_data: PlutusData = test_datum_v1_aura_and_grandpa_only().into(); + fn v0_registration_to_plutus_data() { + let plutus_data: PlutusData = test_datum_v0().into(); assert_eq!(plutus_data_to_json(plutus_data), test_versioned_datum_v0_json()) } #[test] - fn v0_registration_to_plutus_data() { - let plutus_data: PlutusData = test_datum_v0().into(); - assert_eq!(plutus_data_to_json(plutus_data), test_versioned_datum_v0_json()) + fn valid_v1_registration_to_plutus_data() { + let plutus_data: PlutusData = test_datum_v1().into(); + assert_eq!(plutus_data_to_json(plutus_data), test_versioned_datum_v1_json()) } } From 4f4534dd69513e7da5e473c730bf2483e06f55fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lech=20G=C5=82owiak?= Date: Mon, 28 Jul 2025 14:28:52 +0200 Subject: [PATCH 3/3] fix warning --- toolkit/utils/db-sync-sqlx/src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/toolkit/utils/db-sync-sqlx/src/lib.rs b/toolkit/utils/db-sync-sqlx/src/lib.rs index 0b2573ec44..3b6f5de303 100644 --- a/toolkit/utils/db-sync-sqlx/src/lib.rs +++ b/toolkit/utils/db-sync-sqlx/src/lib.rs @@ -60,8 +60,7 @@ macro_rules! sqlx_implementations_for_wrapper { fn encode_by_ref( &self, buf: &mut ::ArgumentBuffer<'q>, - ) -> std::result::Result> - { + ) -> std::result::Result { buf.extend(&self.0.to_be_bytes()); Ok(IsNull::No) }