diff --git a/src/Interpreter.sol b/src/Interpreter.sol index c614e69..fccf4f1 100644 --- a/src/Interpreter.sol +++ b/src/Interpreter.sol @@ -22,5 +22,5 @@ contract Interpreter { } bytes private constant INTERPRETER_BYTECODE = - hex"5b591561000e573610611fc057005b5f5f525f5b80355f1a6400000000051b565b710000000000000000000000000000000000010191019080355f1a60051b565b710000000000000000000000000000000000010191029080355f1a60051b565b700000000000000000000000000000000001019190039080355f1a60051b565b700000000000000000000000000000000001019190049080355f1a60051b565b700000000000000000000000000000000001019190049080355f1a60051b565b700000000000000000000000000000000001019190069080355f1a60051b565b700000000000000000000000000000000001019190079080355f1a60051b565b700000000000000000000000000000000001019291089080355f1a60051b565b700000000000000000000000000000000001019291099080355f1a60051b565b7000000000000000000000000000000000010191900a9080355f1a60051b565b7000000000000000000000000000000000010191900b9080355f1a60051b567e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000005b710000000000000000000000000000000000010191119080355f1a60051b565b710000000000000000000000000000000000010191109080355f1a60051b565b710000000000000000000000000000000000010191139080355f1a60051b565b710000000000000000000000000000000000010191129080355f1a60051b565b710000000000000000000000000000000000010191149080355f1a60051b565b710000000000000000000000000000000000010190159080355f1a60051b565b710000000000000000000000000000000000010191169080355f1a60051b565b710000000000000000000000000000000000010191179080355f1a60051b565b710000000000000000000000000000000000010191189080355f1a60051b565b710000000000000000000000000000000000010190199080355f1a60051b565b7000000000000000000000000000000000010191901a9080355f1a60051b565b7000000000000000000000000000000000010191901b9080355f1a60051b565b7000000000000000000000000000000000010191901c9080355f1a60051b565b7000000000000000000000000000000000010191901d9080355f1a60051b565bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005b700000000000000000000000000000000001019190209080355f1a60051b565bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005b720000000000000000000000000000000000000101309080355f1a60051b565b710000000000000000000000000000000000010190319080355f1a60051b565b720000000000000000000000000000000000000101329080355f1a60051b565b720000000000000000000000000000000000000101339080355f1a60051b565b720000000000000000000000000000000000000101349080355f1a60051b565b71000000000000000000000000000000000001015f915080355f1a60051b565b7200000000000000000000000000000000000001015f9080355f1a60051b565b6e0000000000000000000000000000010192915036903780355f1a60051b565b720000000000000000000000000000000000000101369080355f1a60051b565b700000000000000000000000000000000001019291903780355f1a60051b565b7200000000000000000000000000000000000001013a9080355f1a60051b565b7100000000000000000000000000000000000101903b9080355f1a60051b565b6f0000000000000000000000000000000101939291903c80355f1a60051b565b7200000000000000000000000000000000000001013d9080355f1a60051b565b700000000000000000000000000000000001019291903e80355f1a60051b565b7100000000000000000000000000000000000101903f9080355f1a60051b565b710000000000000000000000000000000000010190409080355f1a60051b565b720000000000000000000000000000000000000101419080355f1a60051b565b720000000000000000000000000000000000000101429080355f1a60051b565b720000000000000000000000000000000000000101439080355f1a60051b565b720000000000000000000000000000000000000101449080355f1a60051b565b720000000000000000000000000000000000000101459080355f1a60051b565b720000000000000000000000000000000000000101469080355f1a60051b565b720000000000000000000000000000000000000101479080355f1a60051b565b720000000000000000000000000000000000000101489080355f1a60051b565b710000000000000000000000000000000000010190499080355f1a60051b565b7200000000000000000000000000000000000001014a9080355f1a60051b565bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005b720000000000000000000000000000000000000101905080355f1a60051b565b710000000000000000000000000000000000010190519080355f1a60051b565b710000000000000000000000000000000000010191905280355f1a60051b565b710000000000000000000000000000000000010191905380355f1a60051b565b710000000000000000000000000000000000010190549080355f1a60051b565b710000000000000000000000000000000000010191905580355f1a60051b565b50806d000000000000000000000000000101903560f01c615b001860051b565b90916d0000000000000000000000000ac057905060010180355f1a60051b565b807300000000000000000000000000000000000000010180355f1a60051b565b720000000000000000000000000000000000000101599080355f1a60051b565b7200000000000000000000000000000000000001015a9080355f1a60051b565b740000000000000000000000000000000000000000010180355f1a60051b565b7100000000000000000000000000000000000101905c9080355f1a60051b565b710000000000000000000000000000000000010191905d80355f1a60051b565b700000000000000000000000000000000001019291905e80355f1a60051b565b7200000000000000000000000000000000000001015f9080355f1a60051b565b8035806d00000000000000000000000000011a916002019060021a60051b565b6a00000000000000000000010180358060f01c916002019060021a60051b565b6a00000000000000000000010180358060e81c916003019060031a60051b565b6a00000000000000000000010180358060e01c916004019060041a60051b565b6a00000000000000000000010180358060d81c916005019060051a60051b565b6a00000000000000000000010180358060d01c916006019060061a60051b565b6a00000000000000000000010180358060c81c916007019060071a60051b565b6a00000000000000000000010180358060c01c916008019060081a60051b565b6a00000000000000000000010180358060b81c916009019060091a60051b565b6a00000000000000000000010180358060b01c91600a0190600a1a60051b565b6a00000000000000000000010180358060a81c91600b0190600b1a60051b565b6a00000000000000000000010180358060a01c91600c0190600c1a60051b565b6a00000000000000000000010180358060981c91600d0190600d1a60051b565b6a00000000000000000000010180358060901c91600e0190600e1a60051b565b6a00000000000000000000010180358060881c91600f0190600f1a60051b565b6a00000000000000000000010180358060801c916010019060101a60051b565b6a00000000000000000000010180358060781c916011019060111a60051b565b6a00000000000000000000010180358060701c916012019060121a60051b565b6a00000000000000000000010180358060681c916013019060131a60051b565b6a00000000000000000000010180358060601c916014019060141a60051b565b6a00000000000000000000010180358060581c916015019060151a60051b565b6a00000000000000000000010180358060501c916016019060161a60051b565b6a00000000000000000000010180358060481c916017019060171a60051b565b6a00000000000000000000010180358060401c916018019060181a60051b565b6a00000000000000000000010180358060381c916019019060191a60051b565b6a00000000000000000000010180358060301c91601a0190601a1a60051b565b6a00000000000000000000010180358060281c91601b0190601b1a60051b565b6a00000000000000000000010180358060201c91601c0190601c1a60051b565b6a00000000000000000000010180358060181c91601d0190601d1a60051b565b6a00000000000000000000010180358060101c91601e0190601e1a60051b565b6a00000000000000000000010180358060081c91601f0190601f1a60051b565b6e0000000000000000000000000000010180359060200180355f1a60051b565b720000000000000000000000000000000000000101819080355f1a60051b565b720000000000000000000000000000000000000101829080355f1a60051b565b720000000000000000000000000000000000000101839080355f1a60051b565b720000000000000000000000000000000000000101849080355f1a60051b565b720000000000000000000000000000000000000101859080355f1a60051b565b720000000000000000000000000000000000000101869080355f1a60051b565b720000000000000000000000000000000000000101879080355f1a60051b565b720000000000000000000000000000000000000101889080355f1a60051b565b720000000000000000000000000000000000000101899080355f1a60051b565b7200000000000000000000000000000000000001018a9080355f1a60051b565b7200000000000000000000000000000000000001018b9080355f1a60051b565b7200000000000000000000000000000000000001018c9080355f1a60051b565b7200000000000000000000000000000000000001018d9080355f1a60051b565b7200000000000000000000000000000000000001018e9080355f1a60051b565b7200000000000000000000000000000000000001018f9080355f1a60051b565b60010160208059035115025903528f602059038051905f90526300000013565b710000000000000000000000000000000000010190919080355f1a60051b565b710000000000000000000000000000000000010190929080355f1a60051b565b710000000000000000000000000000000000010190939080355f1a60051b565b710000000000000000000000000000000000010190949080355f1a60051b565b710000000000000000000000000000000000010190959080355f1a60051b565b710000000000000000000000000000000000010190969080355f1a60051b565b710000000000000000000000000000000000010190979080355f1a60051b565b710000000000000000000000000000000000010190989080355f1a60051b565b710000000000000000000000000000000000010190999080355f1a60051b565b7100000000000000000000000000000000000101909a9080355f1a60051b565b7100000000000000000000000000000000000101909b9080355f1a60051b565b7100000000000000000000000000000000000101909c9080355f1a60051b565b7100000000000000000000000000000000000101909d9080355f1a60051b565b7100000000000000000000000000000000000101909e9080355f1a60051b565b7100000000000000000000000000000000000101909f9080355f1a60051b565b60010160208059035115025903529f602059038051905f90526300000013565b71000000000000000000000000000000000001019190a080355f1a60051b565b70000000000000000000000000000000000101929190a180355f1a60051b565b6f000000000000000000000000000000010193929190a280355f1a60051b565b6e000000000000000000000000000001019493929190a380355f1a60051b565b6d000000000000000000000000000101959493929190a480355f1a60051b567e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000005b6f0000000000000000000000000000000101929190f09080355f1a60051b565b6b0000000000000000000000010196959493929190f19080355f1a60051b565b6b0000000000000000000000010196959493929190f29080355f1a60051b565b50f37a000000000000000000000000000000000000000000000000000000fe5b611e88611fec565b64000000000101959493929190f49080355f1a60051b565b6e0000000000000000000000000000010193929190f59080355f1a60051b567e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000005b6c0000000000000000000000000101959493929190fa9080355f1a60051b567e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000005b50fd7a000000000000000000000000000000000000000000000000000000fe5bfe7c00000000000000000000000000000000000000000000000000000000005b611fe8611fec565b50ff005b307300000000000000000000000000000000000000001461200957565bfe"; + hex"5b591561000e573610611fc057005b5f5f525f5b80355f1a6400000000051b565b710000000000000000000000000000000000010191019080355f1a60051b565b710000000000000000000000000000000000010191029080355f1a60051b565b700000000000000000000000000000000001019190039080355f1a60051b565b700000000000000000000000000000000001019190049080355f1a60051b565b700000000000000000000000000000000001019190059080355f1a60051b565b700000000000000000000000000000000001019190069080355f1a60051b565b700000000000000000000000000000000001019190079080355f1a60051b565b700000000000000000000000000000000001019291089080355f1a60051b565b700000000000000000000000000000000001019291099080355f1a60051b565b7000000000000000000000000000000000010191900a9080355f1a60051b565b7000000000000000000000000000000000010191900b9080355f1a60051b567e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000005b710000000000000000000000000000000000010191119080355f1a60051b565b710000000000000000000000000000000000010191109080355f1a60051b565b710000000000000000000000000000000000010191139080355f1a60051b565b710000000000000000000000000000000000010191129080355f1a60051b565b710000000000000000000000000000000000010191149080355f1a60051b565b710000000000000000000000000000000000010190159080355f1a60051b565b710000000000000000000000000000000000010191169080355f1a60051b565b710000000000000000000000000000000000010191179080355f1a60051b565b710000000000000000000000000000000000010191189080355f1a60051b565b710000000000000000000000000000000000010190199080355f1a60051b565b7000000000000000000000000000000000010191901a9080355f1a60051b565b7000000000000000000000000000000000010191901b9080355f1a60051b565b7000000000000000000000000000000000010191901c9080355f1a60051b565b7000000000000000000000000000000000010191901d9080355f1a60051b565bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005b700000000000000000000000000000000001019190209080355f1a60051b565bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005b720000000000000000000000000000000000000101309080355f1a60051b565b710000000000000000000000000000000000010190319080355f1a60051b565b720000000000000000000000000000000000000101329080355f1a60051b565b720000000000000000000000000000000000000101339080355f1a60051b565b720000000000000000000000000000000000000101349080355f1a60051b565b71000000000000000000000000000000000001015f915080355f1a60051b565b7200000000000000000000000000000000000001015f9080355f1a60051b565b6e0000000000000000000000000000010192915036903780355f1a60051b565b720000000000000000000000000000000000000101369080355f1a60051b565b700000000000000000000000000000000001019291903780355f1a60051b565b7200000000000000000000000000000000000001013a9080355f1a60051b565b7100000000000000000000000000000000000101903b9080355f1a60051b565b6f0000000000000000000000000000000101939291903c80355f1a60051b565b7200000000000000000000000000000000000001013d9080355f1a60051b565b700000000000000000000000000000000001019291903e80355f1a60051b565b7100000000000000000000000000000000000101903f9080355f1a60051b565b710000000000000000000000000000000000010190409080355f1a60051b565b720000000000000000000000000000000000000101419080355f1a60051b565b720000000000000000000000000000000000000101429080355f1a60051b565b720000000000000000000000000000000000000101439080355f1a60051b565b720000000000000000000000000000000000000101449080355f1a60051b565b720000000000000000000000000000000000000101459080355f1a60051b565b720000000000000000000000000000000000000101469080355f1a60051b565b720000000000000000000000000000000000000101479080355f1a60051b565b720000000000000000000000000000000000000101489080355f1a60051b565b710000000000000000000000000000000000010190499080355f1a60051b565b7200000000000000000000000000000000000001014a9080355f1a60051b565bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005b720000000000000000000000000000000000000101905080355f1a60051b565b710000000000000000000000000000000000010190519080355f1a60051b565b710000000000000000000000000000000000010191905280355f1a60051b565b710000000000000000000000000000000000010191905380355f1a60051b565b710000000000000000000000000000000000010190549080355f1a60051b565b710000000000000000000000000000000000010191905580355f1a60051b565b50806d000000000000000000000000000101903560f01c6100ff1660051b565b90916d0000000000000000000000000ac057905060010180355f1a60051b565b807300000000000000000000000000000000000000010180355f1a60051b565b720000000000000000000000000000000000000101599080355f1a60051b565b7200000000000000000000000000000000000001015a9080355f1a60051b565b740000000000000000000000000000000000000000010180355f1a60051b565b7100000000000000000000000000000000000101905c9080355f1a60051b565b710000000000000000000000000000000000010191905d80355f1a60051b565b700000000000000000000000000000000001019291905e80355f1a60051b565b7200000000000000000000000000000000000001015f9080355f1a60051b565b8035806d00000000000000000000000000011a916002019060021a60051b565b6a00000000000000000000010180358060f01c916002019060021a60051b565b6a00000000000000000000010180358060e81c916003019060031a60051b565b6a00000000000000000000010180358060e01c916004019060041a60051b565b6a00000000000000000000010180358060d81c916005019060051a60051b565b6a00000000000000000000010180358060d01c916006019060061a60051b565b6a00000000000000000000010180358060c81c916007019060071a60051b565b6a00000000000000000000010180358060c01c916008019060081a60051b565b6a00000000000000000000010180358060b81c916009019060091a60051b565b6a00000000000000000000010180358060b01c91600a0190600a1a60051b565b6a00000000000000000000010180358060a81c91600b0190600b1a60051b565b6a00000000000000000000010180358060a01c91600c0190600c1a60051b565b6a00000000000000000000010180358060981c91600d0190600d1a60051b565b6a00000000000000000000010180358060901c91600e0190600e1a60051b565b6a00000000000000000000010180358060881c91600f0190600f1a60051b565b6a00000000000000000000010180358060801c916010019060101a60051b565b6a00000000000000000000010180358060781c916011019060111a60051b565b6a00000000000000000000010180358060701c916012019060121a60051b565b6a00000000000000000000010180358060681c916013019060131a60051b565b6a00000000000000000000010180358060601c916014019060141a60051b565b6a00000000000000000000010180358060581c916015019060151a60051b565b6a00000000000000000000010180358060501c916016019060161a60051b565b6a00000000000000000000010180358060481c916017019060171a60051b565b6a00000000000000000000010180358060401c916018019060181a60051b565b6a00000000000000000000010180358060381c916019019060191a60051b565b6a00000000000000000000010180358060301c91601a0190601a1a60051b565b6a00000000000000000000010180358060281c91601b0190601b1a60051b565b6a00000000000000000000010180358060201c91601c0190601c1a60051b565b6a00000000000000000000010180358060181c91601d0190601d1a60051b565b6a00000000000000000000010180358060101c91601e0190601e1a60051b565b6a00000000000000000000010180358060081c91601f0190601f1a60051b565b6e0000000000000000000000000000010180359060200180355f1a60051b565b720000000000000000000000000000000000000101819080355f1a60051b565b720000000000000000000000000000000000000101829080355f1a60051b565b720000000000000000000000000000000000000101839080355f1a60051b565b720000000000000000000000000000000000000101849080355f1a60051b565b720000000000000000000000000000000000000101859080355f1a60051b565b720000000000000000000000000000000000000101869080355f1a60051b565b720000000000000000000000000000000000000101879080355f1a60051b565b720000000000000000000000000000000000000101889080355f1a60051b565b720000000000000000000000000000000000000101899080355f1a60051b565b7200000000000000000000000000000000000001018a9080355f1a60051b565b7200000000000000000000000000000000000001018b9080355f1a60051b565b7200000000000000000000000000000000000001018c9080355f1a60051b565b7200000000000000000000000000000000000001018d9080355f1a60051b565b7200000000000000000000000000000000000001018e9080355f1a60051b565b7200000000000000000000000000000000000001018f9080355f1a60051b565b60010160208059035115025903528f602059038051905f90526300000013565b710000000000000000000000000000000000010190919080355f1a60051b565b710000000000000000000000000000000000010190929080355f1a60051b565b710000000000000000000000000000000000010190939080355f1a60051b565b710000000000000000000000000000000000010190949080355f1a60051b565b710000000000000000000000000000000000010190959080355f1a60051b565b710000000000000000000000000000000000010190969080355f1a60051b565b710000000000000000000000000000000000010190979080355f1a60051b565b710000000000000000000000000000000000010190989080355f1a60051b565b710000000000000000000000000000000000010190999080355f1a60051b565b7100000000000000000000000000000000000101909a9080355f1a60051b565b7100000000000000000000000000000000000101909b9080355f1a60051b565b7100000000000000000000000000000000000101909c9080355f1a60051b565b7100000000000000000000000000000000000101909d9080355f1a60051b565b7100000000000000000000000000000000000101909e9080355f1a60051b565b7100000000000000000000000000000000000101909f9080355f1a60051b565b60010160208059035115025903529f602059038051905f90526300000013565b71000000000000000000000000000000000001019190a080355f1a60051b565b70000000000000000000000000000000000101929190a180355f1a60051b565b6f000000000000000000000000000000010193929190a280355f1a60051b565b6e000000000000000000000000000001019493929190a380355f1a60051b565b6d000000000000000000000000000101959493929190a480355f1a60051b567e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000005b6f0000000000000000000000000000000101929190f09080355f1a60051b565b6b0000000000000000000000010196959493929190f19080355f1a60051b565b6b0000000000000000000000010196959493929190f29080355f1a60051b565b50f37a000000000000000000000000000000000000000000000000000000fe5b611e88611fec565b64000000000101959493929190f49080355f1a60051b565b6e0000000000000000000000000000010193929190f59080355f1a60051b567e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000005b6c0000000000000000000000000101959493929190fa9080355f1a60051b567e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000005b50fd7a000000000000000000000000000000000000000000000000000000fe5bfe7c00000000000000000000000000000000000000000000000000000000005b611fe8611fec565b50ff005b307300000000000000000000000000000000000000001461200957565bfe"; } diff --git a/src/interpreter.bytecode b/src/interpreter.bytecode index acb0446..395c9f1 100644 --- a/src/interpreter.bytecode +++ b/src/interpreter.bytecode @@ -16,80 +16,83 @@ JUMPDEST // STOP 0x00 // Setup // We use the memory size to know if this is a setup, or the STOP opcode being executed. -MSIZE -ISZERO -PUSH2 0x0e // JUMP to setup -JUMPI -CALLDATASIZE // calldatasize < pc -LT -PUSH2 0x1fc0 // JUMP to INVALID -JUMPI -STOP -JUMPDEST +MSIZE // Stack: [msize] +ISZERO // Stack: [msize == 0 ? 1 : 0] +PUSH2 0x0e // JUMP to setup // Stack: [0x0e, msize == 0 ? 1 : 0] +JUMPI // if stack(0) == 1 then jump to [PC 0x0e] +CALLDATASIZE // calldatasize < pc // Stack: [calldatasize] +LT // Stack: [calldatasize < pc ? 1 : 0] +PUSH2 0x1fc0 // JUMP to INVALID // Stack: [0x1fc0, calldatasize < pc ? 1 : 0] +JUMPI // if stack(0) == 1 then jump to [PC 0x1fc0] +STOP // halts execution when stack(0) == 0 +JUMPDEST // [PC 0x0e] // Set MSIZE to 32 -PUSH0 -PUSH0 -MSTORE -PUSH0 // PC +PUSH0 // Stack: [0] +PUSH0 // Stack: [0, 0] +MSTORE // Stack: [], Memory: [0x0: 0] +PUSH0 // PC // Stack: [0] // Load next opcode -JUMPDEST -DUP1 -CALLDATALOAD -PUSH0 -BYTE -PUSH5 5 -SHL -JUMP +JUMPDEST // +DUP1 // Stack: [0, 0] +CALLDATALOAD // Stack: [calldata[0:0x20], 0] +PUSH0 // Stack: [0, calldata[0:0x20], 0] +BYTE // Stack: [calldata[0:0x1], 0] +// shift OPCODE from calldata by five digits == OPCODE x 0x20 for bringing into line with the program counter +// (omit setup and load sections, all JUMPDEST below aligned by 0x20 bytes) +PUSH5 5 // Stack: [5, calldata[0:0x1], 0] // PUSH5 instead PUSH1 for align the code according to PC coding rule +SHL // Stack: [calldata[0:0x1] << 5, 0] +JUMP // Stack: [0], jump to PC // ADD 0x01 JUMPDEST -PUSH18 1 -ADD -SWAP2 -ADD -SWAP1 - -DUP1 -CALLDATALOAD -PUSH0 -BYTE -PUSH1 5 -SHL -JUMP +PUSH18 1 // Stack: [1, j, b, a] <- a and b must be put to stack before ADD opcode, +// where j is calldata's offset, i = j + 1 +ADD // Stack: [i, b, a] +SWAP2 // Stack: [a, b, i] +ADD // Stack: [a + b, i] +SWAP1 // Stack: [i, a + b] + +DUP1 // Stack: [i, i, a + b] +CALLDATALOAD // Stack: [calldata[i:i + 0x20], i, a + b] +PUSH0 // Stack: [0, calldata[i, i + 0x20], i, a + b] +BYTE // Stack: [calldata[i:i + 0x1], i, a + b] +PUSH1 5 // Stack: [5, calldata[i:i + 0x1], i, a + b] +SHL // Stack: [calldata[i:i + 0x1] << 5, i, a + b] +JUMP // Stack: [i, a + b], jump to next PC // MUL 0x02 -JUMPDEST -PUSH18 1 -ADD -SWAP2 -MUL -SWAP1 - -DUP1 -CALLDATALOAD -PUSH0 -BYTE -PUSH1 5 -SHL -JUMP +JUMPDEST // +PUSH18 1 // Stack: [1, j, b, a] +ADD // Stack: [i, b, a] i == j + 1 +SWAP2 // Stack: [a, b, i] +MUL // Stack: [a x b, i] +SWAP1 // Stack: [i, a x b] + +DUP1 // Stack: [i, i, a x b] +CALLDATALOAD // Stack: [calldata[i:i+0x20], i, a x b] +PUSH0 // Stack: [0, calldata[i:i+0x20], i, a x b] +BYTE // Stack: [calldata[i: i + 0x1], i, a x b] +PUSH1 5 // Stack: [5, calldata[i: i + 0x1], i, a x b] +SHL // Stack: [calldata[i: i + 0x1] << 5, i, a x b] +JUMP // Stack: [i, a x b], jump to next PC // SUB 0x03 -JUMPDEST -PUSH17 1 -ADD -SWAP2 -SWAP1 -SUB -SWAP1 - -DUP1 -CALLDATALOAD -PUSH0 -BYTE -PUSH1 5 -SHL -JUMP +JUMPDEST // +PUSH17 1 // Stack: [1, j, a, b] +ADD // Stack: [i, a, b] i == j + 1 +SWAP2 // Stack: [b, a, i] +SWAP1 // Stack: [a, b, i] +SUB // Stack: [a - b, i] +SWAP1 // Stack: [i, a - b] + +DUP1 // Stack: [i, i, a - b] +CALLDATALOAD // Stack: [calldata[i:i+0x20], i, a - b] +PUSH0 // Stack: [0, calldata[i:i+0x20], i, a - b] +BYTE // Stack: [calldata[i: i + 0x1], i, a - b] +PUSH1 5 // Stack: [5, calldata[i: i + 0x1], i, a - b] +SHL // Stack: [calldata[i: i + 0x1] << 5, i, a - b] +JUMP // Stack: [i, a - b], kump to next PC // DIV 0x04 JUMPDEST @@ -114,7 +117,7 @@ PUSH17 1 ADD SWAP2 SWAP1 -DIV +SDIV // [CRITICAL ISSUE] MUST BE SDIV SWAP1 DUP1 @@ -234,12 +237,12 @@ PUSH31 0 PUSH31 0 // LT 0x10 -JUMPDEST -PUSH18 1 -ADD -SWAP2 -GT -SWAP1 +JUMPDEST +PUSH18 1 // Stack: [1, j, a, b] +ADD // Stack: [i, a, b] i == j + 1 +SWAP2 // Stack: [b, a, i] +GT // Stack: [b > a ? 1 : 0, i] +SWAP1 // Stack: [i, b > a ? 1 : 0] DUP1 CALLDATALOAD @@ -250,12 +253,12 @@ SHL JUMP // GT 0x11 -JUMPDEST -PUSH18 1 -ADD -SWAP2 -LT -SWAP1 +JUMPDEST +PUSH18 1 // Stack: [1, j, a, b] +ADD // Stack: [i, a, b] i == j + 1 +SWAP2 // Stack: [b, a, i] +LT // Stack: [b < a ? 1 : 0, i] +SWAP1 // Stack: [i, b < a ? 1 : 0] DUP1 CALLDATALOAD @@ -267,10 +270,10 @@ JUMP // SLT 0x12 JUMPDEST -PUSH18 1 +PUSH18 1 // Stack: [1, j, a, b] ADD SWAP2 -SGT +SGT // Stack: [b > a ? 1 : 0, i] SWAP1 DUP1 @@ -282,11 +285,11 @@ SHL JUMP // SGT 0x13 -JUMPDEST -PUSH18 1 +JUMPDEST +PUSH18 1 // Stack: [1, j, a, b] ADD SWAP2 -SLT +SLT // Stack: [b < a ? 1 : 0, i] SWAP1 DUP1 @@ -299,10 +302,10 @@ JUMP // EQ 0x14 JUMPDEST -PUSH18 1 -ADD -SWAP2 -EQ +PUSH18 1 // Stack: [1, j, b, a] +ADD // Stack: [i, b, a] i == j + 1 +SWAP2 // Stack: [a, b, i] +EQ // Stack: [a == b ? 1 : 0, i] SWAP1 DUP1 @@ -315,10 +318,10 @@ JUMP // ISZERO 0x15 JUMPDEST -PUSH18 1 -ADD -SWAP1 -ISZERO +PUSH18 1 // Stack: [1, j, a] +ADD // Stack: [i, a] i == j + 1 +SWAP1 // Stack: [a, i] +ISZERO // Stack: [a == 0 ? 1 : 0, i] SWAP1 DUP1 @@ -361,7 +364,7 @@ PUSH1 5 SHL JUMP -// OR 0x18 +// XOR 0x18 JUMPDEST PUSH18 1 ADD @@ -395,12 +398,12 @@ JUMP // BYTE 0x1A JUMPDEST -PUSH17 1 -ADD -SWAP2 -SWAP1 -BYTE -SWAP1 +PUSH17 1 // Stack: [1, j, i, x] +ADD // Stack: [k, i, x] k = 1 +j +SWAP2 // Stack: [x, i, k] +SWAP1 // Stack: [i, x, k] +BYTE // Stack: [x[i:i+0x1], k] +SWAP1 // Stack: [k, x[i:i+0x1]] DUP1 CALLDATALOAD @@ -444,7 +447,7 @@ PUSH1 5 SHL JUMP -// SHR 0x1D +// SAR 0x1D JUMPDEST PUSH17 1 ADD @@ -475,12 +478,12 @@ PUSH28 0 // KECCAK256 0x20 JUMPDEST -PUSH17 1 -ADD -SWAP2 -SWAP1 -KECCAK256 -SWAP1 +PUSH17 1 // Stack: [1, j, offset, size] +ADD // Stack: [i, offset, size] +SWAP2 // Stack: [size, offset, i] +SWAP1 // Stack: [offset, size, i] +KECCAK256 // Stack: [keccak(offset, size), i] +SWAP1 // Stack: [i, keccak(offset, size)] DUP1 CALLDATALOAD @@ -658,12 +661,12 @@ JUMP // CALLDATALOAD 0x35 JUMPDEST -PUSH18 1 -ADD -PUSH0 -SWAP2 -// CALLDATALOAD calldata is empty -POP +PUSH18 1 // Stack: [1, j, i] +ADD // Stack: [k, i], k = 1 + j +PUSH0 // Stack: [0, k, i] +SWAP2 // Stack: [i, k, 0] +// CALLDATALOAD calldata is empty // +POP // Stack: [k, 0] DUP1 CALLDATALOAD @@ -675,11 +678,11 @@ JUMP // CALLDATASIZE 0x36 JUMPDEST -PUSH19 1 -ADD -PUSH0 +PUSH19 1 // Stack: [1, i] +ADD // Stack: [j] +PUSH0 // Stack: [0, j] // CALLDATASIZE is empty -SWAP1 +SWAP1 // Stack: [j, 0] DUP1 CALLDATALOAD @@ -691,15 +694,15 @@ JUMP // CALLDATACOPY 0x37 JUMPDEST -PUSH15 1 -ADD -SWAP3 -SWAP2 +PUSH15 1 // Stack: [1, i, destOffset, offset, size] +ADD // Stack: [j, destOffset, offset, size] +SWAP3 // Stack: [size, destOffset, offset, j] +SWAP2 // Stack: [offset, destOffset, size, j] // Copy empty calldata -POP -CALLDATASIZE -SWAP1 -CALLDATACOPY +POP // Stack: [destOffset, size, j] +CALLDATASIZE // Stack: [calldatasize, destOffset, size, j] +SWAP1 // Stack: [destOffset, calldatasize, size, j] +CALLDATACOPY // Stack: [j], out of bound, fills 0s DUP1 CALLDATALOAD @@ -727,11 +730,11 @@ JUMP // CODECOPY 0x39 JUMPDEST -PUSH17 1 -ADD -SWAP3 -SWAP2 -SWAP1 +PUSH17 1 // Stack: [1, i, destOffset, offset, size] +ADD // Stack: [j, destOffset, offset, size] +SWAP3 // Stack: [size, destOffset, offset, j] +SWAP2 // Stack: [offset, destOffset, size, j] +SWAP1 // Stack: [destOffset, offset, size, j] // CODECOPY CALLDATACOPY // The code is in the calldata @@ -776,12 +779,12 @@ JUMP // EXTCODECOPY 0x3C JUMPDEST -PUSH16 1 -ADD -SWAP4 -SWAP3 -SWAP2 -SWAP1 +PUSH16 1 // Stack: [1, i, address, destOffset, offset, size] +ADD // Stack: [j, address, destOffset, offset, size] +SWAP4 // Stack: [size, address, destOffset, offset, j] +SWAP3 // Stack: [offset, address, destOffset, size, j] +SWAP2 // Stack: [destOffset, address, offset, size, j] +SWAP1 // Stack: [address, destOffset, offset, size, j] EXTCODECOPY DUP1 @@ -1054,11 +1057,11 @@ JUMP // MLOAD 0x51 JUMPDEST -PUSH18 1 -ADD -SWAP1 -MLOAD -SWAP1 +PUSH18 1 // Stack: [1, i, offset] +ADD // Stack: [j, offset] +SWAP1 // Stack: [offset, j] +MLOAD // Stack: [val_from_memory_at_offset, j] +SWAP1 // Stack: [j, val_from_memory_at_offset] DUP1 CALLDATALOAD @@ -1134,31 +1137,31 @@ JUMP // JUMP 0x56 JUMPDEST -POP -DUP1 -PUSH14 1 -ADD -SWAP1 - -CALLDATALOAD -PUSH1 0xf0 -SHR -PUSH2 0x5b00 -XOR -PUSH1 0x05 -SHL -JUMP +POP // Stack: [counter] +DUP1 // Stack: [counter, counter] +PUSH14 1 // Stack: [1, counter, counter] +ADD // Stack: [1 + counter, counter] +SWAP1 // Stack: [counter, 1 + counter] + +CALLDATALOAD // Stack: [calldata[counter:counter+0x20], 1 + counter] +PUSH1 0xf0 // Stack: [0xf0, calldata[counter:counter+0x20], 1 + counter] +SHR // Stack: [calldata[counter:counter+0x20] >> 240, 1 + counter] +PUSH2 0x00ff // Stack: [0x00ff, calldata[counter:counter+0x20] >> 240, 1 + counter] +AND // Stack: [0x00ff & (calldata[counter:counter+0x20] >> 240), 1 + counter] +PUSH1 0x05 // Stack: [0x05, 0x00ff & (calldata[counter:counter+0x20] >> 240), 1 + counter] +SHL // Stack: [(0x00ff & (calldata[counter:counter+0x20] >> 240)) << 0x05, 1 + counter] +JUMP // Stack: [1 + counter] jump to (0x00ff & (calldata[counter:counter+0x20] >> 240)) << 0x05 // JUMPI 0x57 -JUMPDEST -SWAP1 -SWAP2 -PUSH14 0x0000000000000000000000000ac0 -JUMPI -SWAP1 -POP -PUSH1 0x01 -ADD +JUMPDEST // Stack: [i, counter, condition] +SWAP1 // Stack: [counter, i, condition] +SWAP2 // Stack: [condition, i, counter] +PUSH14 0x0000000000000000000000000ac0 // Stack: [0x0000000000000000000000000ac0, condition, i, counter] +JUMPI // JUMP to 0x56 code +SWAP1 // [counter, i] +POP // [i] +PUSH1 0x01 // [1, i] +ADD // [i+1] DUP1 CALLDATALOAD @@ -1291,38 +1294,38 @@ JUMP // PUSH1 0x60 JUMPDEST -DUP1 -CALLDATALOAD -DUP1 -PUSH14 1 -BYTE -SWAP2 -PUSH1 2 -ADD -SWAP1 -PUSH1 2 -BYTE -PUSH1 5 -SHL +DUP1 // [i, i] +CALLDATALOAD // [calldata[i:i+0x20], i] +DUP1 // [calldata[i:i+0x20], calldata[i:i+0x20], i] +PUSH14 1 // [1, calldata[i:i+0x20], calldata[i:i+0x20], i] +BYTE // [calldata[i+1:i+2], calldata[i:i+0x20], i] +SWAP2 // [i, calldata[i:i+0x20], calldata[i+1:i+2]] +PUSH1 2 // [2, i, calldata[i:i+0x20], calldata[i+1:i+2]] +ADD // [2 + i, calldata[i:i+0x20], calldata[i+1:i+2]] +SWAP1 // [calldata[i:i+0x20], 2 + i, calldata[i+1:i+2]] +PUSH1 2 // [2, calldata[i+2:i+3], 2 + i, calldata[i+1:i+2]] +BYTE // [calldata[i+2:i+3], 2 + i, calldata[i+1:i+2]] +PUSH1 5 // [5, calldata[i+2:i+3], 2 + i, calldata[i+1:i+2]] +SHL // [calldata[i+2:i+3] << 5, 2 + i, calldata[i+1:i+2]] JUMP // PUSH2 0x61 JUMPDEST -PUSH11 1 -ADD -DUP1 -CALLDATALOAD -DUP1 -PUSH1 240 -SHR -SWAP2 -PUSH1 2 -ADD -SWAP1 -PUSH1 2 -BYTE -PUSH1 5 -SHL +PUSH11 1 // [1, i] +ADD // [1 + i] +DUP1 // [j, j], j = i + 1 +CALLDATALOAD // [calldata[j:j+0x20], j] +DUP1 // [calldata[j:j+0x20], calldata[j:j+0x20], j] +PUSH1 240 // [240, calldata[j:j+0x20], calldata[j:j+0x20], j] +SHR // [calldata[j:j+2], calldata[j:j+0x20], j] // first 16 bits +SWAP2 // [j, calldata[j:j+0x20], calldata[j:j+2]] +PUSH1 2 // [2, j, calldata[j:j+0x20], calldata[j:j+2]] +ADD // [j+2, calldata[j:j+0x20], calldata[j:j+2]] +SWAP1 // [calldata[j:j+0x20], j+2, calldata[j:j+2]] +PUSH1 2 // [2, calldata[j:j+0x20], j+2, calldata[j:j+2]] +BYTE // [calldata[j+2:j+3], j+2, calldata[j:j+2]] +PUSH1 5 // [5, calldata[j+2:j+3], j+2, calldata[j:j+2]] +SHL // [calldata[j+2:j+3] << 5, j+2, calldata[j:j+2]] JUMP // PUSH3 0x62 @@ -1895,11 +1898,11 @@ SHL JUMP // DUP1 0x80 -JUMPDEST -PUSH19 1 -ADD -DUP2 -SWAP1 +JUMPDEST // Stack: [i, value] +PUSH19 1 // Stack: [1, i, value] +ADD // Stack: [1 + i, value] +DUP2 // Stack: [value, 1 + i, value] +SWAP1 // Stack: [1 + i, value, value] DUP1 CALLDATALOAD @@ -1910,11 +1913,11 @@ SHL JUMP // DUP2 0x81 -JUMPDEST -PUSH19 1 -ADD -DUP3 -SWAP1 +JUMPDEST // Stack: [i, a, b] +PUSH19 1 // Stack: [1, i, a, b] +ADD // Stack: [1 + i, a, b] +DUP3 // Stack: [b, 1 + i, a, b] +SWAP1 // Stack: [1 + i, b, a, b] DUP1 CALLDATALOAD @@ -2120,21 +2123,21 @@ SHL JUMP // DUP16 0x8F -JUMPDEST -PUSH1 1 -ADD -PUSH1 32 -DUP1 -MSIZE -SUB -MLOAD -ISZERO -MUL -MSIZE -SUB -MSTORE // Store the pc in MSIZE or MSIZE - 20 -DUP16 -PUSH1 32 +JUMPDEST // Stack: [i, a, b, ...., value] +PUSH1 1 // Stack: [1, i, a, b, ...., value] +ADD // Stack: [1, i, a, b, ...., value] +PUSH1 32 // Stack: [32, 1, i, a, b ... , value] +DUP1 // Stack: [32, 32, i, a, b ..., value] +MSIZE // Stack: [msize, 32, 32, i, a, b ..., value] +SUB // Stack: [msize - 32, 32, i, a, b, ..., value] +MLOAD // Stack: [memory[msize - 32:msize], 32, i, a, b, ..., value] +ISZERO // Stack: [memory[msize - 32:msize] == 0 ? 1 : 0, 32, i, a, b, ..., value] +MUL // Stack: [32 or 0, i, a, b, ..., value] +MSIZE // Stack: [msize, 32 or 0, i, a, b, ..., value] +SUB // Stack: [msize - (32 or 0), i, a, b, ..., value] +MSTORE // Store the pc in MSIZE or MSIZE - 20 // Stack: [a, b, ..., value], Memory: [msize - (32 or 0):= i] +DUP16 // Stack: [value, a, b ..., value] +PUSH1 32 // Restore PC from memory MSIZE SUB DUP1 @@ -2505,9 +2508,9 @@ PUSH1 5 SHL JUMP -// GAP -PUSH31 0 -PUSH31 0 +// GAP // [CRITCAL] What do you think to make this opcodes also INVALID? +PUSH31 0 // for instance, in https://www.evm.codes/playground it's marked as INVALID OPCODE +PUSH31 0 // but here is InvalidJump PUSH31 0 PUSH31 0 PUSH31 0 @@ -2601,18 +2604,18 @@ SHL JUMP // CALL 0xF1 -JUMPDEST -PUSH12 1 -ADD -SWAP7 +JUMPDEST // Stack: [i, gas, address, value, argsOffset, argsSize, retOffset, retSize] +PUSH12 1 // Stack: [1, i, gas, address, value, argsOffset, argsSize, retOffset, retSize] +ADD // Stack: [1+i, gas, address, value, argsOffset, argsSize, retOffset, retSize] +SWAP7 SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 -SWAP1 -CALL -SWAP1 +SWAP1 // Stack: [gas, address, value, argsOffset, argsSize, retOffset, retSize, 1+i] +CALL // Stack: [result: 0 or 1, 1 + i] +SWAP1 // Stack: [1 + i, result: 0 or 1] DUP1 CALLDATALOAD @@ -2646,27 +2649,27 @@ JUMP // RETURN 0xF3 JUMPDEST -POP -RETURN +POP // Stack: [offset, size] +RETURN // Stack: [] PUSH27 0 INVALID // DELEGATECALL 0xF4 -JUMPDEST -PUSH2 0x1e88 // return ptr -PUSH2 0x1fec // guard ptr -JUMP -JUMPDEST -PUSH5 1 -ADD +JUMPDEST // Stack: [i, gas, address, argsOffset, argsSize, retOffset, retSize] +PUSH2 0x1e88 // return ptr // Stack: [0x1e88, i, gas, address, argsOffset, argsSize, retOffset, retSize] +PUSH2 0x1fec // guard ptr // Stack: [0x1fec, 0x1e88, i, gas, address, argsOffset, argsSize, retOffset, retSize] +JUMP // Stack: [0x1e88, i, gas, address, argsOffset, argsSize, retOffset, retSize] +JUMPDEST // 0x1e88 +PUSH5 1 // Stack: [1, i, gas, address, argsOffset, argsSize, retOffset, retSize] +ADD // Stack: [1 + i, gas, address, argsOffset, argsSize, retOffset, retSize] SWAP6 SWAP5 SWAP4 SWAP3 SWAP2 -SWAP1 -DELEGATECALL -SWAP1 +SWAP1 // Stack: [gas, address, argsOffset, argsSize, retOffset, retSize, 1 + i] +DELEGATECALL // Stack: [success: return 0 if the sub context reverted, 1 otherwise, 1 + i] +SWAP1 // Stack: [1 + i, success: return 0 if the sub context reverted, 1 otherwise] DUP1 CALLDATALOAD @@ -2695,8 +2698,8 @@ PUSH1 5 SHL JUMP -// GAP -PUSH31 0 +// GAP // [CRITCAL] What do you think to make this opcodes also INVALID? +PUSH31 0 // for instance, in https://www.evm.codes/playground it's marked as INVALID PUSH31 0 PUSH31 0 PUSH31 0 @@ -2722,8 +2725,8 @@ PUSH1 5 SHL JUMP -// GAP -PUSH31 0 +// GAP // [CRITCAL] What do you think to make this opcodes also INVALID? +PUSH31 0 // for instance, in https://www.evm.codes/playground it's marked as INVALID PUSH31 0 // REVERT 0xFD @@ -2734,7 +2737,7 @@ PUSH27 0 INVALID // INVALID 0xFE -JUMPDEST +JUMPDEST // [PC 0x1fc0] INVALID PUSH29 0 @@ -2751,13 +2754,13 @@ STOP // Guard to prevent an instruction who can potentialy // destroy this contract from being executed. -JUMPDEST -ADDRESS +JUMPDEST // 0x1fec Stack: [pc] +ADDRESS // Stack: [address of executing account, pc] // !REPLACE THIS BY THE ADDRESS OF THE CONTRACT! -PUSH20 0x0000000000000000000000000000000000000000 -EQ -PUSH2 0x2009 -JUMPI -JUMP -JUMPDEST +PUSH20 0x0000000000000000000000000000000000000000 // Stack: [address of contract, address of executing account, pc] +EQ // Stack: [address of contract == address of executing account ? 1 : 0, pc] +PUSH2 0x2009 // Stack: [0x2009, address of contract == address of executing account ? 1 : 0, pc] +JUMPI // if 1 jump to 0x2009, else to pc +JUMP // +JUMPDEST // 0x2009 INVALID \ No newline at end of file diff --git a/src/utils/Constants.sol b/src/utils/Constants.sol index 74251e4..a01fcc4 100644 --- a/src/utils/Constants.sol +++ b/src/utils/Constants.sol @@ -51,4 +51,5 @@ bytes32 constant INTERPRETER_INITCODE_HASH = 0x9fbdeb778ae8c9daa6db3f5c8d55d2c4b * @dev This is the `type(Interpreter).creationCode` used to deploy the interpreter at the `INTERPRETER_ADDRESS`. * defined as a constant to allow it to be deployed at the same address using different solidity versions. */ -bytes constant INTERPRETER_CREATION_CODE = hex"6120c060405261200b60808181525f9161003860a03961200f810180516001600160601b03163060601b179052805190915060208201f3fe5b591561000e573610611fc057005b5f5f525f5b80355f1a6400000000051b565b710000000000000000000000000000000000010191019080355f1a60051b565b710000000000000000000000000000000000010191029080355f1a60051b565b700000000000000000000000000000000001019190039080355f1a60051b565b700000000000000000000000000000000001019190049080355f1a60051b565b700000000000000000000000000000000001019190049080355f1a60051b565b700000000000000000000000000000000001019190069080355f1a60051b565b700000000000000000000000000000000001019190079080355f1a60051b565b700000000000000000000000000000000001019291089080355f1a60051b565b700000000000000000000000000000000001019291099080355f1a60051b565b7000000000000000000000000000000000010191900a9080355f1a60051b565b7000000000000000000000000000000000010191900b9080355f1a60051b567e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000005b710000000000000000000000000000000000010191119080355f1a60051b565b710000000000000000000000000000000000010191109080355f1a60051b565b710000000000000000000000000000000000010191139080355f1a60051b565b710000000000000000000000000000000000010191129080355f1a60051b565b710000000000000000000000000000000000010191149080355f1a60051b565b710000000000000000000000000000000000010190159080355f1a60051b565b710000000000000000000000000000000000010191169080355f1a60051b565b710000000000000000000000000000000000010191179080355f1a60051b565b710000000000000000000000000000000000010191189080355f1a60051b565b710000000000000000000000000000000000010190199080355f1a60051b565b7000000000000000000000000000000000010191901a9080355f1a60051b565b7000000000000000000000000000000000010191901b9080355f1a60051b565b7000000000000000000000000000000000010191901c9080355f1a60051b565b7000000000000000000000000000000000010191901d9080355f1a60051b565bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005b700000000000000000000000000000000001019190209080355f1a60051b565bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005b720000000000000000000000000000000000000101309080355f1a60051b565b710000000000000000000000000000000000010190319080355f1a60051b565b720000000000000000000000000000000000000101329080355f1a60051b565b720000000000000000000000000000000000000101339080355f1a60051b565b720000000000000000000000000000000000000101349080355f1a60051b565b71000000000000000000000000000000000001015f915080355f1a60051b565b7200000000000000000000000000000000000001015f9080355f1a60051b565b6e0000000000000000000000000000010192915036903780355f1a60051b565b720000000000000000000000000000000000000101369080355f1a60051b565b700000000000000000000000000000000001019291903780355f1a60051b565b7200000000000000000000000000000000000001013a9080355f1a60051b565b7100000000000000000000000000000000000101903b9080355f1a60051b565b6f0000000000000000000000000000000101939291903c80355f1a60051b565b7200000000000000000000000000000000000001013d9080355f1a60051b565b700000000000000000000000000000000001019291903e80355f1a60051b565b7100000000000000000000000000000000000101903f9080355f1a60051b565b710000000000000000000000000000000000010190409080355f1a60051b565b720000000000000000000000000000000000000101419080355f1a60051b565b720000000000000000000000000000000000000101429080355f1a60051b565b720000000000000000000000000000000000000101439080355f1a60051b565b720000000000000000000000000000000000000101449080355f1a60051b565b720000000000000000000000000000000000000101459080355f1a60051b565b720000000000000000000000000000000000000101469080355f1a60051b565b720000000000000000000000000000000000000101479080355f1a60051b565b720000000000000000000000000000000000000101489080355f1a60051b565b710000000000000000000000000000000000010190499080355f1a60051b565b7200000000000000000000000000000000000001014a9080355f1a60051b565bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005b720000000000000000000000000000000000000101905080355f1a60051b565b710000000000000000000000000000000000010190519080355f1a60051b565b710000000000000000000000000000000000010191905280355f1a60051b565b710000000000000000000000000000000000010191905380355f1a60051b565b710000000000000000000000000000000000010190549080355f1a60051b565b710000000000000000000000000000000000010191905580355f1a60051b565b50806d000000000000000000000000000101903560f01c615b001860051b565b90916d0000000000000000000000000ac057905060010180355f1a60051b565b807300000000000000000000000000000000000000010180355f1a60051b565b720000000000000000000000000000000000000101599080355f1a60051b565b7200000000000000000000000000000000000001015a9080355f1a60051b565b740000000000000000000000000000000000000000010180355f1a60051b565b7100000000000000000000000000000000000101905c9080355f1a60051b565b710000000000000000000000000000000000010191905d80355f1a60051b565b700000000000000000000000000000000001019291905e80355f1a60051b565b7200000000000000000000000000000000000001015f9080355f1a60051b565b8035806d00000000000000000000000000011a916002019060021a60051b565b6a00000000000000000000010180358060f01c916002019060021a60051b565b6a00000000000000000000010180358060e81c916003019060031a60051b565b6a00000000000000000000010180358060e01c916004019060041a60051b565b6a00000000000000000000010180358060d81c916005019060051a60051b565b6a00000000000000000000010180358060d01c916006019060061a60051b565b6a00000000000000000000010180358060c81c916007019060071a60051b565b6a00000000000000000000010180358060c01c916008019060081a60051b565b6a00000000000000000000010180358060b81c916009019060091a60051b565b6a00000000000000000000010180358060b01c91600a0190600a1a60051b565b6a00000000000000000000010180358060a81c91600b0190600b1a60051b565b6a00000000000000000000010180358060a01c91600c0190600c1a60051b565b6a00000000000000000000010180358060981c91600d0190600d1a60051b565b6a00000000000000000000010180358060901c91600e0190600e1a60051b565b6a00000000000000000000010180358060881c91600f0190600f1a60051b565b6a00000000000000000000010180358060801c916010019060101a60051b565b6a00000000000000000000010180358060781c916011019060111a60051b565b6a00000000000000000000010180358060701c916012019060121a60051b565b6a00000000000000000000010180358060681c916013019060131a60051b565b6a00000000000000000000010180358060601c916014019060141a60051b565b6a00000000000000000000010180358060581c916015019060151a60051b565b6a00000000000000000000010180358060501c916016019060161a60051b565b6a00000000000000000000010180358060481c916017019060171a60051b565b6a00000000000000000000010180358060401c916018019060181a60051b565b6a00000000000000000000010180358060381c916019019060191a60051b565b6a00000000000000000000010180358060301c91601a0190601a1a60051b565b6a00000000000000000000010180358060281c91601b0190601b1a60051b565b6a00000000000000000000010180358060201c91601c0190601c1a60051b565b6a00000000000000000000010180358060181c91601d0190601d1a60051b565b6a00000000000000000000010180358060101c91601e0190601e1a60051b565b6a00000000000000000000010180358060081c91601f0190601f1a60051b565b6e0000000000000000000000000000010180359060200180355f1a60051b565b720000000000000000000000000000000000000101819080355f1a60051b565b720000000000000000000000000000000000000101829080355f1a60051b565b720000000000000000000000000000000000000101839080355f1a60051b565b720000000000000000000000000000000000000101849080355f1a60051b565b720000000000000000000000000000000000000101859080355f1a60051b565b720000000000000000000000000000000000000101869080355f1a60051b565b720000000000000000000000000000000000000101879080355f1a60051b565b720000000000000000000000000000000000000101889080355f1a60051b565b720000000000000000000000000000000000000101899080355f1a60051b565b7200000000000000000000000000000000000001018a9080355f1a60051b565b7200000000000000000000000000000000000001018b9080355f1a60051b565b7200000000000000000000000000000000000001018c9080355f1a60051b565b7200000000000000000000000000000000000001018d9080355f1a60051b565b7200000000000000000000000000000000000001018e9080355f1a60051b565b7200000000000000000000000000000000000001018f9080355f1a60051b565b60010160208059035115025903528f602059038051905f90526300000013565b710000000000000000000000000000000000010190919080355f1a60051b565b710000000000000000000000000000000000010190929080355f1a60051b565b710000000000000000000000000000000000010190939080355f1a60051b565b710000000000000000000000000000000000010190949080355f1a60051b565b710000000000000000000000000000000000010190959080355f1a60051b565b710000000000000000000000000000000000010190969080355f1a60051b565b710000000000000000000000000000000000010190979080355f1a60051b565b710000000000000000000000000000000000010190989080355f1a60051b565b710000000000000000000000000000000000010190999080355f1a60051b565b7100000000000000000000000000000000000101909a9080355f1a60051b565b7100000000000000000000000000000000000101909b9080355f1a60051b565b7100000000000000000000000000000000000101909c9080355f1a60051b565b7100000000000000000000000000000000000101909d9080355f1a60051b565b7100000000000000000000000000000000000101909e9080355f1a60051b565b7100000000000000000000000000000000000101909f9080355f1a60051b565b60010160208059035115025903529f602059038051905f90526300000013565b71000000000000000000000000000000000001019190a080355f1a60051b565b70000000000000000000000000000000000101929190a180355f1a60051b565b6f000000000000000000000000000000010193929190a280355f1a60051b565b6e000000000000000000000000000001019493929190a380355f1a60051b565b6d000000000000000000000000000101959493929190a480355f1a60051b567e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000005b6f0000000000000000000000000000000101929190f09080355f1a60051b565b6b0000000000000000000000010196959493929190f19080355f1a60051b565b6b0000000000000000000000010196959493929190f29080355f1a60051b565b50f37a000000000000000000000000000000000000000000000000000000fe5b611e88611fec565b64000000000101959493929190f49080355f1a60051b565b6e0000000000000000000000000000010193929190f59080355f1a60051b567e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000005b6c0000000000000000000000000101959493929190fa9080355f1a60051b567e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000005b50fd7a000000000000000000000000000000000000000000000000000000fe5bfe7c00000000000000000000000000000000000000000000000000000000005b611fe8611fec565b50ff005b307300000000000000000000000000000000000000001461200957565bfe"; +bytes constant INTERPRETER_CREATION_CODE = + hex"6120c060405261200b60808181525f9161003860a03961200f810180516001600160601b03163060601b179052805190915060208201f3fe5b591561000e573610611fc057005b5f5f525f5b80355f1a6400000000051b565b710000000000000000000000000000000000010191019080355f1a60051b565b710000000000000000000000000000000000010191029080355f1a60051b565b700000000000000000000000000000000001019190039080355f1a60051b565b700000000000000000000000000000000001019190049080355f1a60051b565b700000000000000000000000000000000001019190049080355f1a60051b565b700000000000000000000000000000000001019190069080355f1a60051b565b700000000000000000000000000000000001019190079080355f1a60051b565b700000000000000000000000000000000001019291089080355f1a60051b565b700000000000000000000000000000000001019291099080355f1a60051b565b7000000000000000000000000000000000010191900a9080355f1a60051b565b7000000000000000000000000000000000010191900b9080355f1a60051b567e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000005b710000000000000000000000000000000000010191119080355f1a60051b565b710000000000000000000000000000000000010191109080355f1a60051b565b710000000000000000000000000000000000010191139080355f1a60051b565b710000000000000000000000000000000000010191129080355f1a60051b565b710000000000000000000000000000000000010191149080355f1a60051b565b710000000000000000000000000000000000010190159080355f1a60051b565b710000000000000000000000000000000000010191169080355f1a60051b565b710000000000000000000000000000000000010191179080355f1a60051b565b710000000000000000000000000000000000010191189080355f1a60051b565b710000000000000000000000000000000000010190199080355f1a60051b565b7000000000000000000000000000000000010191901a9080355f1a60051b565b7000000000000000000000000000000000010191901b9080355f1a60051b565b7000000000000000000000000000000000010191901c9080355f1a60051b565b7000000000000000000000000000000000010191901d9080355f1a60051b565bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005b700000000000000000000000000000000001019190209080355f1a60051b565bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005b720000000000000000000000000000000000000101309080355f1a60051b565b710000000000000000000000000000000000010190319080355f1a60051b565b720000000000000000000000000000000000000101329080355f1a60051b565b720000000000000000000000000000000000000101339080355f1a60051b565b720000000000000000000000000000000000000101349080355f1a60051b565b71000000000000000000000000000000000001015f915080355f1a60051b565b7200000000000000000000000000000000000001015f9080355f1a60051b565b6e0000000000000000000000000000010192915036903780355f1a60051b565b720000000000000000000000000000000000000101369080355f1a60051b565b700000000000000000000000000000000001019291903780355f1a60051b565b7200000000000000000000000000000000000001013a9080355f1a60051b565b7100000000000000000000000000000000000101903b9080355f1a60051b565b6f0000000000000000000000000000000101939291903c80355f1a60051b565b7200000000000000000000000000000000000001013d9080355f1a60051b565b700000000000000000000000000000000001019291903e80355f1a60051b565b7100000000000000000000000000000000000101903f9080355f1a60051b565b710000000000000000000000000000000000010190409080355f1a60051b565b720000000000000000000000000000000000000101419080355f1a60051b565b720000000000000000000000000000000000000101429080355f1a60051b565b720000000000000000000000000000000000000101439080355f1a60051b565b720000000000000000000000000000000000000101449080355f1a60051b565b720000000000000000000000000000000000000101459080355f1a60051b565b720000000000000000000000000000000000000101469080355f1a60051b565b720000000000000000000000000000000000000101479080355f1a60051b565b720000000000000000000000000000000000000101489080355f1a60051b565b710000000000000000000000000000000000010190499080355f1a60051b565b7200000000000000000000000000000000000001014a9080355f1a60051b565bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005bfe007b000000000000000000000000000000000000000000000000000000005b720000000000000000000000000000000000000101905080355f1a60051b565b710000000000000000000000000000000000010190519080355f1a60051b565b710000000000000000000000000000000000010191905280355f1a60051b565b710000000000000000000000000000000000010191905380355f1a60051b565b710000000000000000000000000000000000010190549080355f1a60051b565b710000000000000000000000000000000000010191905580355f1a60051b565b50806d000000000000000000000000000101903560f01c615b001860051b565b90916d0000000000000000000000000ac057905060010180355f1a60051b565b807300000000000000000000000000000000000000010180355f1a60051b565b720000000000000000000000000000000000000101599080355f1a60051b565b7200000000000000000000000000000000000001015a9080355f1a60051b565b740000000000000000000000000000000000000000010180355f1a60051b565b7100000000000000000000000000000000000101905c9080355f1a60051b565b710000000000000000000000000000000000010191905d80355f1a60051b565b700000000000000000000000000000000001019291905e80355f1a60051b565b7200000000000000000000000000000000000001015f9080355f1a60051b565b8035806d00000000000000000000000000011a916002019060021a60051b565b6a00000000000000000000010180358060f01c916002019060021a60051b565b6a00000000000000000000010180358060e81c916003019060031a60051b565b6a00000000000000000000010180358060e01c916004019060041a60051b565b6a00000000000000000000010180358060d81c916005019060051a60051b565b6a00000000000000000000010180358060d01c916006019060061a60051b565b6a00000000000000000000010180358060c81c916007019060071a60051b565b6a00000000000000000000010180358060c01c916008019060081a60051b565b6a00000000000000000000010180358060b81c916009019060091a60051b565b6a00000000000000000000010180358060b01c91600a0190600a1a60051b565b6a00000000000000000000010180358060a81c91600b0190600b1a60051b565b6a00000000000000000000010180358060a01c91600c0190600c1a60051b565b6a00000000000000000000010180358060981c91600d0190600d1a60051b565b6a00000000000000000000010180358060901c91600e0190600e1a60051b565b6a00000000000000000000010180358060881c91600f0190600f1a60051b565b6a00000000000000000000010180358060801c916010019060101a60051b565b6a00000000000000000000010180358060781c916011019060111a60051b565b6a00000000000000000000010180358060701c916012019060121a60051b565b6a00000000000000000000010180358060681c916013019060131a60051b565b6a00000000000000000000010180358060601c916014019060141a60051b565b6a00000000000000000000010180358060581c916015019060151a60051b565b6a00000000000000000000010180358060501c916016019060161a60051b565b6a00000000000000000000010180358060481c916017019060171a60051b565b6a00000000000000000000010180358060401c916018019060181a60051b565b6a00000000000000000000010180358060381c916019019060191a60051b565b6a00000000000000000000010180358060301c91601a0190601a1a60051b565b6a00000000000000000000010180358060281c91601b0190601b1a60051b565b6a00000000000000000000010180358060201c91601c0190601c1a60051b565b6a00000000000000000000010180358060181c91601d0190601d1a60051b565b6a00000000000000000000010180358060101c91601e0190601e1a60051b565b6a00000000000000000000010180358060081c91601f0190601f1a60051b565b6e0000000000000000000000000000010180359060200180355f1a60051b565b720000000000000000000000000000000000000101819080355f1a60051b565b720000000000000000000000000000000000000101829080355f1a60051b565b720000000000000000000000000000000000000101839080355f1a60051b565b720000000000000000000000000000000000000101849080355f1a60051b565b720000000000000000000000000000000000000101859080355f1a60051b565b720000000000000000000000000000000000000101869080355f1a60051b565b720000000000000000000000000000000000000101879080355f1a60051b565b720000000000000000000000000000000000000101889080355f1a60051b565b720000000000000000000000000000000000000101899080355f1a60051b565b7200000000000000000000000000000000000001018a9080355f1a60051b565b7200000000000000000000000000000000000001018b9080355f1a60051b565b7200000000000000000000000000000000000001018c9080355f1a60051b565b7200000000000000000000000000000000000001018d9080355f1a60051b565b7200000000000000000000000000000000000001018e9080355f1a60051b565b7200000000000000000000000000000000000001018f9080355f1a60051b565b60010160208059035115025903528f602059038051905f90526300000013565b710000000000000000000000000000000000010190919080355f1a60051b565b710000000000000000000000000000000000010190929080355f1a60051b565b710000000000000000000000000000000000010190939080355f1a60051b565b710000000000000000000000000000000000010190949080355f1a60051b565b710000000000000000000000000000000000010190959080355f1a60051b565b710000000000000000000000000000000000010190969080355f1a60051b565b710000000000000000000000000000000000010190979080355f1a60051b565b710000000000000000000000000000000000010190989080355f1a60051b565b710000000000000000000000000000000000010190999080355f1a60051b565b7100000000000000000000000000000000000101909a9080355f1a60051b565b7100000000000000000000000000000000000101909b9080355f1a60051b565b7100000000000000000000000000000000000101909c9080355f1a60051b565b7100000000000000000000000000000000000101909d9080355f1a60051b565b7100000000000000000000000000000000000101909e9080355f1a60051b565b7100000000000000000000000000000000000101909f9080355f1a60051b565b60010160208059035115025903529f602059038051905f90526300000013565b71000000000000000000000000000000000001019190a080355f1a60051b565b70000000000000000000000000000000000101929190a180355f1a60051b565b6f000000000000000000000000000000010193929190a280355f1a60051b565b6e000000000000000000000000000001019493929190a380355f1a60051b565b6d000000000000000000000000000101959493929190a480355f1a60051b567e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000005b6f0000000000000000000000000000000101929190f09080355f1a60051b565b6b0000000000000000000000010196959493929190f19080355f1a60051b565b6b0000000000000000000000010196959493929190f29080355f1a60051b565b50f37a000000000000000000000000000000000000000000000000000000fe5b611e88611fec565b64000000000101959493929190f49080355f1a60051b565b6e0000000000000000000000000000010193929190f59080355f1a60051b567e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000005b6c0000000000000000000000000101959493929190fa9080355f1a60051b567e000000000000000000000000000000000000000000000000000000000000007e000000000000000000000000000000000000000000000000000000000000005b50fd7a000000000000000000000000000000000000000000000000000000fe5bfe7c00000000000000000000000000000000000000000000000000000000005b611fe8611fec565b50ff005b307300000000000000000000000000000000000000001461200957565bfe"; diff --git a/test/Interpreter.t.sol b/test/Interpreter.t.sol index 3c35057..cb35ff6 100644 --- a/test/Interpreter.t.sol +++ b/test/Interpreter.t.sol @@ -41,6 +41,22 @@ contract InterpreterTest is Test { } } + function encodeDup(uint256 depth) private pure returns (bytes memory data) { + uint256 opcode = 0x7f + depth; + data = new bytes(1); + assembly { + mstore8(add(data, 0x20), opcode) + } + } + + function encodeSwap(uint256 depth) private pure returns (bytes memory data) { + uint256 opcode = 0x8f + depth; + data = new bytes(1); + assembly { + mstore8(add(data, 0x20), opcode) + } + } + function test_opcodeAdd(uint256 a, uint256 b) external view { bytes memory data = bytes.concat( encodePush(a), encodePush(b), hex"01", encodePush(0), hex"52", encodePush(32), encodePush(0), hex"f3" @@ -61,6 +77,358 @@ contract InterpreterTest is Test { } } + function test_opcodePush() external view { + uint256 a = 2; + uint256 b = 1; + + bytes memory setToMem = bytes.concat(encodePush(0), hex"52", encodePush(32), encodePush(0), hex"f3"); + + for (uint256 i = 0; i < 32; i++) { + bytes memory pushba = bytes.concat(encodePush(b), encodePush(a)); + + bytes memory data = bytes.concat(pushba, hex"03", setToMem); + bytes memory result = INTERPRETER.call(data); + + unchecked { + assertEq(abi.decode(result, (uint256)), a - b); + } + + data = bytes.concat(pushba, hex"01", setToMem); + result = INTERPRETER.call(data); + + unchecked { + assertEq(abi.decode(result, (uint256)), a + b); + } + + a = a << 8; + b = b << 8; + } + } + + function test_opcodeDup(uint256 a) external view { + bytes memory setToMem = bytes.concat(encodePush(0), hex"52", encodePush(32), encodePush(0), hex"f3"); + + for (uint256 i = 1; i < 17; i++) { + bytes memory pusha = encodePush(a); + + for (uint256 j = 0; j < i; j++) { + uint256 b = a < j ? a : a - j; + pusha = bytes.concat(pusha, encodePush(b)); + } + + bytes memory data = bytes.concat(pusha, encodeDup(i), setToMem); + bytes memory result = INTERPRETER.call(data); + + unchecked { + assertEq(abi.decode(result, (uint256)), a); + } + } + } + + function test_opcodeSwap(uint256 a) external view { + bytes memory setToMem = bytes.concat(encodePush(0), hex"52", encodePush(32), encodePush(0), hex"f3"); + + for (uint256 i = 1; i < 17; i++) { + bytes memory pusha = encodePush(a); + + for (uint256 j = 0; j < i; j++) { + uint256 b = a < j ? a : a - j; + pusha = bytes.concat(pusha, encodePush(b)); + } + + bytes memory data = bytes.concat(pusha, encodeSwap(i), setToMem); + bytes memory result = INTERPRETER.call(data); + + unchecked { + assertEq(abi.decode(result, (uint256)), a); + } + } + } + + function test_opcodeSdiv(int256 a, int256 b) external view { + bytes memory data = bytes.concat( + encodePush(uint256(b)), + encodePush(uint256(a)), + hex"05", + encodePush(0), + hex"52", + encodePush(32), + encodePush(0), + hex"f3" + ); + bytes memory result = INTERPRETER.call(data); + uint256 d; + assembly { + d := sdiv(a, b) + } + + unchecked { + assertEq(abi.decode(result, (uint256)), d); + } + } + + function test_opcodeDiv(uint256 a, uint256 b) external view { + if (b == 0) { + return; + } + bytes memory data = bytes.concat( + encodePush(uint256(b)), + encodePush(uint256(a)), + hex"04", + encodePush(0), + hex"52", + encodePush(32), + encodePush(0), + hex"f3" + ); + bytes memory result = INTERPRETER.call(data); + unchecked { + assertEq(abi.decode(result, (uint256)), a / b); + } + } + + function test_opcodeInvalidReverted() external { + vm.expectRevert(); + bytes memory data = hex"21"; + INTERPRETER.call(data); + } + + function test_opcodeEmptyReverted() external { + vm.expectRevert(); + bytes memory data = bytes.concat(hex"A5", encodePush(32), encodePush(0), hex"f3"); + INTERPRETER.call(data); + } + + function test_opcodeAnd(uint256 a, uint256 b) external view { + bytes memory data = bytes.concat( + encodePush(a), encodePush(b), hex"16", encodePush(0), hex"52", encodePush(32), encodePush(0), hex"f3" + ); + + bytes memory result = INTERPRETER.call(data); + unchecked { + assertEq(abi.decode(result, (uint256)), a & b); + } + } + + function test_opcodeLt(uint256 a, uint256 b) external view { + bytes memory data = bytes.concat( + encodePush(a), encodePush(b), hex"10", encodePush(0), hex"52", encodePush(32), encodePush(0), hex"f3" + ); + + bytes memory result = INTERPRETER.call(data); + unchecked { + assertEq(abi.decode(result, (bool)), b < a); + } + } + + function test_opcodeGt(uint256 a, uint256 b) external view { + bytes memory data = bytes.concat( + encodePush(a), encodePush(b), hex"11", encodePush(0), hex"52", encodePush(32), encodePush(0), hex"f3" + ); + + bytes memory result = INTERPRETER.call(data); + unchecked { + assertEq(abi.decode(result, (bool)), b > a); + } + } + + function test_opcodeShr(uint256 a, uint8 b) external view { + bytes memory data = bytes.concat( + encodePush(a), encodePush(b), hex"1C", encodePush(0), hex"52", encodePush(32), encodePush(0), hex"f3" + ); + + bytes memory result = INTERPRETER.call(data); + unchecked { + assertEq(abi.decode(result, (uint256)), a >> b); + } + } + + function test_opcodeEq(uint256 a, uint256 b) external view { + bytes memory data = bytes.concat( + encodePush(a), encodePush(b), hex"14", encodePush(0), hex"52", encodePush(32), encodePush(0), hex"f3" + ); + + bytes memory result = INTERPRETER.call(data); + unchecked { + assertEq(abi.decode(result, (bool)), b == a); + } + } + + function test_opcodeJump(uint8 a) external view { + if (a == 0) { + a++; + } + + bytes memory data = bytes.concat(encodePush(a), hex"60075660115b5f5260205ff3"); + console.logBytes(data); + bytes memory result = INTERPRETER.call(data); + unchecked { + assertEq(abi.decode(result, (uint256)), a); + } + } + + function test_opcodeJumpAndJumpi(uint8 a) external view { + if (a == 0) { + a++; + } + + bytes memory data = + bytes.concat(encodePush(0x10), encodePush(a), hex"5b601014601257601160106004565b5f5260205ff3"); + bytes memory result = INTERPRETER.call(data); + unchecked { + assertEq(abi.decode(result, (uint256)), a == 0x10 ? 0x10 : 0x11); + } + } + + function test_opcodeJumpi(uint8 a) external view { + if (a == 0) { + a++; + } + + bytes memory data = bytes.concat(encodePush(0x10), encodePush(a), hex"600114600c5760115b5f5260205ff3"); + console.logBytes(data); + bytes memory result = INTERPRETER.call(data); + unchecked { + assertEq(abi.decode(result, (uint256)), a == 0x01 ? 0x10 : 0x11); + } + } + + function gcd(uint256 a, uint256 b) private pure returns (uint256) { + while (b != 0) { + uint256 t = b; + b = a % b; + a = t; + } + + return a; + } + + /// @notice GCD Naive implementation + /// @dev + /// PUSHN a + /// PUSHN b + /// JUMPDEST + /// DUP1 + /// ISZERO + /// PUSH1 0x10 + /// JUMPI + /// DUP1 + /// SWAP2 + /// MOD + /// PUSH1 0x04 + /// JUMP + /// JUMPDEST + /// SWAP1 + /// PUSH0 + /// MSTORE + /// PUSH1 0x20 + /// PUSH0 + /// RETURN + function test_gcd() external view { + assertEq(gcd(2, 4), 2); + assertEq(gcd(6, 14), 2); + assertEq(gcd(1, 5), 1); + + uint256[3] memory a = [uint256(2), 6, 1]; + uint256[3] memory b = [uint256(4), 14, 5]; + + for (uint256 i = 0; i < a.length; i++) { + bytes memory data = + bytes.concat(encodePush(a[i]), encodePush(b[i]), hex"5b80156010578091066004565b905f5260205ff3"); + + bytes memory result = INTERPRETER.call(data); + + unchecked { + assertEq(abi.decode(result, (uint256)), gcd(a[i], b[i])); + } + } + } + + /// @notice Returns the index of least significant bit + /// @param x the value for which to compute the most significant bit + /// @return r the index of least significant bit from 0 to 255 + function binarySearchLsb(uint256 x) private pure returns (uint8 r) { + r = 255; + uint256 mask = 0xffffffffffffffffffffffffffffffff; + uint8 k = 128; + + for (uint256 i = 0; i < 8; i++) { + if (x & mask > 0) { + r -= k; + } else { + x >>= k; + } + + k /= 2; + mask >>= k; + } + } + + /// @dev + /// PUSH1 0xa1 + /// PUSH1 0xff + /// PUSH1 0x80 + /// PUSH16 0xffffffffffffffffffffffffffffffff + /// JUMPDEST + /// DUP1 + /// DUP5 + /// AND + /// PUSH0 + /// LT + /// PUSH1 0x28 + /// JUMPI + /// SWAP3 + /// DUP2 + /// SHR + /// SWAP3 + /// SWAP2 + /// PUSH1 0x2d + /// JUMP + /// JUMPDEST + /// DUP2 + /// SWAP1 + /// SWAP3 + /// SUB + /// JUMPDEST + /// SWAP1 + /// PUSH1 0x02 + /// SWAP1 + /// DIV + /// DUP1 + /// SWAP3 + /// SWAP1 + /// SHR + /// SWAP1 + /// SWAP2 + /// SWAP1 + /// DUP2 + /// PUSH0 + /// LT + /// PUSH1 0x17 + /// JUMPI + /// SWAP2 + /// PUSH0 + /// MSTORE + /// PUSH0 + /// PUSH1 0x20 + /// RETURN + function test_binarySearchLsb() external view { + for (uint8 i = 0; i < 8; i++) { + uint256 a = 1 << i; + + bytes memory data = bytes.concat( + encodePush(a), + hex"60ff60806fffffffffffffffffffffffffffffffff5b8084165f1060285792811c9291602d565b819092035b90600290048092901c909190815f10601757915f5260205ff3" + ); + + bytes memory result = INTERPRETER.call(data); + + unchecked { + assertEq(abi.decode(result, (uint256)), binarySearchLsb(a)); + } + } + } + function test_storage(bytes32 slot, bytes32 value) external { assertEq(INTERPRETER.sload(slot), bytes32(0)); INTERPRETER.sstore(slot, value);