library TMerkle { MemoryHelper helper; function () { assembly { let contractLogic := helper calldatacopy(0x0, 0x0, calldatasize) let success := call(sub(gas, 10000), contractLogic, 0x0, calldatasize, 0, 0) let retSz := returndatasize returndatacopy(0, 0, retSz) switch success case 0 { revert(0, retSz) } default { return(0, retSz) } } } } Contract Concrete { using TMerkle for uint; uint a = 20; uint b; b = 0; .... a.sum(); // delegateCall //--> 20 } Contract MemoryHelper { uint counter; bytes[] memory; function returns(bytes4 sig, bytes nextvalue) { memory.push(nextvalue); } function () returns (bytes) { return memory[counter++]; } } bytesData = TMerkle.sum.encode(123); await MemoryHelperMock.returns(bytesData); expect( await myContract.method(123) ).to.be.false;