diff --git a/Cargo.lock b/Cargo.lock index 6ae31da7..bc334896 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -766,8 +766,7 @@ dependencies = [ [[package]] name = "cml-chain" version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec309ed37a653542db58bf506bf31f59f942a5cf269c1709d9555b699a1b302a" +source = "git+https://github.com/dcSpark/cardano-multiplatform-lib?branch=new-conway-cddl-updates#386e91dbd41179fa6b975d6cb324a52f76d0f160" dependencies = [ "base64 0.21.7", "bech32 0.7.3", @@ -821,8 +820,7 @@ dependencies = [ [[package]] name = "cml-core" version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38c826dd7e8939826e1090ebbef48dce630bbceb2a4a4aadbdccd6b583bb7d02" +source = "git+https://github.com/dcSpark/cardano-multiplatform-lib?branch=new-conway-cddl-updates#386e91dbd41179fa6b975d6cb324a52f76d0f160" dependencies = [ "base64 0.13.1", "bech32 0.7.3", @@ -871,8 +869,7 @@ dependencies = [ [[package]] name = "cml-crypto" version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e79a9a6614c1fce917db76eda4ba44fc9a3d8ee5d43becf66299e89e04a8a0f" +source = "git+https://github.com/dcSpark/cardano-multiplatform-lib?branch=new-conway-cddl-updates#386e91dbd41179fa6b975d6cb324a52f76d0f160" dependencies = [ "base64 0.21.7", "bech32 0.7.3", @@ -895,8 +892,7 @@ dependencies = [ [[package]] name = "cml-multi-era" version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e71d10d6eb5afaa9c2befec03827defea3929b455166154ab8bc25d6dc717767" +source = "git+https://github.com/dcSpark/cardano-multiplatform-lib?branch=new-conway-cddl-updates#386e91dbd41179fa6b975d6cb324a52f76d0f160" dependencies = [ "bech32 0.7.3", "cbor_event", diff --git a/Cargo.toml b/Cargo.toml index 1306f3eb..cea95cab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,3 +9,10 @@ members = [ "indexer/plan-visualizer", "indexer/task-docgen" ] + + +[workspace.dependencies] +cml-chain = { git = "https://github.com/dcSpark/cardano-multiplatform-lib", branch = "new-conway-cddl-updates" } +cml-core = { git = "https://github.com/dcSpark/cardano-multiplatform-lib", branch = "new-conway-cddl-updates" } +cml-crypto = { git = "https://github.com/dcSpark/cardano-multiplatform-lib", branch = "new-conway-cddl-updates" } +cml-multi-era = { git = "https://github.com/dcSpark/cardano-multiplatform-lib", branch = "new-conway-cddl-updates" } diff --git a/indexer/Cargo.toml b/indexer/Cargo.toml index f042e859..a0a807d9 100644 --- a/indexer/Cargo.toml +++ b/indexer/Cargo.toml @@ -21,10 +21,10 @@ tasks = { path = "tasks" } # [indexer] anyhow = { version = "1.0.69" } async-trait = { version = "0.1.64" } -cml-chain = { version = "5.2.0" } -cml-core = { version = "5.2.0" } -cml-crypto = { version = "5.2.0" } -cml-multi-era = { version = "5.2.0" } +cml-chain = { workspace = true } +cml-core = { workspace = true } +cml-crypto = { workspace = true } +cml-multi-era = { workspace = true } clap = { version = "3.1", features = ["derive"] } ctrlc = { version = "3.2.4", features = ["termination"] } dotenv = { version = "0.15.0" } diff --git a/indexer/reparse/Cargo.toml b/indexer/reparse/Cargo.toml index 305c07c3..25d38b57 100644 --- a/indexer/reparse/Cargo.toml +++ b/indexer/reparse/Cargo.toml @@ -10,10 +10,10 @@ entity = { path = "../entity" } # [reparse] anyhow = { version = "1.0.69" } -cml-chain = { version = "5.2.0" } -cml-core = { version = "5.2.0" } -cml-crypto = { version = "5.2.0" } -cml-multi-era = { version = "5.2.0" } +cml-chain = { workspace = true } +cml-core = { workspace = true } +cml-crypto = { workspace = true } +cml-multi-era = { workspace = true } dotenv = { version = "0.15.0" } futures = { version = "0.3.21" } hex = { version = "0.4.0" } diff --git a/indexer/tasks/Cargo.toml b/indexer/tasks/Cargo.toml index 27e68a44..c4bc6a4d 100644 --- a/indexer/tasks/Cargo.toml +++ b/indexer/tasks/Cargo.toml @@ -12,10 +12,10 @@ entity = { path = "../entity" } # [tasks] anyhow = { version = "1.0.69" } -cml-chain = { version = "5.2.0" } -cml-core = { version = "5.2.0" } -cml-crypto = { version = "5.2.0" } -cml-multi-era = { version = "5.2.0" } +cml-chain = { workspace = true } +cml-core = { workspace = true } +cml-crypto = { workspace = true } +cml-multi-era = { workspace = true } cardano-projected-nft = { git = "https://github.com/dcSpark/projected-nft-whirlpool.git", rev = "13f81e8666743fefd14c5e1affb1cd828d8c473b" } cfg-if = { version = "1.0.0" } cryptoxide = { version = "0.4.2" } diff --git a/indexer/tasks/src/byron/byron_txs.rs b/indexer/tasks/src/byron/byron_txs.rs index 2befec4c..99187290 100644 --- a/indexer/tasks/src/byron/byron_txs.rs +++ b/indexer/tasks/src/byron/byron_txs.rs @@ -23,7 +23,7 @@ carp_task! { execute |previous_data, task| handle_tx( task.db_tx, task.block, - &previous_data.byron_block.as_ref().unwrap(), + previous_data.byron_block.as_ref().unwrap(), task.config.readonly, task.config.include_payload ); diff --git a/indexer/tasks/src/genesis/genesis_txs.rs b/indexer/tasks/src/genesis/genesis_txs.rs index 9e9db956..f12af54f 100644 --- a/indexer/tasks/src/genesis/genesis_txs.rs +++ b/indexer/tasks/src/genesis/genesis_txs.rs @@ -34,7 +34,7 @@ carp_task! { execute |previous_data, task| handle_txs( task.db_tx, task.block, - &previous_data.genesis_block.as_ref().unwrap(), + previous_data.genesis_block.as_ref().unwrap(), task.config.include_payload ); merge_result |previous_data, result| { diff --git a/indexer/tasks/src/multiera/dex/common.rs b/indexer/tasks/src/multiera/dex/common.rs index ef2d4ae6..afdfbefd 100644 --- a/indexer/tasks/src/multiera/dex/common.rs +++ b/indexer/tasks/src/multiera/dex/common.rs @@ -9,6 +9,7 @@ use cml_chain::json::plutus_datums::{ decode_plutus_datum_to_json_str, decode_plutus_datum_to_json_value, CardanoNodePlutusDatumSchema, }; +use cml_chain::NonemptySetPlutusData; use entity::dex_swap::Operation; use entity::sea_orm::{DatabaseTransaction, Set}; use std::collections::{BTreeMap, BTreeSet}; @@ -18,7 +19,7 @@ use std::collections::{BTreeMap, BTreeSet}; pub fn filter_outputs_and_datums_by_hash( outputs: &[cml_multi_era::utils::MultiEraTransactionOutput], payment_hashes: &[&str], - plutus_data: &[cml_chain::plutus::PlutusData], + plutus_data: &Option, ) -> Vec<( cml_multi_era::utils::MultiEraTransactionOutput, cml_chain::plutus::PlutusData, @@ -41,7 +42,7 @@ pub fn filter_outputs_and_datums_by_hash( pub fn filter_outputs_and_datums_by_address( outputs: &[cml_multi_era::utils::MultiEraTransactionOutput], addresses: &[&str], - plutus_data: &[cml_chain::plutus::PlutusData], + plutus_data: &Option, ) -> Vec<( cml_multi_era::utils::MultiEraTransactionOutput, cml_chain::plutus::PlutusData, diff --git a/indexer/tasks/src/multiera/dex/minswap_v1.rs b/indexer/tasks/src/multiera/dex/minswap_v1.rs index 604d01f7..d3c67137 100644 --- a/indexer/tasks/src/multiera/dex/minswap_v1.rs +++ b/indexer/tasks/src/multiera/dex/minswap_v1.rs @@ -33,7 +33,7 @@ impl Dex for MinSwapV1 { if let Some((output, datum)) = filter_outputs_and_datums_by_hash( &tx.outputs(), &[POOL_SCRIPT_HASH1, POOL_SCRIPT_HASH2], - &tx_witness.plutus_datums.clone().unwrap_or_default(), + &tx_witness.plutus_datums, ) .first() { @@ -77,7 +77,7 @@ impl Dex for MinSwapV1 { if let Some((main_output, main_datum)) = filter_outputs_and_datums_by_hash( &tx.outputs(), &[POOL_SCRIPT_HASH1, POOL_SCRIPT_HASH2], - &tx_witness.plutus_datums.clone().unwrap_or_default(), + &tx_witness.plutus_datums, ) .first() { @@ -109,7 +109,7 @@ impl Dex for MinSwapV1 { for (input, input_datum) in filter_outputs_and_datums_by_address( &inputs, &[BATCH_ORDER_ADDRESS1, BATCH_ORDER_ADDRESS2], - &tx_witness.plutus_datums.clone().unwrap_or_default(), + &tx_witness.plutus_datums, ) { let input_datum = datum_to_json(&input_datum)?; diff --git a/indexer/tasks/src/multiera/dex/sundaeswap_v1.rs b/indexer/tasks/src/multiera/dex/sundaeswap_v1.rs index ec6b4a87..ccc6bf07 100644 --- a/indexer/tasks/src/multiera/dex/sundaeswap_v1.rs +++ b/indexer/tasks/src/multiera/dex/sundaeswap_v1.rs @@ -33,7 +33,7 @@ impl Dex for SundaeSwapV1 { if let Some((output, datum)) = filter_outputs_and_datums_by_hash( &tx.outputs(), &[POOL_SCRIPT_HASH], - &tx_witness.plutus_datums.clone().unwrap_or_default(), + &tx_witness.plutus_datums, ) .first() { @@ -77,7 +77,7 @@ impl Dex for SundaeSwapV1 { if let Some((main_output, main_datum)) = filter_outputs_and_datums_by_hash( &tx.outputs(), &[POOL_SCRIPT_HASH], - &tx_witness.plutus_datums.clone().unwrap_or_default(), + &tx_witness.plutus_datums, ) .first() { @@ -109,7 +109,7 @@ impl Dex for SundaeSwapV1 { for (input, input_datum) in filter_outputs_and_datums_by_hash( &inputs, &[REQUEST_SCRIPT_HASH], - &tx_witness.plutus_datums.clone().unwrap_or_default(), + &tx_witness.plutus_datums.clone(), ) { let input_datum = datum_to_json(&input_datum)?; diff --git a/indexer/tasks/src/multiera/dex/wingriders_v1.rs b/indexer/tasks/src/multiera/dex/wingriders_v1.rs index 28563ee4..dd03e78d 100644 --- a/indexer/tasks/src/multiera/dex/wingriders_v1.rs +++ b/indexer/tasks/src/multiera/dex/wingriders_v1.rs @@ -1,4 +1,5 @@ use cml_chain::byron::ByronTxOut; +use cml_chain::plutus::LegacyRedeemer; use cml_core::serialization::{FromBytes, Serialize}; use cml_crypto::RawBytesEncoding; use cml_multi_era::utils::MultiEraTransactionOutput; @@ -36,7 +37,7 @@ impl Dex for WingRidersV1 { if let Some((output, datum)) = filter_outputs_and_datums_by_hash( &tx.outputs(), &[POOL_SCRIPT_HASH], - &tx_witness.plutus_datums.clone().unwrap_or_default(), + &tx_witness.plutus_datums, ) .first() { @@ -91,12 +92,33 @@ impl Dex for WingRidersV1 { if let Some((pool_output, _)) = filter_outputs_and_datums_by_hash( &tx.outputs(), &[POOL_SCRIPT_HASH], - &tx_witness.plutus_datums.clone().unwrap_or_default(), + &tx_witness.plutus_datums, ) .first() { let redeemers = tx_witness.redeemers.clone().ok_or("No redeemers")?; + let redeemers = match redeemers { + cml_chain::plutus::Redeemers::ArrLegacyRedeemer { + arr_legacy_redeemer, + arr_legacy_redeemer_encoding: _, + } => arr_legacy_redeemer, + cml_chain::plutus::Redeemers::MapRedeemerKeyToRedeemerVal { + map_redeemer_key_to_redeemer_val, + map_redeemer_key_to_redeemer_val_encoding: _, + } => map_redeemer_key_to_redeemer_val + .take() + .into_iter() + .map(|(key, val)| LegacyRedeemer { + tag: key.tag, + index: key.index, + data: val.data, + ex_units: val.ex_units, + encodings: None, + }) + .collect(), + }; + // Get pool input from redemeers let pool_input_redeemer = redeemers.first().ok_or("No redeemers")?; let pool_input = datum_to_json(&pool_input_redeemer.data)?["fields"][0]["int"] @@ -138,11 +160,9 @@ impl Dex for WingRidersV1 { let input = inputs.get(redeemer).ok_or("Failed to pair output")?.clone(); // get information about swap from pool plutus data - let parent_datum = get_plutus_datum_for_output( - &inputs[parent], - &tx_witness.plutus_datums.clone().unwrap_or_default(), - ) - .unwrap(); + let parent_datum = + get_plutus_datum_for_output(&inputs[parent], &tx_witness.plutus_datums) + .unwrap(); let parent_datum = datum_to_json(&parent_datum)?; @@ -158,11 +178,8 @@ impl Dex for WingRidersV1 { let asset2 = build_asset(parse_asset_item(1, 0)?, parse_asset_item(1, 1)?); // get actual plutus datum - let input_datum = get_plutus_datum_for_output( - &input, - &tx_witness.plutus_datums.clone().unwrap_or_default(), - ) - .unwrap(); + let input_datum = + get_plutus_datum_for_output(&input, &tx_witness.plutus_datums).unwrap(); let input_datum = datum_to_json(&input_datum)?; // identify operation: 0 = swap let operation = input_datum["fields"][1]["constructor"] diff --git a/indexer/tasks/src/multiera/multiera_asset_utxo.rs b/indexer/tasks/src/multiera/multiera_asset_utxo.rs index 36e5eaec..8e718c8c 100644 --- a/indexer/tasks/src/multiera/multiera_asset_utxo.rs +++ b/indexer/tasks/src/multiera/multiera_asset_utxo.rs @@ -72,11 +72,14 @@ async fn handle( for (tx_body, cardano_transaction) in block.1.transaction_bodies().iter().zip(multiera_txs) { let collateral_inputs = tx_body .collateral_inputs() - .cloned() - .unwrap_or_default() - .into_iter() - .map(MultiEraTransactionInput::Shelley) - .collect::>(); + .map(|collateral_inputs| { + collateral_inputs + .iter() + .cloned() + .map(MultiEraTransactionInput::Shelley) + .collect::>() + }) + .unwrap_or_else(std::vec::Vec::new); for input in tx_body.inputs().iter().chain(collateral_inputs.iter()) { let utxo = multiera_used_inputs_to_outputs_map diff --git a/indexer/tasks/src/multiera/multiera_datum.rs b/indexer/tasks/src/multiera/multiera_datum.rs index 21acf81c..624e70b3 100644 --- a/indexer/tasks/src/multiera/multiera_datum.rs +++ b/indexer/tasks/src/multiera/multiera_datum.rs @@ -65,19 +65,16 @@ async fn handle_datum( .zip(block.1.transaction_witness_sets().iter()) .zip(multiera_txs) { - for datum in tx_witness_set - .plutus_datums - .clone() - .unwrap_or_default() - .iter() - { - let hash = datum.hash(); - hash_to_tx - .entry(hash) - .or_insert_with(|| cardano_transaction.id); - hash_to_data - .entry(hash) - .or_insert_with(|| datum.to_cbor_bytes()); + if let Some(plutus_datums) = &tx_witness_set.plutus_datums { + for datum in plutus_datums.iter() { + let hash = datum.hash(); + hash_to_tx + .entry(hash) + .or_insert_with(|| cardano_transaction.id); + hash_to_data + .entry(hash) + .or_insert_with(|| datum.to_cbor_bytes()); + } } for output in tx_body.outputs().iter() { let output = match output { diff --git a/indexer/tasks/src/multiera/multiera_projected_nft.rs b/indexer/tasks/src/multiera/multiera_projected_nft.rs index 36fd006e..3b65b919 100644 --- a/indexer/tasks/src/multiera/multiera_projected_nft.rs +++ b/indexer/tasks/src/multiera/multiera_projected_nft.rs @@ -1,5 +1,5 @@ use cardano_projected_nft::{Owner, Redeem, State, Status}; -use cml_chain::plutus::{Redeemer, RedeemerTag}; +use cml_chain::plutus::{LegacyRedeemer, PlutusData, RedeemerTag, Redeemers}; use cml_chain::transaction::DatumOption; use cml_core::serialization::{FromBytes, Serialize}; use cml_crypto::{Ed25519KeyHash, RawBytesEncoding, TransactionHash}; @@ -705,23 +705,44 @@ fn extract_operation_and_datum( Ok(result) } -fn get_projected_nft_redeemers(redeemers: &[Redeemer]) -> Result, DbErr> { - let mut result = BTreeMap::new(); +fn get_projected_nft_redeemers(redeemers: &Redeemers) -> Result, DbErr> { + fn build_map<'a>( + redeemers: impl Iterator, + ) -> BTreeMap { + let mut result = BTreeMap::new(); - for redeemer in redeemers { - if redeemer.tag != RedeemerTag::Spend { - continue; - } - - match Redeem::try_from(redeemer.data.to_cbor_bytes().as_slice()) { - Ok(redeem) => { - result.insert(redeemer.index as i64, redeem); + for (tag, index, data) in redeemers { + if tag != RedeemerTag::Spend { + continue; } - Err(err) => { - tracing::info!("Can't parse redeemer: {err}"); + + match Redeem::try_from(data.to_cbor_bytes().as_slice()) { + Ok(redeem) => { + result.insert(index as i64, redeem); + } + Err(err) => { + tracing::info!("Can't parse redeemer: {err}"); + } } } + + result } - Ok(result) + match redeemers { + Redeemers::ArrLegacyRedeemer { + arr_legacy_redeemer, + arr_legacy_redeemer_encoding: _, + } => Ok(build_map(arr_legacy_redeemer.iter().map(|redeemeer| { + (redeemeer.tag, redeemeer.index, &redeemeer.data) + }))), + Redeemers::MapRedeemerKeyToRedeemerVal { + map_redeemer_key_to_redeemer_val, + map_redeemer_key_to_redeemer_val_encoding: _, + } => Ok(build_map( + map_redeemer_key_to_redeemer_val + .iter() + .map(|(key, val)| (key.tag, key.index, &val.data)), + )), + } } diff --git a/indexer/tasks/src/multiera/multiera_reference_inputs.rs b/indexer/tasks/src/multiera/multiera_reference_inputs.rs index 33b5faed..1b965fa3 100644 --- a/indexer/tasks/src/multiera/multiera_reference_inputs.rs +++ b/indexer/tasks/src/multiera/multiera_reference_inputs.rs @@ -31,7 +31,11 @@ carp_task! { read [multiera_txs]; write [vkey_relation_map]; should_add_task |block, _properties| { - block.1.transaction_bodies().iter().any(|tx| !tx.reference_inputs().cloned().unwrap_or_default().is_empty()) + block.1.transaction_bodies().iter().any(|tx| { + !tx.reference_inputs() + .map(|reference_inputs| reference_inputs.is_empty()) + .unwrap_or(true) + }) }; execute |previous_data, task| handle_input( task.db_tx, @@ -62,11 +66,14 @@ async fn handle_input( for (tx_body, cardano_transaction) in txs.iter().zip(multiera_txs) { let refs = tx_body .reference_inputs() - .cloned() - .unwrap_or_default() - .into_iter() - .map(MultiEraTransactionInput::Shelley) - .collect(); + .map(|reference_inputs| { + reference_inputs + .iter() + .cloned() + .map(MultiEraTransactionInput::Shelley) + .collect::>() + }) + .unwrap_or_else(std::vec::Vec::new); queued_inputs.push((refs, cardano_transaction.id)); } diff --git a/indexer/tasks/src/multiera/multiera_stake_credentials.rs b/indexer/tasks/src/multiera/multiera_stake_credentials.rs index 62f1127b..c04326a8 100644 --- a/indexer/tasks/src/multiera/multiera_stake_credentials.rs +++ b/indexer/tasks/src/multiera/multiera_stake_credentials.rs @@ -63,8 +63,14 @@ async fn handle_stake_credentials( tx_witness.clone(), ); - for signer in tx_body.required_signers().cloned().unwrap_or_default() { - let owner_credential = cml_chain::certs::Credential::new_pub_key(signer) + let required_signers = if let Some(required_signers) = tx_body.required_signers() { + required_signers + } else { + continue; + }; + + for signer in required_signers { + let owner_credential = cml_chain::certs::Credential::new_pub_key(*signer) .to_raw_bytes() .to_vec(); vkey_relation_map.add_relation( @@ -149,7 +155,7 @@ fn queue_witness( witness_set: TransactionWitnessSet, ) { if let Some(vkeys) = witness_set.vkeywitnesses { - for vkey in vkeys { + for vkey in vkeys.iter() { vkey_relation_map.add_relation( tx_id, vkey.vkey.hash().to_raw_bytes(), @@ -158,14 +164,14 @@ fn queue_witness( } } if let Some(scripts) = witness_set.native_scripts { - for script in scripts { + for script in scripts.iter() { vkey_relation_map.add_relation( tx_id, script.hash().to_raw_bytes(), TxCredentialRelationValue::Witness, ); - let vkeys_in_script = RequiredSignersSet::from(&script); + let vkeys_in_script = RequiredSignersSet::from(script); for vkey_in_script in vkeys_in_script { vkey_relation_map.add_relation( tx_id, @@ -177,7 +183,7 @@ fn queue_witness( } if let Some(scripts) = &witness_set.plutus_v1_scripts { - for script in scripts { + for script in scripts.iter() { vkey_relation_map.add_relation( tx_id, script.hash().to_raw_bytes(), @@ -186,7 +192,7 @@ fn queue_witness( } } if let Some(scripts) = &witness_set.plutus_v2_scripts { - for script in scripts { + for script in scripts.iter() { vkey_relation_map.add_relation( tx_id, script.hash().to_raw_bytes(), diff --git a/indexer/tasks/src/multiera/multiera_txs.rs b/indexer/tasks/src/multiera/multiera_txs.rs index 3d6f2374..13c79be5 100644 --- a/indexer/tasks/src/multiera/multiera_txs.rs +++ b/indexer/tasks/src/multiera/multiera_txs.rs @@ -23,7 +23,7 @@ carp_task! { execute |previous_data, task| handle_tx( task.db_tx, task.block, - &previous_data.multiera_block.as_ref().unwrap(), + previous_data.multiera_block.as_ref().unwrap(), task.config.readonly, task.config.include_payload ); diff --git a/indexer/tasks/src/multiera/multiera_unused_input.rs b/indexer/tasks/src/multiera/multiera_unused_input.rs index 9bddc303..75fb873b 100644 --- a/indexer/tasks/src/multiera/multiera_unused_input.rs +++ b/indexer/tasks/src/multiera/multiera_unused_input.rs @@ -22,7 +22,11 @@ carp_task! { write [vkey_relation_map]; should_add_task |block, _properties| { // if any txs has collateral defined, then it has some unused input (either collateral or main inputs if tx failed) - block.1.transaction_bodies().iter().any(|tx| !tx.collateral_inputs().cloned().unwrap_or_default().is_empty()) + block.1.transaction_bodies().iter().any(|tx| { + !tx.collateral_inputs() + .map(|collateral_inputs| collateral_inputs.is_empty()) + .unwrap_or(true) + }) }; execute |previous_data, task| handle_unused_input( task.db_tx, @@ -56,11 +60,14 @@ async fn handle_unused_input( // you can use the is_valid field to know what kind of input it actually is let refs = tx_body .collateral_inputs() - .cloned() - .unwrap_or_default() - .into_iter() - .map(MultiEraTransactionInput::Shelley) - .collect(); + .map(|collateral_inputs| { + collateral_inputs + .iter() + .cloned() + .map(MultiEraTransactionInput::Shelley) + .collect() + }) + .unwrap_or_else(std::vec::Vec::new); queued_unused_inputs.push((refs, cardano_transaction.id)) } } diff --git a/indexer/tasks/src/multiera/multiera_used_inputs.rs b/indexer/tasks/src/multiera/multiera_used_inputs.rs index 83a3fe43..29b96d7b 100644 --- a/indexer/tasks/src/multiera/multiera_used_inputs.rs +++ b/indexer/tasks/src/multiera/multiera_used_inputs.rs @@ -75,11 +75,14 @@ async fn handle_input( if !cardano_transaction.is_valid { let refs = tx_body .collateral_inputs() - .cloned() - .unwrap_or_default() - .into_iter() - .map(MultiEraTransactionInput::Shelley) - .collect(); + .map(|collateral_inputs| { + collateral_inputs + .iter() + .cloned() + .map(MultiEraTransactionInput::Shelley) + .collect() + }) + .unwrap_or_else(std::vec::Vec::new); queued_inputs.push((refs, cardano_transaction.id)) } } diff --git a/indexer/tasks/src/multiera/utils/common.rs b/indexer/tasks/src/multiera/utils/common.rs index 59a7c566..5ee62aa5 100644 --- a/indexer/tasks/src/multiera/utils/common.rs +++ b/indexer/tasks/src/multiera/utils/common.rs @@ -1,5 +1,6 @@ use cml_chain::certs::Credential; use cml_chain::transaction::DatumOption; +use cml_chain::NonemptySetPlutusData; use cml_core::serialization::{Deserialize, Serialize, ToBytes}; use cml_crypto::RawBytesEncoding; use cml_multi_era::utils::{MultiEraTransactionInput, MultiEraTransactionOutput}; @@ -57,7 +58,7 @@ pub fn get_asset_amount( pub fn get_plutus_datum_for_output( output: &cml_multi_era::utils::MultiEraTransactionOutput, - plutus_data: &[cml_chain::plutus::PlutusData], + plutus_data: &Option, ) -> Option { let output = match output { MultiEraTransactionOutput::Byron(_) => { @@ -75,10 +76,12 @@ pub fn get_plutus_datum_for_output( match datum_option { DatumOption::Datum { datum, .. } => Some(datum), - DatumOption::Hash { datum_hash, .. } => plutus_data - .iter() - .find(|datum| datum.hash() == datum_hash) - .cloned(), + DatumOption::Hash { datum_hash, .. } => plutus_data.as_ref().and_then(|non_empty_set| { + non_empty_set + .iter() + .find(|datum| datum.hash() == datum_hash) + .cloned() + }), } }