Skip to main content

stellar_multicall/
contract.rs

1use stellar_axelar_std::{contract, contractimpl, soroban_sdk, Env, Val, Vec};
2
3use crate::interface::MulticallInterface;
4use crate::types::FunctionCall;
5
6#[contract]
7pub struct Multicall;
8
9#[contractimpl]
10impl Multicall {
11    pub fn __constructor(_env: &Env) {}
12}
13
14#[contractimpl]
15impl MulticallInterface for Multicall {
16    fn multicall(env: &Env, function_calls: Vec<FunctionCall>) -> Vec<Val> {
17        let mut results = Vec::new(env);
18
19        for FunctionCall {
20            contract,
21            approver,
22            function,
23            args,
24        } in function_calls.into_iter()
25        {
26            approver.require_auth();
27
28            let result: Val = env.invoke_contract(&contract, &function, args.clone());
29
30            results.push_back(result);
31        }
32
33        results
34    }
35}