use crate::{CallStack, Closure, FinalizeTypes, RegisterTypes};
use console::{
account::Address,
network::Network,
prelude::{CryptoRng, Result, Rng},
program::{Identifier, ProgramID, Response, Value},
types::Field,
};
pub trait StackEvaluate<N: Network>: Clone {
fn evaluate_closure<A: circuit::Aleo<Network = N>>(
&self,
closure: &Closure<N>,
inputs: &[Value<N>],
call_stack: CallStack<N>,
signer: Address<N>,
caller: Address<N>,
tvk: Field<N>,
) -> Result<Vec<Value<N>>>;
fn evaluate_function<A: circuit::Aleo<Network = N>>(
&self,
call_stack: CallStack<N>,
caller: Option<ProgramID<N>>,
) -> Result<Response<N>>;
}
pub trait StackExecute<N: Network> {
fn execute_closure<A: circuit::Aleo<Network = N>>(
&self,
closure: &Closure<N>,
inputs: &[circuit::Value<A>],
call_stack: CallStack<N>,
signer: circuit::Address<A>,
caller: circuit::Address<A>,
tvk: circuit::Field<A>,
) -> Result<Vec<circuit::Value<A>>>;
fn execute_function<A: circuit::Aleo<Network = N>, R: CryptoRng + Rng>(
&self,
call_stack: CallStack<N>,
console_caller: Option<ProgramID<N>>,
root_tvk: Option<Field<N>>,
rng: &mut R,
) -> Result<Response<N>>;
}
pub trait StackProgramTypes<N: Network> {
fn get_register_types(&self, name: &Identifier<N>) -> Result<&RegisterTypes<N>>;
fn get_finalize_types(&self, name: &Identifier<N>) -> Result<&FinalizeTypes<N>>;
}
pub trait RegistersCall<N: Network> {
fn call_stack(&self) -> CallStack<N>;
}