100 lines
3.0 KiB
Rust
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),
|
|
}
|
|
}
|
|
}
|