diff --git a/.gas-snapshot b/.gas-snapshot index 369cff702..a469a147a 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,9 +1,9 @@ BaseRainterpreterExternNPE2IERC165Test:testRainterpreterExternNPE2IERC165(bytes4) (runs: 2054, μ: 320946, ~: 320946) BaseRainterpreterSubParserNPE2IERC165Test:testRainterpreterSubParserNPE2IERC165(uint32) (runs: 2054, μ: 678755, ~: 678755) -LibAllStandardOpsTest:testIntegrityAndOpcodeFunctionPointersLength() (gas: 27270) -LibAllStandardOpsTest:testIntegrityFunctionPointersLength() (gas: 5904) -LibAllStandardOpsTest:testOpcodeFunctionPointersLength() (gas: 5886) -LibEvalFBoundsTest:testEvalNPFBoundsModConstant(bytes32) (runs: 2054, μ: 81518, ~: 81518) +LibAllStandardOpsTest:testIntegrityAndOpcodeFunctionPointersLength() (gas: 28930) +LibAllStandardOpsTest:testIntegrityFunctionPointersLength() (gas: 6129) +LibAllStandardOpsTest:testOpcodeFunctionPointersLength() (gas: 6111) +LibEvalFBoundsTest:testEvalNPFBoundsModConstant(bytes32) (runs: 2054, μ: 81743, ~: 81743) LibExternCodecTest:testLibExternCodecEncodeExternCall(uint256,bytes32) (runs: 2054, μ: 9769, ~: 10284) LibExternCodecTest:testLibExternCodecEncodeExternDispatch(uint256,bytes32) (runs: 2054, μ: 8886, ~: 9401) LibInterpreterStateStackTraceTest:testStackTraceCall(uint256,uint256,uint256[]) (runs: 2054, μ: 43088, ~: 42667) @@ -25,21 +25,33 @@ LibOpBitwiseOrNPTest:testOpBitwiseORNPEvalZeroInputs() (gas: 30559) LibOpBitwiseOrNPTest:testOpBitwiseORNPEvalZeroOutputs() (gas: 40770) LibOpBitwiseOrNPTest:testOpBitwiseORNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2054, μ: 13732, ~: 13651) LibOpBitwiseOrNPTest:testOpBitwiseORNPRun(bytes32,bytes32) (runs: 2054, μ: 16577, ~: 16577) +LibOpBlockNumberTest:testOpBlockNumberEval(uint256) (runs: 2054, μ: 50797, ~: 50564) +LibOpBlockNumberTest:testOpBlockNumberEvalOneInput() (gas: 35044) +LibOpBlockNumberTest:testOpBlockNumberEvalTwoOutputs() (gas: 31351) +LibOpBlockNumberTest:testOpBlockNumberEvalZeroOutputs() (gas: 30345) +LibOpBlockNumberTest:testOpBlockNumberIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2054, μ: 19621, ~: 19853) +LibOpBlockNumberTest:testOpBlockNumberRun(uint256,uint16) (runs: 2054, μ: 20704, ~: 20457) LibOpCallTest:testCallTraceInnerOnly() (gas: 64595) LibOpCallTest:testCallTraceOuterOnly() (gas: 46220) -LibOpCallTest:testOpCallNPIntegrityIO((uint256,uint256,uint256,bytes32[],uint256,bytes),uint256,uint256,uint8,bytes32) (runs: 2053, μ: 39693, ~: 38467) -LibOpCallTest:testOpCallNPIntegritySourceIndexOutOfBounds((uint256,uint256,uint256,bytes32[],uint256,bytes),uint256,uint256,uint256,uint256,bytes32) (runs: 2054, μ: 37255, ~: 35186) -LibOpCallTest:testOpCallNPIntegrityTooManyOutputs((uint256,uint256,uint256,bytes32[],uint256,bytes),uint256,uint256,uint8,bytes32) (runs: 2051, μ: 36247, ~: 36221) +LibOpCallTest:testOpCallNPIntegrityIO((uint256,uint256,uint256,bytes32[],uint256,bytes),uint256,uint256,uint8,bytes32) (runs: 2051, μ: 39711, ~: 38400) +LibOpCallTest:testOpCallNPIntegritySourceIndexOutOfBounds((uint256,uint256,uint256,bytes32[],uint256,bytes),uint256,uint256,uint256,uint256,bytes32) (runs: 2054, μ: 37397, ~: 35094) +LibOpCallTest:testOpCallNPIntegrityTooManyOutputs((uint256,uint256,uint256,bytes32[],uint256,bytes),uint256,uint256,uint8,bytes32) (runs: 2049, μ: 36293, ~: 36264) LibOpCallTest:testOpCallNPRunInputsMismatch() (gas: 76599) LibOpCallTest:testOpCallNPRunOutputsMismatch() (gas: 69380) LibOpCallTest:testOpCallNPRunSourceDoesNotExist() (gas: 364667) +LibOpChainIdTest:testOpChainIDEval(uint64) (runs: 2054, μ: 46861, ~: 46861) +LibOpChainIdTest:testOpChainIDIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2054, μ: 19650, ~: 19882) +LibOpChainIdTest:testOpChainIdEvalFail() (gas: 34224) +LibOpChainIdTest:testOpChainIdRun(uint64,uint16) (runs: 2054, μ: 17077, ~: 17077) +LibOpChainIdTest:testOpChainIdTwoOutputs() (gas: 31031) +LibOpChainIdTest:testOpChainIdZeroOutputs() (gas: 29983) LibOpConstantTest:testOpConstantEvalNPE2E() (gas: 57560) LibOpConstantTest:testOpConstantEvalZeroConstants() (gas: 41387) -LibOpConstantTest:testOpConstantNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2054, μ: 19197, ~: 19098) -LibOpConstantTest:testOpConstantNPIntegrityOOBConstants((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2054, μ: 18024, ~: 17955) +LibOpConstantTest:testOpConstantNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2054, μ: 19197, ~: 19103) +LibOpConstantTest:testOpConstantNPIntegrityOOBConstants((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2054, μ: 18023, ~: 17958) LibOpConstantTest:testOpConstantNPMultipleOutputErrorSugared() (gas: 32420) LibOpConstantTest:testOpConstantNPMultipleOutputErrorUnsugared() (gas: 42666) -LibOpConstantTest:testOpConstantNPRun(bytes32[],uint16) (runs: 2054, μ: 52408, ~: 51798) +LibOpConstantTest:testOpConstantNPRun(bytes32[],uint16) (runs: 2054, μ: 52407, ~: 51798) LibOpConstantTest:testOpConstantNPZeroOutputErrorSugared() (gas: 31042) LibOpConstantTest:testOpConstantNPZeroOutputErrorUnsugared() (gas: 41300) LibOpContextNPTest:testOpContextNPEval00(bytes32[][]) (runs: 106, μ: 6607582, ~: 5394723) @@ -50,13 +62,13 @@ LibOpContextNPTest:testOpContextNPEvalOOBi(bytes32[]) (runs: 106, μ: 76453, ~: LibOpContextNPTest:testOpContextNPEvalOOBj(bytes32) (runs: 2054, μ: 49372, ~: 49372) LibOpContextNPTest:testOpContextNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2054, μ: 14478, ~: 14397) LibOpContextNPTest:testOpContextNPOneInput() (gas: 42429) -LibOpContextNPTest:testOpContextNPRun(bytes32[][],uint256,uint256) (runs: 106, μ: 10424565, ~: 7670832) -LibOpContextNPTest:testOpContextNPRunOOBi(bytes32[][],uint256,uint256) (runs: 106, μ: 5443148, ~: 4165752) -LibOpContextNPTest:testOpContextNPRunOOBj(bytes32[][],uint256,uint256) (runs: 106, μ: 5448331, ~: 4166740) +LibOpContextNPTest:testOpContextNPRun(bytes32[][],uint256,uint256) (runs: 106, μ: 10618082, ~: 8137814) +LibOpContextNPTest:testOpContextNPRunOOBi(bytes32[][],uint256,uint256) (runs: 106, μ: 5443158, ~: 4165752) +LibOpContextNPTest:testOpContextNPRunOOBj(bytes32[][],uint256,uint256) (runs: 106, μ: 5545961, ~: 4404109) LibOpContextNPTest:testOpContextNPTwoInputs() (gas: 47614) LibOpContextNPTest:testOpContextNPTwoOutputs() (gas: 37773) LibOpContextNPTest:testOpContextNPZeroOutputs() (gas: 36724) -LibOpCtPopNPTest:testOpCtPopNPEval(bytes32) (runs: 2054, μ: 74150, ~: 84912) +LibOpCtPopNPTest:testOpCtPopNPEval(bytes32) (runs: 2054, μ: 74049, ~: 84886) LibOpCtPopNPTest:testOpCtPopNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2054, μ: 13731, ~: 13650) LibOpCtPopNPTest:testOpCtPopNPRun(bytes32) (runs: 2054, μ: 16647, ~: 16647) LibOpCtPopNPTest:testOpCtPopNPTwoInputs() (gas: 41667) @@ -68,10 +80,10 @@ LibOpDecodeBitsNPTest:testOpDecodeBitsNPEvalTwoInputs() (gas: 48825) LibOpDecodeBitsNPTest:testOpDecodeBitsNPEvalTwoOutputs() (gas: 44331) LibOpDecodeBitsNPTest:testOpDecodeBitsNPEvalZeroInputs() (gas: 38300) LibOpDecodeBitsNPTest:testOpDecodeBitsNPEvalZeroOutputs() (gas: 43281) -LibOpDecodeBitsNPTest:testOpDecodeBitsNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint8,uint8) (runs: 2054, μ: 22088, ~: 22205) -LibOpDecodeBitsNPTest:testOpDecodeBitsNPIntegrityFail((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8) (runs: 2054, μ: 19348, ~: 19441) +LibOpDecodeBitsNPTest:testOpDecodeBitsNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint8,uint8) (runs: 2054, μ: 22094, ~: 22187) +LibOpDecodeBitsNPTest:testOpDecodeBitsNPIntegrityFail((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8) (runs: 2054, μ: 19346, ~: 19406) LibOpDecodeBitsNPTest:testOpDecodeBitsNPIntegrityFailZeroLength((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8) (runs: 2054, μ: 13804, ~: 13745) -LibOpDecodeBitsNPTest:testOpDecodeBitsNPRun(bytes32,uint8,uint8) (runs: 2054, μ: 20952, ~: 20761) +LibOpDecodeBitsNPTest:testOpDecodeBitsNPRun(bytes32,uint8,uint8) (runs: 2054, μ: 20945, ~: 20761) LibOpERC5313OwnerNPTest:testOpERC5313OwnerNPEvalHappy() (gas: 55019) LibOpERC5313OwnerNPTest:testOpERC5313OwnerNPEvalOperandDisallowed() (gas: 18602) LibOpERC5313OwnerNPTest:testOpERC5313OwnerNPEvalTwoInputs() (gas: 43251) @@ -79,18 +91,18 @@ LibOpERC5313OwnerNPTest:testOpERC5313OwnerNPEvalTwoOutputs() (gas: 37527) LibOpERC5313OwnerNPTest:testOpERC5313OwnerNPEvalZeroInputs() (gas: 30803) LibOpERC5313OwnerNPTest:testOpERC5313OwnerNPEvalZeroOutputs() (gas: 36476) LibOpERC5313OwnerNPTest:testOpERC5313OwnerOfNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2054, μ: 13733, ~: 13652) -LibOpERC5313OwnerNPTest:testOpERC5313OwnerOfNPRun(address,address,uint16) (runs: 2053, μ: 23242, ~: 23242) +LibOpERC5313OwnerNPTest:testOpERC5313OwnerOfNPRun(address,address,uint16) (runs: 2054, μ: 23242, ~: 23242) LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalFail0() (gas: 30579) LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalFail1() (gas: 34858) LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalFail3() (gas: 44323) LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalFailOperand() (gas: 18436) -LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalHappy(address,uint256,address) (runs: 2054, μ: 602340, ~: 91827) +LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalHappy(address,uint256,address) (runs: 2053, μ: 602635, ~: 91879) LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalOneInput() (gas: 35310) LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalThreeInputs() (gas: 44782) LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalZeroInputs() (gas: 31020) LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalZeroOutputs() (gas: 39587) LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8) (runs: 2054, μ: 13748, ~: 13689) -LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPRun(address,bytes32,address,uint16) (runs: 2054, μ: 23829, ~: 23829) +LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPRun(address,bytes32,address,uint16) (runs: 2053, μ: 23829, ~: 23829) LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPTwoOutputs() (gas: 40630) LibOpEncodeBitsNPTest:testOpEncodeBitsNPEvalHappy() (gas: 851622) LibOpEncodeBitsNPTest:testOpEncodeBitsNPEvalOneInput() (gas: 43557) @@ -98,15 +110,15 @@ LibOpEncodeBitsNPTest:testOpEncodeBitsNPEvalThreeInputs() (gas: 53946) LibOpEncodeBitsNPTest:testOpEncodeBitsNPEvalTwoOutputs() (gas: 49491) LibOpEncodeBitsNPTest:testOpEncodeBitsNPEvalZeroInputs() (gas: 38257) LibOpEncodeBitsNPTest:testOpEncodeBitsNPEvalZeroOutputs() (gas: 48447) -LibOpEncodeBitsNPTest:testOpEncodeBitsNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8) (runs: 2054, μ: 18106, ~: 18114) -LibOpEncodeBitsNPTest:testOpEncodeBitsNPIntegrityFail((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8) (runs: 2054, μ: 19508, ~: 19568) +LibOpEncodeBitsNPTest:testOpEncodeBitsNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8) (runs: 2054, μ: 18103, ~: 18105) +LibOpEncodeBitsNPTest:testOpEncodeBitsNPIntegrityFail((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8) (runs: 2054, μ: 19509, ~: 19559) LibOpEncodeBitsNPTest:testOpEncodeBitsNPIntegrityFailZeroLength((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8) (runs: 2054, μ: 13887, ~: 13828) -LibOpEncodeBitsNPTest:testOpEncodeBitsNPRun(bytes32,bytes32,uint8,uint8) (runs: 2054, μ: 21339, ~: 21159) +LibOpEncodeBitsNPTest:testOpEncodeBitsNPRun(bytes32,bytes32,uint8,uint8) (runs: 2054, μ: 21334, ~: 21159) LibOpExternNPTest:testOpExternNPEvalHappy() (gas: 101138) LibOpExternNPTest:testOpExternNPEvalMultipleInputsOutputsHappy() (gas: 117546) -LibOpExternNPTest:testOpExternNPIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),address,uint16,uint8,uint8) (runs: 2054, μ: 34656, ~: 34703) -LibOpExternNPTest:testOpExternNPIntegrityNotAnExternContract((uint256,uint256,uint256,bytes32[],uint256,bytes),address,uint16,uint8,uint8) (runs: 2054, μ: 53254, ~: 53610) -LibOpExternNPTest:testOpExternNPRunHappy(address,bytes32[],uint16,bytes32[],bytes32[]) (runs: 2053, μ: 117377, ~: 117190) +LibOpExternNPTest:testOpExternNPIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),address,uint16,uint8,uint8) (runs: 2054, μ: 34569, ~: 34544) +LibOpExternNPTest:testOpExternNPIntegrityNotAnExternContract((uint256,uint256,uint256,bytes32[],uint256,bytes),address,uint16,uint8,uint8) (runs: 2054, μ: 53021, ~: 53139) +LibOpExternNPTest:testOpExternNPRunHappy(address,bytes32[],uint16,bytes32[],bytes32[]) (runs: 2054, μ: 117230, ~: 117103) LibOpGetTest:testLibOpGetEvalKeyNotSet() (gas: 307808) LibOpGetTest:testLibOpGetEvalOperandDisallowed() (gas: 61050) LibOpGetTest:testLibOpGetEvalSetThenGet() (gas: 520724) @@ -117,7 +129,7 @@ LibOpGetTest:testLibOpGetEvalTwoInputs() (gas: 39602) LibOpGetTest:testLibOpGetEvalTwoOutputs() (gas: 35210) LibOpGetTest:testLibOpGetEvalZeroInputs() (gas: 29651) LibOpGetTest:testLibOpGetEvalZeroOutputs() (gas: 34183) -LibOpGetTest:testLibOpGetIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2054, μ: 20525, ~: 20814) +LibOpGetTest:testLibOpGetIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2054, μ: 20520, ~: 20742) LibOpGetTest:testLibOpGetRunState(bytes32,bytes32,uint16) (runs: 2054, μ: 19580, ~: 19584) LibOpGetTest:testLibOpGetRunStateAndStore(bytes32,bytes32,bytes32,uint16) (runs: 2054, μ: 47532, ~: 47556) LibOpGetTest:testLibOpGetRunStore(bytes32,bytes32,uint16) (runs: 2054, μ: 49777, ~: 49781) @@ -128,13 +140,13 @@ LibOpHashNPTest:testOpHashNPEval1Input() (gas: 54688) LibOpHashNPTest:testOpHashNPEval2Inputs() (gas: 62977) LibOpHashNPTest:testOpHashNPEval2InputsDifferent() (gas: 63647) LibOpHashNPTest:testOpHashNPEval2InputsOtherStack() (gas: 80171) -LibOpHashNPTest:testOpHashNPIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2054, μ: 19675, ~: 19925) +LibOpHashNPTest:testOpHashNPIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2054, μ: 19670, ~: 19916) LibOpHashNPTest:testOpHashNPRun(bytes32[]) (runs: 2052, μ: 19402, ~: 19506) LibOpHashNPTest:testOpHashNPTwoOutputs() (gas: 30716) LibOpHashNPTest:testOpHashNPZeroOutputs() (gas: 29348) LibOpMaxUint256NPTest:testOpMaxUint256NPEval() (gas: 47165) LibOpMaxUint256NPTest:testOpMaxUint256NPEvalFail() (gas: 34997) -LibOpMaxUint256NPTest:testOpMaxUint256NPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2054, μ: 19644, ~: 19882) +LibOpMaxUint256NPTest:testOpMaxUint256NPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2054, μ: 19636, ~: 19847) LibOpMaxUint256NPTest:testOpMaxUint256NPRun() (gas: 15929) LibOpMaxUint256NPTest:testOpMaxUint256NPTwoOutputs() (gas: 31783) LibOpMaxUint256NPTest:testOpMaxUint256NPZeroOutputs() (gas: 30691) @@ -147,22 +159,22 @@ LibOpSetTest:testLibOpSetEvalThreeInputs() (gas: 44468) LibOpSetTest:testLibOpSetEvalTwoInputs() (gas: 258817) LibOpSetTest:testLibOpSetEvalTwoOutputs() (gas: 40308) LibOpSetTest:testLibOpSetEvalZeroInputs() (gas: 29266) -LibOpSetTest:testLibOpSetIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2054, μ: 20397, ~: 20659) +LibOpSetTest:testLibOpSetIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2054, μ: 20404, ~: 20646) LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPEval() (gas: 894972) LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityFailBadShiftAmount() (gas: 131540) LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityFailTwoInputs() (gas: 45966) LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityFailTwoOutputs() (gas: 41504) LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityFailZeroInputs() (gas: 35483) LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityFailZeroOutputs() (gas: 40454) -LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint8) (runs: 2054, μ: 19729, ~: 19647) +LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint8) (runs: 2054, μ: 19762, ~: 19725) LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityNoop((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8) (runs: 2054, μ: 13896, ~: 13838) -LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityZero((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2054, μ: 19411, ~: 19542) +LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityZero((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2054, μ: 19411, ~: 19538) LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPRun(bytes32,uint8) (runs: 2054, μ: 16789, ~: 16789) LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPEval() (gas: 1073109) LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPIntegrityFailBadShiftAmount() (gas: 132152) -LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint8) (runs: 105, μ: 19557, ~: 19117) +LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint8) (runs: 106, μ: 19474, ~: 18941) LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPIntegrityNoop((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8) (runs: 106, μ: 14062, ~: 14079) -LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPIntegrityZero((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 106, μ: 17853, ~: 17891) +LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPIntegrityZero((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 106, μ: 17844, ~: 17891) LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPRun(bytes32,uint8) (runs: 2054, μ: 16770, ~: 16770) LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPTwoInputs() (gas: 46090) LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPTwoOutputs() (gas: 41586) @@ -170,8 +182,8 @@ LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPZeroInputs() (gas: 35542) LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPZeroOutputs() (gas: 40538) LibOpStackNPTest:testOpStackEval() (gas: 66851) LibOpStackNPTest:testOpStackEvalSeveral() (gas: 87254) -LibOpStackNPTest:testOpStackNPIntegrity(bytes,uint256,bytes32[],bytes32) (runs: 2054, μ: 18915, ~: 18689) -LibOpStackNPTest:testOpStackNPIntegrityOOBStack(bytes,uint16,bytes32[],uint16,uint256) (runs: 2054, μ: 19241, ~: 19330) +LibOpStackNPTest:testOpStackNPIntegrity(bytes,uint256,bytes32[],bytes32) (runs: 2054, μ: 18915, ~: 18661) +LibOpStackNPTest:testOpStackNPIntegrityOOBStack(bytes,uint16,bytes32[],uint16,uint256) (runs: 2054, μ: 19243, ~: 19329) LibOpStackNPTest:testOpStackNPMultipleOutputErrorSugared() (gas: 40092) LibOpStackNPTest:testOpStackNPMultipleOutputErrorUnsugared() (gas: 44067) LibOpStackNPTest:testOpStackNPRun(bytes32[][],uint256) (runs: 106, μ: 2096050, ~: 1981133) @@ -180,9 +192,9 @@ LibOpStackNPTest:testOpStackNPZeroOutputErrorUnsugared() (gas: 42605) LibOpTimestampTest:testOpBlockTimestampNPEvalFail() (gas: 65585) LibOpTimestampTest:testOpBlockTimestampNPTwoOutputs() (gas: 58514) LibOpTimestampTest:testOpBlockTimestampNPZeroOutputs() (gas: 56395) -LibOpTimestampTest:testOpTimestampEval(uint256) (runs: 2054, μ: 84599, ~: 84473) -LibOpTimestampTest:testOpTimestampIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2054, μ: 19638, ~: 19889) -LibOpTimestampTest:testOpTimestampRun(uint256) (runs: 2054, μ: 20542, ~: 20317) +LibOpTimestampTest:testOpTimestampEval(uint256) (runs: 2054, μ: 84606, ~: 84473) +LibOpTimestampTest:testOpTimestampIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2054, μ: 19638, ~: 19800) +LibOpTimestampTest:testOpTimestampRun(uint256) (runs: 2054, μ: 20546, ~: 20317) LibParseCommentsTest:testParseCommentAfterSources() (gas: 69518) LibParseCommentsTest:testParseCommentBetweenSources() (gas: 69596) LibParseCommentsTest:testParseCommentInIgnoredLHS() (gas: 42162) @@ -540,19 +552,19 @@ LibParseUnexpectedRightParenTest:testParseUnexpectedRightParen() (gas: 41642) LibParseUnexpectedRightParenTest:testParseUnexpectedRightParenNested() (gas: 47299) LibSubParseSubParserExternTest:testLibSubParseSubParserExtern(address,uint8,uint8,uint8,uint16,uint8) (runs: 2054, μ: 13186, ~: 13129) LibSubParseSubParserExternTest:testLibSubParseSubParserExternConstantsHeightOverflow(address,uint256,uint8,uint8,uint16,uint8) (runs: 2054, μ: 7951, ~: 7695) -RainterpreterExpressionDeployerDeployCheckTest:testRainterpreterExpressionDeployerDeployNoEIP1820() (gas: 7064838) -RainterpreterExpressionDeployerDescribedByMetaV1Test:testRainterpreterExpressionDeployerDescribedByMetaV1Happy() (gas: 7072571) -RainterpreterExpressionDeployerIERC165Test:testRainterpreterExpressionDeployerIERC165(bytes4) (runs: 2054, μ: 7072279, ~: 7072279) +RainterpreterExpressionDeployerDeployCheckTest:testRainterpreterExpressionDeployerDeployNoEIP1820() (gas: 7097685) +RainterpreterExpressionDeployerDescribedByMetaV1Test:testRainterpreterExpressionDeployerDescribedByMetaV1Happy() (gas: 7105505) +RainterpreterExpressionDeployerIERC165Test:testRainterpreterExpressionDeployerIERC165(bytes4) (runs: 2054, μ: 7105126, ~: 7105126) RainterpreterExpressionDeployerMetaTest:testRainterpreterExpressionDeployerExpectedConstructionMetaHash() (gas: 6221) -RainterpreterIERC165Test:testRainterpreterIERC165(bytes4) (runs: 2054, μ: 1537985, ~: 1537985) -RainterpreterParserIERC165Test:testRainterpreterParserIERC165(bytes4) (runs: 2054, μ: 3926586, ~: 3926586) -RainterpreterParserParserPragma:testParsePragmaNoPragma() (gas: 19613656) -RainterpreterParserParserPragma:testParsePragmaSinglePragma() (gas: 11819567) -RainterpreterParserParserPragma:testParsePragmaWithInterstitial() (gas: 11822844) -RainterpreterParserPointersTest:testLiteralParserFunctionPointers() (gas: 3925574) -RainterpreterParserPointersTest:testOperandHandlerFunctionPointers() (gas: 3927748) -RainterpreterParserPointersTest:testParserParseMeta() (gas: 79620) -RainterpreterPointersTest:testOpcodeFunctionPointers() (gas: 1539118) +RainterpreterIERC165Test:testRainterpreterIERC165(bytes4) (runs: 2054, μ: 1561241, ~: 1561241) +RainterpreterParserIERC165Test:testRainterpreterParserIERC165(bytes4) (runs: 2054, μ: 3932186, ~: 3932186) +RainterpreterParserParserPragma:testParsePragmaNoPragma() (gas: 19641656) +RainterpreterParserParserPragma:testParsePragmaSinglePragma() (gas: 11836367) +RainterpreterParserParserPragma:testParsePragmaWithInterstitial() (gas: 11839644) +RainterpreterParserPointersTest:testLiteralParserFunctionPointers() (gas: 3931174) +RainterpreterParserPointersTest:testOperandHandlerFunctionPointers() (gas: 3933572) +RainterpreterParserPointersTest:testParserParseMeta() (gas: 98498) +RainterpreterPointersTest:testOpcodeFunctionPointers() (gas: 1562598) RainterpreterReferenceExternContextRainlenTest:testRainterpreterReferenceExterNPE2ContextRainlenHappy() (gas: 2176971) RainterpreterReferenceExternContextSenderTest:testRainterpreterReferenceExterNPE2ContextContractHappy() (gas: 2176562) RainterpreterReferenceExternContextSenderTest:testRainterpreterReferenceExterNPE2ContextSenderHappy() (gas: 2175259) @@ -561,8 +573,8 @@ RainterpreterReferenceExternIERC165Test:testRainterpreterReferenceExternIERC165( RainterpreterReferenceExternIntIncTest:testRainterpreterReferenceExternIntIncHappySugared() (gas: 2200628) RainterpreterReferenceExternIntIncTest:testRainterpreterReferenceExternIntIncHappyUnsugared() (gas: 2195248) RainterpreterReferenceExternIntIncTest:testRainterpreterReferenceExternIntIncIntegrity(bytes32,uint256,uint256) (runs: 106, μ: 3597, ~: 3597) -RainterpreterReferenceExternIntIncTest:testRainterpreterReferenceExternIntIncRun(bytes32,bytes32[]) (runs: 106, μ: 741132, ~: 744666) -RainterpreterReferenceExternIntIncTest:testRainterpreterReferenceExternIntIncSubParseKnownWord(uint16,bytes1) (runs: 106, μ: 2112697, ~: 2112967) +RainterpreterReferenceExternIntIncTest:testRainterpreterReferenceExternIntIncRun(bytes32,bytes32[]) (runs: 106, μ: 741754, ~: 744326) +RainterpreterReferenceExternIntIncTest:testRainterpreterReferenceExternIntIncSubParseKnownWord(uint16,bytes1) (runs: 106, μ: 2112680, ~: 2112967) RainterpreterReferenceExternIntIncTest:testRainterpreterReferenceExternIntIncSubParseUnknownWord(uint16,bytes1,bytes) (runs: 101, μ: 2109060, ~: 2108861) RainterpreterReferenceExternPointersTest:testIntegrityFunctionPointers() (gas: 2098961) RainterpreterReferenceExternPointersTest:testOpcodeFunctionPointers() (gas: 2099004) @@ -571,7 +583,7 @@ RainterpreterReferenceExternPointersTest:testSubParserLiteralParsers() (gas: 209 RainterpreterReferenceExternPointersTest:testSubParserOperandParsers() (gas: 2099454) RainterpreterReferenceExternPointersTest:testSubParserParseMeta() (gas: 21933) RainterpreterReferenceExternRepeatTest:testRainterpreterReferenceExternRepeatHappy() (gas: 2228764) -RainterpreterReferenceExternStackOperandTest:testRainterpreterReferenceExternStackOperandSingle(uint256) (runs: 2054, μ: 2185111, ~: 2185242) +RainterpreterReferenceExternStackOperandTest:testRainterpreterReferenceExternStackOperandSingle(uint256) (runs: 2054, μ: 2185119, ~: 2185242) RainterpreterReferenceExternUnknownWordTest:testRainterpreterReferenceExternUnknownWord() (gas: 2145680) RainterpreterStateOverlayTest:testStateOverlayGet() (gas: 52994) RainterpreterStateOverlayTest:testStateOverlaySet() (gas: 87503) diff --git a/src/generated/Rainterpreter.pointers.sol b/src/generated/Rainterpreter.pointers.sol index 866dbc2a0..72d2b7fc2 100644 --- a/src/generated/Rainterpreter.pointers.sol +++ b/src/generated/Rainterpreter.pointers.sol @@ -9,11 +9,11 @@ pragma solidity =0.8.25; /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x098677bc5dd8e3c94156edd2050427e2d4735f7b63c9975ed48db44a2b48dfbd); +bytes32 constant BYTECODE_HASH = bytes32(0x4fbfaa169751be67336dec6752e27c8ed5cdd42b6e03b5afd504db64a60fb1b2); /// @dev The function pointers known to the interpreter for dynamic dispatch. /// By setting these as a constant they can be inlined into the interpreter /// and loaded at eval time for very low gas (~100) due to the compiler /// optimising it to a single `codecopy` to build the in memory bytes array. bytes constant OPCODE_FUNCTION_POINTERS = - hex"06ce071e076009280a0f0a210a330a4c0a8e0ae00af10b020ba40be10c900d140d430d920d920dc10eb7"; + hex"06d70727076909310a180a2a0a3c0a550a970ae90afa0b0b0bad0bea0c990d1d0d4c0d7b0dca0dca0df90eef"; diff --git a/src/generated/RainterpreterExpressionDeployer.pointers.sol b/src/generated/RainterpreterExpressionDeployer.pointers.sol index 6f730ff17..465ef3beb 100644 --- a/src/generated/RainterpreterExpressionDeployer.pointers.sol +++ b/src/generated/RainterpreterExpressionDeployer.pointers.sol @@ -9,11 +9,11 @@ pragma solidity =0.8.25; /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x3fd5794e7b6d1588afdeded87ed9c0bd9980b01058e40a1a529c96fe7a28c702); +bytes32 constant BYTECODE_HASH = bytes32(0xc1221aa74b1434c555353f5a49978e2927bbbd2aa573390f2e9c70dae150fc61); /// @dev The hash of the meta that describes the contract. -bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0xe95d444a5adff1fccb525591c062eaa19b58b4a9baf33e4061acd66b23d48713); +bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0x5dd330895b51ba508a0d66b8780e5237ade2317c62f8ed54012fe5ec70c13e55); /// @dev The function pointers for the integrity check fns. bytes constant INTEGRITY_FUNCTION_POINTERS = - hex"0d9c0e1a0e7e0ff810021002100c1015103010d610d6113211aa1002100c0ff80ff80ff80ff8100c11b7"; + hex"0da40e220e861000100a100a1014101d103810de10de113a11b2100a101410001000100010001000101411bf"; diff --git a/src/generated/RainterpreterParser.pointers.sol b/src/generated/RainterpreterParser.pointers.sol index 945c5a35f..f5a7574d1 100644 --- a/src/generated/RainterpreterParser.pointers.sol +++ b/src/generated/RainterpreterParser.pointers.sol @@ -9,7 +9,7 @@ pragma solidity =0.8.25; /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xcd53a237a45964c4dec598f020953afc10b49404572f854126ac38801091899e); +bytes32 constant BYTECODE_HASH = bytes32(0x085974347eb2dbf40d35869d17ef03742781ba43c1b25f740b803db112b78372); /// @dev The parse meta that is used to lookup word definitions. /// The structure of the parse meta is: @@ -28,7 +28,7 @@ bytes32 constant BYTECODE_HASH = bytes32(0xcd53a237a45964c4dec598f020953afc10b49 /// bit count of the previous bloom filter. If we reach the end of the bloom /// filters then we have a miss. bytes constant PARSE_META = - hex"010400000084000020000100001480c000080022000000000a08000004004020248012247f9a0c1a71f803f3886500e75aa00b0a5e5a04c0e25d0f17e2ab0560a375134b1708083394ab0e908778020d55c6118cb51c01cc16a510c43a440dacafd5099918c50ab2278f14cae7b20698c5d007a441f5"; + hex"010400000084000020000100001480c000088022000000000a08000004004020248013247f9a0c1a71f803f3886500e75aa00b0a5e5a04c0e25d1017e2ab0560a375144b1708083394ab0e9087780f97bf37020d55c6128cb51c01cc16a511c43a440dacafd5099918c50ab2278f15cae7b20698c5d007a441f5"; /// @dev The build depth of the parser meta. @@ -38,11 +38,11 @@ uint8 constant PARSE_META_BUILD_DEPTH = 2; /// These positional indexes all map to the same indexes looked up in the parse /// meta. bytes constant OPERAND_HANDLER_FUNCTION_POINTERS = - hex"1d001d001d001dc91ec81ec81ec81dc91dc91d001d001d001ec81ec81ec81ec81ec81ec81ec81ec81ec8"; + hex"1d081d081d081dd11ed01ed01ed01dd11dd11d081d081d081ed01ed01ed01ed01ed01ed01ed01ed01ed01ed0"; /// @dev Every two bytes is a function pointer for a literal parser. /// Literal dispatches are determined by the first byte(s) of the literal /// rather than a full word lookup, and are done with simple conditional /// jumps as the possibilities are limited compared to the number of words we /// have. -bytes constant LITERAL_PARSER_FUNCTION_POINTERS = hex"173c1a041a351b0f"; +bytes constant LITERAL_PARSER_FUNCTION_POINTERS = hex"17441a0c1a3d1b17"; diff --git a/src/lib/op/LibAllStandardOps.sol b/src/lib/op/LibAllStandardOps.sol index 46ec32066..0ae42cf1d 100644 --- a/src/lib/op/LibAllStandardOps.sol +++ b/src/lib/op/LibAllStandardOps.sol @@ -41,7 +41,7 @@ import {LibOpERC721OwnerOf} from "./erc721/LibOpERC721OwnerOf.sol"; import {LibOpERC5313OwnerNP} from "./erc5313/LibOpERC5313OwnerNP.sol"; -import {LibOpBlockNumberNP} from "./evm/LibOpBlockNumberNP.sol"; +import {LibOpBlockNumber} from "./evm/LibOpBlockNumber.sol"; import {LibOpChainId} from "./evm/LibOpChainId.sol"; import {LibOpMaxUint256NP} from "./evm/LibOpMaxUint256NP.sol"; import {LibOpTimestamp} from "./evm/LibOpTimestamp.sol"; @@ -103,7 +103,7 @@ import {LibParseLiteralHex} from "../parse/literal/LibParseLiteralHex.sol"; import {LibParseLiteralSubParseable} from "../parse/literal/LibParseLiteralSubParseable.sol"; /// @dev Number of ops currently provided by `AllStandardOps`. -uint256 constant ALL_STANDARD_OPS_LENGTH = 21; +uint256 constant ALL_STANDARD_OPS_LENGTH = 22; /// @title LibAllStandardOps /// @notice Every opcode available from the core repository laid out as a single @@ -193,7 +193,7 @@ library LibAllStandardOps { "erc5313-owner", "Gets the owner of an erc5313 compatible contract. Note that erc5313 specifically DOES NOT do any onchain compatibility checks, so the expression author is responsible for ensuring the contract is compatible. The input is the contract address to get the owner of." ), - // AuthoringMetaV2("block-number", "The current block number."), + AuthoringMetaV2("block-number", "The current block number."), AuthoringMetaV2("chain-id", "The current chain id."), AuthoringMetaV2("uint256-max-value", "The maximum possible unsigned integer value (all binary bits are 1)."), AuthoringMetaV2("block-timestamp", "The current block timestamp."), @@ -400,8 +400,8 @@ library LibAllStandardOps { LibParseOperand.handleOperandDisallowed, // erc5313-owner LibParseOperand.handleOperandDisallowed, - // // block-number - // LibParseOperand.handleOperandDisallowed, + // block-number + LibParseOperand.handleOperandDisallowed, // chain-id LibParseOperand.handleOperandDisallowed, // max-value @@ -558,7 +558,7 @@ library LibAllStandardOps { // LibOpUint256ERC721BalanceOf.integrity, LibOpERC721OwnerOf.integrity, LibOpERC5313OwnerNP.integrity, - // LibOpBlockNumberNP.integrity, + LibOpBlockNumber.integrity, LibOpChainId.integrity, LibOpMaxUint256NP.integrity, LibOpTimestamp.integrity, @@ -670,7 +670,7 @@ library LibAllStandardOps { // LibOpUint256ERC721BalanceOf.run, LibOpERC721OwnerOf.run, LibOpERC5313OwnerNP.run, - // LibOpBlockNumberNP.run, + LibOpBlockNumber.run, LibOpChainId.run, LibOpMaxUint256NP.run, LibOpTimestamp.run, diff --git a/src/lib/op/evm/LibOpBlockNumberNP.sol b/src/lib/op/evm/LibOpBlockNumber.sol similarity index 57% rename from src/lib/op/evm/LibOpBlockNumberNP.sol rename to src/lib/op/evm/LibOpBlockNumber.sol index 479540610..fb7393921 100644 --- a/src/lib/op/evm/LibOpBlockNumberNP.sol +++ b/src/lib/op/evm/LibOpBlockNumber.sol @@ -2,13 +2,16 @@ pragma solidity ^0.8.18; import {Pointer} from "rain.solmem/lib/LibPointer.sol"; -import {OperandV2} from "rain.interpreter.interface/interface/unstable/IInterpreterV4.sol"; +import {OperandV2, StackItem} from "rain.interpreter.interface/interface/unstable/IInterpreterV4.sol"; import {InterpreterState} from "../../state/LibInterpreterState.sol"; import {IntegrityCheckState} from "../../integrity/LibIntegrityCheckNP.sol"; +import {Float, LibDecimalFloat, PackedFloat} from "rain.math.float/lib/LibDecimalFloat.sol"; -/// @title LibOpBlockNumberNP +/// @title LibOpBlockNumber /// Implementation of the EVM `BLOCKNUMBER` opcode as a standard Rainlang opcode. -library LibOpBlockNumberNP { +library LibOpBlockNumber { + using LibDecimalFloat for Float; + function integrity(IntegrityCheckState memory, OperandV2) internal pure returns (uint256, uint256) { return (0, 1); } @@ -21,13 +24,14 @@ library LibOpBlockNumberNP { return stackTop; } - function referenceFn(InterpreterState memory, OperandV2, uint256[] memory) + function referenceFn(InterpreterState memory, OperandV2, StackItem[] memory) internal view - returns (uint256[] memory) + returns (StackItem[] memory) { - uint256[] memory outputs = new uint256[](1); - outputs[0] = block.number; + StackItem[] memory outputs = new StackItem[](1); + outputs[0] = + StackItem.wrap(PackedFloat.unwrap(LibDecimalFloat.fromFixedDecimalLosslessMem(block.number, 0).pack())); return outputs; } } diff --git a/test/src/lib/op/evm/LibOpBlockNumber.t.sol b/test/src/lib/op/evm/LibOpBlockNumber.t.sol new file mode 100644 index 000000000..a383351c2 --- /dev/null +++ b/test/src/lib/op/evm/LibOpBlockNumber.t.sol @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: CAL +pragma solidity =0.8.25; + +import {OpTest} from "test/abstract/OpTest.sol"; + +import {LibPointer, Pointer} from "rain.solmem/lib/LibPointer.sol"; +import { + IInterpreterV4, + OperandV2, + SourceIndexV2, + FullyQualifiedNamespace, + StackItem +} from "rain.interpreter.interface/interface/unstable/IInterpreterV4.sol"; +import {LibStackPointer} from "rain.solmem/lib/LibStackPointer.sol"; +import {IMetaV1} from "rain.metadata/interface/deprecated/IMetaV1.sol"; +import {IInterpreterStoreV2} from "rain.interpreter.interface/interface/IInterpreterStoreV2.sol"; +import {LibInterpreterState, InterpreterState} from "src/lib/state/LibInterpreterState.sol"; +import {IntegrityCheckState, BadOpInputsLength} from "src/lib/integrity/LibIntegrityCheckNP.sol"; +import {LibContext} from "rain.interpreter.interface/lib/caller/LibContext.sol"; +import {SignedContextV1} from "rain.interpreter.interface/interface/IInterpreterCallerV3.sol"; +import {LibOpBlockNumber} from "src/lib/op/evm/LibOpBlockNumber.sol"; +import {LibOperand} from "test/lib/operand/LibOperand.sol"; + +/// @title LibOpBlockNumberTest +/// @notice Test the runtime and integrity time logic of LibOpBlockNumber. +contract LibOpBlockNumberTest is OpTest { + using LibPointer for Pointer; + using LibStackPointer for Pointer; + using LibInterpreterState for InterpreterState; + + /// Directly test the integrity logic of LibOpBlockNumber. + function testOpBlockNumberIntegrity( + IntegrityCheckState memory state, + uint8 inputs, + uint8 outputs, + uint16 operandData + ) external pure { + inputs = uint8(bound(inputs, 0, 0x0F)); + outputs = uint8(bound(outputs, 0, 0x0F)); + (uint256 calcInputs, uint256 calcOutputs) = + LibOpBlockNumber.integrity(state, LibOperand.build(inputs, outputs, operandData)); + + assertEq(calcInputs, 0); + assertEq(calcOutputs, 1); + } + + /// Directly test the runtime logic of LibOpBlockNumber. This tests that the + /// opcode correctly pushes the block number onto the stack. + function testOpBlockNumberRun(uint256 blockNumber, uint16 operandData) external { + blockNumber = bound(blockNumber, 0, uint256(uint128(type(int128).max))); + InterpreterState memory state = opTestDefaultInterpreterState(); + vm.roll(blockNumber); + StackItem[] memory inputs = new StackItem[](0); + OperandV2 operand = LibOperand.build(0, 1, operandData); + opReferenceCheck( + state, operand, LibOpBlockNumber.referenceFn, LibOpBlockNumber.integrity, LibOpBlockNumber.run, inputs + ); + } + + /// Test the eval of a block number opcode parsed from a string. + function testOpBlockNumberEval(uint256 blockNumber) public { + blockNumber = bound(blockNumber, 0, uint256(int256(type(int128).max))); + vm.roll(blockNumber); + checkHappy("_: block-number();", bytes32(uint256(blockNumber)), ""); + } + + function testOpBlockNumberEvalOneInput() external { + checkBadInputs("_: block-number(0x00);", 1, 0, 1); + } + + function testOpBlockNumberEvalZeroOutputs() external { + checkBadOutputs(": block-number();", 0, 1, 0); + } + + function testOpBlockNumberEvalTwoOutputs() external { + checkBadOutputs("_ _: block-number();", 0, 1, 2); + } +} diff --git a/test/src/lib/op/evm/LibOpBlockNumberNP.t.sol b/test/src/lib/op/evm/LibOpBlockNumberNP.t.sol deleted file mode 100644 index 370cb59a7..000000000 --- a/test/src/lib/op/evm/LibOpBlockNumberNP.t.sol +++ /dev/null @@ -1,77 +0,0 @@ -// SPDX-License-Identifier: CAL -pragma solidity =0.8.25; - -// // import {OpTest} from "test/abstract/OpTest.sol"; - -// import {LibPointer, Pointer} from "rain.solmem/lib/LibPointer.sol"; -// import { -// IInterpreterV4, -// Operand, -// SourceIndexV2, -// FullyQualifiedNamespace -// } from "rain.interpreter.interface/interface/unstable/IInterpreterV4.sol"; -// import {LibStackPointer} from "rain.solmem/lib/LibStackPointer.sol"; -// import {IMetaV1} from "rain.metadata/interface/deprecated/IMetaV1.sol"; -// import {IInterpreterStoreV2} from "rain.interpreter.interface/interface/IInterpreterStoreV2.sol"; -// import {LibInterpreterState, InterpreterState} from "src/lib/state/LibInterpreterState.sol"; -// import {IntegrityCheckState, BadOpInputsLength} from "src/lib/integrity/LibIntegrityCheckNP.sol"; -// import {LibContext} from "rain.interpreter.interface/lib/caller/LibContext.sol"; -// import {SignedContextV1} from "rain.interpreter.interface/interface/IInterpreterCallerV3.sol"; -// import {LibOpBlockNumberNP} from "src/lib/op/evm/LibOpBlockNumberNP.sol"; -// import {LibOperand} from "test/lib/operand/LibOperand.sol"; - -// // /// @title LibOpBlockNumberNPTest -// // /// @notice Test the runtime and integrity time logic of LibOpBlockNumberNP. -// // contract LibOpBlockNumberNPTest is OpTest { -// // using LibPointer for Pointer; -// // using LibStackPointer for Pointer; -// // using LibInterpreterState for InterpreterState; - -// /// Directly test the integrity logic of LibOpBlockNumberNP. -// function testOpBlockNumberNPIntegrity( -// IntegrityCheckState memory state, -// uint8 inputs, -// uint8 outputs, -// uint16 operandData -// ) external pure { -// inputs = uint8(bound(inputs, 0, 0x0F)); -// outputs = uint8(bound(outputs, 0, 0x0F)); -// (uint256 calcInputs, uint256 calcOutputs) = -// LibOpBlockNumberNP.integrity(state, LibOperand.build(inputs, outputs, operandData)); - -// // assertEq(calcInputs, 0); -// // assertEq(calcOutputs, 1); -// // } - -// // /// Directly test the runtime logic of LibOpBlockNumberNP. This tests that the -// // /// opcode correctly pushes the block number onto the stack. -// // function testOpBlockNumberNPRun(uint256 blockNumber, uint16 operandData) external { -// // blockNumber = bound(blockNumber, 0, type(uint256).max / 1e18); -// // InterpreterState memory state = opTestDefaultInterpreterState(); -// // vm.roll(blockNumber); -// // uint256[] memory inputs = new uint256[](0); -// // Operand operand = LibOperand.build(0, 1, operandData); -// // opReferenceCheck( -// // state, operand, LibOpBlockNumberNP.referenceFn, LibOpBlockNumberNP.integrity, LibOpBlockNumberNP.run, inputs -// // ); -// // } - -// // /// Test the eval of a block number opcode parsed from a string. -// // function testOpBlockNumberNPEval(uint256 blockNumber) public { -// // blockNumber = bound(blockNumber, 0, type(uint256).max / 1e18); -// // vm.roll(blockNumber); -// // checkHappy("_: block-number();", blockNumber * 1e18, ""); -// // } - -// // function testOpBlockNumberNPEvalOneInput() external { -// // checkBadInputs("_: block-number(0x00);", 1, 0, 1); -// // } - -// // function testOpBlockNumberNPEvalZeroOutputs() external { -// // checkBadOutputs(": block-number();", 0, 1, 0); -// // } - -// // function testOpBlockNumberNPEvalTwoOutputs() external { -// // checkBadOutputs("_ _: block-number();", 0, 1, 2); -// // } -// // }