Skip to content

Commit 5fc32fb

Browse files
committed
multi-sig for d-parameter command
1 parent 03f6aac commit 5fc32fb

File tree

3 files changed

+61
-31
lines changed

3 files changed

+61
-31
lines changed

changelog.md

+1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ This changelog is based on [Keep A Changelog](https://keepachangelog.com/en/1.1.
66

77
## Changed
88

9+
* `upsert-d-parameter` command now works with multi-sig.
910
* `governance update` command now accepts multiple governance authority key hashes, not just one. It also takes `new-governance-threshold` parameter, which is the number of signatures required to perform governance action.
1011
* `governance init` and `governance update` will set Multisig policy implemented with ALeastN Native Script, instead of custom policy implemented as Plutus Script in partner-chains-smart-contracts. This policy doesn't require to set `required_signers` field in the transaction making it more user friendly.
1112
* Extracted the "Ariadne" committee selection algorithm to the `selection` crate.

toolkit/offchain/src/d_param/mod.rs

+58-29
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
//! The datum encodes D-parameter using VersionedGenericDatum envelope with the D-parameter being
55
//! `datum` field being `[num_permissioned_candidates, num_registered_candidates]`.
66
7+
use std::any::Any;
8+
79
use crate::await_tx::{AwaitTx, FixedDelayRetries};
810
use crate::cardano_keys::CardanoPaymentSigningKey;
911
use crate::csl::{
@@ -20,7 +22,12 @@ use ogmios_client::{
2022
types::OgmiosUtxo,
2123
};
2224
use partner_chains_plutus_data::d_param::{d_parameter_to_plutus_data, DParamDatum};
23-
use sidechain_domain::{DParameter, McTxHash, UtxoId};
25+
use serde_json::json;
26+
use sidechain_domain::{
27+
DParameter, MainchainKeyHash, McSmartContractResult,
28+
McSmartContractResult::{TxCBOR, TxHash},
29+
McTxHash, UtxoId,
30+
};
2431

2532
#[cfg(test)]
2633
mod tests;
@@ -32,7 +39,7 @@ pub trait UpsertDParam {
3239
genesis_utxo: UtxoId,
3340
d_parameter: &DParameter,
3441
payment_signing_key: &CardanoPaymentSigningKey,
35-
) -> anyhow::Result<Option<McTxHash>>;
42+
) -> anyhow::Result<Option<McSmartContractResult>>;
3643
}
3744

3845
impl<C: QueryLedgerState + QueryNetwork + Transactions + QueryUtxoByUtxoId> UpsertDParam for C {
@@ -41,7 +48,7 @@ impl<C: QueryLedgerState + QueryNetwork + Transactions + QueryUtxoByUtxoId> Upse
4148
genesis_utxo: UtxoId,
4249
d_parameter: &DParameter,
4350
payment_signing_key: &CardanoPaymentSigningKey,
44-
) -> anyhow::Result<Option<McTxHash>> {
51+
) -> anyhow::Result<Option<McSmartContractResult>> {
4552
upsert_d_param(
4653
genesis_utxo,
4754
d_parameter,
@@ -62,7 +69,7 @@ pub async fn upsert_d_param<
6269
payment_signing_key: &CardanoPaymentSigningKey,
6370
ogmios_client: &C,
6471
await_tx: &A,
65-
) -> anyhow::Result<Option<McTxHash>> {
72+
) -> anyhow::Result<Option<McSmartContractResult>> {
6673
let ctx = TransactionContext::for_payment_key(payment_signing_key, ogmios_client).await?;
6774
let (validator, policy) = crate::scripts_data::d_parameter_scripts(genesis_utxo, ctx.network)?;
6875
let validator_address = validator.address_bech32(ctx.network)?;
@@ -96,7 +103,7 @@ pub async fn upsert_d_param<
96103
)
97104
},
98105
};
99-
if let Some(tx_hash) = tx_hash_opt {
106+
if let Some(TxHash(tx_hash)) = tx_hash_opt {
100107
await_tx.await_tx_output(ogmios_client, UtxoId::new(tx_hash.0, 0)).await?;
101108
}
102109
Ok(tx_hash_opt)
@@ -131,7 +138,7 @@ async fn insert_d_param<C: QueryLedgerState + Transactions + QueryNetwork>(
131138
ctx: TransactionContext,
132139
genesis_utxo: UtxoId,
133140
client: &C,
134-
) -> anyhow::Result<McTxHash> {
141+
) -> anyhow::Result<McSmartContractResult> {
135142
let gov_data = GovernanceData::get(genesis_utxo, client).await?;
136143

137144
let tx = Costs::calculate_costs(
@@ -140,17 +147,28 @@ async fn insert_d_param<C: QueryLedgerState + Transactions + QueryNetwork>(
140147
)
141148
.await?;
142149

143-
let signed_tx = ctx.sign(&tx).to_bytes();
144-
let res = client.submit_transaction(&signed_tx).await.map_err(|e| {
145-
anyhow!(
146-
"Submit insert D-parameter transaction request failed: {}, bytes: {}",
147-
e,
148-
hex::encode(signed_tx)
149-
)
150-
})?;
151-
let tx_id = McTxHash(res.transaction.id);
152-
log::info!("Transaction submitted: {}", hex::encode(tx_id.0));
153-
Ok(tx_id)
150+
if gov_data.policy.is_single_key_policy_for(&ctx.payment_key_hash()) {
151+
let signed_tx = ctx.sign(&tx).to_bytes();
152+
let res = client.submit_transaction(&signed_tx).await.map_err(|e| {
153+
anyhow!(
154+
"Submit insert D-parameter transaction request failed: {}, bytes: {}",
155+
e,
156+
hex::encode(signed_tx)
157+
)
158+
})?;
159+
let tx_id = McTxHash(res.transaction.id);
160+
log::info!("Transaction submitted: {}", hex::encode(tx_id.0));
161+
Ok(TxHash(tx_id))
162+
} else {
163+
let tx_envelope = json!(
164+
{ "type": "Unwitnessed Tx ConwayEra",
165+
"description": "",
166+
"cborHex": hex::encode(tx.to_bytes())
167+
}
168+
);
169+
log::info!("Transaction envelope: {}", tx_envelope);
170+
Ok(TxCBOR(tx.to_bytes()))
171+
}
154172
}
155173

156174
async fn update_d_param<C: QueryLedgerState + Transactions + QueryNetwork>(
@@ -161,7 +179,7 @@ async fn update_d_param<C: QueryLedgerState + Transactions + QueryNetwork>(
161179
ctx: TransactionContext,
162180
genesis_utxo: UtxoId,
163181
client: &C,
164-
) -> anyhow::Result<McTxHash> {
182+
) -> anyhow::Result<McSmartContractResult> {
165183
let governance_data = GovernanceData::get(genesis_utxo, client).await?;
166184

167185
let tx = Costs::calculate_costs(
@@ -180,17 +198,28 @@ async fn update_d_param<C: QueryLedgerState + Transactions + QueryNetwork>(
180198
)
181199
.await?;
182200

183-
let signed_tx = ctx.sign(&tx).to_bytes();
184-
let res = client.submit_transaction(&signed_tx).await.map_err(|e| {
185-
anyhow!(
186-
"Submit D-parameter update transaction request failed: {}, bytes: {}",
187-
e,
188-
hex::encode(signed_tx)
189-
)
190-
})?;
191-
let tx_id = McTxHash(res.transaction.id);
192-
log::info!("Update D-parameter transaction submitted: {}", hex::encode(tx_id.0));
193-
Ok(tx_id)
201+
if governance_data.policy.is_single_key_policy_for(&ctx.payment_key_hash()) {
202+
let signed_tx = ctx.sign(&tx).to_bytes();
203+
let res = client.submit_transaction(&signed_tx).await.map_err(|e| {
204+
anyhow!(
205+
"Submit D-parameter update transaction request failed: {}, bytes: {}",
206+
e,
207+
hex::encode(signed_tx)
208+
)
209+
})?;
210+
let tx_id = McTxHash(res.transaction.id);
211+
log::info!("Update D-parameter transaction submitted: {}", hex::encode(tx_id.0));
212+
Ok(TxHash(tx_id))
213+
} else {
214+
let tx_envelope = json!(
215+
{ "type": "Unwitnessed Tx ConwayEra",
216+
"description": "",
217+
"cborHex": hex::encode(tx.to_bytes())
218+
}
219+
);
220+
log::info!("Transaction envelope: {}", tx_envelope);
221+
Ok(TxCBOR(tx.to_bytes()))
222+
}
194223
}
195224

196225
fn mint_d_param_token_tx(

toolkit/partner-chains-cli/src/setup_main_chain_state/tests.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ fn no_ariadne_parameters_on_main_chain_do_updates() {
4242
UtxoId::default(),
4343
new_d_parameter(),
4444
payment_signing_key(),
45-
Ok(Some(McTxHash([1; 32]))),
45+
Ok(Some(McSmartContractResult::TxHash(McTxHash([1; 32])))),
4646
)
4747
.with_upsert_permissioned_candidates(
4848
genesis_utxo(),
@@ -96,7 +96,7 @@ fn ariadne_parameters_are_on_main_chain_do_update() {
9696
UtxoId::default(),
9797
new_d_parameter(),
9898
payment_signing_key(),
99-
Ok(Some(McTxHash([1; 32]))),
99+
Ok(Some(McSmartContractResult::TxHash(McTxHash([1; 32])))),
100100
)
101101
.with_upsert_permissioned_candidates(
102102
genesis_utxo(),

0 commit comments

Comments
 (0)