From 5faed2334c7f61936f668845b1bc018f0b8c34a4 Mon Sep 17 00:00:00 2001 From: muXxer Date: Fri, 3 May 2024 12:34:40 +0200 Subject: [PATCH 1/2] Add more detailed error messages to some VM failures --- vm/nova/vm.go | 4 ++-- vm/vm.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/vm/nova/vm.go b/vm/nova/vm.go index 9f41510a2..aa7fa10c4 100644 --- a/vm/nova/vm.go +++ b/vm/nova/vm.go @@ -476,7 +476,7 @@ func accountStakingGenesisValidation(vmParams *vm.Params, stakingFeat *iotago.St pastBoundedEpoch := timeProvider.EpochFromSlot(pastBoundedSlot) if stakingFeat.StartEpoch != pastBoundedEpoch { - return iotago.ErrStakingStartEpochInvalid + return ierrors.WithMessagef(iotago.ErrStakingStartEpochInvalid, "is %d, expected %d", stakingFeat.StartEpoch, pastBoundedEpoch) } unbondingEpoch := pastBoundedEpoch + vmParams.API.ProtocolParameters().StakingUnbondingPeriod() @@ -996,7 +996,7 @@ func delegationGenesisValid(vmParams *vm.Params, current *iotago.DelegationOutpu } if current.DelegatedAmount != current.Amount { - return iotago.ErrDelegationAmountMismatch + return ierrors.WithMessagef(iotago.ErrDelegationAmountMismatch, "delegated amount %d, amount %d", current.DelegatedAmount, current.Amount) } if current.EndEpoch != 0 { diff --git a/vm/vm.go b/vm/vm.go index 47fa9acd5..a074e1d2c 100644 --- a/vm/vm.go +++ b/vm/vm.go @@ -698,7 +698,7 @@ func ExecFuncBalancedMana() ExecFunc { } else if manaIn > manaOut { // less mana on output side than on input side => check if mana burning is allowed if vmParams.WorkingSet.Tx.Capabilities.CannotBurnMana() { - return ierrors.Chain(iotago.ErrInputOutputManaMismatch, iotago.ErrTxCapabilitiesManaBurningNotAllowed) + return ierrors.Chain(iotago.ErrInputOutputManaMismatch, ierrors.WithMessagef(iotago.ErrTxCapabilitiesManaBurningNotAllowed, "Mana in %d, Mana out %d", manaIn, manaOut)) } } From 886fcee49d1d154294800076b94c1abda07b39f8 Mon Sep 17 00:00:00 2001 From: muXxer Date: Fri, 3 May 2024 12:43:25 +0200 Subject: [PATCH 2/2] Add `String()` to `TransactionFailureReason` --- api/core.go | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/api/core.go b/api/core.go index 364111c08..402799aed 100644 --- a/api/core.go +++ b/api/core.go @@ -412,6 +412,107 @@ func TransactionFailureReasonFromBytes(b []byte) (TransactionFailureReason, int, return TransactionFailureReason(b[0]), TransactionFailureReasonLength, nil } +func (t TransactionFailureReason) String() string { + return []string{ + "none", + + "conflict_rejected", + "orphaned", + + "input_already_spent", + "input_creation_after_tx_creation", + "unlock_signature_invalid", + + "chain_address_unlock_invalid", + "direct_unlockable_address_unlock_invalid", + "multi_address_unlock_invalid", + + "commitment_input_reference_invalid", + "bic_input_reference_invalid", + "reward_input_reference_invalid", + + "staking_reward_calculation_failure", + "delegation_reward_calculation_failure", + + "input_output_base_token_mismatch", + + "mana_overflow", + "input_output_mana_mismatch", + "mana_decay_creation_index_exceeds_target_index", + + "native_token_sum_unbalanced", + + "simple_token_scheme_minted_melted_token_decrease", + "simple_token_scheme_minting_invalid", + "simple_token_scheme_melting_invalid", + "simple_token_scheme_maximum_supply_changed", + "simple_token_scheme_genesis_invalid", + + "multi_address_length_unlock_length_mismatch", + "multi_address_unlock_threshold_not_reached", + + "sender_feature_not_unlocked", + + "issuer_feature_not_unlocked", + + "staking_reward_input_missing", + "staking_commitment_input_missing", + "staking_reward_claiming_invalid", + "staking_feature_removed_before_unbonding", + "staking_feature_modified_before_unbonding", + "staking_start_epoch_invalid", + "staking_end_epoch_too_early", + + "block_issuer_commitment_input_missing", + "block_issuance_credit_input_missing", + "block_issuer_not_expired", + "block_issuer_expiry_too_early", + "mana_moved_off_block_issuer_account", + "account_locked", + + "timelock_commitment_input_missing", + "timelock_not_expired", + + "expiration_commitment_input_missing", + "expiration_not_unlockable", + + "return_amount_not_fulfilled", + + "new_chain_output_has_non_zeroed_id", + "chain_output_immutable_features_changed", + + "implicit_account_destruction_disallowed", + "multiple_implicit_account_creation_addresses", + + "account_invalid_foundry_counter", + + "anchor_invalid_state_transition", + "anchor_invalid_governance_transition", + + "foundry_transition_without_account", + "foundry_serial_invalid", + + "delegation_commitment_input_missing", + "delegation_reward_input_missing", + "delegation_rewards_claiming_invalid", + "delegation_output_transitioned_twice", + "delegation_modified", + "delegation_start_epoch_invalid", + "delegation_amount_mismatch", + "delegation_end_epoch_not_zero", + "delegation_end_epoch_invalid", + + "capabilities_native_token_burning_not_allowed", + "capabilities_mana_burning_not_allowed", + "capabilities_account_destruction_not_allowed", + "capabilities_anchor_destruction_not_allowed", + "capabilities_foundry_destruction_not_allowed", + "capabilities_nft_destruction_not_allowed", + + "semantic_validation_failed", + }[t] +} + // Unwraps the given err into the given errList by recursively unwrapping it. // // In case of joined errors, the right-most error is unwrapped first, which corresponds