ERC-6357: Multi-delegatecall
ERC-6357 lets a contract bundle multiple internal method calls into a single user-facing transaction via delegatecall — each sub-call runs in the caller's context, sharing storage and gas. Cheaper than separate transactions and atomic (all succeed or all revert). Used for:
- Batched approvals + actions in one tx.
- Multi-step operations (mint + setup + transfer) without separate tx fees.
- Composing multiple entry points for UX flows.
Required Interface
interface IERC6357 {
function multicall(bytes[] calldata calls) external returns (bytes[] memory results);
}Neo Equivalent: Native Multi-invoke Transaction
Neo's transaction format already supports multiple invocations per transaction via the script. The wallet builds one transaction that invokes N methods sequentially; the consensus runs them atomically. No special contract method required — this is a native runtime feature.
// Wallet builds a multi-invoke script.
const script = new ScriptBuilder()
.emitContractCall(CONTRACT_A, 'transfer', [args1])
.emitContractCall(CONTRACT_B, 'approve', [args2])
.emitContractCall(CONTRACT_A, 'mint', [args3])
.build();
const tx = await wallet.signTx({ script, signers: [...] });
await rpc.sendrawtransaction(tx);| ERC-6357 (Ethereum) | Neo Equivalent | Notes |
|---|---|---|
multicall(bytes[] calls) | Multi-invoke transaction script | Native, no contract change |
delegatecall for context preservation | Each invocation runs in its own callee context | Different model — cleaner separation |
| Atomicity | Atomic — entire tx reverts if any sub-call fails | Native |
Why Neo Doesn't Need This Standard
ERC-6357 exists because Ethereum forces "one entry point per transaction" without a bundling helper. Neo's transaction is already a script that can invoke any number of methods on any number of contracts — this is a first-class affordance of the runtime. Wallet SDKs build the multi-invoke script directly; no on-chain contract is involved.
For the rare case where you need "calls share the storage of a specific contract" (the actual delegatecall semantics), implement it as application-level method dispatch within a single contract. But this is unusual — most use cases are "call multiple contracts in one tx" which Neo handles natively.
