leo_ast/functions/
core_function.rs

1// Copyright (C) 2019-2025 Provable Inc.
2// This file is part of the Leo library.
3
4// The Leo library is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published by
6// the Free Software Foundation, either version 3 of the License, or
7// (at your option) any later version.
8
9// The Leo library is distributed in the hope that it will be useful,
10// but WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12// GNU General Public License for more details.
13
14// You should have received a copy of the GNU General Public License
15// along with the Leo library. If not, see <https://www.gnu.org/licenses/>.
16
17use crate::{ArrayType, AssociatedFunctionExpression, IntegerType, Type};
18
19use leo_span::{Symbol, sym};
20
21use snarkvm::{
22    prelude::LiteralType,
23    synthesizer::program::{CommitVariant, DeserializeVariant, ECDSAVerifyVariant, HashVariant, SerializeVariant},
24};
25
26/// A core instruction that maps directly to an AVM bytecode instruction.
27#[derive(Clone, Debug, PartialEq, Eq)]
28pub enum CoreFunction {
29    // ChaCha random value of type (LiteralType).
30    ChaChaRand(LiteralType),
31    // Commitment to a value using hash (HashVariant) returning value of type (LiteralType).
32    Commit(CommitVariant, LiteralType),
33    // ECDSA verify with hash (HashVariant) and the ETH variant (bool).
34    ECDSAVerify(ECDSAVerifyVariant),
35    // Hash function with variant (HashVariant) returning value of type (LiteralType).
36    Hash(HashVariant, Type),
37
38    // These are used for both mappings and vectors
39    Get,
40    Set,
41
42    MappingGetOrUse,
43    MappingRemove,
44    MappingContains,
45
46    OptionalUnwrap,
47    OptionalUnwrapOr,
48
49    VectorPush,
50    VectorLen,
51    VectorClear,
52    VectorPop,
53    VectorSwapRemove,
54
55    GroupToXCoordinate,
56    GroupToYCoordinate,
57
58    // Schnorr signature verification.
59    SignatureVerify,
60
61    FutureAwait,
62
63    ProgramChecksum,
64    ProgramEdition,
65    ProgramOwner,
66
67    Serialize(SerializeVariant),
68
69    // Note. `Deserialize` cannot be instantiated via `from_symbols` as it requires a type argument.
70    Deserialize(DeserializeVariant, Type),
71
72    CheatCodePrintMapping,
73    CheatCodeSetBlockHeight,
74    CheatCodeSetBlockTimestamp,
75    CheatCodeSetSigner,
76}
77
78impl CoreFunction {
79    /// Returns a `CoreFunction` from the given module and method symbols.
80    #[rustfmt::skip]
81    pub fn from_symbols(module: Symbol, function: Symbol) -> Option<Self> {
82        Some(match (module, function) {
83            (sym::ChaCha, sym::rand_address) => Self::ChaChaRand(LiteralType::Address),
84            (sym::ChaCha, sym::rand_bool)    => Self::ChaChaRand(LiteralType::Boolean),
85            (sym::ChaCha, sym::rand_field)   => Self::ChaChaRand(LiteralType::Field),
86            (sym::ChaCha, sym::rand_group)   => Self::ChaChaRand(LiteralType::Group),
87            (sym::ChaCha, sym::rand_i8)      => Self::ChaChaRand(LiteralType::I8),
88            (sym::ChaCha, sym::rand_i16)     => Self::ChaChaRand(LiteralType::I16),
89            (sym::ChaCha, sym::rand_i32)     => Self::ChaChaRand(LiteralType::I32),
90            (sym::ChaCha, sym::rand_i64)     => Self::ChaChaRand(LiteralType::I64),
91            (sym::ChaCha, sym::rand_i128)    => Self::ChaChaRand(LiteralType::I128),
92            (sym::ChaCha, sym::rand_u8)      => Self::ChaChaRand(LiteralType::U8),
93            (sym::ChaCha, sym::rand_u16)     => Self::ChaChaRand(LiteralType::U16),
94            (sym::ChaCha, sym::rand_u32)     => Self::ChaChaRand(LiteralType::U32),
95            (sym::ChaCha, sym::rand_u64)     => Self::ChaChaRand(LiteralType::U64),
96            (sym::ChaCha, sym::rand_u128)    => Self::ChaChaRand(LiteralType::U128),
97            (sym::ChaCha, sym::rand_scalar)  => Self::ChaChaRand(LiteralType::Scalar),
98
99            (sym::BHP256, sym::commit_to_address)   => Self::Commit(CommitVariant::CommitBHP256, LiteralType::Address),
100            (sym::BHP256, sym::commit_to_field)     => Self::Commit(CommitVariant::CommitBHP256, LiteralType::Field),
101            (sym::BHP256, sym::commit_to_group)     => Self::Commit(CommitVariant::CommitBHP256, LiteralType::Group),
102            (sym::BHP512, sym::commit_to_address)   => Self::Commit(CommitVariant::CommitBHP512, LiteralType::Address),
103            (sym::BHP512, sym::commit_to_field)     => Self::Commit(CommitVariant::CommitBHP512, LiteralType::Field),
104            (sym::BHP512, sym::commit_to_group)     => Self::Commit(CommitVariant::CommitBHP512, LiteralType::Group),
105            (sym::BHP768, sym::commit_to_address)   => Self::Commit(CommitVariant::CommitBHP768, LiteralType::Address),
106            (sym::BHP768, sym::commit_to_field)     => Self::Commit(CommitVariant::CommitBHP768, LiteralType::Field),
107            (sym::BHP768, sym::commit_to_group)     => Self::Commit(CommitVariant::CommitBHP768, LiteralType::Group),
108            (sym::BHP1024, sym::commit_to_address)   => Self::Commit(CommitVariant::CommitBHP1024, LiteralType::Address),
109            (sym::BHP1024, sym::commit_to_field)     => Self::Commit(CommitVariant::CommitBHP1024, LiteralType::Field),
110            (sym::BHP1024, sym::commit_to_group)     => Self::Commit(CommitVariant::CommitBHP1024, LiteralType::Group),
111            (sym::Pedersen64, sym::commit_to_address)   => Self::Commit(CommitVariant::CommitPED64, LiteralType::Address),
112            (sym::Pedersen64, sym::commit_to_field)     => Self::Commit(CommitVariant::CommitPED64, LiteralType::Field),
113            (sym::Pedersen64, sym::commit_to_group)     => Self::Commit(CommitVariant::CommitPED64, LiteralType::Group),
114            (sym::Pedersen128, sym::commit_to_address)   => Self::Commit(CommitVariant::CommitPED128, LiteralType::Address),
115            (sym::Pedersen128, sym::commit_to_field)     => Self::Commit(CommitVariant::CommitPED128, LiteralType::Field),
116            (sym::Pedersen128, sym::commit_to_group)     => Self::Commit(CommitVariant::CommitPED128, LiteralType::Group),
117
118            (sym::BHP256, sym::hash_to_address)     => Self::Hash(HashVariant::HashBHP256, Type::Address),
119            (sym::BHP256, sym::hash_to_field)       => Self::Hash(HashVariant::HashBHP256, Type::Field),
120            (sym::BHP256, sym::hash_to_group)       => Self::Hash(HashVariant::HashBHP256, Type::Group),
121            (sym::BHP256, sym::hash_to_i8)          => Self::Hash(HashVariant::HashBHP256, Type::Integer(IntegerType::I8)),
122            (sym::BHP256, sym::hash_to_i16)         => Self::Hash(HashVariant::HashBHP256, Type::Integer(IntegerType::I16)),
123            (sym::BHP256, sym::hash_to_i32)         => Self::Hash(HashVariant::HashBHP256, Type::Integer(IntegerType::I32)),
124            (sym::BHP256, sym::hash_to_i64)         => Self::Hash(HashVariant::HashBHP256, Type::Integer(IntegerType::I64)),
125            (sym::BHP256, sym::hash_to_i128)        => Self::Hash(HashVariant::HashBHP256, Type::Integer(IntegerType::I128)),
126            (sym::BHP256, sym::hash_to_u8)          => Self::Hash(HashVariant::HashBHP256, Type::Integer(IntegerType::U8)),
127            (sym::BHP256, sym::hash_to_u16)         => Self::Hash(HashVariant::HashBHP256, Type::Integer(IntegerType::U16)),
128            (sym::BHP256, sym::hash_to_u32)         => Self::Hash(HashVariant::HashBHP256, Type::Integer(IntegerType::U32)),
129            (sym::BHP256, sym::hash_to_u64)         => Self::Hash(HashVariant::HashBHP256, Type::Integer(IntegerType::U64)),
130            (sym::BHP256, sym::hash_to_u128)        => Self::Hash(HashVariant::HashBHP256, Type::Integer(IntegerType::U128)),
131            (sym::BHP256, sym::hash_to_scalar)      => Self::Hash(HashVariant::HashBHP256, Type::Scalar),
132            (sym::BHP256, sym::hash_to_address_raw) => Self::Hash(HashVariant::HashBHP256Raw, Type::Address),
133            (sym::BHP256, sym::hash_to_field_raw)   => Self::Hash(HashVariant::HashBHP256Raw, Type::Field),
134            (sym::BHP256, sym::hash_to_group_raw)   => Self::Hash(HashVariant::HashBHP256Raw, Type::Group),
135            (sym::BHP256, sym::hash_to_i8_raw)      => Self::Hash(HashVariant::HashBHP256Raw, Type::Integer(IntegerType::I8)),
136            (sym::BHP256, sym::hash_to_i16_raw)     => Self::Hash(HashVariant::HashBHP256Raw, Type::Integer(IntegerType::I16)),
137            (sym::BHP256, sym::hash_to_i32_raw)     => Self::Hash(HashVariant::HashBHP256Raw, Type::Integer(IntegerType::I32)),
138            (sym::BHP256, sym::hash_to_i64_raw)     => Self::Hash(HashVariant::HashBHP256Raw, Type::Integer(IntegerType::I64)),
139            (sym::BHP256, sym::hash_to_i128_raw)    => Self::Hash(HashVariant::HashBHP256Raw, Type::Integer(IntegerType::I128)),
140            (sym::BHP256, sym::hash_to_u8_raw)      => Self::Hash(HashVariant::HashBHP256Raw, Type::Integer(IntegerType::U8)),
141            (sym::BHP256, sym::hash_to_u16_raw)     => Self::Hash(HashVariant::HashBHP256Raw, Type::Integer(IntegerType::U16)),
142            (sym::BHP256, sym::hash_to_u32_raw)     => Self::Hash(HashVariant::HashBHP256Raw, Type::Integer(IntegerType::U32)),
143            (sym::BHP256, sym::hash_to_u64_raw)     => Self::Hash(HashVariant::HashBHP256Raw, Type::Integer(IntegerType::U64)),
144            (sym::BHP256, sym::hash_to_u128_raw)    => Self::Hash(HashVariant::HashBHP256Raw, Type::Integer(IntegerType::U128)),
145            (sym::BHP256, sym::hash_to_scalar_raw)  => Self::Hash(HashVariant::HashBHP256Raw, Type::Scalar),
146
147            (sym::BHP512, sym::hash_to_address)     => Self::Hash(HashVariant::HashBHP512, Type::Address),
148            (sym::BHP512, sym::hash_to_field)       => Self::Hash(HashVariant::HashBHP512, Type::Field),
149            (sym::BHP512, sym::hash_to_group)       => Self::Hash(HashVariant::HashBHP512, Type::Group),
150            (sym::BHP512, sym::hash_to_i8)          => Self::Hash(HashVariant::HashBHP512, Type::Integer(IntegerType::I8)),
151            (sym::BHP512, sym::hash_to_i16)         => Self::Hash(HashVariant::HashBHP512, Type::Integer(IntegerType::I16)),
152            (sym::BHP512, sym::hash_to_i32)         => Self::Hash(HashVariant::HashBHP512, Type::Integer(IntegerType::I32)),
153            (sym::BHP512, sym::hash_to_i64)         => Self::Hash(HashVariant::HashBHP512, Type::Integer(IntegerType::I64)),
154            (sym::BHP512, sym::hash_to_i128)        => Self::Hash(HashVariant::HashBHP512, Type::Integer(IntegerType::I128)),
155            (sym::BHP512, sym::hash_to_u8)          => Self::Hash(HashVariant::HashBHP512, Type::Integer(IntegerType::U8)),
156            (sym::BHP512, sym::hash_to_u16)         => Self::Hash(HashVariant::HashBHP512, Type::Integer(IntegerType::U16)),
157            (sym::BHP512, sym::hash_to_u32)         => Self::Hash(HashVariant::HashBHP512, Type::Integer(IntegerType::U32)),
158            (sym::BHP512, sym::hash_to_u64)         => Self::Hash(HashVariant::HashBHP512, Type::Integer(IntegerType::U64)),
159            (sym::BHP512, sym::hash_to_u128)        => Self::Hash(HashVariant::HashBHP512, Type::Integer(IntegerType::U128)),
160            (sym::BHP512, sym::hash_to_scalar)      => Self::Hash(HashVariant::HashBHP512, Type::Scalar),
161            (sym::BHP512, sym::hash_to_address_raw) => Self::Hash(HashVariant::HashBHP512Raw, Type::Address),
162            (sym::BHP512, sym::hash_to_field_raw)   => Self::Hash(HashVariant::HashBHP512Raw, Type::Field),
163            (sym::BHP512, sym::hash_to_group_raw)   => Self::Hash(HashVariant::HashBHP512Raw, Type::Group),
164            (sym::BHP512, sym::hash_to_i8_raw)      => Self::Hash(HashVariant::HashBHP512Raw, Type::Integer(IntegerType::I8)),
165            (sym::BHP512, sym::hash_to_i16_raw)     => Self::Hash(HashVariant::HashBHP512Raw, Type::Integer(IntegerType::I16)),
166            (sym::BHP512, sym::hash_to_i32_raw)     => Self::Hash(HashVariant::HashBHP512Raw, Type::Integer(IntegerType::I32)),
167            (sym::BHP512, sym::hash_to_i64_raw)     => Self::Hash(HashVariant::HashBHP512Raw, Type::Integer(IntegerType::I64)),
168            (sym::BHP512, sym::hash_to_i128_raw)    => Self::Hash(HashVariant::HashBHP512Raw, Type::Integer(IntegerType::I128)),
169            (sym::BHP512, sym::hash_to_u8_raw)      => Self::Hash(HashVariant::HashBHP512Raw, Type::Integer(IntegerType::U8)),
170            (sym::BHP512, sym::hash_to_u16_raw)     => Self::Hash(HashVariant::HashBHP512Raw, Type::Integer(IntegerType::U16)),
171            (sym::BHP512, sym::hash_to_u32_raw)     => Self::Hash(HashVariant::HashBHP512Raw, Type::Integer(IntegerType::U32)),
172            (sym::BHP512, sym::hash_to_u64_raw)     => Self::Hash(HashVariant::HashBHP512Raw, Type::Integer(IntegerType::U64)),
173            (sym::BHP512, sym::hash_to_u128_raw)    => Self::Hash(HashVariant::HashBHP512Raw, Type::Integer(IntegerType::U128)),
174            (sym::BHP512, sym::hash_to_scalar_raw)  => Self::Hash(HashVariant::HashBHP512Raw, Type::Scalar),
175
176            (sym::BHP768, sym::hash_to_address)     => Self::Hash(HashVariant::HashBHP768, Type::Address),
177            (sym::BHP768, sym::hash_to_field)       => Self::Hash(HashVariant::HashBHP768, Type::Field),
178            (sym::BHP768, sym::hash_to_group)       => Self::Hash(HashVariant::HashBHP768, Type::Group),
179            (sym::BHP768, sym::hash_to_i8)          => Self::Hash(HashVariant::HashBHP768, Type::Integer(IntegerType::I8)),
180            (sym::BHP768, sym::hash_to_i16)         => Self::Hash(HashVariant::HashBHP768, Type::Integer(IntegerType::I16)),
181            (sym::BHP768, sym::hash_to_i32)         => Self::Hash(HashVariant::HashBHP768, Type::Integer(IntegerType::I32)),
182            (sym::BHP768, sym::hash_to_i64)         => Self::Hash(HashVariant::HashBHP768, Type::Integer(IntegerType::I64)),
183            (sym::BHP768, sym::hash_to_i128)        => Self::Hash(HashVariant::HashBHP768, Type::Integer(IntegerType::I128)),
184            (sym::BHP768, sym::hash_to_u8)          => Self::Hash(HashVariant::HashBHP768, Type::Integer(IntegerType::U8)),
185            (sym::BHP768, sym::hash_to_u16)         => Self::Hash(HashVariant::HashBHP768, Type::Integer(IntegerType::U16)),
186            (sym::BHP768, sym::hash_to_u32)         => Self::Hash(HashVariant::HashBHP768, Type::Integer(IntegerType::U32)),
187            (sym::BHP768, sym::hash_to_u64)         => Self::Hash(HashVariant::HashBHP768, Type::Integer(IntegerType::U64)),
188            (sym::BHP768, sym::hash_to_u128)        => Self::Hash(HashVariant::HashBHP768, Type::Integer(IntegerType::U128)),
189            (sym::BHP768, sym::hash_to_scalar)      => Self::Hash(HashVariant::HashBHP768, Type::Scalar),
190            (sym::BHP768, sym::hash_to_address_raw) => Self::Hash(HashVariant::HashBHP768Raw, Type::Address),
191            (sym::BHP768, sym::hash_to_field_raw)   => Self::Hash(HashVariant::HashBHP768Raw, Type::Field),
192            (sym::BHP768, sym::hash_to_group_raw)   => Self::Hash(HashVariant::HashBHP768Raw, Type::Group),
193            (sym::BHP768, sym::hash_to_i8_raw)      => Self::Hash(HashVariant::HashBHP768Raw, Type::Integer(IntegerType::I8)),
194            (sym::BHP768, sym::hash_to_i16_raw)     => Self::Hash(HashVariant::HashBHP768Raw, Type::Integer(IntegerType::I16)),
195            (sym::BHP768, sym::hash_to_i32_raw)     => Self::Hash(HashVariant::HashBHP768Raw, Type::Integer(IntegerType::I32)),
196            (sym::BHP768, sym::hash_to_i64_raw)     => Self::Hash(HashVariant::HashBHP768Raw, Type::Integer(IntegerType::I64)),
197            (sym::BHP768, sym::hash_to_i128_raw)    => Self::Hash(HashVariant::HashBHP768Raw, Type::Integer(IntegerType::I128)),
198            (sym::BHP768, sym::hash_to_u8_raw)      => Self::Hash(HashVariant::HashBHP768Raw, Type::Integer(IntegerType::U8)),
199            (sym::BHP768, sym::hash_to_u16_raw)     => Self::Hash(HashVariant::HashBHP768Raw, Type::Integer(IntegerType::U16)),
200            (sym::BHP768, sym::hash_to_u32_raw)     => Self::Hash(HashVariant::HashBHP768Raw, Type::Integer(IntegerType::U32)),
201            (sym::BHP768, sym::hash_to_u64_raw)     => Self::Hash(HashVariant::HashBHP768Raw, Type::Integer(IntegerType::U64)),
202            (sym::BHP768, sym::hash_to_u128_raw)    => Self::Hash(HashVariant::HashBHP768Raw, Type::Integer(IntegerType::U128)),
203            (sym::BHP768, sym::hash_to_scalar_raw)  => Self::Hash(HashVariant::HashBHP768Raw, Type::Scalar),
204
205            (sym::BHP1024, sym::hash_to_address)     => Self::Hash(HashVariant::HashBHP1024, Type::Address),
206            (sym::BHP1024, sym::hash_to_field)       => Self::Hash(HashVariant::HashBHP1024, Type::Field),
207            (sym::BHP1024, sym::hash_to_group)       => Self::Hash(HashVariant::HashBHP1024, Type::Group),
208            (sym::BHP1024, sym::hash_to_i8)          => Self::Hash(HashVariant::HashBHP1024, Type::Integer(IntegerType::I8)),
209            (sym::BHP1024, sym::hash_to_i16)         => Self::Hash(HashVariant::HashBHP1024, Type::Integer(IntegerType::I16)),
210            (sym::BHP1024, sym::hash_to_i32)         => Self::Hash(HashVariant::HashBHP1024, Type::Integer(IntegerType::I32)),
211            (sym::BHP1024, sym::hash_to_i64)         => Self::Hash(HashVariant::HashBHP1024, Type::Integer(IntegerType::I64)),
212            (sym::BHP1024, sym::hash_to_i128)        => Self::Hash(HashVariant::HashBHP1024, Type::Integer(IntegerType::I128)),
213            (sym::BHP1024, sym::hash_to_u8)          => Self::Hash(HashVariant::HashBHP1024, Type::Integer(IntegerType::U8)),
214            (sym::BHP1024, sym::hash_to_u16)         => Self::Hash(HashVariant::HashBHP1024, Type::Integer(IntegerType::U16)),
215            (sym::BHP1024, sym::hash_to_u32)         => Self::Hash(HashVariant::HashBHP1024, Type::Integer(IntegerType::U32)),
216            (sym::BHP1024, sym::hash_to_u64)         => Self::Hash(HashVariant::HashBHP1024, Type::Integer(IntegerType::U64)),
217            (sym::BHP1024, sym::hash_to_u128)        => Self::Hash(HashVariant::HashBHP1024, Type::Integer(IntegerType::U128)),
218            (sym::BHP1024, sym::hash_to_scalar)      => Self::Hash(HashVariant::HashBHP1024, Type::Scalar),
219            (sym::BHP1024, sym::hash_to_address_raw) => Self::Hash(HashVariant::HashBHP1024Raw, Type::Address),
220            (sym::BHP1024, sym::hash_to_field_raw)   => Self::Hash(HashVariant::HashBHP1024Raw, Type::Field),
221            (sym::BHP1024, sym::hash_to_group_raw)   => Self::Hash(HashVariant::HashBHP1024Raw, Type::Group),
222            (sym::BHP1024, sym::hash_to_i8_raw)      => Self::Hash(HashVariant::HashBHP1024Raw, Type::Integer(IntegerType::I8)),
223            (sym::BHP1024, sym::hash_to_i16_raw)     => Self::Hash(HashVariant::HashBHP1024Raw, Type::Integer(IntegerType::I16)),
224            (sym::BHP1024, sym::hash_to_i32_raw)     => Self::Hash(HashVariant::HashBHP1024Raw, Type::Integer(IntegerType::I32)),
225            (sym::BHP1024, sym::hash_to_i64_raw)     => Self::Hash(HashVariant::HashBHP1024Raw, Type::Integer(IntegerType::I64)),
226            (sym::BHP1024, sym::hash_to_i128_raw)    => Self::Hash(HashVariant::HashBHP1024Raw, Type::Integer(IntegerType::I128)),
227            (sym::BHP1024, sym::hash_to_u8_raw)      => Self::Hash(HashVariant::HashBHP1024Raw, Type::Integer(IntegerType::U8)),
228            (sym::BHP1024, sym::hash_to_u16_raw)     => Self::Hash(HashVariant::HashBHP1024Raw, Type::Integer(IntegerType::U16)),
229            (sym::BHP1024, sym::hash_to_u32_raw)     => Self::Hash(HashVariant::HashBHP1024Raw, Type::Integer(IntegerType::U32)),
230            (sym::BHP1024, sym::hash_to_u64_raw)     => Self::Hash(HashVariant::HashBHP1024Raw, Type::Integer(IntegerType::U64)),
231            (sym::BHP1024, sym::hash_to_u128_raw)    => Self::Hash(HashVariant::HashBHP1024Raw, Type::Integer(IntegerType::U128)),
232            (sym::BHP1024, sym::hash_to_scalar_raw)  => Self::Hash(HashVariant::HashBHP1024Raw, Type::Scalar),
233
234            (sym::Keccak256, sym::hash_to_address)     => Self::Hash(HashVariant::HashKeccak256, Type::Address),
235            (sym::Keccak256, sym::hash_to_field)       => Self::Hash(HashVariant::HashKeccak256, Type::Field),
236            (sym::Keccak256, sym::hash_to_group)       => Self::Hash(HashVariant::HashKeccak256, Type::Group),
237            (sym::Keccak256, sym::hash_to_i8)          => Self::Hash(HashVariant::HashKeccak256, Type::Integer(IntegerType::I8)),
238            (sym::Keccak256, sym::hash_to_i16)         => Self::Hash(HashVariant::HashKeccak256, Type::Integer(IntegerType::I16)),
239            (sym::Keccak256, sym::hash_to_i32)         => Self::Hash(HashVariant::HashKeccak256, Type::Integer(IntegerType::I32)),
240            (sym::Keccak256, sym::hash_to_i64)         => Self::Hash(HashVariant::HashKeccak256, Type::Integer(IntegerType::I64)),
241            (sym::Keccak256, sym::hash_to_i128)        => Self::Hash(HashVariant::HashKeccak256, Type::Integer(IntegerType::I128)),
242            (sym::Keccak256, sym::hash_to_u8)          => Self::Hash(HashVariant::HashKeccak256, Type::Integer(IntegerType::U8)),
243            (sym::Keccak256, sym::hash_to_u16)         => Self::Hash(HashVariant::HashKeccak256, Type::Integer(IntegerType::U16)),
244            (sym::Keccak256, sym::hash_to_u32)         => Self::Hash(HashVariant::HashKeccak256, Type::Integer(IntegerType::U32)),
245            (sym::Keccak256, sym::hash_to_u64)         => Self::Hash(HashVariant::HashKeccak256, Type::Integer(IntegerType::U64)),
246            (sym::Keccak256, sym::hash_to_u128)        => Self::Hash(HashVariant::HashKeccak256, Type::Integer(IntegerType::U128)),
247            (sym::Keccak256, sym::hash_to_scalar)      => Self::Hash(HashVariant::HashKeccak256, Type::Scalar),
248            (sym::Keccak256, sym::hash_to_address_raw) => Self::Hash(HashVariant::HashKeccak256Raw, Type::Address),
249            (sym::Keccak256, sym::hash_to_field_raw)   => Self::Hash(HashVariant::HashKeccak256Raw, Type::Field),
250            (sym::Keccak256, sym::hash_to_group_raw)   => Self::Hash(HashVariant::HashKeccak256Raw, Type::Group),
251            (sym::Keccak256, sym::hash_to_i8_raw)      => Self::Hash(HashVariant::HashKeccak256Raw, Type::Integer(IntegerType::I8)),
252            (sym::Keccak256, sym::hash_to_i16_raw)     => Self::Hash(HashVariant::HashKeccak256Raw, Type::Integer(IntegerType::I16)),
253            (sym::Keccak256, sym::hash_to_i32_raw)     => Self::Hash(HashVariant::HashKeccak256Raw, Type::Integer(IntegerType::I32)),
254            (sym::Keccak256, sym::hash_to_i64_raw)     => Self::Hash(HashVariant::HashKeccak256Raw, Type::Integer(IntegerType::I64)),
255            (sym::Keccak256, sym::hash_to_i128_raw)    => Self::Hash(HashVariant::HashKeccak256Raw, Type::Integer(IntegerType::I128)),
256            (sym::Keccak256, sym::hash_to_u8_raw)      => Self::Hash(HashVariant::HashKeccak256Raw, Type::Integer(IntegerType::U8)),
257            (sym::Keccak256, sym::hash_to_u16_raw)     => Self::Hash(HashVariant::HashKeccak256Raw, Type::Integer(IntegerType::U16)),
258            (sym::Keccak256, sym::hash_to_u32_raw)     => Self::Hash(HashVariant::HashKeccak256Raw, Type::Integer(IntegerType::U32)),
259            (sym::Keccak256, sym::hash_to_u64_raw)     => Self::Hash(HashVariant::HashKeccak256Raw, Type::Integer(IntegerType::U64)),
260            (sym::Keccak256, sym::hash_to_u128_raw)    => Self::Hash(HashVariant::HashKeccak256Raw, Type::Integer(IntegerType::U128)),
261            (sym::Keccak256, sym::hash_to_scalar_raw)  => Self::Hash(HashVariant::HashKeccak256Raw, Type::Scalar),
262            (sym::Keccak256, sym::hash_native)         => Self::Hash(HashVariant::HashKeccak256Native, Type::Array(ArrayType::bit_array(256))),
263            (sym::Keccak256, sym::hash_native_raw)     => Self::Hash(HashVariant::HashKeccak256NativeRaw, Type::Array(ArrayType::bit_array(256))),
264
265            (sym::Keccak384, sym::hash_to_address)     => Self::Hash(HashVariant::HashKeccak384, Type::Address),
266            (sym::Keccak384, sym::hash_to_field)       => Self::Hash(HashVariant::HashKeccak384, Type::Field),
267            (sym::Keccak384, sym::hash_to_group)       => Self::Hash(HashVariant::HashKeccak384, Type::Group),
268            (sym::Keccak384, sym::hash_to_i8)          => Self::Hash(HashVariant::HashKeccak384, Type::Integer(IntegerType::I8)),
269            (sym::Keccak384, sym::hash_to_i16)         => Self::Hash(HashVariant::HashKeccak384, Type::Integer(IntegerType::I16)),
270            (sym::Keccak384, sym::hash_to_i32)         => Self::Hash(HashVariant::HashKeccak384, Type::Integer(IntegerType::I32)),
271            (sym::Keccak384, sym::hash_to_i64)         => Self::Hash(HashVariant::HashKeccak384, Type::Integer(IntegerType::I64)),
272            (sym::Keccak384, sym::hash_to_i128)        => Self::Hash(HashVariant::HashKeccak384, Type::Integer(IntegerType::I128)),
273            (sym::Keccak384, sym::hash_to_u8)          => Self::Hash(HashVariant::HashKeccak384, Type::Integer(IntegerType::U8)),
274            (sym::Keccak384, sym::hash_to_u16)         => Self::Hash(HashVariant::HashKeccak384, Type::Integer(IntegerType::U16)),
275            (sym::Keccak384, sym::hash_to_u32)         => Self::Hash(HashVariant::HashKeccak384, Type::Integer(IntegerType::U32)),
276            (sym::Keccak384, sym::hash_to_u64)         => Self::Hash(HashVariant::HashKeccak384, Type::Integer(IntegerType::U64)),
277            (sym::Keccak384, sym::hash_to_u128)        => Self::Hash(HashVariant::HashKeccak384, Type::Integer(IntegerType::U128)),
278            (sym::Keccak384, sym::hash_to_scalar)      => Self::Hash(HashVariant::HashKeccak384, Type::Scalar),
279            (sym::Keccak384, sym::hash_to_address_raw) => Self::Hash(HashVariant::HashKeccak384Raw, Type::Address),
280            (sym::Keccak384, sym::hash_to_field_raw)   => Self::Hash(HashVariant::HashKeccak384Raw, Type::Field),
281            (sym::Keccak384, sym::hash_to_group_raw)   => Self::Hash(HashVariant::HashKeccak384Raw, Type::Group),
282            (sym::Keccak384, sym::hash_to_i8_raw)      => Self::Hash(HashVariant::HashKeccak384Raw, Type::Integer(IntegerType::I8)),
283            (sym::Keccak384, sym::hash_to_i16_raw)     => Self::Hash(HashVariant::HashKeccak384Raw, Type::Integer(IntegerType::I16)),
284            (sym::Keccak384, sym::hash_to_i32_raw)     => Self::Hash(HashVariant::HashKeccak384Raw, Type::Integer(IntegerType::I32)),
285            (sym::Keccak384, sym::hash_to_i64_raw)     => Self::Hash(HashVariant::HashKeccak384Raw, Type::Integer(IntegerType::I64)),
286            (sym::Keccak384, sym::hash_to_i128_raw)    => Self::Hash(HashVariant::HashKeccak384Raw, Type::Integer(IntegerType::I128)),
287            (sym::Keccak384, sym::hash_to_u8_raw)      => Self::Hash(HashVariant::HashKeccak384Raw, Type::Integer(IntegerType::U8)),
288            (sym::Keccak384, sym::hash_to_u16_raw)     => Self::Hash(HashVariant::HashKeccak384Raw, Type::Integer(IntegerType::U16)),
289            (sym::Keccak384, sym::hash_to_u32_raw)     => Self::Hash(HashVariant::HashKeccak384Raw, Type::Integer(IntegerType::U32)),
290            (sym::Keccak384, sym::hash_to_u64_raw)     => Self::Hash(HashVariant::HashKeccak384Raw, Type::Integer(IntegerType::U64)),
291            (sym::Keccak384, sym::hash_to_u128_raw)    => Self::Hash(HashVariant::HashKeccak384Raw, Type::Integer(IntegerType::U128)),
292            (sym::Keccak384, sym::hash_to_scalar_raw)  => Self::Hash(HashVariant::HashKeccak384Raw, Type::Scalar),
293            (sym::Keccak384, sym::hash_native)         => Self::Hash(HashVariant::HashKeccak384Native, Type::Array(ArrayType::bit_array(384))),
294            (sym::Keccak384, sym::hash_native_raw)     => Self::Hash(HashVariant::HashKeccak384NativeRaw, Type::Array(ArrayType::bit_array(384))),
295
296            (sym::Keccak512, sym::hash_to_address)     => Self::Hash(HashVariant::HashKeccak512, Type::Address),
297            (sym::Keccak512, sym::hash_to_field)       => Self::Hash(HashVariant::HashKeccak512, Type::Field),
298            (sym::Keccak512, sym::hash_to_group)       => Self::Hash(HashVariant::HashKeccak512, Type::Group),
299            (sym::Keccak512, sym::hash_to_i8)          => Self::Hash(HashVariant::HashKeccak512, Type::Integer(IntegerType::I8)),
300            (sym::Keccak512, sym::hash_to_i16)         => Self::Hash(HashVariant::HashKeccak512, Type::Integer(IntegerType::I16)),
301            (sym::Keccak512, sym::hash_to_i32)         => Self::Hash(HashVariant::HashKeccak512, Type::Integer(IntegerType::I32)),
302            (sym::Keccak512, sym::hash_to_i64)         => Self::Hash(HashVariant::HashKeccak512, Type::Integer(IntegerType::I64)),
303            (sym::Keccak512, sym::hash_to_i128)        => Self::Hash(HashVariant::HashKeccak512, Type::Integer(IntegerType::I128)),
304            (sym::Keccak512, sym::hash_to_u8)          => Self::Hash(HashVariant::HashKeccak512, Type::Integer(IntegerType::U8)),
305            (sym::Keccak512, sym::hash_to_u16)         => Self::Hash(HashVariant::HashKeccak512, Type::Integer(IntegerType::U16)),
306            (sym::Keccak512, sym::hash_to_u32)         => Self::Hash(HashVariant::HashKeccak512, Type::Integer(IntegerType::U32)),
307            (sym::Keccak512, sym::hash_to_u64)         => Self::Hash(HashVariant::HashKeccak512, Type::Integer(IntegerType::U64)),
308            (sym::Keccak512, sym::hash_to_u128)        => Self::Hash(HashVariant::HashKeccak512, Type::Integer(IntegerType::U128)),
309            (sym::Keccak512, sym::hash_to_scalar)      => Self::Hash(HashVariant::HashKeccak512, Type::Scalar),
310            (sym::Keccak512, sym::hash_to_address_raw) => Self::Hash(HashVariant::HashKeccak512Raw, Type::Address),
311            (sym::Keccak512, sym::hash_to_field_raw)   => Self::Hash(HashVariant::HashKeccak512Raw, Type::Field),
312            (sym::Keccak512, sym::hash_to_group_raw)   => Self::Hash(HashVariant::HashKeccak512Raw, Type::Group),
313            (sym::Keccak512, sym::hash_to_i8_raw)      => Self::Hash(HashVariant::HashKeccak512Raw, Type::Integer(IntegerType::I8)),
314            (sym::Keccak512, sym::hash_to_i16_raw)     => Self::Hash(HashVariant::HashKeccak512Raw, Type::Integer(IntegerType::I16)),
315            (sym::Keccak512, sym::hash_to_i32_raw)     => Self::Hash(HashVariant::HashKeccak512Raw, Type::Integer(IntegerType::I32)),
316            (sym::Keccak512, sym::hash_to_i64_raw)     => Self::Hash(HashVariant::HashKeccak512Raw, Type::Integer(IntegerType::I64)),
317            (sym::Keccak512, sym::hash_to_i128_raw)    => Self::Hash(HashVariant::HashKeccak512Raw, Type::Integer(IntegerType::I128)),
318            (sym::Keccak512, sym::hash_to_u8_raw)      => Self::Hash(HashVariant::HashKeccak512Raw, Type::Integer(IntegerType::U8)),
319            (sym::Keccak512, sym::hash_to_u16_raw)     => Self::Hash(HashVariant::HashKeccak512Raw, Type::Integer(IntegerType::U16)),
320            (sym::Keccak512, sym::hash_to_u32_raw)     => Self::Hash(HashVariant::HashKeccak512Raw, Type::Integer(IntegerType::U32)),
321            (sym::Keccak512, sym::hash_to_u64_raw)     => Self::Hash(HashVariant::HashKeccak512Raw, Type::Integer(IntegerType::U64)),
322            (sym::Keccak512, sym::hash_to_u128_raw)    => Self::Hash(HashVariant::HashKeccak512Raw, Type::Integer(IntegerType::U128)),
323            (sym::Keccak512, sym::hash_to_scalar_raw)  => Self::Hash(HashVariant::HashKeccak512Raw, Type::Scalar),
324            (sym::Keccak512, sym::hash_native)         => Self::Hash(HashVariant::HashKeccak512Native, Type::Array(ArrayType::bit_array(512))),
325            (sym::Keccak512, sym::hash_native_raw)     => Self::Hash(HashVariant::HashKeccak512NativeRaw, Type::Array(ArrayType::bit_array(512))),
326
327            (sym::Pedersen64, sym::hash_to_address)     => Self::Hash(HashVariant::HashPED64, Type::Address),
328            (sym::Pedersen64, sym::hash_to_field)       => Self::Hash(HashVariant::HashPED64, Type::Field),
329            (sym::Pedersen64, sym::hash_to_group)       => Self::Hash(HashVariant::HashPED64, Type::Group),
330            (sym::Pedersen64, sym::hash_to_i8)          => Self::Hash(HashVariant::HashPED64, Type::Integer(IntegerType::I8)),
331            (sym::Pedersen64, sym::hash_to_i16)         => Self::Hash(HashVariant::HashPED64, Type::Integer(IntegerType::I16)),
332            (sym::Pedersen64, sym::hash_to_i32)         => Self::Hash(HashVariant::HashPED64, Type::Integer(IntegerType::I32)),
333            (sym::Pedersen64, sym::hash_to_i64)         => Self::Hash(HashVariant::HashPED64, Type::Integer(IntegerType::I64)),
334            (sym::Pedersen64, sym::hash_to_i128)        => Self::Hash(HashVariant::HashPED64, Type::Integer(IntegerType::I128)),
335            (sym::Pedersen64, sym::hash_to_u8)          => Self::Hash(HashVariant::HashPED64, Type::Integer(IntegerType::U8)),
336            (sym::Pedersen64, sym::hash_to_u16)         => Self::Hash(HashVariant::HashPED64, Type::Integer(IntegerType::U16)),
337            (sym::Pedersen64, sym::hash_to_u32)         => Self::Hash(HashVariant::HashPED64, Type::Integer(IntegerType::U32)),
338            (sym::Pedersen64, sym::hash_to_u64)         => Self::Hash(HashVariant::HashPED64, Type::Integer(IntegerType::U64)),
339            (sym::Pedersen64, sym::hash_to_u128)        => Self::Hash(HashVariant::HashPED64, Type::Integer(IntegerType::U128)),
340            (sym::Pedersen64, sym::hash_to_scalar)      => Self::Hash(HashVariant::HashPED64, Type::Scalar),
341            (sym::Pedersen64, sym::hash_to_address_raw) => Self::Hash(HashVariant::HashPED64Raw, Type::Address),
342            (sym::Pedersen64, sym::hash_to_field_raw)   => Self::Hash(HashVariant::HashPED64Raw, Type::Field),
343            (sym::Pedersen64, sym::hash_to_group_raw)   => Self::Hash(HashVariant::HashPED64Raw, Type::Group),
344            (sym::Pedersen64, sym::hash_to_i8_raw)      => Self::Hash(HashVariant::HashPED64Raw, Type::Integer(IntegerType::I8)),
345            (sym::Pedersen64, sym::hash_to_i16_raw)     => Self::Hash(HashVariant::HashPED64Raw, Type::Integer(IntegerType::I16)),
346            (sym::Pedersen64, sym::hash_to_i32_raw)     => Self::Hash(HashVariant::HashPED64Raw, Type::Integer(IntegerType::I32)),
347            (sym::Pedersen64, sym::hash_to_i64_raw)     => Self::Hash(HashVariant::HashPED64Raw, Type::Integer(IntegerType::I64)),
348            (sym::Pedersen64, sym::hash_to_i128_raw)    => Self::Hash(HashVariant::HashPED64Raw, Type::Integer(IntegerType::I128)),
349            (sym::Pedersen64, sym::hash_to_u8_raw)      => Self::Hash(HashVariant::HashPED64Raw, Type::Integer(IntegerType::U8)),
350            (sym::Pedersen64, sym::hash_to_u16_raw)     => Self::Hash(HashVariant::HashPED64Raw, Type::Integer(IntegerType::U16)),
351            (sym::Pedersen64, sym::hash_to_u32_raw)     => Self::Hash(HashVariant::HashPED64Raw, Type::Integer(IntegerType::U32)),
352            (sym::Pedersen64, sym::hash_to_u64_raw)     => Self::Hash(HashVariant::HashPED64Raw, Type::Integer(IntegerType::U64)),
353            (sym::Pedersen64, sym::hash_to_u128_raw)    => Self::Hash(HashVariant::HashPED64Raw, Type::Integer(IntegerType::U128)),
354            (sym::Pedersen64, sym::hash_to_scalar_raw)  => Self::Hash(HashVariant::HashPED64Raw, Type::Scalar),
355
356            (sym::Pedersen128, sym::hash_to_address)     => Self::Hash(HashVariant::HashPED128, Type::Address),
357            (sym::Pedersen128, sym::hash_to_field)       => Self::Hash(HashVariant::HashPED128, Type::Field),
358            (sym::Pedersen128, sym::hash_to_group)       => Self::Hash(HashVariant::HashPED128, Type::Group),
359            (sym::Pedersen128, sym::hash_to_i8)          => Self::Hash(HashVariant::HashPED128, Type::Integer(IntegerType::I8)),
360            (sym::Pedersen128, sym::hash_to_i16)         => Self::Hash(HashVariant::HashPED128, Type::Integer(IntegerType::I16)),
361            (sym::Pedersen128, sym::hash_to_i32)         => Self::Hash(HashVariant::HashPED128, Type::Integer(IntegerType::I32)),
362            (sym::Pedersen128, sym::hash_to_i64)         => Self::Hash(HashVariant::HashPED128, Type::Integer(IntegerType::I64)),
363            (sym::Pedersen128, sym::hash_to_i128)        => Self::Hash(HashVariant::HashPED128, Type::Integer(IntegerType::I128)),
364            (sym::Pedersen128, sym::hash_to_u8)          => Self::Hash(HashVariant::HashPED128, Type::Integer(IntegerType::U8)),
365            (sym::Pedersen128, sym::hash_to_u16)         => Self::Hash(HashVariant::HashPED128, Type::Integer(IntegerType::U16)),
366            (sym::Pedersen128, sym::hash_to_u32)         => Self::Hash(HashVariant::HashPED128, Type::Integer(IntegerType::U32)),
367            (sym::Pedersen128, sym::hash_to_u64)         => Self::Hash(HashVariant::HashPED128, Type::Integer(IntegerType::U64)),
368            (sym::Pedersen128, sym::hash_to_u128)        => Self::Hash(HashVariant::HashPED128, Type::Integer(IntegerType::U128)),
369            (sym::Pedersen128, sym::hash_to_scalar)      => Self::Hash(HashVariant::HashPED128, Type::Scalar),
370            (sym::Pedersen128, sym::hash_to_address_raw) => Self::Hash(HashVariant::HashPED128Raw, Type::Address),
371            (sym::Pedersen128, sym::hash_to_field_raw)   => Self::Hash(HashVariant::HashPED128Raw, Type::Field),
372            (sym::Pedersen128, sym::hash_to_group_raw)   => Self::Hash(HashVariant::HashPED128Raw, Type::Group),
373            (sym::Pedersen128, sym::hash_to_i8_raw)      => Self::Hash(HashVariant::HashPED128Raw, Type::Integer(IntegerType::I8)),
374            (sym::Pedersen128, sym::hash_to_i16_raw)     => Self::Hash(HashVariant::HashPED128Raw, Type::Integer(IntegerType::I16)),
375            (sym::Pedersen128, sym::hash_to_i32_raw)     => Self::Hash(HashVariant::HashPED128Raw, Type::Integer(IntegerType::I32)),
376            (sym::Pedersen128, sym::hash_to_i64_raw)     => Self::Hash(HashVariant::HashPED128Raw, Type::Integer(IntegerType::I64)),
377            (sym::Pedersen128, sym::hash_to_i128_raw)    => Self::Hash(HashVariant::HashPED128Raw, Type::Integer(IntegerType::I128)),
378            (sym::Pedersen128, sym::hash_to_u8_raw)      => Self::Hash(HashVariant::HashPED128Raw, Type::Integer(IntegerType::U8)),
379            (sym::Pedersen128, sym::hash_to_u16_raw)     => Self::Hash(HashVariant::HashPED128Raw, Type::Integer(IntegerType::U16)),
380            (sym::Pedersen128, sym::hash_to_u32_raw)     => Self::Hash(HashVariant::HashPED128Raw, Type::Integer(IntegerType::U32)),
381            (sym::Pedersen128, sym::hash_to_u64_raw)     => Self::Hash(HashVariant::HashPED128Raw, Type::Integer(IntegerType::U64)),
382            (sym::Pedersen128, sym::hash_to_u128_raw)    => Self::Hash(HashVariant::HashPED128Raw, Type::Integer(IntegerType::U128)),
383            (sym::Pedersen128, sym::hash_to_scalar_raw)  => Self::Hash(HashVariant::HashPED128Raw, Type::Scalar),
384
385            (sym::Poseidon2, sym::hash_to_address)     => Self::Hash(HashVariant::HashPSD2, Type::Address),
386            (sym::Poseidon2, sym::hash_to_field)       => Self::Hash(HashVariant::HashPSD2, Type::Field),
387            (sym::Poseidon2, sym::hash_to_group)       => Self::Hash(HashVariant::HashPSD2, Type::Group),
388            (sym::Poseidon2, sym::hash_to_i8)          => Self::Hash(HashVariant::HashPSD2, Type::Integer(IntegerType::I8)),
389            (sym::Poseidon2, sym::hash_to_i16)         => Self::Hash(HashVariant::HashPSD2, Type::Integer(IntegerType::I16)),
390            (sym::Poseidon2, sym::hash_to_i32)         => Self::Hash(HashVariant::HashPSD2, Type::Integer(IntegerType::I32)),
391            (sym::Poseidon2, sym::hash_to_i64)         => Self::Hash(HashVariant::HashPSD2, Type::Integer(IntegerType::I64)),
392            (sym::Poseidon2, sym::hash_to_i128)        => Self::Hash(HashVariant::HashPSD2, Type::Integer(IntegerType::I128)),
393            (sym::Poseidon2, sym::hash_to_u8)          => Self::Hash(HashVariant::HashPSD2, Type::Integer(IntegerType::U8)),
394            (sym::Poseidon2, sym::hash_to_u16)         => Self::Hash(HashVariant::HashPSD2, Type::Integer(IntegerType::U16)),
395            (sym::Poseidon2, sym::hash_to_u32)         => Self::Hash(HashVariant::HashPSD2, Type::Integer(IntegerType::U32)),
396            (sym::Poseidon2, sym::hash_to_u64)         => Self::Hash(HashVariant::HashPSD2, Type::Integer(IntegerType::U64)),
397            (sym::Poseidon2, sym::hash_to_u128)        => Self::Hash(HashVariant::HashPSD2, Type::Integer(IntegerType::U128)),
398            (sym::Poseidon2, sym::hash_to_scalar)      => Self::Hash(HashVariant::HashPSD2, Type::Scalar),
399            (sym::Poseidon2, sym::hash_to_address_raw) => Self::Hash(HashVariant::HashPSD2Raw, Type::Address),
400            (sym::Poseidon2, sym::hash_to_field_raw)   => Self::Hash(HashVariant::HashPSD2Raw, Type::Field),
401            (sym::Poseidon2, sym::hash_to_group_raw)   => Self::Hash(HashVariant::HashPSD2Raw, Type::Group),
402            (sym::Poseidon2, sym::hash_to_i8_raw)      => Self::Hash(HashVariant::HashPSD2Raw, Type::Integer(IntegerType::I8)),
403            (sym::Poseidon2, sym::hash_to_i16_raw)     => Self::Hash(HashVariant::HashPSD2Raw, Type::Integer(IntegerType::I16)),
404            (sym::Poseidon2, sym::hash_to_i32_raw)     => Self::Hash(HashVariant::HashPSD2Raw, Type::Integer(IntegerType::I32)),
405            (sym::Poseidon2, sym::hash_to_i64_raw)     => Self::Hash(HashVariant::HashPSD2Raw, Type::Integer(IntegerType::I64)),
406            (sym::Poseidon2, sym::hash_to_i128_raw)    => Self::Hash(HashVariant::HashPSD2Raw, Type::Integer(IntegerType::I128)),
407            (sym::Poseidon2, sym::hash_to_u8_raw)      => Self::Hash(HashVariant::HashPSD2Raw, Type::Integer(IntegerType::U8)),
408            (sym::Poseidon2, sym::hash_to_u16_raw)     => Self::Hash(HashVariant::HashPSD2Raw, Type::Integer(IntegerType::U16)),
409            (sym::Poseidon2, sym::hash_to_u32_raw)     => Self::Hash(HashVariant::HashPSD2Raw, Type::Integer(IntegerType::U32)),
410            (sym::Poseidon2, sym::hash_to_u64_raw)     => Self::Hash(HashVariant::HashPSD2Raw, Type::Integer(IntegerType::U64)),
411            (sym::Poseidon2, sym::hash_to_u128_raw)    => Self::Hash(HashVariant::HashPSD2Raw, Type::Integer(IntegerType::U128)),
412            (sym::Poseidon2, sym::hash_to_scalar_raw)  => Self::Hash(HashVariant::HashPSD2Raw, Type::Scalar),
413
414            (sym::Poseidon4, sym::hash_to_address)     => Self::Hash(HashVariant::HashPSD4, Type::Address),
415            (sym::Poseidon4, sym::hash_to_field)       => Self::Hash(HashVariant::HashPSD4, Type::Field),
416            (sym::Poseidon4, sym::hash_to_group)       => Self::Hash(HashVariant::HashPSD4, Type::Group),
417            (sym::Poseidon4, sym::hash_to_i8)          => Self::Hash(HashVariant::HashPSD4, Type::Integer(IntegerType::I8)),
418            (sym::Poseidon4, sym::hash_to_i16)         => Self::Hash(HashVariant::HashPSD4, Type::Integer(IntegerType::I16)),
419            (sym::Poseidon4, sym::hash_to_i32)         => Self::Hash(HashVariant::HashPSD4, Type::Integer(IntegerType::I32)),
420            (sym::Poseidon4, sym::hash_to_i64)         => Self::Hash(HashVariant::HashPSD4, Type::Integer(IntegerType::I64)),
421            (sym::Poseidon4, sym::hash_to_i128)        => Self::Hash(HashVariant::HashPSD4, Type::Integer(IntegerType::I128)),
422            (sym::Poseidon4, sym::hash_to_u8)          => Self::Hash(HashVariant::HashPSD4, Type::Integer(IntegerType::U8)),
423            (sym::Poseidon4, sym::hash_to_u16)         => Self::Hash(HashVariant::HashPSD4, Type::Integer(IntegerType::U16)),
424            (sym::Poseidon4, sym::hash_to_u32)         => Self::Hash(HashVariant::HashPSD4, Type::Integer(IntegerType::U32)),
425            (sym::Poseidon4, sym::hash_to_u64)         => Self::Hash(HashVariant::HashPSD4, Type::Integer(IntegerType::U64)),
426            (sym::Poseidon4, sym::hash_to_u128)        => Self::Hash(HashVariant::HashPSD4, Type::Integer(IntegerType::U128)),
427            (sym::Poseidon4, sym::hash_to_scalar)      => Self::Hash(HashVariant::HashPSD4, Type::Scalar),
428            (sym::Poseidon4, sym::hash_to_address_raw) => Self::Hash(HashVariant::HashPSD4Raw, Type::Address),
429            (sym::Poseidon4, sym::hash_to_field_raw)   => Self::Hash(HashVariant::HashPSD4Raw, Type::Field),
430            (sym::Poseidon4, sym::hash_to_group_raw)   => Self::Hash(HashVariant::HashPSD4Raw, Type::Group),
431            (sym::Poseidon4, sym::hash_to_i8_raw)      => Self::Hash(HashVariant::HashPSD4Raw, Type::Integer(IntegerType::I8)),
432            (sym::Poseidon4, sym::hash_to_i16_raw)     => Self::Hash(HashVariant::HashPSD4Raw, Type::Integer(IntegerType::I16)),
433            (sym::Poseidon4, sym::hash_to_i32_raw)     => Self::Hash(HashVariant::HashPSD4Raw, Type::Integer(IntegerType::I32)),
434            (sym::Poseidon4, sym::hash_to_i64_raw)     => Self::Hash(HashVariant::HashPSD4Raw, Type::Integer(IntegerType::I64)),
435            (sym::Poseidon4, sym::hash_to_i128_raw)    => Self::Hash(HashVariant::HashPSD4Raw, Type::Integer(IntegerType::I128)),
436            (sym::Poseidon4, sym::hash_to_u8_raw)      => Self::Hash(HashVariant::HashPSD4Raw, Type::Integer(IntegerType::U8)),
437            (sym::Poseidon4, sym::hash_to_u16_raw)     => Self::Hash(HashVariant::HashPSD4Raw, Type::Integer(IntegerType::U16)),
438            (sym::Poseidon4, sym::hash_to_u32_raw)     => Self::Hash(HashVariant::HashPSD4Raw, Type::Integer(IntegerType::U32)),
439            (sym::Poseidon4, sym::hash_to_u64_raw)     => Self::Hash(HashVariant::HashPSD4Raw, Type::Integer(IntegerType::U64)),
440            (sym::Poseidon4, sym::hash_to_u128_raw)    => Self::Hash(HashVariant::HashPSD4Raw, Type::Integer(IntegerType::U128)),
441            (sym::Poseidon4, sym::hash_to_scalar_raw)  => Self::Hash(HashVariant::HashPSD4Raw, Type::Scalar),
442
443            (sym::Poseidon8, sym::hash_to_address)     => Self::Hash(HashVariant::HashPSD8, Type::Address),
444            (sym::Poseidon8, sym::hash_to_field)       => Self::Hash(HashVariant::HashPSD8, Type::Field),
445            (sym::Poseidon8, sym::hash_to_group)       => Self::Hash(HashVariant::HashPSD8, Type::Group),
446            (sym::Poseidon8, sym::hash_to_i8)          => Self::Hash(HashVariant::HashPSD8, Type::Integer(IntegerType::I8)),
447            (sym::Poseidon8, sym::hash_to_i16)         => Self::Hash(HashVariant::HashPSD8, Type::Integer(IntegerType::I16)),
448            (sym::Poseidon8, sym::hash_to_i32)         => Self::Hash(HashVariant::HashPSD8, Type::Integer(IntegerType::I32)),
449            (sym::Poseidon8, sym::hash_to_i64)         => Self::Hash(HashVariant::HashPSD8, Type::Integer(IntegerType::I64)),
450            (sym::Poseidon8, sym::hash_to_i128)        => Self::Hash(HashVariant::HashPSD8, Type::Integer(IntegerType::I128)),
451            (sym::Poseidon8, sym::hash_to_u8)          => Self::Hash(HashVariant::HashPSD8, Type::Integer(IntegerType::U8)),
452            (sym::Poseidon8, sym::hash_to_u16)         => Self::Hash(HashVariant::HashPSD8, Type::Integer(IntegerType::U16)),
453            (sym::Poseidon8, sym::hash_to_u32)         => Self::Hash(HashVariant::HashPSD8, Type::Integer(IntegerType::U32)),
454            (sym::Poseidon8, sym::hash_to_u64)         => Self::Hash(HashVariant::HashPSD8, Type::Integer(IntegerType::U64)),
455            (sym::Poseidon8, sym::hash_to_u128)        => Self::Hash(HashVariant::HashPSD8, Type::Integer(IntegerType::U128)),
456            (sym::Poseidon8, sym::hash_to_scalar)      => Self::Hash(HashVariant::HashPSD8, Type::Scalar),
457            (sym::Poseidon8, sym::hash_to_address_raw) => Self::Hash(HashVariant::HashPSD8Raw, Type::Address),
458            (sym::Poseidon8, sym::hash_to_field_raw)   => Self::Hash(HashVariant::HashPSD8Raw, Type::Field),
459            (sym::Poseidon8, sym::hash_to_group_raw)   => Self::Hash(HashVariant::HashPSD8Raw, Type::Group),
460            (sym::Poseidon8, sym::hash_to_i8_raw)      => Self::Hash(HashVariant::HashPSD8Raw, Type::Integer(IntegerType::I8)),
461            (sym::Poseidon8, sym::hash_to_i16_raw)     => Self::Hash(HashVariant::HashPSD8Raw, Type::Integer(IntegerType::I16)),
462            (sym::Poseidon8, sym::hash_to_i32_raw)     => Self::Hash(HashVariant::HashPSD8Raw, Type::Integer(IntegerType::I32)),
463            (sym::Poseidon8, sym::hash_to_i64_raw)     => Self::Hash(HashVariant::HashPSD8Raw, Type::Integer(IntegerType::I64)),
464            (sym::Poseidon8, sym::hash_to_i128_raw)    => Self::Hash(HashVariant::HashPSD8Raw, Type::Integer(IntegerType::I128)),
465            (sym::Poseidon8, sym::hash_to_u8_raw)      => Self::Hash(HashVariant::HashPSD8Raw, Type::Integer(IntegerType::U8)),
466            (sym::Poseidon8, sym::hash_to_u16_raw)     => Self::Hash(HashVariant::HashPSD8Raw, Type::Integer(IntegerType::U16)),
467            (sym::Poseidon8, sym::hash_to_u32_raw)     => Self::Hash(HashVariant::HashPSD8Raw, Type::Integer(IntegerType::U32)),
468            (sym::Poseidon8, sym::hash_to_u64_raw)     => Self::Hash(HashVariant::HashPSD8Raw, Type::Integer(IntegerType::U64)),
469            (sym::Poseidon8, sym::hash_to_u128_raw)    => Self::Hash(HashVariant::HashPSD8Raw, Type::Integer(IntegerType::U128)),
470            (sym::Poseidon8, sym::hash_to_scalar_raw)  => Self::Hash(HashVariant::HashPSD8Raw, Type::Scalar),
471
472            (sym::SHA3_256, sym::hash_to_address)     => Self::Hash(HashVariant::HashSha3_256, Type::Address),
473            (sym::SHA3_256, sym::hash_to_field)       => Self::Hash(HashVariant::HashSha3_256, Type::Field),
474            (sym::SHA3_256, sym::hash_to_group)       => Self::Hash(HashVariant::HashSha3_256, Type::Group),
475            (sym::SHA3_256, sym::hash_to_i8)          => Self::Hash(HashVariant::HashSha3_256, Type::Integer(IntegerType::I8)),
476            (sym::SHA3_256, sym::hash_to_i16)         => Self::Hash(HashVariant::HashSha3_256, Type::Integer(IntegerType::I16)),
477            (sym::SHA3_256, sym::hash_to_i32)         => Self::Hash(HashVariant::HashSha3_256, Type::Integer(IntegerType::I32)),
478            (sym::SHA3_256, sym::hash_to_i64)         => Self::Hash(HashVariant::HashSha3_256, Type::Integer(IntegerType::I64)),
479            (sym::SHA3_256, sym::hash_to_i128)        => Self::Hash(HashVariant::HashSha3_256, Type::Integer(IntegerType::I128)),
480            (sym::SHA3_256, sym::hash_to_u8)          => Self::Hash(HashVariant::HashSha3_256, Type::Integer(IntegerType::U8)),
481            (sym::SHA3_256, sym::hash_to_u16)         => Self::Hash(HashVariant::HashSha3_256, Type::Integer(IntegerType::U16)),
482            (sym::SHA3_256, sym::hash_to_u32)         => Self::Hash(HashVariant::HashSha3_256, Type::Integer(IntegerType::U32)),
483            (sym::SHA3_256, sym::hash_to_u64)         => Self::Hash(HashVariant::HashSha3_256, Type::Integer(IntegerType::U64)),
484            (sym::SHA3_256, sym::hash_to_u128)        => Self::Hash(HashVariant::HashSha3_256, Type::Integer(IntegerType::U128)),
485            (sym::SHA3_256, sym::hash_to_scalar)      => Self::Hash(HashVariant::HashSha3_256, Type::Scalar),
486            (sym::SHA3_256, sym::hash_to_address_raw) => Self::Hash(HashVariant::HashSha3_256Raw, Type::Address),
487            (sym::SHA3_256, sym::hash_to_field_raw)   => Self::Hash(HashVariant::HashSha3_256Raw, Type::Field),
488            (sym::SHA3_256, sym::hash_to_group_raw)   => Self::Hash(HashVariant::HashSha3_256Raw, Type::Group),
489            (sym::SHA3_256, sym::hash_to_i8_raw)      => Self::Hash(HashVariant::HashSha3_256Raw, Type::Integer(IntegerType::I8)),
490            (sym::SHA3_256, sym::hash_to_i16_raw)     => Self::Hash(HashVariant::HashSha3_256Raw, Type::Integer(IntegerType::I16)),
491            (sym::SHA3_256, sym::hash_to_i32_raw)     => Self::Hash(HashVariant::HashSha3_256Raw, Type::Integer(IntegerType::I32)),
492            (sym::SHA3_256, sym::hash_to_i64_raw)     => Self::Hash(HashVariant::HashSha3_256Raw, Type::Integer(IntegerType::I64)),
493            (sym::SHA3_256, sym::hash_to_i128_raw)    => Self::Hash(HashVariant::HashSha3_256Raw, Type::Integer(IntegerType::I128)),
494            (sym::SHA3_256, sym::hash_to_u8_raw)      => Self::Hash(HashVariant::HashSha3_256Raw, Type::Integer(IntegerType::U8)),
495            (sym::SHA3_256, sym::hash_to_u16_raw)     => Self::Hash(HashVariant::HashSha3_256Raw, Type::Integer(IntegerType::U16)),
496            (sym::SHA3_256, sym::hash_to_u32_raw)     => Self::Hash(HashVariant::HashSha3_256Raw, Type::Integer(IntegerType::U32)),
497            (sym::SHA3_256, sym::hash_to_u64_raw)     => Self::Hash(HashVariant::HashSha3_256Raw, Type::Integer(IntegerType::U64)),
498            (sym::SHA3_256, sym::hash_to_u128_raw)    => Self::Hash(HashVariant::HashSha3_256Raw, Type::Integer(IntegerType::U128)),
499            (sym::SHA3_256, sym::hash_to_scalar_raw)  => Self::Hash(HashVariant::HashSha3_256Raw, Type::Scalar),
500            (sym::SHA3_256, sym::hash_native)         => Self::Hash(HashVariant::HashSha3_256Native, Type::Array(ArrayType::bit_array(256))),
501            (sym::SHA3_256, sym::hash_native_raw)     => Self::Hash(HashVariant::HashSha3_256NativeRaw, Type::Array(ArrayType::bit_array(256))),
502
503            (sym::SHA3_384, sym::hash_to_address)     => Self::Hash(HashVariant::HashSha3_384, Type::Address),
504            (sym::SHA3_384, sym::hash_to_field)       => Self::Hash(HashVariant::HashSha3_384, Type::Field),
505            (sym::SHA3_384, sym::hash_to_group)       => Self::Hash(HashVariant::HashSha3_384, Type::Group),
506            (sym::SHA3_384, sym::hash_to_i8)          => Self::Hash(HashVariant::HashSha3_384, Type::Integer(IntegerType::I8)),
507            (sym::SHA3_384, sym::hash_to_i16)         => Self::Hash(HashVariant::HashSha3_384, Type::Integer(IntegerType::I16)),
508            (sym::SHA3_384, sym::hash_to_i32)         => Self::Hash(HashVariant::HashSha3_384, Type::Integer(IntegerType::I32)),
509            (sym::SHA3_384, sym::hash_to_i64)         => Self::Hash(HashVariant::HashSha3_384, Type::Integer(IntegerType::I64)),
510            (sym::SHA3_384, sym::hash_to_i128)        => Self::Hash(HashVariant::HashSha3_384, Type::Integer(IntegerType::I128)),
511            (sym::SHA3_384, sym::hash_to_u8)          => Self::Hash(HashVariant::HashSha3_384, Type::Integer(IntegerType::U8)),
512            (sym::SHA3_384, sym::hash_to_u16)         => Self::Hash(HashVariant::HashSha3_384, Type::Integer(IntegerType::U16)),
513            (sym::SHA3_384, sym::hash_to_u32)         => Self::Hash(HashVariant::HashSha3_384, Type::Integer(IntegerType::U32)),
514            (sym::SHA3_384, sym::hash_to_u64)         => Self::Hash(HashVariant::HashSha3_384, Type::Integer(IntegerType::U64)),
515            (sym::SHA3_384, sym::hash_to_u128)        => Self::Hash(HashVariant::HashSha3_384, Type::Integer(IntegerType::U128)),
516            (sym::SHA3_384, sym::hash_to_scalar)      => Self::Hash(HashVariant::HashSha3_384, Type::Scalar),
517            (sym::SHA3_384, sym::hash_to_address_raw) => Self::Hash(HashVariant::HashSha3_384Raw, Type::Address),
518            (sym::SHA3_384, sym::hash_to_field_raw)   => Self::Hash(HashVariant::HashSha3_384Raw, Type::Field),
519            (sym::SHA3_384, sym::hash_to_group_raw)   => Self::Hash(HashVariant::HashSha3_384Raw, Type::Group),
520            (sym::SHA3_384, sym::hash_to_i8_raw)      => Self::Hash(HashVariant::HashSha3_384Raw, Type::Integer(IntegerType::I8)),
521            (sym::SHA3_384, sym::hash_to_i16_raw)     => Self::Hash(HashVariant::HashSha3_384Raw, Type::Integer(IntegerType::I16)),
522            (sym::SHA3_384, sym::hash_to_i32_raw)     => Self::Hash(HashVariant::HashSha3_384Raw, Type::Integer(IntegerType::I32)),
523            (sym::SHA3_384, sym::hash_to_i64_raw)     => Self::Hash(HashVariant::HashSha3_384Raw, Type::Integer(IntegerType::I64)),
524            (sym::SHA3_384, sym::hash_to_i128_raw)    => Self::Hash(HashVariant::HashSha3_384Raw, Type::Integer(IntegerType::I128)),
525            (sym::SHA3_384, sym::hash_to_u8_raw)      => Self::Hash(HashVariant::HashSha3_384Raw, Type::Integer(IntegerType::U8)),
526            (sym::SHA3_384, sym::hash_to_u16_raw)     => Self::Hash(HashVariant::HashSha3_384Raw, Type::Integer(IntegerType::U16)),
527            (sym::SHA3_384, sym::hash_to_u32_raw)     => Self::Hash(HashVariant::HashSha3_384Raw, Type::Integer(IntegerType::U32)),
528            (sym::SHA3_384, sym::hash_to_u64_raw)     => Self::Hash(HashVariant::HashSha3_384Raw, Type::Integer(IntegerType::U64)),
529            (sym::SHA3_384, sym::hash_to_u128_raw)    => Self::Hash(HashVariant::HashSha3_384Raw, Type::Integer(IntegerType::U128)),
530            (sym::SHA3_384, sym::hash_to_scalar_raw)  => Self::Hash(HashVariant::HashSha3_384Raw, Type::Scalar),
531            (sym::SHA3_384, sym::hash_native)         => Self::Hash(HashVariant::HashSha3_384Native, Type::Array(ArrayType::bit_array(384))),
532            (sym::SHA3_384, sym::hash_native_raw)     => Self::Hash(HashVariant::HashSha3_384NativeRaw, Type::Array(ArrayType::bit_array(384))),
533
534            (sym::SHA3_512, sym::hash_to_address)     => Self::Hash(HashVariant::HashSha3_512, Type::Address),
535            (sym::SHA3_512, sym::hash_to_field)       => Self::Hash(HashVariant::HashSha3_512, Type::Field),
536            (sym::SHA3_512, sym::hash_to_group)       => Self::Hash(HashVariant::HashSha3_512, Type::Group),
537            (sym::SHA3_512, sym::hash_to_i8)          => Self::Hash(HashVariant::HashSha3_512, Type::Integer(IntegerType::I8)),
538            (sym::SHA3_512, sym::hash_to_i16)         => Self::Hash(HashVariant::HashSha3_512, Type::Integer(IntegerType::I16)),
539            (sym::SHA3_512, sym::hash_to_i32)         => Self::Hash(HashVariant::HashSha3_512, Type::Integer(IntegerType::I32)),
540            (sym::SHA3_512, sym::hash_to_i64)         => Self::Hash(HashVariant::HashSha3_512, Type::Integer(IntegerType::I64)),
541            (sym::SHA3_512, sym::hash_to_i128)        => Self::Hash(HashVariant::HashSha3_512, Type::Integer(IntegerType::I128)),
542            (sym::SHA3_512, sym::hash_to_u8)          => Self::Hash(HashVariant::HashSha3_512, Type::Integer(IntegerType::U8)),
543            (sym::SHA3_512, sym::hash_to_u16)         => Self::Hash(HashVariant::HashSha3_512, Type::Integer(IntegerType::U16)),
544            (sym::SHA3_512, sym::hash_to_u32)         => Self::Hash(HashVariant::HashSha3_512, Type::Integer(IntegerType::U32)),
545            (sym::SHA3_512, sym::hash_to_u64)         => Self::Hash(HashVariant::HashSha3_512, Type::Integer(IntegerType::U64)),
546            (sym::SHA3_512, sym::hash_to_u128)        => Self::Hash(HashVariant::HashSha3_512, Type::Integer(IntegerType::U128)),
547            (sym::SHA3_512, sym::hash_to_scalar)      => Self::Hash(HashVariant::HashSha3_512, Type::Scalar),
548            (sym::SHA3_512, sym::hash_to_address_raw) => Self::Hash(HashVariant::HashSha3_512Raw, Type::Address),
549            (sym::SHA3_512, sym::hash_to_field_raw)   => Self::Hash(HashVariant::HashSha3_512Raw, Type::Field),
550            (sym::SHA3_512, sym::hash_to_group_raw)   => Self::Hash(HashVariant::HashSha3_512Raw, Type::Group),
551            (sym::SHA3_512, sym::hash_to_i8_raw)      => Self::Hash(HashVariant::HashSha3_512Raw, Type::Integer(IntegerType::I8)),
552            (sym::SHA3_512, sym::hash_to_i16_raw)     => Self::Hash(HashVariant::HashSha3_512Raw, Type::Integer(IntegerType::I16)),
553            (sym::SHA3_512, sym::hash_to_i32_raw)     => Self::Hash(HashVariant::HashSha3_512Raw, Type::Integer(IntegerType::I32)),
554            (sym::SHA3_512, sym::hash_to_i64_raw)     => Self::Hash(HashVariant::HashSha3_512Raw, Type::Integer(IntegerType::I64)),
555            (sym::SHA3_512, sym::hash_to_i128_raw)    => Self::Hash(HashVariant::HashSha3_512Raw, Type::Integer(IntegerType::I128)),
556            (sym::SHA3_512, sym::hash_to_u8_raw)      => Self::Hash(HashVariant::HashSha3_512Raw, Type::Integer(IntegerType::U8)),
557            (sym::SHA3_512, sym::hash_to_u16_raw)     => Self::Hash(HashVariant::HashSha3_512Raw, Type::Integer(IntegerType::U16)),
558            (sym::SHA3_512, sym::hash_to_u32_raw)     => Self::Hash(HashVariant::HashSha3_512Raw, Type::Integer(IntegerType::U32)),
559            (sym::SHA3_512, sym::hash_to_u64_raw)     => Self::Hash(HashVariant::HashSha3_512Raw, Type::Integer(IntegerType::U64)),
560            (sym::SHA3_512, sym::hash_to_u128_raw)    => Self::Hash(HashVariant::HashSha3_512Raw, Type::Integer(IntegerType::U128)),
561            (sym::SHA3_512, sym::hash_to_scalar_raw)  => Self::Hash(HashVariant::HashSha3_512Raw, Type::Scalar),
562            (sym::SHA3_512, sym::hash_native)         => Self::Hash(HashVariant::HashSha3_512Native, Type::Array(ArrayType::bit_array(512))),
563            (sym::SHA3_512, sym::hash_native_raw)     => Self::Hash(HashVariant::HashSha3_512NativeRaw, Type::Array(ArrayType::bit_array(512))),
564
565            (sym::ECDSA, sym::verify_digest)          => Self::ECDSAVerify(ECDSAVerifyVariant::Digest),
566            (sym::ECDSA, sym::verify_digest_eth)      => Self::ECDSAVerify(ECDSAVerifyVariant::DigestEth),
567            (sym::ECDSA, sym::verify_keccak256)       => Self::ECDSAVerify(ECDSAVerifyVariant::HashKeccak256),
568            (sym::ECDSA, sym::verify_keccak256_raw)   => Self::ECDSAVerify(ECDSAVerifyVariant::HashKeccak256Raw),
569            (sym::ECDSA, sym::verify_keccak256_eth)   => Self::ECDSAVerify(ECDSAVerifyVariant::HashKeccak256Eth),
570            (sym::ECDSA, sym::verify_keccak384)       => Self::ECDSAVerify(ECDSAVerifyVariant::HashKeccak384),
571            (sym::ECDSA, sym::verify_keccak384_raw)   => Self::ECDSAVerify(ECDSAVerifyVariant::HashKeccak384Raw),
572            (sym::ECDSA, sym::verify_keccak384_eth)   => Self::ECDSAVerify(ECDSAVerifyVariant::HashKeccak384Eth),
573            (sym::ECDSA, sym::verify_keccak512)       => Self::ECDSAVerify(ECDSAVerifyVariant::HashKeccak512),
574            (sym::ECDSA, sym::verify_keccak512_raw)   => Self::ECDSAVerify(ECDSAVerifyVariant::HashKeccak512Raw),
575            (sym::ECDSA, sym::verify_keccak512_eth)   => Self::ECDSAVerify(ECDSAVerifyVariant::HashKeccak512Eth),
576            (sym::ECDSA, sym::verify_sha3_256)        => Self::ECDSAVerify(ECDSAVerifyVariant::HashSha3_256),
577            (sym::ECDSA, sym::verify_sha3_256_raw)    => Self::ECDSAVerify(ECDSAVerifyVariant::HashSha3_256Raw),
578            (sym::ECDSA, sym::verify_sha3_256_eth)    => Self::ECDSAVerify(ECDSAVerifyVariant::HashSha3_256Eth),
579            (sym::ECDSA, sym::verify_sha3_384)        => Self::ECDSAVerify(ECDSAVerifyVariant::HashSha3_384),
580            (sym::ECDSA, sym::verify_sha3_384_raw)    => Self::ECDSAVerify(ECDSAVerifyVariant::HashSha3_384Raw),
581            (sym::ECDSA, sym::verify_sha3_384_eth)    => Self::ECDSAVerify(ECDSAVerifyVariant::HashSha3_384Eth),
582            (sym::ECDSA, sym::verify_sha3_512)        => Self::ECDSAVerify(ECDSAVerifyVariant::HashSha3_512),
583            (sym::ECDSA, sym::verify_sha3_512_raw)    => Self::ECDSAVerify(ECDSAVerifyVariant::HashSha3_512Raw),
584            (sym::ECDSA, sym::verify_sha3_512_eth)    => Self::ECDSAVerify(ECDSAVerifyVariant::HashSha3_512Eth),
585
586            (_, sym::get) => Self::Get,
587            (_, sym::set) => Self::Set,
588
589            (sym::Mapping, sym::get_or_use) => Self::MappingGetOrUse,
590            (sym::Mapping, sym::remove) => Self::MappingRemove,
591            (sym::Mapping, sym::contains) => Self::MappingContains,
592
593            (sym::Optional, sym::unwrap) => Self::OptionalUnwrap,
594            (sym::Optional, sym::unwrap_or) => Self::OptionalUnwrapOr,
595
596            (sym::Vector, sym::push) => Self::VectorPush,
597            (sym::Vector, sym::len) => Self::VectorLen,
598            (sym::Vector, sym::clear) => Self::VectorClear,
599            (sym::Vector, sym::pop) => Self::VectorPop,
600            (sym::Vector, sym::swap_remove) => Self::VectorSwapRemove,
601
602            (sym::group, sym::to_x_coordinate) => Self::GroupToXCoordinate,
603            (sym::group, sym::to_y_coordinate) => Self::GroupToYCoordinate,
604
605            (sym::ProgramCore, sym::checksum) => Self::ProgramChecksum,
606            (sym::ProgramCore, sym::edition) => Self::ProgramEdition,
607            (sym::ProgramCore, sym::program_owner) => Self::ProgramOwner,
608
609            (sym::signature, sym::verify) => Self::SignatureVerify,
610            (sym::Future, sym::Await) => Self::FutureAwait,
611
612            (sym::Serialize, sym::to_bits) => Self::Serialize(SerializeVariant::ToBits),
613            (sym::Serialize, sym::to_bits_raw) => Self::Serialize(SerializeVariant::ToBitsRaw),
614
615            (sym::CheatCode, sym::print_mapping) => Self::CheatCodePrintMapping,
616            (sym::CheatCode, sym::set_block_height) => Self::CheatCodeSetBlockHeight,
617            (sym::CheatCode, sym::set_block_timestamp) => Self::CheatCodeSetBlockTimestamp,
618            (sym::CheatCode, sym::set_signer) => Self::CheatCodeSetSigner,
619            _ => return None,
620        })
621    }
622
623    /// Returns the number of arguments required by the instruction.
624    pub fn num_args(&self) -> usize {
625        match self {
626            Self::ChaChaRand(_) => 0,
627            Self::Commit(_, _) => 2,
628            Self::Hash(_, _) => 1,
629            Self::ECDSAVerify(_) => 3,
630
631            Self::Get => 2,
632            Self::Set => 3,
633
634            Self::MappingGetOrUse => 3,
635            Self::MappingRemove => 2,
636            Self::MappingContains => 2,
637
638            Self::OptionalUnwrap => 1,
639            Self::OptionalUnwrapOr => 2,
640
641            Self::VectorPush => 2,
642            Self::VectorLen => 1,
643            Self::VectorClear => 1,
644            Self::VectorPop => 1,
645            Self::VectorSwapRemove => 2,
646
647            Self::GroupToXCoordinate => 1,
648            Self::GroupToYCoordinate => 1,
649
650            Self::SignatureVerify => 3,
651            Self::FutureAwait => 1,
652
653            Self::ProgramChecksum => 1,
654            Self::ProgramEdition => 1,
655            Self::ProgramOwner => 1,
656
657            Self::Serialize(_) => 1,
658            Self::Deserialize(_, _) => 1,
659
660            Self::CheatCodePrintMapping => 1,
661            Self::CheatCodeSetBlockHeight => 1,
662            Self::CheatCodeSetBlockTimestamp => 1,
663            Self::CheatCodeSetSigner => 1,
664        }
665    }
666
667    /// Returns whether or not this function is finalize command.
668    pub fn is_finalize_command(&self) -> bool {
669        match self {
670            CoreFunction::FutureAwait
671            | CoreFunction::ChaChaRand(_)
672            | CoreFunction::ECDSAVerify(_)
673            | CoreFunction::Get
674            | CoreFunction::MappingGetOrUse
675            | CoreFunction::Set
676            | CoreFunction::MappingRemove
677            | CoreFunction::MappingContains
678            | CoreFunction::ProgramChecksum
679            | CoreFunction::ProgramEdition
680            | CoreFunction::ProgramOwner
681            | CoreFunction::VectorPush
682            | CoreFunction::VectorLen
683            | CoreFunction::VectorClear
684            | CoreFunction::VectorPop
685            | CoreFunction::VectorSwapRemove => true,
686            CoreFunction::Commit(_, _)
687            | CoreFunction::Hash(_, _)
688            | CoreFunction::OptionalUnwrap
689            | CoreFunction::OptionalUnwrapOr
690            | CoreFunction::GroupToXCoordinate
691            | CoreFunction::GroupToYCoordinate
692            | CoreFunction::SignatureVerify
693            | CoreFunction::Serialize(_)
694            | CoreFunction::Deserialize(_, _)
695            | CoreFunction::CheatCodePrintMapping
696            | CoreFunction::CheatCodeSetBlockHeight
697            | CoreFunction::CheatCodeSetBlockTimestamp
698            | CoreFunction::CheatCodeSetSigner => false,
699        }
700    }
701
702    /// Returns whether or not this function has side effects
703    pub fn is_pure(&self) -> bool {
704        match self {
705            CoreFunction::FutureAwait
706            | CoreFunction::Set
707            | CoreFunction::MappingRemove
708            | CoreFunction::VectorPush
709            | CoreFunction::VectorClear
710            | CoreFunction::CheatCodePrintMapping
711            | CoreFunction::CheatCodeSetBlockHeight
712            | CoreFunction::CheatCodeSetBlockTimestamp
713            | CoreFunction::CheatCodeSetSigner
714            | CoreFunction::VectorPop
715            | CoreFunction::VectorSwapRemove => false,
716
717            CoreFunction::ChaChaRand(_)
718            | CoreFunction::ECDSAVerify(_)
719            | CoreFunction::Get
720            | CoreFunction::MappingGetOrUse
721            | CoreFunction::MappingContains
722            | CoreFunction::ProgramChecksum
723            | CoreFunction::ProgramEdition
724            | CoreFunction::ProgramOwner
725            | CoreFunction::VectorLen
726            | CoreFunction::Commit(_, _)
727            | CoreFunction::Hash(_, _)
728            | CoreFunction::OptionalUnwrap
729            | CoreFunction::OptionalUnwrapOr
730            | CoreFunction::GroupToXCoordinate
731            | CoreFunction::GroupToYCoordinate
732            | CoreFunction::SignatureVerify
733            | CoreFunction::Serialize(_)
734            | CoreFunction::Deserialize(_, _) => true,
735        }
736    }
737}
738
739impl TryFrom<&AssociatedFunctionExpression> for CoreFunction {
740    type Error = anyhow::Error;
741
742    fn try_from(associated_function: &AssociatedFunctionExpression) -> anyhow::Result<Self> {
743        match CoreFunction::from_symbols(associated_function.variant.name, associated_function.name.name) {
744            Some(core_function) => Ok(core_function),
745            // Attempt to handle `Deserialize::from_bits::[T](..)`
746            None if associated_function.variant.name == sym::Deserialize => {
747                // Get the variant.
748                let variant = match associated_function.name.name {
749                    sym::from_bits => DeserializeVariant::FromBits,
750                    sym::from_bits_raw => DeserializeVariant::FromBitsRaw,
751                    _ => anyhow::bail!(
752                        "Unknown associated function: {}::{}",
753                        associated_function.variant.name,
754                        associated_function.name.name
755                    ),
756                };
757                // Get the type parameter.
758                anyhow::ensure!(
759                    associated_function.type_parameters.len() == 1,
760                    "Expected exactly one type argument for Deserialize::{}",
761                    associated_function.name.name
762                );
763                let type_parameter = associated_function.type_parameters[0].0.clone();
764                Ok(Self::Deserialize(variant, type_parameter))
765            }
766            _ => anyhow::bail!(
767                "Unknown associated function: {}::{}",
768                associated_function.variant.name,
769                associated_function.name.name
770            ),
771        }
772    }
773}