cairo_lang_sierra/extensions/modules/starknet/
testing.rs1use num_bigint::BigInt;
2
3use super::felt252_span_ty;
4use crate::define_libfunc_hierarchy;
5use crate::extensions::lib_func::{
6 BranchSignature, LibfuncSignature, OutputVarInfo, ParamSignature, SierraApChange,
7 SignatureSpecializationContext, SpecializationContext,
8};
9use crate::extensions::{
10 NamedLibfunc, OutputVarReferenceInfo, SignatureBasedConcreteLibfunc, SpecializationError,
11};
12use crate::program::GenericArg;
13
14#[derive(Default)]
16pub struct CheatcodeLibfunc {}
17impl NamedLibfunc for CheatcodeLibfunc {
18 type Concrete = CheatcodeConcreteLibfunc;
19 const STR_ID: &'static str = "cheatcode";
20
21 fn specialize_signature(
22 &self,
23 context: &dyn SignatureSpecializationContext,
24 args: &[GenericArg],
25 ) -> Result<LibfuncSignature, SpecializationError> {
26 if args.len() != 1 {
27 return Err(SpecializationError::WrongNumberOfGenericArgs);
28 }
29
30 let span_ty = felt252_span_ty(context)?;
31 Ok(LibfuncSignature {
32 param_signatures: vec![
33 ParamSignature::new(span_ty.clone()),
35 ],
36 branch_signatures: vec![BranchSignature {
37 vars: vec![
38 OutputVarInfo {
40 ty: span_ty,
41 ref_info: OutputVarReferenceInfo::NewTempVar { idx: 0 },
42 },
43 ],
44 ap_change: SierraApChange::Known { new_vars_only: true },
45 }],
46 fallthrough: Some(0),
47 })
48 }
49
50 fn specialize(
51 &self,
52 context: &dyn SpecializationContext,
53 args: &[GenericArg],
54 ) -> Result<Self::Concrete, SpecializationError> {
55 match args {
56 [GenericArg::Value(selector)] => Ok(CheatcodeConcreteLibfunc {
57 selector: selector.clone(),
58 signature: <Self as NamedLibfunc>::specialize_signature(
59 self,
60 context.upcast(),
61 args,
62 )?,
63 }),
64 [_] => Err(SpecializationError::UnsupportedGenericArg),
65 _ => Err(SpecializationError::WrongNumberOfGenericArgs),
66 }
67 }
68}
69
70pub struct CheatcodeConcreteLibfunc {
71 pub selector: BigInt,
72 pub signature: LibfuncSignature,
73}
74impl SignatureBasedConcreteLibfunc for CheatcodeConcreteLibfunc {
75 fn signature(&self) -> &LibfuncSignature {
76 &self.signature
77 }
78}
79
80define_libfunc_hierarchy! {
81 pub enum TestingLibfunc {
82 Cheatcode(CheatcodeLibfunc),
83 }, TestingConcreteLibfunc
84}