use near_sdk::Gas; use near_workspaces::{Account, Contract, result::ExecutionFinalResult}; use serde::Serialize; pub async fn execute_async_transactions( accounts: &[Account], contract: &Contract, function_name: &str, json_args: &impl Serialize, attached_gas: Gas, ) -> anyhow::Result<()> { let mut transactions = vec![]; for account in accounts.iter() { let result = account .call(contract.id(), function_name) .gas(attached_gas) .args_json(json_args) .transact_async() .await?; transactions.push(result); } for transaction in transactions { let result = transaction.await?; all_receipts_successful(result)?; } Ok(()) } /// Returns an error if any of the outcomes in [`ExecutionFinalResult`] failed pub fn all_receipts_successful(result: ExecutionFinalResult) -> anyhow::Result<()> { anyhow::ensure!( result.outcomes().iter().all(|o| !o.is_failure()), "execution should have succeeded: {result:#?}" ); Ok(()) }