Skip to content

Commit

Permalink
feat: refactoring folder structure
Browse files Browse the repository at this point in the history
  • Loading branch information
HinsonSIDAN committed Mar 17, 2024
1 parent be4b3a2 commit 51df5fb
Show file tree
Hide file tree
Showing 25 changed files with 446 additions and 196 deletions.
2 changes: 1 addition & 1 deletion Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "sidan-csl-rs"
version = "0.2.2"
version = "0.2.3"
edition = "2021"
license = "MIT"
description = "Wrapper around the cardano-serialization-lib for easier transaction building, heavily inspired by cardano-cli APIs"
Expand Down
7 changes: 3 additions & 4 deletions src/builder/core.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
use cardano_serialization_lib as csl;

use crate::{
csl::builder::{IMeshCSL, MeshCSL},
model::builder::*,
core::builder::{IMeshCSL, MeshCSL},
model::*,
};
use cardano_serialization_lib as csl;

use super::interface::{IMeshTxBuilderCore, MeshTxBuilderCore};

Expand Down
2 changes: 1 addition & 1 deletion src/builder/interface.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::{csl::builder::MeshCSL, model::builder::*};
use crate::{core::builder::MeshCSL, model::*};

pub trait IMeshTxBuilderCore {
/// ## Transaction building method
Expand Down
6 changes: 4 additions & 2 deletions src/builder/mod.rs
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
pub mod core;
pub mod interface;
mod core;
mod interface;
pub use core::*;
pub use interface::*;
3 changes: 3 additions & 0 deletions src/core/algo/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
mod utxo_selection;

pub use utxo_selection::*;
306 changes: 153 additions & 153 deletions src/utils/utxo_selection.rs → src/core/algo/utxo_selection.rs
Original file line number Diff line number Diff line change
@@ -1,153 +1,153 @@
use crate::model::builder::*;
use std::collections::{HashMap, HashSet};

pub fn select_utxos(
inputs: Vec<UTxO>,
required_assets: HashMap<String, String>,
threshold: String,
) -> Vec<UTxO> {
let mut total_required_assets = required_assets.clone();
let lovelace_value = total_required_assets
.get("lovelace")
.unwrap()
.parse::<i64>()
.unwrap();
let threshold_parsed = threshold.parse::<i64>().unwrap();
let sum = lovelace_value + threshold_parsed;
total_required_assets.insert("lovelace".to_string(), sum.to_string());

// Classify the utxos
let mut only_lovelace: Vec<usize> = vec![];
let mut singleton: Vec<usize> = vec![];
let mut pair: Vec<usize> = vec![];
let mut rest: Vec<usize> = vec![];
for (index, utxo) in inputs.iter().enumerate() {
match utxo.output.amount.len() {
1 => only_lovelace.push(index),
2 => singleton.push(index),
3 => pair.push(index),
_ => rest.push(index),
}
}

let mut used_utxos: HashSet<usize> = HashSet::new();
let mut use_utxo = |index: usize, total_required_assets: &mut HashMap<String, String>| {
let utxo = inputs[index].clone();
for asset in utxo.output.amount {
let required_asset_value = total_required_assets
.get(&asset.unit)
.unwrap_or(&"0".to_string())
.parse::<i64>()
.unwrap();
let utxo_asset_value = asset.quantity.parse::<i64>().unwrap();
let final_required_asset_value = required_asset_value - utxo_asset_value;
total_required_assets.insert(asset.unit, final_required_asset_value.to_string());
used_utxos.insert(index);
}
};

let mut process_list =
|list: Vec<usize>, unit: String, total_required_assets: &mut HashMap<String, String>| {
for index in list {
let required_asset_value = total_required_assets
.get(&unit)
.unwrap_or(&"0".to_string())
.parse::<i64>()
.unwrap();
if required_asset_value <= 0 {
return;
}
let utxo = inputs[index].clone();
for asset in utxo.output.amount {
if asset.unit == unit {
use_utxo(index, total_required_assets);
break;
}
}
}
};

let required_units: Vec<String> = total_required_assets.keys().cloned().collect();

for unit in required_units.clone() {
if unit != *"lovelace"
&& total_required_assets
.get(&unit)
.unwrap()
.parse::<i64>()
.unwrap()
> 0
{
process_list(singleton.clone(), unit.clone(), &mut total_required_assets);
process_list(pair.clone(), unit.clone(), &mut total_required_assets);
process_list(rest.clone(), unit.clone(), &mut total_required_assets);
}
}

process_list(
only_lovelace.clone(),
"lovelace".to_string(),
&mut total_required_assets,
);

process_list(
singleton.clone(),
"lovelace".to_string(),
&mut total_required_assets,
);
process_list(
pair.clone(),
"lovelace".to_string(),
&mut total_required_assets,
);
process_list(
rest.clone(),
"lovelace".to_string(),
&mut total_required_assets,
);

for unit in required_units.clone() {
if total_required_assets
.get(&unit)
.unwrap()
.parse::<i64>()
.unwrap()
> 0
{
panic!("Selection failed");
}
}

let mut selected_utxos: Vec<UTxO> = vec![];
for index in used_utxos.iter() {
selected_utxos.push(inputs[*index].clone());
}

selected_utxos
}

#[test]
fn test_basic_selection() {
let utxo_list = vec![UTxO {
input: UtxoInput {
output_index: 0,
tx_hash: "test".to_string(),
},
output: UtxoOutput {
address: "test".to_string(),
amount: vec![Asset {
unit: "lovelace".to_string(),
quantity: "10000000".to_string(),
}],
data_hash: None,
plutus_data: None,
script_ref: None,
script_hash: None,
},
}];

let mut required_assets: HashMap<String, String> = HashMap::new();
required_assets.insert("lovelace".to_string(), "5000000".to_string());
let selected_list = select_utxos(utxo_list.clone(), required_assets, "5000000".to_string());
assert_eq!(utxo_list, selected_list);
}
use crate::model::*;
use std::collections::{HashMap, HashSet};

pub fn select_utxos(
inputs: Vec<UTxO>,
required_assets: HashMap<String, String>,
threshold: String,
) -> Vec<UTxO> {
let mut total_required_assets = required_assets.clone();
let lovelace_value = total_required_assets
.get("lovelace")
.unwrap()
.parse::<i64>()
.unwrap();
let threshold_parsed = threshold.parse::<i64>().unwrap();
let sum = lovelace_value + threshold_parsed;
total_required_assets.insert("lovelace".to_string(), sum.to_string());

// Classify the utxos
let mut only_lovelace: Vec<usize> = vec![];
let mut singleton: Vec<usize> = vec![];
let mut pair: Vec<usize> = vec![];
let mut rest: Vec<usize> = vec![];
for (index, utxo) in inputs.iter().enumerate() {
match utxo.output.amount.len() {
1 => only_lovelace.push(index),
2 => singleton.push(index),
3 => pair.push(index),
_ => rest.push(index),
}
}

let mut used_utxos: HashSet<usize> = HashSet::new();
let mut use_utxo = |index: usize, total_required_assets: &mut HashMap<String, String>| {
let utxo = inputs[index].clone();
for asset in utxo.output.amount {
let required_asset_value = total_required_assets
.get(&asset.unit)
.unwrap_or(&"0".to_string())
.parse::<i64>()
.unwrap();
let utxo_asset_value = asset.quantity.parse::<i64>().unwrap();
let final_required_asset_value = required_asset_value - utxo_asset_value;
total_required_assets.insert(asset.unit, final_required_asset_value.to_string());
used_utxos.insert(index);
}
};

let mut process_list =
|list: Vec<usize>, unit: String, total_required_assets: &mut HashMap<String, String>| {
for index in list {
let required_asset_value = total_required_assets
.get(&unit)
.unwrap_or(&"0".to_string())
.parse::<i64>()
.unwrap();
if required_asset_value <= 0 {
return;
}
let utxo = inputs[index].clone();
for asset in utxo.output.amount {
if asset.unit == unit {
use_utxo(index, total_required_assets);
break;
}
}
}
};

let required_units: Vec<String> = total_required_assets.keys().cloned().collect();

for unit in required_units.clone() {
if unit != *"lovelace"
&& total_required_assets
.get(&unit)
.unwrap()
.parse::<i64>()
.unwrap()
> 0
{
process_list(singleton.clone(), unit.clone(), &mut total_required_assets);
process_list(pair.clone(), unit.clone(), &mut total_required_assets);
process_list(rest.clone(), unit.clone(), &mut total_required_assets);
}
}

process_list(
only_lovelace.clone(),
"lovelace".to_string(),
&mut total_required_assets,
);

process_list(
singleton.clone(),
"lovelace".to_string(),
&mut total_required_assets,
);
process_list(
pair.clone(),
"lovelace".to_string(),
&mut total_required_assets,
);
process_list(
rest.clone(),
"lovelace".to_string(),
&mut total_required_assets,
);

for unit in required_units.clone() {
if total_required_assets
.get(&unit)
.unwrap()
.parse::<i64>()
.unwrap()
> 0
{
panic!("Selection failed");
}
}

let mut selected_utxos: Vec<UTxO> = vec![];
for index in used_utxos.iter() {
selected_utxos.push(inputs[*index].clone());
}

selected_utxos
}

#[test]
fn test_basic_selection() {
let utxo_list = vec![UTxO {
input: UtxoInput {
output_index: 0,
tx_hash: "test".to_string(),
},
output: UtxoOutput {
address: "test".to_string(),
amount: vec![Asset {
unit: "lovelace".to_string(),
quantity: "10000000".to_string(),
}],
data_hash: None,
plutus_data: None,
script_ref: None,
script_hash: None,
},
}];

let mut required_assets: HashMap<String, String> = HashMap::new();
required_assets.insert("lovelace".to_string(), "5000000".to_string());
let selected_list = select_utxos(utxo_list.clone(), required_assets, "5000000".to_string());
assert_eq!(utxo_list, selected_list);
}
5 changes: 1 addition & 4 deletions src/csl/builder.rs → src/core/builder.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
pub use cardano_serialization_lib as csl;

use crate::model::builder::{
Datum, DatumSource, LanguageVersion, Metadata, MintItem, Output, PubKeyTxIn, RefTxIn,
ScriptSource, ScriptTxIn,
};
use crate::model::*;

use super::utils::{build_tx_builder, to_bignum, to_value};

Expand Down
5 changes: 5 additions & 0 deletions src/core/common/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
mod parser;
mod plutus_types;

pub use parser::*;
pub use plutus_types::*;
File renamed without changes.
File renamed without changes.
2 changes: 2 additions & 0 deletions src/csl/mod.rs → src/core/mod.rs
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
pub mod algo;
pub mod builder;
pub mod common;
pub mod utils;
2 changes: 1 addition & 1 deletion src/csl/utils/address.rs → src/core/utils/address.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::model::builder::*;
use crate::model::*;
use cardano_serialization_lib as csl;

pub fn script_to_address(
Expand Down
Loading

0 comments on commit 51df5fb

Please sign in to comment.