Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,14 @@ The format is loosely based on [Keep a Changelog](https://keepachangelog.com/en/
of a cluster that exceeds the limits. The default cluster limits are: max 64 transactions, max 100'000 bytes
in total.

- Consensus:
- Tightening of certain consensus rules have been implemented, in particular:
- When changing token metadata URI, the URI can no longer contain arbitrary characters (the restrictions are
the same as when a token is created).
- Transferring or burning zero amount of a token is no longer allowed.

(The actual consensus tightening will happen after a fork, the height is yet to be decided.)

## [1.3.1] - 2026-06-03

### Fixed
Expand Down
3 changes: 3 additions & 0 deletions chainstate/src/detail/ban_score.rs
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ impl BanScore for ConnectTransactionError {
ConnectTransactionError::ConcludeInputAmountsDontMatch(_, _) => 100,
ConnectTransactionError::ProduceBlockFromStakeChangesStakerDestination(_, _) => 100,
ConnectTransactionError::IdCreationError(err) => err.ban_score(),
ConnectTransactionError::ZeroTokenTransfer(_) => 100,
}
}
}
Expand Down Expand Up @@ -358,6 +359,7 @@ impl BanScore for TokensError {
TokensError::InvariantBrokenUndoIssuanceOnNonexistentToken(_) => 100,
TokensError::InvariantBrokenRegisterIssuanceWithDuplicateId(_) => 100,
TokensError::TokenMetadataUriTooLarge(_) => 100,
TokensError::IncorrectMetadataUri(_) => 100,
}
}
}
Expand Down Expand Up @@ -476,6 +478,7 @@ impl BanScore for ConsensusPoSError {
ConsensusPoSError::EmptyTimespan => 100,
ConsensusPoSError::FailedToCalculateCappedBalance => 100,
ConsensusPoSError::InvalidOutputTypeInStakeKernel(_) => 100,
ConsensusPoSError::PoolIdsInKernelUtxoAndPoSDataMismatch { .. } => 100,
}
}
}
Expand Down
9 changes: 5 additions & 4 deletions chainstate/src/detail/error_classification.rs
Original file line number Diff line number Diff line change
Expand Up @@ -304,9 +304,8 @@ impl BlockProcessingErrorClassification for ConnectTransactionError {
| ConnectTransactionError::InsufficientCoinsFee(_, _)
| ConnectTransactionError::AttemptToSpendFrozenToken(_)
| ConnectTransactionError::ConcludeInputAmountsDontMatch(_, _)
| ConnectTransactionError::ProduceBlockFromStakeChangesStakerDestination(_, _) => {
BlockProcessingErrorClass::BadBlock
}
| ConnectTransactionError::ProduceBlockFromStakeChangesStakerDestination(_, _)
| ConnectTransactionError::ZeroTokenTransfer(_) => BlockProcessingErrorClass::BadBlock,

ConnectTransactionError::StorageError(err) => err.classify(),
ConnectTransactionError::UtxoError(err) => err.classify(),
Expand Down Expand Up @@ -494,6 +493,7 @@ impl BlockProcessingErrorClassification for TokensError {
| TokensError::CoinOrTokenOverflow(_)
| TokensError::InsufficientTokenFees(_)
| TokensError::TokenMetadataUriTooLarge(_)
| TokensError::IncorrectMetadataUri(_)
| TokensError::InvariantBrokenUndoIssuanceOnNonexistentToken(_)
| TokensError::InvariantBrokenRegisterIssuanceWithDuplicateId(_) => {
BlockProcessingErrorClass::BadBlock
Expand Down Expand Up @@ -663,7 +663,8 @@ impl BlockProcessingErrorClassification for ConsensusPoSError {
| ConsensusPoSError::FiniteTotalSupplyIsRequired
| ConsensusPoSError::UnsupportedConsensusVersion
| ConsensusPoSError::FailedToCalculateCappedBalance
| ConsensusPoSError::InvalidOutputTypeInStakeKernel(_) => {
| ConsensusPoSError::InvalidOutputTypeInStakeKernel(_)
| ConsensusPoSError::PoolIdsInKernelUtxoAndPoSDataMismatch { .. } => {
BlockProcessingErrorClass::BadBlock
}

Expand Down
2 changes: 1 addition & 1 deletion chainstate/src/detail/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ pub use self::{
median_time::calculate_median_time_past_from_blocktimestamps,
};
pub use chainstate_types::Locator;
pub use chainstateref::NonZeroPoolBalances;
pub use chainstateref::{EpochSealError, NonZeroPoolBalances};
pub use error::{
BlockError, CheckBlockError, CheckBlockTransactionsError, DbCommittingContext,
InitializationError, OrphanCheckError, StorageCompatibilityCheckError,
Expand Down
6 changes: 3 additions & 3 deletions chainstate/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,9 +39,9 @@ pub use crate::{
detail::{
BlockError, BlockProcessingErrorClass, BlockProcessingErrorClassification, BlockSource,
ChainInfo, CheckBlockError, CheckBlockTransactionsError, ConnectTransactionError,
IOPolicyError, InitializationError, Locator, MEDIAN_TIME_SPAN, NonZeroPoolBalances,
OrphanCheckError, SpendStakeError, StorageCompatibilityCheckError, TokenIssuanceError,
TokensError, TransactionVerifierStorageError, ban_score,
EpochSealError, IOPolicyError, InitializationError, Locator, MEDIAN_TIME_SPAN,
NonZeroPoolBalances, OrphanCheckError, SpendStakeError, StorageCompatibilityCheckError,
TokenIssuanceError, TokensError, TransactionVerifierStorageError, ban_score,
block_invalidation::BlockInvalidatorError, bootstrap::BootstrapError,
calculate_median_time_past, calculate_median_time_past_from_blocktimestamps,
},
Expand Down
Loading
Loading