From d17c947a2894960029ad2da200c570785090859b Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Thu, 7 Aug 2025 13:31:55 +0400 Subject: [PATCH 1/2] gm op --- src/generated/Rainterpreter.pointers.sol | 4 +- ...interpreterExpressionDeployer.pointers.sol | 6 +- .../RainterpreterParser.pointers.sol | 8 +- src/lib/op/LibAllStandardOps.sol | 14 +-- src/lib/op/math/LibOpGm.sol | 87 ++++++++++--------- 5 files changed, 63 insertions(+), 56 deletions(-) diff --git a/src/generated/Rainterpreter.pointers.sol b/src/generated/Rainterpreter.pointers.sol index c0ffe01df..604bfd2e3 100644 --- a/src/generated/Rainterpreter.pointers.sol +++ b/src/generated/Rainterpreter.pointers.sol @@ -10,11 +10,11 @@ pragma solidity =0.8.25; /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x51b1da22a04655b323cb6f32069b42a2f5ebffe8a0bc8387b1114a5bd8ee6b7f); +bytes32 constant BYTECODE_HASH = bytes32(0x058f6e179954062975f1f516e5581e0e4250dc80b12ec528f963b42562314db8); /// @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"086c089e08c20a4e0b170b290b3b0b540b780bac0bbd0bce0c700c8f0d4d0dfd0e810fc310f60d4d11ef12a1134313bb13cc13dd13dd13ee1459156415e315fc1610166f168816a116da1705171e1737178017a717ba181c186a18b819061954196219b019d31a211a521a961abb1ac91ad71af01afe1b4c1b7d1bae1bfc1c2d1c5e1cac1cd91cfc1d4a1e40"; + hex"087508a708cb0a570b200b320b440b5d0b810bb50bc60bd70c790c980d560e060e8a0fcc10ff0d5611f812aa134c13c413d513e613e613f71462156d15ec160516191678169116aa16e3170e17271740178917b017c31825187318c1190f195d196b19b919dc1a2a1a5b1a9f1ac41ad21ae01b311b4a1b581ba61bd71c081c561c871cb81d061d331d561da41e9a"; diff --git a/src/generated/RainterpreterExpressionDeployer.pointers.sol b/src/generated/RainterpreterExpressionDeployer.pointers.sol index d992809a0..347002a75 100644 --- a/src/generated/RainterpreterExpressionDeployer.pointers.sol +++ b/src/generated/RainterpreterExpressionDeployer.pointers.sol @@ -10,11 +10,11 @@ pragma solidity =0.8.25; /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0x23bc63ae1d26a9ebfda70ae22cca9ddb1236ebe1013163e0a179bb154ecd7b17); +bytes32 constant BYTECODE_HASH = bytes32(0x1b5519183df0925de8b552daa52766a1d41087a630c1869dcbd656e9edacefb7); /// @dev The hash of the meta that describes the contract. -bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0x0b22bc257e4cb2ce684388542376b2cc279485b3527b8d50c98d7557f1cbf713); +bytes32 constant DESCRIBED_BY_META_HASH = bytes32(0x6160988942c60333bd4c6f09f5ed3d93d5552c9052d9d2bcab6dccc418d0b791); /// @dev The function pointers for the integrity check fns. bytes constant INTEGRITY_FUNCTION_POINTERS = - hex"0ee80f660fca1144114e114e11581161117c12221222127e12f61303114e11581303114e1158114e114e114e11581144114411441144130d1332134c114e114e130d114e114e13031158114e114e1303130311441356135613561356135611581356114e137011441158115811581158115811581356114411441356114411441370114e115813701158134c"; + hex"0ef00f6e0fd2114c11561156116011691184122a122a128612fe130b11561160130b115611601156115611561160114c114c114c114c1315133a135411561156131511561156130b116011561156130b130b114c135e135e135e135e135e1160135e11561378114c1160116011601160115611601160135e114c114c135e114c114c137811561160137811601354"; diff --git a/src/generated/RainterpreterParser.pointers.sol b/src/generated/RainterpreterParser.pointers.sol index ada2feba7..9edbadb0b 100644 --- a/src/generated/RainterpreterParser.pointers.sol +++ b/src/generated/RainterpreterParser.pointers.sol @@ -10,7 +10,7 @@ pragma solidity =0.8.25; /// @dev Hash of the known bytecode. -bytes32 constant BYTECODE_HASH = bytes32(0xd645ac93a6fb7396fcf0ed82f84c20657c6936d3a5ec8a37de6270b9a305cde5); +bytes32 constant BYTECODE_HASH = bytes32(0x914aa90ef2bb7b6068265b57a391e3d01a0683a84a1b9cdfb5622c0d4952ddaa); /// @dev The parse meta that is used to lookup word definitions. /// The structure of the parse meta is: @@ -29,7 +29,7 @@ bytes32 constant BYTECODE_HASH = bytes32(0xd645ac93a6fb7396fcf0ed82f84c20657c693 /// 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"027360018812c0058112300804a1a02000120192e89864d17a6010788a0800310122000002000000000000000000000000000000000005000000000000000000000000253bfdf302d3ac012ac8268505b44edf36182f2a14690c630d83a7eb32c5853a08ccb48c3358350a1c21b6884298a6e5262057e32f7e09af17b43369161b9cec2b5ab5e8384715a6243c910831738e093542f25d1e8a3fa7150113a32e22720213c659b9225ac7c1285da1bd44cc18770aa63c19048eb6fa018179d300dfb6a91fde8a882cb772ea03596d3111fd7ab9457b42922d4396834158726b1d2330703994005b21f438852081752c3fff19581ac1a49e30ffeff03ae1eec73b24bdfe2760978f232d6a9a09d520ad061480a0294c65fb344763440ecb8d4d0b8b587210e7c1b518e4b09907152b041261f729198ab9053cf8942b1b45c1270f22a49a3ea6838c4360cc7c0c668e383d10da5037d6d3e340e7d2ff"; + hex"027360018812c0058112300804a1a02000120192e89864d17a6030788a0800310122000002000000000000000000000000000000000005000000000000000000000000253bfdf302d3ac012ac8268505b44edf36182f2a14690c630d83a7eb32c5853a08ccb48c3358350a1c21b6884398a6e5262057e32f7e09af17b433693838e9b4161b9cec2b5ab5e8394715a6243c910831738e093542f25d1e8a3fa7150113a32e22720213c659b9225ac7c1285da1bd45cc18770aa63c19048eb6fa018179d300dfb6a91fde8a882cb772ea03596d3111fd7ab9467b42922d4396834258726b1d2330703a94005b21f438852081752c40ff19581ac1a49e30ffeff03be1eec73c24bdfe2760978f232d6a9a09d520ad061480a0294c65fb344763440ecb8d4d0b8b587210e7c1b518e4b09907152b041261f729198ab9053df8942b1b45c1270f22a49a3fa6838c4460cc7c0c668e383e10da5037d6d3e341e7d2ff"; /// @dev The build depth of the parser meta. @@ -39,11 +39,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"1acd1acd1acd1ba21cb91cb91cb91ba21ba21acd1acd1acd1cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91cb91acd1cb91cb9"; + hex"1ad51ad51ad51baa1cc11cc11cc11baa1baa1ad51ad51ad51cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11cc11ad51cc11cc1"; /// @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"16151847188a1928"; +bytes constant LITERAL_PARSER_FUNCTION_POINTERS = hex"161d184f18921930"; diff --git a/src/lib/op/LibAllStandardOps.sol b/src/lib/op/LibAllStandardOps.sol index 71eb2aa95..186c6ae76 100644 --- a/src/lib/op/LibAllStandardOps.sol +++ b/src/lib/op/LibAllStandardOps.sol @@ -80,7 +80,7 @@ import {LibOpExp} from "./math/LibOpExp.sol"; import {LibOpExp2} from "./math/LibOpExp2.sol"; import {LibOpFloor} from "./math/LibOpFloor.sol"; import {LibOpFrac} from "./math/LibOpFrac.sol"; -// import {LibOpGm} from "./math/LibOpGm.sol"; +import {LibOpGm} from "./math/LibOpGm.sol"; import {LibOpHeadroom} from "./math/LibOpHeadroom.sol"; import {LibOpInv} from "./math/LibOpInv.sol"; // import {LibOpLn} from "./math/LibOpLn.sol"; @@ -112,7 +112,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 = 70; +uint256 constant ALL_STANDARD_OPS_LENGTH = 71; /// @title LibAllStandardOps /// @notice Every opcode available from the core repository laid out as a single @@ -277,7 +277,7 @@ library LibAllStandardOps { AuthoringMetaV2("exp2", "Binary exponential 2^x."), AuthoringMetaV2("floor", "Floor of a number."), AuthoringMetaV2("frac", "Fractional part of a number."), - // AuthoringMetaV2("gm", "Geometric mean of all numbers. Errors if any number is zero."), + AuthoringMetaV2("gm", "Geometric mean of two numbers."), AuthoringMetaV2( "headroom", "Headroom of a number. I.e. the distance to the next whole number (1 - frac(x)). The headroom at any whole number is 1 (not 0)." @@ -480,8 +480,8 @@ library LibAllStandardOps { LibParseOperand.handleOperandDisallowed, // frac LibParseOperand.handleOperandDisallowed, - // // gm - // LibParseOperand.handleOperandDisallowed, + // gm + LibParseOperand.handleOperandDisallowed, // headroom LibParseOperand.handleOperandDisallowed, // inv @@ -608,7 +608,7 @@ library LibAllStandardOps { LibOpExp2.integrity, LibOpFloor.integrity, LibOpFrac.integrity, - // LibOpGm.integrity, + LibOpGm.integrity, LibOpHeadroom.integrity, LibOpInv.integrity, // LibOpLn.integrity, @@ -719,7 +719,7 @@ library LibAllStandardOps { LibOpExp2.run, LibOpFloor.run, LibOpFrac.run, - // LibOpGm.run, + LibOpGm.run, LibOpHeadroom.run, LibOpInv.run, // LibOpLn.run, diff --git a/src/lib/op/math/LibOpGm.sol b/src/lib/op/math/LibOpGm.sol index 19bee256d..9d5468d22 100644 --- a/src/lib/op/math/LibOpGm.sol +++ b/src/lib/op/math/LibOpGm.sol @@ -1,47 +1,54 @@ // SPDX-License-Identifier: CAL pragma solidity ^0.8.18; -// import {UD60x18, gm} from "prb-math/UD60x18.sol"; -// import {OperandV2} from "rain.interpreter.interface/interface/unstable/IInterpreterV4.sol"; -// import {Pointer} from "rain.solmem/lib/LibPointer.sol"; -// import {InterpreterState} from "../../state/LibInterpreterState.sol"; -// import {IntegrityCheckState} from "../../integrity/LibIntegrityCheck.sol"; +import {OperandV2} from "rain.interpreter.interface/interface/unstable/IInterpreterV4.sol"; +import {Pointer} from "rain.solmem/lib/LibPointer.sol"; +import {InterpreterState} from "../../state/LibInterpreterState.sol"; +import {IntegrityCheckState} from "../../integrity/LibIntegrityCheck.sol"; +import {LibDecimalFloat, Float} from "rain.math.float/lib/LibDecimalFloat.sol"; +import {StackItem} from "rain.interpreter.interface/interface/unstable/IInterpreterV4.sol"; -// /// @title LibOpGm -// /// @notice Opcode for the geometric average of two decimal 18 fixed point -// /// numbers. -// library LibOpGm { -// function integrity(IntegrityCheckState memory, Operand) internal pure returns (uint256, uint256) { -// // There must be two inputs and one output. -// return (2, 1); -// } +/// @title LibOpGm +/// @notice Opcode for the geometric average of two decimal floating point +/// numbers. +library LibOpGm { + using LibDecimalFloat for Float; -// /// gm -// /// 18 decimal fixed point geometric average of two numbers. -// function run(InterpreterState memory, Operand, Pointer stackTop) internal pure returns (Pointer) { -// uint256 a; -// uint256 b; -// assembly ("memory-safe") { -// a := mload(stackTop) -// stackTop := add(stackTop, 0x20) -// b := mload(stackTop) -// } -// a = UD60x18.unwrap(gm(UD60x18.wrap(a), UD60x18.wrap(b))); + function integrity(IntegrityCheckState memory, OperandV2) internal pure returns (uint256, uint256) { + // There must be two inputs and one output. + return (2, 1); + } -// assembly ("memory-safe") { -// mstore(stackTop, a) -// } -// return stackTop; -// } + /// gm + /// decimal floating point geometric average of two numbers. + function run(InterpreterState memory, OperandV2, Pointer stackTop) internal view returns (Pointer) { + Float a; + Float b; + assembly ("memory-safe") { + a := mload(stackTop) + stackTop := add(stackTop, 0x20) + b := mload(stackTop) + } + a = a.mul(b).pow(LibDecimalFloat.FLOAT_HALF, LibDecimalFloat.LOG_TABLES_ADDRESS); -// /// Gas intensive reference implementation of gm for testing. -// function referenceFn(InterpreterState memory, Operand, uint256[] memory inputs) -// internal -// pure -// returns (uint256[] memory) -// { -// uint256[] memory outputs = new uint256[](1); -// outputs[0] = UD60x18.unwrap(gm(UD60x18.wrap(inputs[0]), UD60x18.wrap(inputs[1]))); -// return outputs; -// } -// } + assembly ("memory-safe") { + mstore(stackTop, a) + } + return stackTop; + } + + /// Gas intensive reference implementation of gm for testing. + function referenceFn(InterpreterState memory, OperandV2, StackItem[] memory inputs) + internal + view + returns (StackItem[] memory) + { + // The geometric mean is sqrt(a * b). + Float a = Float.wrap(StackItem.unwrap(inputs[0])); + Float b = Float.wrap(StackItem.unwrap(inputs[1])); + a = a.mul(b).pow(LibDecimalFloat.FLOAT_HALF, LibDecimalFloat.LOG_TABLES_ADDRESS); + StackItem[] memory outputs = new StackItem[](1); + outputs[0] = StackItem.wrap(Float.unwrap(a)); + return outputs; + } +} From db1c3909ec938f0188ac02ee03d307763bb519ab Mon Sep 17 00:00:00 2001 From: thedavidmeister Date: Thu, 7 Aug 2025 13:47:51 +0400 Subject: [PATCH 2/2] gm op --- .gas-snapshot | 256 +++++++++++++++-------------- test/src/lib/op/math/LibOpGm.t.sol | 132 ++++++++------- 2 files changed, 206 insertions(+), 182 deletions(-) diff --git a/.gas-snapshot b/.gas-snapshot index 94798f8a5..5612ddc53 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,16 +1,16 @@ BaseRainterpreterExternNPE2IERC165Test:testRainterpreterExternNPE2IERC165(bytes4) (runs: 2061, μ: 320946, ~: 320946) BaseRainterpreterSubParserNPE2IERC165Test:testRainterpreterSubParserNPE2IERC165(uint32) (runs: 2061, μ: 678755, ~: 678755) -LibAllStandardOpsTest:testIntegrityAndOpcodeFunctionPointersLength() (gas: 82172) -LibAllStandardOpsTest:testIntegrityFunctionPointersLength() (gas: 11534) -LibAllStandardOpsTest:testOpcodeFunctionPointersLength() (gas: 11519) -LibEvalFBoundsTest:testEvalNPFBoundsModConstant(bytes32) (runs: 2061, μ: 87406, ~: 87406) +LibAllStandardOpsTest:testIntegrityAndOpcodeFunctionPointersLength() (gas: 83063) +LibAllStandardOpsTest:testIntegrityFunctionPointersLength() (gas: 11647) +LibAllStandardOpsTest:testOpcodeFunctionPointersLength() (gas: 11632) +LibEvalFBoundsTest:testEvalNPFBoundsModConstant(bytes32) (runs: 2061, μ: 87519, ~: 87519) LibExternCodecTest:testLibExternCodecEncodeExternCall(uint256,bytes32) (runs: 2061, μ: 9770, ~: 10284) LibExternCodecTest:testLibExternCodecEncodeExternDispatch(uint256,bytes32) (runs: 2061, μ: 8887, ~: 9401) LibInterpreterStateStackTraceTest:testStackTraceCall(uint256,uint256,uint256[]) (runs: 2061, μ: 43081, ~: 42630) LibOpAbsTest:testOpAbsEval() (gas: 293383) LibOpAbsTest:testOpAbsEvalOperandDisallowed() (gas: 17593) LibOpAbsTest:testOpAbsIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 13754, ~: 13667) -LibOpAbsTest:testOpAbsRun(bytes32,uint16) (runs: 2061, μ: 17408, ~: 17349) +LibOpAbsTest:testOpAbsRun(bytes32,uint16) (runs: 2061, μ: 17409, ~: 17349) LibOpAbsTest:testOpAbsTwoInputs() (gas: 40024) LibOpAbsTest:testOpAbsTwoOutputs() (gas: 35855) LibOpAbsTest:testOpAbsZeroInputs() (gas: 30184) @@ -27,10 +27,10 @@ LibOpAddTest:testOpAddEvalOperandDisallowed() (gas: 91729) LibOpAddTest:testOpAddEvalTwoOutput() (gas: 44027) LibOpAddTest:testOpAddEvalZeroInputs() (gas: 30263) LibOpAddTest:testOpAddEvalZeroOutputs() (gas: 43045) -LibOpAddTest:testOpAddIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18201, ~: 18427) +LibOpAddTest:testOpAddIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18206, ~: 18434) LibOpAddTest:testOpAddIntegrityUnhappyOneInput((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13874, ~: 13797) LibOpAddTest:testOpAddIntegrityUnhappyZeroInputs((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13871, ~: 13794) -LibOpAddTest:testOpAddRun(bytes32[]) (runs: 2051, μ: 52166, ~: 52314) +LibOpAddTest:testOpAddRun(bytes32[]) (runs: 2051, μ: 52039, ~: 51984) LibOpAnyTest:testOpAnyEval1FalseInput() (gas: 51945) LibOpAnyTest:testOpAnyEval1TrueInput() (gas: 51893) LibOpAnyTest:testOpAnyEval2FalseInputs() (gas: 57239) @@ -40,9 +40,9 @@ LibOpAnyTest:testOpAnyEval2MixedInputsZeroExponent() (gas: 58913) LibOpAnyTest:testOpAnyEval2TrueInputs() (gas: 57829) LibOpAnyTest:testOpAnyEvalFail() (gas: 29770) LibOpAnyTest:testOpAnyIntegrityGas0() (gas: 3251) -LibOpAnyTest:testOpAnyIntegrityHappy(uint8,uint16) (runs: 2061, μ: 8298, ~: 8417) +LibOpAnyTest:testOpAnyIntegrityHappy(uint8,uint16) (runs: 2061, μ: 8299, ~: 8568) LibOpAnyTest:testOpAnyIntegrityUnhappyZeroInputs() (gas: 4059) -LibOpAnyTest:testOpAnyRun(bytes32[],uint16) (runs: 2051, μ: 21818, ~: 21797) +LibOpAnyTest:testOpAnyRun(bytes32[],uint16) (runs: 2051, μ: 21817, ~: 21797) LibOpAnyTest:testOpAnyRunGas0() (gas: 3345) LibOpAnyTest:testOpAnyTwoOutputs() (gas: 35825) LibOpAnyTest:testOpAnyZeroOutputs() (gas: 34795) @@ -53,7 +53,7 @@ LibOpAvgTest:testOpAvgEvalThreeInputs() (gas: 44951) LibOpAvgTest:testOpAvgEvalTwoOutputs() (gas: 40755) LibOpAvgTest:testOpAvgEvalZeroOutputs() (gas: 39730) LibOpAvgTest:testOpAvgIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 13776, ~: 13689) -LibOpAvgTest:testOpAvgRun(int256,int256,int256,int256,uint16) (runs: 2061, μ: 37792, ~: 37836) +LibOpAvgTest:testOpAvgRun(int256,int256,int256,int256,uint16) (runs: 2061, μ: 37789, ~: 37819) LibOpBinaryEqualToTest:testOpBinaryEqualToEval2() (gas: 208020) LibOpBinaryEqualToTest:testOpBinaryEqualToEval2InputsBothOne() (gas: 57888) LibOpBinaryEqualToTest:testOpBinaryEqualToEval2InputsFirstOneSecondZero() (gas: 58619) @@ -62,7 +62,7 @@ LibOpBinaryEqualToTest:testOpBinaryEqualToEval2ZeroInputs() (gas: 57933) LibOpBinaryEqualToTest:testOpBinaryEqualToEvalFail0Inputs() (gas: 30666) LibOpBinaryEqualToTest:testOpBinaryEqualToEvalFail1Input() (gas: 34985) LibOpBinaryEqualToTest:testOpBinaryEqualToEvalFail3Inputs() (gas: 43484) -LibOpBinaryEqualToTest:testOpBinaryEqualToIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19691, ~: 19937) +LibOpBinaryEqualToTest:testOpBinaryEqualToIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19699, ~: 19922) LibOpBinaryEqualToTest:testOpBinaryEqualToRun(bytes32,bytes32) (runs: 2061, μ: 16674, ~: 16674) LibOpBinaryEqualToTest:testOpBinaryEqualToTwoOutputs() (gas: 41643) LibOpBinaryEqualToTest:testOpBinaryEqualToZeroOutputs() (gas: 40574) @@ -84,22 +84,22 @@ LibOpBitwiseOrNPTest:testOpBitwiseORNPEvalZeroInputs() (gas: 30719) LibOpBitwiseOrNPTest:testOpBitwiseORNPEvalZeroOutputs() (gas: 40287) LibOpBitwiseOrNPTest:testOpBitwiseORNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 13753, ~: 13666) LibOpBitwiseOrNPTest:testOpBitwiseORNPRun(bytes32,bytes32) (runs: 2061, μ: 16628, ~: 16628) -LibOpBlockNumberTest:testOpBlockNumberEval(uint256) (runs: 2061, μ: 51017, ~: 50792) +LibOpBlockNumberTest:testOpBlockNumberEval(uint256) (runs: 2061, μ: 51019, ~: 50792) LibOpBlockNumberTest:testOpBlockNumberEvalOneInput() (gas: 35212) LibOpBlockNumberTest:testOpBlockNumberEvalTwoOutputs() (gas: 31514) LibOpBlockNumberTest:testOpBlockNumberEvalZeroOutputs() (gas: 30505) -LibOpBlockNumberTest:testOpBlockNumberIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19658, ~: 19915) +LibOpBlockNumberTest:testOpBlockNumberIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19649, ~: 19915) LibOpBlockNumberTest:testOpBlockNumberRun(uint256,uint16) (runs: 2061, μ: 20846, ~: 21044) LibOpCallTest:testCallTraceInnerOnly() (gas: 63050) LibOpCallTest:testCallTraceOuterOnly() (gas: 45616) -LibOpCallTest:testOpCallNPIntegrityIO((uint256,uint256,uint256,bytes32[],uint256,bytes),uint256,uint256,uint8,bytes32) (runs: 2058, μ: 39771, ~: 38385) -LibOpCallTest:testOpCallNPIntegritySourceIndexOutOfBounds((uint256,uint256,uint256,bytes32[],uint256,bytes),uint256,uint256,uint256,uint256,bytes32) (runs: 2061, μ: 59274, ~: 58289) -LibOpCallTest:testOpCallNPIntegrityTooManyOutputs((uint256,uint256,uint256,bytes32[],uint256,bytes),uint256,uint256,uint8,bytes32) (runs: 2054, μ: 58804, ~: 59161) +LibOpCallTest:testOpCallNPIntegrityIO((uint256,uint256,uint256,bytes32[],uint256,bytes),uint256,uint256,uint8,bytes32) (runs: 2056, μ: 39769, ~: 38400) +LibOpCallTest:testOpCallNPIntegritySourceIndexOutOfBounds((uint256,uint256,uint256,bytes32[],uint256,bytes),uint256,uint256,uint256,uint256,bytes32) (runs: 2061, μ: 59373, ~: 59251) +LibOpCallTest:testOpCallNPIntegrityTooManyOutputs((uint256,uint256,uint256,bytes32[],uint256,bytes),uint256,uint256,uint8,bytes32) (runs: 2052, μ: 58869, ~: 59166) LibOpCallTest:testOpCallNPRunInputsMismatch() (gas: 72617) LibOpCallTest:testOpCallNPRunOutputsMismatch() (gas: 65559) LibOpCallTest:testOpCallNPRunSourceDoesNotExist() (gas: 350927) LibOpChainIdTest:testOpChainIDEval(uint64) (runs: 2061, μ: 47083, ~: 47083) -LibOpChainIdTest:testOpChainIDIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19675, ~: 19925) +LibOpChainIdTest:testOpChainIDIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19679, ~: 19925) LibOpChainIdTest:testOpChainIdEvalFail() (gas: 34386) LibOpChainIdTest:testOpChainIdRun(uint64,uint16) (runs: 2061, μ: 17123, ~: 17123) LibOpChainIdTest:testOpChainIdTwoOutputs() (gas: 31191) @@ -114,18 +114,18 @@ LibOpConditionsTest:testOpConditionsEvalErrorCode() (gas: 67715) LibOpConditionsTest:testOpConditionsEvalFail0Inputs() (gas: 30406) LibOpConditionsTest:testOpConditionsEvalFail1Inputs() (gas: 34694) LibOpConditionsTest:testOpConditionsEvalUnhappyOperand() (gas: 18121) -LibOpConditionsTest:testOpConditionsIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 20235, ~: 20492) -LibOpConditionsTest:testOpConditionsRun(bytes32[],bytes32) (runs: 2051, μ: 19736, ~: 19850) +LibOpConditionsTest:testOpConditionsIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 20233, ~: 20516) +LibOpConditionsTest:testOpConditionsRun(bytes32[],bytes32) (runs: 2051, μ: 19737, ~: 19850) LibOpConditionsTest:testOpConditionsRunNoConditionsMet(bytes32[],string) (runs: 2053, μ: 29123, ~: 29334) LibOpConditionsTest:testOpConditionsTwoOutputs() (gas: 39995) LibOpConditionsTest:testOpConditionsZeroOutputs() (gas: 38945) LibOpConstantTest:testOpConstantEvalNPE2E() (gas: 56133) LibOpConstantTest:testOpConstantEvalZeroConstants() (gas: 41559) LibOpConstantTest:testOpConstantNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 19200, ~: 19095) -LibOpConstantTest:testOpConstantNPIntegrityOOBConstants((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 40170, ~: 39809) +LibOpConstantTest:testOpConstantNPIntegrityOOBConstants((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 40173, ~: 39809) LibOpConstantTest:testOpConstantNPMultipleOutputErrorSugared() (gas: 31698) LibOpConstantTest:testOpConstantNPMultipleOutputErrorUnsugared() (gas: 41638) -LibOpConstantTest:testOpConstantNPRun(bytes32[],uint16) (runs: 2061, μ: 52449, ~: 51854) +LibOpConstantTest:testOpConstantNPRun(bytes32[],uint16) (runs: 2061, μ: 52443, ~: 51854) LibOpConstantTest:testOpConstantNPZeroOutputErrorSugared() (gas: 30314) LibOpConstantTest:testOpConstantNPZeroOutputErrorUnsugared() (gas: 40266) LibOpContextNPTest:testOpContextNPEval00(bytes32[][]) (runs: 113, μ: 6546913, ~: 5244273) @@ -136,13 +136,13 @@ LibOpContextNPTest:testOpContextNPEvalOOBi(bytes32[]) (runs: 113, μ: 75102, ~: LibOpContextNPTest:testOpContextNPEvalOOBj(bytes32) (runs: 2061, μ: 48273, ~: 48273) LibOpContextNPTest:testOpContextNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 14505, ~: 14418) LibOpContextNPTest:testOpContextNPOneInput() (gas: 41637) -LibOpContextNPTest:testOpContextNPRun(bytes32[][],uint256,uint256) (runs: 113, μ: 10261011, ~: 7240865) -LibOpContextNPTest:testOpContextNPRunOOBi(bytes32[][],uint256,uint256) (runs: 113, μ: 10604383, ~: 7779154) -LibOpContextNPTest:testOpContextNPRunOOBj(bytes32[][],uint256,uint256) (runs: 113, μ: 10613050, ~: 7780069) +LibOpContextNPTest:testOpContextNPRun(bytes32[][],uint256,uint256) (runs: 113, μ: 10375353, ~: 7240865) +LibOpContextNPTest:testOpContextNPRunOOBi(bytes32[][],uint256,uint256) (runs: 113, μ: 10604395, ~: 7779154) +LibOpContextNPTest:testOpContextNPRunOOBj(bytes32[][],uint256,uint256) (runs: 113, μ: 10724942, ~: 7780069) LibOpContextNPTest:testOpContextNPTwoInputs() (gas: 46501) LibOpContextNPTest:testOpContextNPTwoOutputs() (gas: 37306) LibOpContextNPTest:testOpContextNPZeroOutputs() (gas: 36254) -LibOpCtPopNPTest:testOpCtPopNPEval(bytes32) (runs: 2061, μ: 74765, ~: 85330) +LibOpCtPopNPTest:testOpCtPopNPEval(bytes32) (runs: 2061, μ: 74425, ~: 85304) LibOpCtPopNPTest:testOpCtPopNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 13752, ~: 13665) LibOpCtPopNPTest:testOpCtPopNPRun(bytes32) (runs: 2061, μ: 16698, ~: 16698) LibOpCtPopNPTest:testOpCtPopNPTwoInputs() (gas: 41184) @@ -154,10 +154,10 @@ LibOpDecodeBitsNPTest:testOpDecodeBitsNPEvalTwoInputs() (gas: 47013) LibOpDecodeBitsNPTest:testOpDecodeBitsNPEvalTwoOutputs() (gas: 42865) LibOpDecodeBitsNPTest:testOpDecodeBitsNPEvalZeroInputs() (gas: 37196) LibOpDecodeBitsNPTest:testOpDecodeBitsNPEvalZeroOutputs() (gas: 41812) -LibOpDecodeBitsNPTest:testOpDecodeBitsNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint8,uint8) (runs: 2061, μ: 22134, ~: 22292) -LibOpDecodeBitsNPTest:testOpDecodeBitsNPIntegrityFail((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8) (runs: 2061, μ: 41509, ~: 41545) +LibOpDecodeBitsNPTest:testOpDecodeBitsNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint8,uint8) (runs: 2061, μ: 22137, ~: 22292) +LibOpDecodeBitsNPTest:testOpDecodeBitsNPIntegrityFail((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8) (runs: 2061, μ: 41506, ~: 41715) LibOpDecodeBitsNPTest:testOpDecodeBitsNPIntegrityFailZeroLength((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8) (runs: 2061, μ: 35706, ~: 35509) -LibOpDecodeBitsNPTest:testOpDecodeBitsNPRun(bytes32,uint8,uint8) (runs: 2061, μ: 20999, ~: 20814) +LibOpDecodeBitsNPTest:testOpDecodeBitsNPRun(bytes32,uint8,uint8) (runs: 2061, μ: 21006, ~: 20814) LibOpDivTest:testDebugOpDivRun() (gas: 13482) LibOpDivTest:testOpDivEvalOneInput() (gas: 127233) LibOpDivTest:testOpDivEvalOperandsDisallowed() (gas: 91705) @@ -170,12 +170,12 @@ LibOpDivTest:testOpDivEvalTwoInputsUnhappyOverflow() (gas: 57349) LibOpDivTest:testOpDivEvalTwoOutputs() (gas: 41267) LibOpDivTest:testOpDivEvalZeroInputs() (gas: 30219) LibOpDivTest:testOpDivEvalZeroOutputs() (gas: 40263) -LibOpDivTest:testOpDivIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18253, ~: 18425) +LibOpDivTest:testOpDivIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18260, ~: 18486) LibOpDivTest:testOpDivIntegrityUnhappyOneInput((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13827, ~: 13750) LibOpDivTest:testOpDivIntegrityUnhappyZeroInputs((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13850, ~: 13773) -LibOpDivTest:testOpDivRun(bytes32[]) (runs: 2051, μ: 37820, ~: 33736) +LibOpDivTest:testOpDivRun(bytes32[]) (runs: 2051, μ: 37567, ~: 33610) LibOpERC20AllowanceTest:testOpERC20AllowanceEvalFourInputs() (gas: 55898) -LibOpERC20AllowanceTest:testOpERC20AllowanceEvalHappy(uint256,uint8) (runs: 2061, μ: 72203, ~: 72107) +LibOpERC20AllowanceTest:testOpERC20AllowanceEvalHappy(uint256,uint8) (runs: 2061, μ: 72204, ~: 72107) LibOpERC20AllowanceTest:testOpERC20AllowanceEvalOneInput() (gas: 37152) LibOpERC20AllowanceTest:testOpERC20AllowanceEvalOperandDisallowed() (gas: 18643) LibOpERC20AllowanceTest:testOpERC20AllowanceEvalTwoInputs() (gas: 43683) @@ -183,7 +183,7 @@ LibOpERC20AllowanceTest:testOpERC20AllowanceEvalTwoOutputs() (gas: 50717) LibOpERC20AllowanceTest:testOpERC20AllowanceEvalZeroInputs() (gas: 31159) LibOpERC20AllowanceTest:testOpERC20AllowanceEvalZeroOutputs() (gas: 49693) LibOpERC20AllowanceTest:testOpERC20AllowanceIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 13716, ~: 13629) -LibOpERC20AllowanceTest:testOpERC20AllowanceRun(address,address,address,uint256,uint8) (runs: 2060, μ: 27670, ~: 27579) +LibOpERC20AllowanceTest:testOpERC20AllowanceRun(address,address,address,uint256,uint8) (runs: 2061, μ: 27668, ~: 27579) LibOpERC20BalanceOfTest:testOpERC20BalanceOfEvalHappy(uint256,uint8) (runs: 2058, μ: 66118, ~: 66118) LibOpERC20BalanceOfTest:testOpERC20BalanceOfEvalOneInput() (gas: 37257) LibOpERC20BalanceOfTest:testOpERC20BalanceOfEvalOperandDisallowed() (gas: 18701) @@ -202,7 +202,7 @@ LibOpERC20TotalSupplyTest:testOpERC20TotalSupplyEvalTwoOutputs() (gas: 38267) LibOpERC20TotalSupplyTest:testOpERC20TotalSupplyEvalZeroInputs() (gas: 31401) LibOpERC20TotalSupplyTest:testOpERC20TotalSupplyEvalZeroOutputs() (gas: 37239) LibOpERC20TotalSupplyTest:testOpERC20TotalSupplyIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 13739, ~: 13652) -LibOpERC20TotalSupplyTest:testOpERC20TotalSupplyNPRun(address,uint256,uint16,uint8) (runs: 2058, μ: 27211, ~: 27211) +LibOpERC20TotalSupplyTest:testOpERC20TotalSupplyNPRun(address,uint256,uint16,uint8) (runs: 2057, μ: 27211, ~: 27211) LibOpERC5313OwnerTest:testOpERC5313OwnerEvalHappy() (gas: 55308) LibOpERC5313OwnerTest:testOpERC5313OwnerEvalOperandDisallowed() (gas: 18382) LibOpERC5313OwnerTest:testOpERC5313OwnerEvalTwoInputs() (gas: 43501) @@ -211,14 +211,14 @@ LibOpERC5313OwnerTest:testOpERC5313OwnerEvalZeroInputs() (gas: 30995) LibOpERC5313OwnerTest:testOpERC5313OwnerEvalZeroOutputs() (gas: 36675) LibOpERC5313OwnerTest:testOpERC5313OwnerOfIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 13756, ~: 13669) LibOpERC5313OwnerTest:testOpERC5313OwnerOfRun(address,address,uint16) (runs: 2061, μ: 23615, ~: 23615) -LibOpERC721BalanceOfTest:testOpERC721BalanceOfEvalHappy(address,address,uint256) (runs: 2058, μ: 105386, ~: 105556) -LibOpERC721BalanceOfTest:testOpERC721BalanceOfIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19664, ~: 19911) +LibOpERC721BalanceOfTest:testOpERC721BalanceOfEvalHappy(address,address,uint256) (runs: 2056, μ: 105371, ~: 105530) +LibOpERC721BalanceOfTest:testOpERC721BalanceOfIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19660, ~: 19911) LibOpERC721BalanceOfTest:testOpERC721BalanceOfIntegrityFail0() (gas: 30862) LibOpERC721BalanceOfTest:testOpERC721BalanceOfIntegrityFail1() (gas: 35151) LibOpERC721BalanceOfTest:testOpERC721BalanceOfIntegrityFail3() (gas: 44587) LibOpERC721BalanceOfTest:testOpERC721BalanceOfIntegrityFailOperand() (gas: 21585) LibOpERC721BalanceOfTest:testOpERC721BalanceOfOneInput() (gas: 35618) -LibOpERC721BalanceOfTest:testOpERC721BalanceOfRun(address,address,uint256,uint16) (runs: 2058, μ: 26008, ~: 26008) +LibOpERC721BalanceOfTest:testOpERC721BalanceOfRun(address,address,uint256,uint16) (runs: 2056, μ: 26008, ~: 26008) LibOpERC721BalanceOfTest:testOpERC721BalanceOfThreeInputs() (gas: 45107) LibOpERC721BalanceOfTest:testOpERC721BalanceOfTwoOutputs() (gas: 41112) LibOpERC721BalanceOfTest:testOpERC721BalanceOfZeroInputs() (gas: 31296) @@ -227,19 +227,19 @@ LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalFail0() (gas: 30745) LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalFail1() (gas: 35032) LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalFail3() (gas: 44523) LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalFailOperand() (gas: 18234) -LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalHappy(address,uint256,address) (runs: 2060, μ: 96661, ~: 92570) +LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalHappy(address,uint256,address) (runs: 2061, μ: 96447, ~: 92466) LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalOneInput() (gas: 35490) LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalThreeInputs() (gas: 44988) LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalZeroInputs() (gas: 31192) LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPEvalZeroOutputs() (gas: 39781) LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8) (runs: 2061, μ: 13769, ~: 13705) -LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPRun(address,bytes32,address,uint16) (runs: 2060, μ: 24201, ~: 24201) +LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPRun(address,bytes32,address,uint16) (runs: 2061, μ: 24201, ~: 24201) LibOpERC721OwnerOfTest:testOpERC721OwnerOfNPTwoOutputs() (gas: 40827) LibOpETest:testOpEEval() (gas: 44640) LibOpETest:testOpEEvalOneInput() (gas: 34298) LibOpETest:testOpEEvalTwoOutputs() (gas: 30666) LibOpETest:testOpEEvalZeroOutputs() (gas: 29615) -LibOpETest:testOpEIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19697, ~: 19943) +LibOpETest:testOpEIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19700, ~: 19943) LibOpETest:testOpERun(uint16) (runs: 2061, μ: 16132, ~: 16132) LibOpEncodeBitsNPTest:testOpEncodeBitsNPEvalHappy() (gas: 833580) LibOpEncodeBitsNPTest:testOpEncodeBitsNPEvalOneInput() (gas: 42088) @@ -247,10 +247,10 @@ LibOpEncodeBitsNPTest:testOpEncodeBitsNPEvalThreeInputs() (gas: 51835) LibOpEncodeBitsNPTest:testOpEncodeBitsNPEvalTwoOutputs() (gas: 47661) LibOpEncodeBitsNPTest:testOpEncodeBitsNPEvalZeroInputs() (gas: 37110) LibOpEncodeBitsNPTest:testOpEncodeBitsNPEvalZeroOutputs() (gas: 46657) -LibOpEncodeBitsNPTest:testOpEncodeBitsNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8) (runs: 2061, μ: 18149, ~: 18148) -LibOpEncodeBitsNPTest:testOpEncodeBitsNPIntegrityFail((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8) (runs: 2061, μ: 41722, ~: 41757) +LibOpEncodeBitsNPTest:testOpEncodeBitsNPIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8) (runs: 2061, μ: 18142, ~: 18148) +LibOpEncodeBitsNPTest:testOpEncodeBitsNPIntegrityFail((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8) (runs: 2061, μ: 41727, ~: 41901) LibOpEncodeBitsNPTest:testOpEncodeBitsNPIntegrityFailZeroLength((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8) (runs: 2061, μ: 35835, ~: 35638) -LibOpEncodeBitsNPTest:testOpEncodeBitsNPRun(bytes32,bytes32,uint8,uint8) (runs: 2061, μ: 21395, ~: 21212) +LibOpEncodeBitsNPTest:testOpEncodeBitsNPRun(bytes32,bytes32,uint8,uint8) (runs: 2061, μ: 21397, ~: 21212) LibOpEnsureTest:testOpEnsureEvalBadOutputs() (gas: 34460) LibOpEnsureTest:testOpEnsureEvalBadOutputs2() (gas: 33985) LibOpEnsureTest:testOpEnsureEvalHappy() (gas: 166172) @@ -259,10 +259,10 @@ LibOpEnsureTest:testOpEnsureEvalThree() (gas: 45396) LibOpEnsureTest:testOpEnsureEvalUnhappy() (gas: 164901) LibOpEnsureTest:testOpEnsureEvalUnhappyOperand() (gas: 17085) LibOpEnsureTest:testOpEnsureEvalZero() (gas: 29675) -LibOpEnsureTest:testOpEnsureIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19720, ~: 19960) +LibOpEnsureTest:testOpEnsureIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19728, ~: 19970) LibOpEnsureTest:testOpEnsureIntegrityUnhappy((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13818, ~: 13741) LibOpEnsureTest:testOpEnsureOneOutput() (gas: 39634) -LibOpEnsureTest:testOpEnsureRun(bytes32,string) (runs: 2056, μ: 18059, ~: 18106) +LibOpEnsureTest:testOpEnsureRun(bytes32,string) (runs: 2056, μ: 18046, ~: 18106) LibOpEqualToNPTest:testOpEqualToEval2Inputs() (gas: 339601) LibOpEqualToNPTest:testOpEqualToEval2InputsBothOne() (gas: 57700) LibOpEqualToNPTest:testOpEqualToEval2InputsFirstOneSecondZero() (gas: 58388) @@ -271,8 +271,8 @@ LibOpEqualToNPTest:testOpEqualToEval2ZeroInputs() (gas: 57723) LibOpEqualToNPTest:testOpEqualToEvalFail0Inputs() (gas: 30099) LibOpEqualToNPTest:testOpEqualToEvalFail1Input() (gas: 34409) LibOpEqualToNPTest:testOpEqualToEvalFail3Inputs() (gas: 42833) -LibOpEqualToNPTest:testOpEqualToIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19684, ~: 19995) -LibOpEqualToNPTest:testOpEqualToRun(bytes32,bytes32) (runs: 2061, μ: 17544, ~: 17466) +LibOpEqualToNPTest:testOpEqualToIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19681, ~: 19925) +LibOpEqualToNPTest:testOpEqualToRun(bytes32,bytes32) (runs: 2061, μ: 17542, ~: 17466) LibOpEqualToNPTest:testOpEqualToTwoOutputs() (gas: 41098) LibOpEqualToNPTest:testOpEqualToZeroOutputs() (gas: 40007) LibOpEveryTest:testOpEveryEval1FalseInput() (gas: 52064) @@ -283,16 +283,16 @@ LibOpEveryTest:testOpEveryEval2MixedInputs2() (gas: 57979) LibOpEveryTest:testOpEveryEval2TrueInputs() (gas: 58322) LibOpEveryTest:testOpEveryEvalFail() (gas: 29905) LibOpEveryTest:testOpEveryEvalZeroWithExponent() (gas: 59019) -LibOpEveryTest:testOpEveryIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19802, ~: 20104) +LibOpEveryTest:testOpEveryIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19800, ~: 20104) LibOpEveryTest:testOpEveryIntegrityUnhappyZeroInputs((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13866, ~: 13789) -LibOpEveryTest:testOpEveryRun(bytes32[]) (runs: 2051, μ: 20836, ~: 20873) +LibOpEveryTest:testOpEveryRun(bytes32[]) (runs: 2051, μ: 20838, ~: 20873) LibOpEveryTest:testOpEveryTwoOutputs() (gas: 36025) LibOpEveryTest:testOpEveryZeroOutputs() (gas: 34996) LibOpExp2Test:testOpExp2Eval() (gas: 228930) LibOpExp2Test:testOpExp2EvalBad() (gas: 65526) LibOpExp2Test:testOpExp2EvalOperandDisallowed() (gas: 17715) LibOpExp2Test:testOpExp2Integrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 13774, ~: 13687) -LibOpExp2Test:testOpExp2Run(int224,int32,uint16) (runs: 2061, μ: 41319, ~: 36052) +LibOpExp2Test:testOpExp2Run(int224,int32,uint16) (runs: 2061, μ: 41369, ~: 36052) LibOpExp2Test:testOpExp2TwoOutputs() (gas: 35956) LibOpExp2Test:testOpExp2ZeroOutputs() (gas: 34925) LibOpExpTest:testOpExpEval() (gas: 279272) @@ -300,7 +300,7 @@ LibOpExpTest:testOpExpEvalOperandDisallowed() (gas: 17610) LibOpExpTest:testOpExpEvalTwoInputs() (gas: 40066) LibOpExpTest:testOpExpEvalZeroInputs() (gas: 30226) LibOpExpTest:testOpExpIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 13796, ~: 13709) -LibOpExpTest:testOpExpRun(int224,int32,uint16) (runs: 2061, μ: 58473, ~: 59319) +LibOpExpTest:testOpExpRun(int224,int32,uint16) (runs: 2061, μ: 58429, ~: 59251) LibOpExpTest:testOpExpTwoOutputs() (gas: 35919) LibOpExpTest:testOpExpZeroOutputs() (gas: 34888) LibOpExponentialGrowthTest:testOpExponentialGrowthEval() (gas: 773499) @@ -312,12 +312,12 @@ LibOpExponentialGrowthTest:testOpExponentialGrowthEvalTwoOutputs() (gas: 47358) LibOpExponentialGrowthTest:testOpExponentialGrowthEvalZeroInputs() (gas: 31066) LibOpExponentialGrowthTest:testOpExponentialGrowthEvalZeroOutputs() (gas: 46289) LibOpExponentialGrowthTest:testOpExponentialGrowthIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 13752, ~: 13665) -LibOpExponentialGrowthTest:testOpExponentialGrowthRun(int224,int32,int224,int32,int224,int32,uint16) (runs: 2061, μ: 69697, ~: 71487) +LibOpExponentialGrowthTest:testOpExponentialGrowthRun(int224,int32,int224,int32,int224,int32,uint16) (runs: 2061, μ: 69595, ~: 71330) LibOpExternNPTest:testOpExternNPEvalHappy() (gas: 99815) LibOpExternNPTest:testOpExternNPEvalMultipleInputsOutputsHappy() (gas: 115386) -LibOpExternNPTest:testOpExternNPIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),address,uint16,uint8,uint8) (runs: 2061, μ: 34972, ~: 34960) -LibOpExternNPTest:testOpExternNPIntegrityNotAnExternContract((uint256,uint256,uint256,bytes32[],uint256,bytes),address,uint16,uint8,uint8) (runs: 2061, μ: 53490, ~: 53591) -LibOpExternNPTest:testOpExternNPRunHappy(address,bytes32[],uint16,bytes32[],bytes32[]) (runs: 2061, μ: 117856, ~: 117725) +LibOpExternNPTest:testOpExternNPIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),address,uint16,uint8,uint8) (runs: 2061, μ: 34972, ~: 34954) +LibOpExternNPTest:testOpExternNPIntegrityNotAnExternContract((uint256,uint256,uint256,bytes32[],uint256,bytes),address,uint16,uint8,uint8) (runs: 2061, μ: 53503, ~: 53633) +LibOpExternNPTest:testOpExternNPRunHappy(address,bytes32[],uint16,bytes32[],bytes32[]) (runs: 2061, μ: 117777, ~: 117525) LibOpFloorTest:testOpFloorEval() (gas: 254903) LibOpFloorTest:testOpFloorEvalOperandDisallowed() (gas: 17733) LibOpFloorTest:testOpFloorIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 13753, ~: 13666) @@ -329,7 +329,7 @@ LibOpFloorTest:testOpFloorZeroOutputs() (gas: 35009) LibOpFracTest:testOpFracEval() (gas: 342970) LibOpFracTest:testOpFracEvalOperandDisallowed() (gas: 18325) LibOpFracTest:testOpFracIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 13795, ~: 13708) -LibOpFracTest:testOpFracRun(bytes32,uint16) (runs: 2061, μ: 17114, ~: 17096) +LibOpFracTest:testOpFracRun(bytes32,uint16) (runs: 2061, μ: 17113, ~: 17096) LibOpFracTest:testOpFracTwoInputs() (gas: 40769) LibOpFracTest:testOpFracTwoOutputs() (gas: 36620) LibOpFracTest:testOpFracZeroInputs() (gas: 30906) @@ -344,12 +344,20 @@ LibOpGetTest:testLibOpGetEvalTwoInputs() (gas: 39793) LibOpGetTest:testLibOpGetEvalTwoOutputs() (gas: 35384) LibOpGetTest:testLibOpGetEvalZeroInputs() (gas: 29808) LibOpGetTest:testLibOpGetEvalZeroOutputs() (gas: 34354) -LibOpGetTest:testLibOpGetIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 20565, ~: 20815) +LibOpGetTest:testLibOpGetIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 20565, ~: 20860) LibOpGetTest:testLibOpGetRunState(bytes32,bytes32,uint16) (runs: 2061, μ: 19634, ~: 19638) LibOpGetTest:testLibOpGetRunStateAndStore(bytes32,bytes32,bytes32,uint16) (runs: 2061, μ: 47596, ~: 47610) LibOpGetTest:testLibOpGetRunStore(bytes32,bytes32,uint16) (runs: 2061, μ: 49831, ~: 49835) LibOpGetTest:testLibOpGetRunStoreDifferentNamespace(bytes32,bytes32,uint16) (runs: 2061, μ: 51423, ~: 51427) -LibOpGetTest:testLibOpGetRunUnset(bytes32,uint16) (runs: 2061, μ: 24664, ~: 24668) +LibOpGetTest:testLibOpGetRunUnset(bytes32,uint16) (runs: 2061, μ: 24663, ~: 24668) +LibOpGmTest:testOpGmEval() (gas: 460919) +LibOpGmTest:testOpGmEvalOperandDisallowed() (gas: 17531) +LibOpGmTest:testOpGmIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 13795, ~: 13708) +LibOpGmTest:testOpGmOneInput() (gas: 35113) +LibOpGmTest:testOpGmRun(int224,int32,int224,int32,uint16) (runs: 2061, μ: 69552, ~: 72131) +LibOpGmTest:testOpGmThreeInputs() (gas: 44860) +LibOpGmTest:testOpGmTwoOutputs() (gas: 40684) +LibOpGmTest:testOpGmZeroOutputs() (gas: 39661) LibOpGreaterThanOrEqualToTest:testOpGreaterThanOrEqualToEval2InputsBothOne() (gas: 59079) LibOpGreaterThanOrEqualToTest:testOpGreaterThanOrEqualToEval2InputsFirstOneSecondZero() (gas: 59788) LibOpGreaterThanOrEqualToTest:testOpGreaterThanOrEqualToEval2InputsFirstZeroSecondOne() (gas: 59788) @@ -358,7 +366,7 @@ LibOpGreaterThanOrEqualToTest:testOpGreaterThanOrEqualToEvalFail0Inputs() (gas: LibOpGreaterThanOrEqualToTest:testOpGreaterThanOrEqualToEvalFail1Input() (gas: 35844) LibOpGreaterThanOrEqualToTest:testOpGreaterThanOrEqualToEvalFail3Inputs() (gas: 44193) LibOpGreaterThanOrEqualToTest:testOpGreaterThanOrEqualToIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8) (runs: 2061, μ: 13748, ~: 13684) -LibOpGreaterThanOrEqualToTest:testOpGreaterThanOrEqualToRun(bytes32,bytes32) (runs: 2061, μ: 17393, ~: 17323) +LibOpGreaterThanOrEqualToTest:testOpGreaterThanOrEqualToRun(bytes32,bytes32) (runs: 2061, μ: 17395, ~: 17323) LibOpGreaterThanOrEqualToTest:testOpGreaterThanOrEqualToTwoOutputs() (gas: 43037) LibOpGreaterThanOrEqualToTest:testOpGreaterThanOrEqualToZeroOutputs() (gas: 41812) LibOpGreaterThanTest:testOpGreaterThanEval1_0Gt1() (gas: 58634) @@ -372,8 +380,8 @@ LibOpGreaterThanTest:testOpGreaterThanEvalFail1Input() (gas: 34787) LibOpGreaterThanTest:testOpGreaterThanEvalFail3Inputs() (gas: 43128) LibOpGreaterThanTest:testOpGreaterThanEvalNeg1Gt0() (gas: 58734) LibOpGreaterThanTest:testOpGreaterThanEvalNeg1_1GtNeg1_2() (gas: 61438) -LibOpGreaterThanTest:testOpGreaterThanIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19692, ~: 19942) -LibOpGreaterThanTest:testOpGreaterThanRun(bytes32,bytes32) (runs: 2061, μ: 17421, ~: 17347) +LibOpGreaterThanTest:testOpGreaterThanIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19696, ~: 19923) +LibOpGreaterThanTest:testOpGreaterThanRun(bytes32,bytes32) (runs: 2061, μ: 17417, ~: 17347) LibOpGreaterThanTest:testOpGreaterThanTwoOutputs() (gas: 41886) LibOpGreaterThanTest:testOpGreaterThanZeroOutputs() (gas: 40838) LibOpHashNPTest:testOpHashNPEval0Inputs() (gas: 46351) @@ -381,14 +389,14 @@ LibOpHashNPTest:testOpHashNPEval1Input() (gas: 54960) LibOpHashNPTest:testOpHashNPEval2Inputs() (gas: 63303) LibOpHashNPTest:testOpHashNPEval2InputsDifferent() (gas: 63977) LibOpHashNPTest:testOpHashNPEval2InputsOtherStack() (gas: 78532) -LibOpHashNPTest:testOpHashNPIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19717, ~: 19956) +LibOpHashNPTest:testOpHashNPIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19713, ~: 20017) LibOpHashNPTest:testOpHashNPRun(bytes32[]) (runs: 2051, μ: 19459, ~: 19563) LibOpHashNPTest:testOpHashNPTwoOutputs() (gas: 30876) LibOpHashNPTest:testOpHashNPZeroOutputs() (gas: 29502) LibOpHeadroomTest:testOpHeadroomEval() (gas: 263671) LibOpHeadroomTest:testOpHeadroomEvalOperandDisallowed() (gas: 17974) LibOpHeadroomTest:testOpHeadroomIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 13753, ~: 13666) -LibOpHeadroomTest:testOpHeadroomRun(bytes32,uint16) (runs: 2061, μ: 19166, ~: 18388) +LibOpHeadroomTest:testOpHeadroomRun(bytes32,uint16) (runs: 2061, μ: 19178, ~: 18388) LibOpHeadroomTest:testOpHeadroomTwoInputs() (gas: 40452) LibOpHeadroomTest:testOpHeadroomTwoOutputs() (gas: 36303) LibOpHeadroomTest:testOpHeadroomZeroInputs() (gas: 30589) @@ -409,12 +417,12 @@ LibOpIfTest:testOpIfEvalFail4Inputs() (gas: 46486) LibOpIfTest:testOpIfEvalTwoOutputs() (gas: 45990) LibOpIfTest:testOpIfEvalZeroExponent() (gas: 65029) LibOpIfTest:testOpIfEvalZeroOutputs() (gas: 44921) -LibOpIfTest:testOpIfIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19674, ~: 19924) +LibOpIfTest:testOpIfIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19678, ~: 19943) LibOpIfTest:testOpIfRun(bytes32,bytes32,bytes32) (runs: 2061, μ: 17013, ~: 17014) LibOpInvTest:testOpExpEvalOperandDisallowed() (gas: 17632) LibOpInvTest:testOpInvEval() (gas: 177042) LibOpInvTest:testOpInvIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 13753, ~: 13666) -LibOpInvTest:testOpInvRun(int224,int32,uint16) (runs: 2060, μ: 25067, ~: 25219) +LibOpInvTest:testOpInvRun(int224,int32,uint16) (runs: 2060, μ: 25068, ~: 25219) LibOpInvTest:testOpInvTwoInputs() (gas: 40110) LibOpInvTest:testOpInvTwoOutputs() (gas: 35896) LibOpInvTest:testOpInvZeroInputs() (gas: 30227) @@ -424,7 +432,7 @@ LibOpIsZeroTest:testOpIsZeroEval1NonZeroInput() (gas: 52356) LibOpIsZeroTest:testOpIsZeroEval1ZeroInput() (gas: 52093) LibOpIsZeroTest:testOpIsZeroEvalFail0Inputs() (gas: 30008) LibOpIsZeroTest:testOpIsZeroEvalFail2Inputs() (gas: 38566) -LibOpIsZeroTest:testOpIsZeroNPIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19784, ~: 20008) +LibOpIsZeroTest:testOpIsZeroNPIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19784, ~: 20063) LibOpIsZeroTest:testOpIsZeroRun(bytes32) (runs: 2061, μ: 16420, ~: 16421) LibOpIsZeroTest:testOpIsZeroTwoOutputs() (gas: 36401) LibOpIsZeroTest:testOpIsZeroZeroOutputs() (gas: 35107) @@ -435,13 +443,13 @@ LibOpLessThanOrEqualToTest:testOpLessThanOrEqualToEval2ZeroInputs() (gas: 57284) LibOpLessThanOrEqualToTest:testOpLessThanOrEqualToEvalFail0Inputs() (gas: 31151) LibOpLessThanOrEqualToTest:testOpLessThanOrEqualToEvalFail1Input() (gas: 35506) LibOpLessThanOrEqualToTest:testOpLessThanOrEqualToEvalFail3Inputs() (gas: 43970) -LibOpLessThanOrEqualToTest:testOpLessThanOrEqualToIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19683, ~: 19908) -LibOpLessThanOrEqualToTest:testOpLessThanOrEqualToRun(bytes32,bytes32) (runs: 2061, μ: 17401, ~: 17329) +LibOpLessThanOrEqualToTest:testOpLessThanOrEqualToIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19683, ~: 19902) +LibOpLessThanOrEqualToTest:testOpLessThanOrEqualToRun(bytes32,bytes32) (runs: 2061, μ: 17400, ~: 17329) LibOpLessThanOrEqualToTest:testOpLessThanOrEqualToTwoOutputs() (gas: 42637) LibOpLessThanOrEqualToTest:testOpLessThanOrEqualToZeroOutputs() (gas: 41590) LibOpLessThanTest:testOpLessThanEval2InputsFirstZeroSecondOne() (gas: 58458) LibOpLessThanTest:testOpLessThanEval2ZeroInputs() (gas: 57705) -LibOpLessThanTest:testOpLessThanIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19698, ~: 19873) +LibOpLessThanTest:testOpLessThanIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19707, ~: 19928) LibOpLessThanTest:testOpLessThanNP1_0Lt1() (gas: 58458) LibOpLessThanTest:testOpLessThanNP1_1Lt1_2() (gas: 60950) LibOpLessThanTest:testOpLessThanNPEval2InputsBothOne() (gas: 57729) @@ -463,16 +471,16 @@ LibOpLinearGrowthTest:testOpLinearGrowthEvalTwoOutputs() (gas: 46923) LibOpLinearGrowthTest:testOpLinearGrowthEvalZeroInputs() (gas: 30650) LibOpLinearGrowthTest:testOpLinearGrowthEvalZeroOutputs() (gas: 45874) LibOpLinearGrowthTest:testOpLinearGrowthIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 13752, ~: 13665) -LibOpLinearGrowthTest:testOpLinearGrowthRun(int224,int32,int224,int32,int224,int32,uint16) (runs: 2061, μ: 36143, ~: 36743) +LibOpLinearGrowthTest:testOpLinearGrowthRun(int224,int32,int224,int32,int224,int32,uint16) (runs: 2061, μ: 36149, ~: 36757) LibOpMaxNegativeValueTest:testOpMaxNegativeValueEval() (gas: 47417) LibOpMaxNegativeValueTest:testOpMaxNegativeValueEvalFail() (gas: 35217) LibOpMaxNegativeValueTest:testOpMaxNegativeValueRun() (gas: 16187) LibOpMaxNegativeValueTest:testOpMaxNegativeValueTwoOutputs() (gas: 31981) LibOpMaxNegativeValueTest:testOpMaxNegativeValueZeroOutputs() (gas: 30973) -LibOpMaxNegativeValueTest:testOpMaxValueIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19665, ~: 19908) +LibOpMaxNegativeValueTest:testOpMaxValueIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19672, ~: 19918) LibOpMaxPositiveValueTest:testOpMaxPositiveValueEval() (gas: 47416) LibOpMaxPositiveValueTest:testOpMaxPositiveValueEvalFail() (gas: 35238) -LibOpMaxPositiveValueTest:testOpMaxPositiveValueIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19694, ~: 19947) +LibOpMaxPositiveValueTest:testOpMaxPositiveValueIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19706, ~: 19937) LibOpMaxPositiveValueTest:testOpMaxPositiveValueRun() (gas: 16196) LibOpMaxPositiveValueTest:testOpMaxPositiveValueTwoOutputs() (gas: 31980) LibOpMaxPositiveValueTest:testOpMaxPositiveValueZeroOutputs() (gas: 30972) @@ -482,25 +490,25 @@ LibOpMaxTest:testOpMaxEvalOneInput() (gas: 129970) LibOpMaxTest:testOpMaxEvalOperandDisallowed() (gas: 59037) LibOpMaxTest:testOpMaxEvalTwoOutputs() (gas: 40781) LibOpMaxTest:testOpMaxEvalZeroInputs() (gas: 30221) -LibOpMaxTest:testOpMaxIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18209, ~: 18442) +LibOpMaxTest:testOpMaxIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18215, ~: 18381) LibOpMaxTest:testOpMaxIntegrityUnhappyOneInput((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13828, ~: 13751) LibOpMaxTest:testOpMaxIntegrityUnhappyZeroInputs((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13850, ~: 13773) -LibOpMaxTest:testOpMaxRun(bytes32[]) (runs: 2051, μ: 26593, ~: 26371) +LibOpMaxTest:testOpMaxRun(bytes32[]) (runs: 2051, μ: 26581, ~: 26371) LibOpMaxUint256Test:testOpMaxUint256Eval() (gas: 47346) LibOpMaxUint256Test:testOpMaxUint256EvalFail() (gas: 35159) -LibOpMaxUint256Test:testOpMaxUint256Integrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19658, ~: 19924) +LibOpMaxUint256Test:testOpMaxUint256Integrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19659, ~: 19924) LibOpMaxUint256Test:testOpMaxUint256Run() (gas: 15997) LibOpMaxUint256Test:testOpMaxUint256TwoOutputs() (gas: 31943) LibOpMaxUint256Test:testOpMaxUint256ZeroOutputs() (gas: 30848) LibOpMinNegativeValueTest:testOpMinNegativeValueEval() (gas: 47437) LibOpMinNegativeValueTest:testOpMinNegativeValueEvalFail() (gas: 35239) -LibOpMinNegativeValueTest:testOpMinNegativeValueIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19678, ~: 19926) +LibOpMinNegativeValueTest:testOpMinNegativeValueIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19676, ~: 19926) LibOpMinNegativeValueTest:testOpMinNegativeValueRun() (gas: 16218) LibOpMinNegativeValueTest:testOpMinNegativeValueTwoOutputs() (gas: 32002) LibOpMinNegativeValueTest:testOpMinNegativeValueZeroOutputs() (gas: 30972) LibOpMinPositiveValueTest:testOpMinPositiveValueEval() (gas: 47417) LibOpMinPositiveValueTest:testOpMinPositiveValueEvalFail() (gas: 35196) -LibOpMinPositiveValueTest:testOpMinPositiveValueIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19655, ~: 19903) +LibOpMinPositiveValueTest:testOpMinPositiveValueIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19660, ~: 19893) LibOpMinPositiveValueTest:testOpMinPositiveValueRun() (gas: 16240) LibOpMinPositiveValueTest:testOpMinPositiveValueTwoOutputs() (gas: 32001) LibOpMinPositiveValueTest:testOpMinPositiveValueZeroOutputs() (gas: 30971) @@ -509,10 +517,10 @@ LibOpMinTest:testOpMinEval3InputsHappy() (gas: 3548993) LibOpMinTest:testOpMinEvalOneInput() (gas: 129830) LibOpMinTest:testOpMinEvalOperandDisallowed() (gas: 61756) LibOpMinTest:testOpMinEvalZeroInputs() (gas: 30875) -LibOpMinTest:testOpMinIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18285, ~: 18509) +LibOpMinTest:testOpMinIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18283, ~: 18453) LibOpMinTest:testOpMinIntegrityUnhappyOneInput((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13851, ~: 13774) LibOpMinTest:testOpMinIntegrityUnhappyZeroInputs((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13828, ~: 13751) -LibOpMinTest:testOpMinRun(bytes32[],uint16) (runs: 2051, μ: 26541, ~: 26583) +LibOpMinTest:testOpMinRun(bytes32[],uint16) (runs: 2051, μ: 26532, ~: 26627) LibOpMulTest:testOpDecimal18MulNPIntegrityUnhappyOneInput((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13829, ~: 13752) LibOpMulTest:testOpMulEvalOneInput() (gas: 129864) LibOpMulTest:testOpMulEvalOperandsDisallowed() (gas: 95771) @@ -521,9 +529,9 @@ LibOpMulTest:testOpMulEvalThreeInputsUnhappyOverflow() (gas: 62426) LibOpMulTest:testOpMulEvalTwoInputsHappy() (gas: 531764) LibOpMulTest:testOpMulEvalTwoInputsUnhappyOverflow() (gas: 55820) LibOpMulTest:testOpMulEvalZeroInputs() (gas: 30938) -LibOpMulTest:testOpMulIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18242, ~: 18477) +LibOpMulTest:testOpMulIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18247, ~: 18477) LibOpMulTest:testOpMulIntegrityUnhappyZeroInputs((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13872, ~: 13795) -LibOpMulTest:testOpMulRun(bytes32[]) (runs: 2051, μ: 28965, ~: 26565) +LibOpMulTest:testOpMulRun(bytes32[]) (runs: 2051, μ: 29009, ~: 26565) LibOpMulTest:testOpMulTwoOutputs() (gas: 41476) LibOpMulTest:testOpMulZeroOutputs() (gas: 40430) LibOpPowTest:testOpPowEval() (gas: 541725) @@ -531,7 +539,7 @@ LibOpPowTest:testOpPowEvalOneInput() (gas: 35388) LibOpPowTest:testOpPowEvalOperandDisallowed() (gas: 17796) LibOpPowTest:testOpPowIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 13773, ~: 13686) LibOpPowTest:testOpPowNegativeBaseError() (gas: 101004) -LibOpPowTest:testOpPowRun(int224,int32,int224,int32) (runs: 2061, μ: 64952, ~: 68645) +LibOpPowTest:testOpPowRun(int224,int32,int224,int32) (runs: 2061, μ: 64948, ~: 68645) LibOpPowTest:testOpPowThreeInputs() (gas: 45114) LibOpPowTest:testOpPowTwoOutputs() (gas: 40918) LibOpPowTest:testOpPowZeroOutputs() (gas: 39913) @@ -544,22 +552,22 @@ LibOpSetTest:testLibOpSetEvalThreeInputs() (gas: 44675) LibOpSetTest:testLibOpSetEvalTwoInputs() (gas: 258827) LibOpSetTest:testLibOpSetEvalTwoOutputs() (gas: 40502) LibOpSetTest:testLibOpSetEvalZeroInputs() (gas: 29423) -LibOpSetTest:testLibOpSetIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 20446, ~: 20762) +LibOpSetTest:testLibOpSetIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 20453, ~: 20691) LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPEval() (gas: 880174) LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityFailBadShiftAmount() (gas: 128301) LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityFailTwoInputs() (gas: 44497) LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityFailTwoOutputs() (gas: 40381) LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityFailZeroInputs() (gas: 34657) LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityFailZeroOutputs() (gas: 39306) -LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint8) (runs: 2058, μ: 19760, ~: 19683) +LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint8) (runs: 2058, μ: 19791, ~: 19805) LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityNoop((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8) (runs: 2061, μ: 35800, ~: 35603) -LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityZero((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 41992, ~: 42651) -LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPRun(bytes32,uint8) (runs: 2059, μ: 16833, ~: 16833) +LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPIntegrityZero((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 41993, ~: 42443) +LibOpShiftBitsLeftNPTest:testOpShiftBitsLeftNPRun(bytes32,uint8) (runs: 2060, μ: 16833, ~: 16833) LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPEval() (gas: 1055354) LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPIntegrityFailBadShiftAmount() (gas: 128890) -LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint8) (runs: 110, μ: 19681, ~: 19207) +LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint8) (runs: 110, μ: 19782, ~: 19329) LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPIntegrityNoop((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8) (runs: 113, μ: 36984, ~: 37429) -LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPIntegrityZero((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 113, μ: 40784, ~: 41185) +LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPIntegrityZero((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 113, μ: 40794, ~: 41185) LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPRun(bytes32,uint8) (runs: 2060, μ: 16836, ~: 16836) LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPTwoInputs() (gas: 44621) LibOpShiftBitsRightNPTest:testOpShiftBitsRightNPTwoOutputs() (gas: 40441) @@ -571,30 +579,30 @@ LibOpSqrtTest:testOpSqrtEvalOperandDisallowed() (gas: 17651) LibOpSqrtTest:testOpSqrtEvalTwoOutputs() (gas: 35958) LibOpSqrtTest:testOpSqrtEvalZeroOutputs() (gas: 34904) LibOpSqrtTest:testOpSqrtIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 13752, ~: 13665) -LibOpSqrtTest:testOpSqrtRun(bytes32) (runs: 2061, μ: 48490, ~: 52867) +LibOpSqrtTest:testOpSqrtRun(bytes32) (runs: 2061, μ: 48624, ~: 52891) LibOpStackNPTest:testOpStackEval() (gas: 66054) LibOpStackNPTest:testOpStackEvalSeveral() (gas: 90587) -LibOpStackNPTest:testOpStackNPIntegrity(bytes,uint256,bytes32[],bytes32) (runs: 2061, μ: 18890, ~: 18656) -LibOpStackNPTest:testOpStackNPIntegrityOOBStack(bytes,uint16,bytes32[],uint16,uint256) (runs: 2061, μ: 41426, ~: 41563) +LibOpStackNPTest:testOpStackNPIntegrity(bytes,uint256,bytes32[],bytes32) (runs: 2061, μ: 18895, ~: 18743) +LibOpStackNPTest:testOpStackNPIntegrityOOBStack(bytes,uint16,bytes32[],uint16,uint256) (runs: 2061, μ: 41422, ~: 41563) LibOpStackNPTest:testOpStackNPMultipleOutputErrorSugared() (gas: 40060) LibOpStackNPTest:testOpStackNPMultipleOutputErrorUnsugared() (gas: 43046) -LibOpStackNPTest:testOpStackNPRun(bytes32[][],uint256) (runs: 113, μ: 2066178, ~: 1839115) +LibOpStackNPTest:testOpStackNPRun(bytes32[][],uint256) (runs: 113, μ: 2066175, ~: 1839115) LibOpStackNPTest:testOpStackNPZeroOutputErrorSugared() (gas: 38605) LibOpStackNPTest:testOpStackNPZeroOutputErrorUnsugared() (gas: 41556) LibOpSubTest:testOpSubEvalOneInput() (gas: 129791) LibOpSubTest:testOpSubEvalThreeInputs() (gas: 226422) LibOpSubTest:testOpSubEvalTwoInputs() (gas: 343485) LibOpSubTest:testOpSubEvalZeroInputs() (gas: 30182) -LibOpSubTest:testOpSubIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18252, ~: 18476) +LibOpSubTest:testOpSubIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18247, ~: 18476) LibOpSubTest:testOpSubIntegrityUnhappyOneInput((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13828, ~: 13751) LibOpSubTest:testOpSubIntegrityUnhappyZeroInputs((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13829, ~: 13752) -LibOpSubTest:testOpSubRun(bytes32[]) (runs: 2051, μ: 55779, ~: 55105) +LibOpSubTest:testOpSubRun(bytes32[]) (runs: 2051, μ: 55698, ~: 54823) LibOpTimestampTest:testOpBlockTimestampNPEvalFail() (gas: 65915) LibOpTimestampTest:testOpBlockTimestampNPTwoOutputs() (gas: 58834) LibOpTimestampTest:testOpBlockTimestampNPZeroOutputs() (gas: 56709) -LibOpTimestampTest:testOpTimestampEval(uint256) (runs: 2061, μ: 85119, ~: 84795) -LibOpTimestampTest:testOpTimestampIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19674, ~: 19939) -LibOpTimestampTest:testOpTimestampRun(uint256) (runs: 2061, μ: 20593, ~: 20364) +LibOpTimestampTest:testOpTimestampEval(uint256) (runs: 2061, μ: 85116, ~: 84795) +LibOpTimestampTest:testOpTimestampIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19673, ~: 19981) +LibOpTimestampTest:testOpTimestampRun(uint256) (runs: 2061, μ: 20587, ~: 20364) LibOpUint256AddTest:testOpUint256AddEvalOneInput() (gas: 128471) LibOpUint256AddTest:testOpUint256AddEvalOperandsDisallowed() (gas: 95615) LibOpUint256AddTest:testOpUint256AddEvalThreeInputsHappy() (gas: 209954) @@ -603,10 +611,10 @@ LibOpUint256AddTest:testOpUint256AddEvalTwoInputsHappy() (gas: 280492) LibOpUint256AddTest:testOpUint256AddEvalTwoOutputs() (gas: 41472) LibOpUint256AddTest:testOpUint256AddEvalZeroInputs() (gas: 30890) LibOpUint256AddTest:testOpUint256AddEvalZeroOutputs() (gas: 40403) -LibOpUint256AddTest:testOpUint256AddIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18250, ~: 18471) +LibOpUint256AddTest:testOpUint256AddIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18251, ~: 18478) LibOpUint256AddTest:testOpUint256AddIntegrityUnhappyOneInput((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13830, ~: 13753) LibOpUint256AddTest:testOpUint256AddIntegrityUnhappyZeroInputs((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13828, ~: 13751) -LibOpUint256AddTest:testOpUint256AddRun(bytes32[]) (runs: 2051, μ: 19941, ~: 19486) +LibOpUint256AddTest:testOpUint256AddRun(bytes32[]) (runs: 2051, μ: 19903, ~: 19426) LibOpUint256DivTest:testOpUint256DivEval2InputsHappy() (gas: 771856) LibOpUint256DivTest:testOpUint256DivEval2InputsUnhappy() (gas: 143734) LibOpUint256DivTest:testOpUint256DivEval3InputsHappy() (gas: 1408548) @@ -616,7 +624,7 @@ LibOpUint256DivTest:testOpUint256DivEvalOperandDisallowed() (gas: 61608) LibOpUint256DivTest:testOpUint256DivEvalTwoOutputs() (gas: 41473) LibOpUint256DivTest:testOpUint256DivEvalZeroInputs() (gas: 30891) LibOpUint256DivTest:testOpUint256DivEvalZeroOutputs() (gas: 40381) -LibOpUint256DivTest:testOpUint256DivIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18267, ~: 18501) +LibOpUint256DivTest:testOpUint256DivIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18270, ~: 18494) LibOpUint256DivTest:testOpUint256DivIntegrityUnhappyOneInput((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13850, ~: 13773) LibOpUint256DivTest:testOpUint256DivIntegrityUnhappyZeroInputs((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13830, ~: 13753) LibOpUint256DivTest:testOpUint256DivRun(bytes32[]) (runs: 2051, μ: 24848, ~: 25168) @@ -646,15 +654,15 @@ LibOpUint256ERC20TotalSupplyTest:testOpERC20TotalSupplyEvalTwoOutputs() (gas: 38 LibOpUint256ERC20TotalSupplyTest:testOpERC20TotalSupplyEvalZeroInputs() (gas: 32071) LibOpUint256ERC20TotalSupplyTest:testOpERC20TotalSupplyEvalZeroOutputs() (gas: 37854) LibOpUint256ERC20TotalSupplyTest:testOpERC20TotalSupplyIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),bytes32) (runs: 2061, μ: 13799, ~: 13712) -LibOpUint256ERC20TotalSupplyTest:testOpERC20TotalSupplyRun(address,uint256,uint16) (runs: 2061, μ: 23332, ~: 23332) -LibOpUint256ERC721BalanceOfTest:testOpERC721BalanceOfEvalHappy(address,address,uint256) (runs: 2060, μ: 104756, ~: 104920) -LibOpUint256ERC721BalanceOfTest:testOpERC721BalanceOfIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19680, ~: 19917) +LibOpUint256ERC20TotalSupplyTest:testOpERC20TotalSupplyRun(address,uint256,uint16) (runs: 2060, μ: 23332, ~: 23332) +LibOpUint256ERC721BalanceOfTest:testOpERC721BalanceOfEvalHappy(address,address,uint256) (runs: 2061, μ: 104751, ~: 104920) +LibOpUint256ERC721BalanceOfTest:testOpERC721BalanceOfIntegrity((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint8,uint16) (runs: 2061, μ: 19677, ~: 19875) LibOpUint256ERC721BalanceOfTest:testOpERC721BalanceOfIntegrityFail0() (gas: 31510) LibOpUint256ERC721BalanceOfTest:testOpERC721BalanceOfIntegrityFail1() (gas: 35894) LibOpUint256ERC721BalanceOfTest:testOpERC721BalanceOfIntegrityFail3() (gas: 45235) LibOpUint256ERC721BalanceOfTest:testOpERC721BalanceOfIntegrityFailOperand() (gas: 22223) LibOpUint256ERC721BalanceOfTest:testOpERC721BalanceOfOneInput() (gas: 36424) -LibOpUint256ERC721BalanceOfTest:testOpERC721BalanceOfRun(address,address,uint256,uint16) (runs: 2060, μ: 24211, ~: 24211) +LibOpUint256ERC721BalanceOfTest:testOpERC721BalanceOfRun(address,address,uint256,uint16) (runs: 2061, μ: 24211, ~: 24211) LibOpUint256ERC721BalanceOfTest:testOpERC721BalanceOfThreeInputs() (gas: 45755) LibOpUint256ERC721BalanceOfTest:testOpERC721BalanceOfTwoOutputs() (gas: 41750) LibOpUint256ERC721BalanceOfTest:testOpERC721BalanceOfZeroInputs() (gas: 31944) @@ -668,11 +676,11 @@ LibOpUint256MulTest:testOpUint256MulEvalTwoInputsUnhappy() (gas: 143866) LibOpUint256MulTest:testOpUint256MulEvalTwoOutputs() (gas: 41417) LibOpUint256MulTest:testOpUint256MulEvalZeroInputs() (gas: 30944) LibOpUint256MulTest:testOpUint256MulEvalZeroOutputs() (gas: 40416) -LibOpUint256MulTest:testOpUint256MulIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18210, ~: 18436) +LibOpUint256MulTest:testOpUint256MulIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18208, ~: 18436) LibOpUint256MulTest:testOpUint256MulIntegrityUnhappyOneInput((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13872, ~: 13795) LibOpUint256MulTest:testOpUint256MulIntegrityUnhappyZeroInputs((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13829, ~: 13752) -LibOpUint256MulTest:testOpUint256MulRun(bytes32[]) (runs: 2051, μ: 18777, ~: 18905) -LibOpUint256PowTest:testOpUint256ExpIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18226, ~: 18456) +LibOpUint256MulTest:testOpUint256MulRun(bytes32[]) (runs: 2051, μ: 18829, ~: 19078) +LibOpUint256PowTest:testOpUint256ExpIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18224, ~: 18395) LibOpUint256PowTest:testOpUint256PowEval2InputsHappy() (gas: 872829) LibOpUint256PowTest:testOpUint256PowEval2InputsUnhappy() (gas: 145846) LibOpUint256PowTest:testOpUint256PowEval3InputsHappy() (gas: 1981311) @@ -684,7 +692,7 @@ LibOpUint256PowTest:testOpUint256PowEvalZeroInputs() (gas: 31083) LibOpUint256PowTest:testOpUint256PowEvalZeroOutputs() (gas: 40534) LibOpUint256PowTest:testOpUint256PowIntegrityUnhappyOneInput((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13852, ~: 13775) LibOpUint256PowTest:testOpUint256PowIntegrityUnhappyZeroInputs((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13829, ~: 13752) -LibOpUint256PowTest:testOpUint256PowRun(bytes32[]) (runs: 2051, μ: 19360, ~: 19304) +LibOpUint256PowTest:testOpUint256PowRun(bytes32[]) (runs: 2051, μ: 19384, ~: 19304) LibOpUint256SubTest:testOpUint256SubEvalOneInput() (gas: 128558) LibOpUint256SubTest:testOpUint256SubEvalOperandsDisallowed() (gas: 95617) LibOpUint256SubTest:testOpUint256SubEvalThreeInputsHappy() (gas: 209829) @@ -693,10 +701,10 @@ LibOpUint256SubTest:testOpUint256SubEvalTwoInputsHappy() (gas: 280490) LibOpUint256SubTest:testOpUint256SubEvalTwoOutputs() (gas: 41461) LibOpUint256SubTest:testOpUint256SubEvalZeroInputs() (gas: 30901) LibOpUint256SubTest:testOpUint256SubEvalZeroOutputs() (gas: 40393) -LibOpUint256SubTest:testOpUint256SubIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18247, ~: 18476) +LibOpUint256SubTest:testOpUint256SubIntegrityHappy((uint256,uint256,uint256,bytes32[],uint256,bytes),uint8,uint16) (runs: 2061, μ: 18252, ~: 18418) LibOpUint256SubTest:testOpUint256SubIntegrityUnhappyOneInput((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13873, ~: 13796) LibOpUint256SubTest:testOpUint256SubIntegrityUnhappyZeroInputs((uint256,uint256,uint256,bytes32[],uint256,bytes)) (runs: 2061, μ: 13829, ~: 13752) -LibOpUint256SubTest:testOpUint256SubRun(bytes32[]) (runs: 2051, μ: 17624, ~: 17687) +LibOpUint256SubTest:testOpUint256SubRun(bytes32[]) (runs: 2051, μ: 17684, ~: 17702) LibParseCommentsTest:testParseCommentAfterSources() (gas: 69689) LibParseCommentsTest:testParseCommentBetweenSources() (gas: 69745) LibParseCommentsTest:testParseCommentInIgnoredLHS() (gas: 46231) @@ -1055,19 +1063,19 @@ LibParseUnexpectedRightParenTest:testParseUnexpectedRightParen() (gas: 50722) LibParseUnexpectedRightParenTest:testParseUnexpectedRightParenNested() (gas: 56990) LibSubParseSubParserExternTest:testLibSubParseSubParserExtern(address,uint8,uint8,uint8,uint16,uint8) (runs: 2061, μ: 13231, ~: 13163) LibSubParseSubParserExternTest:testLibSubParseSubParserExternConstantsHeightOverflow(address,uint256,uint8,uint8,uint16,uint8) (runs: 2061, μ: 11433, ~: 11167) -RainterpreterExpressionDeployerDeployCheckTest:testRainterpreterExpressionDeployerDeployNoEIP1820() (gas: 8702146) -RainterpreterExpressionDeployerDescribedByMetaV1Test:testRainterpreterExpressionDeployerDescribedByMetaV1Happy() (gas: 8715275) -RainterpreterExpressionDeployerIERC165Test:testRainterpreterExpressionDeployerIERC165(bytes4) (runs: 2061, μ: 8709587, ~: 8709587) +RainterpreterExpressionDeployerDeployCheckTest:testRainterpreterExpressionDeployerDeployNoEIP1820() (gas: 8725386) +RainterpreterExpressionDeployerDescribedByMetaV1Test:testRainterpreterExpressionDeployerDescribedByMetaV1Happy() (gas: 8738515) +RainterpreterExpressionDeployerIERC165Test:testRainterpreterExpressionDeployerIERC165(bytes4) (runs: 2061, μ: 8732827, ~: 8732827) RainterpreterExpressionDeployerMetaTest:testRainterpreterExpressionDeployerExpectedConstructionMetaHash() (gas: 6221) -RainterpreterIERC165Test:testRainterpreterIERC165(bytes4) (runs: 2061, μ: 3469508, ~: 3469508) -RainterpreterParserIERC165Test:testRainterpreterParserIERC165(bytes4) (runs: 2061, μ: 3544595, ~: 3544595) -RainterpreterParserParserPragma:testParsePragmaNoPragma() (gas: 17705326) -RainterpreterParserParserPragma:testParsePragmaSinglePragma() (gas: 10674938) -RainterpreterParserParserPragma:testParsePragmaWithInterstitial() (gas: 10678230) -RainterpreterParserPointersTest:testLiteralParserFunctionPointers() (gas: 3543601) -RainterpreterParserPointersTest:testOperandHandlerFunctionPointers() (gas: 3552237) -RainterpreterParserPointersTest:testParserParseMeta() (gas: 5123235) -RainterpreterPointersTest:testOpcodeFunctionPointers() (gas: 3477145) +RainterpreterIERC165Test:testRainterpreterIERC165(bytes4) (runs: 2061, μ: 3487956, ~: 3487956) +RainterpreterParserIERC165Test:testRainterpreterParserIERC165(bytes4) (runs: 2061, μ: 3547395, ~: 3547395) +RainterpreterParserParserPragma:testParsePragmaNoPragma() (gas: 17719326) +RainterpreterParserParserPragma:testParsePragmaSinglePragma() (gas: 10683338) +RainterpreterParserParserPragma:testParsePragmaWithInterstitial() (gas: 10686630) +RainterpreterParserPointersTest:testLiteralParserFunctionPointers() (gas: 3546401) +RainterpreterParserPointersTest:testOperandHandlerFunctionPointers() (gas: 3555149) +RainterpreterParserPointersTest:testParserParseMeta() (gas: 5194808) +RainterpreterPointersTest:testOpcodeFunctionPointers() (gas: 3495705) RainterpreterReferenceExternContextRainlenTest:testRainterpreterReferenceExterNPE2ContextRainlenHappy() (gas: 2160790) RainterpreterReferenceExternContextSenderTest:testRainterpreterReferenceExterNPE2ContextContractHappy() (gas: 2160375) RainterpreterReferenceExternContextSenderTest:testRainterpreterReferenceExterNPE2ContextSenderHappy() (gas: 2159071) @@ -1076,8 +1084,8 @@ RainterpreterReferenceExternIERC165Test:testRainterpreterReferenceExternIERC165( RainterpreterReferenceExternIntIncTest:testRainterpreterReferenceExternIntIncHappySugared() (gas: 2184531) RainterpreterReferenceExternIntIncTest:testRainterpreterReferenceExternIntIncHappyUnsugared() (gas: 2178094) RainterpreterReferenceExternIntIncTest:testRainterpreterReferenceExternIntIncIntegrity(bytes32,uint256,uint256) (runs: 113, μ: 3597, ~: 3597) -RainterpreterReferenceExternIntIncTest:testRainterpreterReferenceExternIntIncRun(bytes32,bytes32[]) (runs: 113, μ: 739381, ~: 753647) -RainterpreterReferenceExternIntIncTest:testRainterpreterReferenceExternIntIncSubParseKnownWord(uint16,bytes1) (runs: 113, μ: 2095522, ~: 2095759) +RainterpreterReferenceExternIntIncTest:testRainterpreterReferenceExternIntIncRun(bytes32,bytes32[]) (runs: 113, μ: 739607, ~: 753647) +RainterpreterReferenceExternIntIncTest:testRainterpreterReferenceExternIntIncSubParseKnownWord(uint16,bytes1) (runs: 113, μ: 2095537, ~: 2095759) RainterpreterReferenceExternIntIncTest:testRainterpreterReferenceExternIntIncSubParseUnknownWord(uint16,bytes1,bytes) (runs: 100, μ: 2091863, ~: 2091662) RainterpreterReferenceExternPointersTest:testIntegrityFunctionPointers() (gas: 2081736) RainterpreterReferenceExternPointersTest:testOpcodeFunctionPointers() (gas: 2081779) @@ -1086,7 +1094,7 @@ RainterpreterReferenceExternPointersTest:testSubParserLiteralParsers() (gas: 208 RainterpreterReferenceExternPointersTest:testSubParserOperandParsers() (gas: 2082229) RainterpreterReferenceExternPointersTest:testSubParserParseMeta() (gas: 22017) RainterpreterReferenceExternRepeatTest:testRainterpreterReferenceExternRepeatHappy() (gas: 2213082) -RainterpreterReferenceExternStackOperandTest:testRainterpreterReferenceExternStackOperandSingle(uint256) (runs: 2061, μ: 2168236, ~: 2168321) +RainterpreterReferenceExternStackOperandTest:testRainterpreterReferenceExternStackOperandSingle(uint256) (runs: 2061, μ: 2168233, ~: 2168321) RainterpreterReferenceExternUnknownWordTest:testRainterpreterReferenceExternUnknownWord() (gas: 2129396) RainterpreterStateOverlayTest:testStateOverlayGet() (gas: 52416) RainterpreterStateOverlayTest:testStateOverlaySet() (gas: 83156) diff --git a/test/src/lib/op/math/LibOpGm.t.sol b/test/src/lib/op/math/LibOpGm.t.sol index 39f19cf98..4dfbeaa8e 100644 --- a/test/src/lib/op/math/LibOpGm.t.sol +++ b/test/src/lib/op/math/LibOpGm.t.sol @@ -1,71 +1,87 @@ // SPDX-License-Identifier: CAL pragma solidity =0.8.25; -// import {OpTest, IntegrityCheckState, Operand, InterpreterState, UnexpectedOperand} from "test/abstract/OpTest.sol"; -// import {LibOpGm} from "src/lib/op/math/LibOpGm.sol"; -// import {LibOperand} from "test/lib/operand/LibOperand.sol"; +import {OpTest, IntegrityCheckState, OperandV2, InterpreterState, UnexpectedOperand} from "test/abstract/OpTest.sol"; +import {LibOpGm} from "src/lib/op/math/LibOpGm.sol"; +import {LibOperand} from "test/lib/operand/LibOperand.sol"; +import {LibDecimalFloat, Float} from "rain.math.float/lib/LibDecimalFloat.sol"; +import {StackItem} from "rain.interpreter.interface/interface/unstable/IInterpreterV4.sol"; -// contract LibOpGmTest is OpTest { -// /// Directly test the integrity logic of LibOpGm. -// /// Inputs are always 2, outputs are always 1. -// function testOpGmIntegrity(IntegrityCheckState memory state, Operand operand) external pure { -// (uint256 calcInputs, uint256 calcOutputs) = LibOpGm.integrity(state, operand); -// assertEq(calcInputs, 2); -// assertEq(calcOutputs, 1); -// } +contract LibOpGmTest is OpTest { + function beforeOpTestConstructor() internal virtual override { + vm.createSelectFork(vm.envString("ETH_RPC_URL")); + } -// /// Directly test the runtime logic of LibOpGm. -// function testOpGmRun(uint256 a, uint256 b, uint16 operandData) public view { -// // @TODO This is a hack to get around the fact that we are very likely -// // to overflow uint256 if we just fuzz it, and that it's clunky to -// // determine whether it will overflow or not. Basically the overflow -// // check is exactly the same as the implementation, including all the -// // intermediate squaring, so it seems like a bit of circular logic to -// // do things that way. -// a = bound(a, 0, type(uint64).max); -// b = bound(b, 0, 10); -// InterpreterState memory state = opTestDefaultInterpreterState(); + /// Directly test the integrity logic of LibOpGm. + /// Inputs are always 2, outputs are always 1. + function testOpGmIntegrity(IntegrityCheckState memory state, OperandV2 operand) external pure { + (uint256 calcInputs, uint256 calcOutputs) = LibOpGm.integrity(state, operand); + assertEq(calcInputs, 2); + assertEq(calcOutputs, 1); + } -// Operand operand = LibOperand.build(2, 1, operandData); -// uint256[] memory inputs = new uint256[](2); -// inputs[0] = a; -// inputs[1] = b; + /// Directly test the runtime logic of LibOpGm. + function testOpGmRun( + int224 signedCoefficientA, + int32 exponentA, + int224 signedCoefficientB, + int32 exponentB, + uint16 operandData + ) public view { + signedCoefficientA = int224(bound(signedCoefficientA, 0, 10000)); + exponentA = int32(bound(exponentA, -10, 5)); + signedCoefficientB = int224(bound(signedCoefficientB, 0, 10000)); + exponentB = int32(bound(exponentB, -10, 5)); -// opReferenceCheck(state, operand, LibOpGm.referenceFn, LibOpGm.integrity, LibOpGm.run, inputs); -// } + InterpreterState memory state = opTestDefaultInterpreterState(); -// /// Test the eval of `gm`. -// function testOpGmEval() external view { -// checkHappy("_: gm(0 0);", 0, "0 0"); -// checkHappy("_: gm(0 1);", 0, "0 1"); -// checkHappy("_: gm(1 0);", 0, "1 0"); -// checkHappy("_: gm(1 1);", 1e18, "1 1"); -// checkHappy("_: gm(1 2);", 1414213562373095048, "1 2"); -// checkHappy("_: gm(2 2);", 2e18, "2 2"); -// checkHappy("_: gm(2 3);", 2449489742783178098, "2 3"); -// checkHappy("_: gm(2 4);", 2828427124746190097, "2 4"); -// checkHappy("_: gm(4 0.5);", 1414213562373095048, "4 0.5"); -// } + Float a = LibDecimalFloat.packLossless(signedCoefficientA, exponentA); + Float b = LibDecimalFloat.packLossless(signedCoefficientB, exponentB); -// /// Test the eval of `gm` for bad inputs. -// function testOpGmOneInput() external { -// checkBadInputs("_: gm(1e18);", 1, 2, 1); -// } + OperandV2 operand = LibOperand.build(2, 1, operandData); + StackItem[] memory inputs = new StackItem[](2); + inputs[0] = StackItem.wrap(Float.unwrap(a)); + inputs[1] = StackItem.wrap(Float.unwrap(b)); -// function testOpGmThreeInputs() external { -// checkBadInputs("_: gm(1 1 1);", 3, 2, 3); -// } + opReferenceCheck(state, operand, LibOpGm.referenceFn, LibOpGm.integrity, LibOpGm.run, inputs); + } -// function testOpGmZeroOutputs() external { -// checkBadOutputs(": gm(1 1);", 2, 1, 0); -// } + /// Test the eval of `gm`. + function testOpGmEval() external view { + checkHappy("_: gm(0 0);", 0, "0 0"); + checkHappy("_: gm(0 1);", 0, "0 1"); + checkHappy("_: gm(1 0);", 0, "1 0"); + checkHappy("_: gm(1 1);", Float.unwrap(LibDecimalFloat.packLossless(1e3, -3)), "1 1"); + checkHappy("_: gm(1 2);", Float.unwrap(LibDecimalFloat.packLossless(1415, -3)), "1 2"); + checkHappy("_: gm(2 2);", Float.unwrap(LibDecimalFloat.packLossless(2e3, -3)), "2 2"); + checkHappy("_: gm(2 3);", Float.unwrap(LibDecimalFloat.packLossless(2450, -3)), "2 3"); + checkHappy( + "_: gm(2 4);", + Float.unwrap(LibDecimalFloat.packLossless(282850000000000000000000000000000000000000, -41)), + "2 4" + ); + checkHappy("_: gm(4 0.5);", Float.unwrap(LibDecimalFloat.packLossless(1415, -3)), "4 0.5"); + } -// function testOpGmTwoOutputs() external { -// checkBadOutputs("_ _: gm(1 1);", 2, 1, 2); -// } + /// Test the eval of `gm` for bad inputs. + function testOpGmOneInput() external { + checkBadInputs("_: gm(1);", 1, 2, 1); + } -// /// Test that operand is disallowed. -// function testOpGmEvalOperandDisallowed() external { -// checkUnhappyParse("_: gm<0>(1 1);", abi.encodeWithSelector(UnexpectedOperand.selector)); -// } -// } + function testOpGmThreeInputs() external { + checkBadInputs("_: gm(1 1 1);", 3, 2, 3); + } + + function testOpGmZeroOutputs() external { + checkBadOutputs(": gm(1 1);", 2, 1, 0); + } + + function testOpGmTwoOutputs() external { + checkBadOutputs("_ _: gm(1 1);", 2, 1, 2); + } + + /// Test that operand is disallowed. + function testOpGmEvalOperandDisallowed() external { + checkUnhappyParse("_: gm<0>(1 1);", abi.encodeWithSelector(UnexpectedOperand.selector)); + } +}