Skip to content

Commit 40e2869

Browse files
fix(platform): force allow choosing minting destination if no default minting destination recipient (#2586)
1 parent c2eddc4 commit 40e2869

7 files changed

Lines changed: 99 additions & 8 deletions

File tree

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

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ use crate::consensus::basic::data_contract::{
2020
InvalidTokenDistributionFunctionIncoherenceError,
2121
InvalidTokenDistributionFunctionInvalidParameterError,
2222
InvalidTokenDistributionFunctionInvalidParameterTupleError,
23-
NonContiguousContractGroupPositionsError, NonContiguousContractTokenPositionsError,
24-
SystemPropertyIndexAlreadyPresentError, UndefinedIndexPropertyError,
25-
UniqueIndicesLimitReachedError, UnknownDocumentCreationRestrictionModeError,
26-
UnknownGasFeesPaidByError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError,
27-
UnknownTradeModeError, UnknownTransferableTypeError,
23+
NewTokensDestinationIdentityOptionRequiredError, NonContiguousContractGroupPositionsError,
24+
NonContiguousContractTokenPositionsError, SystemPropertyIndexAlreadyPresentError,
25+
UndefinedIndexPropertyError, UniqueIndicesLimitReachedError,
26+
UnknownDocumentCreationRestrictionModeError, UnknownGasFeesPaidByError,
27+
UnknownSecurityLevelError, UnknownStorageKeyRequirementsError, UnknownTradeModeError,
28+
UnknownTransferableTypeError,
2829
};
2930
use crate::consensus::basic::data_contract::{
3031
InvalidJsonSchemaRefError, TokenPaymentByBurningOnlyAllowedOnInternalTokenError,
@@ -531,6 +532,11 @@ pub enum BasicError {
531532

532533
#[error(transparent)]
533534
InvalidDescriptionLengthError(InvalidDescriptionLengthError),
535+
536+
#[error(transparent)]
537+
NewTokensDestinationIdentityOptionRequiredError(
538+
NewTokensDestinationIdentityOptionRequiredError,
539+
),
534540
}
535541

536542
impl From<BasicError> for ConsensusError {

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ mod invalid_token_distribution_function_incoherence_error;
3535
mod invalid_token_distribution_function_invalid_parameter_error;
3636
mod invalid_token_distribution_function_invalid_parameter_tuple_error;
3737
mod keywords_over_limit;
38+
mod new_tokens_destination_identity_option_required_error;
3839
mod non_contiguous_contract_group_positions_error;
3940
mod non_contiguous_contract_token_positions_error;
4041
mod system_property_index_already_present_error;
@@ -90,6 +91,7 @@ pub use invalid_token_distribution_function_incoherence_error::*;
9091
pub use invalid_token_distribution_function_invalid_parameter_error::*;
9192
pub use invalid_token_distribution_function_invalid_parameter_tuple_error::*;
9293
pub use keywords_over_limit::*;
94+
pub use new_tokens_destination_identity_option_required_error::*;
9395
pub use non_contiguous_contract_group_positions_error::*;
9496
pub use non_contiguous_contract_token_positions_error::*;
9597
pub use token_payment_by_burning_only_allowed_on_internal_token_error::*;
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
use crate::consensus::basic::BasicError;
2+
use crate::consensus::ConsensusError;
3+
use crate::data_contract::TokenContractPosition;
4+
use crate::ProtocolError;
5+
use bincode::{Decode, Encode};
6+
use platform_serialization_derive::{PlatformDeserialize, PlatformSerialize};
7+
use platform_value::Identifier;
8+
use thiserror::Error;
9+
10+
#[derive(
11+
Error, Debug, Clone, PartialEq, Eq, Encode, Decode, PlatformSerialize, PlatformDeserialize,
12+
)]
13+
#[error("token configuration requires a new tokens destination identity if choosing destination is not allowed for contract {contract_id} at position {token_position}")]
14+
#[platform_serialize(unversioned)]
15+
pub struct NewTokensDestinationIdentityOptionRequiredError {
16+
contract_id: Identifier,
17+
token_position: TokenContractPosition,
18+
}
19+
20+
impl NewTokensDestinationIdentityOptionRequiredError {
21+
pub fn new(contract_id: Identifier, token_position: TokenContractPosition) -> Self {
22+
Self {
23+
contract_id,
24+
token_position,
25+
}
26+
}
27+
28+
pub fn contract_id(&self) -> &Identifier {
29+
&self.contract_id
30+
}
31+
32+
pub fn token_position(&self) -> TokenContractPosition {
33+
self.token_position
34+
}
35+
}
36+
37+
impl From<NewTokensDestinationIdentityOptionRequiredError> for ConsensusError {
38+
fn from(err: NewTokensDestinationIdentityOptionRequiredError) -> Self {
39+
Self::BasicError(BasicError::NewTokensDestinationIdentityOptionRequiredError(
40+
err,
41+
))
42+
}
43+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ impl ErrorWithCode for BasicError {
110110
Self::DuplicateKeywordsError(_) => 10263,
111111
Self::InvalidKeywordLengthError(_) => 10264,
112112
Self::InvalidDescriptionLengthError(_) => 10265,
113+
Self::NewTokensDestinationIdentityOptionRequiredError(_) => 10266,
113114

114115
// Group Errors: 10350-10399
115116
Self::GroupPositionDoesNotExistError(_) => 10350,

packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_create/basic_structure/v0/mod.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ use crate::error::Error;
22
use dpp::consensus::basic::data_contract::{
33
DuplicateKeywordsError, InvalidDataContractVersionError, InvalidDescriptionLengthError,
44
InvalidKeywordLengthError, InvalidTokenBaseSupplyError,
5-
NonContiguousContractTokenPositionsError, TooManyKeywordsError,
5+
NewTokensDestinationIdentityOptionRequiredError, NonContiguousContractTokenPositionsError,
6+
TooManyKeywordsError,
67
};
78
use dpp::consensus::basic::BasicError;
89
use dpp::consensus::ConsensusError;
@@ -97,6 +98,23 @@ impl DataContractCreateStateTransitionBasicStructureValidationV0 for DataContrac
9798
return Ok(validation_result);
9899
}
99100
}
101+
102+
if token_configuration
103+
.distribution_rules()
104+
.new_tokens_destination_identity()
105+
.is_none()
106+
&& !token_configuration
107+
.distribution_rules()
108+
.minting_allow_choosing_destination()
109+
{
110+
return Ok(SimpleConsensusValidationResult::new_with_error(
111+
NewTokensDestinationIdentityOptionRequiredError::new(
112+
self.data_contract().id(),
113+
*token_contract_position,
114+
)
115+
.into(),
116+
));
117+
}
100118
}
101119

102120
// Validate there are no more than 20 keywords

packages/rs-drive-abci/src/execution/validation/state_transition/state_transitions/data_contract_update/basic_structure/v0/mod.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use crate::error::Error;
22
use dpp::consensus::basic::data_contract::{
3-
InvalidTokenBaseSupplyError, NonContiguousContractTokenPositionsError,
3+
InvalidTokenBaseSupplyError, NewTokensDestinationIdentityOptionRequiredError,
4+
NonContiguousContractTokenPositionsError,
45
};
56
use dpp::data_contract::associated_token::token_configuration::accessors::v0::TokenConfigurationV0Getters;
67
use dpp::data_contract::associated_token::token_distribution_rules::accessors::v0::TokenDistributionRulesV0Getters;
@@ -82,6 +83,23 @@ impl DataContractUpdateStateTransitionBasicStructureValidationV0 for DataContrac
8283
return Ok(validation_result);
8384
}
8485
}
86+
87+
if token_configuration
88+
.distribution_rules()
89+
.new_tokens_destination_identity()
90+
.is_none()
91+
&& !token_configuration
92+
.distribution_rules()
93+
.minting_allow_choosing_destination()
94+
{
95+
return Ok(SimpleConsensusValidationResult::new_with_error(
96+
NewTokensDestinationIdentityOptionRequiredError::new(
97+
self.data_contract().id(),
98+
*token_contract_position,
99+
)
100+
.into(),
101+
));
102+
}
85103
}
86104

87105
Ok(SimpleConsensusValidationResult::new())

packages/wasm-dpp/src/errors/consensus/consensus_error.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ use dpp::consensus::state::data_trigger::DataTriggerError::{
6161
DataTriggerConditionError, DataTriggerExecutionError, DataTriggerInvalidResultError,
6262
};
6363
use wasm_bindgen::{JsError, JsValue};
64-
use dpp::consensus::basic::data_contract::{ContestedUniqueIndexOnMutableDocumentTypeError, ContestedUniqueIndexWithUniqueIndexError, DataContractTokenConfigurationUpdateError, DuplicateKeywordsError, GroupExceedsMaxMembersError, GroupMemberHasPowerOfZeroError, GroupMemberHasPowerOverLimitError, GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError, GroupPositionDoesNotExistError, GroupTotalPowerLessThanRequiredError, InvalidDescriptionLengthError, InvalidDocumentTypeRequiredSecurityLevelError, InvalidKeywordLengthError, InvalidTokenBaseSupplyError, InvalidTokenDistributionFunctionDivideByZeroError, InvalidTokenDistributionFunctionIncoherenceError, InvalidTokenDistributionFunctionInvalidParameterError, InvalidTokenDistributionFunctionInvalidParameterTupleError, NonContiguousContractGroupPositionsError, NonContiguousContractTokenPositionsError, TokenPaymentByBurningOnlyAllowedOnInternalTokenError, TooManyKeywordsError, UnknownDocumentActionTokenEffectError, UnknownDocumentCreationRestrictionModeError, UnknownGasFeesPaidByError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError, UnknownTradeModeError, UnknownTransferableTypeError};
64+
use dpp::consensus::basic::data_contract::{ContestedUniqueIndexOnMutableDocumentTypeError, ContestedUniqueIndexWithUniqueIndexError, DataContractTokenConfigurationUpdateError, DuplicateKeywordsError, GroupExceedsMaxMembersError, GroupMemberHasPowerOfZeroError, GroupMemberHasPowerOverLimitError, GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError, GroupPositionDoesNotExistError, GroupTotalPowerLessThanRequiredError, InvalidDescriptionLengthError, InvalidDocumentTypeRequiredSecurityLevelError, InvalidKeywordLengthError, InvalidTokenBaseSupplyError, InvalidTokenDistributionFunctionDivideByZeroError, InvalidTokenDistributionFunctionIncoherenceError, InvalidTokenDistributionFunctionInvalidParameterError, InvalidTokenDistributionFunctionInvalidParameterTupleError, NewTokensDestinationIdentityOptionRequiredError, NonContiguousContractGroupPositionsError, NonContiguousContractTokenPositionsError, TokenPaymentByBurningOnlyAllowedOnInternalTokenError, TooManyKeywordsError, UnknownDocumentActionTokenEffectError, UnknownDocumentCreationRestrictionModeError, UnknownGasFeesPaidByError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError, UnknownTradeModeError, UnknownTransferableTypeError};
6565
use dpp::consensus::basic::document::{ContestedDocumentsTemporarilyNotAllowedError, DocumentCreationNotAllowedError, DocumentFieldMaxSizeExceededError, MaxDocumentsTransitionsExceededError, MissingPositionsInDocumentTypePropertiesError};
6666
use dpp::consensus::basic::group::GroupActionNotAllowedOnTransitionError;
6767
use dpp::consensus::basic::identity::{DataContractBoundsNotPresentError, DisablingKeyIdAlsoBeingAddedInSameTransitionError, InvalidIdentityCreditWithdrawalTransitionAmountError, InvalidIdentityUpdateTransitionDisableKeysError, InvalidIdentityUpdateTransitionEmptyError, TooManyMasterPublicKeyError, WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError};
@@ -789,6 +789,9 @@ fn from_basic_error(basic_error: &BasicError) -> JsValue {
789789
BasicError::InvalidDescriptionLengthError(e) => {
790790
generic_consensus_error!(InvalidDescriptionLengthError, e).into()
791791
}
792+
BasicError::NewTokensDestinationIdentityOptionRequiredError(e) => {
793+
generic_consensus_error!(NewTokensDestinationIdentityOptionRequiredError, e).into()
794+
}
792795
}
793796
}
794797

0 commit comments

Comments
 (0)