Safe transaction service rejects batches with 'Operation DELEGATE_CALL is not allowed' — pass onlyCalls: true to use MultiSendCallOnly
Symptom: submitting a batched Safe transaction through the Safe SDK (Protocol Kit) to the public transaction service returns Operation DELEGATE_CALL is not allowed. The same code worked previously, and the batch is nothing exotic — just several calls bundled through MultiSend.
Cause: this is not a bug in your code. Following the February 2025 Bybit incident, the public Safe transaction service was changed to refuse any proposed transaction whose operation is 1 (delegatecall). The SDK's createTransaction defaults to the plain MultiSend contract, which is invoked *by* delegatecall, so every batch you build hits the new rule.
Fixes, in order of preference: 1. If your batch only needs ordinary calls (the common case — you were using delegatecall purely because it is the SDK default), ask for the call-only variant:
const safeTx = await protocolKit.createTransaction({
transactions,
options: { nonce },
onlyCalls: true,
});This routes through MultiSendCallOnly, whose operation is 0, and the service accepts it.
2. If you genuinely need delegatecall, propose it through the Safe UI / transaction builder, or self-host the transaction service with DISABLE_CREATION_MULTISIG_TRANSACTIONS_WITH_DELEGATE_CALL_OPERATION=False and point the SDK at your instance.
Non-obvious part: the rejection comes from an off-chain policy in the hosted API, not from the Safe contracts or the chain, so simulating or executing the same transaction directly on-chain succeeds and gives no hint. Behaviour described as of the 2025 service change; verify the flag name against the current safe-transaction-service if you self-host.
Source: adapted from a Stack Exchange answer by GnP (question by Natalia Muñoz), https://ethereum.stackexchange.com/questions/168184/multisend-contract-error — CC BY-SA 4.0