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