Using Gnosis SDK for Multisend always errors: ExecutionFailure

Hi, I'm trying to use Gnosis Safe's multisend capabilities. I'd like to programmatically generate the transactions and submit them to the Gnosis safe. I'm also trying to test it with mainnet forking. So I'm using Hardhat's mainnet forking capabilties.

I had successfully tested the transactions without multisend, and then I'm now refactoring them to use multisend. I'm basically following along with this test that Gnosis themselves have for their own SDK, because I'm trying to replicate that exact functionality.

Everything about the code I have works if I only do one transaction. But it fails if I try to do two transactions, which of course, is the actual multisend thing I'm trying to achieve (in reality, I need to do like 15 transactions, which is why I wanted to have a multisend. I'm just testing with two).
I know that both transactions should succeed because 1.) I tested without multisend at all, and both work fine, and 2.) If I do either transaction the "gnosis way", they both work alone. It is only if I do two that it starts failing.

The output from the transaction is extremely unhelpful. The transaction itself appears to "succeed", but it does nothing on chain, and the only event seen is ... "ExecutionFailure", which doesn't have any error message or anything. I'm kinda stuck at this point, so any help would be much appreciated! Console log of the events section of the resulting transaction looks like this...

events: [
    {
      transactionIndex: 0,
      blockNumber: 12896305,
      transactionHash: '0xb07e6ad8d83bff9a0c2c247c01ec799b192cdba0e7132844387b9ac3f0513f4c',
      address: '0xBEb28978B2c755155f20fd3d09Cb37e300A6981f',
      topics: [Array],
      data: '0x53d23bcc144f6abed70e68bce9e4e27e385c437ccfb37450f6183c396a3581020000000000000000000000000000000000000000000000000000000000000000',
      logIndex: 0,
      blockHash: '0x1ef1526c884a7e01aa90c1a99fdeb1a010220068aff0502f8603be6838d872c4',
      args: [Array],
      decode: [Function],
      event: 'ExecutionFailure',
      eventSignature: 'ExecutionFailure(bytes32,uint256)',
      removeListener: [Function],
      getBlock: [Function],
      getTransaction: [Function],
      getTransactionReceipt: [Function]
    }
  ]

:1234: Code to reproduce

This is the relevant code.

  const safeAddress = MAINNET_MULTISIG
  await impersonateAccount(hre, govAddress1)
  await impersonateAccount(hre, govAddress2)
  let ownerSigner = await ethers.getSigner(govAddress1)
  let ownerSigner2 = await ethers.getSigner(govAddress2)
  const ethAdapterOwner1 = new EthersAdapter({ethers, signer: ownerSigner})
  const ethAdapterOwner2 = new EthersAdapter({ethers, signer: ownerSigner2})
  const safeSdk = await Safe.create({
    ethAdapter: ethAdapterOwner1,
    safeAddress,
    contractNetworks: {
      31337: {
        multiSendAddress: "0x8D29bE29923b68abfDD21e541b9374737B49cdAD",
        safeMasterCopyAddress: "0x6851D6fDFAfD08c0295C392436245E5bc78B0185",
        safeProxyFactoryAddress: "0x76E2cFc1F5Fa8F6a5b3fC4c8F4788F0116861F9B",
      },
      1: {
        multiSendAddress: "0x8D29bE29923b68abfDD21e541b9374737B49cdAD",
        safeMasterCopyAddress: "0x6851D6fDFAfD08c0295C392436245E5bc78B0185",
        safeProxyFactoryAddress: "0x76E2cFc1F5Fa8F6a5b3fC4c8F4788F0116861F9B",
      },
      4: {
        multiSendAddress: "0x8D29bE29923b68abfDD21e541b9374737B49cdAD",
        safeMasterCopyAddress: "0x6851D6fDFAfD08c0295C392436245E5bc78B0185",
        safeProxyFactoryAddress: "0x76E2cFc1F5Fa8F6a5b3fC4c8F4788F0116861F9B",
      },
    },
  })
  const owner2 = await safeSdk.connect({ethAdapter: ethAdapterOwner2, safeAddress})

  const ethersPool = await getContract("Pool", {at: pool.address, as: "ethers"})
  const ethersCreditDesk = await getContract("CreditDesk", {at: creditDesk.address, as: "ethers"})
  const transactions = [
    {
      to: pool.address,
      value: "0",
      data: ethersPool.interface.encodeFunctionData("grantRole", [OWNER_ROLE, migrator.address]),
    },
    {
      to: creditDesk.address,
      value: "0",
      data: ethersCreditDesk.interface.encodeFunctionData("grantRole", [OWNER_ROLE, migrator.address]),
    },
  ]

  const safeTx = await safeSdk.createTransaction(...transactions)
  console.log("safe tx:", safeTx)
  const txHash = await owner2.getTransactionHash(safeTx)
  const approveTx = await owner2.approveTransactionHash(txHash)
  await approveTx.transactionResponse.wait()

  const result = await (await safeSdk.executeTransaction(safeTx)).transactionResponse.wait()
  console.log("result is...", result)

:computer: Environment

I'm using a macbook running hardhat 2.3.0, and ethers 5.3.1