use core::fmt;
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
#[allow(non_camel_case_types)]
#[allow(dead_code)]
pub enum ScriptError {
SCRIPT_ERR_OK,
SCRIPT_ERR_UNKNOWN_ERROR,
SCRIPT_ERR_EVAL_FALSE,
SCRIPT_ERR_OP_RETURN,
SCRIPT_ERR_SCRIPT_SIZE,
SCRIPT_ERR_PUSH_SIZE,
SCRIPT_ERR_OP_COUNT,
SCRIPT_ERR_STACK_SIZE,
SCRIPT_ERR_SIG_COUNT,
SCRIPT_ERR_PUBKEY_COUNT,
SCRIPT_ERR_VERIFY,
SCRIPT_ERR_EQUALVERIFY,
SCRIPT_ERR_CHECKMULTISIGVERIFY,
SCRIPT_ERR_CHECKSIGVERIFY,
SCRIPT_ERR_NUMEQUALVERIFY,
SCRIPT_ERR_BAD_OPCODE,
SCRIPT_ERR_DISABLED_OPCODE,
SCRIPT_ERR_INVALID_STACK_OPERATION,
SCRIPT_ERR_INVALID_ALTSTACK_OPERATION,
SCRIPT_ERR_UNBALANCED_CONDITIONAL,
SCRIPT_ERR_NEGATIVE_LOCKTIME,
SCRIPT_ERR_UNSATISFIED_LOCKTIME,
SCRIPT_ERR_SIG_HASHTYPE,
SCRIPT_ERR_SIG_DER,
SCRIPT_ERR_MINIMALDATA,
SCRIPT_ERR_SIG_PUSHONLY,
SCRIPT_ERR_SIG_HIGH_S,
SCRIPT_ERR_SIG_NULLDUMMY,
SCRIPT_ERR_PUBKEYTYPE,
SCRIPT_ERR_CLEANSTACK,
SCRIPT_ERR_MINIMALIF,
SCRIPT_ERR_SIG_NULLFAIL,
SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS,
SCRIPT_ERR_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM,
SCRIPT_ERR_DISCOURAGE_UPGRADABLE_TAPROOT_VERSION,
SCRIPT_ERR_DISCOURAGE_OP_SUCCESS,
SCRIPT_ERR_DISCOURAGE_UPGRADABLE_PUBKEYTYPE,
SCRIPT_ERR_WITNESS_PROGRAM_WRONG_LENGTH,
SCRIPT_ERR_WITNESS_PROGRAM_WITNESS_EMPTY,
SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH,
SCRIPT_ERR_WITNESS_MALLEATED,
SCRIPT_ERR_WITNESS_MALLEATED_P2SH,
SCRIPT_ERR_WITNESS_UNEXPECTED,
SCRIPT_ERR_WITNESS_PUBKEYTYPE,
SCRIPT_ERR_SCHNORR_SIG_SIZE,
SCRIPT_ERR_SCHNORR_SIG_HASHTYPE,
SCRIPT_ERR_SCHNORR_SIG,
SCRIPT_ERR_TAPROOT_WRONG_CONTROL_SIZE,
SCRIPT_ERR_TAPSCRIPT_VALIDATION_WEIGHT,
SCRIPT_ERR_TAPSCRIPT_CHECKMULTISIG,
SCRIPT_ERR_TAPSCRIPT_MINIMALIF,
SCRIPT_ERR_OP_CODESEPARATOR,
SCRIPT_ERR_SIG_FINDANDDELETE,
SCRIPT_ERR_NUM_OVERFLOW,
SCRIPT_ERR_UNKNOWN_DEPTH,
}
impl ScriptError {
pub fn description(&self) -> &'static str {
match self {
ScriptError::SCRIPT_ERR_OK => "No error",
ScriptError::SCRIPT_ERR_EVAL_FALSE => {
"Script evaluated without error but finished with a false/empty top stack element"
}
ScriptError::SCRIPT_ERR_VERIFY => "Script failed an OP_VERIFY operation",
ScriptError::SCRIPT_ERR_EQUALVERIFY => "Script failed an OP_EQUALVERIFY operation",
ScriptError::SCRIPT_ERR_CHECKMULTISIGVERIFY => {
"Script failed an OP_CHECKMULTISIGVERIFY operation"
}
ScriptError::SCRIPT_ERR_CHECKSIGVERIFY => {
"Script failed an OP_CHECKSIGVERIFY operation"
}
ScriptError::SCRIPT_ERR_NUMEQUALVERIFY => {
"Script failed an OP_NUMEQUALVERIFY operation"
}
ScriptError::SCRIPT_ERR_SCRIPT_SIZE => "Script is too big",
ScriptError::SCRIPT_ERR_PUSH_SIZE => "Push value size limit exceeded",
ScriptError::SCRIPT_ERR_OP_COUNT => "Operation limit exceeded",
ScriptError::SCRIPT_ERR_STACK_SIZE => "Stack size limit exceeded",
ScriptError::SCRIPT_ERR_SIG_COUNT => {
"Signature count negative or greater than pubkey count"
}
ScriptError::SCRIPT_ERR_PUBKEY_COUNT => "Pubkey count negative or limit exceeded",
ScriptError::SCRIPT_ERR_BAD_OPCODE => "Opcode missing or not understood",
ScriptError::SCRIPT_ERR_DISABLED_OPCODE => "Attempted to use a disabled opcode",
ScriptError::SCRIPT_ERR_INVALID_STACK_OPERATION => {
"Operation not valid with the current stack size"
}
ScriptError::SCRIPT_ERR_INVALID_ALTSTACK_OPERATION => {
"Operation not valid with the current altstack size"
}
ScriptError::SCRIPT_ERR_OP_RETURN => "OP_RETURN was encountered",
ScriptError::SCRIPT_ERR_UNBALANCED_CONDITIONAL => "Invalid OP_IF construction",
ScriptError::SCRIPT_ERR_NEGATIVE_LOCKTIME => "Negative locktime",
ScriptError::SCRIPT_ERR_UNSATISFIED_LOCKTIME => "Locktime requirement not satisfied",
ScriptError::SCRIPT_ERR_SIG_HASHTYPE => "Signature hash type missing or not understood",
ScriptError::SCRIPT_ERR_SIG_DER => "Non-canonical DER signature",
ScriptError::SCRIPT_ERR_MINIMALDATA => "Data push larger than necessary",
ScriptError::SCRIPT_ERR_SIG_PUSHONLY => "Only push operators allowed in signatures",
ScriptError::SCRIPT_ERR_SIG_HIGH_S => {
"Non-canonical signature: S value is unnecessarily high"
}
ScriptError::SCRIPT_ERR_SIG_NULLDUMMY => "Dummy CHECKMULTISIG argument must be zero",
ScriptError::SCRIPT_ERR_MINIMALIF => "OP_IF/NOTIF argument must be minimal",
ScriptError::SCRIPT_ERR_SIG_NULLFAIL => {
"Signature must be zero for failed CHECK(MULTI)SIG operation"
}
ScriptError::SCRIPT_ERR_DISCOURAGE_UPGRADABLE_NOPS => {
"NOPx reserved for soft-fork upgrades"
}
ScriptError::SCRIPT_ERR_DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM => {
"Witness version reserved for soft-fork upgrades"
}
ScriptError::SCRIPT_ERR_DISCOURAGE_UPGRADABLE_TAPROOT_VERSION => {
"Taproot version reserved for soft-fork upgrades"
}
ScriptError::SCRIPT_ERR_DISCOURAGE_OP_SUCCESS => {
"OP_SUCCESSx reserved for soft-fork upgrades"
}
ScriptError::SCRIPT_ERR_DISCOURAGE_UPGRADABLE_PUBKEYTYPE => {
"Public key version reserved for soft-fork upgrades"
}
ScriptError::SCRIPT_ERR_PUBKEYTYPE => {
"Public key is neither compressed or uncompressed"
}
ScriptError::SCRIPT_ERR_CLEANSTACK => "Stack size must be exactly one after execution",
ScriptError::SCRIPT_ERR_WITNESS_PROGRAM_WRONG_LENGTH => {
"Witness program has incorrect length"
}
ScriptError::SCRIPT_ERR_WITNESS_PROGRAM_WITNESS_EMPTY => {
"Witness program was passed an empty witness"
}
ScriptError::SCRIPT_ERR_WITNESS_PROGRAM_MISMATCH => "Witness program hash mismatch",
ScriptError::SCRIPT_ERR_WITNESS_MALLEATED => "Witness requires empty scriptSig",
ScriptError::SCRIPT_ERR_WITNESS_MALLEATED_P2SH => {
"Witness requires only-redeemscript scriptSig"
}
ScriptError::SCRIPT_ERR_WITNESS_UNEXPECTED => "Witness provided for non-witness script",
ScriptError::SCRIPT_ERR_WITNESS_PUBKEYTYPE => "Using non-compressed keys in segwit",
ScriptError::SCRIPT_ERR_SCHNORR_SIG_SIZE => "Invalid Schnorr signature size",
ScriptError::SCRIPT_ERR_SCHNORR_SIG_HASHTYPE => "Invalid Schnorr signature hash type",
ScriptError::SCRIPT_ERR_SCHNORR_SIG => "Invalid Schnorr signature",
ScriptError::SCRIPT_ERR_TAPROOT_WRONG_CONTROL_SIZE => {
"Invalid Taproot control block size"
}
ScriptError::SCRIPT_ERR_TAPSCRIPT_VALIDATION_WEIGHT => {
"Too much signature validation relative to witness weight"
}
ScriptError::SCRIPT_ERR_TAPSCRIPT_CHECKMULTISIG => {
"OP_CHECKMULTISIG(VERIFY) is not available in tapscript"
}
ScriptError::SCRIPT_ERR_TAPSCRIPT_MINIMALIF => {
"OP_IF/NOTIF argument must be minimal in tapscript"
}
ScriptError::SCRIPT_ERR_OP_CODESEPARATOR => {
"Using OP_CODESEPARATOR in non-witness script"
}
ScriptError::SCRIPT_ERR_SIG_FINDANDDELETE => "Signature is found in scriptCode",
ScriptError::SCRIPT_ERR_NUM_OVERFLOW => "Script number overflow",
ScriptError::SCRIPT_ERR_UNKNOWN_DEPTH => "Depth argument could not be evaluated",
ScriptError::SCRIPT_ERR_UNKNOWN_ERROR => "unknown error",
}
}
}
impl fmt::Display for ScriptError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}", self.description())
}
}