stellar-multicall 1.0.4

Multicall contract, responsible for executing multiple contract calls in a single transaction.
Documentation
use stellar_axelar_std::{contract, contractimpl, soroban_sdk, Env, Val, Vec};

use crate::interface::MulticallInterface;
use crate::types::FunctionCall;

#[contract]
pub struct Multicall;

#[contractimpl]
impl Multicall {
    pub fn __constructor(_env: &Env) {}
}

#[contractimpl]
impl MulticallInterface for Multicall {
    fn multicall(env: &Env, function_calls: Vec<FunctionCall>) -> Vec<Val> {
        let mut results = Vec::new(env);

        for FunctionCall {
            contract,
            approver,
            function,
            args,
        } in function_calls.into_iter()
        {
            approver.require_auth();

            let result: Val = env.invoke_contract(&contract, &function, args.clone());

            results.push_back(result);
        }

        results
    }
}