Skip to content

Commit

Permalink
change: Offchain code cleanup (#415)
Browse files Browse the repository at this point in the history
  • Loading branch information
AmbientTea authored Jan 22, 2025
1 parent 6ab6dd3 commit 53e588c
Show file tree
Hide file tree
Showing 9 changed files with 92 additions and 98 deletions.
32 changes: 27 additions & 5 deletions toolkit/offchain/src/csl.rs
Original file line number Diff line number Diff line change
Expand Up @@ -222,6 +222,8 @@ pub(crate) trait OgmiosUtxoExt {
fn to_domain(&self) -> sidechain_domain::UtxoId;

fn get_asset_amount(&self, asset: &AssetId) -> i128;

fn get_plutus_data(&self) -> Option<PlutusData>;
}

impl OgmiosUtxoExt for OgmiosUtxo {
Expand Down Expand Up @@ -259,6 +261,12 @@ impl OgmiosUtxoExt for OgmiosUtxo {
.find(|asset| asset.name == asset_id.asset_name.0.to_vec())
.map_or_else(|| 0, |asset| asset.amount)
}

fn get_plutus_data(&self) -> Option<PlutusData> {
(self.datum.as_ref())
.map(|datum| datum.bytes.clone())
.and_then(|bytes| PlutusData::from_bytes(bytes).ok())
}
}

pub trait UtxoIdExt {
Expand Down Expand Up @@ -364,6 +372,7 @@ pub(crate) trait TransactionBuilderExt {
fn add_mint_one_script_token(
&mut self,
script: &PlutusScript,
asset_name: &AssetName,
redeemer_data: &PlutusData,
ex_units: &ExUnits,
) -> Result<(), JsError>;
Expand Down Expand Up @@ -445,6 +454,7 @@ impl TransactionBuilderExt for TransactionBuilder {
fn add_mint_one_script_token(
&mut self,
script: &PlutusScript,
asset_name: &AssetName,
redeemer_data: &PlutusData,
ex_units: &ExUnits,
) -> Result<(), JsError> {
Expand All @@ -455,7 +465,7 @@ impl TransactionBuilderExt for TransactionBuilder {
&validator_source,
&Redeemer::new(&RedeemerTag::new_mint(), &0u32.into(), redeemer_data, ex_units),
);
mint_builder.add_asset(&mint_witness, &empty_asset_name(), &Int::new_i32(1))?;
mint_builder.add_asset(&mint_witness, asset_name, &Int::new_i32(1))?;
self.set_mint_builder(&mint_builder);
Ok(())
}
Expand Down Expand Up @@ -650,14 +660,21 @@ impl InputsBuilderExt for TxInputsBuilder {
}
}

pub(crate) trait AssetNameExt {
pub(crate) trait AssetNameExt: Sized {
fn to_csl(&self) -> Result<cardano_serialization_lib::AssetName, JsError>;
fn from_csl(asset_name: cardano_serialization_lib::AssetName) -> Result<Self, JsError>;
}

impl AssetNameExt for sidechain_domain::AssetName {
fn to_csl(&self) -> Result<cardano_serialization_lib::AssetName, JsError> {
cardano_serialization_lib::AssetName::new(self.0.to_vec())
}
fn from_csl(asset_name: cardano_serialization_lib::AssetName) -> Result<Self, JsError> {
let name = asset_name.name().try_into().map_err(|err| {
JsError::from_str(&format!("Failed to cast CSL asset name to domain: {err:?}"))
})?;
Ok(Self(name))
}
}

pub(crate) trait AssetIdExt {
Expand Down Expand Up @@ -892,8 +909,8 @@ mod tests {
#[cfg(test)]
mod prop_tests {
use super::{
get_builder_config, unit_plutus_data, zero_ex_units, OgmiosUtxoExt, TransactionBuilderExt,
TransactionContext,
empty_asset_name, get_builder_config, unit_plutus_data, zero_ex_units, OgmiosUtxoExt,
TransactionBuilderExt, TransactionContext,
};
use crate::test_values::*;
use cardano_serialization_lib::{
Expand All @@ -920,7 +937,12 @@ mod prop_tests {
};
let mut tx_builder = TransactionBuilder::new(&get_builder_config(&ctx).unwrap());
tx_builder
.add_mint_one_script_token(&test_policy(), &unit_plutus_data(), &zero_ex_units())
.add_mint_one_script_token(
&test_policy(),
&empty_asset_name(),
&unit_plutus_data(),
&zero_ex_units(),
)
.unwrap();
tx_builder
.add_output_with_one_script_token(
Expand Down
11 changes: 8 additions & 3 deletions toolkit/offchain/src/d_param/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
use crate::await_tx::{AwaitTx, FixedDelayRetries};
use crate::csl::{
get_builder_config, get_validator_budgets, unit_plutus_data, zero_ex_units, InputsBuilderExt,
ScriptExUnits, TransactionBuilderExt, TransactionContext,
empty_asset_name, get_builder_config, get_validator_budgets, unit_plutus_data, zero_ex_units,
InputsBuilderExt, ScriptExUnits, TransactionBuilderExt, TransactionContext,
};
use crate::init_governance::{self, GovernanceData};
use crate::plutus_script::PlutusScript;
Expand Down Expand Up @@ -256,7 +256,12 @@ fn mint_d_param_token_tx(
) -> Result<Transaction, JsError> {
let mut tx_builder = TransactionBuilder::new(&get_builder_config(ctx)?);
// The essence of transaction: mint D-Param token and set output with it, mint a governance token.
tx_builder.add_mint_one_script_token(policy, &unit_plutus_data(), d_param_policy_ex_units)?;
tx_builder.add_mint_one_script_token(
policy,
&empty_asset_name(),
&unit_plutus_data(),
d_param_policy_ex_units,
)?;
tx_builder.add_output_with_one_script_token(
validator,
policy,
Expand Down
16 changes: 5 additions & 11 deletions toolkit/offchain/src/init_governance/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -158,17 +158,11 @@ pub(crate) async fn get_governance_utxo<T: QueryLedgerState + Transactions + Que
utxos
.into_iter()
.find(|utxo| {
let correct_datum = utxo
.datum
.as_ref()
.and_then(|datum| {
PlutusData::from_bytes(datum.bytes.clone()).ok().and_then(|plutus_data| {
VersionOracleDatum::try_from(plutus_data)
.ok()
.map(|data| data.version_oracle == 32)
})
})
.unwrap_or(false);
let correct_datum =
utxo.get_plutus_data()
.and_then(|plutus_data| VersionOracleDatum::try_from(plutus_data).ok())
.map(|data| data.version_oracle == 32)
.unwrap_or(false);

let contains_version_oracle_token =
utxo.value.native_tokens.contains_key(&version_oracle_policy.script_hash());
Expand Down
54 changes: 19 additions & 35 deletions toolkit/offchain/src/init_governance/transaction.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,12 @@ pub(crate) fn init_governance_transaction(
let config = crate::csl::get_builder_config(tx_context)?;
let mut tx_builder = TransactionBuilder::new(&config);

tx_builder.set_mint_builder(&{
let mut mint_builder = MintBuilder::new();

mint_builder.add_asset(
&mint_witness(&version_oracle.policy, &multi_sig_policy, &ex_units)?,
&version_oracle_asset_name(),
&Int::new_i32(1),
)?;
mint_builder
});
tx_builder.add_mint_one_script_token(
&version_oracle.policy,
&version_oracle_asset_name(),
&mint_redeemer(&multi_sig_policy),
&ex_units,
)?;

tx_builder.add_output(&version_oracle_datum_output(
version_oracle.validator.clone(),
Expand All @@ -51,27 +47,15 @@ fn version_oracle_asset_name() -> AssetName {
AssetName::new(b"Version oracle".to_vec()).expect("Constant asset name should work")
}

fn mint_witness(
version_oracle_policy: &PlutusScript,
multi_sig_policy: &PlutusScript,
ex_units: &ExUnits,
) -> anyhow::Result<MintWitness> {
Ok(MintWitness::new_plutus_script(
&PlutusScriptSource::new(&version_oracle_policy.to_csl()),
&Redeemer::new(
&RedeemerTag::new_mint(),
&0u32.into(),
&PlutusData::new_constr_plutus_data(&ConstrPlutusData::new(&0u64.into(), &{
let mut list = PlutusList::new();
list.add(&PlutusData::new_integer(
&(raw_scripts::ScriptId::GovernancePolicy as u32).into(),
));
list.add(&PlutusData::new_bytes(multi_sig_policy.script_hash().to_vec()));
list
})),
ex_units,
),
))
fn mint_redeemer(multi_sig_policy: &PlutusScript) -> PlutusData {
PlutusData::new_constr_plutus_data(&ConstrPlutusData::new(&0u64.into(), &{
let mut list = PlutusList::new();
list.add(&PlutusData::new_integer(
&(raw_scripts::ScriptId::GovernancePolicy as u32).into(),
));
list.add(&PlutusData::new_bytes(multi_sig_policy.script_hash().to_vec()));
list
}))
}

pub(crate) fn version_oracle_datum_output(
Expand All @@ -92,10 +76,10 @@ pub(crate) fn version_oracle_datum_output(
.with_plutus_data(&datum)
.with_script_ref(&ScriptRef::new_plutus_script(&multi_sig_policy.to_csl()))
.next()?;
let mut ma = MultiAsset::new();
let mut assets = Assets::new();
assets.insert(&version_oracle_asset_name(), &1u64.into());
ma.insert(&version_oracle_policy.policy_id().0.into(), &assets);

let ma = MultiAsset::new()
.with_asset_amount(&version_oracle_policy.asset(version_oracle_asset_name())?, 1u64)?;

let output = amount_builder.with_minimum_ada_and_asset(&ma, tx_context)?.build()?;
Ok(output)
}
3 changes: 2 additions & 1 deletion toolkit/offchain/src/permissioned_candidates.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use std::collections::HashMap;

use crate::await_tx::{AwaitTx, FixedDelayRetries};
use crate::csl::{
get_builder_config, get_validator_budgets, zero_ex_units, InputsBuilderExt,
empty_asset_name, get_builder_config, get_validator_budgets, zero_ex_units, InputsBuilderExt,
TransactionBuilderExt, TransactionContext,
};
use crate::init_governance::{self, GovernanceData};
Expand Down Expand Up @@ -288,6 +288,7 @@ fn mint_permissioned_candidates_token_tx(
{
tx_builder.add_mint_one_script_token(
&policy,
&empty_asset_name(),
&permissioned_candidates_policy_redeemer_data(),
permissioned_candidates_ex_units,
)?;
Expand Down
9 changes: 8 additions & 1 deletion toolkit/offchain/src/plutus_script.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use anyhow::{anyhow, Context};
use cardano_serialization_lib::{
Address, Language, LanguageKind, NetworkIdKind, PlutusData, ScriptHash,
Address, JsError, Language, LanguageKind, NetworkIdKind, PlutusData, ScriptHash,
};
use ogmios_client::types::{OgmiosScript, OgmiosScript::Plutus};
use plutus::ToDatum;
Expand Down Expand Up @@ -106,6 +106,13 @@ impl PlutusScript {
AssetId { policy_id: self.policy_id(), asset_name: AssetName::empty() }
}

pub fn asset(
&self,
asset_name: cardano_serialization_lib::AssetName,
) -> Result<AssetId, JsError> {
Ok(AssetId { policy_id: self.policy_id(), asset_name: AssetName::from_csl(asset_name)? })
}

pub fn to_csl(&self) -> cardano_serialization_lib::PlutusScript {
match self.language.kind() {
LanguageKind::PlutusV1 => {
Expand Down
13 changes: 4 additions & 9 deletions toolkit/offchain/src/reserve/deposit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ use crate::{
};
use anyhow::anyhow;
use cardano_serialization_lib::{
ExUnits, JsError, MultiAsset, PlutusData, Transaction, TransactionBuilder, TransactionOutput,
ExUnits, JsError, MultiAsset, Transaction, TransactionBuilder, TransactionOutput,
TransactionOutputBuilder,
};
use ogmios_client::{
Expand Down Expand Up @@ -176,14 +176,9 @@ fn validator_output(
let amount_builder = TransactionOutputBuilder::new()
.with_address(&scripts.validator.address(ctx.network))
.with_plutus_data(
&PlutusData::from_bytes(
current_utxo
.datum
.clone()
.expect("Current UTXO datum was parsed hence it exists")
.bytes,
)
.unwrap(),
&current_utxo
.get_plutus_data()
.expect("Current UTXO datum was parsed hence it exists"),
)
.next()?;
let ma = MultiAsset::new()
Expand Down
45 changes: 17 additions & 28 deletions toolkit/offchain/src/reserve/init.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,17 @@
use crate::{
await_tx::AwaitTx,
csl::{
get_builder_config, get_validator_budgets, zero_ex_units, TransactionBuilderExt,
TransactionContext, TransactionOutputAmountBuilderExt,
get_builder_config, get_validator_budgets, zero_ex_units, MultiAssetExt, OgmiosUtxoExt,
TransactionBuilderExt, TransactionContext, TransactionOutputAmountBuilderExt,
},
init_governance::{get_governance_data, GovernanceData},
plutus_script::PlutusScript,
scripts_data::{self, VersionOracleData},
};
use anyhow::anyhow;
use cardano_serialization_lib::{
AssetName, Assets, BigNum, ConstrPlutusData, ExUnits, Int, JsError, Language, MintBuilder,
MintWitness, MultiAsset, PlutusData, PlutusList, PlutusScriptSource, Redeemer, RedeemerTag,
ScriptHash, ScriptRef, Transaction, TransactionBuilder, TransactionOutputBuilder,
AssetName, BigNum, ConstrPlutusData, ExUnits, JsError, Language, MultiAsset, PlutusData,
PlutusList, ScriptHash, ScriptRef, Transaction, TransactionBuilder, TransactionOutputBuilder,
};
use ogmios_client::{
query_ledger_state::{QueryLedgerState, QueryUtxoByUtxoId},
Expand Down Expand Up @@ -174,21 +173,16 @@ fn init_script_tx(
let mut tx_builder = TransactionBuilder::new(&get_builder_config(ctx)?);
let applied_script = script.applied_plutus_script(version_oracle)?;
{
let mut mint_builder = tx_builder.get_mint_builder().unwrap_or(MintBuilder::new());
let mint_witness = MintWitness::new_plutus_script(
&PlutusScriptSource::new(&version_oracle.policy.to_csl()),
&Redeemer::new(
&RedeemerTag::new_mint(),
&0u32.into(),
&PlutusData::new_constr_plutus_data(&ConstrPlutusData::new(
&BigNum::one(),
&version_oracle_plutus_list(script.id, &applied_script.script_hash()),
)),
&versioning_script_cost,
),
);
mint_builder.add_asset(&mint_witness, &version_oracle_asset_name(), &Int::new_i32(1))?;
tx_builder.set_mint_builder(&mint_builder);
let witness = PlutusData::new_constr_plutus_data(&ConstrPlutusData::new(
&BigNum::one(),
&version_oracle_plutus_list(script.id, &applied_script.script_hash()),
));
tx_builder.add_mint_one_script_token(
&version_oracle.policy,
&version_oracle_asset_name(),
&witness,
&versioning_script_cost,
)?;
}
{
let script_ref = ScriptRef::new_plutus_script(&applied_script.to_csl());
Expand All @@ -200,10 +194,8 @@ fn init_script_tx(
)))
.with_script_ref(&script_ref)
.next()?;
let mut ma = MultiAsset::new();
let mut assets = Assets::new();
assets.insert(&version_oracle_asset_name(), &1u64.into());
ma.insert(&version_oracle.policy.csl_script_hash(), &assets);
let ma = MultiAsset::new()
.with_asset_amount(&version_oracle.policy.asset(version_oracle_asset_name())?, 1u64)?;
let output = amount_builder.with_minimum_ada_and_asset(&ma, ctx)?.build()?;
tx_builder.add_output(&output)?;
}
Expand Down Expand Up @@ -292,10 +284,7 @@ pub(crate) async fn find_script_utxo<
let validator_utxos = client.query_utxos(&[validator_address]).await?;
// Decode datum from utxos and check if it contains script id
Ok(validator_utxos.into_iter().find(|utxo| {
utxo.clone()
.datum
.map(|d| d.bytes)
.and_then(|bytes| PlutusData::from_bytes(bytes).ok())
utxo.get_plutus_data()
.and_then(decode_version_oracle_validator_datum)
.is_some_and(|datum| {
datum.script_id == script_id
Expand Down
7 changes: 2 additions & 5 deletions toolkit/offchain/src/reserve/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@ use crate::{
};
use anyhow::anyhow;
use cardano_serialization_lib::{
ExUnits, JsError, PlutusData, PlutusScriptSource, PlutusWitness, Redeemer, RedeemerTag,
TxInputsBuilder,
ExUnits, JsError, PlutusScriptSource, PlutusWitness, Redeemer, RedeemerTag, TxInputsBuilder,
};
use init::find_script_utxo;
use ogmios_client::{
Expand Down Expand Up @@ -110,9 +109,7 @@ impl ReserveData {
if utxo.get_asset_amount(&auth_token_asset_id) != 1i128 {
return None;
}
utxo.clone()
.datum
.and_then(|d| PlutusData::from_bytes(d.bytes).ok())
utxo.get_plutus_data()
.and_then(|d| ReserveDatum::try_from(d).ok())
.map(|d| (utxo, d))
})
Expand Down

0 comments on commit 53e588c

Please sign in to comment.