Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Docs cleanup from TIPs #1116

Merged
merged 14 commits into from
Sep 18, 2023
85 changes: 1 addition & 84 deletions sdk/src/types/block/output/account.rs
Original file line number Diff line number Diff line change
Expand Up @@ -884,18 +884,16 @@ pub(crate) mod dto {

#[cfg(test)]
mod tests {
use packable::PackableExt;

use super::*;
use crate::types::{
block::{
address::AccountAddress,
output::{dto::OutputDto, FoundryId, SimpleTokenScheme, TokenId},
protocol::protocol_parameters,
rand::{
address::rand_account_address,
output::{
feature::{rand_allowed_features, rand_issuer_feature, rand_metadata_feature, rand_sender_feature},
feature::rand_allowed_features,
rand_account_id, rand_account_output,
unlock_condition::{
rand_governor_address_unlock_condition_different_from,
Expand All @@ -907,87 +905,6 @@ mod tests {
TryFromDto,
};

#[test]
fn builder() {
let protocol_parameters = protocol_parameters();
let account_id = rand_account_id();
let foundry_id = FoundryId::build(&AccountAddress::from(account_id), 0, SimpleTokenScheme::KIND);
let gov_address_1 = rand_governor_address_unlock_condition_different_from(&account_id);
let gov_address_2 = rand_governor_address_unlock_condition_different_from(&account_id);
let state_address_1 = rand_state_controller_address_unlock_condition_different_from(&account_id);
let state_address_2 = rand_state_controller_address_unlock_condition_different_from(&account_id);
let sender_1 = rand_sender_feature();
let sender_2 = rand_sender_feature();
let issuer_1 = rand_issuer_feature();
let issuer_2 = rand_issuer_feature();
let amount = 500_000;

let mut builder = AccountOutput::build_with_amount(amount, account_id)
.add_native_token(NativeToken::new(TokenId::from(foundry_id), 1000).unwrap())
.add_unlock_condition(gov_address_1)
.add_unlock_condition(state_address_1)
.add_feature(sender_1)
.replace_feature(sender_2)
.replace_immutable_feature(issuer_1)
.add_immutable_feature(issuer_2);

let output = builder.clone().finish().unwrap();
assert_eq!(output.amount(), amount);
assert_eq!(output.unlock_conditions().governor_address(), Some(&gov_address_1));
assert_eq!(
output.unlock_conditions().state_controller_address(),
Some(&state_address_1)
);
assert_eq!(output.features().sender(), Some(&sender_2));
assert_eq!(output.immutable_features().issuer(), Some(&issuer_1));

builder = builder
.clear_unlock_conditions()
.clear_features()
.clear_immutable_features()
.replace_unlock_condition(gov_address_2)
.replace_unlock_condition(state_address_2);
let output = builder.clone().finish().unwrap();
assert_eq!(output.unlock_conditions().governor_address(), Some(&gov_address_2));
assert_eq!(
output.unlock_conditions().state_controller_address(),
Some(&state_address_2)
);
assert!(output.features().is_empty());
assert!(output.immutable_features().is_empty());

let metadata = rand_metadata_feature();

let output = builder
.with_minimum_storage_deposit(protocol_parameters.rent_structure())
.add_unlock_condition(rand_state_controller_address_unlock_condition_different_from(
&account_id,
))
.add_unlock_condition(rand_governor_address_unlock_condition_different_from(&account_id))
.with_features([Feature::from(metadata.clone()), sender_1.into()])
.with_immutable_features([Feature::from(metadata.clone()), issuer_1.into()])
.finish_with_params(ValidationParams::default().with_protocol_parameters(protocol_parameters.clone()))
.unwrap();

assert_eq!(
output.amount(),
Output::Account(output.clone()).rent_cost(protocol_parameters.rent_structure())
);
assert_eq!(output.features().metadata(), Some(&metadata));
assert_eq!(output.features().sender(), Some(&sender_1));
assert_eq!(output.immutable_features().metadata(), Some(&metadata));
assert_eq!(output.immutable_features().issuer(), Some(&issuer_1));
}

#[test]
fn pack_unpack() {
let protocol_parameters = protocol_parameters();
let output = rand_account_output(protocol_parameters.token_supply());
let bytes = output.pack_to_vec();
let output_unpacked = AccountOutput::unpack_verified(bytes, &protocol_parameters).unwrap();
assert_eq!(output, output_unpacked);
}

#[test]
fn to_from_dto() {
let protocol_parameters = protocol_parameters();
Expand Down
82 changes: 12 additions & 70 deletions sdk/src/types/block/output/basic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ use crate::types::{
ValidationParams,
};

///
/// Builder for a [`BasicOutput`].
#[derive(Clone)]
#[must_use]
pub struct BasicOutputBuilder {
Expand Down Expand Up @@ -215,15 +215,18 @@ impl From<&BasicOutput> for BasicOutputBuilder {
#[packable(unpack_error = Error)]
#[packable(unpack_visitor = ProtocolParameters)]
pub struct BasicOutput {
// Amount of IOTA tokens held by the output.
/// Amount of IOTA tokens to deposit with this output.
#[packable(verify_with = verify_output_amount_packable)]
amount: u64,
/// Amount of stored Mana held by this output.
mana: u64,
// Native tokens held by the output.
/// Native tokens held by this output.
native_tokens: NativeTokens,
/// Define how the output can be unlocked in a transaction.
#[packable(verify_with = verify_unlock_conditions_packable)]
unlock_conditions: UnlockConditions,
#[packable(verify_with = verify_features_packable)]
/// Features of the output.
features: Features,
}

Expand Down Expand Up @@ -286,7 +289,7 @@ impl BasicOutput {
///
#[inline(always)]
pub fn address(&self) -> &Address {
// An BasicOutput must have an AddressUnlockCondition.
// A BasicOutput must have an AddressUnlockCondition.
self.unlock_conditions
.address()
.map(|unlock_condition| unlock_condition.address())
Expand Down Expand Up @@ -339,16 +342,16 @@ fn verify_unlock_conditions_packable<const VERIFY: bool>(
verify_unlock_conditions::<VERIFY>(unlock_conditions)
}

fn verify_features<const VERIFY: bool>(blocks: &Features) -> Result<(), Error> {
fn verify_features<const VERIFY: bool>(features: &Features) -> Result<(), Error> {
if VERIFY {
verify_allowed_features(blocks, BasicOutput::ALLOWED_FEATURES)
verify_allowed_features(features, BasicOutput::ALLOWED_FEATURES)
} else {
Ok(())
}
}

fn verify_features_packable<const VERIFY: bool>(blocks: &Features, _: &ProtocolParameters) -> Result<(), Error> {
verify_features::<VERIFY>(blocks)
fn verify_features_packable<const VERIFY: bool>(features: &Features, _: &ProtocolParameters) -> Result<(), Error> {
verify_features::<VERIFY>(features)
}

#[cfg(feature = "serde")]
Expand All @@ -366,18 +369,15 @@ pub(crate) mod dto {
utils::serde::string,
};

/// Describes a basic output.
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct BasicOutputDto {
#[serde(rename = "type")]
pub kind: u8,
// Amount of IOTA tokens held by the output.
#[serde(with = "string")]
pub amount: u64,
#[serde(with = "string")]
pub mana: u64,
// Native tokens held by the output.
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub native_tokens: Vec<NativeToken>,
pub unlock_conditions: Vec<UnlockConditionDto>,
Expand Down Expand Up @@ -455,7 +455,6 @@ pub(crate) mod dto {

#[cfg(test)]
mod tests {
use packable::PackableExt;

use super::*;
use crate::types::{
Expand All @@ -465,70 +464,13 @@ mod tests {
rand::{
address::rand_account_address,
output::{
feature::{rand_allowed_features, rand_metadata_feature, rand_sender_feature},
rand_basic_output,
unlock_condition::rand_address_unlock_condition,
feature::rand_allowed_features, rand_basic_output, unlock_condition::rand_address_unlock_condition,
},
},
},
TryFromDto,
};

#[test]
fn builder() {
let protocol_parameters = protocol_parameters();
let foundry_id = FoundryId::build(&rand_account_address(), 0, SimpleTokenScheme::KIND);
let address_1 = rand_address_unlock_condition();
let address_2 = rand_address_unlock_condition();
let sender_1 = rand_sender_feature();
let sender_2 = rand_sender_feature();
let amount = 500_000;

let mut builder = BasicOutput::build_with_amount(amount)
.add_native_token(NativeToken::new(TokenId::from(foundry_id), 1000).unwrap())
.add_unlock_condition(address_1)
.add_feature(sender_1)
.replace_feature(sender_2);

let output = builder.clone().finish().unwrap();
assert_eq!(output.amount(), amount);
assert_eq!(output.unlock_conditions().address(), Some(&address_1));
assert_eq!(output.features().sender(), Some(&sender_2));

builder = builder
.clear_unlock_conditions()
.clear_features()
.replace_unlock_condition(address_2);
let output = builder.clone().finish().unwrap();
assert_eq!(output.unlock_conditions().address(), Some(&address_2));
assert!(output.features().is_empty());

let metadata = rand_metadata_feature();

let output = builder
.with_minimum_storage_deposit(protocol_parameters.rent_structure())
.add_unlock_condition(rand_address_unlock_condition())
.with_features([Feature::from(metadata.clone()), sender_1.into()])
.finish_with_params(ValidationParams::default().with_protocol_parameters(protocol_parameters.clone()))
.unwrap();

assert_eq!(
output.amount(),
Output::Basic(output.clone()).rent_cost(protocol_parameters.rent_structure())
);
assert_eq!(output.features().metadata(), Some(&metadata));
assert_eq!(output.features().sender(), Some(&sender_1));
}

#[test]
fn pack_unpack() {
let protocol_parameters = protocol_parameters();
let output = rand_basic_output(protocol_parameters.token_supply());
let bytes = output.pack_to_vec();
let output_unpacked = BasicOutput::unpack_verified(bytes, &protocol_parameters).unwrap();
assert_eq!(output, output_unpacked);
}

#[test]
fn to_from_dto() {
let protocol_parameters = protocol_parameters();
Expand Down
74 changes: 8 additions & 66 deletions sdk/src/types/block/output/foundry.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ use crate::types::{
ValidationParams,
};

///
/// Builder for a [`FoundryOutput`].
#[derive(Clone)]
#[must_use]
pub struct FoundryOutputBuilder {
Expand Down Expand Up @@ -280,15 +280,19 @@ impl From<&FoundryOutput> for FoundryOutputBuilder {
/// Describes a foundry output that is controlled by an account.
#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub struct FoundryOutput {
// Amount of IOTA tokens held by the output.
/// Amount of IOTA tokens to deposit with this output.
amount: u64,
// Native tokens held by the output.
/// Native tokens held by this output.
native_tokens: NativeTokens,
// The serial number of the foundry with respect to the controlling account.
/// The serial number of the foundry with respect to the controlling account.
serial_number: u32,
/// Define the supply control scheme of the native tokens controlled by the foundry.
token_scheme: TokenScheme,
/// Define how the output can be unlocked in a transaction.
unlock_conditions: UnlockConditions,
/// Features of the output.
features: Features,
/// Immutable features of the output.
immutable_features: Features,
}

Expand Down Expand Up @@ -627,19 +631,15 @@ pub(crate) mod dto {
utils::serde::string,
};

/// Describes a foundry output that is controlled by an account.
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FoundryOutputDto {
#[serde(rename = "type")]
pub kind: u8,
// Amount of IOTA tokens held by the output.
#[serde(with = "string")]
pub amount: u64,
// Native tokens held by the output.
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub native_tokens: Vec<NativeToken>,
// The serial number of the foundry with respect to the controlling account.
pub serial_number: u32,
pub token_scheme: TokenScheme,
pub unlock_conditions: Vec<UnlockConditionDto>,
Expand Down Expand Up @@ -739,7 +739,6 @@ pub(crate) mod dto {

#[cfg(test)]
mod tests {
use packable::PackableExt;

use super::*;
use crate::types::{
Expand All @@ -760,63 +759,6 @@ mod tests {
TryFromDto,
};

#[test]
fn builder() {
let protocol_parameters = protocol_parameters();
let foundry_id = FoundryId::build(&rand_account_address(), 0, SimpleTokenScheme::KIND);
let account_1 = ImmutableAccountAddressUnlockCondition::new(rand_account_address());
let account_2 = ImmutableAccountAddressUnlockCondition::new(rand_account_address());
let metadata_1 = rand_metadata_feature();
let metadata_2 = rand_metadata_feature();
let amount = 500_000;

let mut builder = FoundryOutput::build_with_amount(amount, 234, rand_token_scheme())
.with_serial_number(85)
.add_native_token(NativeToken::new(TokenId::from(foundry_id), 1000).unwrap())
.with_unlock_conditions([account_1])
.add_feature(metadata_1.clone())
.replace_feature(metadata_2.clone())
.with_immutable_features([metadata_2.clone()])
.replace_immutable_feature(metadata_1.clone());

let output = builder.clone().finish().unwrap();
assert_eq!(output.amount(), amount);
assert_eq!(output.serial_number(), 85);
assert_eq!(output.unlock_conditions().immutable_account_address(), Some(&account_1));
assert_eq!(output.features().metadata(), Some(&metadata_2));
assert_eq!(output.immutable_features().metadata(), Some(&metadata_1));

builder = builder
.clear_unlock_conditions()
.clear_features()
.clear_immutable_features()
.replace_unlock_condition(account_2);
let output = builder.clone().finish().unwrap();
assert_eq!(output.unlock_conditions().immutable_account_address(), Some(&account_2));
assert!(output.features().is_empty());
assert!(output.immutable_features().is_empty());

let output = builder
.with_minimum_storage_deposit(protocol_parameters.rent_structure())
.add_unlock_condition(ImmutableAccountAddressUnlockCondition::new(rand_account_address()))
.finish_with_params(&protocol_parameters)
.unwrap();

assert_eq!(
output.amount(),
Output::Foundry(output).rent_cost(protocol_parameters.rent_structure())
);
}

#[test]
fn pack_unpack() {
let protocol_parameters = protocol_parameters();
let output = rand_foundry_output(protocol_parameters.token_supply());
let bytes = output.pack_to_vec();
let output_unpacked = FoundryOutput::unpack_verified(bytes, &protocol_parameters).unwrap();
assert_eq!(output, output_unpacked);
}

#[test]
fn to_from_dto() {
let protocol_parameters = protocol_parameters();
Expand Down
Loading
Loading