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;