From 564cd41626b978d219fe059e6984ce3af8251b3e Mon Sep 17 00:00:00 2001 From: rvcas Date: Sat, 3 Sep 2022 19:08:01 -0400 Subject: [PATCH] chore: clean up tx in info --- crates/cli/src/args.rs | 2 +- crates/cli/src/main.rs | 135 ++-------------------------------------- crates/cli/src/utils.rs | 127 +++++++++++++++++++++++++++++++++++++ 3 files changed, 133 insertions(+), 131 deletions(-) create mode 100644 crates/cli/src/utils.rs diff --git a/crates/cli/src/args.rs b/crates/cli/src/args.rs index 00af0c52..3f5c2ec1 100644 --- a/crates/cli/src/args.rs +++ b/crates/cli/src/args.rs @@ -1,7 +1,7 @@ use std::{collections::HashMap, path::PathBuf}; use clap::{Parser, Subcommand}; -use serde::{de, Deserialize}; +use serde::Deserialize; /// Cardano smart contract toolchain #[derive(Parser)] diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index ce65e8b5..5174f349 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -1,20 +1,18 @@ use std::{ fmt::Write as _, fs::{self, File}, - io::BufReader, collections::HashMap, thread::LocalKey, + io::BufReader, }; -use pallas_addresses::Address; -use pallas_codec::{minicbor::bytes::ByteVec, utils::{MaybeIndefArray, KeyValuePairs}}; -use pallas_primitives::babbage::{BigInt, Constr}; use pallas_traverse::{Era, MultiEraTx}; use uplc::{ - ast::{Constant, DeBruijn, FakeNamedDeBruijn, Name, NamedDeBruijn, Program, Term}, + ast::{DeBruijn, FakeNamedDeBruijn, Name, NamedDeBruijn, Program, Term}, machine::cost_model::ExBudget, - parser, PlutusData, + parser, }; mod args; +mod utils; use args::{Args, TxCommand, UplcCommand}; @@ -69,131 +67,8 @@ fn main() -> anyhow::Result<()> { let file = File::open(&resolved_inputs)?; let reader = BufReader::new(file); let resolved_inputs: Vec = serde_json::from_reader(reader)?; - let tx_in_info: Vec = resolved_inputs - .iter() - .map(|resolved_input| { - let tx_out_ref = PlutusData::Constr(Constr { - tag: 0, - any_constructor: None, - fields: MaybeIndefArray::Indef(vec![ - PlutusData::BoundedBytes( - hex::decode(resolved_input.input.tx_hash.clone()) - .unwrap() - .into(), - ), - PlutusData::BigInt(BigInt::Int( - resolved_input.input.index.into(), - )), - ]), - }); - let address = - Address::from_bech32(&resolved_input.ouput.address).unwrap(); - - let payment_tag = match address.typeid() % 2 { - 0 => 0, - 1 => 1, - _ => unreachable!(), - }; - let stake_tag = match address.typeid() { - 0 | 1 => Some(0), - 2 | 3 => Some(1), - _ => None, - }; - - let (payment_part, stake_part) = match address { - Address::Shelley(s) => { - (s.payment().to_vec(), s.delegation().to_vec()) - } - _ => unreachable!(), - }; - - let lovelace = resolved_input.ouput.value.0; - - let mut assets = resolved_input.ouput.value.1.clone(); - - assets.insert("".to_string(), vec![("".to_string(), lovelace)].into_iter().collect()); - - let tx_out = PlutusData::Constr(Constr { - tag: 0, - any_constructor: None, - fields: MaybeIndefArray::Indef(vec![ - // txOutAddress - PlutusData::Constr(Constr { - tag: 0, - any_constructor: None, - fields: MaybeIndefArray::Indef(vec![ - // addressCredential - PlutusData::Constr(Constr { - tag: payment_tag, - any_constructor: None, - fields: MaybeIndefArray::Indef(vec![ - PlutusData::BoundedBytes( - payment_part.into(), - ), - ]), - }), - // addressStakingCredential - PlutusData::Constr(Constr { - tag: if stake_tag.is_some() { 0 } else { 1 }, - any_constructor: None, - fields: MaybeIndefArray::Indef( - if stake_tag.is_some() { - vec![ - // StakingCredential - PlutusData::Constr(Constr { - tag: 0, - any_constructor: None, - fields: MaybeIndefArray::Indef(vec![ - // StakingHash - PlutusData::Constr(Constr { - tag: stake_tag.unwrap(), - any_constructor: None, - fields: MaybeIndefArray::Indef(vec![ - PlutusData::BoundedBytes( - stake_part.into(), - ), - ]), - }), - ]), - }), - ] - - } else { - vec![] - }, - ), - }), - ]), - }), - - // txOutValue - PlutusData::Map(KeyValuePairs::Def( - assets.iter().map(|val| { - let currency_symbol = PlutusData::BoundedBytes(hex::decode(val.0).unwrap().into()); - let token_map = PlutusData::Map(KeyValuePairs::Def( - val.1.iter().map(|token| { - ( PlutusData::BoundedBytes(token.0.as_bytes().to_vec().into()), PlutusData::BigInt(BigInt::Int((*token.1).into()))) - }).collect() - - )); - (currency_symbol, token_map) - }).collect() - ) ), - - - ]), - }); - PlutusData::Constr(Constr{ - tag: 0, - any_constructor: None, - fields: MaybeIndefArray::Indef(vec![ - tx_out_ref, - tx_out - ]) - }) - }) - .collect(); + let tx_in_info = utils::get_tx_in_info(&resolved_inputs)?; } } diff --git a/crates/cli/src/utils.rs b/crates/cli/src/utils.rs new file mode 100644 index 00000000..959016ba --- /dev/null +++ b/crates/cli/src/utils.rs @@ -0,0 +1,127 @@ +use pallas_addresses::Address; +use pallas_codec::utils::{KeyValuePairs, MaybeIndefArray}; +use pallas_primitives::babbage::{BigInt, Constr}; +use uplc::PlutusData; + +use crate::args::ResolvedInput; + +pub fn get_tx_in_info(resolved_inputs: &[ResolvedInput]) -> anyhow::Result> { + let mut tx_in_info = Vec::new(); + + for resolved_input in resolved_inputs { + let tx_out_ref = PlutusData::Constr(Constr { + tag: 0, + any_constructor: None, + fields: MaybeIndefArray::Indef(vec![ + PlutusData::BoundedBytes(hex::decode(resolved_input.input.tx_hash.clone())?.into()), + PlutusData::BigInt(BigInt::Int(resolved_input.input.index.into())), + ]), + }); + + let address = Address::from_bech32(&resolved_input.ouput.address)?; + + let payment_tag = match address.typeid() % 2 { + 0 => 0, + 1 => 1, + _ => unreachable!(), + }; + let stake_tag = match address.typeid() { + 0 | 1 => Some(0), + 2 | 3 => Some(1), + _ => None, + }; + + let (payment_part, stake_part) = match address { + Address::Shelley(s) => (s.payment().to_vec(), s.delegation().to_vec()), + _ => unreachable!(), + }; + + let lovelace = resolved_input.ouput.value.0; + + let mut assets = resolved_input.ouput.value.1.clone(); + + assets.insert( + "".to_string(), + vec![("".to_string(), lovelace)].into_iter().collect(), + ); + + let tx_out = PlutusData::Constr(Constr { + tag: 0, + any_constructor: None, + fields: MaybeIndefArray::Indef(vec![ + // txOutAddress + PlutusData::Constr(Constr { + tag: 0, + any_constructor: None, + fields: MaybeIndefArray::Indef(vec![ + // addressCredential + PlutusData::Constr(Constr { + tag: payment_tag, + any_constructor: None, + fields: MaybeIndefArray::Indef(vec![PlutusData::BoundedBytes( + payment_part.into(), + )]), + }), + // addressStakingCredential + PlutusData::Constr(Constr { + tag: if stake_tag.is_some() { 0 } else { 1 }, + any_constructor: None, + fields: MaybeIndefArray::Indef(match stake_tag { + Some(stake_tag) => vec![ + // StakingCredential + PlutusData::Constr(Constr { + tag: 0, + any_constructor: None, + fields: MaybeIndefArray::Indef(vec![ + // StakingHash + PlutusData::Constr(Constr { + tag: stake_tag, + any_constructor: None, + fields: MaybeIndefArray::Indef(vec![ + PlutusData::BoundedBytes(stake_part.into()), + ]), + }), + ]), + }), + ], + None => vec![], + }), + }), + ]), + }), + // txOutValue + PlutusData::Map(KeyValuePairs::Def( + assets + .iter() + .map(|val| { + let currency_symbol = + PlutusData::BoundedBytes(hex::decode(val.0).unwrap().into()); + let token_map = PlutusData::Map(KeyValuePairs::Def( + val.1 + .iter() + .map(|token| { + ( + PlutusData::BoundedBytes( + token.0.as_bytes().to_vec().into(), + ), + PlutusData::BigInt(BigInt::Int((*token.1).into())), + ) + }) + .collect(), + )); + (currency_symbol, token_map) + }) + .collect(), + )), + ]), + }); + + tx_in_info.push(PlutusData::Constr(Constr { + tag: 0, + any_constructor: None, + fields: MaybeIndefArray::Indef(vec![tx_out_ref, tx_out]), + })); + } + + Ok(tx_in_info) +}