# Perform a Multicall

## **Setup Requirements**

* **Set up Inverter Network SDK**: Refer to the[ Quick Start](https://docs.inverter.network/sdk/typescript-sdk) guide for detailed instructions.
* **Retrieve workflow simulation (optional)**: If you are going to batch the workflow deployment itself you can retrieve the preliminary data from [here](https://docs.inverter.network/sdk/typescript-sdk/simulate-a-workflow).&#x20;

Inverter has a module multicall provider called `trustedForwarder` which enables developers to batch write calls for inverter managed contracts.

## Executing Module Multicall

In this section we will use a already deployed workflow to showcase the execution.

**Parameters**

* **`trustedForwarderAddress` | `orchestratorAddress` (required)**:\
  This parameter is used to locate the batcher.
* `calls` **(required)**:\
  These parameters are the metadata of the bathed write functions.

{% code overflow="wrap" %}

```typescript
import { sdk } from '<your_sdk_export>'
import type { MixedRequestedModules } from '@inverter-network/sdk'

const { getWorkflow, moduleMulticall } = sdk

const deployer = sdk.walletClient.account.address
const TOTAL_DEPOSIT_AMOUNT = '1000'

// Should either be `as const` or be passed dirrectly in the `requestedModules`
const requestedModules = {
    fundingManager: 'FM_DepositVault_v1',
    paymentProcessor: 'PP_Simple_v1',
    authorizer: 'AUT_Roles_v1'
} as const satisfies MixedRequestedModules

const workflow = await getWorkflow({
    orchestratorAddress: '0x8a1897E6Fa0236F68f86240C391D2a7bED3Cf85c',
    requestedModules,
    fundingTokenType: 'ERC20Issuance_v1'
})

// We will first mint the TOTAL_DEPOSIT_AMOUNT
await workflow.fundingToken.module.write.mint.run([deployer, TOTAL_DEPOSIT_AMOUNT])

// Now we will call deposit twice in one transaction
// NOTE: The bytecode run will handle the needed 2 approves, if you want to handle it yourself, pass in the skipApprove method option at the second index of the params `{skipApprove: true}`
const { returnDatas, statuses, transactionHash } =
        await sdk.moduleMulticall.write(
          {
            orchestratorAddress: workflow.orchestrator.address,
            calls: [
              {
                address: workflow.fundingManager.address,
                allowFailure: false,
                callData: await workflow.fundingManager.bytecode.deposit.run('500')
              },
              {
                address: workflow.fundingManager.address,
                allowFailure: false,
                callData: await workflow.fundingManager.bytecode.deposit.run('500')
              }
            ],
          }
        )
        
```

{% endcode %}
