From 28cf7fb0933d3920cb84839a7bc0260fc281281d Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 1 Nov 2021 16:54:04 -0700 Subject: [PATCH 1/4] fix(L-01): incorrect error parameter --- contracts/PrimitiveFactory.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/PrimitiveFactory.sol b/contracts/PrimitiveFactory.sol index 5c96add9..7942489b 100644 --- a/contracts/PrimitiveFactory.sol +++ b/contracts/PrimitiveFactory.sol @@ -75,7 +75,7 @@ contract PrimitiveFactory is IPrimitiveFactory { ) internal returns (address engine) { (uint256 riskyDecimals, uint256 stableDecimals) = (IERC20(risky).decimals(), IERC20(stable).decimals()); if (riskyDecimals > 18 || riskyDecimals < 6) revert DecimalsError(riskyDecimals); - if (stableDecimals > 18 || stableDecimals < 6) revert DecimalsError(riskyDecimals); + if (stableDecimals > 18 || stableDecimals < 6) revert DecimalsError(stableDecimals); uint256 scaleFactorRisky = 10**(18 - riskyDecimals); uint256 scaleFactorStable = 10**(18 - stableDecimals); From f37978000540d2b5b71c1607a7aaa3a5b5b24777 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 1 Nov 2021 17:06:48 -0700 Subject: [PATCH 2/4] fix(L-05, create strike): fixes types in create event and strike as uint128 arg --- contracts/PrimitiveEngine.sol | 7 +++---- contracts/interfaces/engine/IPrimitiveEngineActions.sol | 2 +- contracts/interfaces/engine/IPrimitiveEngineEvents.sol | 2 +- contracts/test/TestRouter.sol | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/contracts/PrimitiveEngine.sol b/contracts/PrimitiveEngine.sol index 2673f636..9a87c238 100644 --- a/contracts/PrimitiveEngine.sol +++ b/contracts/PrimitiveEngine.sol @@ -142,7 +142,7 @@ contract PrimitiveEngine is IPrimitiveEngine { /// @inheritdoc IPrimitiveEngineActions function create( - uint256 strike, + uint128 strike, uint32 sigma, uint32 maturity, uint32 gamma, @@ -160,8 +160,7 @@ contract PrimitiveEngine is IPrimitiveEngine { ) { (uint256 factor0, uint256 factor1) = (scaleFactorRisky, scaleFactorStable); - uint128 scaledStrike = strike.toUint128(); - poolId = keccak256(abi.encodePacked(address(this), scaledStrike, sigma, maturity, gamma)); + poolId = keccak256(abi.encodePacked(address(this), strike, sigma, maturity, gamma)); if (calibrations[poolId].lastTimestamp != 0) revert PoolDuplicateError(); if (sigma > 1e7 || sigma < 100) revert SigmaError(sigma); if (strike == 0) revert StrikeError(strike); @@ -170,7 +169,7 @@ contract PrimitiveEngine is IPrimitiveEngine { if (gamma >= Units.PERCENTAGE || gamma < 9000) revert GammaError(gamma); Calibration memory cal = Calibration({ - strike: scaledStrike, + strike: strike, sigma: sigma, maturity: maturity, lastTimestamp: _blockTimestamp(), diff --git a/contracts/interfaces/engine/IPrimitiveEngineActions.sol b/contracts/interfaces/engine/IPrimitiveEngineActions.sol index 23d20c51..d830003c 100644 --- a/contracts/interfaces/engine/IPrimitiveEngineActions.sol +++ b/contracts/interfaces/engine/IPrimitiveEngineActions.sol @@ -23,7 +23,7 @@ interface IPrimitiveEngineActions { /// delRisky Total amount of risky tokens provided to reserves /// delStable Total amount of stable tokens provided to reserves function create( - uint256 strike, + uint128 strike, uint32 sigma, uint32 maturity, uint32 gamma, diff --git a/contracts/interfaces/engine/IPrimitiveEngineEvents.sol b/contracts/interfaces/engine/IPrimitiveEngineEvents.sol index 7acf2b65..04743ae2 100644 --- a/contracts/interfaces/engine/IPrimitiveEngineEvents.sol +++ b/contracts/interfaces/engine/IPrimitiveEngineEvents.sol @@ -11,7 +11,7 @@ interface IPrimitiveEngineEvents { /// @param sigma Implied Volatility of the pool /// @param maturity Maturity timestamp of the pool /// @param gamma 1 - Fee % of the pool, as an integer with precision of 1e4 - event Create(address indexed from, uint256 indexed strike, uint256 sigma, uint256 indexed maturity, uint256 gamma); + event Create(address indexed from, uint128 indexed strike, uint32 sigma, uint32 indexed maturity, uint32 gamma); /// @notice Updates the time until expiry of the pool with `poolId` /// @param poolId Pool Identifier diff --git a/contracts/test/TestRouter.sol b/contracts/test/TestRouter.sol index a6190397..81a7caec 100644 --- a/contracts/test/TestRouter.sol +++ b/contracts/test/TestRouter.sol @@ -20,7 +20,7 @@ contract TestRouter is TestBase { ) public { caller = msg.sender; IPrimitiveEngine(engine).create( - strike, + uint128(strike), uint32(sigma), uint32(maturity), uint32(gamma), From f7a74f54c4edd84a5879bd5acce7aff73ce8da5e Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 1 Nov 2021 17:54:33 -0700 Subject: [PATCH 3/4] fix(L-05): pool creation arguments boundry check comments fix --- contracts/interfaces/engine/IPrimitiveEngineErrors.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/interfaces/engine/IPrimitiveEngineErrors.sol b/contracts/interfaces/engine/IPrimitiveEngineErrors.sol index a537273d..75328555 100644 --- a/contracts/interfaces/engine/IPrimitiveEngineErrors.sol +++ b/contracts/interfaces/engine/IPrimitiveEngineErrors.sol @@ -16,13 +16,13 @@ interface IPrimitiveEngineErrors { /// @notice Thrown when calling an expired pool, where block.timestamp > maturity, + BUFFER if swap error PoolExpiredError(); - /// @notice Thrown when liquidity is lower than the minimum amount of liquidity + /// @notice Thrown when liquidity is lower than or equal to the minimum amount of liquidity error MinLiquidityError(uint256 value); /// @notice Thrown when riskyPerLp is outside the range of acceptable values, 0 < riskyPerLp < 1eRiskyDecimals error RiskyPerLpError(uint256 value); - /// @notice Thrown when sigma is outside the range of acceptable values, 100 < sigma < 1e7 with 4 precision + /// @notice Thrown when sigma is outside the range of acceptable values, 100 <= sigma <= 1e7 with 4 precision error SigmaError(uint256 value); /// @notice Thrown when strike is not valid, i.e. equal to 0 or greater than 2^128 From 480cff221ace9bb50912120b5720d196d2681c53 Mon Sep 17 00:00:00 2001 From: alex Date: Mon, 1 Nov 2021 18:09:55 -0700 Subject: [PATCH 4/4] fix(G-01, G-02): gas optimizations in packing SwapDetails struct and unlocked variable --- contracts/PrimitiveEngine.sol | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/contracts/PrimitiveEngine.sol b/contracts/PrimitiveEngine.sol index 9a87c238..2e569130 100644 --- a/contracts/PrimitiveEngine.sol +++ b/contracts/PrimitiveEngine.sol @@ -51,15 +51,17 @@ contract PrimitiveEngine is IPrimitiveEngine { /// @inheritdoc IPrimitiveEngineView uint256 public immutable override MIN_LIQUIDITY; /// @inheritdoc IPrimitiveEngineView + uint256 public immutable override scaleFactorRisky; + /// @inheritdoc IPrimitiveEngineView + uint256 public immutable override scaleFactorStable; + /// @inheritdoc IPrimitiveEngineView address public immutable override factory; /// @inheritdoc IPrimitiveEngineView address public immutable override risky; /// @inheritdoc IPrimitiveEngineView address public immutable override stable; - /// @inheritdoc IPrimitiveEngineView - uint256 public immutable override scaleFactorRisky; - /// @inheritdoc IPrimitiveEngineView - uint256 public immutable override scaleFactorStable; + /// @dev Reentrancy guard initialized to state + uint8 private unlocked = 1; /// @inheritdoc IPrimitiveEngineView mapping(bytes32 => Calibration) public override calibrations; /// @inheritdoc IPrimitiveEngineView @@ -69,8 +71,6 @@ contract PrimitiveEngine is IPrimitiveEngine { /// @inheritdoc IPrimitiveEngineView mapping(address => mapping(bytes32 => uint256)) public override liquidity; - uint8 private unlocked = 1; - modifier lock() { if (unlocked != 1) revert LockedError(); @@ -288,13 +288,13 @@ contract PrimitiveEngine is IPrimitiveEngine { struct SwapDetails { address recipient; - bytes32 poolId; - uint256 deltaIn; - uint256 deltaOut; bool riskyForStable; bool fromMargin; bool toMargin; uint32 timestamp; + bytes32 poolId; + uint256 deltaIn; + uint256 deltaOut; } /// @inheritdoc IPrimitiveEngineActions