griffin_core/uplc/
builtins.rs

1use crate::pallas_codec::flat::de;
2use crate::uplc::ast::Term;
3use alloc::{
4    rc::Rc,
5    str::FromStr,
6    string::{String, ToString},
7};
8use core::fmt::Display;
9use strum_macros::EnumIter;
10
11/// All the possible builtin functions in Untyped Plutus Core.
12#[repr(u8)]
13#[allow(non_camel_case_types)]
14#[derive(
15    Debug,
16    Clone,
17    PartialEq,
18    Eq,
19    Copy,
20    EnumIter,
21    serde::Serialize,
22    serde::Deserialize,
23    Hash,
24    PartialOrd,
25    Ord,
26)]
27pub enum DefaultFunction {
28    // Integer functions
29    AddInteger = 0,
30    SubtractInteger = 1,
31    MultiplyInteger = 2,
32    DivideInteger = 3,
33    QuotientInteger = 4,
34    RemainderInteger = 5,
35    ModInteger = 6,
36    EqualsInteger = 7,
37    LessThanInteger = 8,
38    LessThanEqualsInteger = 9,
39    // ByteString functions
40    AppendByteString = 10,
41    ConsByteString = 11,
42    SliceByteString = 12,
43    LengthOfByteString = 13,
44    IndexByteString = 14,
45    EqualsByteString = 15,
46    LessThanByteString = 16,
47    LessThanEqualsByteString = 17,
48    // Cryptography and hash functions
49    Sha2_256 = 18,
50    Sha3_256 = 19,
51    Blake2b_256 = 20,
52    Keccak_256 = 71,
53    Blake2b_224 = 72,
54    VerifyEd25519Signature = 21,
55    VerifyEcdsaSecp256k1Signature = 52,
56    VerifySchnorrSecp256k1Signature = 53,
57    // String functions
58    AppendString = 22,
59    EqualsString = 23,
60    EncodeUtf8 = 24,
61    DecodeUtf8 = 25,
62    // Bool function
63    IfThenElse = 26,
64    // Unit function
65    ChooseUnit = 27,
66    // Tracing function
67    Trace = 28,
68    // Pairs functions
69    FstPair = 29,
70    SndPair = 30,
71    // List functions
72    ChooseList = 31,
73    MkCons = 32,
74    HeadList = 33,
75    TailList = 34,
76    NullList = 35,
77    // Data functions
78    // It is convenient to have a "choosing" function for a data type that has more than two
79    // constructors to get pattern matching over it and we may end up having multiple such data
80    // types, hence we include the name of the data type as a suffix.
81    ChooseData = 36,
82    ConstrData = 37,
83    MapData = 38,
84    ListData = 39,
85    IData = 40,
86    BData = 41,
87    UnConstrData = 42,
88    UnMapData = 43,
89    UnListData = 44,
90    UnIData = 45,
91    UnBData = 46,
92    EqualsData = 47,
93    SerialiseData = 51,
94    // Misc constructors
95    // Constructors that we need for constructing e.g. Data. Polymorphic builtin
96    // constructors are often problematic (See note [Representable built-in
97    // functions over polymorphic built-in types])
98    MkPairData = 48,
99    MkNilData = 49,
100    MkNilPairData = 50,
101
102    // BLS Builtins
103    Bls12_381_G1_Add = 54,
104    Bls12_381_G1_Neg = 55,
105    Bls12_381_G1_ScalarMul = 56,
106    Bls12_381_G1_Equal = 57,
107    Bls12_381_G1_Compress = 58,
108    Bls12_381_G1_Uncompress = 59,
109    Bls12_381_G1_HashToGroup = 60,
110    Bls12_381_G2_Add = 61,
111    Bls12_381_G2_Neg = 62,
112    Bls12_381_G2_ScalarMul = 63,
113    Bls12_381_G2_Equal = 64,
114    Bls12_381_G2_Compress = 65,
115    Bls12_381_G2_Uncompress = 66,
116    Bls12_381_G2_HashToGroup = 67,
117    Bls12_381_MillerLoop = 68,
118    Bls12_381_MulMlResult = 69,
119    Bls12_381_FinalVerify = 70,
120
121    // Conversions
122    IntegerToByteString = 73,
123    ByteStringToInteger = 74,
124    // Logical
125    AndByteString = 75,
126    OrByteString = 76,
127    XorByteString = 77,
128    ComplementByteString = 78,
129    ReadBit = 79,
130    WriteBits = 80,
131    ReplicateByte = 81,
132    // Bitwise
133    ShiftByteString = 82,
134    RotateByteString = 83,
135    CountSetBits = 84,
136    FindFirstSetBit = 85,
137    // Ripemd_160
138    Ripemd_160 = 86,
139    // ExpModInteger = 87,
140    // Match
141    // CaseList = 88,
142    // CaseData = 89,
143}
144
145impl TryFrom<u8> for DefaultFunction {
146    type Error = de::Error;
147
148    fn try_from(v: u8) -> Result<Self, Self::Error> {
149        match v {
150            v if v == DefaultFunction::AddInteger as u8 => Ok(DefaultFunction::AddInteger),
151            v if v == DefaultFunction::SubtractInteger as u8 => {
152                Ok(DefaultFunction::SubtractInteger)
153            }
154            v if v == DefaultFunction::MultiplyInteger as u8 => {
155                Ok(DefaultFunction::MultiplyInteger)
156            }
157            v if v == DefaultFunction::DivideInteger as u8 => Ok(DefaultFunction::DivideInteger),
158            v if v == DefaultFunction::QuotientInteger as u8 => {
159                Ok(DefaultFunction::QuotientInteger)
160            }
161            v if v == DefaultFunction::RemainderInteger as u8 => {
162                Ok(DefaultFunction::RemainderInteger)
163            }
164            v if v == DefaultFunction::ModInteger as u8 => Ok(DefaultFunction::ModInteger),
165            v if v == DefaultFunction::EqualsInteger as u8 => Ok(DefaultFunction::EqualsInteger),
166            v if v == DefaultFunction::LessThanInteger as u8 => {
167                Ok(DefaultFunction::LessThanInteger)
168            }
169            v if v == DefaultFunction::LessThanEqualsInteger as u8 => {
170                Ok(DefaultFunction::LessThanEqualsInteger)
171            }
172            // ByteString functions
173            v if v == DefaultFunction::AppendByteString as u8 => {
174                Ok(DefaultFunction::AppendByteString)
175            }
176            v if v == DefaultFunction::ConsByteString as u8 => Ok(DefaultFunction::ConsByteString),
177            v if v == DefaultFunction::SliceByteString as u8 => {
178                Ok(DefaultFunction::SliceByteString)
179            }
180            v if v == DefaultFunction::LengthOfByteString as u8 => {
181                Ok(DefaultFunction::LengthOfByteString)
182            }
183            v if v == DefaultFunction::IndexByteString as u8 => {
184                Ok(DefaultFunction::IndexByteString)
185            }
186            v if v == DefaultFunction::EqualsByteString as u8 => {
187                Ok(DefaultFunction::EqualsByteString)
188            }
189            v if v == DefaultFunction::LessThanByteString as u8 => {
190                Ok(DefaultFunction::LessThanByteString)
191            }
192            v if v == DefaultFunction::LessThanEqualsByteString as u8 => {
193                Ok(DefaultFunction::LessThanEqualsByteString)
194            }
195            // Cryptography and hash functions
196            v if v == DefaultFunction::Sha2_256 as u8 => Ok(DefaultFunction::Sha2_256),
197            v if v == DefaultFunction::Sha3_256 as u8 => Ok(DefaultFunction::Sha3_256),
198            v if v == DefaultFunction::Blake2b_256 as u8 => Ok(DefaultFunction::Blake2b_256),
199            v if v == DefaultFunction::Blake2b_224 as u8 => Ok(DefaultFunction::Blake2b_224),
200            v if v == DefaultFunction::Keccak_256 as u8 => Ok(DefaultFunction::Keccak_256),
201            v if v == DefaultFunction::VerifyEd25519Signature as u8 => {
202                Ok(DefaultFunction::VerifyEd25519Signature)
203            }
204            v if v == DefaultFunction::VerifyEcdsaSecp256k1Signature as u8 => {
205                Ok(DefaultFunction::VerifyEcdsaSecp256k1Signature)
206            }
207            v if v == DefaultFunction::VerifySchnorrSecp256k1Signature as u8 => {
208                Ok(DefaultFunction::VerifySchnorrSecp256k1Signature)
209            }
210            // String functions
211            v if v == DefaultFunction::AppendString as u8 => Ok(DefaultFunction::AppendString),
212            v if v == DefaultFunction::EqualsString as u8 => Ok(DefaultFunction::EqualsString),
213            v if v == DefaultFunction::EncodeUtf8 as u8 => Ok(DefaultFunction::EncodeUtf8),
214            v if v == DefaultFunction::DecodeUtf8 as u8 => Ok(DefaultFunction::DecodeUtf8),
215            // Bool function
216            v if v == DefaultFunction::IfThenElse as u8 => Ok(DefaultFunction::IfThenElse),
217            // Unit function
218            v if v == DefaultFunction::ChooseUnit as u8 => Ok(DefaultFunction::ChooseUnit),
219            // Tracing function
220            v if v == DefaultFunction::Trace as u8 => Ok(DefaultFunction::Trace),
221            // Pairs functions
222            v if v == DefaultFunction::FstPair as u8 => Ok(DefaultFunction::FstPair),
223            v if v == DefaultFunction::SndPair as u8 => Ok(DefaultFunction::SndPair),
224            // List functions
225            v if v == DefaultFunction::ChooseList as u8 => Ok(DefaultFunction::ChooseList),
226            v if v == DefaultFunction::MkCons as u8 => Ok(DefaultFunction::MkCons),
227            v if v == DefaultFunction::HeadList as u8 => Ok(DefaultFunction::HeadList),
228            v if v == DefaultFunction::TailList as u8 => Ok(DefaultFunction::TailList),
229            v if v == DefaultFunction::NullList as u8 => Ok(DefaultFunction::NullList),
230            // Data functions
231            // It is convenient to have a "choosing" function for a data type that has more than two
232            // constructors to get pattern matching over it and we may end up having multiple such data
233            // types, hence we include the name of the data type as a suffix.
234            v if v == DefaultFunction::ChooseData as u8 => Ok(DefaultFunction::ChooseData),
235            v if v == DefaultFunction::ConstrData as u8 => Ok(DefaultFunction::ConstrData),
236            v if v == DefaultFunction::MapData as u8 => Ok(DefaultFunction::MapData),
237            v if v == DefaultFunction::ListData as u8 => Ok(DefaultFunction::ListData),
238            v if v == DefaultFunction::IData as u8 => Ok(DefaultFunction::IData),
239            v if v == DefaultFunction::BData as u8 => Ok(DefaultFunction::BData),
240            v if v == DefaultFunction::UnConstrData as u8 => Ok(DefaultFunction::UnConstrData),
241            v if v == DefaultFunction::UnMapData as u8 => Ok(DefaultFunction::UnMapData),
242            v if v == DefaultFunction::UnListData as u8 => Ok(DefaultFunction::UnListData),
243            v if v == DefaultFunction::UnIData as u8 => Ok(DefaultFunction::UnIData),
244            v if v == DefaultFunction::UnBData as u8 => Ok(DefaultFunction::UnBData),
245            v if v == DefaultFunction::EqualsData as u8 => Ok(DefaultFunction::EqualsData),
246            v if v == DefaultFunction::SerialiseData as u8 => Ok(DefaultFunction::SerialiseData),
247            // Misc constructors
248            // Constructors that we need for constructing e.g. Data. Polymorphic builtin
249            // constructors are often problematic (See note [Representable built-in
250            // functions over polymorphic built-in types])
251            v if v == DefaultFunction::MkPairData as u8 => Ok(DefaultFunction::MkPairData),
252            v if v == DefaultFunction::MkNilData as u8 => Ok(DefaultFunction::MkNilData),
253            v if v == DefaultFunction::MkNilPairData as u8 => Ok(DefaultFunction::MkNilPairData),
254            v if v == DefaultFunction::Bls12_381_G1_Add as u8 => {
255                Ok(DefaultFunction::Bls12_381_G1_Add)
256            }
257            v if v == DefaultFunction::Bls12_381_G1_Neg as u8 => {
258                Ok(DefaultFunction::Bls12_381_G1_Neg)
259            }
260            v if v == DefaultFunction::Bls12_381_G1_ScalarMul as u8 => {
261                Ok(DefaultFunction::Bls12_381_G1_ScalarMul)
262            }
263            v if v == DefaultFunction::Bls12_381_G1_Equal as u8 => {
264                Ok(DefaultFunction::Bls12_381_G1_Equal)
265            }
266            v if v == DefaultFunction::Bls12_381_G1_Compress as u8 => {
267                Ok(DefaultFunction::Bls12_381_G1_Compress)
268            }
269            v if v == DefaultFunction::Bls12_381_G1_Uncompress as u8 => {
270                Ok(DefaultFunction::Bls12_381_G1_Uncompress)
271            }
272            v if v == DefaultFunction::Bls12_381_G1_HashToGroup as u8 => {
273                Ok(DefaultFunction::Bls12_381_G1_HashToGroup)
274            }
275            v if v == DefaultFunction::Bls12_381_G2_Add as u8 => {
276                Ok(DefaultFunction::Bls12_381_G2_Add)
277            }
278            v if v == DefaultFunction::Bls12_381_G2_Neg as u8 => {
279                Ok(DefaultFunction::Bls12_381_G2_Neg)
280            }
281            v if v == DefaultFunction::Bls12_381_G2_ScalarMul as u8 => {
282                Ok(DefaultFunction::Bls12_381_G2_ScalarMul)
283            }
284            v if v == DefaultFunction::Bls12_381_G2_Equal as u8 => {
285                Ok(DefaultFunction::Bls12_381_G2_Equal)
286            }
287            v if v == DefaultFunction::Bls12_381_G2_Compress as u8 => {
288                Ok(DefaultFunction::Bls12_381_G2_Compress)
289            }
290            v if v == DefaultFunction::Bls12_381_G2_Uncompress as u8 => {
291                Ok(DefaultFunction::Bls12_381_G2_Uncompress)
292            }
293            v if v == DefaultFunction::Bls12_381_G2_HashToGroup as u8 => {
294                Ok(DefaultFunction::Bls12_381_G2_HashToGroup)
295            }
296            v if v == DefaultFunction::Bls12_381_MillerLoop as u8 => {
297                Ok(DefaultFunction::Bls12_381_MillerLoop)
298            }
299            v if v == DefaultFunction::Bls12_381_MulMlResult as u8 => {
300                Ok(DefaultFunction::Bls12_381_MulMlResult)
301            }
302            v if v == DefaultFunction::Bls12_381_FinalVerify as u8 => {
303                Ok(DefaultFunction::Bls12_381_FinalVerify)
304            }
305
306            // Bitwise
307            v if v == DefaultFunction::IntegerToByteString as u8 => {
308                Ok(DefaultFunction::IntegerToByteString)
309            }
310            v if v == DefaultFunction::ByteStringToInteger as u8 => {
311                Ok(DefaultFunction::ByteStringToInteger)
312            }
313            v if v == DefaultFunction::AndByteString as u8 => Ok(DefaultFunction::AndByteString),
314            v if v == DefaultFunction::OrByteString as u8 => Ok(DefaultFunction::OrByteString),
315            v if v == DefaultFunction::XorByteString as u8 => Ok(DefaultFunction::XorByteString),
316            v if v == DefaultFunction::ComplementByteString as u8 => {
317                Ok(DefaultFunction::ComplementByteString)
318            }
319            v if v == DefaultFunction::ReadBit as u8 => Ok(DefaultFunction::ReadBit),
320            v if v == DefaultFunction::WriteBits as u8 => Ok(DefaultFunction::WriteBits),
321            v if v == DefaultFunction::ReplicateByte as u8 => Ok(DefaultFunction::ReplicateByte),
322            v if v == DefaultFunction::ShiftByteString as u8 => {
323                Ok(DefaultFunction::ShiftByteString)
324            }
325            v if v == DefaultFunction::RotateByteString as u8 => {
326                Ok(DefaultFunction::RotateByteString)
327            }
328            v if v == DefaultFunction::CountSetBits as u8 => Ok(DefaultFunction::CountSetBits),
329            v if v == DefaultFunction::FindFirstSetBit as u8 => {
330                Ok(DefaultFunction::FindFirstSetBit)
331            }
332            v if v == DefaultFunction::Ripemd_160 as u8 => Ok(DefaultFunction::Ripemd_160),
333            _ => Err(de::Error::Message(format!(
334                "Default Function not found - {v}"
335            ))),
336        }
337    }
338}
339
340impl FromStr for DefaultFunction {
341    type Err = String;
342
343    fn from_str(s: &str) -> Result<Self, Self::Err> {
344        use DefaultFunction::*;
345
346        match s {
347            "addInteger" => Ok(AddInteger),
348            "subtractInteger" => Ok(SubtractInteger),
349            "multiplyInteger" => Ok(MultiplyInteger),
350            "divideInteger" => Ok(DivideInteger),
351            "quotientInteger" => Ok(QuotientInteger),
352            "remainderInteger" => Ok(RemainderInteger),
353            "modInteger" => Ok(ModInteger),
354            "equalsInteger" => Ok(EqualsInteger),
355            "lessThanInteger" => Ok(LessThanInteger),
356            "lessThanEqualsInteger" => Ok(LessThanEqualsInteger),
357            "appendByteString" => Ok(AppendByteString),
358            "consByteString" => Ok(ConsByteString),
359            "sliceByteString" => Ok(SliceByteString),
360            "lengthOfByteString" => Ok(LengthOfByteString),
361            "indexByteString" => Ok(IndexByteString),
362            "equalsByteString" => Ok(EqualsByteString),
363            "lessThanByteString" => Ok(LessThanByteString),
364            "lessThanEqualsByteString" => Ok(LessThanEqualsByteString),
365            "sha2_256" => Ok(Sha2_256),
366            "sha3_256" => Ok(Sha3_256),
367            "blake2b_256" => Ok(Blake2b_256),
368            "keccak_256" => Ok(Keccak_256),
369            "blake2b_224" => Ok(Blake2b_224),
370            "verifyEd25519Signature" => Ok(VerifyEd25519Signature),
371            "verifyEcdsaSecp256k1Signature" => Ok(VerifyEcdsaSecp256k1Signature),
372            "verifySchnorrSecp256k1Signature" => Ok(VerifySchnorrSecp256k1Signature),
373            "appendString" => Ok(AppendString),
374            "equalsString" => Ok(EqualsString),
375            "encodeUtf8" => Ok(EncodeUtf8),
376            "decodeUtf8" => Ok(DecodeUtf8),
377            "ifThenElse" => Ok(IfThenElse),
378            "chooseUnit" => Ok(ChooseUnit),
379            "trace" => Ok(Trace),
380            "fstPair" => Ok(FstPair),
381            "sndPair" => Ok(SndPair),
382            "chooseList" => Ok(ChooseList),
383            "mkCons" => Ok(MkCons),
384            "headList" => Ok(HeadList),
385            "tailList" => Ok(TailList),
386            "nullList" => Ok(NullList),
387            "chooseData" => Ok(ChooseData),
388            "constrData" => Ok(ConstrData),
389            "mapData" => Ok(MapData),
390            "listData" => Ok(ListData),
391            "iData" => Ok(IData),
392            "bData" => Ok(BData),
393            "unConstrData" => Ok(UnConstrData),
394            "unMapData" => Ok(UnMapData),
395            "unListData" => Ok(UnListData),
396            "unIData" => Ok(UnIData),
397            "unBData" => Ok(UnBData),
398            "equalsData" => Ok(EqualsData),
399            "serialiseData" => Ok(SerialiseData),
400            "mkPairData" => Ok(MkPairData),
401            "mkNilData" => Ok(MkNilData),
402            "mkNilPairData" => Ok(MkNilPairData),
403            "bls12_381_G1_add" => Ok(Bls12_381_G1_Add),
404            "bls12_381_G1_neg" => Ok(Bls12_381_G1_Neg),
405            "bls12_381_G1_scalarMul" => Ok(Bls12_381_G1_ScalarMul),
406            "bls12_381_G1_equal" => Ok(Bls12_381_G1_Equal),
407            "bls12_381_G1_compress" => Ok(Bls12_381_G1_Compress),
408            "bls12_381_G1_uncompress" => Ok(Bls12_381_G1_Uncompress),
409            "bls12_381_G1_hashToGroup" => Ok(Bls12_381_G1_HashToGroup),
410            "bls12_381_G2_add" => Ok(Bls12_381_G2_Add),
411            "bls12_381_G2_neg" => Ok(Bls12_381_G2_Neg),
412            "bls12_381_G2_scalarMul" => Ok(Bls12_381_G2_ScalarMul),
413            "bls12_381_G2_equal" => Ok(Bls12_381_G2_Equal),
414            "bls12_381_G2_compress" => Ok(Bls12_381_G2_Compress),
415            "bls12_381_G2_uncompress" => Ok(Bls12_381_G2_Uncompress),
416            "bls12_381_G2_hashToGroup" => Ok(Bls12_381_G2_HashToGroup),
417            "bls12_381_millerLoop" => Ok(Bls12_381_MillerLoop),
418            "bls12_381_mulMlResult" => Ok(Bls12_381_MulMlResult),
419            "bls12_381_finalVerify" => Ok(Bls12_381_FinalVerify),
420            "integerToByteString" => Ok(IntegerToByteString),
421            "byteStringToInteger" => Ok(ByteStringToInteger),
422            "andByteString" => Ok(AndByteString),
423            "orByteString" => Ok(OrByteString),
424            "xorByteString" => Ok(XorByteString),
425            "complementByteString" => Ok(ComplementByteString),
426            "readBit" => Ok(ReadBit),
427            "writeBits" => Ok(WriteBits),
428            "replicateByte" => Ok(ReplicateByte),
429            "shiftByteString" => Ok(ShiftByteString),
430            "rotateByteString" => Ok(RotateByteString),
431            "countSetBits" => Ok(CountSetBits),
432            "findFirstSetBit" => Ok(FindFirstSetBit),
433            "ripemd_160" => Ok(Ripemd_160),
434            // "expModInteger" => Ok(ExpModInteger),
435            // "caseList" => Ok(CaseList),
436            // "caseData" => Ok(CaseData),
437            rest => Err(format!("Default Function not found - {rest}")),
438        }
439    }
440}
441
442impl Display for DefaultFunction {
443    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
444        use DefaultFunction::*;
445
446        match self {
447            AddInteger => write!(f, "addInteger"),
448            SubtractInteger => write!(f, "subtractInteger"),
449            MultiplyInteger => write!(f, "multiplyInteger"),
450            DivideInteger => write!(f, "divideInteger"),
451            QuotientInteger => write!(f, "quotientInteger"),
452            RemainderInteger => write!(f, "remainderInteger"),
453            ModInteger => write!(f, "modInteger"),
454            EqualsInteger => write!(f, "equalsInteger"),
455            LessThanInteger => write!(f, "lessThanInteger"),
456            LessThanEqualsInteger => write!(f, "lessThanEqualsInteger"),
457            AppendByteString => write!(f, "appendByteString"),
458            ConsByteString => write!(f, "consByteString"),
459            SliceByteString => write!(f, "sliceByteString"),
460            LengthOfByteString => write!(f, "lengthOfByteString"),
461            IndexByteString => write!(f, "indexByteString"),
462            EqualsByteString => write!(f, "equalsByteString"),
463            LessThanByteString => write!(f, "lessThanByteString"),
464            LessThanEqualsByteString => write!(f, "lessThanEqualsByteString"),
465            Sha2_256 => write!(f, "sha2_256"),
466            Sha3_256 => write!(f, "sha3_256"),
467            Blake2b_256 => write!(f, "blake2b_256"),
468            Keccak_256 => write!(f, "keccak_256"),
469            Blake2b_224 => write!(f, "blake2b_224"),
470            VerifyEd25519Signature => write!(f, "verifySignature"),
471            VerifyEcdsaSecp256k1Signature => write!(f, "verifyEcdsaSecp256k1Signature"),
472            VerifySchnorrSecp256k1Signature => write!(f, "verifySchnorrSecp256k1Signature"),
473            AppendString => write!(f, "appendString"),
474            EqualsString => write!(f, "equalsString"),
475            EncodeUtf8 => write!(f, "encodeUtf8"),
476            DecodeUtf8 => write!(f, "decodeUtf8"),
477            IfThenElse => write!(f, "ifThenElse"),
478            ChooseUnit => write!(f, "chooseUnit"),
479            Trace => write!(f, "trace"),
480            FstPair => write!(f, "fstPair"),
481            SndPair => write!(f, "sndPair"),
482            ChooseList => write!(f, "chooseList"),
483            MkCons => write!(f, "mkCons"),
484            HeadList => write!(f, "headList"),
485            TailList => write!(f, "tailList"),
486            NullList => write!(f, "nullList"),
487            ChooseData => write!(f, "chooseData"),
488            ConstrData => write!(f, "constrData"),
489            MapData => write!(f, "mapData"),
490            ListData => write!(f, "listData"),
491            IData => write!(f, "iData"),
492            BData => write!(f, "bData"),
493            UnConstrData => write!(f, "unConstrData"),
494            UnMapData => write!(f, "unMapData"),
495            UnListData => write!(f, "unListData"),
496            UnIData => write!(f, "unIData"),
497            UnBData => write!(f, "unBData"),
498            EqualsData => write!(f, "equalsData"),
499            SerialiseData => write!(f, "serialiseData"),
500            MkPairData => write!(f, "mkPairData"),
501            MkNilData => write!(f, "mkNilData"),
502            MkNilPairData => write!(f, "mkNilPairData"),
503            Bls12_381_G1_Add => write!(f, "bls12_381_G1_add"),
504            Bls12_381_G1_Neg => write!(f, "bls12_381_G1_neg"),
505            Bls12_381_G1_ScalarMul => write!(f, "bls12_381_G1_scalarMul"),
506            Bls12_381_G1_Equal => write!(f, "bls12_381_G1_equal"),
507            Bls12_381_G1_Compress => write!(f, "bls12_381_G1_compress"),
508            Bls12_381_G1_Uncompress => write!(f, "bls12_381_G1_uncompress"),
509            Bls12_381_G1_HashToGroup => write!(f, "bls12_381_G1_hashToGroup"),
510            Bls12_381_G2_Add => write!(f, "bls12_381_G2_add"),
511            Bls12_381_G2_Neg => write!(f, "bls12_381_G2_neg"),
512            Bls12_381_G2_ScalarMul => write!(f, "bls12_381_G2_scalarMul"),
513            Bls12_381_G2_Equal => write!(f, "bls12_381_G2_equal"),
514            Bls12_381_G2_Compress => write!(f, "bls12_381_G2_compress"),
515            Bls12_381_G2_Uncompress => write!(f, "bls12_381_G2_uncompress"),
516            Bls12_381_G2_HashToGroup => write!(f, "bls12_381_G2_hashToGroup"),
517            Bls12_381_MillerLoop => write!(f, "bls12_381_millerLoop"),
518            Bls12_381_MulMlResult => write!(f, "bls12_381_mulMlResult"),
519            Bls12_381_FinalVerify => write!(f, "bls12_381_finalVerify"),
520            IntegerToByteString => write!(f, "integerToByteString"),
521            ByteStringToInteger => write!(f, "byteStringToInteger"),
522            AndByteString => write!(f, "andByteString"),
523            OrByteString => write!(f, "orByteString"),
524            XorByteString => write!(f, "xorByteString"),
525            ComplementByteString => write!(f, "complementByteString"),
526            ReadBit => write!(f, "readBit"),
527            WriteBits => write!(f, "writeBits"),
528            ReplicateByte => write!(f, "replicateByte"),
529            ShiftByteString => write!(f, "shiftByteString"),
530            RotateByteString => write!(f, "rotateByteString"),
531            CountSetBits => write!(f, "countSetBits"),
532            FindFirstSetBit => write!(f, "findFirstSetBit"),
533            Ripemd_160 => write!(f, "ripemd_160"),
534            // ExpModInteger => write!(f, "expModInteger"),
535            // CaseList => write!(f, "caseList"),
536            // CaseData => write!(f, "caseData"),
537        }
538    }
539}
540
541impl DefaultFunction {
542    pub fn aiken_name(&self) -> String {
543        use DefaultFunction::*;
544
545        match self {
546            AddInteger => "add_integer",
547            SubtractInteger => "subtract_integer",
548            MultiplyInteger => "multiply_integer",
549            DivideInteger => "divide_integer",
550            QuotientInteger => "quotient_integer",
551            RemainderInteger => "remainder_integer",
552            ModInteger => "mod_integer",
553            EqualsInteger => "equals_integer",
554            LessThanInteger => "less_than_integer",
555            LessThanEqualsInteger => "less_than_equals_integer",
556            AppendByteString => "append_bytearray",
557            ConsByteString => "cons_bytearray",
558            SliceByteString => "slice_bytearray",
559            LengthOfByteString => "length_of_bytearray",
560            IndexByteString => "index_bytearray",
561            EqualsByteString => "equals_bytearray",
562            LessThanByteString => "less_than_bytearray",
563            LessThanEqualsByteString => "less_than_equals_bytearray",
564            Sha2_256 => "sha2_256",
565            Sha3_256 => "sha3_256",
566            Blake2b_224 => "blake2b_224",
567            Blake2b_256 => "blake2b_256",
568            Keccak_256 => "keccak_256",
569            VerifyEd25519Signature => "verify_ed25519_signature",
570            VerifyEcdsaSecp256k1Signature => "verify_ecdsa_secp256k1_signature",
571            VerifySchnorrSecp256k1Signature => "verify_schnorr_secp256k1_signature",
572            AppendString => "append_string",
573            EqualsString => "equals_string",
574            EncodeUtf8 => "encode_utf8",
575            DecodeUtf8 => "decode_utf8",
576            IfThenElse => "if_then_else",
577            ChooseUnit => "choose_void",
578            Trace => "debug",
579            FstPair => "fst_pair",
580            SndPair => "snd_pair",
581            ChooseList => "choose_list",
582            MkCons => "cons_list",
583            HeadList => "head_list",
584            TailList => "tail_list",
585            NullList => "null_list",
586            ChooseData => "choose_data",
587            ConstrData => "constr_data",
588            MapData => "map_data",
589            ListData => "list_data",
590            IData => "i_data",
591            BData => "b_data",
592            UnConstrData => "un_constr_data",
593            UnMapData => "un_map_data",
594            UnListData => "un_list_data",
595            UnIData => "un_i_data",
596            UnBData => "un_b_data",
597            EqualsData => "equals_data",
598            SerialiseData => "serialise_data",
599            MkPairData => "new_pair",
600            MkNilData => "new_list",
601            MkNilPairData => "new_pairs",
602            Bls12_381_G1_Add => "bls12_381_g1_add",
603            Bls12_381_G1_Neg => "bls12_381_g1_neg",
604            Bls12_381_G1_ScalarMul => "bls12_381_g1_scalar_mul",
605            Bls12_381_G1_Equal => "bls12_381_g1_equal",
606            Bls12_381_G1_Compress => "bls12_381_g1_compress",
607            Bls12_381_G1_Uncompress => "bls12_381_g1_uncompress",
608            Bls12_381_G1_HashToGroup => "bls12_381_g1_hash_to_group",
609            Bls12_381_G2_Add => "bls12_381_g2_add",
610            Bls12_381_G2_Neg => "bls12_381_g2_neg",
611            Bls12_381_G2_ScalarMul => "bls12_381_g2_scalar_mul",
612            Bls12_381_G2_Equal => "bls12_381_g2_equal",
613            Bls12_381_G2_Compress => "bls12_381_g2_compress",
614            Bls12_381_G2_Uncompress => "bls12_381_g2_uncompress",
615            Bls12_381_G2_HashToGroup => "bls12_381_g2_hash_to_group",
616            Bls12_381_MillerLoop => "bls12_381_miller_loop",
617            Bls12_381_MulMlResult => "bls12_381_mul_miller_loop_result",
618            Bls12_381_FinalVerify => "bls12_381_final_verify",
619            IntegerToByteString => "integer_to_bytearray",
620            ByteStringToInteger => "bytearray_to_integer",
621            AndByteString => "and_bytearray",
622            OrByteString => "or_bytearray",
623            XorByteString => "xor_bytearray",
624            ComplementByteString => "complement_bytearray",
625            ReadBit => "read_bit",
626            WriteBits => "write_bits",
627            ReplicateByte => "replicate_byte",
628            ShiftByteString => "shift_bytearray",
629            RotateByteString => "rotate_bytearray",
630            CountSetBits => "count_set_bits",
631            FindFirstSetBit => "find_first_set_bit",
632            Ripemd_160 => "ripemd_160",
633            // ExpModInteger => "exp_mod_integer",
634            // CaseList => "case_list",
635            // CaseData => "case_data",
636        }
637        .to_string()
638    }
639}
640
641impl<T> From<DefaultFunction> for Term<T> {
642    fn from(builtin: DefaultFunction) -> Self {
643        Term::Builtin(builtin)
644    }
645}
646
647impl<T> From<DefaultFunction> for Rc<Term<T>> {
648    fn from(builtin: DefaultFunction) -> Self {
649        Term::Builtin(builtin).into()
650    }
651}