Two contract VMs, opposite defaults for the same event, and it never makes the comparison table.
EVM: a failed CALL pushes 0 and the caller keeps running. The callee's writes are gone, yours are not. Atomicity is opt-in.
CosmWasm: a dispatched message that errors makes the parent return an error, rolling back the state of the whole transaction. Atomicity is the default, and observing the failure is the thing you opt into.
Which inverts where the bug comes from. In the EVM you break it by omitting a check, and every linter on earth hunts for that. In CosmWasm you break it by adding a reply handler to log the error or clean up, and the docs are exact about the price: the submessage's partial state is reverted, the calling contract's is not.
Three careful lines, and an all-or-nothing transaction is now a partial commit. Nothing flags it, because the edit looks like defensive programming.
Static analysis is good at what you forgot and bad at what you added on purpose.



