Quality & Analysis / Tool · November 11, 2025

SuMo

Unlike general-purpose mutation tools, SuMo incorporates a rich set of Solidity-specific mutation operators, capturing typical programming errors such as address misuses, or event emission faults. It integrates seamlessly with popular smart-contract development environments (e.g., Hardhat, Foundry, Brownie) and supports automated reporting of mutation results.

SuMo Repository 

This is the main SuMo repository, containing the complete source code of the tool, configuration examples, and full documentation. It provides detailed descriptions of all implemented mutation operators, and instructions for installing and running SuMo. 

SuMo Demo Repository 

The demo repository provides a ready-to-use example of SuMo applied to a sample Solidity project. It includes a minimal smart contract, a configured testing framework, and a prebuilt SuMo configuration file. This repository is ideal to explore SuMo’s workflow, visualize mutation results, or experiment with different operator configurations.

SuMo NPM Package

The official NPM package allows users to install SuMo directly into their Solidity projects using the Node.js ecosystem.

SuMo was designed to run mutation testing on NodeJS Solidity projects. It can run test using Truffle, Hardhat, Brownie and Forge.

Mutation Operators

Traditional Mutation Operators

OperatorNameMutation ExampleEnabled by DefaultMinimal Available
ACMArgument Change of overloaded Method calloverloadedFunc(a,b); → overloadedFunc(a,b,c);YN
AORAssignment Operator Replacement+=  → =YN
BCRDBreak and Continue Replacement
and Deletion
break →
continue → break
YN
BLRBoolean Literal Replacementtrue → falseYN
BORBinary Operator Replacement+ → -
< → >=
YY
CBDCatch Block Deletioncatch{} → YN
CSCConditional Statement Changeif(condition) → if(false)
else{} → 
YN
EREnum Replacemetenum.member1 → enum.member2YY
ECSExplicit Conversion to Smaller typeuint256 → uint8YN
FCDFunction Call Deletionfoo() → YN
HLRHexadecimal Literal Replacementhex\"01\" → hex\"random\"YN
ILRInteger Literal Replacement1 → 0YN
LCSLoop Statement Changewhile(condition) → while(false)YN
OLFDOverloaded Function Deletionfunction overloadedF(){} → YN
ORFDOverridden Function Deletionfunction f() override {} → YN
SKRSuper Keyword Replacementx = getData() → x = super.getData()YN
SLRString Literal Replacement"string" → ""YN
UORDUnary Operator Replacement and Deletion++ → --
! → 
YY

Solidity Mutation Operators

OperatorNameMutation ExampleEnabled by DefaultMinimal version available
AVRAddress Value Replacement0x67ED2e5dD3d0... →  address.this()YY
CCDContract Constructor Deletionconstructor(){} → YN
DLRData Location Keyword Replacementmemory → storageNN
DODDelete Operator Deletiondelete →YN
ETREther Transfer function Replacementdelegatecall() → call()YY
EEDEvent Emission Deletionemit Deposit(...) → /*emit Deposit(...)*/YN
EHDException Handling Deletionrequire(...) → /*require(...)*/YN
FVRFunction Visibility Replacementfunction f() public → function f() privateNY
GVRGlobal Variable Replacementmsg.value() → tx.gasprice()YY
MCRMathematical and Cryptographic
function Replacement
addmod → mulmod
keccak256 → sha256
YY
MODModifier Deletionfunction f() onlyOwner → function f()YY
MOIModifier Insertionfunction f() → function f() onlyOwnerNY
OMDOverridden Modifier Deletionmodifier m() override {} → YN
PKDPayable Keyword Deletionfunction f() payable → function f()YN
RSDReturn Statement Deletionreturn amount; → //return amount;YN
RVSReturn Values Swapreturn (1, "msg", 100); → return (100, "msg", 1);YY
SCDSelfdestruct Call Deletionselfdestruct(); → //selfdestruct();YN
SFRSafeMath Function ReplacementSafeMath.add → SafeMath.subYY
SCECSwitch Call Expression CastingContract c = Contract(0x86C9...); → Contract c = Contract(0x67ED...);YN
TORTransaction Origin Replacementmsg.sender → tx.originYN
VURVariable Unit Replacementwei → ether
minutes → hours
YY
VVRVariable Visibility Replacementuint private data; → uint public data;NY