1use std::collections::HashMap;
7use std::sync::LazyLock;
8
9pub const OP_FALSE: u8 = 0x00;
11pub const OP_0: u8 = 0x00;
12
13pub const OP_DATA_1: u8 = 0x01;
15pub const OP_DATA_2: u8 = 0x02;
16pub const OP_DATA_3: u8 = 0x03;
17pub const OP_DATA_4: u8 = 0x04;
18pub const OP_DATA_5: u8 = 0x05;
19pub const OP_DATA_6: u8 = 0x06;
20pub const OP_DATA_7: u8 = 0x07;
21pub const OP_DATA_8: u8 = 0x08;
22pub const OP_DATA_9: u8 = 0x09;
23pub const OP_DATA_10: u8 = 0x0a;
24pub const OP_DATA_11: u8 = 0x0b;
25pub const OP_DATA_12: u8 = 0x0c;
26pub const OP_DATA_13: u8 = 0x0d;
27pub const OP_DATA_14: u8 = 0x0e;
28pub const OP_DATA_15: u8 = 0x0f;
29pub const OP_DATA_16: u8 = 0x10;
30pub const OP_DATA_17: u8 = 0x11;
31pub const OP_DATA_18: u8 = 0x12;
32pub const OP_DATA_19: u8 = 0x13;
33pub const OP_DATA_20: u8 = 0x14;
34pub const OP_DATA_21: u8 = 0x15;
35pub const OP_DATA_22: u8 = 0x16;
36pub const OP_DATA_23: u8 = 0x17;
37pub const OP_DATA_24: u8 = 0x18;
38pub const OP_DATA_25: u8 = 0x19;
39pub const OP_DATA_26: u8 = 0x1a;
40pub const OP_DATA_27: u8 = 0x1b;
41pub const OP_DATA_28: u8 = 0x1c;
42pub const OP_DATA_29: u8 = 0x1d;
43pub const OP_DATA_30: u8 = 0x1e;
44pub const OP_DATA_31: u8 = 0x1f;
45pub const OP_DATA_32: u8 = 0x20;
46pub const OP_DATA_33: u8 = 0x21;
47pub const OP_DATA_34: u8 = 0x22;
48pub const OP_DATA_35: u8 = 0x23;
49pub const OP_DATA_36: u8 = 0x24;
50pub const OP_DATA_37: u8 = 0x25;
51pub const OP_DATA_38: u8 = 0x26;
52pub const OP_DATA_39: u8 = 0x27;
53pub const OP_DATA_40: u8 = 0x28;
54pub const OP_DATA_41: u8 = 0x29;
55pub const OP_DATA_42: u8 = 0x2a;
56pub const OP_DATA_43: u8 = 0x2b;
57pub const OP_DATA_44: u8 = 0x2c;
58pub const OP_DATA_45: u8 = 0x2d;
59pub const OP_DATA_46: u8 = 0x2e;
60pub const OP_DATA_47: u8 = 0x2f;
61pub const OP_DATA_48: u8 = 0x30;
62pub const OP_DATA_49: u8 = 0x31;
63pub const OP_DATA_50: u8 = 0x32;
64pub const OP_DATA_51: u8 = 0x33;
65pub const OP_DATA_52: u8 = 0x34;
66pub const OP_DATA_53: u8 = 0x35;
67pub const OP_DATA_54: u8 = 0x36;
68pub const OP_DATA_55: u8 = 0x37;
69pub const OP_DATA_56: u8 = 0x38;
70pub const OP_DATA_57: u8 = 0x39;
71pub const OP_DATA_58: u8 = 0x3a;
72pub const OP_DATA_59: u8 = 0x3b;
73pub const OP_DATA_60: u8 = 0x3c;
74pub const OP_DATA_61: u8 = 0x3d;
75pub const OP_DATA_62: u8 = 0x3e;
76pub const OP_DATA_63: u8 = 0x3f;
77pub const OP_DATA_64: u8 = 0x40;
78pub const OP_DATA_65: u8 = 0x41;
79pub const OP_DATA_66: u8 = 0x42;
80pub const OP_DATA_67: u8 = 0x43;
81pub const OP_DATA_68: u8 = 0x44;
82pub const OP_DATA_69: u8 = 0x45;
83pub const OP_DATA_70: u8 = 0x46;
84pub const OP_DATA_71: u8 = 0x47;
85pub const OP_DATA_72: u8 = 0x48;
86pub const OP_DATA_73: u8 = 0x49;
87pub const OP_DATA_74: u8 = 0x4a;
88pub const OP_DATA_75: u8 = 0x4b;
89
90pub const OP_PUSHDATA1: u8 = 0x4c;
91pub const OP_PUSHDATA2: u8 = 0x4d;
92pub const OP_PUSHDATA4: u8 = 0x4e;
93pub const OP_1NEGATE: u8 = 0x4f;
94pub const OP_RESERVED: u8 = 0x50;
95pub const OP_TRUE: u8 = 0x51;
96pub const OP_1: u8 = 0x51;
97pub const OP_2: u8 = 0x52;
98pub const OP_3: u8 = 0x53;
99pub const OP_4: u8 = 0x54;
100pub const OP_5: u8 = 0x55;
101pub const OP_6: u8 = 0x56;
102pub const OP_7: u8 = 0x57;
103pub const OP_8: u8 = 0x58;
104pub const OP_9: u8 = 0x59;
105pub const OP_10: u8 = 0x5a;
106pub const OP_11: u8 = 0x5b;
107pub const OP_12: u8 = 0x5c;
108pub const OP_13: u8 = 0x5d;
109pub const OP_14: u8 = 0x5e;
110pub const OP_15: u8 = 0x5f;
111pub const OP_16: u8 = 0x60;
112
113pub const OP_NOP: u8 = 0x61;
115pub const OP_VER: u8 = 0x62;
116pub const OP_IF: u8 = 0x63;
117pub const OP_NOTIF: u8 = 0x64;
118pub const OP_VERIF: u8 = 0x65;
119pub const OP_VERNOTIF: u8 = 0x66;
120pub const OP_ELSE: u8 = 0x67;
121pub const OP_ENDIF: u8 = 0x68;
122pub const OP_VERIFY: u8 = 0x69;
123pub const OP_RETURN: u8 = 0x6a;
124
125pub const OP_TOALTSTACK: u8 = 0x6b;
127pub const OP_FROMALTSTACK: u8 = 0x6c;
128pub const OP_2DROP: u8 = 0x6d;
129pub const OP_2DUP: u8 = 0x6e;
130pub const OP_3DUP: u8 = 0x6f;
131pub const OP_2OVER: u8 = 0x70;
132pub const OP_2ROT: u8 = 0x71;
133pub const OP_2SWAP: u8 = 0x72;
134pub const OP_IFDUP: u8 = 0x73;
135pub const OP_DEPTH: u8 = 0x74;
136pub const OP_DROP: u8 = 0x75;
137pub const OP_DUP: u8 = 0x76;
138pub const OP_NIP: u8 = 0x77;
139pub const OP_OVER: u8 = 0x78;
140pub const OP_PICK: u8 = 0x79;
141pub const OP_ROLL: u8 = 0x7a;
142pub const OP_ROT: u8 = 0x7b;
143pub const OP_SWAP: u8 = 0x7c;
144pub const OP_TUCK: u8 = 0x7d;
145
146pub const OP_CAT: u8 = 0x7e;
148pub const OP_SUBSTR: u8 = 0x7f; pub const OP_SPLIT: u8 = 0x7f; pub const OP_LEFT: u8 = 0x80; pub const OP_NUM2BIN: u8 = 0x80; pub const OP_RIGHT: u8 = 0x81; pub const OP_BIN2NUM: u8 = 0x81; pub const OP_SIZE: u8 = 0x82;
155
156pub const OP_INVERT: u8 = 0x83;
158pub const OP_AND: u8 = 0x84;
159pub const OP_OR: u8 = 0x85;
160pub const OP_XOR: u8 = 0x86;
161pub const OP_EQUAL: u8 = 0x87;
162pub const OP_EQUALVERIFY: u8 = 0x88;
163pub const OP_RESERVED1: u8 = 0x89;
164pub const OP_RESERVED2: u8 = 0x8a;
165
166pub const OP_1ADD: u8 = 0x8b;
168pub const OP_1SUB: u8 = 0x8c;
169pub const OP_2MUL: u8 = 0x8d;
170pub const OP_2DIV: u8 = 0x8e;
171pub const OP_NEGATE: u8 = 0x8f;
172pub const OP_ABS: u8 = 0x90;
173pub const OP_NOT: u8 = 0x91;
174pub const OP_0NOTEQUAL: u8 = 0x92;
175pub const OP_ADD: u8 = 0x93;
176pub const OP_SUB: u8 = 0x94;
177pub const OP_MUL: u8 = 0x95;
178pub const OP_DIV: u8 = 0x96;
179pub const OP_MOD: u8 = 0x97;
180pub const OP_LSHIFT: u8 = 0x98;
181pub const OP_RSHIFT: u8 = 0x99;
182pub const OP_BOOLAND: u8 = 0x9a;
183pub const OP_BOOLOR: u8 = 0x9b;
184pub const OP_NUMEQUAL: u8 = 0x9c;
185pub const OP_NUMEQUALVERIFY: u8 = 0x9d;
186pub const OP_NUMNOTEQUAL: u8 = 0x9e;
187pub const OP_LESSTHAN: u8 = 0x9f;
188pub const OP_GREATERTHAN: u8 = 0xa0;
189pub const OP_LESSTHANOREQUAL: u8 = 0xa1;
190pub const OP_GREATERTHANOREQUAL: u8 = 0xa2;
191pub const OP_MIN: u8 = 0xa3;
192pub const OP_MAX: u8 = 0xa4;
193pub const OP_WITHIN: u8 = 0xa5;
194
195pub const OP_RIPEMD160: u8 = 0xa6;
197pub const OP_SHA1: u8 = 0xa7;
198pub const OP_SHA256: u8 = 0xa8;
199pub const OP_HASH160: u8 = 0xa9;
200pub const OP_HASH256: u8 = 0xaa;
201pub const OP_CODESEPARATOR: u8 = 0xab;
202pub const OP_CHECKSIG: u8 = 0xac;
203pub const OP_CHECKSIGVERIFY: u8 = 0xad;
204pub const OP_CHECKMULTISIG: u8 = 0xae;
205pub const OP_CHECKMULTISIGVERIFY: u8 = 0xaf;
206
207pub const OP_NOP1: u8 = 0xb0;
209pub const OP_NOP2: u8 = 0xb1;
210pub const OP_NOP3: u8 = 0xb2;
211pub const OP_NOP4: u8 = 0xb3;
212pub const OP_NOP5: u8 = 0xb4;
213pub const OP_NOP6: u8 = 0xb5;
214pub const OP_NOP7: u8 = 0xb6;
215pub const OP_NOP8: u8 = 0xb7;
216pub const OP_NOP9: u8 = 0xb8;
217pub const OP_NOP10: u8 = 0xb9;
218pub const OP_NOP11: u8 = 0xba;
219pub const OP_NOP12: u8 = 0xbb;
220pub const OP_NOP13: u8 = 0xbc;
221pub const OP_NOP14: u8 = 0xbd;
222pub const OP_NOP15: u8 = 0xbe;
223pub const OP_NOP16: u8 = 0xbf;
224pub const OP_NOP17: u8 = 0xc0;
225pub const OP_NOP18: u8 = 0xc1;
226pub const OP_NOP19: u8 = 0xc2;
227pub const OP_NOP20: u8 = 0xc3;
228pub const OP_NOP21: u8 = 0xc4;
229pub const OP_NOP22: u8 = 0xc5;
230pub const OP_NOP23: u8 = 0xc6;
231pub const OP_NOP24: u8 = 0xc7;
232pub const OP_NOP25: u8 = 0xc8;
233pub const OP_NOP26: u8 = 0xc9;
234pub const OP_NOP27: u8 = 0xca;
235pub const OP_NOP28: u8 = 0xcb;
236pub const OP_NOP29: u8 = 0xcc;
237pub const OP_NOP30: u8 = 0xcd;
238pub const OP_NOP31: u8 = 0xce;
239pub const OP_NOP32: u8 = 0xcf;
240pub const OP_NOP33: u8 = 0xd0;
241pub const OP_NOP34: u8 = 0xd1;
242pub const OP_NOP35: u8 = 0xd2;
243pub const OP_NOP36: u8 = 0xd3;
244pub const OP_NOP37: u8 = 0xd4;
245pub const OP_NOP38: u8 = 0xd5;
246pub const OP_NOP39: u8 = 0xd6;
247pub const OP_NOP40: u8 = 0xd7;
248pub const OP_NOP41: u8 = 0xd8;
249pub const OP_NOP42: u8 = 0xd9;
250pub const OP_NOP43: u8 = 0xda;
251pub const OP_NOP44: u8 = 0xdb;
252pub const OP_NOP45: u8 = 0xdc;
253pub const OP_NOP46: u8 = 0xdd;
254pub const OP_NOP47: u8 = 0xde;
255pub const OP_NOP48: u8 = 0xdf;
256pub const OP_NOP49: u8 = 0xe0;
257pub const OP_NOP50: u8 = 0xe1;
258pub const OP_NOP51: u8 = 0xe2;
259pub const OP_NOP52: u8 = 0xe3;
260pub const OP_NOP53: u8 = 0xe4;
261pub const OP_NOP54: u8 = 0xe5;
262pub const OP_NOP55: u8 = 0xe6;
263pub const OP_NOP56: u8 = 0xe7;
264pub const OP_NOP57: u8 = 0xe8;
265pub const OP_NOP58: u8 = 0xe9;
266pub const OP_NOP59: u8 = 0xea;
267pub const OP_NOP60: u8 = 0xeb;
268pub const OP_NOP61: u8 = 0xec;
269pub const OP_NOP62: u8 = 0xed;
270pub const OP_NOP63: u8 = 0xee;
271pub const OP_NOP64: u8 = 0xef;
272pub const OP_NOP65: u8 = 0xf0;
273pub const OP_NOP66: u8 = 0xf1;
274pub const OP_NOP67: u8 = 0xf2;
275pub const OP_NOP68: u8 = 0xf3;
276pub const OP_NOP69: u8 = 0xf4;
277pub const OP_NOP70: u8 = 0xf5;
278pub const OP_NOP71: u8 = 0xf6;
279pub const OP_NOP72: u8 = 0xf7;
280pub const OP_NOP73: u8 = 0xf8;
281pub const OP_NOP77: u8 = 0xfc;
282
283pub const OP_SMALLDATA: u8 = 0xf9;
285pub const OP_SMALLINTEGER: u8 = 0xfa;
286pub const OP_PUBKEYS: u8 = 0xfb;
287pub const OP_PUBKEYHASH: u8 = 0xfd;
288pub const OP_PUBKEY: u8 = 0xfe;
289
290pub const OP_INVALIDOPCODE: u8 = 0xff;
291
292static OP_NAME_TO_VALUE: LazyLock<HashMap<&'static str, u8>> = LazyLock::new(|| {
294 let mut m = HashMap::new();
295 m.insert("OP_FALSE", OP_FALSE);
297 m.insert("OP_0", OP_0);
298
299 m.insert("OP_DATA_1", OP_DATA_1);
301 m.insert("OP_DATA_2", OP_DATA_2);
302 m.insert("OP_DATA_3", OP_DATA_3);
303 m.insert("OP_DATA_4", OP_DATA_4);
304 m.insert("OP_DATA_5", OP_DATA_5);
305 m.insert("OP_DATA_6", OP_DATA_6);
306 m.insert("OP_DATA_7", OP_DATA_7);
307 m.insert("OP_DATA_8", OP_DATA_8);
308 m.insert("OP_DATA_9", OP_DATA_9);
309 m.insert("OP_DATA_10", OP_DATA_10);
310 m.insert("OP_DATA_11", OP_DATA_11);
311 m.insert("OP_DATA_12", OP_DATA_12);
312 m.insert("OP_DATA_13", OP_DATA_13);
313 m.insert("OP_DATA_14", OP_DATA_14);
314 m.insert("OP_DATA_15", OP_DATA_15);
315 m.insert("OP_DATA_16", OP_DATA_16);
316 m.insert("OP_DATA_17", OP_DATA_17);
317 m.insert("OP_DATA_18", OP_DATA_18);
318 m.insert("OP_DATA_19", OP_DATA_19);
319 m.insert("OP_DATA_20", OP_DATA_20);
320 m.insert("OP_DATA_21", OP_DATA_21);
321 m.insert("OP_DATA_22", OP_DATA_22);
322 m.insert("OP_DATA_23", OP_DATA_23);
323 m.insert("OP_DATA_24", OP_DATA_24);
324 m.insert("OP_DATA_25", OP_DATA_25);
325 m.insert("OP_DATA_26", OP_DATA_26);
326 m.insert("OP_DATA_27", OP_DATA_27);
327 m.insert("OP_DATA_28", OP_DATA_28);
328 m.insert("OP_DATA_29", OP_DATA_29);
329 m.insert("OP_DATA_30", OP_DATA_30);
330 m.insert("OP_DATA_31", OP_DATA_31);
331 m.insert("OP_DATA_32", OP_DATA_32);
332 m.insert("OP_DATA_33", OP_DATA_33);
333 m.insert("OP_DATA_34", OP_DATA_34);
334 m.insert("OP_DATA_35", OP_DATA_35);
335 m.insert("OP_DATA_36", OP_DATA_36);
336 m.insert("OP_DATA_37", OP_DATA_37);
337 m.insert("OP_DATA_38", OP_DATA_38);
338 m.insert("OP_DATA_39", OP_DATA_39);
339 m.insert("OP_DATA_40", OP_DATA_40);
340 m.insert("OP_DATA_41", OP_DATA_41);
341 m.insert("OP_DATA_42", OP_DATA_42);
342 m.insert("OP_DATA_43", OP_DATA_43);
343 m.insert("OP_DATA_44", OP_DATA_44);
344 m.insert("OP_DATA_45", OP_DATA_45);
345 m.insert("OP_DATA_46", OP_DATA_46);
346 m.insert("OP_DATA_47", OP_DATA_47);
347 m.insert("OP_DATA_48", OP_DATA_48);
348 m.insert("OP_DATA_49", OP_DATA_49);
349 m.insert("OP_DATA_50", OP_DATA_50);
350 m.insert("OP_DATA_51", OP_DATA_51);
351 m.insert("OP_DATA_52", OP_DATA_52);
352 m.insert("OP_DATA_53", OP_DATA_53);
353 m.insert("OP_DATA_54", OP_DATA_54);
354 m.insert("OP_DATA_55", OP_DATA_55);
355 m.insert("OP_DATA_56", OP_DATA_56);
356 m.insert("OP_DATA_57", OP_DATA_57);
357 m.insert("OP_DATA_58", OP_DATA_58);
358 m.insert("OP_DATA_59", OP_DATA_59);
359 m.insert("OP_DATA_60", OP_DATA_60);
360 m.insert("OP_DATA_61", OP_DATA_61);
361 m.insert("OP_DATA_62", OP_DATA_62);
362 m.insert("OP_DATA_63", OP_DATA_63);
363 m.insert("OP_DATA_64", OP_DATA_64);
364 m.insert("OP_DATA_65", OP_DATA_65);
365 m.insert("OP_DATA_66", OP_DATA_66);
366 m.insert("OP_DATA_67", OP_DATA_67);
367 m.insert("OP_DATA_68", OP_DATA_68);
368 m.insert("OP_DATA_69", OP_DATA_69);
369 m.insert("OP_DATA_70", OP_DATA_70);
370 m.insert("OP_DATA_71", OP_DATA_71);
371 m.insert("OP_DATA_72", OP_DATA_72);
372 m.insert("OP_DATA_73", OP_DATA_73);
373 m.insert("OP_DATA_74", OP_DATA_74);
374 m.insert("OP_DATA_75", OP_DATA_75);
375
376 m.insert("OP_PUSHDATA1", OP_PUSHDATA1);
377 m.insert("OP_PUSHDATA2", OP_PUSHDATA2);
378 m.insert("OP_PUSHDATA4", OP_PUSHDATA4);
379 m.insert("OP_1NEGATE", OP_1NEGATE);
380 m.insert("OP_RESERVED", OP_RESERVED);
381 m.insert("OP_TRUE", OP_TRUE);
382 m.insert("OP_1", OP_1);
383 m.insert("OP_2", OP_2);
384 m.insert("OP_3", OP_3);
385 m.insert("OP_4", OP_4);
386 m.insert("OP_5", OP_5);
387 m.insert("OP_6", OP_6);
388 m.insert("OP_7", OP_7);
389 m.insert("OP_8", OP_8);
390 m.insert("OP_9", OP_9);
391 m.insert("OP_10", OP_10);
392 m.insert("OP_11", OP_11);
393 m.insert("OP_12", OP_12);
394 m.insert("OP_13", OP_13);
395 m.insert("OP_14", OP_14);
396 m.insert("OP_15", OP_15);
397 m.insert("OP_16", OP_16);
398
399 m.insert("OP_NOP", OP_NOP);
401 m.insert("OP_VER", OP_VER);
402 m.insert("OP_IF", OP_IF);
403 m.insert("OP_NOTIF", OP_NOTIF);
404 m.insert("OP_VERIF", OP_VERIF);
405 m.insert("OP_VERNOTIF", OP_VERNOTIF);
406 m.insert("OP_ELSE", OP_ELSE);
407 m.insert("OP_ENDIF", OP_ENDIF);
408 m.insert("OP_VERIFY", OP_VERIFY);
409 m.insert("OP_RETURN", OP_RETURN);
410
411 m.insert("OP_TOALTSTACK", OP_TOALTSTACK);
413 m.insert("OP_FROMALTSTACK", OP_FROMALTSTACK);
414 m.insert("OP_2DROP", OP_2DROP);
415 m.insert("OP_2DUP", OP_2DUP);
416 m.insert("OP_3DUP", OP_3DUP);
417 m.insert("OP_2OVER", OP_2OVER);
418 m.insert("OP_2ROT", OP_2ROT);
419 m.insert("OP_2SWAP", OP_2SWAP);
420 m.insert("OP_IFDUP", OP_IFDUP);
421 m.insert("OP_DEPTH", OP_DEPTH);
422 m.insert("OP_DROP", OP_DROP);
423 m.insert("OP_DUP", OP_DUP);
424 m.insert("OP_NIP", OP_NIP);
425 m.insert("OP_OVER", OP_OVER);
426 m.insert("OP_PICK", OP_PICK);
427 m.insert("OP_ROLL", OP_ROLL);
428 m.insert("OP_ROT", OP_ROT);
429 m.insert("OP_SWAP", OP_SWAP);
430 m.insert("OP_TUCK", OP_TUCK);
431
432 m.insert("OP_CAT", OP_CAT);
434 m.insert("OP_SUBSTR", OP_SUBSTR);
435 m.insert("OP_SPLIT", OP_SPLIT);
436 m.insert("OP_LEFT", OP_LEFT);
437 m.insert("OP_NUM2BIN", OP_NUM2BIN);
438 m.insert("OP_RIGHT", OP_RIGHT);
439 m.insert("OP_BIN2NUM", OP_BIN2NUM);
440 m.insert("OP_SIZE", OP_SIZE);
441
442 m.insert("OP_INVERT", OP_INVERT);
444 m.insert("OP_AND", OP_AND);
445 m.insert("OP_OR", OP_OR);
446 m.insert("OP_XOR", OP_XOR);
447 m.insert("OP_EQUAL", OP_EQUAL);
448 m.insert("OP_EQUALVERIFY", OP_EQUALVERIFY);
449 m.insert("OP_RESERVED1", OP_RESERVED1);
450 m.insert("OP_RESERVED2", OP_RESERVED2);
451
452 m.insert("OP_1ADD", OP_1ADD);
454 m.insert("OP_1SUB", OP_1SUB);
455 m.insert("OP_2MUL", OP_2MUL);
456 m.insert("OP_2DIV", OP_2DIV);
457 m.insert("OP_NEGATE", OP_NEGATE);
458 m.insert("OP_ABS", OP_ABS);
459 m.insert("OP_NOT", OP_NOT);
460 m.insert("OP_0NOTEQUAL", OP_0NOTEQUAL);
461 m.insert("OP_ADD", OP_ADD);
462 m.insert("OP_SUB", OP_SUB);
463 m.insert("OP_MUL", OP_MUL);
464 m.insert("OP_DIV", OP_DIV);
465 m.insert("OP_MOD", OP_MOD);
466 m.insert("OP_LSHIFT", OP_LSHIFT);
467 m.insert("OP_RSHIFT", OP_RSHIFT);
468 m.insert("OP_BOOLAND", OP_BOOLAND);
469 m.insert("OP_BOOLOR", OP_BOOLOR);
470 m.insert("OP_NUMEQUAL", OP_NUMEQUAL);
471 m.insert("OP_NUMEQUALVERIFY", OP_NUMEQUALVERIFY);
472 m.insert("OP_NUMNOTEQUAL", OP_NUMNOTEQUAL);
473 m.insert("OP_LESSTHAN", OP_LESSTHAN);
474 m.insert("OP_GREATERTHAN", OP_GREATERTHAN);
475 m.insert("OP_LESSTHANOREQUAL", OP_LESSTHANOREQUAL);
476 m.insert("OP_GREATERTHANOREQUAL", OP_GREATERTHANOREQUAL);
477 m.insert("OP_MIN", OP_MIN);
478 m.insert("OP_MAX", OP_MAX);
479 m.insert("OP_WITHIN", OP_WITHIN);
480
481 m.insert("OP_RIPEMD160", OP_RIPEMD160);
483 m.insert("OP_SHA1", OP_SHA1);
484 m.insert("OP_SHA256", OP_SHA256);
485 m.insert("OP_HASH160", OP_HASH160);
486 m.insert("OP_HASH256", OP_HASH256);
487 m.insert("OP_CODESEPARATOR", OP_CODESEPARATOR);
488 m.insert("OP_CHECKSIG", OP_CHECKSIG);
489 m.insert("OP_CHECKSIGVERIFY", OP_CHECKSIGVERIFY);
490 m.insert("OP_CHECKMULTISIG", OP_CHECKMULTISIG);
491 m.insert("OP_CHECKMULTISIGVERIFY", OP_CHECKMULTISIGVERIFY);
492
493 m.insert("OP_NOP1", OP_NOP1);
495 m.insert("OP_NOP2", OP_NOP2);
496 m.insert("OP_NOP3", OP_NOP3);
497 m.insert("OP_NOP4", OP_NOP4);
498 m.insert("OP_NOP5", OP_NOP5);
499 m.insert("OP_NOP6", OP_NOP6);
500 m.insert("OP_NOP7", OP_NOP7);
501 m.insert("OP_NOP8", OP_NOP8);
502 m.insert("OP_NOP9", OP_NOP9);
503 m.insert("OP_NOP10", OP_NOP10);
504 m.insert("OP_NOP11", OP_NOP11);
505 m.insert("OP_NOP12", OP_NOP12);
506 m.insert("OP_NOP13", OP_NOP13);
507 m.insert("OP_NOP14", OP_NOP14);
508 m.insert("OP_NOP15", OP_NOP15);
509 m.insert("OP_NOP16", OP_NOP16);
510 m.insert("OP_NOP17", OP_NOP17);
511 m.insert("OP_NOP18", OP_NOP18);
512 m.insert("OP_NOP19", OP_NOP19);
513 m.insert("OP_NOP20", OP_NOP20);
514 m.insert("OP_NOP21", OP_NOP21);
515 m.insert("OP_NOP22", OP_NOP22);
516 m.insert("OP_NOP23", OP_NOP23);
517 m.insert("OP_NOP24", OP_NOP24);
518 m.insert("OP_NOP25", OP_NOP25);
519 m.insert("OP_NOP26", OP_NOP26);
520 m.insert("OP_NOP27", OP_NOP27);
521 m.insert("OP_NOP28", OP_NOP28);
522 m.insert("OP_NOP29", OP_NOP29);
523 m.insert("OP_NOP30", OP_NOP30);
524 m.insert("OP_NOP31", OP_NOP31);
525 m.insert("OP_NOP32", OP_NOP32);
526 m.insert("OP_NOP33", OP_NOP33);
527 m.insert("OP_NOP34", OP_NOP34);
528 m.insert("OP_NOP35", OP_NOP35);
529 m.insert("OP_NOP36", OP_NOP36);
530 m.insert("OP_NOP37", OP_NOP37);
531 m.insert("OP_NOP38", OP_NOP38);
532 m.insert("OP_NOP39", OP_NOP39);
533 m.insert("OP_NOP40", OP_NOP40);
534 m.insert("OP_NOP41", OP_NOP41);
535 m.insert("OP_NOP42", OP_NOP42);
536 m.insert("OP_NOP43", OP_NOP43);
537 m.insert("OP_NOP44", OP_NOP44);
538 m.insert("OP_NOP45", OP_NOP45);
539 m.insert("OP_NOP46", OP_NOP46);
540 m.insert("OP_NOP47", OP_NOP47);
541 m.insert("OP_NOP48", OP_NOP48);
542 m.insert("OP_NOP49", OP_NOP49);
543 m.insert("OP_NOP50", OP_NOP50);
544 m.insert("OP_NOP51", OP_NOP51);
545 m.insert("OP_NOP52", OP_NOP52);
546 m.insert("OP_NOP53", OP_NOP53);
547 m.insert("OP_NOP54", OP_NOP54);
548 m.insert("OP_NOP55", OP_NOP55);
549 m.insert("OP_NOP56", OP_NOP56);
550 m.insert("OP_NOP57", OP_NOP57);
551 m.insert("OP_NOP58", OP_NOP58);
552 m.insert("OP_NOP59", OP_NOP59);
553 m.insert("OP_NOP60", OP_NOP60);
554 m.insert("OP_NOP61", OP_NOP61);
555 m.insert("OP_NOP62", OP_NOP62);
556 m.insert("OP_NOP63", OP_NOP63);
557 m.insert("OP_NOP64", OP_NOP64);
558 m.insert("OP_NOP65", OP_NOP65);
559 m.insert("OP_NOP66", OP_NOP66);
560 m.insert("OP_NOP67", OP_NOP67);
561 m.insert("OP_NOP68", OP_NOP68);
562 m.insert("OP_NOP69", OP_NOP69);
563 m.insert("OP_NOP70", OP_NOP70);
564 m.insert("OP_NOP71", OP_NOP71);
565 m.insert("OP_NOP72", OP_NOP72);
566 m.insert("OP_NOP73", OP_NOP73);
567 m.insert("OP_NOP77", OP_NOP77);
568
569 m.insert("OP_SMALLDATA", OP_SMALLDATA);
571 m.insert("OP_SMALLINTEGER", OP_SMALLINTEGER);
572 m.insert("OP_PUBKEYS", OP_PUBKEYS);
573 m.insert("OP_PUBKEYHASH", OP_PUBKEYHASH);
574 m.insert("OP_PUBKEY", OP_PUBKEY);
575 m.insert("OP_INVALIDOPCODE", OP_INVALIDOPCODE);
576
577 m
578});
579
580static OP_VALUE_TO_NAME: LazyLock<HashMap<u8, &'static str>> = LazyLock::new(|| {
582 let mut m = HashMap::new();
583 m.insert(OP_FALSE, "OP_0");
584 m.insert(OP_PUSHDATA1, "OP_PUSHDATA1");
585 m.insert(OP_PUSHDATA2, "OP_PUSHDATA2");
586 m.insert(OP_PUSHDATA4, "OP_PUSHDATA4");
587 m.insert(OP_1NEGATE, "OP_1NEGATE");
588 m.insert(OP_RESERVED, "OP_RESERVED");
589 m.insert(OP_1, "OP_1");
590 m.insert(OP_2, "OP_2");
591 m.insert(OP_3, "OP_3");
592 m.insert(OP_4, "OP_4");
593 m.insert(OP_5, "OP_5");
594 m.insert(OP_6, "OP_6");
595 m.insert(OP_7, "OP_7");
596 m.insert(OP_8, "OP_8");
597 m.insert(OP_9, "OP_9");
598 m.insert(OP_10, "OP_10");
599 m.insert(OP_11, "OP_11");
600 m.insert(OP_12, "OP_12");
601 m.insert(OP_13, "OP_13");
602 m.insert(OP_14, "OP_14");
603 m.insert(OP_15, "OP_15");
604 m.insert(OP_16, "OP_16");
605
606 m.insert(OP_NOP, "OP_NOP");
608 m.insert(OP_VER, "OP_VER");
609 m.insert(OP_IF, "OP_IF");
610 m.insert(OP_NOTIF, "OP_NOTIF");
611 m.insert(OP_VERIF, "OP_VERIF");
612 m.insert(OP_VERNOTIF, "OP_VERNOTIF");
613 m.insert(OP_ELSE, "OP_ELSE");
614 m.insert(OP_ENDIF, "OP_ENDIF");
615 m.insert(OP_VERIFY, "OP_VERIFY");
616 m.insert(OP_RETURN, "OP_RETURN");
617
618 m.insert(OP_TOALTSTACK, "OP_TOALTSTACK");
620 m.insert(OP_FROMALTSTACK, "OP_FROMALTSTACK");
621 m.insert(OP_2DROP, "OP_2DROP");
622 m.insert(OP_2DUP, "OP_2DUP");
623 m.insert(OP_3DUP, "OP_3DUP");
624 m.insert(OP_2OVER, "OP_2OVER");
625 m.insert(OP_2ROT, "OP_2ROT");
626 m.insert(OP_2SWAP, "OP_2SWAP");
627 m.insert(OP_IFDUP, "OP_IFDUP");
628 m.insert(OP_DEPTH, "OP_DEPTH");
629 m.insert(OP_DROP, "OP_DROP");
630 m.insert(OP_DUP, "OP_DUP");
631 m.insert(OP_NIP, "OP_NIP");
632 m.insert(OP_OVER, "OP_OVER");
633 m.insert(OP_PICK, "OP_PICK");
634 m.insert(OP_ROLL, "OP_ROLL");
635 m.insert(OP_ROT, "OP_ROT");
636 m.insert(OP_SWAP, "OP_SWAP");
637 m.insert(OP_TUCK, "OP_TUCK");
638
639 m.insert(OP_CAT, "OP_CAT");
641 m.insert(OP_SPLIT, "OP_SPLIT");
642 m.insert(OP_NUM2BIN, "OP_NUM2BIN");
643 m.insert(OP_BIN2NUM, "OP_BIN2NUM");
644 m.insert(OP_SIZE, "OP_SIZE");
645
646 m.insert(OP_INVERT, "OP_INVERT");
648 m.insert(OP_AND, "OP_AND");
649 m.insert(OP_OR, "OP_OR");
650 m.insert(OP_XOR, "OP_XOR");
651 m.insert(OP_EQUAL, "OP_EQUAL");
652 m.insert(OP_EQUALVERIFY, "OP_EQUALVERIFY");
653 m.insert(OP_RESERVED1, "OP_RESERVED1");
654 m.insert(OP_RESERVED2, "OP_RESERVED2");
655
656 m.insert(OP_1ADD, "OP_1ADD");
658 m.insert(OP_1SUB, "OP_1SUB");
659 m.insert(OP_2MUL, "OP_2MUL");
660 m.insert(OP_2DIV, "OP_2DIV");
661 m.insert(OP_NEGATE, "OP_NEGATE");
662 m.insert(OP_ABS, "OP_ABS");
663 m.insert(OP_NOT, "OP_NOT");
664 m.insert(OP_0NOTEQUAL, "OP_0NOTEQUAL");
665 m.insert(OP_ADD, "OP_ADD");
666 m.insert(OP_SUB, "OP_SUB");
667 m.insert(OP_MUL, "OP_MUL");
668 m.insert(OP_DIV, "OP_DIV");
669 m.insert(OP_MOD, "OP_MOD");
670 m.insert(OP_LSHIFT, "OP_LSHIFT");
671 m.insert(OP_RSHIFT, "OP_RSHIFT");
672 m.insert(OP_BOOLAND, "OP_BOOLAND");
673 m.insert(OP_BOOLOR, "OP_BOOLOR");
674 m.insert(OP_NUMEQUAL, "OP_NUMEQUAL");
675 m.insert(OP_NUMEQUALVERIFY, "OP_NUMEQUALVERIFY");
676 m.insert(OP_NUMNOTEQUAL, "OP_NUMNOTEQUAL");
677 m.insert(OP_LESSTHAN, "OP_LESSTHAN");
678 m.insert(OP_GREATERTHAN, "OP_GREATERTHAN");
679 m.insert(OP_LESSTHANOREQUAL, "OP_LESSTHANOREQUAL");
680 m.insert(OP_GREATERTHANOREQUAL, "OP_GREATERTHANOREQUAL");
681 m.insert(OP_MIN, "OP_MIN");
682 m.insert(OP_MAX, "OP_MAX");
683 m.insert(OP_WITHIN, "OP_WITHIN");
684
685 m.insert(OP_RIPEMD160, "OP_RIPEMD160");
687 m.insert(OP_SHA1, "OP_SHA1");
688 m.insert(OP_SHA256, "OP_SHA256");
689 m.insert(OP_HASH160, "OP_HASH160");
690 m.insert(OP_HASH256, "OP_HASH256");
691 m.insert(OP_CODESEPARATOR, "OP_CODESEPARATOR");
692 m.insert(OP_CHECKSIG, "OP_CHECKSIG");
693 m.insert(OP_CHECKSIGVERIFY, "OP_CHECKSIGVERIFY");
694 m.insert(OP_CHECKMULTISIG, "OP_CHECKMULTISIG");
695 m.insert(OP_CHECKMULTISIGVERIFY, "OP_CHECKMULTISIGVERIFY");
696
697 m.insert(OP_NOP1, "OP_NOP1");
699 m.insert(OP_NOP2, "OP_NOP2");
700 m.insert(OP_NOP3, "OP_NOP3");
701 m.insert(OP_NOP4, "OP_NOP4");
702 m.insert(OP_NOP5, "OP_NOP5");
703 m.insert(OP_NOP6, "OP_NOP6");
704 m.insert(OP_NOP7, "OP_NOP7");
705 m.insert(OP_NOP8, "OP_NOP8");
706 m.insert(OP_NOP9, "OP_NOP9");
707 m.insert(OP_NOP10, "OP_NOP10");
708 m.insert(OP_NOP11, "OP_NOP11");
709 m.insert(OP_NOP12, "OP_NOP12");
710 m.insert(OP_NOP13, "OP_NOP13");
711 m.insert(OP_NOP14, "OP_NOP14");
712 m.insert(OP_NOP15, "OP_NOP15");
713 m.insert(OP_NOP16, "OP_NOP16");
714 m.insert(OP_NOP17, "OP_NOP17");
715 m.insert(OP_NOP18, "OP_NOP18");
716 m.insert(OP_NOP19, "OP_NOP19");
717 m.insert(OP_NOP20, "OP_NOP20");
718 m.insert(OP_NOP21, "OP_NOP21");
719 m.insert(OP_NOP22, "OP_NOP22");
720 m.insert(OP_NOP23, "OP_NOP23");
721 m.insert(OP_NOP24, "OP_NOP24");
722 m.insert(OP_NOP25, "OP_NOP25");
723 m.insert(OP_NOP26, "OP_NOP26");
724 m.insert(OP_NOP27, "OP_NOP27");
725 m.insert(OP_NOP28, "OP_NOP28");
726 m.insert(OP_NOP29, "OP_NOP29");
727 m.insert(OP_NOP30, "OP_NOP30");
728 m.insert(OP_NOP31, "OP_NOP31");
729 m.insert(OP_NOP32, "OP_NOP32");
730 m.insert(OP_NOP33, "OP_NOP33");
731 m.insert(OP_NOP34, "OP_NOP34");
732 m.insert(OP_NOP35, "OP_NOP35");
733 m.insert(OP_NOP36, "OP_NOP36");
734 m.insert(OP_NOP37, "OP_NOP37");
735 m.insert(OP_NOP38, "OP_NOP38");
736 m.insert(OP_NOP39, "OP_NOP39");
737 m.insert(OP_NOP40, "OP_NOP40");
738 m.insert(OP_NOP41, "OP_NOP41");
739 m.insert(OP_NOP42, "OP_NOP42");
740 m.insert(OP_NOP43, "OP_NOP43");
741 m.insert(OP_NOP44, "OP_NOP44");
742 m.insert(OP_NOP45, "OP_NOP45");
743 m.insert(OP_NOP46, "OP_NOP46");
744 m.insert(OP_NOP47, "OP_NOP47");
745 m.insert(OP_NOP48, "OP_NOP48");
746 m.insert(OP_NOP49, "OP_NOP49");
747 m.insert(OP_NOP50, "OP_NOP50");
748 m.insert(OP_NOP51, "OP_NOP51");
749 m.insert(OP_NOP52, "OP_NOP52");
750 m.insert(OP_NOP53, "OP_NOP53");
751 m.insert(OP_NOP54, "OP_NOP54");
752 m.insert(OP_NOP55, "OP_NOP55");
753 m.insert(OP_NOP56, "OP_NOP56");
754 m.insert(OP_NOP57, "OP_NOP57");
755 m.insert(OP_NOP58, "OP_NOP58");
756 m.insert(OP_NOP59, "OP_NOP59");
757 m.insert(OP_NOP60, "OP_NOP60");
758 m.insert(OP_NOP61, "OP_NOP61");
759 m.insert(OP_NOP62, "OP_NOP62");
760 m.insert(OP_NOP63, "OP_NOP63");
761 m.insert(OP_NOP64, "OP_NOP64");
762 m.insert(OP_NOP65, "OP_NOP65");
763 m.insert(OP_NOP66, "OP_NOP66");
764 m.insert(OP_NOP67, "OP_NOP67");
765 m.insert(OP_NOP68, "OP_NOP68");
766 m.insert(OP_NOP69, "OP_NOP69");
767 m.insert(OP_NOP70, "OP_NOP70");
768 m.insert(OP_NOP71, "OP_NOP71");
769 m.insert(OP_NOP72, "OP_NOP72");
770 m.insert(OP_NOP73, "OP_NOP73");
771 m.insert(OP_NOP77, "OP_NOP77");
772
773 m.insert(OP_SMALLDATA, "OP_SMALLDATA");
775 m.insert(OP_SMALLINTEGER, "OP_SMALLINTEGER");
776 m.insert(OP_PUBKEYS, "OP_PUBKEYS");
777 m.insert(OP_PUBKEYHASH, "OP_PUBKEYHASH");
778 m.insert(OP_PUBKEY, "OP_PUBKEY");
779 m.insert(OP_INVALIDOPCODE, "OP_INVALIDOPCODE");
780
781 m
782});
783
784pub fn name_to_opcode(name: &str) -> Option<u8> {
786 OP_NAME_TO_VALUE.get(name).copied()
787}
788
789pub fn opcode_to_name(op: u8) -> Option<&'static str> {
791 OP_VALUE_TO_NAME.get(&op).copied()
792}
793
794#[cfg(test)]
795mod tests {
796 use super::*;
797
798 #[test]
799 fn test_opcode_values() {
800 assert_eq!(OP_FALSE, 0x00);
801 assert_eq!(OP_0, 0x00);
802 assert_eq!(OP_TRUE, 0x51);
803 assert_eq!(OP_1, 0x51);
804 assert_eq!(OP_16, 0x60);
805 assert_eq!(OP_DUP, 0x76);
806 assert_eq!(OP_HASH160, 0xa9);
807 assert_eq!(OP_CHECKSIG, 0xac);
808 assert_eq!(OP_RETURN, 0x6a);
809 assert_eq!(OP_EQUAL, 0x87);
810 assert_eq!(OP_EQUALVERIFY, 0x88);
811 }
812
813 #[test]
814 fn test_name_to_opcode() {
815 assert_eq!(name_to_opcode("OP_DUP"), Some(0x76));
816 assert_eq!(name_to_opcode("OP_HASH160"), Some(0xa9));
817 assert_eq!(name_to_opcode("OP_CHECKSIG"), Some(0xac));
818 assert_eq!(name_to_opcode("OP_0"), Some(0x00));
819 assert_eq!(name_to_opcode("OP_FALSE"), Some(0x00));
820 assert_eq!(name_to_opcode("OP_1"), Some(0x51));
821 assert_eq!(name_to_opcode("OP_TRUE"), Some(0x51));
822 assert_eq!(name_to_opcode("INVALID"), None);
823 }
824
825 #[test]
826 fn test_opcode_to_name() {
827 assert_eq!(opcode_to_name(0x76), Some("OP_DUP"));
828 assert_eq!(opcode_to_name(0xa9), Some("OP_HASH160"));
829 assert_eq!(opcode_to_name(0xac), Some("OP_CHECKSIG"));
830 assert_eq!(opcode_to_name(0x00), Some("OP_0"));
831 assert_eq!(opcode_to_name(0x51), Some("OP_1"));
832 }
833
834 #[test]
835 fn test_bsv_opcodes() {
836 assert_eq!(OP_CAT, 0x7e);
838 assert_eq!(OP_SPLIT, 0x7f);
839 assert_eq!(OP_NUM2BIN, 0x80);
840 assert_eq!(OP_BIN2NUM, 0x81);
841 assert_eq!(OP_MUL, 0x95);
842 assert_eq!(OP_DIV, 0x96);
843 assert_eq!(OP_MOD, 0x97);
844 }
845
846 #[test]
847 fn test_op_data_constants() {
848 assert_eq!(OP_DATA_1, 0x01);
850 assert_eq!(OP_DATA_75, 0x4b);
851
852 const { assert!(OP_DATA_75 < OP_PUSHDATA1) };
854
855 assert_eq!(name_to_opcode("OP_DATA_1"), Some(0x01));
857 assert_eq!(name_to_opcode("OP_DATA_75"), Some(0x4b));
858 assert_eq!(name_to_opcode("OP_DATA_33"), Some(0x21));
859 }
860}