Skip to main content

dpp/errors/consensus/basic/
basic_error.rs

1use crate::errors::ProtocolError;
2use bincode::{Decode, DecodeUntrusted, Encode};
3use platform_serialization_derive::{
4    PlatformDeserializeTrusted, PlatformDeserializeUntrusted, PlatformSerialize,
5};
6use thiserror::Error;
7
8use crate::consensus::basic::contract_group::{
9    ContractGroupMemberNotInContractError, ContractGroupMembershipsOverLimitError,
10    DuplicateContractGroupMembershipError, InvalidContractGroupAdminsError,
11    InvalidContractGroupDescriptionLengthError, InvalidContractGroupNameLengthError,
12    RedundantContractGroupMembershipError,
13};
14use crate::consensus::basic::contract_moderation::{
15    ContractModerationReasonTooLongError, ContractModerationSelfTargetError,
16    DocumentActionFeesWithoutModerationError, InvalidContractModerationConfigError,
17    InvalidContractModerationDocumentFieldsError, InvalidContractModerationReasonDocumentsError,
18};
19use crate::consensus::basic::data_contract::data_contract_max_depth_exceed_error::DataContractMaxDepthExceedError;
20use crate::consensus::basic::data_contract::{
21    ContestedUniqueIndexOnMutableDocumentTypeError, ContestedUniqueIndexWithUniqueIndexError,
22    DataContractHaveNewUniqueIndexError, DataContractImmutablePropertiesUpdateError,
23    DataContractInvalidIndexDefinitionUpdateError, DataContractInvalidRequiredFieldsUpdateError,
24    DataContractTokenConfigurationUpdateError, DataContractUniqueIndicesChangedError,
25    DecimalsOverLimitError, DuplicateIndexError, DuplicateIndexNameError,
26    GroupExceedsMaxMembersError, GroupHasTooFewMembersError, GroupMemberHasPowerOfZeroError,
27    GroupMemberHasPowerOverLimitError, GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError,
28    GroupPositionDoesNotExistError, GroupRequiredPowerIsInvalidError,
29    GroupTotalPowerLessThanRequiredError, IncompatibleDataContractSchemaError,
30    IncompatibleDocumentTypeSchemaError, IncompatibleRe2PatternError, InvalidCompoundIndexError,
31    InvalidDataContractIdError, InvalidDataContractVersionError, InvalidDocumentTypeNameError,
32    InvalidDocumentTypeRequiredSecurityLevelError, InvalidIndexPropertyTypeError,
33    InvalidIndexedPropertyConstraintError, InvalidKeywordCharacterError,
34    InvalidTokenBaseSupplyError, InvalidTokenDistributionFunctionDivideByZeroError,
35    InvalidTokenDistributionFunctionIncoherenceError,
36    InvalidTokenDistributionFunctionInvalidParameterError,
37    InvalidTokenDistributionFunctionInvalidParameterTupleError, InvalidTokenLanguageCodeError,
38    InvalidTokenNameCharacterError, InvalidTokenNameLengthError, MainGroupIsNotDefinedError,
39    NewTokensDestinationIdentityOptionRequiredError, NonContiguousContractGroupPositionsError,
40    NonContiguousContractTokenPositionsError, PreProgrammedDistributionAmountOverLimitError,
41    RedundantDocumentPaidForByTokenWithContractId, SystemPropertyIndexAlreadyPresentError,
42    TokenShieldedPoolIncompatibleRulesError, UndefinedIndexPropertyError,
43    UniqueIndicesLimitReachedError, UnknownDocumentCreationRestrictionModeError,
44    UnknownGasFeesPaidByError, UnknownSecurityLevelError, UnknownStorageKeyRequirementsError,
45    UnknownTradeModeError, UnknownTransferableTypeError,
46};
47use crate::consensus::basic::data_contract::{
48    InvalidJsonSchemaRefError, TokenPaymentByBurningOnlyAllowedOnInternalTokenError,
49    UnknownDocumentActionTokenEffectError,
50};
51use crate::consensus::basic::decode::{
52    ProtocolVersionParsingError, SerializedObjectParsingError, VersionError,
53};
54use crate::consensus::basic::document::{
55    ContestedDocumentsTemporarilyNotAllowedError, DataContractNotPresentError,
56    DocumentCreationNotAllowedError, DocumentFieldMaxSizeExceededError,
57    DocumentPropertyConstraintViolatedError, DocumentPropertyMaxBytesExceededError,
58    DocumentPropertyNotDistinctError, DocumentPropertyNotGeneratedError,
59    DocumentReferencePreimageInvalidError, DocumentTransitionsAreAbsentError,
60    DuplicateDocumentTransitionsWithIdsError, DuplicateDocumentTransitionsWithIndicesError,
61    InconsistentCompoundIndexDataError, InvalidDocumentTransitionActionError,
62    InvalidDocumentTransitionIdError, InvalidDocumentTypeError, InvalidEncryptedPropertyShapeError,
63    MaxDocumentsTransitionsExceededError, MissingDataContractIdBasicError,
64    MissingDocumentTransitionActionError, MissingDocumentTransitionTypeError,
65    MissingDocumentTypeError, MissingPositionsInDocumentTypePropertiesError, NonceOutOfBoundsError,
66};
67use crate::consensus::basic::identity::ContractGroupBoundKeyNotAllowedInShieldedIdentityCreationError;
68use crate::consensus::basic::identity::IdentityKeyLimitsUpdateEmptyError;
69use crate::consensus::basic::identity::IdentityPublicKeyLimitsNotAllowedInShieldedIdentityCreationError;
70use crate::consensus::basic::identity::{
71    DataContractBoundsNotPresentError, DisablingKeyIdAlsoBeingAddedInSameTransitionError,
72    DuplicatedIdentityPublicKeyBasicError, DuplicatedIdentityPublicKeyIdBasicError,
73    IdentityAssetLockProofLockedTransactionMismatchError,
74    IdentityAssetLockStateTransitionReplayError, IdentityAssetLockTransactionIsNotFoundError,
75    IdentityAssetLockTransactionOutPointAlreadyConsumedError,
76    IdentityAssetLockTransactionOutPointNotEnoughBalanceError,
77    IdentityAssetLockTransactionOutputNotFoundError,
78    IdentityAssetLockTransactionTooManyInputsError, IdentityCreditTransferToSelfError,
79    IdentityPublicKeyLimitsNotAllowedError, InvalidAssetLockProofCoreChainHeightError,
80    InvalidAssetLockProofTransactionHeightError, InvalidAssetLockTransactionOutputReturnSizeError,
81    InvalidCreditWithdrawalTransitionCoreFeeError,
82    InvalidCreditWithdrawalTransitionOutputScriptError,
83    InvalidIdentityAssetLockProofChainLockValidationError,
84    InvalidIdentityAssetLockTransactionError, InvalidIdentityAssetLockTransactionOutputError,
85    InvalidIdentityCreditTransferAmountError, InvalidIdentityCreditWithdrawalTransitionAmountError,
86    InvalidIdentityKeySignatureError, InvalidIdentityPublicKeyBudgetError,
87    InvalidIdentityPublicKeyDataError, InvalidIdentityPublicKeySecurityLevelError,
88    InvalidIdentityUpdateTransitionDisableKeysError, InvalidIdentityUpdateTransitionEmptyError,
89    InvalidInstantAssetLockProofError, InvalidInstantAssetLockProofSignatureError,
90    InvalidKeyPurposeForContractBoundsError, MissingMasterPublicKeyError,
91    NotImplementedCreditWithdrawalTransitionPoolingError, TooManyMasterPublicKeyError,
92    WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError,
93};
94use crate::consensus::basic::invalid_identifier_error::InvalidIdentifierError;
95use crate::consensus::basic::moderation_charter::{
96    ModerationCharterMalformedFieldError, ModerationCharterRewardSplitNotOneHundredError,
97};
98use crate::consensus::basic::state_transition::{
99    FeeStrategyDuplicateError, FeeStrategyEmptyError, FeeStrategyIndexOutOfBoundsError,
100    FeeStrategyTooManyStepsError, InputBelowMinimumError, InputOutputBalanceMismatchError,
101    InputWitnessCountMismatchError, InputsNotLessThanOutputsError, InsufficientFundingAmountError,
102    InvalidRemainderOutputCountError, InvalidStateTransitionTypeError,
103    MissingStateTransitionTypeError, OutputAddressAlsoInputError, OutputBelowMinimumError,
104    OutputsNotGreaterThanInputsError, ShieldedEmptyProofError,
105    ShieldedEncryptedNoteSizeMismatchError, ShieldedImplicitFeeCapExceededError,
106    ShieldedInvalidDenominationError, ShieldedInvalidValueBalanceError, ShieldedNoActionsError,
107    ShieldedTooManyActionsError, ShieldedZeroAnchorError, StateTransitionMaxSizeExceededError,
108    StateTransitionNotActiveError, TransitionNoInputsError, TransitionNoOutputsError,
109    TransitionOverMaxInputsError, TransitionOverMaxOutputsError, WithdrawalBalanceMismatchError,
110    WithdrawalBelowMinAmountError,
111};
112use crate::consensus::basic::{
113    IncompatibleProtocolVersionError, UnsupportedFeatureError, UnsupportedProtocolVersionError,
114};
115use crate::consensus::ConsensusError;
116
117use super::data_contract::{
118    DuplicateKeywordsError, InvalidDescriptionLengthError, InvalidKeywordLengthError,
119    TooManyKeywordsError,
120};
121use crate::consensus::basic::group::GroupActionNotAllowedOnTransitionError;
122use crate::consensus::basic::overflow_error::OverflowError;
123use crate::consensus::basic::token::{
124    ChoosingTokenMintRecipientNotAllowedError, ContractHasNoTokensError,
125    DestinationIdentityForTokenMintingNotSetError, InvalidActionIdError, InvalidTokenAmountError,
126    InvalidTokenConfigUpdateNoChangeError, InvalidTokenDistributionBlockIntervalTooShortError,
127    InvalidTokenDistributionEpochIntervalTooShortError,
128    InvalidTokenDistributionTimeIntervalNotMinuteAlignedError,
129    InvalidTokenDistributionTimeIntervalTooShortError, InvalidTokenIdError,
130    InvalidTokenNoteTooBigError, InvalidTokenOncePerIdentityDistributionAmountError,
131    InvalidTokenPositionError, MissingDefaultLocalizationError,
132    TokenNoteOnlyAllowedWhenProposerError, TokenPricingScheduleEmptyError,
133    TokenTransferToOurselfError,
134};
135use crate::consensus::basic::unsupported_version_error::UnsupportedVersionError;
136use crate::consensus::basic::value_error::ValueError;
137use crate::consensus::basic::{
138    json_schema_compilation_error::JsonSchemaCompilationError, json_schema_error::JsonSchemaError,
139};
140use crate::consensus::state::identity::master_public_key_update_error::MasterPublicKeyUpdateError;
141use crate::data_contract::errors::DataContractError;
142
143#[allow(clippy::large_enum_variant)]
144#[derive(
145    Error,
146    Debug,
147    PlatformSerialize,
148    PlatformDeserializeTrusted,
149    PlatformDeserializeUntrusted,
150    Encode,
151    Decode,
152    PartialEq,
153    Clone,
154    DecodeUntrusted,
155)]
156pub enum BasicError {
157    /*
158
159    DO NOT CHANGE ORDER OF VARIANTS WITHOUT INTRODUCING OF NEW VERSION
160
161    */
162    // Decoding
163    #[error(transparent)]
164    ProtocolVersionParsingError(ProtocolVersionParsingError),
165
166    #[error(transparent)]
167    VersionError(VersionError),
168
169    #[error(transparent)]
170    ContractError(DataContractError),
171
172    #[error(transparent)]
173    UnknownSecurityLevelError(UnknownSecurityLevelError),
174
175    #[error(transparent)]
176    UnknownStorageKeyRequirementsError(UnknownStorageKeyRequirementsError),
177
178    #[error(transparent)]
179    UnknownTransferableTypeError(UnknownTransferableTypeError),
180
181    #[error(transparent)]
182    UnknownTradeModeError(UnknownTradeModeError),
183
184    #[error(transparent)]
185    UnknownDocumentCreationRestrictionModeError(UnknownDocumentCreationRestrictionModeError),
186
187    #[error(transparent)]
188    SerializedObjectParsingError(SerializedObjectParsingError),
189
190    #[error(transparent)]
191    UnsupportedProtocolVersionError(UnsupportedProtocolVersionError),
192
193    #[error(transparent)]
194    UnsupportedVersionError(UnsupportedVersionError),
195
196    #[error(transparent)]
197    IncompatibleProtocolVersionError(IncompatibleProtocolVersionError),
198
199    // Structure error
200    #[error(transparent)]
201    JsonSchemaCompilationError(JsonSchemaCompilationError),
202
203    #[error(transparent)]
204    JsonSchemaError(JsonSchemaError),
205
206    #[error(transparent)]
207    InvalidIdentifierError(InvalidIdentifierError),
208
209    #[error(transparent)]
210    ValueError(ValueError),
211
212    // DataContract
213    #[error(transparent)]
214    DataContractMaxDepthExceedError(DataContractMaxDepthExceedError),
215
216    #[error(transparent)]
217    DuplicateIndexError(DuplicateIndexError),
218
219    #[error(transparent)]
220    IncompatibleRe2PatternError(IncompatibleRe2PatternError),
221
222    #[error(transparent)]
223    InvalidCompoundIndexError(InvalidCompoundIndexError),
224
225    #[error(transparent)]
226    InvalidDataContractIdError(InvalidDataContractIdError),
227
228    #[error(transparent)]
229    InvalidIndexedPropertyConstraintError(InvalidIndexedPropertyConstraintError),
230
231    #[error(transparent)]
232    InvalidIndexPropertyTypeError(InvalidIndexPropertyTypeError),
233
234    #[error(transparent)]
235    InvalidJsonSchemaRefError(InvalidJsonSchemaRefError),
236
237    #[error(transparent)]
238    SystemPropertyIndexAlreadyPresentError(SystemPropertyIndexAlreadyPresentError),
239
240    #[error(transparent)]
241    UndefinedIndexPropertyError(UndefinedIndexPropertyError),
242
243    #[error(transparent)]
244    UniqueIndicesLimitReachedError(UniqueIndicesLimitReachedError),
245
246    #[error(transparent)]
247    DuplicateIndexNameError(DuplicateIndexNameError),
248
249    #[error(transparent)]
250    InvalidDataContractVersionError(InvalidDataContractVersionError),
251
252    #[error(transparent)]
253    IncompatibleDataContractSchemaError(IncompatibleDataContractSchemaError),
254
255    #[error(transparent)]
256    DataContractImmutablePropertiesUpdateError(DataContractImmutablePropertiesUpdateError),
257
258    #[error(transparent)]
259    DataContractUniqueIndicesChangedError(DataContractUniqueIndicesChangedError),
260
261    #[error(transparent)]
262    DataContractInvalidIndexDefinitionUpdateError(DataContractInvalidIndexDefinitionUpdateError),
263
264    #[error(transparent)]
265    DataContractHaveNewUniqueIndexError(DataContractHaveNewUniqueIndexError),
266
267    // Document
268    #[error(transparent)]
269    DataContractNotPresentError(DataContractNotPresentError),
270
271    #[error(transparent)]
272    DocumentCreationNotAllowedError(DocumentCreationNotAllowedError),
273
274    #[error(transparent)]
275    DataContractBoundsNotPresentError(DataContractBoundsNotPresentError),
276
277    #[error(transparent)]
278    DuplicateDocumentTransitionsWithIdsError(DuplicateDocumentTransitionsWithIdsError),
279
280    #[error(transparent)]
281    DuplicateDocumentTransitionsWithIndicesError(DuplicateDocumentTransitionsWithIndicesError),
282
283    #[error(transparent)]
284    NonceOutOfBoundsError(NonceOutOfBoundsError),
285
286    #[error(transparent)]
287    InconsistentCompoundIndexDataError(InconsistentCompoundIndexDataError),
288
289    #[error(transparent)]
290    InvalidDocumentTransitionActionError(InvalidDocumentTransitionActionError),
291
292    #[error(transparent)]
293    InvalidDocumentTransitionIdError(InvalidDocumentTransitionIdError),
294
295    #[error(transparent)]
296    InvalidDocumentTypeError(InvalidDocumentTypeError),
297
298    #[error(transparent)]
299    MissingPositionsInDocumentTypePropertiesError(MissingPositionsInDocumentTypePropertiesError),
300
301    #[error(transparent)]
302    MissingDataContractIdBasicError(MissingDataContractIdBasicError),
303
304    #[error(transparent)]
305    MissingDocumentTransitionActionError(MissingDocumentTransitionActionError),
306
307    #[error(transparent)]
308    MissingDocumentTransitionTypeError(MissingDocumentTransitionTypeError),
309
310    #[error(transparent)]
311    MissingDocumentTypeError(MissingDocumentTypeError),
312
313    #[error(transparent)]
314    MaxDocumentsTransitionsExceededError(MaxDocumentsTransitionsExceededError),
315
316    // Identity
317    #[error(transparent)]
318    DuplicatedIdentityPublicKeyBasicError(DuplicatedIdentityPublicKeyBasicError),
319
320    #[error(transparent)]
321    DuplicatedIdentityPublicKeyIdBasicError(DuplicatedIdentityPublicKeyIdBasicError),
322
323    #[error(transparent)]
324    DisablingKeyIdAlsoBeingAddedInSameTransitionError(
325        DisablingKeyIdAlsoBeingAddedInSameTransitionError,
326    ),
327
328    #[error(transparent)]
329    IdentityAssetLockProofLockedTransactionMismatchError(
330        IdentityAssetLockProofLockedTransactionMismatchError,
331    ),
332
333    #[error(transparent)]
334    IdentityAssetLockTransactionIsNotFoundError(IdentityAssetLockTransactionIsNotFoundError),
335
336    #[error(transparent)]
337    IdentityAssetLockTransactionOutPointAlreadyConsumedError(
338        IdentityAssetLockTransactionOutPointAlreadyConsumedError,
339    ),
340
341    #[error(transparent)]
342    IdentityAssetLockTransactionOutPointNotEnoughBalanceError(
343        IdentityAssetLockTransactionOutPointNotEnoughBalanceError,
344    ),
345
346    #[error(transparent)]
347    IdentityAssetLockStateTransitionReplayError(IdentityAssetLockStateTransitionReplayError),
348
349    #[error(transparent)]
350    IdentityAssetLockTransactionOutputNotFoundError(
351        IdentityAssetLockTransactionOutputNotFoundError,
352    ),
353
354    #[error(transparent)]
355    InvalidAssetLockProofCoreChainHeightError(InvalidAssetLockProofCoreChainHeightError),
356
357    #[error(transparent)]
358    InvalidIdentityAssetLockProofChainLockValidationError(
359        InvalidIdentityAssetLockProofChainLockValidationError,
360    ),
361
362    #[error(transparent)]
363    InvalidAssetLockProofTransactionHeightError(InvalidAssetLockProofTransactionHeightError),
364
365    #[error(transparent)]
366    InvalidAssetLockTransactionOutputReturnSizeError(
367        InvalidAssetLockTransactionOutputReturnSizeError,
368    ),
369
370    #[error(transparent)]
371    InvalidIdentityAssetLockTransactionError(InvalidIdentityAssetLockTransactionError),
372
373    #[error(transparent)]
374    InvalidIdentityAssetLockTransactionOutputError(InvalidIdentityAssetLockTransactionOutputError),
375
376    #[error(transparent)]
377    InvalidIdentityPublicKeyDataError(InvalidIdentityPublicKeyDataError),
378
379    #[error(transparent)]
380    InvalidInstantAssetLockProofError(InvalidInstantAssetLockProofError),
381
382    #[error(transparent)]
383    InvalidInstantAssetLockProofSignatureError(InvalidInstantAssetLockProofSignatureError),
384
385    #[error(transparent)]
386    MissingMasterPublicKeyError(MissingMasterPublicKeyError),
387
388    #[error(transparent)]
389    TooManyMasterPublicKeyError(TooManyMasterPublicKeyError),
390
391    #[error(transparent)]
392    MasterPublicKeyUpdateError(MasterPublicKeyUpdateError),
393
394    #[error(transparent)]
395    InvalidDocumentTypeRequiredSecurityLevelError(InvalidDocumentTypeRequiredSecurityLevelError),
396
397    #[error(transparent)]
398    InvalidIdentityPublicKeySecurityLevelError(InvalidIdentityPublicKeySecurityLevelError),
399
400    #[error(transparent)]
401    InvalidIdentityKeySignatureError(InvalidIdentityKeySignatureError),
402
403    #[error(transparent)]
404    InvalidIdentityCreditTransferAmountError(InvalidIdentityCreditTransferAmountError),
405
406    #[error(transparent)]
407    InvalidCreditWithdrawalTransitionOutputScriptError(
408        InvalidCreditWithdrawalTransitionOutputScriptError,
409    ),
410
411    #[error(transparent)]
412    WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError(
413        WithdrawalOutputScriptNotAllowedWhenSigningWithOwnerKeyError,
414    ),
415
416    #[error(transparent)]
417    InvalidCreditWithdrawalTransitionCoreFeeError(InvalidCreditWithdrawalTransitionCoreFeeError),
418
419    #[error(transparent)]
420    InvalidIdentityCreditWithdrawalTransitionAmountError(
421        InvalidIdentityCreditWithdrawalTransitionAmountError,
422    ),
423
424    #[error(transparent)]
425    InvalidIdentityUpdateTransitionEmptyError(InvalidIdentityUpdateTransitionEmptyError),
426
427    #[error(transparent)]
428    InvalidIdentityUpdateTransitionDisableKeysError(
429        InvalidIdentityUpdateTransitionDisableKeysError,
430    ),
431
432    #[error(transparent)]
433    NotImplementedCreditWithdrawalTransitionPoolingError(
434        NotImplementedCreditWithdrawalTransitionPoolingError,
435    ),
436
437    // State Transition
438    #[error(transparent)]
439    InvalidStateTransitionTypeError(InvalidStateTransitionTypeError),
440
441    #[error(transparent)]
442    MissingStateTransitionTypeError(MissingStateTransitionTypeError),
443
444    #[error(transparent)]
445    DocumentFieldMaxSizeExceededError(DocumentFieldMaxSizeExceededError),
446
447    #[error(transparent)]
448    StateTransitionMaxSizeExceededError(StateTransitionMaxSizeExceededError),
449
450    #[error(transparent)]
451    DocumentTransitionsAreAbsentError(DocumentTransitionsAreAbsentError),
452
453    #[error(transparent)]
454    IdentityCreditTransferToSelfError(IdentityCreditTransferToSelfError),
455
456    #[error(transparent)]
457    InvalidDocumentTypeNameError(InvalidDocumentTypeNameError),
458
459    #[error(transparent)]
460    IncompatibleDocumentTypeSchemaError(IncompatibleDocumentTypeSchemaError),
461
462    #[error(transparent)]
463    ContestedUniqueIndexOnMutableDocumentTypeError(ContestedUniqueIndexOnMutableDocumentTypeError),
464
465    #[error(transparent)]
466    ContestedUniqueIndexWithUniqueIndexError(ContestedUniqueIndexWithUniqueIndexError),
467
468    #[error(transparent)]
469    OverflowError(OverflowError),
470
471    #[error(transparent)]
472    UnsupportedFeatureError(UnsupportedFeatureError),
473
474    #[error(transparent)]
475    ContestedDocumentsTemporarilyNotAllowedError(ContestedDocumentsTemporarilyNotAllowedError),
476
477    #[error(transparent)]
478    DataContractTokenConfigurationUpdateError(DataContractTokenConfigurationUpdateError),
479
480    #[error(transparent)]
481    NonContiguousContractTokenPositionsError(NonContiguousContractTokenPositionsError),
482
483    #[error(transparent)]
484    NonContiguousContractGroupPositionsError(NonContiguousContractGroupPositionsError),
485
486    #[error(transparent)]
487    InvalidTokenBaseSupplyError(InvalidTokenBaseSupplyError),
488
489    #[error(transparent)]
490    InvalidTokenIdError(InvalidTokenIdError),
491
492    #[error(transparent)]
493    InvalidTokenAmountError(InvalidTokenAmountError),
494
495    #[error(transparent)]
496    InvalidTokenPositionError(InvalidTokenPositionError),
497
498    #[error(transparent)]
499    InvalidTokenConfigUpdateNoChangeError(InvalidTokenConfigUpdateNoChangeError),
500
501    #[error(transparent)]
502    InvalidTokenDistributionFunctionDivideByZeroError(
503        InvalidTokenDistributionFunctionDivideByZeroError,
504    ),
505
506    #[error(transparent)]
507    InvalidTokenDistributionFunctionInvalidParameterError(
508        InvalidTokenDistributionFunctionInvalidParameterError,
509    ),
510
511    #[error(transparent)]
512    InvalidTokenDistributionFunctionInvalidParameterTupleError(
513        InvalidTokenDistributionFunctionInvalidParameterTupleError,
514    ),
515
516    #[error(transparent)]
517    InvalidTokenDistributionFunctionIncoherenceError(
518        InvalidTokenDistributionFunctionIncoherenceError,
519    ),
520
521    #[error(transparent)]
522    TokenTransferToOurselfError(TokenTransferToOurselfError),
523
524    #[error(transparent)]
525    InvalidTokenNoteTooBigError(InvalidTokenNoteTooBigError),
526
527    #[error(transparent)]
528    ContractHasNoTokensError(ContractHasNoTokensError),
529
530    #[error(transparent)]
531    GroupPositionDoesNotExistError(GroupPositionDoesNotExistError),
532
533    #[error(transparent)]
534    InvalidActionIdError(InvalidActionIdError),
535
536    #[error(transparent)]
537    DestinationIdentityForTokenMintingNotSetError(DestinationIdentityForTokenMintingNotSetError),
538
539    #[error(transparent)]
540    ChoosingTokenMintRecipientNotAllowedError(ChoosingTokenMintRecipientNotAllowedError),
541
542    #[error(transparent)]
543    GroupActionNotAllowedOnTransitionError(GroupActionNotAllowedOnTransitionError),
544
545    #[error(transparent)]
546    GroupExceedsMaxMembersError(GroupExceedsMaxMembersError),
547
548    #[error(transparent)]
549    GroupMemberHasPowerOfZeroError(GroupMemberHasPowerOfZeroError),
550
551    #[error(transparent)]
552    GroupMemberHasPowerOverLimitError(GroupMemberHasPowerOverLimitError),
553
554    #[error(transparent)]
555    GroupTotalPowerLessThanRequiredError(GroupTotalPowerLessThanRequiredError),
556
557    #[error(transparent)]
558    GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError(
559        GroupNonUnilateralMemberPowerHasLessThanRequiredPowerError,
560    ),
561
562    #[error(transparent)]
563    MissingDefaultLocalizationError(MissingDefaultLocalizationError),
564
565    #[error(transparent)]
566    UnknownGasFeesPaidByError(UnknownGasFeesPaidByError),
567
568    #[error(transparent)]
569    UnknownDocumentActionTokenEffectError(UnknownDocumentActionTokenEffectError),
570
571    #[error(transparent)]
572    TokenPaymentByBurningOnlyAllowedOnInternalTokenError(
573        TokenPaymentByBurningOnlyAllowedOnInternalTokenError,
574    ),
575
576    #[error(transparent)]
577    TooManyKeywordsError(TooManyKeywordsError),
578
579    #[error(transparent)]
580    DuplicateKeywordsError(DuplicateKeywordsError),
581
582    #[error(transparent)]
583    InvalidKeywordLengthError(InvalidKeywordLengthError),
584
585    #[error(transparent)]
586    InvalidDescriptionLengthError(InvalidDescriptionLengthError),
587
588    #[error(transparent)]
589    NewTokensDestinationIdentityOptionRequiredError(
590        NewTokensDestinationIdentityOptionRequiredError,
591    ),
592
593    #[error(transparent)]
594    InvalidKeywordCharacterError(InvalidKeywordCharacterError),
595
596    #[error(transparent)]
597    InvalidTokenNameCharacterError(InvalidTokenNameCharacterError),
598
599    #[error(transparent)]
600    DecimalsOverLimitError(DecimalsOverLimitError),
601
602    #[error(transparent)]
603    InvalidTokenNameLengthError(InvalidTokenNameLengthError),
604
605    #[error(transparent)]
606    InvalidTokenLanguageCodeError(InvalidTokenLanguageCodeError),
607
608    #[error(transparent)]
609    MainGroupIsNotDefinedError(MainGroupIsNotDefinedError),
610
611    #[error(transparent)]
612    GroupRequiredPowerIsInvalidError(GroupRequiredPowerIsInvalidError),
613
614    #[error(transparent)]
615    TokenNoteOnlyAllowedWhenProposerError(TokenNoteOnlyAllowedWhenProposerError),
616
617    #[error(transparent)]
618    InvalidTokenDistributionBlockIntervalTooShortError(
619        InvalidTokenDistributionBlockIntervalTooShortError,
620    ),
621
622    #[error(transparent)]
623    InvalidTokenDistributionTimeIntervalTooShortError(
624        InvalidTokenDistributionTimeIntervalTooShortError,
625    ),
626
627    #[error(transparent)]
628    InvalidTokenDistributionTimeIntervalNotMinuteAlignedError(
629        InvalidTokenDistributionTimeIntervalNotMinuteAlignedError,
630    ),
631
632    #[error(transparent)]
633    RedundantDocumentPaidForByTokenWithContractId(RedundantDocumentPaidForByTokenWithContractId),
634
635    #[error(transparent)]
636    GroupHasTooFewMembersError(GroupHasTooFewMembersError),
637
638    #[error(transparent)]
639    InvalidKeyPurposeForContractBoundsError(InvalidKeyPurposeForContractBoundsError),
640
641    #[error(transparent)]
642    StateTransitionNotActiveError(StateTransitionNotActiveError),
643
644    #[error(transparent)]
645    TransitionOverMaxInputsError(TransitionOverMaxInputsError),
646
647    #[error(transparent)]
648    TransitionOverMaxOutputsError(TransitionOverMaxOutputsError),
649
650    #[error(transparent)]
651    InputWitnessCountMismatchError(InputWitnessCountMismatchError),
652
653    #[error(transparent)]
654    TransitionNoInputsError(TransitionNoInputsError),
655
656    #[error(transparent)]
657    TransitionNoOutputsError(TransitionNoOutputsError),
658
659    #[error(transparent)]
660    InvalidRemainderOutputCountError(InvalidRemainderOutputCountError),
661
662    #[error(transparent)]
663    FeeStrategyEmptyError(FeeStrategyEmptyError),
664
665    #[error(transparent)]
666    FeeStrategyDuplicateError(FeeStrategyDuplicateError),
667
668    #[error(transparent)]
669    FeeStrategyIndexOutOfBoundsError(FeeStrategyIndexOutOfBoundsError),
670
671    #[error(transparent)]
672    FeeStrategyTooManyStepsError(FeeStrategyTooManyStepsError),
673
674    #[error(transparent)]
675    InputBelowMinimumError(InputBelowMinimumError),
676
677    #[error(transparent)]
678    OutputBelowMinimumError(OutputBelowMinimumError),
679
680    #[error(transparent)]
681    InputOutputBalanceMismatchError(InputOutputBalanceMismatchError),
682
683    #[error(transparent)]
684    OutputsNotGreaterThanInputsError(OutputsNotGreaterThanInputsError),
685
686    #[error(transparent)]
687    WithdrawalBalanceMismatchError(WithdrawalBalanceMismatchError),
688
689    #[error(transparent)]
690    WithdrawalBelowMinAmountError(WithdrawalBelowMinAmountError),
691
692    #[error(transparent)]
693    InsufficientFundingAmountError(InsufficientFundingAmountError),
694
695    #[error(transparent)]
696    InputsNotLessThanOutputsError(InputsNotLessThanOutputsError),
697
698    #[error(transparent)]
699    OutputAddressAlsoInputError(OutputAddressAlsoInputError),
700
701    #[error(transparent)]
702    ShieldedNoActionsError(ShieldedNoActionsError),
703
704    #[error(transparent)]
705    ShieldedTooManyActionsError(ShieldedTooManyActionsError),
706
707    #[error(transparent)]
708    ShieldedEmptyProofError(ShieldedEmptyProofError),
709
710    #[error(transparent)]
711    ShieldedZeroAnchorError(ShieldedZeroAnchorError),
712
713    #[error(transparent)]
714    ShieldedInvalidValueBalanceError(ShieldedInvalidValueBalanceError),
715
716    #[error(transparent)]
717    ShieldedEncryptedNoteSizeMismatchError(ShieldedEncryptedNoteSizeMismatchError),
718
719    #[error(transparent)]
720    IdentityAssetLockTransactionTooManyInputsError(IdentityAssetLockTransactionTooManyInputsError),
721
722    // NOTE: `BasicError` is bincode-encoded positionally (no explicit discriminants), so new
723    // variants MUST be appended at the tail — inserting mid-enum would shift the wire discriminants
724    // of every following variant and mis-decode previously-encoded errors. The error-code integer
725    // (codes.rs) is independent of variant order.
726    #[error(transparent)]
727    ShieldedImplicitFeeCapExceededError(ShieldedImplicitFeeCapExceededError),
728
729    #[error(transparent)]
730    ShieldedInvalidDenominationError(ShieldedInvalidDenominationError),
731
732    #[error(transparent)]
733    TokenPricingScheduleEmptyError(TokenPricingScheduleEmptyError),
734
735    #[error(transparent)]
736    DataContractInvalidRequiredFieldsUpdateError(DataContractInvalidRequiredFieldsUpdateError),
737
738    // Contract groups (protocol version 14).
739    #[error(transparent)]
740    ContractGroupMembershipsOverLimitError(ContractGroupMembershipsOverLimitError),
741
742    #[error(transparent)]
743    DuplicateContractGroupMembershipError(DuplicateContractGroupMembershipError),
744
745    #[error(transparent)]
746    RedundantContractGroupMembershipError(RedundantContractGroupMembershipError),
747
748    #[error(transparent)]
749    ContractGroupMemberNotInContractError(ContractGroupMemberNotInContractError),
750
751    #[error(transparent)]
752    InvalidContractGroupAdminsError(InvalidContractGroupAdminsError),
753
754    #[error(transparent)]
755    InvalidContractGroupNameLengthError(InvalidContractGroupNameLengthError),
756
757    #[error(transparent)]
758    InvalidContractGroupDescriptionLengthError(InvalidContractGroupDescriptionLengthError),
759
760    // Contract group bounds on identity keys (protocol version 14).
761    #[error(transparent)]
762    ContractGroupBoundKeyNotAllowedInShieldedIdentityCreationError(
763        ContractGroupBoundKeyNotAllowedInShieldedIdentityCreationError,
764    ),
765
766    // Authentication key limits (protocol version 14).
767    #[error(transparent)]
768    IdentityPublicKeyLimitsNotAllowedError(IdentityPublicKeyLimitsNotAllowedError),
769
770    #[error(transparent)]
771    InvalidIdentityPublicKeyBudgetError(InvalidIdentityPublicKeyBudgetError),
772
773    #[error(transparent)]
774    IdentityPublicKeyLimitsNotAllowedInShieldedIdentityCreationError(
775        IdentityPublicKeyLimitsNotAllowedInShieldedIdentityCreationError,
776    ),
777
778    // Identity key limits update (protocol version 14).
779    #[error(transparent)]
780    IdentityKeyLimitsUpdateEmptyError(IdentityKeyLimitsUpdateEmptyError),
781
782    // Once-per-identity token distribution (protocol version 14).
783    #[error(transparent)]
784    InvalidTokenOncePerIdentityDistributionAmountError(
785        InvalidTokenOncePerIdentityDistributionAmountError,
786    ),
787
788    // Pre-programmed distribution amounts (protocol version 14).
789    #[error(transparent)]
790    PreProgrammedDistributionAmountOverLimitError(PreProgrammedDistributionAmountOverLimitError),
791
792    // Contract moderation (protocol version 14).
793    #[error(transparent)]
794    InvalidContractModerationConfigError(InvalidContractModerationConfigError),
795
796    #[error(transparent)]
797    ContractModerationSelfTargetError(ContractModerationSelfTargetError),
798
799    #[error(transparent)]
800    ContractModerationReasonTooLongError(ContractModerationReasonTooLongError),
801
802    // Document action fees (protocol version 14).
803    #[error(transparent)]
804    DocumentActionFeesWithoutModerationError(DocumentActionFeesWithoutModerationError),
805
806    // Documents cited by a contract moderation reason (protocol version 14).
807    #[error(transparent)]
808    InvalidContractModerationReasonDocumentsError(InvalidContractModerationReasonDocumentsError),
809
810    #[error(transparent)]
811    DocumentPropertyNotDistinctError(DocumentPropertyNotDistinctError),
812
813    // The shape of an `encryptedFor` property's ciphertext (protocol version 14).
814    #[error(transparent)]
815    InvalidEncryptedPropertyShapeError(InvalidEncryptedPropertyShapeError),
816
817    // Moderation charters (protocol version 14).
818    #[error(transparent)]
819    ModerationCharterMalformedFieldError(ModerationCharterMalformedFieldError),
820
821    #[error(transparent)]
822    ModerationCharterRewardSplitNotOneHundredError(ModerationCharterRewardSplitNotOneHundredError),
823
824    // A string over the `maxBytes` its property declares (protocol version 14).
825    #[error(transparent)]
826    DocumentPropertyMaxBytesExceededError(DocumentPropertyMaxBytesExceededError),
827
828    // A document breaking a rule of its type's `propertyConstraints` (protocol version 14).
829    #[error(transparent)]
830    DocumentPropertyConstraintViolatedError(DocumentPropertyConstraintViolatedError),
831
832    // A perpetual distribution with a zero epoch interval (protocol version 14). Appended here:
833    // it was first inserted mid-enum, which shifted the discriminant of every variant shipped
834    // after it in 4.1.
835    #[error(transparent)]
836    InvalidTokenDistributionEpochIntervalTooShortError(
837        InvalidTokenDistributionEpochIntervalTooShortError,
838    ),
839
840    // A `generatedFrom` string property that is not what its function generates from its params
841    // (protocol version 14).
842    #[error(transparent)]
843    DocumentPropertyNotGeneratedError(DocumentPropertyNotGeneratedError),
844
845    // The fields a moderator's document change sets (protocol version 14).
846    #[error(transparent)]
847    InvalidContractModerationDocumentFieldsError(InvalidContractModerationDocumentFieldsError),
848
849    // A create that cannot assemble the preimage of a `refersTo` lookup key it reveals
850    // (protocol version 14).
851    #[error(transparent)]
852    DocumentReferencePreimageInvalidError(DocumentReferencePreimageInvalidError),
853
854    // A token opting into a shielded pool keeps no freeze rules (protocol version 14).
855    #[error(transparent)]
856    TokenShieldedPoolIncompatibleRulesError(TokenShieldedPoolIncompatibleRulesError),
857}
858
859impl From<BasicError> for ConsensusError {
860    fn from(error: BasicError) -> Self {
861        Self::BasicError(error)
862    }
863}
864
865#[cfg(test)]
866mod tests {
867    use super::*;
868    use crate::consensus::basic::document::PropertyConstraintViolation;
869    use platform_value::Identifier;
870
871    /// `BasicError` is bincode-encoded positionally, so a variant inserted anywhere but the tail
872    /// shifts the wire discriminant of every variant after it. These are the frozen
873    /// discriminants of the last variants: a new variant goes after them, and gets its own
874    /// line here.
875    fn discriminant_of(error: BasicError) -> u32 {
876        let bytes = bincode::encode_to_vec(error, bincode::config::standard())
877            .expect("expected to encode the basic error");
878        let (discriminant, _): (u32, usize) =
879            bincode::decode_from_slice(&bytes, bincode::config::standard())
880                .expect("expected to decode the discriminant");
881        discriminant
882    }
883
884    #[test]
885    fn basic_error_tail_discriminants_are_frozen() {
886        // Identity key limits update (protocol version 14).
887        assert_eq!(
888            discriminant_of(BasicError::IdentityKeyLimitsUpdateEmptyError(
889                IdentityKeyLimitsUpdateEmptyError::new(1)
890            )),
891            185
892        );
893        // Once-per-identity token distribution (protocol version 14).
894        assert_eq!(
895            discriminant_of(
896                BasicError::InvalidTokenOncePerIdentityDistributionAmountError(
897                    InvalidTokenOncePerIdentityDistributionAmountError::new(0, 1)
898                )
899            ),
900            186
901        );
902        // Pre-programmed distribution amounts (protocol version 14).
903        assert_eq!(
904            discriminant_of(BasicError::PreProgrammedDistributionAmountOverLimitError(
905                PreProgrammedDistributionAmountOverLimitError::new(0, 100)
906            )),
907            187
908        );
909        // Contract moderation (protocol version 14).
910        assert_eq!(
911            discriminant_of(BasicError::InvalidContractModerationConfigError(
912                InvalidContractModerationConfigError::new("reason".to_string())
913            )),
914            188
915        );
916        assert_eq!(
917            discriminant_of(BasicError::ContractModerationSelfTargetError(
918                ContractModerationSelfTargetError::new(Identifier::from([1; 32]))
919            )),
920            189
921        );
922        assert_eq!(
923            discriminant_of(BasicError::ContractModerationReasonTooLongError(
924                ContractModerationReasonTooLongError::new(1025, 1024)
925            )),
926            190
927        );
928        // Document action fees (protocol version 14).
929        assert_eq!(
930            discriminant_of(BasicError::DocumentActionFeesWithoutModerationError(
931                DocumentActionFeesWithoutModerationError::new("post".to_string())
932            )),
933            191
934        );
935        // Documents cited by a contract moderation reason (protocol version 14).
936        assert_eq!(
937            discriminant_of(BasicError::InvalidContractModerationReasonDocumentsError(
938                InvalidContractModerationReasonDocumentsError::new("x".to_string())
939            )),
940            192
941        );
942        // A `distinctFrom` identifier property equal to what it must differ from (protocol
943        // version 14).
944        assert_eq!(
945            discriminant_of(BasicError::DocumentPropertyNotDistinctError(
946                DocumentPropertyNotDistinctError::new(
947                    "post".to_string(),
948                    "delegateId".to_string(),
949                    "$ownerId".to_string(),
950                )
951            )),
952            193
953        );
954        // The shape of an `encryptedFor` property's ciphertext (protocol version 14).
955        assert_eq!(
956            discriminant_of(BasicError::InvalidEncryptedPropertyShapeError(
957                InvalidEncryptedPropertyShapeError::new(
958                    "encryptedMessage".to_string(),
959                    "ecdh-secp256k1-aes256-cbc".to_string(),
960                    47,
961                    32,
962                    16
963                )
964            )),
965            194
966        );
967        // Moderation charters (protocol version 14).
968        assert_eq!(
969            discriminant_of(BasicError::ModerationCharterMalformedFieldError(
970                ModerationCharterMalformedFieldError::new(
971                    "rewardSplit".to_string(),
972                    "reason".to_string()
973                )
974            )),
975            195
976        );
977        assert_eq!(
978            discriminant_of(BasicError::ModerationCharterRewardSplitNotOneHundredError(
979                ModerationCharterRewardSplitNotOneHundredError::new(10, 40, 40)
980            )),
981            196
982        );
983        // A string over its property's `maxBytes` (protocol version 14).
984        assert_eq!(
985            discriminant_of(BasicError::DocumentPropertyMaxBytesExceededError(
986                DocumentPropertyMaxBytesExceededError::new("description".to_string(), 4097, 4096)
987            )),
988            197
989        );
990        // A document breaking a rule of its type's `propertyConstraints` (protocol version 14).
991        assert_eq!(
992            discriminant_of(BasicError::DocumentPropertyConstraintViolatedError(
993                DocumentPropertyConstraintViolatedError::new(
994                    "order".to_string(),
995                    "depositCoversOrder".to_string(),
996                    PropertyConstraintViolation::NotMet,
997                )
998            )),
999            198
1000        );
1001        // A perpetual distribution with a zero epoch interval (protocol version 14).
1002        assert_eq!(
1003            discriminant_of(
1004                BasicError::InvalidTokenDistributionEpochIntervalTooShortError(
1005                    InvalidTokenDistributionEpochIntervalTooShortError::new(0)
1006                )
1007            ),
1008            199
1009        );
1010        // A `generatedFrom` property that is not what its function generates (protocol
1011        // version 14).
1012        assert_eq!(
1013            discriminant_of(BasicError::DocumentPropertyNotGeneratedError(
1014                DocumentPropertyNotGeneratedError::new(
1015                    "domain".to_string(),
1016                    "normalizedLabel".to_string(),
1017                    "sys.stringTransformations.homographSafeASCII".to_string(),
1018                    vec!["label".to_string()],
1019                )
1020            )),
1021            200
1022        );
1023        // The fields a moderator's document change sets (protocol version 14).
1024        assert_eq!(
1025            discriminant_of(BasicError::InvalidContractModerationDocumentFieldsError(
1026                InvalidContractModerationDocumentFieldsError::new("no field".to_string())
1027            )),
1028            201
1029        );
1030        // A create that cannot assemble the preimage of a `refersTo` lookup key it reveals
1031        // (protocol version 14).
1032        assert_eq!(
1033            discriminant_of(BasicError::DocumentReferencePreimageInvalidError(
1034                DocumentReferencePreimageInvalidError::new(
1035                    "domain".to_string(),
1036                    "$creatorId".to_string(),
1037                    "normalizedLabel".to_string(),
1038                    "reason".to_string(),
1039                )
1040            )),
1041            202
1042        );
1043        // A token opting into a shielded pool keeps no freeze rules (protocol version 14): the
1044        // tail of the enum.
1045        assert_eq!(
1046            discriminant_of(BasicError::TokenShieldedPoolIncompatibleRulesError(
1047                TokenShieldedPoolIncompatibleRulesError::new(0, "freezeRules".to_string())
1048            )),
1049            203
1050        );
1051    }
1052
1053    /// The variants that shipped in 4.1 keep the discriminants they were released with, so an
1054    /// SDK built against 4.1 decodes the errors of a newer node as the same variants. A variant
1055    /// inserted anywhere before the tail moves these and fails this test.
1056    #[test]
1057    fn should_keep_the_discriminants_shipped_in_4_1() {
1058        assert_eq!(
1059            discriminant_of(BasicError::RedundantDocumentPaidForByTokenWithContractId(
1060                RedundantDocumentPaidForByTokenWithContractId::new(Identifier::from([1; 32]))
1061            )),
1062            140
1063        );
1064        // The last variant released in 4.1.
1065        assert_eq!(
1066            discriminant_of(BasicError::TokenPricingScheduleEmptyError(
1067                TokenPricingScheduleEmptyError::new(Identifier::from([1; 32]))
1068            )),
1069            172
1070        );
1071    }
1072}