Skip to content

Commit 3733f56

Browse files
feat(platform)!: enhance token configuration and validation mechanisms (#2439)
1 parent 2480ceb commit 3733f56

File tree

42 files changed

+2909
-75
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+2909
-75
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ impl TokenConfigurationV0Getters for TokenConfiguration {
5656
}
5757

5858
/// Returns the maximum supply.
59-
fn max_supply(&self) -> Option<u64> {
59+
fn max_supply(&self) -> Option<TokenAmount> {
6060
match self {
6161
TokenConfiguration::V0(v0) => v0.max_supply(),
6262
}

packages/rs-dpp/src/data_contract/change_control_rules/authorized_action_takers.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ pub enum AuthorizedActionTakers {
1515
#[default]
1616
NoOne,
1717
ContractOwner,
18+
Identity(Identifier),
1819
MainGroup,
1920
Group(GroupContractPosition),
2021
}
@@ -26,6 +27,7 @@ impl fmt::Display for AuthorizedActionTakers {
2627
AuthorizedActionTakers::ContractOwner => write!(f, "ContractOwner"),
2728
AuthorizedActionTakers::MainGroup => write!(f, "MainGroup"),
2829
AuthorizedActionTakers::Group(position) => write!(f, "Group(Position: {})", position),
30+
AuthorizedActionTakers::Identity(identifier) => write!(f, "Identity({})", identifier),
2931
}
3032
}
3133
}
@@ -51,6 +53,12 @@ impl AuthorizedActionTakers {
5153
}
5254
},
5355

56+
// Only an identity is allowed
57+
AuthorizedActionTakers::Identity(identity) => match action_taker {
58+
ActionTaker::SingleIdentity(action_taker) => action_taker == identity,
59+
ActionTaker::SpecifiedIdentities(action_takers) => action_takers.contains(identity),
60+
},
61+
5462
// MainGroup allows multiparty actions with specific power requirements
5563
AuthorizedActionTakers::MainGroup => {
5664
if let Some(main_group_contract_position) = &main_group {

packages/rs-dpp/src/errors/consensus/basic/basic_error.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,8 @@ use crate::consensus::basic::group::GroupActionNotAllowedOnTransitionError;
7373
use crate::consensus::basic::overflow_error::OverflowError;
7474
use crate::consensus::basic::token::{
7575
ChoosingTokenMintRecipientNotAllowedError, ContractHasNoTokensError,
76-
DestinationIdentityForTokenMintingNotSetError, InvalidActionIdError, InvalidGroupPositionError,
77-
InvalidTokenIdError, InvalidTokenPositionError, TokenTransferToOurselfError,
76+
DestinationIdentityForTokenMintingNotSetError, InvalidActionIdError, InvalidTokenIdError,
77+
InvalidTokenPositionError, TokenTransferToOurselfError,
7878
};
7979
use crate::consensus::basic::unsupported_version_error::UnsupportedVersionError;
8080
use crate::consensus::basic::value_error::ValueError;
@@ -438,9 +438,6 @@ pub enum BasicError {
438438
#[error(transparent)]
439439
ContractHasNoTokensError(ContractHasNoTokensError),
440440

441-
#[error(transparent)]
442-
InvalidGroupPositionError(InvalidGroupPositionError),
443-
444441
#[error(transparent)]
445442
GroupPositionDoesNotExistError(GroupPositionDoesNotExistError),
446443

packages/rs-dpp/src/errors/consensus/basic/token/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ mod choosing_token_mint_recipient_not_allowed_error;
22
mod contract_has_no_tokens_error;
33
mod destination_identity_for_token_minting_not_set_error;
44
mod invalid_action_id_error;
5-
mod invalid_group_position_error;
65
mod invalid_token_id_error;
76
mod invalid_token_position_error;
87
mod token_transfer_to_ourselves_error;
@@ -11,7 +10,6 @@ pub use choosing_token_mint_recipient_not_allowed_error::*;
1110
pub use contract_has_no_tokens_error::*;
1211
pub use destination_identity_for_token_minting_not_set_error::*;
1312
pub use invalid_action_id_error::*;
14-
pub use invalid_group_position_error::*;
1513
pub use invalid_token_id_error::*;
1614
pub use invalid_token_position_error::*;
1715
pub use token_transfer_to_ourselves_error::*;

packages/rs-dpp/src/errors/consensus/codes.rs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -104,14 +104,13 @@ impl ErrorWithCode for BasicError {
104104
Self::NonContiguousContractTokenPositionsError(_) => 10253,
105105

106106
// Group Errors: 10350-10399
107-
Self::InvalidGroupPositionError(_) => 10350,
108-
Self::GroupPositionDoesNotExistError(_) => 10351,
109-
Self::GroupActionNotAllowedOnTransitionError(_) => 10352,
110-
Self::GroupTotalPowerLessThanRequiredError(_) => 10353,
111-
Self::GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError(_) => 10354,
112-
Self::GroupExceedsMaxMembersError(_) => 10355,
113-
Self::GroupMemberHasPowerOfZeroError(_) => 10356,
114-
Self::GroupMemberHasPowerOverLimitError(_) => 10357,
107+
Self::GroupPositionDoesNotExistError(_) => 10350,
108+
Self::GroupActionNotAllowedOnTransitionError(_) => 10351,
109+
Self::GroupTotalPowerLessThanRequiredError(_) => 10352,
110+
Self::GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError(_) => 10353,
111+
Self::GroupExceedsMaxMembersError(_) => 10354,
112+
Self::GroupMemberHasPowerOfZeroError(_) => 10355,
113+
Self::GroupMemberHasPowerOverLimitError(_) => 10356,
115114

116115
// Document Errors: 10400-10449
117116
Self::DataContractNotPresentError { .. } => 10400,
@@ -248,6 +247,13 @@ impl ErrorWithCode for StateError {
248247
Self::UnauthorizedTokenActionError(_) => 40151,
249248
Self::IdentityTokenAccountFrozenError(_) => 40152,
250249
Self::IdentityTokenAccountNotFrozenError(_) => 40153,
250+
Self::TokenSettingMaxSupplyToLessThanCurrentSupplyError(_) => 40154,
251+
Self::TokenMintPastMaxSupplyError(_) => 40155,
252+
Self::NewTokensDestinationIdentityDoesNotExistError(_) => 40156,
253+
Self::NewAuthorizedActionTakerIdentityDoesNotExistError(_) => 40157,
254+
Self::NewAuthorizedActionTakerGroupDoesNotExistError(_) => 40158,
255+
Self::NewAuthorizedActionTakerMainGroupNotSetError(_) => 40159,
256+
Self::InvalidGroupPositionError(_) => 40160,
251257

252258
// Identity Errors: 40200-40299
253259
Self::IdentityAlreadyExistsError(_) => 40200,

packages/rs-dpp/src/errors/consensus/state/state_error.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ use crate::consensus::state::identity::missing_transfer_key_error::MissingTransf
4242
use crate::consensus::state::identity::no_transfer_key_for_core_withdrawal_available_error::NoTransferKeyForCoreWithdrawalAvailableError;
4343
use crate::consensus::state::prefunded_specialized_balances::prefunded_specialized_balance_insufficient_error::PrefundedSpecializedBalanceInsufficientError;
4444
use crate::consensus::state::prefunded_specialized_balances::prefunded_specialized_balance_not_found_error::PrefundedSpecializedBalanceNotFoundError;
45-
use crate::consensus::state::token::{IdentityDoesNotHaveEnoughTokenBalanceError, IdentityTokenAccountFrozenError, IdentityTokenAccountNotFrozenError, UnauthorizedTokenActionError};
45+
use crate::consensus::state::token::{IdentityDoesNotHaveEnoughTokenBalanceError, IdentityTokenAccountFrozenError, IdentityTokenAccountNotFrozenError, InvalidGroupPositionError, NewAuthorizedActionTakerGroupDoesNotExistError, NewAuthorizedActionTakerIdentityDoesNotExistError, NewAuthorizedActionTakerMainGroupNotSetError, NewTokensDestinationIdentityDoesNotExistError, TokenMintPastMaxSupplyError, TokenSettingMaxSupplyToLessThanCurrentSupplyError, UnauthorizedTokenActionError};
4646
use crate::consensus::state::voting::masternode_incorrect_voter_identity_id_error::MasternodeIncorrectVoterIdentityIdError;
4747
use crate::consensus::state::voting::masternode_incorrect_voting_address_error::MasternodeIncorrectVotingAddressError;
4848
use crate::consensus::state::voting::masternode_not_found_error::MasternodeNotFoundError;
@@ -230,6 +230,31 @@ pub enum StateError {
230230

231231
#[error(transparent)]
232232
DataContractUpdateActionNotAllowedError(DataContractUpdateActionNotAllowedError),
233+
234+
#[error(transparent)]
235+
TokenSettingMaxSupplyToLessThanCurrentSupplyError(
236+
TokenSettingMaxSupplyToLessThanCurrentSupplyError,
237+
),
238+
239+
#[error(transparent)]
240+
TokenMintPastMaxSupplyError(TokenMintPastMaxSupplyError),
241+
242+
#[error(transparent)]
243+
NewTokensDestinationIdentityDoesNotExistError(NewTokensDestinationIdentityDoesNotExistError),
244+
245+
#[error(transparent)]
246+
NewAuthorizedActionTakerIdentityDoesNotExistError(
247+
NewAuthorizedActionTakerIdentityDoesNotExistError,
248+
),
249+
250+
#[error(transparent)]
251+
NewAuthorizedActionTakerGroupDoesNotExistError(NewAuthorizedActionTakerGroupDoesNotExistError),
252+
253+
#[error(transparent)]
254+
NewAuthorizedActionTakerMainGroupNotSetError(NewAuthorizedActionTakerMainGroupNotSetError),
255+
256+
#[error(transparent)]
257+
InvalidGroupPositionError(InvalidGroupPositionError),
233258
}
234259

235260
impl From<StateError> for ConsensusError {
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::consensus::basic::BasicError;
1+
use crate::consensus::state::state_error::StateError;
22
use crate::consensus::ConsensusError;
33
use crate::data_contract::GroupContractPosition;
44
use crate::ProtocolError;
@@ -10,29 +10,32 @@ use thiserror::Error;
1010
Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize,
1111
)]
1212
#[error(
13-
"Invalid group position {}, expected {}",
14-
invalid_group_position,
15-
expected_group_position
13+
"Invalid group position: {invalid_group_position}. {max_group_message}",
14+
max_group_message = if let Some(max) = self.max_group_position {
15+
format!("The maximum allowed group position is {}", max)
16+
} else {
17+
"No maximum group position limit is set.".to_string()
18+
}
1619
)]
1720
#[platform_serialize(unversioned)]
1821
pub struct InvalidGroupPositionError {
19-
expected_group_position: GroupContractPosition,
22+
max_group_position: Option<GroupContractPosition>,
2023
invalid_group_position: GroupContractPosition,
2124
}
2225

2326
impl InvalidGroupPositionError {
2427
pub fn new(
25-
expected_group_position: GroupContractPosition,
28+
max_group_position: Option<GroupContractPosition>,
2629
invalid_group_position: GroupContractPosition,
2730
) -> Self {
2831
Self {
29-
expected_group_position,
32+
max_group_position,
3033
invalid_group_position,
3134
}
3235
}
3336

34-
pub fn expected_group_position(&self) -> GroupContractPosition {
35-
self.expected_group_position
37+
pub fn max_group_position(&self) -> Option<GroupContractPosition> {
38+
self.max_group_position
3639
}
3740

3841
pub fn invalid_group_position(&self) -> GroupContractPosition {
@@ -42,6 +45,6 @@ impl InvalidGroupPositionError {
4245

4346
impl From<InvalidGroupPositionError> for ConsensusError {
4447
fn from(err: InvalidGroupPositionError) -> Self {
45-
Self::BasicError(BasicError::InvalidGroupPositionError(err))
48+
Self::StateError(StateError::InvalidGroupPositionError(err))
4649
}
4750
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,23 @@
11
mod identity_does_not_have_enough_token_balance_error;
22
mod identity_token_account_frozen_error;
33
mod identity_token_account_not_frozen_error;
4+
mod invalid_group_position_error;
5+
mod new_authorized_action_taker_group_does_not_exist_error;
6+
mod new_authorized_action_taker_identity_does_not_exist_error;
7+
mod new_authorized_action_taker_main_group_not_set_error;
8+
mod new_tokens_destination_identity_does_not_exist_error;
9+
mod token_mint_past_max_supply_error;
10+
mod token_setting_max_supply_to_less_than_current_supply_error;
411
mod unauthorized_token_action_error;
512

613
pub use identity_does_not_have_enough_token_balance_error::*;
714
pub use identity_token_account_frozen_error::*;
815
pub use identity_token_account_not_frozen_error::*;
16+
pub use invalid_group_position_error::*;
17+
pub use new_authorized_action_taker_group_does_not_exist_error::*;
18+
pub use new_authorized_action_taker_identity_does_not_exist_error::*;
19+
pub use new_authorized_action_taker_main_group_not_set_error::*;
20+
pub use new_tokens_destination_identity_does_not_exist_error::*;
21+
pub use token_mint_past_max_supply_error::*;
22+
pub use token_setting_max_supply_to_less_than_current_supply_error::*;
923
pub use unauthorized_token_action_error::*;
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
use crate::consensus::state::state_error::StateError;
2+
use crate::consensus::ConsensusError;
3+
use crate::data_contract::GroupContractPosition;
4+
use crate::ProtocolError;
5+
use bincode::{Decode, Encode};
6+
use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize};
7+
use thiserror::Error;
8+
9+
#[derive(
10+
Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize,
11+
)]
12+
#[error("The specified new authorized action taker group {group_contract_position} does not exist")]
13+
#[platform_serialize(unversioned)]
14+
pub struct NewAuthorizedActionTakerGroupDoesNotExistError {
15+
group_contract_position: GroupContractPosition,
16+
}
17+
18+
impl NewAuthorizedActionTakerGroupDoesNotExistError {
19+
pub fn new(group_contract_position: GroupContractPosition) -> Self {
20+
Self {
21+
group_contract_position,
22+
}
23+
}
24+
25+
pub fn group_contract_position(&self) -> GroupContractPosition {
26+
self.group_contract_position
27+
}
28+
}
29+
30+
impl From<NewAuthorizedActionTakerGroupDoesNotExistError> for ConsensusError {
31+
fn from(err: NewAuthorizedActionTakerGroupDoesNotExistError) -> Self {
32+
Self::StateError(StateError::NewAuthorizedActionTakerGroupDoesNotExistError(
33+
err,
34+
))
35+
}
36+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
use crate::consensus::state::state_error::StateError;
2+
use crate::consensus::ConsensusError;
3+
use crate::ProtocolError;
4+
use bincode::{Decode, Encode};
5+
use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize};
6+
use platform_value::Identifier;
7+
use thiserror::Error;
8+
9+
#[derive(
10+
Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize,
11+
)]
12+
#[error("The specified new authorized action taker identity {identity_id} does not exist")]
13+
#[platform_serialize(unversioned)]
14+
pub struct NewAuthorizedActionTakerIdentityDoesNotExistError {
15+
identity_id: Identifier,
16+
}
17+
18+
impl NewAuthorizedActionTakerIdentityDoesNotExistError {
19+
pub fn new(identity_id: Identifier) -> Self {
20+
Self { identity_id }
21+
}
22+
23+
pub fn identity_id(&self) -> &Identifier {
24+
&self.identity_id
25+
}
26+
}
27+
28+
impl From<NewAuthorizedActionTakerIdentityDoesNotExistError> for ConsensusError {
29+
fn from(err: NewAuthorizedActionTakerIdentityDoesNotExistError) -> Self {
30+
Self::StateError(StateError::NewAuthorizedActionTakerIdentityDoesNotExistError(err))
31+
}
32+
}

0 commit comments

Comments
 (0)