Skip to content

Commit f9c5acd

Browse files
committed
fix: permissioned candidates + refactor common methods
1 parent 3a44c72 commit f9c5acd

File tree

11 files changed

+334
-394
lines changed

11 files changed

+334
-394
lines changed

changelog.md

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

77
## Changed
88

9-
* `setup-main-chain-state` command now uses native Rust to insert the D-Parameter
9+
* `setup-main-chain-state` command now uses native Rust to upsert the D-Parameter and upsert permissioned candidates
1010

1111
## Removed
1212

toolkit/offchain/src/csl.rs

Lines changed: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -321,15 +321,15 @@ pub(crate) trait TransactionBuilderExt {
321321
fn add_mint_one_script_token(
322322
&mut self,
323323
script: &PlutusScript,
324-
ex_units: ExUnits,
324+
ex_units: &ExUnits,
325325
) -> Result<(), JsError>;
326326

327327
/// Adds minting of 1 token (with empty asset name) for the given script using reference input
328328
fn add_mint_one_script_token_using_reference_script(
329329
&mut self,
330330
script: &PlutusScript,
331331
ref_input: &TransactionInput,
332-
ex_units: ExUnits,
332+
ex_units: &ExUnits,
333333
) -> Result<(), JsError>;
334334

335335
/// Sets fields required by the most of partner-chains smart contract transactions.
@@ -389,7 +389,7 @@ impl TransactionBuilderExt for TransactionBuilder {
389389
fn add_mint_one_script_token(
390390
&mut self,
391391
script: &PlutusScript,
392-
ex_units: ExUnits,
392+
ex_units: &ExUnits,
393393
) -> Result<(), JsError> {
394394
let mut mint_builder = self.get_mint_builder().unwrap_or(MintBuilder::new());
395395

@@ -400,7 +400,7 @@ impl TransactionBuilderExt for TransactionBuilder {
400400
&RedeemerTag::new_mint(),
401401
&0u32.into(),
402402
&PlutusData::new_empty_constr_plutus_data(&0u32.into()),
403-
&ex_units,
403+
ex_units,
404404
),
405405
);
406406
mint_builder.add_asset(&mint_witness, &empty_asset_name(), &Int::new_i32(1))?;
@@ -412,7 +412,7 @@ impl TransactionBuilderExt for TransactionBuilder {
412412
&mut self,
413413
script: &PlutusScript,
414414
ref_input: &TransactionInput,
415-
ex_units: ExUnits,
415+
ex_units: &ExUnits,
416416
) -> Result<(), JsError> {
417417
let mut mint_builder = self.get_mint_builder().unwrap_or(MintBuilder::new());
418418

@@ -428,7 +428,7 @@ impl TransactionBuilderExt for TransactionBuilder {
428428
&RedeemerTag::new_mint(),
429429
&0u32.into(),
430430
&PlutusData::new_empty_constr_plutus_data(&0u32.into()),
431-
&ex_units,
431+
ex_units,
432432
),
433433
);
434434
mint_builder.add_asset(&mint_witness, &empty_asset_name(), &Int::new_i32(1))?;
@@ -500,7 +500,7 @@ pub(crate) trait InputsBuilderExt: Sized {
500500
&mut self,
501501
utxo: &OgmiosUtxo,
502502
script: &PlutusScript,
503-
ex_units: ExUnits,
503+
ex_units: &ExUnits,
504504
) -> Result<(), JsError>;
505505

506506
/// Adds ogmios inputs to the tx inputs builder.
@@ -515,7 +515,7 @@ impl InputsBuilderExt for TxInputsBuilder {
515515
&mut self,
516516
utxo: &OgmiosUtxo,
517517
script: &PlutusScript,
518-
ex_units: ExUnits,
518+
ex_units: &ExUnits,
519519
) -> Result<(), JsError> {
520520
let input = utxo.to_csl_tx_input();
521521
let amount = convert_value(&utxo.value)?;
@@ -526,7 +526,7 @@ impl InputsBuilderExt for TxInputsBuilder {
526526
// CSL will set redeemer index for the index of script input after sorting transaction inputs
527527
&0u32.into(),
528528
&PlutusData::new_empty_constr_plutus_data(&0u32.into()),
529-
&ex_units,
529+
ex_units,
530530
),
531531
);
532532
self.add_plutus_script_input(&witness, &input, &amount);
@@ -729,11 +729,12 @@ mod tests {
729729

730730
#[cfg(test)]
731731
mod prop_tests {
732-
use super::{get_builder_config, OgmiosUtxoExt, TransactionBuilderExt, TransactionContext};
732+
use super::{
733+
get_builder_config, zero_ex_units, OgmiosUtxoExt, TransactionBuilderExt, TransactionContext,
734+
};
733735
use crate::test_values::*;
734736
use cardano_serialization_lib::{
735-
BigNum, ExUnits, NetworkIdKind, Transaction, TransactionBuilder, TransactionInputs,
736-
TransactionOutput, Value,
737+
NetworkIdKind, Transaction, TransactionBuilder, TransactionInputs, TransactionOutput, Value,
737738
};
738739
use ogmios_client::types::OgmiosValue;
739740
use ogmios_client::types::{OgmiosTx, OgmiosUtxo};
@@ -755,12 +756,7 @@ mod prop_tests {
755756
protocol_parameters: protocol_parameters(),
756757
};
757758
let mut tx_builder = TransactionBuilder::new(&get_builder_config(&ctx).unwrap());
758-
tx_builder
759-
.add_mint_one_script_token(
760-
&test_policy(),
761-
ExUnits::new(&BigNum::zero(), &BigNum::zero()),
762-
)
763-
.unwrap();
759+
tx_builder.add_mint_one_script_token(&test_policy(), &zero_ex_units()).unwrap();
764760
tx_builder
765761
.add_output_with_one_script_token(
766762
&test_validator(),

toolkit/offchain/src/d_param/mod.rs

Lines changed: 43 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,18 @@
55
//! `datum` field being `[num_permissioned_candidates, num_registered_candidates]`.
66
77
use crate::csl::{
8-
get_builder_config, get_validator_budgets, InputsBuilderExt, ScriptExUnits,
8+
get_builder_config, get_validator_budgets, zero_ex_units, InputsBuilderExt, ScriptExUnits,
99
TransactionBuilderExt, TransactionContext,
1010
};
11+
use crate::init_governance::{self, GovernanceData};
1112
use crate::plutus_script::PlutusScript;
1213
use anyhow::anyhow;
1314
use cardano_serialization_lib::{
1415
ExUnits, JsError, PlutusData, ScriptHash, Transaction, TransactionBuilder, TxInputsBuilder,
1516
};
16-
use cardano_serialization_lib::{LanguageKind, TransactionHash, TransactionInput};
1717
use ogmios_client::{
1818
query_ledger_state::QueryLedgerState, query_network::QueryNetwork, transactions::Transactions,
19-
types::OgmiosScript::Plutus, types::OgmiosUtxo,
19+
types::OgmiosUtxo,
2020
};
2121
use partner_chains_plutus_data::d_param::{d_parameter_to_plutus_data, DParamDatum};
2222
use sidechain_domain::{DParameter, McTxHash, UtxoId};
@@ -116,24 +116,17 @@ async fn insert_d_param<C: QueryLedgerState + Transactions + QueryNetwork>(
116116
ctx: TransactionContext,
117117
genesis_utxo: UtxoId,
118118
client: &C,
119-
) -> anyhow::Result<McTxHash>
120-
where
121-
C: Transactions,
122-
{
123-
let zero_ex_units = ExUnits::new(&0u64.into(), &0u64.into());
124-
125-
let gov_utxo = crate::init_governance::get_governance_utxo(genesis_utxo, client)
126-
.await
127-
.map_err(|e| JsError::from_str(e.to_string().as_str()))?;
119+
) -> anyhow::Result<McTxHash> {
120+
let gov_data = init_governance::get_governance_data(genesis_utxo, client).await?;
128121

129122
let tx = mint_d_param_token_tx(
130123
validator,
131124
policy,
132125
d_parameter,
126+
&gov_data,
133127
&ctx,
134-
zero_ex_units.clone(),
135-
zero_ex_units,
136-
gov_utxo.clone(),
128+
&zero_ex_units(),
129+
&zero_ex_units(),
137130
)?;
138131

139132
let evaluate_response = client.evaluate_transaction(&tx.to_bytes()).await.map_err(|e| {
@@ -144,26 +137,27 @@ where
144137
)
145138
})?;
146139

147-
let ogmios_gov_script =
148-
gov_utxo.clone().script.expect("Gov UTXO should have a reference script");
149-
let gov_policy = PlutusScript::from_ogmios(ogmios_gov_script)?;
150140
let mint_keys = tx.body().mint().expect("insert D parameter transaction has two mints").keys();
151141
let script_to_index: HashMap<ScriptHash, usize> =
152142
vec![(mint_keys.get(0), 0), (mint_keys.get(1), 1)].into_iter().collect();
153143
let mint_ex_units = get_validator_budgets(evaluate_response).mint_ex_units;
154-
let policy_idx = script_to_index.get(&policy.csl_script_hash()).unwrap().clone();
155-
let gov_policy_idx = script_to_index.get(&gov_policy.csl_script_hash()).unwrap().clone();
156-
let policy_ex_units = mint_ex_units.get(policy_idx).expect("Ogmios response should have entry for d_param policy");
157-
let gov_policy_ex_units = mint_ex_units.get(gov_policy_idx).expect("Ogmios response should have entry for gov policy");
144+
let policy_idx = *script_to_index.get(&policy.csl_script_hash()).unwrap();
145+
let gov_policy_idx = *script_to_index.get(&gov_data.policy_script.csl_script_hash()).unwrap();
146+
let policy_ex_units = mint_ex_units
147+
.get(policy_idx)
148+
.expect("Evaluate transaction response should have entry for d_param policy");
149+
let gov_policy_ex_units = mint_ex_units
150+
.get(gov_policy_idx)
151+
.expect("Evaluate transaction response should have entry for governance policy");
158152

159153
let tx = mint_d_param_token_tx(
160154
validator,
161155
policy,
162156
d_parameter,
157+
&gov_data,
163158
&ctx,
164-
policy_ex_units.clone(),
165-
gov_policy_ex_units.clone(),
166-
gov_utxo,
159+
policy_ex_units,
160+
gov_policy_ex_units,
167161
)?;
168162
let signed_tx = ctx.sign(&tx).to_bytes();
169163
let res = client.submit_transaction(&signed_tx).await.map_err(|e| {
@@ -186,27 +180,22 @@ async fn update_d_param<C: QueryLedgerState + Transactions + QueryNetwork>(
186180
ctx: TransactionContext,
187181
genesis_utxo: UtxoId,
188182
client: &C,
189-
) -> anyhow::Result<McTxHash>
190-
where
191-
C: Transactions,
192-
{
183+
) -> anyhow::Result<McTxHash> {
193184
let zero_ex_units = ScriptExUnits {
194-
mint_ex_units: vec![ExUnits::new(&0u64.into(), &0u64.into())],
195-
spend_ex_units: vec![ExUnits::new(&0u64.into(), &0u64.into())],
185+
mint_ex_units: vec![zero_ex_units()],
186+
spend_ex_units: vec![zero_ex_units()],
196187
};
197188

198-
let gov_utxo = crate::init_governance::get_governance_utxo(genesis_utxo, client)
199-
.await
200-
.map_err(|e| JsError::from_str(e.to_string().as_str()))?;
189+
let governance_data = init_governance::get_governance_data(genesis_utxo, client).await?;
201190

202191
let tx = update_d_param_tx(
203192
validator,
204193
policy,
205194
d_parameter,
206195
current_utxo,
196+
&governance_data,
207197
&ctx,
208198
zero_ex_units,
209-
gov_utxo.clone(),
210199
)?;
211200
let evaluate_response = client.evaluate_transaction(&tx.to_bytes()).await.map_err(|e| {
212201
anyhow!(
@@ -222,9 +211,9 @@ where
222211
policy,
223212
d_parameter,
224213
current_utxo,
214+
&governance_data,
225215
&ctx,
226216
spend_ex_units,
227-
gov_utxo.clone(),
228217
)?;
229218
let signed_tx = ctx.sign(&tx).to_bytes();
230219
let res = client.submit_transaction(&signed_tx).await.map_err(|e| {
@@ -243,13 +232,13 @@ fn mint_d_param_token_tx(
243232
validator: &PlutusScript,
244233
policy: &PlutusScript,
245234
d_parameter: &DParameter,
235+
governance_data: &GovernanceData,
246236
ctx: &TransactionContext,
247-
d_param_policy_ex_units: ExUnits,
248-
gov_policy_ex_units: ExUnits,
249-
gov_utxo: OgmiosUtxo,
237+
d_param_policy_ex_units: &ExUnits,
238+
gov_policy_ex_units: &ExUnits,
250239
) -> Result<Transaction, JsError> {
251240
let mut tx_builder = TransactionBuilder::new(&get_builder_config(ctx)?);
252-
// The essence of transaction: mint a governance token, then mint tokena D-Param and set output with it
241+
// The essence of transaction: mint D-Param token and set output with it, mint a governance token.
253242
tx_builder.add_mint_one_script_token(policy, d_param_policy_ex_units)?;
254243
tx_builder.add_output_with_one_script_token(
255244
validator,
@@ -258,23 +247,15 @@ fn mint_d_param_token_tx(
258247
ctx,
259248
)?;
260249

261-
let gov_policy = match gov_utxo.script {
262-
Some(Plutus(ps)) => PlutusScript::from_cbor(&ps.cbor, LanguageKind::PlutusV2),
263-
_ => return Err(JsError::from_str("Governance UTXO script is not PlutusScript")),
264-
};
265-
266-
let gov_tx_input = TransactionInput::new(
267-
&TransactionHash::from_bytes(gov_utxo.transaction.id.into())?,
268-
gov_utxo.index.into(),
269-
);
250+
let gov_tx_input = governance_data.utxo_id_as_tx_input();
270251
tx_builder.add_mint_one_script_token_using_reference_script(
271-
&gov_policy,
252+
&governance_data.policy_script,
272253
&gov_tx_input,
273254
gov_policy_ex_units,
274255
)?;
275256

276-
tx_builder.add_script_reference_input(&gov_tx_input, gov_policy.bytes.len());
277-
tx_builder.add_required_signer(&ctx.payment_key_hash());
257+
tx_builder.add_script_reference_input(&gov_tx_input, governance_data.policy_script.bytes.len());
258+
//tx_builder.add_required_signer(&ctx.payment_key_hash());
278259
tx_builder.balance_update_and_build(ctx)
279260
}
280261

@@ -283,21 +264,20 @@ fn update_d_param_tx(
283264
policy: &PlutusScript,
284265
d_parameter: &DParameter,
285266
script_utxo: &OgmiosUtxo,
267+
governance_data: &GovernanceData,
286268
ctx: &TransactionContext,
287-
mut ex_units: ScriptExUnits,
288-
gov_utxo: OgmiosUtxo,
269+
ex_units: ScriptExUnits,
289270
) -> Result<Transaction, JsError> {
290-
let config = crate::csl::get_builder_config(ctx)?;
291-
let mut tx_builder = TransactionBuilder::new(&config);
271+
let mut tx_builder = TransactionBuilder::new(&get_builder_config(ctx)?);
292272

293273
let mut inputs = TxInputsBuilder::new();
294274
inputs.add_script_utxo_input(
295275
script_utxo,
296276
validator,
297277
ex_units
298278
.spend_ex_units
299-
.pop()
300-
.unwrap_or_else(|| panic!("Spend ex units not found")),
279+
.first()
280+
.ok_or_else(|| JsError::from_str("Spend ex units not found"))?,
301281
)?;
302282
tx_builder.set_inputs(&inputs);
303283

@@ -308,25 +288,17 @@ fn update_d_param_tx(
308288
ctx,
309289
)?;
310290

311-
let gov_policy = match gov_utxo.script {
312-
Some(Plutus(ps)) => PlutusScript::from_cbor(&ps.cbor, LanguageKind::PlutusV2),
313-
_ => return Err(JsError::from_str("Governance UTXO script is not PlutusScript")),
314-
};
315-
316-
let gov_tx_input = TransactionInput::new(
317-
&TransactionHash::from_bytes(gov_utxo.transaction.id.into())?,
318-
gov_utxo.index.into(),
319-
);
291+
let gov_tx_input = governance_data.utxo_id_as_tx_input();
320292
tx_builder.add_mint_one_script_token_using_reference_script(
321-
&gov_policy,
293+
&governance_data.policy_script,
322294
&gov_tx_input,
323295
ex_units
324296
.mint_ex_units
325-
.pop()
326-
.unwrap_or_else(|| panic!("Mint ex units not found")),
297+
.first()
298+
.ok_or_else(|| JsError::from_str("MInt ex units not found"))?,
327299
)?;
328300

329-
tx_builder.add_script_reference_input(&gov_tx_input, gov_policy.bytes.len());
301+
tx_builder.add_script_reference_input(&gov_tx_input, governance_data.policy_script.bytes.len());
330302
tx_builder.add_required_signer(&ctx.payment_key_hash());
331303
tx_builder.balance_update_and_build(ctx)
332304
}

0 commit comments

Comments
 (0)