use super::*;
impl<N: Network, P: ProgramStorage<N>> VM<N, P> {
#[inline]
pub fn execute<R: Rng + CryptoRng>(
&self,
authorization: Authorization<N>,
rng: &mut R,
) -> Result<(Response<N>, Execution<N>)> {
macro_rules! logic {
($process:expr, $network:path, $aleo:path) => {{
let authorization = cast_ref!(authorization as Authorization<$network>);
let (response, execution) = $process.execute::<$aleo, _>(authorization.clone(), rng)?;
let response = cast_ref!(response as Response<N>).clone();
let execution = cast_ref!(execution as Execution<N>).clone();
Ok((response, execution))
}};
}
process!(self, logic)
}
#[inline]
pub fn execute_additional_fee<R: Rng + CryptoRng>(
&self,
private_key: &PrivateKey<N>,
credits: Record<N, Plaintext<N>>,
additional_fee_in_gates: u64,
rng: &mut R,
) -> Result<(Response<N>, AdditionalFee<N>)> {
macro_rules! logic {
($process:expr, $network:path, $aleo:path) => {{
type RecordPlaintext<NetworkMacro> = Record<NetworkMacro, Plaintext<NetworkMacro>>;
let private_key = cast_ref!(&private_key as PrivateKey<$network>);
let credits = cast_ref!(credits as RecordPlaintext<$network>);
let (response, additional_fee) = $process.execute_additional_fee::<$aleo, _>(
private_key,
credits.clone(),
additional_fee_in_gates,
rng,
)?;
let response = cast_ref!(response as Response<N>).clone();
let additional_fee = cast_ref!(additional_fee as AdditionalFee<N>).clone();
Ok((response, additional_fee))
}};
}
process!(self, logic)
}
}