partner_chains_cardano_offchain/update_governance/
mod.rs

1//! Building and submitting of the transaction that changes the current governance authority
2//!
3//! The transaction:
4//! 1. Burns the previous governance UTXO from the version oracle validator address
5//! 2. Mints exactly 1 multi-sig policy token as authentication
6//! 3. Produces a new governance UTXO at the version oracle validator address with a version oracle
7//!    Plutus datum attached that contains the script ID (32) and policy hash.
8use 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
34/// Updates governance parameters.
35pub 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}