# Multicalls

Multicall is a key advantage of Account abstraction that enables you to aggregate multiple transactions into one.

Think about the Approve + Swap feature present on most DEXes. What if you could aggregate both calls into one? That would create a huge impact on dApps UX right? Welcome to Multicalls.

To understand how to aggregate calls, we need to first take a look at the `execute` method on the `account` object.

### The `execute` method

The `execute` method executes one or multiple calls using the account contract. If there is only one call, *transactions* will be an object that contains the parameters below. If there are multiple calls, *transactions* will be an array of *transactions* objects:

The *transactions* object structure:

* contractPayload.**contractAddress** - the address of the contract
* contractPayload.**entrypoint** - the entrypoint of the contract
* contractPayload.**calldata** - (defaults to \[]) the calldata
* contractPayload.**signature** - (defaults to \[]) the signature

*abi* - (optional) the abi of the contract for better displaying

The *transactionsDetail* object may include any of:

* transactionsDetail.**maxFee** - Max Fee that will be used to execute the call(s)
* transactionsDetail.**nonce** - Nonce for the transaction
* transactionsDetail.**version** - Version for the transaction (default is 1)

### Single vs Multicalls

In this section, we are going to take a look at how you perform single vs multiple calls using the  `execute` method.

Single call:

```javascript
const call = await account.execute(
  {
    contractAddress: '0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7',  // ETH contract address
    entrypoint: 'approve',
    calldata: starknet.stark.compileCalldata(
      {
        spender: "0x15e90f807a00a01df845460324fbcd33986f2df3cc9d981e9e8b5005b7f595e",
        amount: {
          type: 'struct',
          low: '1',   // 1 wei
          high: '0',
        }
      }
    ),
  },
  undefined,
  {
    nonce: '10',
  }
);
```

multicalls:

```javascript
const multiCall = await account.execute(
  [
    {
      contractAddress: '0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7',  // ETH contract address
      entrypoint: 'approve',
      calldata: starknet.stark.compileCalldata(
        {
          spender: "0x15e90f807a00a01df845460324fbcd33986f2df3cc9d981e9e8b5005b7f595e",
          amount: {
            type: 'struct',
            low: '1',   // 1 wei
            high: '0',
          }
        }
      ),
    },
    {
      contractAddress: '0x15e90f807a00a01df845460324fbcd33986f2df3cc9d981e9e8b5005b7f595e',
      entrypoint: 'transfer_ether',
      calldata: ['1', '0'],  // 1 wei
    }
  ],
  undefined,
  {
    nonce: '10',
  }
);
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.ready.co/aa-use-cases/multicalls.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
