partner_chains_cardano_offchain/update_governance/
mod.rs1use crate::{
9 await_tx::AwaitTx,
10 cardano_keys::CardanoPaymentSigningKey,
11 csl::{
12 CostStore, Costs, InputsBuilderExt, TransactionBuilderExt, TransactionContext,
13 TransactionExt,
14 },
15 governance::{GovernanceData, MultiSigParameters},
16 init_governance::transaction::version_oracle_datum_output,
17 multisig::{MultiSigSmartContractResult, submit_or_create_tx_to_sign},
18 plutus_script,
19};
20use cardano_serialization_lib::{PlutusData, Transaction, TransactionBuilder, TxInputsBuilder};
21use ogmios_client::{
22 query_ledger_state::{QueryLedgerState, QueryUtxoByUtxoId},
23 query_network::QueryNetwork,
24 transactions::Transactions,
25};
26use raw_scripts::RawScript;
27use sidechain_domain::UtxoId;
28
29#[cfg(test)]
30mod test;
31#[cfg(test)]
32mod test_values;
33
34pub async fn run_update_governance<
36 T: QueryLedgerState + Transactions + QueryNetwork + QueryUtxoByUtxoId,
37 A: AwaitTx,
38>(
39 governance_parameters: &MultiSigParameters,
40 payment_key: &CardanoPaymentSigningKey,
41 genesis_utxo_id: UtxoId,
42 client: &T,
43 await_tx: A,
44) -> anyhow::Result<MultiSigSmartContractResult> {
45 let payment_ctx = TransactionContext::for_payment_key(payment_key, client).await?;
46 let governance_data = GovernanceData::get(genesis_utxo_id, client).await?;
47
48 submit_or_create_tx_to_sign(
49 &governance_data,
50 payment_ctx,
51 |costs, ctx| {
52 update_governance_tx(
53 raw_scripts::VERSION_ORACLE_VALIDATOR,
54 raw_scripts::VERSION_ORACLE_POLICY,
55 genesis_utxo_id,
56 governance_parameters,
57 &governance_data,
58 costs,
59 ctx,
60 )
61 },
62 "Update Governance",
63 client,
64 &await_tx,
65 )
66 .await
67}
68
69fn update_governance_tx(
70 version_oracle_validator: RawScript,
71 version_oracle_policy: RawScript,
72 genesis_utxo: UtxoId,
73 governance_parameters: &MultiSigParameters,
74 governance_data: &GovernanceData,
75 costs: Costs,
76 ctx: &TransactionContext,
77) -> anyhow::Result<Transaction> {
78 let multi_sig_policy = governance_parameters.as_simple_at_least_n().to_csl_native_script();
79 let version_oracle_validator = plutus_script![version_oracle_validator, genesis_utxo]?;
80 let version_oracle_policy = plutus_script![
81 version_oracle_policy,
82 genesis_utxo,
83 version_oracle_validator.address_data(ctx.network)?
84 ]?;
85
86 let config = crate::csl::get_builder_config(ctx)?;
87 let mut tx_builder = TransactionBuilder::new(&config);
88
89 tx_builder.add_mint_one_script_token_using_reference_script(
90 &governance_data.policy.script(),
91 &governance_data.utxo_id_as_tx_input(),
92 &costs,
93 )?;
94
95 tx_builder.add_output(&version_oracle_datum_output(
96 version_oracle_validator.clone(),
97 version_oracle_policy.clone(),
98 multi_sig_policy,
99 ctx.network,
100 ctx,
101 )?)?;
102
103 tx_builder.set_inputs(&{
104 let mut inputs = TxInputsBuilder::new();
105 inputs.add_script_utxo_input(
106 &governance_data.utxo,
107 &version_oracle_validator,
108 &PlutusData::new_integer(&(raw_scripts::ScriptId::GovernancePolicy as u32).into()),
109 &costs.get_one_spend(),
110 )?;
111
112 inputs
113 });
114
115 Ok(tx_builder.balance_update_and_build(ctx)?.remove_native_script_witnesses())
116}