parity-zcash/script/src/error.rs

100 lines
3.0 KiB
Rust
Raw Normal View History

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