diff --git a/Cargo.lock b/Cargo.lock index 76bcf7f..a751665 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -246,8 +246,9 @@ dependencies = [ "blockfrost-openapi", "cardano-connect", "cardano-tx-builder", + "futures", "hex", - "minicbor", + "minicbor 0.25.1", "reqwest", "serde", "serde_json", @@ -262,7 +263,7 @@ dependencies = [ "bech32 0.11.0", "cryptoxide 0.5.1", "hex", - "minicbor", + "minicbor 0.25.1", "pallas-addresses", "pallas-codec", "pallas-crypto", @@ -1229,22 +1230,17 @@ version = "0.0.0" dependencies = [ "anyhow", "bech32 0.11.0", - "blockfrost", - "blockfrost-openapi", + "cardano-tx-builder", "clap", "cryptoxide 0.5.1", "hex", - "minicbor", - "pallas-addresses", - "pallas-codec", + "minicbor 2.1.1", "pallas-crypto", - "pallas-primitives", "rand", "reqwest", "serde", "serde_json", "tokio", - "uplc", ] [[package]] @@ -1254,7 +1250,7 @@ dependencies = [ "anyhow", "cardano-tx-builder", "hex", - "minicbor", + "minicbor 0.25.1", "rand", ] @@ -1347,6 +1343,12 @@ dependencies = [ "minicbor-derive", ] +[[package]] +name = "minicbor" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f182275033b808ede9427884caa8e05fa7db930801759524ca7925bd8aa7a82" + [[package]] name = "minicbor-derive" version = "0.15.3" @@ -1521,7 +1523,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b2737b05f0dbb6d197feeb26ef15d2567e54833184bd469f5655a0537da89fa" dependencies = [ "hex", - "minicbor", + "minicbor 0.25.1", "num-bigint", "serde", "thiserror 1.0.69", diff --git a/crates/cardano-connect-blockfrost/Cargo.toml b/crates/cardano-connect-blockfrost/Cargo.toml index 2737209..aaec104 100644 --- a/crates/cardano-connect-blockfrost/Cargo.toml +++ b/crates/cardano-connect-blockfrost/Cargo.toml @@ -25,3 +25,4 @@ serde_json = "1.0.138" tokio = { version = "1.47.1", features = ["full"] } cardano-tx-builder = { path = "../cardano-tx-builder" } cardano-connect = { path = "../cardano-connect" } +futures = "0.3.31" diff --git a/crates/cardano-connect-blockfrost/src/lib.rs b/crates/cardano-connect-blockfrost/src/lib.rs index eb3f019..fb9b07c 100644 --- a/crates/cardano-connect-blockfrost/src/lib.rs +++ b/crates/cardano-connect-blockfrost/src/lib.rs @@ -4,15 +4,16 @@ // License, v. 2.0. If a copy of the MPL was not distributed with this // file, You can obtain one at http://mozilla.org/MPL/2.0/. -use std::collections::{BTreeMap, HashMap}; +use std::collections::HashMap; use anyhow::{Result, anyhow}; +use futures::stream::{self, StreamExt}; use blockfrost::{BlockfrostAPI, Pagination}; -use blockfrost_openapi::models::tx_content_output_amount_inner::TxContentOutputAmountInner; +use blockfrost_openapi::models::{address_utxo_content_inner::AddressUtxoContentInner, tx_content_output_amount_inner::TxContentOutputAmountInner}; use cardano_connect::CardanoConnect; use cardano_tx_builder::{ - Address, BuildParameters, Credential, DatumOrHash, Input, Network, Output, PlutusData, Utxo, + Address, BuildParameters, Credential, Datum, Input, Network, Output, PlutusData, Script, Utxo, Value, }; @@ -109,22 +110,54 @@ impl Blockfrost { &self, datum_hash: &Option, inline_datum: &Option, - ) -> Result> { - if let Some(inline_datum) = inline_datum { - Ok(Some(DatumOrHash::Data(plutus_data_from_inline( - inline_datum, - )?))) - } else { - if let Some(datum_hash) = datum_hash { - Ok(Some(DatumOrHash::Data( - self.plutus_data_from_hash(&datum_hash).await?, - ))) - } else { - Ok(None) + ) -> Result { + match (inline_datum, datum_hash) { + (None, None) => Ok(Datum::None), + (Some(inline_datum), _) => Ok(Datum::Data(plutus_data_from_inline(inline_datum)?)), + (_, Some(datum_hash)) => { + Ok(Datum::Data(self.plutus_data_from_hash(&datum_hash).await?)) } } } + pub async fn resolve_utxo( + &self, + bf_utxo: AddressUtxoContentInner, + ) -> Result { + let datum = self + .resolve_datum(&bf_utxo.data_hash, &bf_utxo.inline_datum) + .await?; + let script_ref = match &bf_utxo.reference_script_hash { + None => None, + Some(hash) => Some(self.resolve_script(&hash).await?), + }; + Ok(Utxo { + input: Input { + transaction_id: v2a(hex::decode(&bf_utxo.tx_hash)?)?.into(), + index: bf_utxo.tx_index as u64, + }, + output: Output { + address: Address::from_bech32(&bf_utxo.address)?, + value: from_tx_content_output_amounts(&bf_utxo.amount[..])?, + datum, + script_ref, + }, + }) + } + + /// Blockfrost client has the wrong type. + pub async fn resolve_script(&self, script_hash: &str) -> Result