Skip to content

Commit 2581ea2

Browse files
feat: add marketplace rules to token configuration
1 parent eacc5f8 commit 2581ea2

File tree

13 files changed

+348
-1
lines changed

13 files changed

+348
-1
lines changed

packages/rs-dpp/src/data_contract/associated_token/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ pub mod token_configuration_localization;
55
pub mod token_distribution_key;
66
pub mod token_distribution_rules;
77
pub mod token_keeps_history_rules;
8+
pub mod token_marketplace_rules;
89
pub mod token_perpetual_distribution;
910
pub mod token_pre_programmed_distribution;

packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/apply_token_configuration_item/v0/mod.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ use crate::data_contract::associated_token::token_configuration_item::TokenConfi
33
use crate::data_contract::associated_token::token_distribution_rules::accessors::v0::{
44
TokenDistributionRulesV0Getters, TokenDistributionRulesV0Setters,
55
};
6+
use crate::data_contract::associated_token::token_marketplace_rules::accessors::v0::{
7+
TokenMarketplaceRulesV0Getters, TokenMarketplaceRulesV0Setters,
8+
};
69

710
impl TokenConfigurationV0 {
811
/// Applies a `TokenConfigurationChangeItem` to this token configuration.
@@ -135,6 +138,19 @@ impl TokenConfigurationV0 {
135138
TokenConfigurationChangeItem::MainControlGroup(main_group) => {
136139
self.main_control_group = main_group;
137140
}
141+
TokenConfigurationChangeItem::MarketplaceTradeMode(trade_mode) => {
142+
self.marketplace_rules.set_trade_mode(trade_mode);
143+
}
144+
TokenConfigurationChangeItem::MarketplaceTradeModeControlGroup(control_group) => {
145+
self.marketplace_rules
146+
.trade_mode_change_rules_mut()
147+
.set_authorized_to_make_change_action_takers(control_group);
148+
}
149+
TokenConfigurationChangeItem::MarketplaceTradeModeAdminGroup(admin_group) => {
150+
self.marketplace_rules
151+
.trade_mode_change_rules_mut()
152+
.set_admin_action_takers(admin_group);
153+
}
138154
}
139155
}
140156
}

packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/authorized_action_takers_for_configuration_item/v0/mod.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0;
22
use crate::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem;
33
use crate::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Getters;
4+
use crate::data_contract::associated_token::token_marketplace_rules::accessors::v0::TokenMarketplaceRulesV0Getters;
45
use crate::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers;
56
impl TokenConfigurationV0 {
67
/// Returns the authorized action takers for a specific `TokenConfigurationChangeItem`.
@@ -105,6 +106,18 @@ impl TokenConfigurationV0 {
105106
*self.emergency_action_rules.admin_action_takers()
106107
}
107108
TokenConfigurationChangeItem::MainControlGroup(_) => AuthorizedActionTakers::NoOne,
109+
TokenConfigurationChangeItem::MarketplaceTradeMode(_) => *self
110+
.marketplace_rules
111+
.trade_mode_change_rules()
112+
.authorized_to_make_change_action_takers(),
113+
TokenConfigurationChangeItem::MarketplaceTradeModeControlGroup(_) => *self
114+
.marketplace_rules
115+
.trade_mode_change_rules()
116+
.admin_action_takers(),
117+
TokenConfigurationChangeItem::MarketplaceTradeModeAdminGroup(_) => *self
118+
.marketplace_rules
119+
.trade_mode_change_rules()
120+
.admin_action_takers(),
108121
}
109122
}
110123
}

packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/can_apply_token_configuration_item/v0/mod.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::data_contract::associated_token::token_configuration::v0::TokenConfigurationV0;
22
use crate::data_contract::associated_token::token_configuration_item::TokenConfigurationChangeItem;
33
use crate::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Getters;
4+
use crate::data_contract::associated_token::token_marketplace_rules::accessors::v0::TokenMarketplaceRulesV0Getters;
45
use crate::data_contract::group::Group;
56
use crate::data_contract::GroupContractPosition;
67
use crate::group::action_taker::{ActionGoal, ActionTaker};
@@ -290,6 +291,32 @@ impl TokenConfigurationV0 {
290291
action_taker,
291292
goal,
292293
),
294+
TokenConfigurationChangeItem::MarketplaceTradeMode(_) => self
295+
.marketplace_rules
296+
.trade_mode_change_rules()
297+
.can_make_change(contract_owner_id, main_group, groups, action_taker, goal),
298+
TokenConfigurationChangeItem::MarketplaceTradeModeControlGroup(control_group) => self
299+
.marketplace_rules
300+
.trade_mode_change_rules()
301+
.can_change_authorized_action_takers(
302+
control_group,
303+
contract_owner_id,
304+
main_group,
305+
groups,
306+
action_taker,
307+
goal,
308+
),
309+
TokenConfigurationChangeItem::MarketplaceTradeModeAdminGroup(admin_group) => self
310+
.marketplace_rules
311+
.trade_mode_change_rules()
312+
.can_change_admin_action_takers(
313+
admin_group,
314+
contract_owner_id,
315+
main_group,
316+
groups,
317+
action_taker,
318+
goal,
319+
),
293320
}
294321
}
295322
}

packages/rs-dpp/src/data_contract/associated_token/token_configuration/methods/validate_token_configuration_update/v0/mod.rs

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ use crate::consensus::basic::data_contract::DataContractTokenConfigurationUpdate
22
use crate::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters;
33
use crate::data_contract::associated_token::token_configuration::TokenConfiguration;
44
use crate::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Getters;
5+
use crate::data_contract::associated_token::token_marketplace_rules::accessors::v0::TokenMarketplaceRulesV0Getters;
56
use crate::data_contract::group::Group;
67
use crate::data_contract::GroupContractPosition;
78
use crate::group::action_taker::{ActionGoal, ActionTaker};
@@ -159,6 +160,71 @@ impl TokenConfiguration {
159160
}
160161
}
161162

163+
// Check changes to change_direct_purchase_pricing_rules and its rules
164+
#[allow(clippy::collapsible_if)]
165+
if old
166+
.distribution_rules
167+
.change_direct_purchase_pricing_rules()
168+
!= new
169+
.distribution_rules
170+
.change_direct_purchase_pricing_rules()
171+
{
172+
if !old
173+
.distribution_rules
174+
.change_direct_purchase_pricing_rules()
175+
.can_change_to(
176+
new.distribution_rules
177+
.change_direct_purchase_pricing_rules(),
178+
contract_owner_id,
179+
self.main_control_group(),
180+
groups,
181+
action_taker,
182+
goal,
183+
)
184+
{
185+
return SimpleConsensusValidationResult::new_with_error(
186+
DataContractTokenConfigurationUpdateError::new(
187+
"update".to_string(),
188+
"change_direct_purchase_pricing_rules".to_string(),
189+
self.clone(),
190+
new_config.clone(),
191+
)
192+
.into(),
193+
);
194+
}
195+
}
196+
197+
// Check changes to change_direct_purchase_pricing_rules and its rules
198+
#[allow(clippy::collapsible_if)]
199+
if old.marketplace_rules.trade_mode() != new.marketplace_rules.trade_mode()
200+
|| old.marketplace_rules.trade_mode_change_rules()
201+
!= new.marketplace_rules.trade_mode_change_rules()
202+
{
203+
if !old
204+
.marketplace_rules
205+
.trade_mode_change_rules()
206+
.can_change_to(
207+
new.marketplace_rules.trade_mode_change_rules(),
208+
contract_owner_id,
209+
self.main_control_group(),
210+
groups,
211+
action_taker,
212+
goal,
213+
)
214+
{
215+
return SimpleConsensusValidationResult::new_with_error(
216+
DataContractTokenConfigurationUpdateError::new(
217+
"update".to_string(),
218+
"marketplace_rules trade_mode or marketplace_rules trade_mode_change_rules"
219+
.to_string(),
220+
self.clone(),
221+
new_config.clone(),
222+
)
223+
.into(),
224+
);
225+
}
226+
}
227+
162228
// Check changes to perpetual_distribution and its rules
163229
#[allow(clippy::collapsible_if)]
164230
if old.distribution_rules.perpetual_distribution()

packages/rs-dpp/src/data_contract/associated_token/token_configuration/v0/mod.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ use crate::data_contract::associated_token::token_distribution_rules::v0::TokenD
77
use crate::data_contract::associated_token::token_distribution_rules::TokenDistributionRules;
88
use crate::data_contract::associated_token::token_keeps_history_rules::v0::TokenKeepsHistoryRulesV0;
99
use crate::data_contract::associated_token::token_keeps_history_rules::TokenKeepsHistoryRules;
10+
use crate::data_contract::associated_token::token_marketplace_rules::v0::{
11+
TokenMarketplaceRulesV0, TokenTradeMode,
12+
};
13+
use crate::data_contract::associated_token::token_marketplace_rules::TokenMarketplaceRules;
1014
use crate::data_contract::associated_token::token_perpetual_distribution::TokenPerpetualDistribution;
1115
use crate::data_contract::associated_token::token_pre_programmed_distribution::TokenPreProgrammedDistribution;
1216
use crate::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers;
@@ -70,6 +74,10 @@ pub struct TokenConfigurationV0 {
7074
#[serde(default = "default_token_distribution_rules")]
7175
pub distribution_rules: TokenDistributionRules,
7276

77+
/// Defines the token's marketplace logic.
78+
#[serde(default = "default_token_marketplace_rules")]
79+
pub marketplace_rules: TokenMarketplaceRules,
80+
7381
/// Rules controlling who is authorized to perform manual minting of tokens.
7482
#[serde(default = "default_contract_owner_change_control_rules")]
7583
pub manual_minting_rules: ChangeControlRules,
@@ -170,6 +178,19 @@ fn default_token_distribution_rules() -> TokenDistributionRules {
170178
})
171179
}
172180

181+
fn default_token_marketplace_rules() -> TokenMarketplaceRules {
182+
TokenMarketplaceRules::V0(TokenMarketplaceRulesV0 {
183+
trade_mode: TokenTradeMode::NotTradeable,
184+
trade_mode_change_rules: ChangeControlRules::V0(ChangeControlRulesV0 {
185+
authorized_to_make_change: AuthorizedActionTakers::NoOne,
186+
admin_action_takers: AuthorizedActionTakers::NoOne,
187+
changing_authorized_action_takers_to_no_one_allowed: false,
188+
changing_admin_action_takers_to_no_one_allowed: false,
189+
self_changing_admin_action_takers_allowed: false,
190+
}),
191+
})
192+
}
193+
173194
fn default_change_control_rules() -> ChangeControlRules {
174195
ChangeControlRules::V0(ChangeControlRulesV0 {
175196
authorized_to_make_change: AuthorizedActionTakers::NoOne,
@@ -414,6 +435,13 @@ impl TokenConfigurationPreset {
414435
}
415436
}
416437

438+
pub fn default_marketplace_rules_v0(&self) -> TokenMarketplaceRulesV0 {
439+
TokenMarketplaceRulesV0 {
440+
trade_mode: TokenTradeMode::NotTradeable,
441+
trade_mode_change_rules: self.default_basic_change_control_rules_v0().into(),
442+
}
443+
}
444+
417445
pub fn token_configuration_v0(
418446
&self,
419447
conventions: TokenConfigurationConvention,
@@ -437,6 +465,7 @@ impl TokenConfigurationPreset {
437465
distribution_rules: self
438466
.default_distribution_rules_v0(None, None, with_direct_pricing)
439467
.into(),
468+
marketplace_rules: self.default_marketplace_rules_v0().into(),
440469
manual_minting_rules: self.default_basic_change_control_rules_v0().into(),
441470
manual_burning_rules: self.default_basic_change_control_rules_v0().into(),
442471
freeze_rules: self.default_advanced_change_control_rules_v0().into(),

packages/rs-dpp/src/data_contract/associated_token/token_configuration_item.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::balances::credits::TokenAmount;
22
use crate::data_contract::associated_token::token_configuration_convention::TokenConfigurationConvention;
3+
use crate::data_contract::associated_token::token_marketplace_rules::v0::TokenTradeMode;
34
use crate::data_contract::associated_token::token_perpetual_distribution::TokenPerpetualDistribution;
45
use crate::data_contract::change_control_rules::authorized_action_takers::AuthorizedActionTakers;
56
use crate::data_contract::GroupContractPosition;
@@ -59,6 +60,9 @@ pub enum TokenConfigurationChangeItem {
5960
DestroyFrozenFundsAdminGroup(AuthorizedActionTakers),
6061
EmergencyAction(AuthorizedActionTakers),
6162
EmergencyActionAdminGroup(AuthorizedActionTakers),
63+
MarketplaceTradeMode(TokenTradeMode),
64+
MarketplaceTradeModeControlGroup(AuthorizedActionTakers),
65+
MarketplaceTradeModeAdminGroup(AuthorizedActionTakers),
6266
MainControlGroup(Option<GroupContractPosition>),
6367
}
6468
impl TokenConfigurationChangeItem {
@@ -92,7 +96,10 @@ impl TokenConfigurationChangeItem {
9296
TokenConfigurationChangeItem::DestroyFrozenFundsAdminGroup(_) => 25,
9397
TokenConfigurationChangeItem::EmergencyAction(_) => 26,
9498
TokenConfigurationChangeItem::EmergencyActionAdminGroup(_) => 27,
95-
TokenConfigurationChangeItem::MainControlGroup(_) => 28,
99+
TokenConfigurationChangeItem::MarketplaceTradeMode(_) => 28,
100+
TokenConfigurationChangeItem::MarketplaceTradeModeControlGroup(_) => 29,
101+
TokenConfigurationChangeItem::MarketplaceTradeModeAdminGroup(_) => 30,
102+
TokenConfigurationChangeItem::MainControlGroup(_) => 31,
96103
}
97104
}
98105
}
@@ -216,6 +223,15 @@ impl fmt::Display for TokenConfigurationChangeItem {
216223
Some(pos) => write!(f, "Main Control Group: {}", pos),
217224
None => write!(f, "Main Control Group: None"),
218225
},
226+
TokenConfigurationChangeItem::MarketplaceTradeMode(mode) => {
227+
write!(f, "Marketplace Trade Mode: {:?}", mode)
228+
}
229+
TokenConfigurationChangeItem::MarketplaceTradeModeControlGroup(control_group) => {
230+
write!(f, "Marketplace Trade Mode Control Group: {}", control_group)
231+
}
232+
TokenConfigurationChangeItem::MarketplaceTradeModeAdminGroup(admin_group) => {
233+
write!(f, "Marketplace Trade Mode Admin Group: {}", admin_group)
234+
}
219235
}
220236
}
221237
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
use crate::data_contract::associated_token::token_marketplace_rules::accessors::v0::{
2+
TokenMarketplaceRulesV0Getters, TokenMarketplaceRulesV0Setters,
3+
};
4+
use crate::data_contract::associated_token::token_marketplace_rules::v0::TokenTradeMode;
5+
use crate::data_contract::associated_token::token_marketplace_rules::TokenMarketplaceRules;
6+
use crate::data_contract::change_control_rules::ChangeControlRules;
7+
8+
pub mod v0;
9+
/// Implementing `TokenMarketplaceRulesV0Getters` for `TokenMarketplaceRules`
10+
impl TokenMarketplaceRulesV0Getters for TokenMarketplaceRules {
11+
fn trade_mode(&self) -> &TokenTradeMode {
12+
match self {
13+
TokenMarketplaceRules::V0(inner) => inner.trade_mode(),
14+
}
15+
}
16+
17+
fn trade_mode_change_rules(&self) -> &ChangeControlRules {
18+
match self {
19+
TokenMarketplaceRules::V0(inner) => inner.trade_mode_change_rules(),
20+
}
21+
}
22+
23+
fn trade_mode_change_rules_mut(&mut self) -> &mut ChangeControlRules {
24+
match self {
25+
TokenMarketplaceRules::V0(inner) => inner.trade_mode_change_rules_mut(),
26+
}
27+
}
28+
}
29+
30+
/// Implementing `TokenMarketplaceRulesV0Setters` for `TokenMarketplaceRules`
31+
impl TokenMarketplaceRulesV0Setters for TokenMarketplaceRules {
32+
fn set_trade_mode(&mut self, trade_mode: TokenTradeMode) {
33+
match self {
34+
TokenMarketplaceRules::V0(inner) => inner.set_trade_mode(trade_mode),
35+
}
36+
}
37+
38+
fn set_trade_mode_change_rules(&mut self, rules: ChangeControlRules) {
39+
match self {
40+
TokenMarketplaceRules::V0(inner) => inner.set_trade_mode_change_rules(rules),
41+
}
42+
}
43+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
use crate::data_contract::associated_token::token_marketplace_rules::v0::TokenTradeMode;
2+
use crate::data_contract::change_control_rules::ChangeControlRules;
3+
4+
/// Trait for read accessors for `TokenMarketplaceRulesV0`
5+
pub trait TokenMarketplaceRulesV0Getters {
6+
/// Returns the current trade mode for the token
7+
fn trade_mode(&self) -> &TokenTradeMode;
8+
9+
/// Returns the change control rules for modifying the trade mode
10+
fn trade_mode_change_rules(&self) -> &ChangeControlRules;
11+
12+
/// Returns the change control rules as mutable for modifying the trade mode
13+
fn trade_mode_change_rules_mut(&mut self) -> &mut ChangeControlRules;
14+
}
15+
16+
/// Trait for mutation accessors for `TokenMarketplaceRulesV0`
17+
pub trait TokenMarketplaceRulesV0Setters {
18+
/// Sets a new trade mode for the token
19+
fn set_trade_mode(&mut self, trade_mode: TokenTradeMode);
20+
21+
/// Sets new change control rules for the trade mode
22+
fn set_trade_mode_change_rules(&mut self, rules: ChangeControlRules);
23+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
use bincode::{Decode, Encode};
2+
use derive_more::From;
3+
use serde::{Deserialize, Serialize};
4+
5+
pub mod accessors;
6+
pub mod v0;
7+
8+
#[derive(Serialize, Deserialize, Encode, Decode, Debug, Clone, PartialEq, Eq, From)]
9+
#[serde(tag = "$format_version")]
10+
pub enum TokenMarketplaceRules {
11+
#[serde(rename = "0")]
12+
V0(TokenMarketplaceRulesV0),
13+
}
14+
15+
use crate::data_contract::associated_token::token_marketplace_rules::v0::TokenMarketplaceRulesV0;
16+
use std::fmt;
17+
18+
impl fmt::Display for TokenMarketplaceRules {
19+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
20+
match self {
21+
TokenMarketplaceRules::V0(v0) => {
22+
write!(f, "{}", v0) //just pass through
23+
}
24+
}
25+
}
26+
}

0 commit comments

Comments
 (0)