1use core::fmt;
4
5#[derive(Debug, Clone, PartialEq, Eq)]
7#[non_exhaustive]
8pub enum NodeParityError {
9 Environment(&'static str),
11 InvalidCString(&'static str),
13 BridgeFailure(&'static str),
15 Script(ScriptError),
17}
18
19impl fmt::Display for NodeParityError {
20 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
21 match self {
22 Self::Environment(msg) => f.write_str(msg),
23 Self::InvalidCString(name) => write!(f, "failed to build C string for {}", name),
24 Self::BridgeFailure(name) => {
25 write!(f, "tidecoin node parity bridge call failed: {}", name)
26 }
27 Self::Script(err) => write!(f, "script validation failed: {}", err),
28 }
29 }
30}
31
32#[cfg(feature = "std")]
33impl std::error::Error for NodeParityError {}
34
35#[derive(Debug, Clone, Copy, PartialEq, Eq)]
37#[non_exhaustive]
38pub enum ScriptError {
39 Ok,
41 UnknownError,
43 EvalFalse,
45 OpReturn,
47 ScriptSize,
49 PushSize,
51 OpCount,
53 StackSize,
55 SigCount,
57 PubkeyCount,
59 Verify,
61 EqualVerify,
63 CheckMultisigVerify,
65 CheckSigVerify,
67 NumEqualVerify,
69 BadOpcode,
71 DisabledOpcode,
73 InvalidStackOperation,
75 InvalidAltstackOperation,
77 UnbalancedConditional,
79 NegativeLocktime,
81 UnsatisfiedLocktime,
83 SigHashType,
85 MinimalData,
87 SigPushOnly,
89 SigHighS,
91 SigNullDummy,
93 PubkeyType,
95 Cleanstack,
97 MinimalIf,
99 NullFail,
101 DiscourageUpgradableNops,
103 DiscourageUpgradableWitnessProgram,
105 WitnessProgramWrongLength,
107 WitnessProgramWitnessEmpty,
109 WitnessProgramMismatch,
111 WitnessMalleated,
113 WitnessMalleatedP2sh,
115 WitnessUnexpected,
117 OpCodeSeparator,
119 SigFindAndDelete,
121}
122
123impl ScriptError {
124 pub fn from_ffi(code: i32) -> Self {
126 match code {
127 0 => Self::Ok,
128 1 => Self::UnknownError,
129 2 => Self::EvalFalse,
130 3 => Self::OpReturn,
131 4 => Self::ScriptSize,
132 5 => Self::PushSize,
133 6 => Self::OpCount,
134 7 => Self::StackSize,
135 8 => Self::SigCount,
136 9 => Self::PubkeyCount,
137 10 => Self::Verify,
138 11 => Self::EqualVerify,
139 12 => Self::CheckMultisigVerify,
140 13 => Self::CheckSigVerify,
141 14 => Self::NumEqualVerify,
142 15 => Self::BadOpcode,
143 16 => Self::DisabledOpcode,
144 17 => Self::InvalidStackOperation,
145 18 => Self::InvalidAltstackOperation,
146 19 => Self::UnbalancedConditional,
147 20 => Self::NegativeLocktime,
148 21 => Self::UnsatisfiedLocktime,
149 22 => Self::SigHashType,
150 23 => Self::MinimalData,
151 24 => Self::SigPushOnly,
152 25 => Self::SigHighS,
153 26 => Self::SigNullDummy,
154 27 => Self::PubkeyType,
155 28 => Self::Cleanstack,
156 29 => Self::MinimalIf,
157 30 => Self::NullFail,
158 31 => Self::DiscourageUpgradableNops,
159 32 => Self::DiscourageUpgradableWitnessProgram,
160 33 => Self::WitnessProgramWrongLength,
161 34 => Self::WitnessProgramWitnessEmpty,
162 35 => Self::WitnessProgramMismatch,
163 36 => Self::WitnessMalleated,
164 37 => Self::WitnessMalleatedP2sh,
165 38 => Self::WitnessUnexpected,
166 39 => Self::OpCodeSeparator,
167 40 => Self::SigFindAndDelete,
168 _ => Self::UnknownError,
169 }
170 }
171
172 pub fn from_name(name: &str) -> Option<Self> {
174 Some(match name {
175 "OK" => Self::Ok,
176 "UNKNOWN_ERROR" => Self::UnknownError,
177 "EVAL_FALSE" => Self::EvalFalse,
178 "OP_RETURN" => Self::OpReturn,
179 "SCRIPT_SIZE" => Self::ScriptSize,
180 "PUSH_SIZE" => Self::PushSize,
181 "OP_COUNT" => Self::OpCount,
182 "STACK_SIZE" => Self::StackSize,
183 "SIG_COUNT" => Self::SigCount,
184 "PUBKEY_COUNT" => Self::PubkeyCount,
185 "VERIFY" => Self::Verify,
186 "EQUALVERIFY" => Self::EqualVerify,
187 "CHECKMULTISIGVERIFY" => Self::CheckMultisigVerify,
188 "CHECKSIGVERIFY" => Self::CheckSigVerify,
189 "NUMEQUALVERIFY" => Self::NumEqualVerify,
190 "BAD_OPCODE" => Self::BadOpcode,
191 "DISABLED_OPCODE" => Self::DisabledOpcode,
192 "INVALID_STACK_OPERATION" => Self::InvalidStackOperation,
193 "INVALID_ALTSTACK_OPERATION" => Self::InvalidAltstackOperation,
194 "UNBALANCED_CONDITIONAL" => Self::UnbalancedConditional,
195 "NEGATIVE_LOCKTIME" => Self::NegativeLocktime,
196 "UNSATISFIED_LOCKTIME" => Self::UnsatisfiedLocktime,
197 "SIG_HASHTYPE" => Self::SigHashType,
198 "MINIMALDATA" => Self::MinimalData,
199 "SIG_PUSHONLY" => Self::SigPushOnly,
200 "SIG_HIGH_S" => Self::SigHighS,
201 "SIG_NULLDUMMY" => Self::SigNullDummy,
202 "PUBKEYTYPE" => Self::PubkeyType,
203 "CLEANSTACK" => Self::Cleanstack,
204 "MINIMALIF" => Self::MinimalIf,
205 "NULLFAIL" => Self::NullFail,
206 "DISCOURAGE_UPGRADABLE_NOPS" => Self::DiscourageUpgradableNops,
207 "DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM" => Self::DiscourageUpgradableWitnessProgram,
208 "WITNESS_PROGRAM_WRONG_LENGTH" => Self::WitnessProgramWrongLength,
209 "WITNESS_PROGRAM_WITNESS_EMPTY" => Self::WitnessProgramWitnessEmpty,
210 "WITNESS_PROGRAM_MISMATCH" => Self::WitnessProgramMismatch,
211 "WITNESS_MALLEATED" => Self::WitnessMalleated,
212 "WITNESS_MALLEATED_P2SH" => Self::WitnessMalleatedP2sh,
213 "WITNESS_UNEXPECTED" => Self::WitnessUnexpected,
214 "OP_CODESEPARATOR" => Self::OpCodeSeparator,
215 "SIG_FINDANDDELETE" => Self::SigFindAndDelete,
216 _ => return None,
217 })
218 }
219}
220
221impl fmt::Display for ScriptError {
222 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
223 f.write_str(match self {
224 Self::Ok => "OK",
225 Self::UnknownError => "UNKNOWN_ERROR",
226 Self::EvalFalse => "EVAL_FALSE",
227 Self::OpReturn => "OP_RETURN",
228 Self::ScriptSize => "SCRIPT_SIZE",
229 Self::PushSize => "PUSH_SIZE",
230 Self::OpCount => "OP_COUNT",
231 Self::StackSize => "STACK_SIZE",
232 Self::SigCount => "SIG_COUNT",
233 Self::PubkeyCount => "PUBKEY_COUNT",
234 Self::Verify => "VERIFY",
235 Self::EqualVerify => "EQUALVERIFY",
236 Self::CheckMultisigVerify => "CHECKMULTISIGVERIFY",
237 Self::CheckSigVerify => "CHECKSIGVERIFY",
238 Self::NumEqualVerify => "NUMEQUALVERIFY",
239 Self::BadOpcode => "BAD_OPCODE",
240 Self::DisabledOpcode => "DISABLED_OPCODE",
241 Self::InvalidStackOperation => "INVALID_STACK_OPERATION",
242 Self::InvalidAltstackOperation => "INVALID_ALTSTACK_OPERATION",
243 Self::UnbalancedConditional => "UNBALANCED_CONDITIONAL",
244 Self::NegativeLocktime => "NEGATIVE_LOCKTIME",
245 Self::UnsatisfiedLocktime => "UNSATISFIED_LOCKTIME",
246 Self::SigHashType => "SIG_HASHTYPE",
247 Self::MinimalData => "MINIMALDATA",
248 Self::SigPushOnly => "SIG_PUSHONLY",
249 Self::SigHighS => "SIG_HIGH_S",
250 Self::SigNullDummy => "SIG_NULLDUMMY",
251 Self::PubkeyType => "PUBKEYTYPE",
252 Self::Cleanstack => "CLEANSTACK",
253 Self::MinimalIf => "MINIMALIF",
254 Self::NullFail => "NULLFAIL",
255 Self::DiscourageUpgradableNops => "DISCOURAGE_UPGRADABLE_NOPS",
256 Self::DiscourageUpgradableWitnessProgram => "DISCOURAGE_UPGRADABLE_WITNESS_PROGRAM",
257 Self::WitnessProgramWrongLength => "WITNESS_PROGRAM_WRONG_LENGTH",
258 Self::WitnessProgramWitnessEmpty => "WITNESS_PROGRAM_WITNESS_EMPTY",
259 Self::WitnessProgramMismatch => "WITNESS_PROGRAM_MISMATCH",
260 Self::WitnessMalleated => "WITNESS_MALLEATED",
261 Self::WitnessMalleatedP2sh => "WITNESS_MALLEATED_P2SH",
262 Self::WitnessUnexpected => "WITNESS_UNEXPECTED",
263 Self::OpCodeSeparator => "OP_CODESEPARATOR",
264 Self::SigFindAndDelete => "SIG_FINDANDDELETE",
265 })
266 }
267}