partner_chains_cardano_offchain/
scripts_data.rs1use crate::plutus_script;
2use crate::{csl::NetworkTypeExt, plutus_script::PlutusScript};
3use cardano_serialization_lib::NetworkIdKind;
4use ogmios_client::query_network::QueryNetwork;
5use raw_scripts::ScriptId;
6use raw_scripts::{
7 COMMITTEE_CANDIDATE_VALIDATOR, D_PARAMETER_POLICY, D_PARAMETER_VALIDATOR, GOVERNED_MAP_POLICY,
8 GOVERNED_MAP_VALIDATOR, ILLIQUID_CIRCULATION_SUPPLY_VALIDATOR, PERMISSIONED_CANDIDATES_POLICY,
9 PERMISSIONED_CANDIDATES_VALIDATOR, RESERVE_AUTH_POLICY, RESERVE_VALIDATOR,
10 VERSION_ORACLE_POLICY, VERSION_ORACLE_VALIDATOR,
11};
12use serde::Serialize;
13use sidechain_domain::{PolicyId, UtxoId};
14use uplc::PlutusData;
15
16#[derive(Clone, Debug, Serialize, PartialEq, Eq)]
19#[serde(rename_all = "camelCase")]
20pub struct ScriptsData {
21 pub addresses: Addresses,
23 pub policy_ids: PolicyIds,
25}
26
27#[derive(Clone, Debug, Default, Serialize, PartialEq, Eq)]
29#[serde(rename_all = "PascalCase")]
30pub struct Addresses {
31 pub committee_candidate_validator: String,
33 pub d_parameter_validator: String,
35 pub illiquid_circulation_supply_validator: String,
37 pub permissioned_candidates_validator: String,
39 pub reserve_validator: String,
41 pub version_oracle_validator: String,
43 pub governed_map_validator: String,
45}
46
47#[derive(Clone, Debug, Default, Serialize, PartialEq, Eq)]
49#[serde(rename_all = "PascalCase")]
50pub struct PolicyIds {
51 pub d_parameter: PolicyId,
53 pub permissioned_candidates: PolicyId,
55 pub reserve_auth: PolicyId,
57 pub version_oracle: PolicyId,
59 pub governed_map: PolicyId,
61}
62
63pub fn get_scripts_data(
65 genesis_utxo: UtxoId,
66 network: NetworkIdKind,
67) -> anyhow::Result<ScriptsData> {
68 let version_oracle_data = version_oracle(genesis_utxo, network)?;
69 let committee_candidate_validator =
70 plutus_script![COMMITTEE_CANDIDATE_VALIDATOR, genesis_utxo]?;
71 let d_parameter_data = d_parameter_scripts(genesis_utxo, network)?;
72 let illiquid_circulation_supply_validator = plutus_script![
73 ILLIQUID_CIRCULATION_SUPPLY_VALIDATOR,
74 version_oracle_data.policy_id_as_plutus_data()
75 ]?;
76 let permissioned_candidates_data = permissioned_candidates_scripts(genesis_utxo, network)?;
77 let reserve = reserve_scripts(genesis_utxo, network)?;
78 let governed_map_data = governed_map_scripts(genesis_utxo, network)?;
79 Ok(ScriptsData {
80 addresses: Addresses {
81 committee_candidate_validator: committee_candidate_validator.address_bech32(network)?,
82 d_parameter_validator: d_parameter_data.validator_address.clone(),
83 illiquid_circulation_supply_validator: illiquid_circulation_supply_validator
84 .address_bech32(network)?,
85 permissioned_candidates_validator: permissioned_candidates_data
86 .validator_address
87 .clone(),
88 reserve_validator: reserve.validator.address_bech32(network)?,
89 version_oracle_validator: version_oracle_data.validator_address.clone(),
90 governed_map_validator: governed_map_data.validator_address.clone(),
91 },
92 policy_ids: PolicyIds {
93 d_parameter: d_parameter_data.policy_id(),
94 permissioned_candidates: permissioned_candidates_data.policy_id(),
95 reserve_auth: reserve.auth_policy.policy_id(),
96 version_oracle: version_oracle_data.policy_id(),
97 governed_map: governed_map_data.policy_id(),
98 },
99 })
100}
101
102pub async fn get_scripts_data_with_ogmios(
105 genesis_utxo: UtxoId,
106 client: &impl QueryNetwork,
107) -> anyhow::Result<ScriptsData> {
108 let network = client.shelley_genesis_configuration().await?.network.to_csl();
109 get_scripts_data(genesis_utxo, network)
110}
111
112pub struct PlutusScriptData {
114 pub validator: PlutusScript,
116 pub validator_address: String,
118 pub policy: PlutusScript,
120}
121
122impl PlutusScriptData {
123 pub fn policy_id(&self) -> PolicyId {
125 self.policy.policy_id()
126 }
127
128 pub fn policy_id_as_plutus_data(&self) -> PlutusData {
130 PlutusData::BoundedBytes(self.policy.script_hash().to_vec().into())
131 }
132}
133
134pub fn version_oracle(
136 genesis_utxo: UtxoId,
137 network: NetworkIdKind,
138) -> Result<PlutusScriptData, anyhow::Error> {
139 let validator = plutus_script![VERSION_ORACLE_VALIDATOR, genesis_utxo]?;
140 let validator_address = validator.address_bech32(network)?;
141 let policy =
142 plutus_script![VERSION_ORACLE_POLICY, genesis_utxo, validator.address_data(network)?]?;
143 Ok(PlutusScriptData { validator, validator_address, policy })
144}
145
146pub(crate) fn governed_map_scripts(
147 genesis_utxo: UtxoId,
148 network: NetworkIdKind,
149) -> Result<PlutusScriptData, anyhow::Error> {
150 let version_oracle_data = version_oracle(genesis_utxo, network)?;
151 let validator = plutus_script![
152 GOVERNED_MAP_VALIDATOR,
153 ScriptId::GovernedMapValidator,
154 genesis_utxo,
155 version_oracle_data.policy_id()
156 ]?;
157 let validator_address = validator.address_bech32(network)?;
158 let policy = plutus_script![
159 GOVERNED_MAP_POLICY,
160 ScriptId::GovernedMapPolicy,
161 genesis_utxo,
162 version_oracle_data.policy_id()
163 ]?;
164 Ok(PlutusScriptData { validator, validator_address, policy })
165}
166
167pub(crate) fn d_parameter_scripts(
168 genesis_utxo: UtxoId,
169 network: NetworkIdKind,
170) -> Result<PlutusScriptData, anyhow::Error> {
171 let version_oracle_data = version_oracle(genesis_utxo, network)?;
172 let validator =
173 plutus_script![D_PARAMETER_VALIDATOR, genesis_utxo, version_oracle_data.policy_id()]?;
174 let validator_address = validator.address_bech32(network)?;
175 let policy = plutus_script![
176 D_PARAMETER_POLICY,
177 genesis_utxo,
178 version_oracle_data.policy_id(),
179 validator.address_data(network)?
180 ]?;
181 Ok(PlutusScriptData { validator, validator_address, policy })
182}
183
184pub(crate) fn permissioned_candidates_scripts(
185 genesis_utxo: UtxoId,
186 network: NetworkIdKind,
187) -> Result<PlutusScriptData, anyhow::Error> {
188 let version_oracle_data = version_oracle(genesis_utxo, network)?;
189 let validator = plutus_script![
190 PERMISSIONED_CANDIDATES_VALIDATOR,
191 genesis_utxo,
192 version_oracle_data.policy_id()
193 ]?;
194 let validator_address = validator.address_bech32(network)?;
195 let policy = plutus_script![
196 PERMISSIONED_CANDIDATES_POLICY,
197 genesis_utxo,
198 version_oracle_data.policy_id(),
199 validator.address_data(network)?
200 ]?;
201 Ok(PlutusScriptData { validator, validator_address, policy })
202}
203
204pub(crate) fn registered_candidates_scripts(
205 genesis_utxo: UtxoId,
206) -> Result<PlutusScript, anyhow::Error> {
207 let validator = plutus_script![COMMITTEE_CANDIDATE_VALIDATOR, genesis_utxo]?;
208 Ok(validator)
209}
210
211#[derive(Clone, Debug)]
212pub(crate) struct ReserveScripts {
213 pub(crate) validator: PlutusScript,
214 pub(crate) auth_policy: PlutusScript,
215 pub(crate) illiquid_circulation_supply_validator: PlutusScript,
216}
217
218pub(crate) fn reserve_scripts(
219 genesis_utxo: UtxoId,
220 network: NetworkIdKind,
221) -> Result<ReserveScripts, anyhow::Error> {
222 let version_oracle_data = version_oracle(genesis_utxo, network)?;
223 let validator =
224 plutus_script![RESERVE_VALIDATOR, version_oracle_data.policy_id_as_plutus_data()]?;
225 let auth_policy =
226 plutus_script![RESERVE_AUTH_POLICY, version_oracle_data.policy_id_as_plutus_data()]?;
227 let illiquid_circulation_supply_validator = plutus_script![
228 ILLIQUID_CIRCULATION_SUPPLY_VALIDATOR,
229 version_oracle_data.policy_id_as_plutus_data()
230 ]?;
231 Ok(ReserveScripts { validator, auth_policy, illiquid_circulation_supply_validator })
232}
233
234#[cfg(test)]
235mod tests {
236 use crate::scripts_data::{Addresses, PolicyIds, ScriptsData};
237 use cardano_serialization_lib::NetworkIdKind;
238 use hex_literal::hex;
239 use pretty_assertions::assert_eq;
240 use sidechain_domain::{McTxHash, PolicyId, UtxoId};
241
242 pub(crate) const TEST_PARAMS: UtxoId = UtxoId {
243 tx_hash: McTxHash(hex!("8ea10040249ad3033ae7c4d4b69e0b2e2b50a90741b783491cb5ddf8ced0d861")),
244 index: sidechain_domain::UtxoIndex(0),
245 };
246
247 pub(crate) fn scripts_data_test_vector() -> ScriptsData {
248 ScriptsData {
249 addresses: Addresses {
250 committee_candidate_validator:
251 "addr_test1wzx9p24eryn2h8xnns583edq82y5qkwey7wgqygzr34y6dqny7nsj".into(),
252 d_parameter_validator:
253 "addr_test1wqq69vap60sf6nw7q75xcqd6ecch95vx6qylju26qgp429szlhwea".into(),
254 permissioned_candidates_validator:
255 "addr_test1wqhp3xkm7ntcy0q9cjnttngx94vyn4a7fgyyk5cegw3rkhc4pjahq".into(),
256 illiquid_circulation_supply_validator:
257 "addr_test1wp7zc0geuxhq8sl5vnfsmgman5ezwstlkdl33mc2apyth6svtrlj2".into(),
258 reserve_validator:
259 "addr_test1wpneq7pv2sna8fg3htmhv88pagjzfxrmjekn00f7kt2n5dcygk46p".into(),
260 version_oracle_validator:
261 "addr_test1wpadfxldpsgn3zk5yswm7ygwgmfmawxaj90dl40s77jajfgnker5v".into(),
262 governed_map_validator:
263 "addr_test1wr6unjvhtdvej4txavu5h4mt0xa0uylm39jm9fvg0tmt4pc5h4akm".into(),
264 },
265 policy_ids: PolicyIds {
266 d_parameter: PolicyId(hex!(
267 "95543debb3d64e2c35fd48129d7a3584870ea9db47859c39ee906c1b"
268 )),
269 permissioned_candidates: PolicyId(hex!(
270 "d29bc1e7643976641cd76888009207f20f0e92c1fca7f43deb8f0f0c"
271 )),
272 reserve_auth: PolicyId(hex!(
273 "1c736e05b90d6ea072b0dcf6fe358cbdbb0281138a72ff7c42359285"
274 )),
275 version_oracle: PolicyId(hex!(
276 "d3d6eadae137f555653094f67fe29f7beab90d55d04ca05c1ab9d2af"
277 )),
278 governed_map: PolicyId(hex!(
279 "1b7c0fa2b32502b8e92ec529f1fe3931febf0b7829f23dc514d88aa0"
280 )),
281 },
282 }
283 }
284
285 #[test]
287 fn test_get_scripts_data() {
288 let actual =
289 crate::scripts_data::get_scripts_data(TEST_PARAMS, NetworkIdKind::Testnet).unwrap();
290 assert_eq!(scripts_data_test_vector(), actual);
291 }
292}