parity-zcash/script/src/error.rs

100 lines
3.0 KiB
Rust

use std::fmt;
use Opcode;
#[derive(Debug, PartialEq)]
pub enum Error {
Unknown,
EvalFalse,
ReturnOpcode,
// Max sizes.
ScriptSize,
PushSize,
OpCount,
StackSize,
NumberOverflow,
NumberNotMinimallyEncoded,
SigCount,
PubkeyCount,
// Failed verify operations
Verify,
EqualVerify,
CheckSigVerify,
NumEqualVerify,
// Logical/Format/Canonical errors.
BadOpcode,
DisabledOpcode(Opcode),
InvalidStackOperation,
InvalidAltstackOperation,
UnbalancedConditional,
// CHECKLOCKTIMEVERIFY and CHECKSEQUENCEVERIFY
NegativeLocktime,
UnsatisfiedLocktime,
// BIP62
SignatureHashtype,
SignatureDer,
Minimaldata,
SignaturePushOnly,
SignatureHighS,
SignatureNullDummy,
PubkeyType,
Cleanstack,
// Softfork safeness
DiscourageUpgradableNops,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Error::Unknown => "Unknown error".fmt(f),
Error::EvalFalse => "Script evaluated to false".fmt(f),
Error::ReturnOpcode => "Used return opcode".fmt(f),
// Failed verify operations
Error::Verify => "Failed verify operation".fmt(f),
Error::EqualVerify => "Failed equal verify operation".fmt(f),
Error::CheckSigVerify => "Failed signature check".fmt(f),
Error::NumEqualVerify => "Failed num equal verify operation".fmt(f),
Error::SigCount => "Maximum number of signature exceeded".fmt(f),
Error::PubkeyCount => "Maximum number of pubkeys per multisig exceeded".fmt(f),
// Max sizes.
Error::ScriptSize => "Script is too long".fmt(f),
Error::PushSize => "Pushing too many bytes".fmt(f),
Error::OpCount => "Script contains to many opcodes".fmt(f),
Error::StackSize => "Stack is too big".fmt(f),
Error::NumberOverflow => "Number overflow".fmt(f),
Error::NumberNotMinimallyEncoded => "Number not minimally encoded".fmt(f),
// Logical/Format/Canonical errors.
Error::BadOpcode => "Bad Opcode".fmt(f),
Error::DisabledOpcode(ref opcode) => writeln!(f, "Disabled Opcode: {:?}", opcode),
Error::InvalidStackOperation => "Invalid stack operation".fmt(f),
Error::InvalidAltstackOperation => "Invalid altstack operation".fmt(f),
Error::UnbalancedConditional => "Unbalanced conditional".fmt(f),
// CHECKLOCKTIMEVERIFY and CHECKSEQUENCEVERIFY
Error::NegativeLocktime => "Negative locktime".fmt(f),
Error::UnsatisfiedLocktime => "UnsatisfiedLocktime".fmt(f),
// BIP62
Error::SignatureHashtype => "Invalid Signature Hashtype".fmt(f),
Error::SignatureDer => "Invalid Signature".fmt(f),
Error::Minimaldata => "Check minimaldata failed".fmt(f),
Error::SignaturePushOnly => "Only push opcodes are allowed in this signature".fmt(f),
Error::SignatureHighS => "Invalid High S in Signature".fmt(f),
Error::SignatureNullDummy => "Multisig extra stack element is not empty".fmt(f),
Error::PubkeyType => "Invalid Pubkey".fmt(f),
Error::Cleanstack => "Only one element is expected to remain at stack at the end of execution".fmt(f),
// Softfork safeness
Error::DiscourageUpgradableNops => "Discourage Upgradable Nops".fmt(f),
}
}
}