Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 32 additions & 0 deletions crates/build/src/macros/codegen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ impl WitnessStruct {
proc_macro2::TokenStream,
proc_macro2::TokenStream,
) = self.generate_from_args_conversion_with_param_name("args");
let default_mapping: proc_macro2::TokenStream = self.generate_default_mapping();

Ok(GeneratedArgumentTokens {
imports: quote! {
Expand Down Expand Up @@ -162,6 +163,12 @@ impl WitnessStruct {
Self::from_arguments(&x).map_err(simplex::serde::de::Error::custom)
}
}

impl core::default::Default for #struct_name {
fn default() -> Self {
#default_mapping
}
}
},
})
}
Expand All @@ -178,6 +185,7 @@ impl WitnessStruct {
proc_macro2::TokenStream,
proc_macro2::TokenStream,
) = self.generate_from_args_conversion_with_param_name("witness");
let default_mapping: proc_macro2::TokenStream = self.generate_default_mapping();

Ok(GeneratedWitnessTokens {
imports: quote! {
Expand Down Expand Up @@ -235,6 +243,12 @@ impl WitnessStruct {
Self::from_witness(&x).map_err(simplex::serde::de::Error::custom)
}
}

impl core::default::Default for #struct_name {
fn default() -> Self {
#default_mapping
}
}
},
})
}
Expand Down Expand Up @@ -281,6 +295,24 @@ impl WitnessStruct {
}
}

fn generate_default_mapping(&self) -> proc_macro2::TokenStream {
let name = format_ident!("{}", self.struct_name);
let fields: Vec<proc_macro2::TokenStream> = self
.witness_values
.iter()
.map(|field| {
let field_name = format_ident!("{}", field.struct_rust_field);
let field_default_value = field.rust_type.get_default_value();
quote! { #field_name: #field_default_value }
})
.collect();
quote! {
#name {
#(#fields),*
}
}
}

#[inline]
fn construct_witness_tuples(&self) -> Vec<proc_macro2::TokenStream> {
self.witness_values.iter().map(WitnessField::to_token_stream).collect()
Expand Down
33 changes: 33 additions & 0 deletions crates/build/src/macros/types.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,39 @@ impl RustTypeContext {
}

impl RustType {
pub fn get_default_value(&self) -> proc_macro2::TokenStream {
match self {
RustType::Bool => quote! { Default::default() },
RustType::U1 => quote! { Default::default() },
RustType::U2 => quote! { Default::default() },
RustType::U4 => quote! { Default::default() },
RustType::U8 => quote! { Default::default() },
RustType::U16 => quote! { Default::default() },
RustType::U32 => quote! { Default::default() },
RustType::U64 => quote! { Default::default() },
RustType::U128 => quote! { Default::default() },
RustType::U256Array => quote! { [Default::default(); 32] },
RustType::Array(element, size) => {
let element_ty = element.get_default_value();
quote! { [#element_ty; #size] }
}
RustType::Tuple(elements) => {
let element_types: Vec<_> = elements.iter().map(RustType::get_default_value).collect();
quote! { (#(#element_types),*) }
}
RustType::Either(left, _) => {
let left_ty = left.get_default_value();
quote! { simplex::either::Either::Left(#left_ty) }
}
RustType::Option(_inner) => {
quote! { Default::default() }
}
RustType::List(_element, _size) => {
quote! { Default::default() }
}
}
}

pub fn from_resolved_type(ty: &ResolvedType) -> syn::Result<Self> {
use simplicityhl::types::{TypeInner, UIntType};

Expand Down
13 changes: 5 additions & 8 deletions crates/simplex/tests/ui/array_tr_storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,17 @@ use simplex::program::{ArgumentsTrait, WitnessTrait};
include_simf!("../../../../crates/simplex/tests/ui_simfs/array_tr_storage.simf");

fn main() -> Result<(), String> {
let original_witness = derived_array_tr_storage::ArrayTrStorageWitness {
changed_index: 0,
state: Default::default(),
};
let original_witness = derived_array_tr_storage::ArrayTrStorageWitness::default();

let witness_values = original_witness.build_witness();
let recovered_witness = derived_array_tr_storage::ArrayTrStorageWitness::from_witness(&witness_values)?;
assert_eq!(original_witness, recovered_witness);

let original_arguments = derived_array_tr_storage::ArrayTrStorageArguments {};
let original_arguments = derived_array_tr_storage::ArrayTrStorageArguments::default();

let witness_values = original_arguments.build_arguments();
let recovered_witness = derived_array_tr_storage::ArrayTrStorageArguments::from_arguments(&witness_values)?;
assert_eq!(original_arguments, recovered_witness);
let arguments_values = original_arguments.build_arguments();
let recovered_arguments = derived_array_tr_storage::ArrayTrStorageArguments::from_arguments(&arguments_values)?;
assert_eq!(original_arguments, recovered_arguments);

Ok(())
}
12 changes: 5 additions & 7 deletions crates/simplex/tests/ui/bytes32_tr_storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,17 @@ use simplex::program::{WitnessTrait, ArgumentsTrait};
include_simf!("../../../../crates/simplex/tests/ui_simfs/bytes32_tr_storage.simf");

fn main() -> Result<(), String> {
let original_witness = derived_bytes32_tr_storage::Bytes32TrStorageWitness {
state: Default::default(),
};
let original_witness = derived_bytes32_tr_storage::Bytes32TrStorageWitness::default();

let witness_values = original_witness.build_witness();
let recovered_witness = derived_bytes32_tr_storage::Bytes32TrStorageWitness::from_witness(&witness_values)?;
assert_eq!(original_witness, recovered_witness);

let original_arguments = derived_bytes32_tr_storage::Bytes32TrStorageArguments {};
let original_arguments = derived_bytes32_tr_storage::Bytes32TrStorageArguments::default();

let witness_values = original_arguments.build_arguments();
let recovered_witness = derived_bytes32_tr_storage::Bytes32TrStorageArguments::from_arguments(&witness_values)?;
assert_eq!(original_arguments, recovered_witness);
let arguments_values = original_arguments.build_arguments();
let recovered_arguments = derived_bytes32_tr_storage::Bytes32TrStorageArguments::from_arguments(&arguments_values)?;
assert_eq!(original_arguments, recovered_arguments);

Ok(())
}
39 changes: 6 additions & 33 deletions crates/simplex/tests/ui/dual_currency_deposit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,45 +4,18 @@ use simplex::program::{WitnessTrait, ArgumentsTrait};
include_simf!("../../../../crates/simplex/tests/ui_simfs/dual_currency_deposit.simf");

fn main() -> Result<(), String> {
let original_witness = derived_dual_currency_deposit::DualCurrencyDepositWitness {
merge_branch: simplex::either::Left(simplex::either::Right(())),
token_branch: simplex::either::Left(()),
path: simplex::either::Left(simplex::either::Left(simplex::either::Left((0, 1, 2, 3)))),
};
let original_witness = derived_dual_currency_deposit::DualCurrencyDepositWitness::default();

let witness_values = original_witness.build_witness();
let recovered_witness = derived_dual_currency_deposit::DualCurrencyDepositWitness::from_witness(&witness_values)?;
assert_eq!(original_witness, recovered_witness);

let original_arguments = derived_dual_currency_deposit::DualCurrencyDepositArguments {
grantor_per_settlement_asset: 0,
settlement_asset_id: [1; 32],
grantor_settlement_token_asset: [1; 32],
strike_price: 0,
incentive_basis_points: 0,
grantor_collateral_token_asset: [1; 32],
contract_expiry_time: 0,
filler_per_settlement_asset: 0,
filler_per_principal_collateral: 0,
filler_token_asset: [1; 32],
grantor_per_settlement_collateral: 0,
grantor_settlement_per_deposited_asset: 0,
fee_script_hash: [1; 32],
taker_funding_end_time: 0,
settlement_height: 0,
collateral_asset_id: [1; 32],
taker_funding_start_time: 0,
filler_per_settlement_collateral: 0,
oracle_pk: [1; 32],
fee_basis_points: 0,
grantor_collateral_per_deposited_collateral: 0,
early_termination_end_time: 0,
};
let original_arguments = derived_dual_currency_deposit::DualCurrencyDepositArguments::default();

let witness_values = original_arguments.build_arguments();
let recovered_witness =
derived_dual_currency_deposit::DualCurrencyDepositArguments::from_arguments(&witness_values)?;
assert_eq!(original_arguments, recovered_witness);
let arguments_values = original_arguments.build_arguments();
let recovered_arguments =
derived_dual_currency_deposit::DualCurrencyDepositArguments::from_arguments(&arguments_values)?;
assert_eq!(original_arguments, recovered_arguments);

Ok(())
}
15 changes: 6 additions & 9 deletions crates/simplex/tests/ui/either_with_single_witness.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,19 @@ use simplex::program::{WitnessTrait, ArgumentsTrait};
include_simf!("../../../../crates/simplex/tests/ui_simfs/either_with_single_witness.simf");

fn main() -> Result<(), String> {
let original_witness = derived_either_with_single_witness::EitherWithSingleWitnessWitness {
path: simplex::either::Left((simplex::either::Left(11_u16), simplex::either::Left(Some(true)))),
signature: [0; 64],
};
let original_witness = derived_either_with_single_witness::EitherWithSingleWitnessWitness::default();

let witness_values = original_witness.build_witness();
let recovered_witness =
derived_either_with_single_witness::EitherWithSingleWitnessWitness::from_witness(&witness_values)?;
assert_eq!(original_witness, recovered_witness);

let original_arguments = derived_either_with_single_witness::EitherWithSingleWitnessArguments {};
let original_arguments = derived_either_with_single_witness::EitherWithSingleWitnessArguments::default();

let witness_values = original_arguments.build_arguments();
let recovered_witness =
derived_either_with_single_witness::EitherWithSingleWitnessArguments::from_arguments(&witness_values)?;
assert_eq!(original_arguments, recovered_witness);
let arguments_values = original_arguments.build_arguments();
let recovered_arguments =
derived_either_with_single_witness::EitherWithSingleWitnessArguments::from_arguments(&arguments_values)?;
assert_eq!(original_arguments, recovered_arguments);

Ok(())
}
14 changes: 6 additions & 8 deletions crates/simplex/tests/ui/exotic_values.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,18 @@ use simplex::program::{WitnessTrait, ArgumentsTrait};
include_simf!("../../../../crates/simplex/tests/ui_simfs/exotic_values.simf");

fn main() -> Result<(), String> {
let original_witness = derived_exotic_values::ExoticValuesWitness {
path: simplex::either::Left((simplex::either::Left(1), simplex::either::Left(Some(false)))),
};
let original_witness = derived_exotic_values::ExoticValuesWitness::default();

let witness_values = original_witness.build_witness();
let recovered_witness = derived_exotic_values::ExoticValuesWitness::from_witness(&witness_values)?;
assert_eq!(original_witness, recovered_witness);

let original_arguments = derived_exotic_values::ExoticValuesArguments {};
let original_arguments = derived_exotic_values::ExoticValuesArguments::default();

let witness_values = original_arguments.build_arguments();
let recovered_witness =
derived_exotic_values::ExoticValuesArguments::from_arguments(&witness_values)?;
assert_eq!(original_arguments, recovered_witness);
let arguments_values = original_arguments.build_arguments();
let recovered_arguments =
derived_exotic_values::ExoticValuesArguments::from_arguments(&arguments_values)?;
assert_eq!(original_arguments, recovered_arguments);

Ok(())
}
6 changes: 3 additions & 3 deletions crates/simplex/tests/ui/list_check.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ fn main() -> Result<(), String> {

let original_arguments = derived_list_check::ListCheckArguments {};

let witness_values = original_arguments.build_arguments();
let recovered_witness = derived_list_check::ListCheckArguments::from_arguments(&witness_values)?;
assert_eq!(original_arguments, recovered_witness);
let arguments_values = original_arguments.build_arguments();
let recovered_arguments = derived_list_check::ListCheckArguments::from_arguments(&arguments_values)?;
assert_eq!(original_arguments, recovered_arguments);

// Build Witness, which would panic on building
let original_witness = derived_list_check::ListCheckWitness {
Expand Down
18 changes: 5 additions & 13 deletions crates/simplex/tests/ui/option_offer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,25 +4,17 @@ use simplex::program::{WitnessTrait, ArgumentsTrait};
include_simf!("../../../../crates/simplex/tests/ui_simfs/option_offer.simf");

fn main() -> Result<(), String> {
let original_witness = derived_option_offer::OptionOfferWitness { path: simplex::either::Left((0, false)) };
let original_witness = derived_option_offer::OptionOfferWitness::default();

let witness_values = original_witness.build_witness();
let recovered_witness = derived_option_offer::OptionOfferWitness::from_witness(&witness_values)?;
assert_eq!(original_witness, recovered_witness);

let original_arguments = derived_option_offer::OptionOfferArguments {
user_pubkey: [1; 32],
premium_per_collateral: 0,
premium_asset_id: [1; 32],
settlement_asset_id: [1; 32],
collateral_asset_id: [1; 32],
collateral_per_contract: 0,
expiry_time: 0,
};
let original_arguments = derived_option_offer::OptionOfferArguments::default();

let witness_values = original_arguments.build_arguments();
let recovered_witness = derived_option_offer::OptionOfferArguments::from_arguments(&witness_values)?;
assert_eq!(original_arguments, recovered_witness);
let arguments_values = original_arguments.build_arguments();
let recovered_arguments = derived_option_offer::OptionOfferArguments::from_arguments(&arguments_values)?;
assert_eq!(original_arguments, recovered_arguments);

Ok(())
}
23 changes: 5 additions & 18 deletions crates/simplex/tests/ui/options.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,17 @@ use simplex::program::{WitnessTrait, ArgumentsTrait};
include_simf!("../../../../crates/simplex/tests/ui_simfs/options.simf");

fn main() -> Result<(), String> {
let original_witness = derived_options::OptionsWitness {
path: simplicityhl::either::Either::Right(simplicityhl::either::Either::Left((true, 100, 200))),
};
let original_witness = derived_options::OptionsWitness::default();

let witness_values = original_witness.build_witness();
let recovered_witness = derived_options::OptionsWitness::from_witness(&witness_values)?;
assert_eq!(original_witness, recovered_witness);

let original_arguments = derived_options::OptionsArguments {
start_time: 0,
expiry_time: 0,
grantor_reissuance_token_asset: Default::default(),
grantor_token_asset: Default::default(),
settlement_per_contract: Default::default(),
settlement_asset_id: Default::default(),
collateral_per_contract: Default::default(),
collateral_asset_id: Default::default(),
option_reissuance_token_asset: Default::default(),
option_token_asset: Default::default(),
};
let original_arguments = derived_options::OptionsArguments::default();

let witness_values = original_arguments.build_arguments();
let recovered_witness = derived_options::OptionsArguments::from_arguments(&witness_values)?;
assert_eq!(original_arguments, recovered_witness);
let arguments_values = original_arguments.build_arguments();
let recovered_arguments = derived_options::OptionsArguments::from_arguments(&arguments_values)?;
assert_eq!(original_arguments, recovered_arguments);

Ok(())
}
13 changes: 5 additions & 8 deletions crates/simplex/tests/ui/simple_storage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,17 @@ use simplex::program::{WitnessTrait, ArgumentsTrait};
include_simf!("../../../../crates/simplex/tests/ui_simfs/simple_storage.simf");

fn main() -> Result<(), String> {
let original_witness = derived_simple_storage::SimpleStorageWitness {
new_value: 0,
user_signature: [1; 64],
};
let original_witness = derived_simple_storage::SimpleStorageWitness::default();

let witness_values = original_witness.build_witness();
let recovered_witness = derived_simple_storage::SimpleStorageWitness::from_witness(&witness_values)?;
assert_eq!(original_witness, recovered_witness);

let original_arguments = derived_simple_storage::SimpleStorageArguments { user: Default::default(), slot_id: Default::default() };
let original_arguments = derived_simple_storage::SimpleStorageArguments::default();

let witness_values = original_arguments.build_arguments();
let recovered_witness = derived_simple_storage::SimpleStorageArguments::from_arguments(&witness_values)?;
assert_eq!(original_arguments, recovered_witness);
let arguments_values = original_arguments.build_arguments();
let recovered_arguments = derived_simple_storage::SimpleStorageArguments::from_arguments(&arguments_values)?;
assert_eq!(original_arguments, recovered_arguments);

Ok(())
}
Loading
Loading