diff --git a/Cargo.lock b/Cargo.lock index d90e4dee..0f9282db 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -291,8 +291,7 @@ checksum = "029d8d0b2f198229de29dca79676f2738ff952edf3fde542eb8bf94d8c21b435" [[package]] name = "pallas-addresses" version = "0.14.0-alpha.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5caad3c874e1b6235c3a27a7e25497289392eabbd977e006863caf8ef3652e57" +source = "git+https://github.com/txpipe/pallas#ac25b48797572925ba48ccb0a8f4603410613a75" dependencies = [ "base58", "bech32", @@ -305,8 +304,7 @@ dependencies = [ [[package]] name = "pallas-codec" version = "0.14.0-alpha.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ac4f8895300b80ef2e624373f6421a9cb81523508bc48400f15db7876ec52ea" +source = "git+https://github.com/txpipe/pallas#ac25b48797572925ba48ccb0a8f4603410613a75" dependencies = [ "hex", "minicbor", @@ -316,8 +314,7 @@ dependencies = [ [[package]] name = "pallas-crypto" version = "0.14.0-alpha.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c0a5b31037a97528e10feca6d208a21022f1c6d7837017915a43fae57be99dc" +source = "git+https://github.com/txpipe/pallas#ac25b48797572925ba48ccb0a8f4603410613a75" dependencies = [ "cryptoxide", "hex", @@ -330,8 +327,7 @@ dependencies = [ [[package]] name = "pallas-primitives" version = "0.14.0-alpha.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d2f217857eeccd37ad9fad3cdfc8288d8d2bc41e5c93e7f5f6b3c688873068" +source = "git+https://github.com/txpipe/pallas#ac25b48797572925ba48ccb0a8f4603410613a75" dependencies = [ "base58", "bech32", @@ -346,8 +342,7 @@ dependencies = [ [[package]] name = "pallas-traverse" version = "0.14.0-alpha.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d32519a431ecc6c02507608cee4b75e06518a1cfdfcdd1b13cb7d0b07f638a" +source = "git+https://github.com/txpipe/pallas#ac25b48797572925ba48ccb0a8f4603410613a75" dependencies = [ "hex", "pallas-addresses", @@ -679,7 +674,6 @@ dependencies = [ "cryptoxide", "flat-rs", "hex", - "minicbor", "pallas-codec", "pallas-primitives", "peg", diff --git a/crates/cli/Cargo.toml b/crates/cli/Cargo.toml index 78c74c0e..c9a0a452 100644 --- a/crates/cli/Cargo.toml +++ b/crates/cli/Cargo.toml @@ -14,11 +14,11 @@ authors = ["Lucas Rosa ", "Kasey White "] anyhow = "1.0.57" clap = { version = "3.1.14", features = ["derive"] } hex = "0.4.3" -pallas-addresses = "0.14.0-alpha.2" -pallas-codec = "0.14.0-alpha.2" -pallas-crypto = "0.14.0-alpha.2" -pallas-primitives = "0.14.0-alpha.2" -pallas-traverse = "0.14.0-alpha.2" +pallas-addresses = { git = "https://github.com/txpipe/pallas" } +pallas-codec = { git = "https://github.com/txpipe/pallas" } +pallas-crypto = { git = "https://github.com/txpipe/pallas" } +pallas-primitives = { git = "https://github.com/txpipe/pallas" } +pallas-traverse = { git = "https://github.com/txpipe/pallas" } serde = { version = "1.0.144", features = ["derive"] } serde_json = "1.0.85" uplc = { path = '../uplc', version = "0.0.12" } diff --git a/crates/cli/src/utils.rs b/crates/cli/src/utils.rs index fecff157..7da3b1b4 100644 --- a/crates/cli/src/utils.rs +++ b/crates/cli/src/utils.rs @@ -2,8 +2,8 @@ use pallas_addresses::{ Address, ScriptHash, ShelleyDelegationPart, ShelleyPaymentPart, StakePayload, }; use pallas_codec::{ - minicbor::{bytes::ByteVec, data::Int}, - utils::{AnyUInt, KeyValuePairs, MaybeIndefArray}, + minicbor::{bytes::ByteVec}, + utils::{AnyUInt, KeyValuePairs, MaybeIndefArray, Bytes, Int}, }; use pallas_crypto::hash::{Hash, Hasher}; use pallas_primitives::{ @@ -13,9 +13,9 @@ use pallas_primitives::{ Redeemer, RedeemerTag, RewardAccount, Script, ScriptRef, StakeCredential, TransactionInput, TransactionOutput, Tx, Value, Withdrawals, }, - Fragment, ToHash, + Fragment, }; -use pallas_traverse::{Era, MultiEraTx}; +use pallas_traverse::{Era, MultiEraTx, OriginalHash, ComputeHash}; use std::{ collections::HashMap, convert::{TryFrom, TryInto}, @@ -55,7 +55,7 @@ pub fn get_tx_in_info_old(resolved_inputs: &[ResolvedInputOld]) -> anyhow::Resul let tx_out = PlutusData::Constr(Constr { tag: 0, any_constructor: None, - fields: MaybeIndefArray::Indef(vec![ + fields: vec![ // txOutAddress address.to_plutus_data(), // txOutValue @@ -73,7 +73,7 @@ pub fn get_tx_in_info_old(resolved_inputs: &[ResolvedInputOld]) -> anyhow::Resul PlutusData::BoundedBytes( token.0.as_bytes().to_vec().into(), ), - PlutusData::BigInt(BigInt::Int((*token.1).into())), + PlutusData::BigInt(BigInt::Int((*token.1 as i64).into())), ) }) .collect(), @@ -82,13 +82,13 @@ pub fn get_tx_in_info_old(resolved_inputs: &[ResolvedInputOld]) -> anyhow::Resul }) .collect(), )), - ]), + ], }); tx_in_info.push(PlutusData::Constr(Constr { tag: 0, any_constructor: None, - fields: MaybeIndefArray::Indef(vec![tx_out_ref, tx_out]), + fields: vec![tx_out_ref, tx_out], })); } @@ -101,7 +101,7 @@ fn wrap_with_constr(index: u64, data: PlutusData) -> PlutusData { PlutusData::Constr(Constr { tag: constr_index(index), any_constructor: None, - fields: MaybeIndefArray::Indef(vec![data]), + fields: vec![data], }) } @@ -109,7 +109,7 @@ fn wrap_multiple_with_constr(index: u64, data: Vec) -> PlutusData { PlutusData::Constr(Constr { tag: constr_index(index), any_constructor: None, - fields: MaybeIndefArray::Indef(data), + fields: data, }) } @@ -117,7 +117,7 @@ fn empty_constr(index: u64) -> PlutusData { PlutusData::Constr(Constr { tag: constr_index(index), any_constructor: None, - fields: MaybeIndefArray::Indef(vec![]), + fields: vec![], }) } @@ -178,7 +178,7 @@ impl ToPlutusData for TransactionInput { 0, vec![ wrap_with_constr(0, self.transaction_id.to_plutus_data()), - PlutusData::BigInt(BigInt::Int(self.index.into())), + PlutusData::BigInt(BigInt::Int((self.index as i64).into())), ], ) } @@ -190,7 +190,7 @@ impl ToPlutusData for Hash { } } -impl ToPlutusData for ByteVec { +impl ToPlutusData for Bytes { fn to_plutus_data(&self) -> PlutusData { PlutusData::BoundedBytes(self.clone()) } @@ -202,15 +202,15 @@ impl ToPlutusData for (K, V) { } } -impl ToPlutusData for MaybeIndefArray { +impl ToPlutusData for Vec where A: ToPlutusData { fn to_plutus_data(&self) -> PlutusData { - PlutusData::Array(MaybeIndefArray::Indef( + PlutusData::Array( self.iter().map(|p| p.to_plutus_data()).collect(), - )) + ) } } -impl ToPlutusData for KeyValuePairs { +impl ToPlutusData for KeyValuePairs where K: ToPlutusData + Clone, V: ToPlutusData + Clone { fn to_plutus_data(&self) -> PlutusData { let mut data_vec: Vec<(PlutusData, PlutusData)> = vec![]; for (key, value) in self.iter() { @@ -246,11 +246,11 @@ impl ToPlutusData for Option { impl ToPlutusData for AnyUInt { fn to_plutus_data(&self) -> PlutusData { match self { - AnyUInt::U8(u8) => PlutusData::BigInt(BigInt::Int(Int::from(*u8))), - AnyUInt::U16(u16) => PlutusData::BigInt(BigInt::Int(Int::from(*u16))), - AnyUInt::U32(u32) => PlutusData::BigInt(BigInt::Int(Int::from(*u32))), - AnyUInt::U64(u64) => PlutusData::BigInt(BigInt::Int(Int::from(*u64))), - AnyUInt::MajorByte(u8) => PlutusData::BigInt(BigInt::Int(Int::from(*u8))), // is this correct? I don't know exactly what is does + AnyUInt::U8(n) => PlutusData::BigInt(BigInt::Int(Int::from(*n as i64))), + AnyUInt::U16(n) => PlutusData::BigInt(BigInt::Int(Int::from(*n as i64))), + AnyUInt::U32(n) => PlutusData::BigInt(BigInt::Int(Int::from(*n as i64))), + AnyUInt::U64(n) => PlutusData::BigInt(BigInt::Int(Int::from(*n as i64))), + AnyUInt::MajorByte(n) => PlutusData::BigInt(BigInt::Int(Int::from(*n as i64))), // is this correct? I don't know exactly what is does } } } @@ -275,7 +275,7 @@ impl ToPlutusData for i64 { impl ToPlutusData for u64 { fn to_plutus_data(&self) -> PlutusData { - PlutusData::BigInt(BigInt::Int(Int::from(*self))) + PlutusData::BigInt(BigInt::Int(Int::from(*self as i64))) } } @@ -283,7 +283,7 @@ impl ToPlutusData for Value { fn to_plutus_data(&self) -> PlutusData { match self { Value::Coin(coin) => PlutusData::Map(KeyValuePairs::Def(vec![( - PolicyId::from(vec![]).to_plutus_data(), + PolicyId::from([0; 28]).to_plutus_data(), PlutusData::Map(KeyValuePairs::Def(vec![( AssetName::from(vec![]).to_plutus_data(), coin.to_plutus_data(), @@ -291,7 +291,7 @@ impl ToPlutusData for Value { )])), Value::Multiasset(coin, multiassets) => { let mut data_vec: Vec<(PlutusData, PlutusData)> = vec![( - PolicyId::from(vec![]).to_plutus_data(), + PolicyId::from([0; 28]).to_plutus_data(), PlutusData::Map(KeyValuePairs::Def(vec![( AssetName::from(vec![]).to_plutus_data(), coin.to_plutus_data(), @@ -318,9 +318,9 @@ impl ToPlutusData for Value { impl ToPlutusData for ScriptRef { fn to_plutus_data(&self) -> PlutusData { match &self.0 { - Script::NativeScript(native_script) => native_script.to_hash().to_plutus_data(), - Script::PlutusV1Script(plutus_v1) => plutus_v1.to_hash().to_plutus_data(), - Script::PlutusV2Script(plutus_v2) => plutus_v2.to_hash().to_plutus_data(), + Script::NativeScript(native_script) => native_script.compute_hash().to_plutus_data(), + Script::PlutusV1Script(plutus_v1) => plutus_v1.compute_hash().to_plutus_data(), + Script::PlutusV2Script(plutus_v2) => plutus_v2.compute_hash().to_plutus_data(), } } } @@ -689,29 +689,29 @@ pub enum ScriptPurpose { #[derive(Debug, PartialEq, Clone)] pub struct TxInfoV1 { - inputs: MaybeIndefArray, - outputs: MaybeIndefArray, + inputs: Vec, + outputs: Vec, fee: Value, mint: Mint, - dcert: MaybeIndefArray, - wdrl: MaybeIndefArray<(RewardAccount, Coin)>, + dcert: Vec, + wdrl: Vec<(RewardAccount, Coin)>, valid_range: TimeRange, - signatories: MaybeIndefArray, - data: MaybeIndefArray<(DatumHash, PlutusData)>, + signatories: Vec, + data: Vec<(DatumHash, PlutusData)>, id: Hash<32>, } #[derive(Debug, PartialEq, Clone)] pub struct TxInfoV2 { - inputs: MaybeIndefArray, - reference_inputs: MaybeIndefArray, - outputs: MaybeIndefArray, + inputs: Vec, + reference_inputs: Vec, + outputs: Vec, fee: Value, mint: Mint, - dcert: MaybeIndefArray, + dcert: Vec, wdrl: Withdrawals, valid_range: TimeRange, - signatories: MaybeIndefArray, + signatories: Vec, redeemers: KeyValuePairs, data: KeyValuePairs, id: Hash<32>, @@ -777,9 +777,9 @@ struct DataLookupTable { } fn get_tx_in_info_v1( - inputs: &MaybeIndefArray, - utxos: &MaybeIndefArray, -) -> anyhow::Result> { + inputs: &[TransactionInput], + utxos: &[ResolvedInput], +) -> anyhow::Result> { let result = inputs .iter() .map(|input| { @@ -822,13 +822,13 @@ fn get_tx_in_info_v1( } }) .collect::>(); - Ok(MaybeIndefArray::Indef(result)) + Ok(result) } fn get_tx_in_info_v2( - inputs: &MaybeIndefArray, - utxos: &MaybeIndefArray, -) -> anyhow::Result> { + inputs: &[TransactionInput], + utxos: &[ResolvedInput], +) -> anyhow::Result> { let result = inputs .iter() .map(|input| { @@ -856,14 +856,14 @@ fn get_tx_in_info_v2( } }) .collect::>(); - Ok(MaybeIndefArray::Indef(result)) + Ok(result) } fn get_script_purpose( redeemer: &Redeemer, - inputs: &MaybeIndefArray, + inputs: &[TransactionInput], mint: &Option, - dcert: &Option>, + dcert: &Option>, wdrl: &Option, ) -> anyhow::Result { // sorting according to specs section 4.1: https://hydra.iohk.io/build/18583827/download/1/alonzo-changes.pdf @@ -877,7 +877,7 @@ fn get_script_purpose( .unwrap_or(&KeyValuePairs::Indef(vec![])) .iter() .map(|(policy_id, _)| policy_id.clone()) - .collect::>(); + .collect::>(); policy_ids.sort(); match policy_ids.get(index as usize) { Some(policy_id) => Ok(ScriptPurpose::Minting(policy_id.clone())), @@ -960,25 +960,26 @@ fn get_tx_info_v1( } let inputs = get_tx_in_info_v1(&body.inputs, &utxos)?; - let outputs = MaybeIndefArray::Indef( + + let outputs = body.outputs .iter() .map(|output| TxOut::V1(output.clone())) - .collect(), - ); - let fee = Value::Coin(AnyUInt::U64(body.fee)); + .collect(); + + let fee = Value::Coin(body.fee); let mint = body.mint.clone().unwrap_or(KeyValuePairs::Indef(vec![])); let dcert = body .certificates .clone() - .unwrap_or(MaybeIndefArray::Indef(vec![])); - let wdrl = MaybeIndefArray::Indef( + .unwrap_or(vec![]); + let wdrl = body.withdrawals .clone() .unwrap_or(KeyValuePairs::Indef(vec![])) .deref() - .clone(), - ); + .clone(); + let valid_range = slot_range_to_posix_time_range( TimeRange { lower_bound: body.validity_interval_start, @@ -989,17 +990,18 @@ fn get_tx_info_v1( let signatories = body .required_signers .clone() - .unwrap_or(MaybeIndefArray::Indef(vec![])); - let data = MaybeIndefArray::Indef( + .unwrap_or(vec![]); + + let data = tx.transaction_witness_set .plutus_data .as_ref() - .unwrap_or(&MaybeIndefArray::Indef(vec![])) + .unwrap_or(&vec![]) .iter() - .map(|d| (d.to_hash(), d.clone())) - .collect(), - ); - let id = tx.transaction_body.to_hash(); + .map(|d| (d.original_hash(), d.unwrap())) + .collect(); + + let id = tx.transaction_body.compute_hash(); Ok(TxInfo::V1(TxInfoV1 { inputs, @@ -1027,21 +1029,20 @@ fn get_tx_info_v2( &body .reference_inputs .clone() - .unwrap_or(MaybeIndefArray::Indef(vec![])), + .unwrap_or(vec![]), &utxos, )?; - let outputs = MaybeIndefArray::Indef( + let outputs = body.outputs .iter() .map(|output| TxOut::V2(output.clone())) - .collect(), - ); - let fee = Value::Coin(AnyUInt::U64(body.fee)); + .collect(); + let fee = Value::Coin(body.fee); let mint = body.mint.clone().unwrap_or(KeyValuePairs::Indef(vec![])); let dcert = body .certificates .clone() - .unwrap_or(MaybeIndefArray::Indef(vec![])); + .unwrap_or(vec![]); let wdrl = body .withdrawals .clone() @@ -1056,7 +1057,7 @@ fn get_tx_info_v2( let signatories = body .required_signers .clone() - .unwrap_or(MaybeIndefArray::Indef(vec![])); + .unwrap_or(vec![]); let redeemers = KeyValuePairs::Indef( tx.transaction_witness_set .redeemer @@ -1082,12 +1083,12 @@ fn get_tx_info_v2( tx.transaction_witness_set .plutus_data .as_ref() - .unwrap_or(&MaybeIndefArray::Indef(vec![])) + .unwrap_or(&vec![]) .iter() - .map(|d| (d.to_hash(), d.clone())) + .map(|d| (d.original_hash(), d.unwrap())) .collect(), ); - let id = tx.transaction_body.to_hash(); + let id = tx.transaction_body.compute_hash(); Ok(TxInfo::V2(TxInfoV2 { inputs, @@ -1243,42 +1244,30 @@ fn get_script_and_datum_lookup_table( .transaction_witness_set .plutus_data .clone() - .unwrap_or(MaybeIndefArray::Indef(vec![])); + .unwrap_or(vec![]); let scripts_v1_witnesses = tx .transaction_witness_set .plutus_v1_script .clone() - .unwrap_or(MaybeIndefArray::Indef(vec![])); + .unwrap_or(vec![]); let scripts_v2_witnesses = tx .transaction_witness_set .plutus_v2_script .clone() - .unwrap_or(MaybeIndefArray::Indef(vec![])); + .unwrap_or(vec![]); for plutus_data in plutus_data_witnesses.iter() { - datum.insert(plutus_data.to_hash(), plutus_data.clone()); + datum.insert(plutus_data.original_hash(), plutus_data.clone()); } for script in scripts_v1_witnesses.iter() { - // scripts.insert(script.to_hash(), ScriptVersion::PlutusV1(script.clone())); // TODO: fix hashing bug in pallas - - let mut prefixed_script: Vec = vec![0x01]; - prefixed_script.extend(script.0.iter()); - - let hash = Hasher::<224>::hash(&prefixed_script); - scripts.insert(hash, ScriptVersion::V1(script.clone())); + scripts.insert(script.compute_hash(), ScriptVersion::V1(script.clone())); // TODO: fix hashing bug in pallas } for script in scripts_v2_witnesses.iter() { - // scripts.insert(script.to_hash(), ScriptVersion::PlutusV2(script.clone())); // TODO: fix hashing bug in pallas - - let mut prefixed_script: Vec = vec![0x02]; - prefixed_script.extend(script.0.iter()); - - let hash = Hasher::<224>::hash(&prefixed_script); - scripts.insert(hash, ScriptVersion::V2(script.clone())); + scripts.insert(script.compute_hash(), ScriptVersion::V2(script.clone())); // TODO: fix hashing bug in pallas } // discovery in utxos (script ref) diff --git a/crates/uplc/Cargo.toml b/crates/uplc/Cargo.toml index e2a35ab6..5ecce951 100644 --- a/crates/uplc/Cargo.toml +++ b/crates/uplc/Cargo.toml @@ -16,9 +16,8 @@ exclude = ["test_data/*"] cryptoxide = "0.4.2" flat-rs = { path = "../flat", version = "0.0.10" } hex = "0.4.3" -minicbor = { version = "0.18.0", features = ["std"] } -pallas-codec = "0.14.0-alpha.2" -pallas-primitives = "0.14.0-alpha.2" +pallas-codec = { git = "https://github.com/txpipe/pallas" } +pallas-primitives = { git = "https://github.com/txpipe/pallas" } peg = "0.8.0" pretty = "0.11.3" thiserror = "1.0.31" diff --git a/crates/uplc/src/flat.rs b/crates/uplc/src/flat.rs index efb5b7d1..dd2f800b 100644 --- a/crates/uplc/src/flat.rs +++ b/crates/uplc/src/flat.rs @@ -31,7 +31,7 @@ where T: Binder<'b> + Debug, { pub fn from_cbor(bytes: &'b [u8], buffer: &'b mut Vec) -> Result { - let mut cbor_decoder = minicbor::Decoder::new(bytes); + let mut cbor_decoder = pallas_codec::minicbor::Decoder::new(bytes); let flat_bytes = cbor_decoder .bytes() @@ -63,7 +63,7 @@ where let mut bytes = Vec::new(); - let mut cbor_encoder = minicbor::Encoder::new(&mut bytes); + let mut cbor_encoder = pallas_codec::minicbor::Encoder::new(&mut bytes); cbor_encoder .bytes(&flat_bytes) diff --git a/crates/uplc/src/machine.rs b/crates/uplc/src/machine.rs index e3076b7d..07f5c346 100644 --- a/crates/uplc/src/machine.rs +++ b/crates/uplc/src/machine.rs @@ -489,8 +489,8 @@ impl Value { let mut new_stack: VecDeque<&PlutusData>; // create new stack with of items from the list of pairs of data new_stack = m.iter().fold(VecDeque::new(), |mut acc, d| { - acc.push_back(d.0); - acc.push_back(d.1); + acc.push_back(&d.0); + acc.push_back(&d.1); acc }); // Append old stack to the back of the new stack diff --git a/crates/uplc/src/machine/runtime.rs b/crates/uplc/src/machine/runtime.rs index 95851e5c..c722dc9d 100644 --- a/crates/uplc/src/machine/runtime.rs +++ b/crates/uplc/src/machine/runtime.rs @@ -1,4 +1,4 @@ -use std::{collections::BTreeMap, ops::Deref}; +use std::ops::Deref; use pallas_primitives::babbage::{BigInt, Constr, PlutusData}; @@ -693,14 +693,14 @@ impl DefaultFunction { }, DefaultFunction::MapData => match &args[0] { Value::Con(Constant::ProtoList(_, list)) => { - let mut map = BTreeMap::new(); + let mut map = Vec::new(); for item in list { match item { Constant::ProtoPair(Type::Data, Type::Data, left, right) => { match (*left.clone(), *right.clone()) { (Constant::Data(key), Constant::Data(value)) => { - map.insert(key, value); + map.push((key, value)); } _ => unreachable!(), } @@ -709,7 +709,7 @@ impl DefaultFunction { } } - Ok(Value::Con(Constant::Data(PlutusData::Map(map)))) + Ok(Value::Con(Constant::Data(PlutusData::Map(map.into())))) } _ => unreachable!(), },