Skip to content

Commit 9b7fd92

Browse files
authored
Merge branch 'master' into ETCM-9040-idempotency
2 parents 1e65668 + de4ba1b commit 9b7fd92

File tree

5 files changed

+62
-37
lines changed

5 files changed

+62
-37
lines changed

.github/workflows/ci.yml

+8-9
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ jobs:
8383
- name: Deploy and test against local environment
8484
uses: ./.github/actions/tests/local-environment-tests
8585
with:
86-
tag: CI
86+
tag: CI
8787
image: ${{ secrets.ECR_REGISTRY_SECRET }}/substrate-node:${{ needs.build.outputs.sha }}
8888
sha: ${{ needs.build.outputs.sha }}
8989
tests: premerge
@@ -95,7 +95,7 @@ jobs:
9595
ACTIONS_PAT: ${{ secrets.ACTIONS_PAT }}
9696
ECR_REGISTRY_SECRET: ${{ secrets.ECR_REGISTRY_SECRET }}
9797
TEST_ENVIRONMENT: local
98-
98+
9999
local-environment-tests-alert:
100100
needs: local-environment-tests
101101
if: always() && needs.local-environment-tests.result != 'skipped'
@@ -226,14 +226,13 @@ jobs:
226226
227227
pre-merge-checks-complete:
228228
if: ${{ always() && (github.event_name == 'workflow_dispatch' || (github.event_name == 'pull_request' && github.event.pull_request.merged == false)) }}
229-
needs: [build, local-environment-tests, argocd-tests, devshell-tests]
229+
needs: [build, local-environment-tests, devshell-tests]
230230
runs-on: ubuntu-latest
231231
steps:
232232
- name: Check if any needed job failed
233233
run: |
234-
if [[ "${{ needs.build.result }}" != "success" ||
235-
"${{ needs.local-environment-tests.result }}" != "success" ||
236-
"${{ needs.argocd-tests.result }}" != "success" ||
234+
if [[ "${{ needs.build.result }}" != "success" ||
235+
"${{ needs.local-environment-tests.result }}" != "success" ||
237236
"${{ needs.devshell-tests.result }}" != "success" ]]; then
238237
echo "One or more needed jobs failed."
239238
exit 1
@@ -291,7 +290,7 @@ jobs:
291290
- name: Deploy and test against local environment
292291
uses: ./.github/actions/tests/local-environment-tests
293292
with:
294-
tag: CI
293+
tag: CI
295294
image: ${{ secrets.ECR_REGISTRY_SECRET }}/substrate-node:${{ needs.build.outputs.sha }}
296295
sha: ${{ needs.build.outputs.sha }}
297296
tests: postmerge
@@ -340,8 +339,8 @@ jobs:
340339
steps:
341340
- name: Check if any needed job failed
342341
run: |
343-
if [[ "${{ needs.deploy-rustdoc.result }}" != "success" ||
344-
"${{ needs.upload-chain-specs.result }}" != "success" ||
342+
if [[ "${{ needs.deploy-rustdoc.result }}" != "success" ||
343+
"${{ needs.upload-chain-specs.result }}" != "success" ||
345344
"${{ needs.local-environment-tests-post-merge.result }}" != "success" ]]; then
346345
echo "One or more needed jobs failed."
347346
exit 1

toolkit/offchain/src/d_param/mod.rs

+24-23
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::csl::{
1111
use crate::plutus_script::PlutusScript;
1212
use anyhow::anyhow;
1313
use cardano_serialization_lib::{
14-
ExUnits, JsError, PlutusData, Transaction, TransactionBuilder, TxInputsBuilder,
14+
ExUnits, JsError, PlutusData, ScriptHash, Transaction, TransactionBuilder, TxInputsBuilder,
1515
};
1616
use cardano_serialization_lib::{LanguageKind, TransactionHash, TransactionInput};
1717
use ogmios_client::{
@@ -20,6 +20,7 @@ use ogmios_client::{
2020
};
2121
use partner_chains_plutus_data::d_param::{d_parameter_to_plutus_data, DParamDatum};
2222
use sidechain_domain::{DParameter, McTxHash, UtxoId};
23+
use std::collections::HashMap;
2324

2425
#[cfg(test)]
2526
mod tests;
@@ -119,13 +120,7 @@ async fn insert_d_param<C: QueryLedgerState + Transactions + QueryNetwork>(
119120
where
120121
C: Transactions,
121122
{
122-
let zero_ex_units = ScriptExUnits {
123-
mint_ex_units: vec![
124-
ExUnits::new(&0u64.into(), &0u64.into()),
125-
ExUnits::new(&0u64.into(), &0u64.into()),
126-
],
127-
spend_ex_units: vec![],
128-
};
123+
let zero_ex_units = ExUnits::new(&0u64.into(), &0u64.into());
129124

130125
let gov_utxo = crate::init_governance::get_governance_utxo(genesis_utxo, client)
131126
.await
@@ -136,24 +131,38 @@ where
136131
policy,
137132
d_parameter,
138133
&ctx,
134+
zero_ex_units.clone(),
139135
zero_ex_units,
140136
gov_utxo.clone(),
141137
)?;
138+
142139
let evaluate_response = client.evaluate_transaction(&tx.to_bytes()).await.map_err(|e| {
143140
anyhow!(
144141
"Evaluate insert D-parameter transaction request failed: {}, bytes: {}",
145142
e,
146143
hex::encode(tx.to_bytes())
147144
)
148145
})?;
149-
let mut mint_witness_ex_units = get_validator_budgets(evaluate_response);
150-
mint_witness_ex_units.mint_ex_units.reverse();
146+
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)?;
150+
let mint_keys = tx.body().mint().expect("insert D parameter transaction has two mints").keys();
151+
let script_to_index: HashMap<ScriptHash, usize> =
152+
vec![(mint_keys.get(0), 0), (mint_keys.get(1), 1)].into_iter().collect();
153+
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");
158+
151159
let tx = mint_d_param_token_tx(
152160
validator,
153161
policy,
154162
d_parameter,
155163
&ctx,
156-
mint_witness_ex_units,
164+
policy_ex_units.clone(),
165+
gov_policy_ex_units.clone(),
157166
gov_utxo,
158167
)?;
159168
let signed_tx = ctx.sign(&tx).to_bytes();
@@ -235,18 +244,13 @@ fn mint_d_param_token_tx(
235244
policy: &PlutusScript,
236245
d_parameter: &DParameter,
237246
ctx: &TransactionContext,
238-
mut ex_units: ScriptExUnits,
247+
d_param_policy_ex_units: ExUnits,
248+
gov_policy_ex_units: ExUnits,
239249
gov_utxo: OgmiosUtxo,
240250
) -> Result<Transaction, JsError> {
241251
let mut tx_builder = TransactionBuilder::new(&get_builder_config(ctx)?);
242252
// The essence of transaction: mint a governance token, then mint tokena D-Param and set output with it
243-
tx_builder.add_mint_one_script_token(
244-
policy,
245-
ex_units
246-
.mint_ex_units
247-
.pop()
248-
.unwrap_or_else(|| panic!("Mint ex units not found")),
249-
)?;
253+
tx_builder.add_mint_one_script_token(policy, d_param_policy_ex_units)?;
250254
tx_builder.add_output_with_one_script_token(
251255
validator,
252256
policy,
@@ -266,10 +270,7 @@ fn mint_d_param_token_tx(
266270
tx_builder.add_mint_one_script_token_using_reference_script(
267271
&gov_policy,
268272
&gov_tx_input,
269-
ex_units
270-
.mint_ex_units
271-
.pop()
272-
.unwrap_or_else(|| panic!("Mint ex units not found")),
273+
gov_policy_ex_units,
273274
)?;
274275

275276
tx_builder.add_script_reference_input(&gov_tx_input, gov_policy.bytes.len());

toolkit/offchain/src/d_param/tests.rs

+13-4
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,22 @@ mod mint_tx {
1717
use super::*;
1818
use cardano_serialization_lib::Transaction;
1919

20-
fn mint_ex_units() -> ExUnits {
20+
fn ex_units() -> ExUnits {
2121
ExUnits::new(&10000u32.into(), &200u32.into())
2222
}
23-
fn ex_units() -> ScriptExUnits {
24-
ScriptExUnits::new().with_mint_ex_units(vec![mint_ex_units(), mint_ex_units()])
23+
24+
fn ex_units_2() -> ExUnits {
25+
ExUnits::new(&20000u32.into(), &400u32.into())
2526
}
27+
2628
fn mint_d_param_tx() -> Transaction {
2729
mint_d_param_token_tx(
2830
&test_validator(),
2931
&test_policy(),
3032
&input_d_param(),
3133
&test_tx_context(),
3234
ex_units(),
35+
ex_units_2(),
3336
governance_utxo(),
3437
)
3538
.expect("Test transaction should be constructed without error")
@@ -64,7 +67,13 @@ mod mint_tx {
6467
assert_eq!(redeemer.tag(), RedeemerTag::new_mint());
6568
assert_eq!(redeemer.index(), 0u64.into());
6669
assert_eq!(redeemer.data(), PlutusData::new_empty_constr_plutus_data(&0u64.into()));
67-
assert_eq!(redeemer.ex_units(), mint_ex_units());
70+
assert_eq!(redeemer.ex_units(), ex_units_2());
71+
72+
let redeemer_2 = redeemers.get(1);
73+
assert_eq!(redeemer_2.tag(), RedeemerTag::new_mint());
74+
assert_eq!(redeemer_2.index(), 1u64.into());
75+
assert_eq!(redeemer_2.data(), PlutusData::new_empty_constr_plutus_data(&0u64.into()));
76+
assert_eq!(redeemer_2.ex_units(), ex_units());
6877
}
6978

7079
#[test]

toolkit/offchain/src/plutus_script.rs

+17
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use anyhow::{anyhow, Context};
22
use cardano_serialization_lib::{Address, LanguageKind, NetworkIdKind, PlutusData, ScriptHash};
3+
use ogmios_client::types::{OgmiosScript, OgmiosScript::Plutus};
34
use plutus::ToDatum;
45
use sidechain_domain::PolicyId;
56
use uplc::ast::{DeBruijn, Program};
@@ -18,6 +19,22 @@ impl PlutusScript {
1819
Self { bytes: cbor.into(), language }
1920
}
2021

22+
pub fn from_ogmios(ogmios_script: OgmiosScript) -> anyhow::Result<Self> {
23+
if let Plutus(script) = ogmios_script {
24+
let language_kind = match script.language.as_str() {
25+
"plutus:v1" => LanguageKind::PlutusV1,
26+
"plutus:v2" => LanguageKind::PlutusV2,
27+
"plutus:v3" => LanguageKind::PlutusV3,
28+
_ => {
29+
return Err(anyhow!("Unsupported Plutus language version: {}", script.language));
30+
},
31+
};
32+
Ok(Self { bytes: script.cbor, language: language_kind })
33+
} else {
34+
Err(anyhow!("Expected Plutus script, got something else."))
35+
}
36+
}
37+
2138
/// This function is needed to create [PlutusScript] from scripts in [raw_scripts],
2239
/// which are encoded as a cbor byte string containing the cbor of the script
2340
/// itself. This function removes this layer of wrapping.

toolkit/offchain/tests/integration_tests.rs

-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ async fn init_goveranance() {
6363
()
6464
}
6565

66-
#[ignore = "awaiting fix for matching evaluation costs of redeemers"]
6766
#[tokio::test]
6867
async fn upsert_d_param() {
6968
let image = GenericImage::new(TEST_IMAGE, TEST_IMAGE_TAG);

0 commit comments

Comments
 (0)