Skip to content

Commit 1e7c070

Browse files
authored
fix trash utxo d-param and p-candidates error (#1033)
1 parent 070d9e5 commit 1e7c070

File tree

2 files changed

+31
-8
lines changed

2 files changed

+31
-8
lines changed

toolkit/smart-contracts/offchain/src/d_param/mod.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use crate::multisig::{
1616
MultiSigSmartContractResult, MultiSigSmartContractResult::TransactionSubmitted,
1717
};
1818
use crate::plutus_script::PlutusScript;
19+
use crate::scripts_data::PlutusScriptData;
1920
use anyhow::anyhow;
2021
use cardano_serialization_lib::{PlutusData, Transaction, TransactionBuilder, TxInputsBuilder};
2122
use ogmios_client::query_ledger_state::QueryUtxoByUtxoId;
@@ -49,7 +50,7 @@ pub async fn upsert_d_param<
4950
let scripts = crate::scripts_data::d_parameter_scripts(genesis_utxo, ctx.network)?;
5051
let validator_utxos = client.query_utxos(&[scripts.validator_address.clone()]).await?;
5152

52-
let tx_hash_opt = match get_current_d_parameter(validator_utxos)? {
53+
let tx_hash_opt = match get_current_d_parameter(validator_utxos, &scripts)? {
5354
Some((_, current_d_param)) if current_d_param == *d_parameter => {
5455
log::info!("Current D-parameter value is equal to the one to be set.");
5556
None
@@ -94,8 +95,18 @@ pub async fn upsert_d_param<
9495

9596
fn get_current_d_parameter(
9697
validator_utxos: Vec<OgmiosUtxo>,
98+
scripts: &PlutusScriptData,
9799
) -> Result<Option<(OgmiosUtxo, DParameter)>, anyhow::Error> {
98-
if let Some(utxo) = validator_utxos.first() {
100+
let utxos_with_d_param_token: Vec<OgmiosUtxo> = validator_utxos
101+
.into_iter()
102+
.filter(|utxo| utxo.value.native_tokens.get(&scripts.policy_id().0).is_some())
103+
.collect();
104+
105+
if utxos_with_d_param_token.len() > 1 {
106+
return Err(anyhow!("Multiple UTXOs with D-parameter token found"));
107+
}
108+
109+
if let Some(utxo) = utxos_with_d_param_token.first() {
99110
let datum = utxo.datum.clone().ok_or_else(|| {
100111
anyhow!("Invalid state: an UTXO at the validator script address does not have a datum")
101112
})?;
@@ -255,5 +266,5 @@ pub async fn get_d_param<C: QueryLedgerState + QueryNetwork>(
255266
let network = client.shelley_genesis_configuration().await?.network.to_csl();
256267
let scripts = crate::scripts_data::d_parameter_scripts(genesis_utxo, network)?;
257268
let validator_utxos = client.query_utxos(&[scripts.validator_address.clone()]).await?;
258-
Ok(get_current_d_parameter(validator_utxos)?.map(|(_, d_parameter)| d_parameter))
269+
Ok(get_current_d_parameter(validator_utxos, &scripts)?.map(|(_, d_parameter)| d_parameter))
259270
}

toolkit/smart-contracts/offchain/src/permissioned_candidates.rs

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ use crate::csl::{
1414
use crate::governance::GovernanceData;
1515
use crate::multisig::{MultiSigSmartContractResult, submit_or_create_tx_to_sign};
1616
use crate::plutus_script::PlutusScript;
17+
use crate::scripts_data::PlutusScriptData;
1718
use crate::{cardano_keys::CardanoPaymentSigningKey, scripts_data};
1819
use anyhow::anyhow;
1920
use cardano_serialization_lib::{
@@ -47,11 +48,11 @@ pub async fn upsert_permissioned_candidates<
4748
let ctx = TransactionContext::for_payment_key(payment_signing_key, client).await?;
4849
let scripts = scripts_data::permissioned_candidates_scripts(genesis_utxo, ctx.network)?;
4950
let governance_data = GovernanceData::get(genesis_utxo, client).await?;
50-
let validator_utxos = client.query_utxos(&[scripts.validator_address]).await?;
51+
let validator_utxos = client.query_utxos(&[scripts.validator_address.clone()]).await?;
5152
let mut candidates = candidates.to_owned();
5253
candidates.sort();
5354

54-
let result_opt = match get_current_permissioned_candidates(validator_utxos)? {
55+
let result_opt = match get_current_permissioned_candidates(validator_utxos, &scripts)? {
5556
Some((_, current_permissioned_candidates))
5657
if current_permissioned_candidates == *candidates =>
5758
{
@@ -99,8 +100,18 @@ pub async fn upsert_permissioned_candidates<
99100

100101
fn get_current_permissioned_candidates(
101102
validator_utxos: Vec<OgmiosUtxo>,
103+
scripts: &PlutusScriptData,
102104
) -> Result<Option<(OgmiosUtxo, Vec<PermissionedCandidateData>)>, anyhow::Error> {
103-
if let Some(utxo) = validator_utxos.first() {
105+
let utxos_with_permissioned_candidates_token: Vec<OgmiosUtxo> = validator_utxos
106+
.into_iter()
107+
.filter(|utxo| utxo.value.native_tokens.get(&scripts.policy_id().0).is_some())
108+
.collect();
109+
110+
if utxos_with_permissioned_candidates_token.len() > 1 {
111+
return Err(anyhow!("Multiple UTXOs with permissioned candidates token found"));
112+
}
113+
114+
if let Some(utxo) = utxos_with_permissioned_candidates_token.first() {
104115
let datum = utxo.datum.clone().ok_or_else(|| {
105116
anyhow!("Invalid state: an UTXO at the validator script address does not have a datum")
106117
})?;
@@ -281,8 +292,9 @@ where
281292
C: QueryNetwork + QueryLedgerState,
282293
{
283294
let scripts = scripts_data::permissioned_candidates_scripts(genesis_utxo, network)?;
284-
let validator_utxos = client.query_utxos(&[scripts.validator_address]).await?;
285-
Ok(get_current_permissioned_candidates(validator_utxos)?.map(|(_, candidates)| candidates))
295+
let validator_utxos = client.query_utxos(&[scripts.validator_address.clone()]).await?;
296+
Ok(get_current_permissioned_candidates(validator_utxos, &scripts)?
297+
.map(|(_, candidates)| candidates))
286298
}
287299

288300
#[cfg(test)]

0 commit comments

Comments
 (0)