Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@ pub mod token_configuration_localization;
pub mod token_distribution_key;
pub mod token_distribution_rules;
pub mod token_keeps_history_rules;
pub mod token_marketplace_rules;
pub mod token_perpetual_distribution;
pub mod token_pre_programmed_distribution;
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ use crate::data_contract::associated_token::token_configuration_item::TokenConfi
use crate::data_contract::associated_token::token_distribution_rules::accessors::v0::{
TokenDistributionRulesV0Getters, TokenDistributionRulesV0Setters,
};
use crate::data_contract::associated_token::token_marketplace_rules::accessors::v0::{
TokenMarketplaceRulesV0Getters, TokenMarketplaceRulesV0Setters,
};

impl TokenConfigurationV0 {
/// Applies a `TokenConfigurationChangeItem` to this token configuration.
Expand Down Expand Up @@ -135,6 +138,19 @@ impl TokenConfigurationV0 {
TokenConfigurationChangeItem::MainControlGroup(main_group) => {
self.main_control_group = main_group;
}
TokenConfigurationChangeItem::MarketplaceTradeMode(trade_mode) => {
self.marketplace_rules.set_trade_mode(trade_mode);
}
TokenConfigurationChangeItem::MarketplaceTradeModeControlGroup(control_group) => {
self.marketplace_rules
.trade_mode_change_rules_mut()
.set_authorized_to_make_change_action_takers(control_group);
}
TokenConfigurationChangeItem::MarketplaceTradeModeAdminGroup(admin_group) => {
self.marketplace_rules
.trade_mode_change_rules_mut()
.set_admin_action_takers(admin_group);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0;
use crate::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem;
use crate::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Getters;
use crate::data_contract::associated_token::token_marketplace_rules::accessors::v0::TokenMarketplaceRulesV0Getters;
use crate::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers;
impl TokenConfigurationV0 {
/// Returns the authorized action takers for a specific `TokenConfigurationChangeItem`.
Expand Down Expand Up @@ -105,6 +106,18 @@ impl TokenConfigurationV0 {
*self.emergency_action_rules.admin_action_takers()
}
TokenConfigurationChangeItem::MainControlGroup(_) => AuthorizedActionTakers::NoOne,
TokenConfigurationChangeItem::MarketplaceTradeMode(_) => *self
.marketplace_rules
.trade_mode_change_rules()
.authorized_to_make_change_action_takers(),
TokenConfigurationChangeItem::MarketplaceTradeModeControlGroup(_) => *self
.marketplace_rules
.trade_mode_change_rules()
.admin_action_takers(),
TokenConfigurationChangeItem::MarketplaceTradeModeAdminGroup(_) => *self
.marketplace_rules
.trade_mode_change_rules()
.admin_action_takers(),
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use crate::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0;
use crate::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem;
use crate::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Getters;
use crate::data_contract::associated_token::token_marketplace_rules::accessors::v0::TokenMarketplaceRulesV0Getters;
use crate::data_contract::group::Group;
use crate::data_contract::GroupContractPosition;
use crate::group::action_taker::{ActionGoal, ActionTaker};
Expand Down Expand Up @@ -290,6 +291,32 @@ impl TokenConfigurationV0 {
action_taker,
goal,
),
TokenConfigurationChangeItem::MarketplaceTradeMode(_) => self
.marketplace_rules
.trade_mode_change_rules()
.can_make_change(contract_owner_id, main_group, groups, action_taker, goal),
TokenConfigurationChangeItem::MarketplaceTradeModeControlGroup(control_group) => self
.marketplace_rules
.trade_mode_change_rules()
.can_change_authorized_action_takers(
control_group,
contract_owner_id,
main_group,
groups,
action_taker,
goal,
),
TokenConfigurationChangeItem::MarketplaceTradeModeAdminGroup(admin_group) => self
.marketplace_rules
.trade_mode_change_rules()
.can_change_admin_action_takers(
admin_group,
contract_owner_id,
main_group,
groups,
action_taker,
goal,
),
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ use crate::consensus::basic::data_contract::DataContractTokenConfigurationUpdate
use crate::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters;
use crate::data_contract::associated_token::token_configuration::TokenConfiguration;
use crate::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Getters;
use crate::data_contract::associated_token::token_marketplace_rules::accessors::v0::TokenMarketplaceRulesV0Getters;
use crate::data_contract::group::Group;
use crate::data_contract::GroupContractPosition;
use crate::group::action_taker::{ActionGoal, ActionTaker};
Expand Down Expand Up @@ -159,6 +160,71 @@ impl TokenConfiguration {
}
}

// Check changes to change_direct_purchase_pricing_rules and its rules
#[allow(clippy::collapsible_if)]
if old
.distribution_rules
.change_direct_purchase_pricing_rules()
!= new
.distribution_rules
.change_direct_purchase_pricing_rules()
{
if !old
.distribution_rules
.change_direct_purchase_pricing_rules()
.can_change_to(
new.distribution_rules
.change_direct_purchase_pricing_rules(),
contract_owner_id,
self.main_control_group(),
groups,
action_taker,
goal,
)
{
return SimpleConsensusValidationResult::new_with_error(
DataContractTokenConfigurationUpdateError::new(
"update".to_string(),
"change_direct_purchase_pricing_rules".to_string(),
self.clone(),
new_config.clone(),
)
.into(),
);
}
}

// Check changes to change_direct_purchase_pricing_rules and its rules
#[allow(clippy::collapsible_if)]
if old.marketplace_rules.trade_mode() != new.marketplace_rules.trade_mode()
|| old.marketplace_rules.trade_mode_change_rules()
!= new.marketplace_rules.trade_mode_change_rules()
{
if !old
.marketplace_rules
.trade_mode_change_rules()
.can_change_to(
new.marketplace_rules.trade_mode_change_rules(),
contract_owner_id,
self.main_control_group(),
groups,
action_taker,
goal,
)
{
return SimpleConsensusValidationResult::new_with_error(
DataContractTokenConfigurationUpdateError::new(
"update".to_string(),
"marketplace_rules trade_mode or marketplace_rules trade_mode_change_rules"
.to_string(),
self.clone(),
new_config.clone(),
)
.into(),
);
}
}

// Check changes to perpetual_distribution and its rules
#[allow(clippy::collapsible_if)]
if old.distribution_rules.perpetual_distribution()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ use crate::data_contract::associated_token::token_distribution_rules::v0::TokenD
use crate::data_contract::associated_token::token_distribution_rules::TokenDistributionRules;
use crate::data_contract::associated_token::token_keeps_history_rules::v0::TokenKeepsHistoryRulesV0;
use crate::data_contract::associated_token::token_keeps_history_rules::TokenKeepsHistoryRules;
use crate::data_contract::associated_token::token_marketplace_rules::v0::{
TokenMarketplaceRulesV0, TokenTradeMode,
};
use crate::data_contract::associated_token::token_marketplace_rules::TokenMarketplaceRules;
use crate::data_contract::associated_token::token_perpetual_distribution::TokenPerpetualDistribution;
use crate::data_contract::associated_token::token_pre_programmed_distribution::TokenPreProgrammedDistribution;
use crate::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers;
Expand Down Expand Up @@ -70,6 +74,10 @@ pub struct TokenConfigurationV0 {
#[serde(default = "default_token_distribution_rules")]
pub distribution_rules: TokenDistributionRules,

/// Defines the token's marketplace logic.
#[serde(default = "default_token_marketplace_rules")]
pub marketplace_rules: TokenMarketplaceRules,

/// Rules controlling who is authorized to perform manual minting of tokens.
#[serde(default = "default_contract_owner_change_control_rules")]
pub manual_minting_rules: ChangeControlRules,
Expand Down Expand Up @@ -170,6 +178,19 @@ fn default_token_distribution_rules() -> TokenDistributionRules {
})
}

fn default_token_marketplace_rules() -> TokenMarketplaceRules {
TokenMarketplaceRules::V0(TokenMarketplaceRulesV0 {
trade_mode: TokenTradeMode::NotTradeable,
trade_mode_change_rules: ChangeControlRules::V0(ChangeControlRulesV0 {
authorized_to_make_change: AuthorizedActionTakers::NoOne,
admin_action_takers: AuthorizedActionTakers::NoOne,
changing_authorized_action_takers_to_no_one_allowed: false,
changing_admin_action_takers_to_no_one_allowed: false,
self_changing_admin_action_takers_allowed: false,
}),
})
}

fn default_change_control_rules() -> ChangeControlRules {
ChangeControlRules::V0(ChangeControlRulesV0 {
authorized_to_make_change: AuthorizedActionTakers::NoOne,
Expand Down Expand Up @@ -414,6 +435,13 @@ impl TokenConfigurationPreset {
}
}

pub fn default_marketplace_rules_v0(&self) -> TokenMarketplaceRulesV0 {
TokenMarketplaceRulesV0 {
trade_mode: TokenTradeMode::NotTradeable,
trade_mode_change_rules: self.default_basic_change_control_rules_v0().into(),
}
}

pub fn token_configuration_v0(
&self,
conventions: TokenConfigurationConvention,
Expand All @@ -437,6 +465,7 @@ impl TokenConfigurationPreset {
distribution_rules: self
.default_distribution_rules_v0(None, None, with_direct_pricing)
.into(),
marketplace_rules: self.default_marketplace_rules_v0().into(),
manual_minting_rules: self.default_basic_change_control_rules_v0().into(),
manual_burning_rules: self.default_basic_change_control_rules_v0().into(),
freeze_rules: self.default_advanced_change_control_rules_v0().into(),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
use crate::balances::credits::TokenAmount;
use crate::data_contract::associated_token::token_configuration_convention::TokenConfigurationConvention;
use crate::data_contract::associated_token::token_marketplace_rules::v0::TokenTradeMode;
use crate::data_contract::associated_token::token_perpetual_distribution::TokenPerpetualDistribution;
use crate::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers;
use crate::data_contract::GroupContractPosition;
Expand Down Expand Up @@ -59,6 +60,9 @@ pub enum TokenConfigurationChangeItem {
DestroyFrozenFundsAdminGroup(AuthorizedActionTakers),
EmergencyAction(AuthorizedActionTakers),
EmergencyActionAdminGroup(AuthorizedActionTakers),
MarketplaceTradeMode(TokenTradeMode),
MarketplaceTradeModeControlGroup(AuthorizedActionTakers),
MarketplaceTradeModeAdminGroup(AuthorizedActionTakers),
MainControlGroup(Option<GroupContractPosition>),
}
impl TokenConfigurationChangeItem {
Expand Down Expand Up @@ -92,7 +96,10 @@ impl TokenConfigurationChangeItem {
TokenConfigurationChangeItem::DestroyFrozenFundsAdminGroup(_) => 25,
TokenConfigurationChangeItem::EmergencyAction(_) => 26,
TokenConfigurationChangeItem::EmergencyActionAdminGroup(_) => 27,
TokenConfigurationChangeItem::MainControlGroup(_) => 28,
TokenConfigurationChangeItem::MarketplaceTradeMode(_) => 28,
TokenConfigurationChangeItem::MarketplaceTradeModeControlGroup(_) => 29,
TokenConfigurationChangeItem::MarketplaceTradeModeAdminGroup(_) => 30,
TokenConfigurationChangeItem::MainControlGroup(_) => 31,
}
}
}
Expand Down Expand Up @@ -216,6 +223,15 @@ impl fmt::Display for TokenConfigurationChangeItem {
Some(pos) => write!(f, "Main Control Group: {}", pos),
None => write!(f, "Main Control Group: None"),
},
TokenConfigurationChangeItem::MarketplaceTradeMode(mode) => {
write!(f, "Marketplace Trade Mode: {:?}", mode)
}
TokenConfigurationChangeItem::MarketplaceTradeModeControlGroup(control_group) => {
write!(f, "Marketplace Trade Mode Control Group: {}", control_group)
}
TokenConfigurationChangeItem::MarketplaceTradeModeAdminGroup(admin_group) => {
write!(f, "Marketplace Trade Mode Admin Group: {}", admin_group)
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
use crate::data_contract::associated_token::token_marketplace_rules::accessors::v0::{
TokenMarketplaceRulesV0Getters, TokenMarketplaceRulesV0Setters,
};
use crate::data_contract::associated_token::token_marketplace_rules::v0::TokenTradeMode;
use crate::data_contract::associated_token::token_marketplace_rules::TokenMarketplaceRules;
use crate::data_contract::change_control_rules::ChangeControlRules;

pub mod v0;
/// Implementing `TokenMarketplaceRulesV0Getters` for `TokenMarketplaceRules`
impl TokenMarketplaceRulesV0Getters for TokenMarketplaceRules {
fn trade_mode(&self) -> &TokenTradeMode {
match self {
TokenMarketplaceRules::V0(inner) => inner.trade_mode(),
}
}

fn trade_mode_change_rules(&self) -> &ChangeControlRules {
match self {
TokenMarketplaceRules::V0(inner) => inner.trade_mode_change_rules(),
}
}

fn trade_mode_change_rules_mut(&mut self) -> &mut ChangeControlRules {
match self {
TokenMarketplaceRules::V0(inner) => inner.trade_mode_change_rules_mut(),
}
}
}

/// Implementing `TokenMarketplaceRulesV0Setters` for `TokenMarketplaceRules`
impl TokenMarketplaceRulesV0Setters for TokenMarketplaceRules {
fn set_trade_mode(&mut self, trade_mode: TokenTradeMode) {
match self {
TokenMarketplaceRules::V0(inner) => inner.set_trade_mode(trade_mode),
}
}

fn set_trade_mode_change_rules(&mut self, rules: ChangeControlRules) {
match self {
TokenMarketplaceRules::V0(inner) => inner.set_trade_mode_change_rules(rules),
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
use crate::data_contract::associated_token::token_marketplace_rules::v0::TokenTradeMode;
use crate::data_contract::change_control_rules::ChangeControlRules;

/// Trait for read accessors for `TokenMarketplaceRulesV0`
pub trait TokenMarketplaceRulesV0Getters {
/// Returns the current trade mode for the token
fn trade_mode(&self) -> &TokenTradeMode;

/// Returns the change control rules for modifying the trade mode
fn trade_mode_change_rules(&self) -> &ChangeControlRules;

/// Returns the change control rules as mutable for modifying the trade mode
fn trade_mode_change_rules_mut(&mut self) -> &mut ChangeControlRules;
}

/// Trait for mutation accessors for `TokenMarketplaceRulesV0`
pub trait TokenMarketplaceRulesV0Setters {
/// Sets a new trade mode for the token
fn set_trade_mode(&mut self, trade_mode: TokenTradeMode);

/// Sets new change control rules for the trade mode
fn set_trade_mode_change_rules(&mut self, rules: ChangeControlRules);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
use bincode::{Decode, Encode};
use derive_more::From;
use serde::{Deserialize, Serialize};

pub mod accessors;
pub mod v0;

#[derive(Serialize, Deserialize, Encode, Decode, Debug, Clone, PartialEq, Eq, From)]
#[serde(tag = "$format_version")]
pub enum TokenMarketplaceRules {
#[serde(rename = "0")]
V0(TokenMarketplaceRulesV0),
}

use crate::data_contract::associated_token::token_marketplace_rules::v0::TokenMarketplaceRulesV0;
use std::fmt;

impl fmt::Display for TokenMarketplaceRules {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
TokenMarketplaceRules::V0(v0) => {
write!(f, "{}", v0) //just pass through
}
}
}
}
Loading
Loading