cairo_lang_sierra/extensions/modules/starknet/
testing.rs

1use 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/// Libfunc for creating a general cheatcode.
15#[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                // input
34                ParamSignature::new(span_ty.clone()),
35            ],
36            branch_signatures: vec![BranchSignature {
37                vars: vec![
38                    // output
39                    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}