Skip to content

Commit

Permalink
Finish exporting thermostat algo
Browse files Browse the repository at this point in the history
  • Loading branch information
gostkin committed Mar 21, 2023
1 parent 3185156 commit 51598c5
Show file tree
Hide file tree
Showing 13 changed files with 627 additions and 517 deletions.
37 changes: 17 additions & 20 deletions cardano-utils/src/conversion.rs
@@ -1,10 +1,10 @@
use anyhow::anyhow;
use cardano_multiplatform_lib::ledger::common::value::{BigNum, Coin};
use cardano_multiplatform_lib::{MultiAsset, PolicyID};
use dcspark_core::tx::TransactionAsset;
use dcspark_core::{AssetName, PolicyId, Regulated, TokenId, Value};
use deps::bigdecimal::ToPrimitive;
use std::collections::HashMap;
use anyhow::anyhow;

pub fn value_to_csl_coin(value: &Value<Regulated>) -> anyhow::Result<Coin> {
Ok(
Expand Down Expand Up @@ -62,26 +62,24 @@ pub fn tokens_to_csl_value(
if !assets.is_empty() {
let mut multi_assets = MultiAsset::new();
for (_, asset) in assets.iter() {
let policy_id =
PolicyID::from_bytes(hex::decode(asset.policy_id.to_string()).map_err(|err| {
anyhow!("Failed to decode the policy id: hex error {err}")
})?)
.map_err(|error| {
anyhow!("Failed to decode the policy id: {error}")
})?;
let policy_id = PolicyID::from_bytes(
hex::decode(asset.policy_id.to_string())
.map_err(|err| anyhow!("Failed to decode the policy id: hex error {err}"))?,
)
.map_err(|error| anyhow!("Failed to decode the policy id: {error}"))?;
let asset_name = cardano_multiplatform_lib::AssetName::new(
hex::decode(asset.asset_name.as_ref()).map_err(|err| {
anyhow!("Failed to decode the asset name {err}")
})?,
).map_err(|err| anyhow!("can't decode asset_name {err}"))?;
hex::decode(asset.asset_name.as_ref())
.map_err(|err| anyhow!("Failed to decode the asset name {err}"))?,
)
.map_err(|err| anyhow!("can't decode asset_name {err}"))?;

let value =
BigNum::from_str(&asset.quantity.truncate().to_string()).map_err(|error| {
anyhow!(
"Value {value} ({fingerprint}) was not within the boundaries: {error}",
value = asset.quantity.truncate(),
fingerprint = asset.fingerprint,
)
anyhow!(
"Value {value} ({fingerprint}) was not within the boundaries: {error}",
value = asset.quantity.truncate(),
fingerprint = asset.fingerprint,
)
})?;

multi_assets.set_asset(&policy_id, &asset_name, &value);
Expand All @@ -101,9 +99,8 @@ pub fn csl_value_to_tokens(
multiasset_iter(value, |policy_id, asset_name, quantity| {
let policy_id = PolicyId::new(hex::encode(policy_id.to_bytes()));
let asset_name = AssetName::new(hex::encode(asset_name.to_bytes()));
let fingerprint = crate::cip14::fingerprint(&policy_id, &asset_name).map_err(|err| {
anyhow!("Can't create fingerprint {err}")
})?;
let fingerprint = crate::cip14::fingerprint(&policy_id, &asset_name)
.map_err(|err| anyhow!("Can't create fingerprint {err}"))?;
let quantity = quantity.ok_or_else(|| anyhow!("not found asset quantity"))?;
let asset = TransactionAsset {
policy_id,
Expand Down
3 changes: 0 additions & 3 deletions utxo-selection/src/algorithm.rs
@@ -1,8 +1,5 @@
use crate::common::{InputOutputSetup, InputSelectionResult};
use crate::estimate::TransactionFeeEstimator;
use crate::UTxOBuilder;
use cardano_multiplatform_lib::error::JsError;
use dcspark_core::tx::UTxODetails;

pub trait InputSelectionAlgorithm {
type InputUtxo: Clone;
Expand Down
16 changes: 4 additions & 12 deletions utxo-selection/src/algorithms/largest_first.rs
Expand Up @@ -2,14 +2,11 @@ use crate::algorithm::InputSelectionAlgorithm;
use crate::algorithms::utils;
use crate::common::{InputOutputSetup, InputSelectionResult};
use crate::estimate::TransactionFeeEstimator;
use crate::UTxOBuilder;
use anyhow::anyhow;
use cardano_multiplatform_lib::builders::input_builder::InputBuilderResult;
use cardano_multiplatform_lib::error::JsError;
use cardano_multiplatform_lib::TransactionOutput;
use dcspark_core::tx::UTxODetails;
use dcspark_core::{Balance, Regulated, Value};
use dcspark_core::Balance;
use std::collections::HashSet;
use anyhow::anyhow;

pub struct LargestFirst {
available_inputs: Vec<InputBuilderResult>,
Expand Down Expand Up @@ -111,9 +108,7 @@ mod tests {
use crate::algorithms::LargestFirst;
use crate::{DummyCmlFeeEstimate, InputOutputSetup, InputSelectionAlgorithm};
use cardano_multiplatform_lib::address::Address;
use cardano_multiplatform_lib::builders::input_builder::{
InputBuilderResult, SingleInputBuilder,
};
use cardano_multiplatform_lib::builders::input_builder::SingleInputBuilder;
use cardano_multiplatform_lib::crypto::TransactionHash;
use cardano_multiplatform_lib::ledger::common::value::{BigNum, Coin, Value};
use cardano_multiplatform_lib::{TransactionInput, TransactionOutput};
Expand Down Expand Up @@ -181,10 +176,7 @@ mod tests {
.payment_key()
.unwrap();
largest_first
.set_available_inputs(vec![
input_builder_result_1.clone(),
input_builder_result_2.clone(),
])
.set_available_inputs(vec![input_builder_result_1, input_builder_result_2.clone()])
.unwrap();
let result = largest_first
.select_inputs(
Expand Down
12 changes: 6 additions & 6 deletions utxo-selection/src/algorithms/largest_first_multiasset.rs
Expand Up @@ -3,12 +3,10 @@ use crate::algorithms::utils;
use crate::algorithms::utils::result_from_cml;
use crate::common::{InputOutputSetup, InputSelectionResult};
use crate::estimate::TransactionFeeEstimator;
use crate::UTxOBuilder;
use cardano_multiplatform_lib::builders::input_builder::InputBuilderResult;
use cardano_multiplatform_lib::error::JsError;
use cardano_multiplatform_lib::TransactionOutput;
use cardano_utils::conversion::multiasset_iter;
use std::collections::HashSet;
use cardano_multiplatform_lib::TransactionOutput;

pub struct LargestFirstMultiAsset {
available_inputs: Vec<InputBuilderResult>,
Expand All @@ -26,8 +24,7 @@ impl LargestFirstMultiAsset {
}
}

impl InputSelectionAlgorithm for LargestFirstMultiAsset
{
impl InputSelectionAlgorithm for LargestFirstMultiAsset {
type InputUtxo = InputBuilderResult;
type OutputUtxo = TransactionOutput;

Expand Down Expand Up @@ -104,6 +101,9 @@ impl InputSelectionAlgorithm for LargestFirstMultiAsset
}

fn available_inputs(&self) -> Vec<Self::InputUtxo> {
self.available_indices.iter().map(|index| self.available_inputs[*index].clone()).collect()
self.available_indices
.iter()
.map(|index| self.available_inputs[*index].clone())
.collect()
}
}
2 changes: 1 addition & 1 deletion utxo-selection/src/algorithms/mod.rs
Expand Up @@ -2,8 +2,8 @@ mod largest_first;
mod largest_first_multiasset;
mod random_improve;
mod random_improve_multiasset;
mod utils;
mod thermostat;
mod utils;

pub use largest_first::*;
pub use largest_first_multiasset::*;
Expand Down
20 changes: 12 additions & 8 deletions utxo-selection/src/algorithms/random_improve.rs
Expand Up @@ -3,15 +3,13 @@ use crate::algorithms::utils;
use crate::common::{InputOutputSetup, InputSelectionResult};
use crate::csl::CslTransactionOutput;
use crate::estimate::TransactionFeeEstimator;
use crate::UTxOBuilder;
use anyhow::anyhow;
use cardano_multiplatform_lib::builders::input_builder::InputBuilderResult;
use cardano_multiplatform_lib::error::JsError;
use cardano_multiplatform_lib::ledger::common::value::Value;
use cardano_multiplatform_lib::TransactionOutput;
use dcspark_core::Balance;
use rand::Rng;
use std::collections::BTreeSet;
use anyhow::anyhow;

pub struct RandomImprove {
available_inputs: Vec<InputBuilderResult>,
Expand All @@ -29,8 +27,7 @@ impl RandomImprove {
}
}

impl InputSelectionAlgorithm for RandomImprove
{
impl InputSelectionAlgorithm for RandomImprove {
type InputUtxo = InputBuilderResult;
type OutputUtxo = TransactionOutput;

Expand Down Expand Up @@ -103,8 +100,12 @@ impl InputSelectionAlgorithm for RandomImprove
let input_fee =
cardano_utils::conversion::value_to_csl_coin(&estimator.fee_for_input(input)?)?;
estimator.add_input(input.clone())?;
input_total = input_total.checked_add(&input.utxo_info.amount()).map_err(|err| anyhow!(err))?;
output_total = output_total.checked_add(&Value::new(&input_fee)).map_err(|err| anyhow!(err))?;
input_total = input_total
.checked_add(&input.utxo_info.amount())
.map_err(|err| anyhow!(err))?;
output_total = output_total
.checked_add(&Value::new(&input_fee))
.map_err(|err| anyhow!(err))?;
fee = fee.checked_add(&input_fee).map_err(|err| anyhow!(err))?;
chosen_indices.insert(i);
}
Expand Down Expand Up @@ -137,6 +138,9 @@ impl InputSelectionAlgorithm for RandomImprove
}

fn available_inputs(&self) -> Vec<Self::InputUtxo> {
self.available_indices.iter().map(|index| self.available_inputs[*index].clone()).collect()
self.available_indices
.iter()
.map(|index| self.available_inputs[*index].clone())
.collect()
}
}
22 changes: 12 additions & 10 deletions utxo-selection/src/algorithms/random_improve_multiasset.rs
Expand Up @@ -4,15 +4,13 @@ use crate::algorithms::utils::result_from_cml;
use crate::common::{InputOutputSetup, InputSelectionResult};
use crate::csl::CslTransactionOutput;
use crate::estimate::TransactionFeeEstimator;
use crate::UTxOBuilder;
use anyhow::anyhow;
use cardano_multiplatform_lib::builders::input_builder::InputBuilderResult;
use cardano_multiplatform_lib::error::JsError;
use cardano_multiplatform_lib::ledger::common::value::Value;
use cardano_multiplatform_lib::TransactionOutput;
use cardano_utils::conversion::multiasset_iter;
use rand::Rng;
use std::collections::{BTreeSet, HashSet};
use anyhow::anyhow;

pub struct RandomImproveMultiAsset {
available_inputs: Vec<InputBuilderResult>,
Expand All @@ -30,9 +28,7 @@ impl RandomImproveMultiAsset {
}
}

impl InputSelectionAlgorithm
for RandomImproveMultiAsset
{
impl InputSelectionAlgorithm for RandomImproveMultiAsset {
type InputUtxo = InputBuilderResult;
type OutputUtxo = TransactionOutput;

Expand Down Expand Up @@ -71,7 +67,6 @@ impl InputSelectionAlgorithm
let output: CslTransactionOutput = output.into();
output.inner
})

.collect();

let mut chosen_indices = HashSet::<usize>::new();
Expand Down Expand Up @@ -126,8 +121,12 @@ impl InputSelectionAlgorithm
let input_fee =
cardano_utils::conversion::value_to_csl_coin(&estimator.fee_for_input(input)?)?;
estimator.add_input(input.clone()).unwrap();
input_total = input_total.checked_add(&input.utxo_info.amount()).map_err(|err| anyhow!(err))?;
output_total = output_total.checked_add(&Value::new(&input_fee)).map_err(|err| anyhow!(err))?;
input_total = input_total
.checked_add(&input.utxo_info.amount())
.map_err(|err| anyhow!(err))?;
output_total = output_total
.checked_add(&Value::new(&input_fee))
.map_err(|err| anyhow!(err))?;
fee = fee.checked_add(&input_fee).map_err(|err| anyhow!(err))?;
chosen_indices.insert(i);
}
Expand All @@ -149,6 +148,9 @@ impl InputSelectionAlgorithm
}

fn available_inputs(&self) -> Vec<Self::InputUtxo> {
self.available_indices.iter().map(|index| self.available_inputs[*index].clone()).collect()
self.available_indices
.iter()
.map(|index| self.available_inputs[*index].clone())
.collect()
}
}

0 comments on commit 51598c5

Please sign in to comment.