From c62ecda546513c9ce7a4bbae4ca694a63fdf1ca2 Mon Sep 17 00:00:00 2001 From: JaredBorders Date: Tue, 26 Sep 2023 15:17:59 -0400 Subject: [PATCH 01/15] =?UTF-8?q?=F0=9F=91=B7=F0=9F=8F=BB=E2=80=8D?= =?UTF-8?q?=E2=99=82=EF=B8=8F=20Add=20Command:=20PERPS=5FV2=5FSET=5FMIN=5F?= =?UTF-8?q?KEEPER=5FFEE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Account.sol | 16 ++++++++++++++-- src/interfaces/IAccount.sol | 6 +++++- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/Account.sol b/src/Account.sol index 7db4c6bf..290ba6c7 100644 --- a/src/Account.sol +++ b/src/Account.sol @@ -15,6 +15,8 @@ import {ISystemStatus} from "src/interfaces/synthetix/ISystemStatus.sol"; import {IOps} from "src/interfaces/gelato/IOps.sol"; import {IUniversalRouter} from "src/interfaces/uniswap/IUniversalRouter.sol"; import {IEvents} from "src/interfaces/IEvents.sol"; +import {IPerpsV2DynamicFeesModule} from + "src/interfaces/synthetix/IPerpsV2DynamicFeesModule.sol"; import {IPerpsV2ExchangeRate} from "src/interfaces/synthetix/IPerpsV2ExchangeRate.sol"; import {OpsReady} from "src/utils/gelato/OpsReady.sol"; @@ -48,6 +50,11 @@ contract Account is IAccount, Auth, OpsReady { /// @dev specifically for swapping exact tokens in for a non-exact amount of tokens out uint256 internal constant V3_SWAP_EXACT_IN = 0x00; + /// @notice Synthetix Dynamic Fees Module + /// @dev address will never change and only exists on Optimism Mainnet + IPerpsV2DynamicFeesModule internal constant PERPS_V2_DYNAMIC_FEES_MODULE = + IPerpsV2DynamicFeesModule(0xF4bc5588aAB8CBB412baDd3674094ECF808286f6); + /*////////////////////////////////////////////////////////////// IMMUTABLES //////////////////////////////////////////////////////////////*/ @@ -480,8 +487,13 @@ contract Account is IAccount, Auth, OpsReady { } _cancelConditionalOrder({_conditionalOrderId: orderId}); } - } else if (commandIndex > 15) { - // commandIndex 14 & 15 valid and already checked + } else if (commandIndex == 16) { + // Command.PERPS_V2_SET_MIN_KEEPER_FEE + if (!PERPS_V2_DYNAMIC_FEES_MODULE.setMinKeeperFee()) { + revert SetMinKeeperFeeFailed(); + } + } else { + // command indices beyond 16 are invalid revert InvalidCommandType(commandIndex); } } diff --git a/src/interfaces/IAccount.sol b/src/interfaces/IAccount.sol index aa95a260..ea09c0f4 100644 --- a/src/interfaces/IAccount.sol +++ b/src/interfaces/IAccount.sol @@ -29,7 +29,8 @@ interface IAccount { GELATO_PLACE_CONDITIONAL_ORDER, GELATO_CANCEL_CONDITIONAL_ORDER, UNISWAP_V3_SWAP, - PERMIT2_PERMIT // 15 + PERMIT2_PERMIT, // 15 + PERPS_V2_SET_MIN_KEEPER_FEE } /// @notice denotes conditional order types for code clarity @@ -154,6 +155,9 @@ interface IAccount { /// @param executorFee: fee required to execute conditional order error CannotPayExecutorFee(uint256 executorFee, address executor); + /// @notice thrown when call to set/updates the min keeper fee fails + error SetMinKeeperFeeFailed(); + /*////////////////////////////////////////////////////////////// VIEWS //////////////////////////////////////////////////////////////*/ From 3dce3fbef32bb34526785e4a8ba37a396f7ba3c5 Mon Sep 17 00:00:00 2001 From: JaredBorders Date: Tue, 26 Sep 2023 15:18:15 -0400 Subject: [PATCH 02/15] =?UTF-8?q?=F0=9F=91=B7=F0=9F=8F=BB=E2=80=8D?= =?UTF-8?q?=E2=99=82=EF=B8=8F=20Add=20Interface:=20IPerpsV2DynamicFeesModu?= =?UTF-8?q?le?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../synthetix/IPerpsV2DynamicFeesModule.sol | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/interfaces/synthetix/IPerpsV2DynamicFeesModule.sol diff --git a/src/interfaces/synthetix/IPerpsV2DynamicFeesModule.sol b/src/interfaces/synthetix/IPerpsV2DynamicFeesModule.sol new file mode 100644 index 00000000..e1b4076b --- /dev/null +++ b/src/interfaces/synthetix/IPerpsV2DynamicFeesModule.sol @@ -0,0 +1,20 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.18; + +interface IPerpsV2DynamicFeesModule { + /// @dev Updates the minKeeperFee in PerpsV2MarketSettings + function setMinKeeperFee() external returns (bool success); + + function getParameters() + external + view + returns ( + uint256 profitMarginUSD, + uint256 profitMarginPercent, + uint256 minKeeperFeeUpperBound, + uint256 minKeeperFeeLowerBound, + uint256 gasUnitsL1, + uint256 gasUnitsL2, + uint256 lastUpdatedAtTime + ); +} From e3f1085dc2b38394893646a53a1be5f7201068e3 Mon Sep 17 00:00:00 2001 From: JaredBorders Date: Tue, 26 Sep 2023 15:19:06 -0400 Subject: [PATCH 03/15] =?UTF-8?q?=E2=9C=85=20Test=20PERPS=5FV2=5FSET=5FMIN?= =?UTF-8?q?=5FKEEPER=5FFEE=20Command?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/integration/margin.behavior.t.sol | 40 +++++++++++++++++++++++++- test/unit/Account.t.sol | 29 ++++++++++++++++++- test/utils/Constants.sol | 4 +++ 3 files changed, 71 insertions(+), 2 deletions(-) diff --git a/test/integration/margin.behavior.t.sol b/test/integration/margin.behavior.t.sol index 64643bed..ce3a634a 100644 --- a/test/integration/margin.behavior.t.sol +++ b/test/integration/margin.behavior.t.sol @@ -11,8 +11,9 @@ import {Factory} from "src/Factory.sol"; import {IAccount} from "src/interfaces/IAccount.sol"; import {IFuturesMarketManager} from "src/interfaces/synthetix/IFuturesMarketManager.sol"; -import {IPermit2} from "src/interfaces/uniswap/IPermit2.sol"; import {IPerpsV2MarketConsolidated} from "src/interfaces/IAccount.sol"; +import {IPerpsV2DynamicFeesModule} from + "src/interfaces/synthetix/IPerpsV2DynamicFeesModule.sol"; import {IERC20} from "src/interfaces/token/IERC20.sol"; import {AccountExposed} from "test/utils/AccountExposed.sol"; @@ -28,6 +29,7 @@ import { FUTURES_MARKET_MANAGER, GELATO, OPS, + PERPS_V2_DYNAMIC_FEES_MODULE, PERPS_V2_EXCHANGE_RATE, PROXY_SUSD, sETHPERP, @@ -725,6 +727,42 @@ contract MarginBehaviorTest is Test, ConsolidatedEvents { assert(order.sizeDelta == -sizeDelta); } + function test_Commands_SetMinKeeperFee() public { + IAccount.Command[] memory commands = new IAccount.Command[](1); + bytes[] memory inputs = new bytes[](1); + + commands[0] = IAccount.Command.PERPS_V2_SET_MIN_KEEPER_FEE; + inputs[0] = abi.encode(0); + + account.execute(commands, inputs); + + (,,,,,, uint256 lastUpdatedAtTime) = IPerpsV2DynamicFeesModule( + PERPS_V2_DYNAMIC_FEES_MODULE + ).getParameters(); + + assertEq(lastUpdatedAtTime, block.timestamp); + } + + function test_Commands_SetMinKeeperFee_Fails() public { + vm.mockCall( + PERPS_V2_DYNAMIC_FEES_MODULE, + abi.encodeWithSignature("setMinKeeperFee()"), + abi.encode(false) + ); + + IAccount.Command[] memory commands = new IAccount.Command[](1); + bytes[] memory inputs = new bytes[](1); + + commands[0] = IAccount.Command.PERPS_V2_SET_MIN_KEEPER_FEE; + inputs[0] = abi.encode(0); + + vm.expectRevert( + abi.encodeWithSelector(IAccount.SetMinKeeperFeeFailed.selector) + ); + + account.execute(commands, inputs); + } + /*////////////////////////////////////////////////////////////// SCENARIOS //////////////////////////////////////////////////////////////*/ diff --git a/test/unit/Account.t.sol b/test/unit/Account.t.sol index ff5790ea..35b1a037 100644 --- a/test/unit/Account.t.sol +++ b/test/unit/Account.t.sol @@ -13,6 +13,8 @@ import {Factory} from "src/Factory.sol"; import {IAccount} from "src/interfaces/IAccount.sol"; import {IFuturesMarketManager} from "src/interfaces/synthetix/IFuturesMarketManager.sol"; +import {IPerpsV2DynamicFeesModule} from + "src/interfaces/synthetix/IPerpsV2DynamicFeesModule.sol"; import {IPerpsV2ExchangeRate} from "src/interfaces/synthetix/IPerpsV2ExchangeRate.sol"; import {IPerpsV2MarketConsolidated} from "src/interfaces/IAccount.sol"; @@ -33,6 +35,7 @@ import { LOW_FEE_TIER, MULTIPLE_V3_POOLS_MIN_LENGTH, OPS, + PERPS_V2_DYNAMIC_FEES_MODULE, PERPS_V2_EXCHANGE_RATE, PROXY_SUSD, sETHPERP, @@ -389,7 +392,9 @@ contract AccountTest is Test, ConsolidatedEvents { ); vm.expectRevert( - abi.encodeWithSelector(IAccount.InvalidCommandType.selector, 69) + abi.encodeWithSelector( + IAccount.InvalidCommandType.selector, type(uint256).max + ) ); (bool s,) = address(account).call(dataWithInvalidCommand); assert(!s); @@ -714,6 +719,28 @@ contract AccountTest is Test, ConsolidatedEvents { account.execute(commands, inputs); } + function test_DelegatedTrader_Execute_PERPS_V2_SET_MIN_KEEPER_FEE() + public + { + account.addDelegate({_delegate: DELEGATE}); + + IAccount.Command[] memory commands = new IAccount.Command[](1); + bytes[] memory inputs = new bytes[](1); + + commands[0] = IAccount.Command.PERPS_V2_SET_MIN_KEEPER_FEE; + inputs[0] = abi.encode(0); + + vm.prank(DELEGATE); + + account.execute(commands, inputs); + + (,,,,,, uint256 lastUpdatedAtTime) = IPerpsV2DynamicFeesModule( + PERPS_V2_DYNAMIC_FEES_MODULE + ).getParameters(); + + assertEq(lastUpdatedAtTime, block.timestamp); + } + /*////////////////////////////////////////////////////////////// EXECUTION LOCK //////////////////////////////////////////////////////////////*/ diff --git a/test/utils/Constants.sol b/test/utils/Constants.sol index 33883481..03fbbe38 100644 --- a/test/utils/Constants.sol +++ b/test/utils/Constants.sol @@ -65,6 +65,10 @@ address constant ADDRESS_RESOLVER = 0x1Cb059b7e74fD21665968C908806143E744D5F30; // Synthetix (ProxyERC20sUSD) address constant MARGIN_ASSET = 0x8c6f28f2F1A3C87F0f938b96d27520d9751ec8d9; +// Synthetix (IPerpsV2DynamicFeesModule) +address constant PERPS_V2_DYNAMIC_FEES_MODULE = + 0xF4bc5588aAB8CBB412baDd3674094ECF808286f6; + // Synthetix contract names bytes32 constant PROXY_SUSD = "ProxysUSD"; bytes32 constant FUTURES_MARKET_MANAGER = "FuturesMarketManager"; From 23e8c3a65a09ccf5354636d16892f6ae0df4c4c0 Mon Sep 17 00:00:00 2001 From: JaredBorders Date: Tue, 26 Sep 2023 15:20:56 -0400 Subject: [PATCH 04/15] =?UTF-8?q?=F0=9F=93=B8=20Update=20gas-snapshot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gas-snapshot | 189 +++++++++++++++++++++++++------------------------- 1 file changed, 96 insertions(+), 93 deletions(-) diff --git a/.gas-snapshot b/.gas-snapshot index 2584cee8..bdf034df 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -1,76 +1,77 @@ AccountTest:test_Abs(int256) (runs: 256, μ: 5754, ~: 5755) -AccountTest:test_AddDelegatedTrader() (gas: 44938) -AccountTest:test_AddDelegatedTrader_AlreadyDelegated() (gas: 48421) -AccountTest:test_AddDelegatedTrader_Event() (gas: 46710) -AccountTest:test_AddDelegatedTrader_OnlyOwner() (gas: 78167) +AccountTest:test_AddDelegatedTrader() (gas: 44916) +AccountTest:test_AddDelegatedTrader_AlreadyDelegated() (gas: 48399) +AccountTest:test_AddDelegatedTrader_Event() (gas: 46688) +AccountTest:test_AddDelegatedTrader_OnlyOwner() (gas: 78145) AccountTest:test_AddDelegatedTrader_ZeroAddress() (gas: 21753) AccountTest:test_Checker() (gas: 34868) -AccountTest:test_DelegatedTrader_Execute_ACCOUNT_MODIFY_MARGIN() (gas: 77926) -AccountTest:test_DelegatedTrader_Execute_ACCOUNT_WITHDRAW_ETH() (gas: 77927) +AccountTest:test_DelegatedTrader_Execute_ACCOUNT_MODIFY_MARGIN() (gas: 77970) +AccountTest:test_DelegatedTrader_Execute_ACCOUNT_WITHDRAW_ETH() (gas: 77969) AccountTest:test_DelegatedTrader_Execute_GELATO_CANCEL_CONDITIONAL_ORDER() (gas: 137400) -AccountTest:test_DelegatedTrader_Execute_GELATO_PLACE_CONDITIONAL_ORDER() (gas: 79256) -AccountTest:test_DelegatedTrader_Execute_PERPS_V2_CANCEL_DELAYED_ORDER() (gas: 151526) +AccountTest:test_DelegatedTrader_Execute_GELATO_PLACE_CONDITIONAL_ORDER() (gas: 79300) +AccountTest:test_DelegatedTrader_Execute_PERPS_V2_CANCEL_DELAYED_ORDER() (gas: 151504) AccountTest:test_DelegatedTrader_Execute_PERPS_V2_CANCEL_OFFCHAIN_DELAYED_ORDER() (gas: 151594) -AccountTest:test_DelegatedTrader_Execute_PERPS_V2_CLOSE_POSITION() (gas: 169192) -AccountTest:test_DelegatedTrader_Execute_PERPS_V2_MODIFY_MARGIN() (gas: 116327) +AccountTest:test_DelegatedTrader_Execute_PERPS_V2_CLOSE_POSITION() (gas: 169170) +AccountTest:test_DelegatedTrader_Execute_PERPS_V2_MODIFY_MARGIN() (gas: 116305) +AccountTest:test_DelegatedTrader_Execute_PERPS_V2_SET_MIN_KEEPER_FEE() (gas: 272103) AccountTest:test_DelegatedTrader_Execute_PERPS_V2_SUBMIT_ATOMIC_ORDER() (gas: 379053) -AccountTest:test_DelegatedTrader_Execute_PERPS_V2_SUBMIT_CLOSE_DELAYED_ORDER() (gas: 147750) -AccountTest:test_DelegatedTrader_Execute_PERPS_V2_SUBMIT_CLOSE_OFFCHAIN_DELAYED_ORDER() (gas: 147546) -AccountTest:test_DelegatedTrader_Execute_PERPS_V2_SUBMIT_DELAYED_ORDER() (gas: 390012) -AccountTest:test_DelegatedTrader_Execute_PERPS_V2_SUBMIT_OFFCHAIN_DELAYED_ORDER() (gas: 399667) -AccountTest:test_DelegatedTrader_Execute_PERPS_V2_WITHDRAW_ALL_MARGIN() (gas: 366067) -AccountTest:test_DelegatedTrader_Execute_UNISWAP_V3_SWAP() (gas: 77719) -AccountTest:test_DelegatedTrader_TransferAccountOwnership() (gas: 48352) -AccountTest:test_Deposit_ETH_AnyCaller() (gas: 81035) +AccountTest:test_DelegatedTrader_Execute_PERPS_V2_SUBMIT_CLOSE_DELAYED_ORDER() (gas: 147791) +AccountTest:test_DelegatedTrader_Execute_PERPS_V2_SUBMIT_CLOSE_OFFCHAIN_DELAYED_ORDER() (gas: 147569) +AccountTest:test_DelegatedTrader_Execute_PERPS_V2_SUBMIT_DELAYED_ORDER() (gas: 389990) +AccountTest:test_DelegatedTrader_Execute_PERPS_V2_SUBMIT_OFFCHAIN_DELAYED_ORDER() (gas: 399645) +AccountTest:test_DelegatedTrader_Execute_PERPS_V2_WITHDRAW_ALL_MARGIN() (gas: 366045) +AccountTest:test_DelegatedTrader_Execute_UNISWAP_V3_SWAP() (gas: 77697) +AccountTest:test_DelegatedTrader_TransferAccountOwnership() (gas: 48330) +AccountTest:test_Deposit_ETH_AnyCaller() (gas: 81013) AccountTest:test_Deposit_Margin_OnlyOwner() (gas: 107745) AccountTest:test_Dispatch_InvalidCommand() (gas: 20279) -AccountTest:test_Dispatch_ValidCommand_InvalidInput() (gas: 53610) +AccountTest:test_Dispatch_ValidCommand_InvalidInput() (gas: 53633) AccountTest:test_ExecuteConditionalOrder_Locked() (gas: 54074) -AccountTest:test_Execute_CanUnlock() (gas: 50950) +AccountTest:test_Execute_CanUnlock() (gas: 50995) AccountTest:test_Execute_Locked() (gas: 54603) AccountTest:test_GetCommittedMargin() (gas: 18186) -AccountTest:test_GetConditionalOrder() (gas: 34797) +AccountTest:test_GetConditionalOrder() (gas: 34820) AccountTest:test_GetConditionalOrderId() (gas: 18164) -AccountTest:test_GetDelayedOrder_EthMarket() (gas: 74400) -AccountTest:test_GetDelayedOrder_InvalidMarket() (gas: 25782) +AccountTest:test_GetDelayedOrder_EthMarket() (gas: 74378) +AccountTest:test_GetDelayedOrder_InvalidMarket() (gas: 26635) AccountTest:test_GetEvents() (gas: 7658) -AccountTest:test_GetFactory() (gas: 7680) +AccountTest:test_GetFactory() (gas: 7703) AccountTest:test_GetFreeMargin() (gas: 34453) AccountTest:test_GetFuturesMarketManager() (gas: 5574) -AccountTest:test_GetGelato() (gas: 5627) +AccountTest:test_GetGelato() (gas: 5605) AccountTest:test_GetMarginAsset() (gas: 5606) AccountTest:test_GetOps() (gas: 5584) -AccountTest:test_GetPosition_EthMarket() (gas: 62269) -AccountTest:test_GetPosition_InvalidMarket() (gas: 25464) -AccountTest:test_GetSystemStatus() (gas: 5606) -AccountTest:test_GetTokenInTokenOut_Invalid_Fee() (gas: 10283) +AccountTest:test_GetPosition_EthMarket() (gas: 62247) +AccountTest:test_GetPosition_InvalidMarket() (gas: 26315) +AccountTest:test_GetSystemStatus() (gas: 5584) +AccountTest:test_GetTokenInTokenOut_Invalid_Fee() (gas: 10261) AccountTest:test_GetTokenInTokenOut_Invalid_Pools_No_Revert(bytes) (runs: 256, μ: 11371, ~: 11131) AccountTest:test_GetTokenInTokenOut_Invalid_TokenIn() (gas: 10182) -AccountTest:test_GetTokenInTokenOut_Invalid_TokenOut() (gas: 10192) +AccountTest:test_GetTokenInTokenOut_Invalid_TokenOut() (gas: 10235) AccountTest:test_GetTokenInTokenOut_Multi_Pool() (gas: 11453) AccountTest:test_GetTokenInTokenOut_Single_Pool() (gas: 7468) AccountTest:test_GetTrackingCode() (gas: 5554) -AccountTest:test_GetVerison() (gas: 16086) +AccountTest:test_GetVerison() (gas: 16130) AccountTest:test_IsSameSign(int256,int256) (runs: 256, μ: 6233, ~: 6081) AccountTest:test_NonReentrant_Locked() (gas: 31079) AccountTest:test_NonReentrant_Unlocked() (gas: 460695) AccountTest:test_Ownership_Transfer() (gas: 96233) -AccountTest:test_Ownership_Transfer_Event() (gas: 76832) +AccountTest:test_Ownership_Transfer_Event() (gas: 76810) AccountTest:test_Ownership_setInitialOwnership_OnlyFactory() (gas: 19402) AccountTest:test_PerpsV2ExchangeRate() (gas: 74513) AccountTest:test_RemoveDelegatedTrader() (gas: 35396) AccountTest:test_RemoveDelegatedTrader_Event() (gas: 36776) -AccountTest:test_RemoveDelegatedTrader_NotDelegated() (gas: 23930) -AccountTest:test_RemoveDelegatedTrader_OnlyOwner() (gas: 104606) -AccountTest:test_RemoveDelegatedTrader_ZeroAddress() (gas: 48223) +AccountTest:test_RemoveDelegatedTrader_NotDelegated() (gas: 23908) +AccountTest:test_RemoveDelegatedTrader_OnlyOwner() (gas: 104584) +AccountTest:test_RemoveDelegatedTrader_ZeroAddress() (gas: 48201) AccountTest:test_Withdraw_ETH_OnlyOwner() (gas: 107713) AccountTest:test_Withdraw_Margin_OnlyOwner() (gas: 107799) AccountTest:test_getPerpsV2Market_Invalid_Key() (gas: 14269) -AccountTest:test_getPerpsV2Market_Valid_Key() (gas: 11502) -AccountTest:test_sUSDRate_Chainlink_Price() (gas: 137189) -AccountTest:test_sUSDRate_Invalid_Chainlink_Price() (gas: 54910) +AccountTest:test_getPerpsV2Market_Valid_Key() (gas: 11480) +AccountTest:test_sUSDRate_Chainlink_Price() (gas: 137167) +AccountTest:test_sUSDRate_Invalid_Chainlink_Price() (gas: 54955) AccountTest:test_sUSDRate_Invalid_Market() (gas: 11365) -AccountTest:test_sUSDRate_Pyth_Price() (gas: 52757) +AccountTest:test_sUSDRate_Pyth_Price() (gas: 52801) AccountTest:test_sUSDRate_Valid_Market() (gas: 52828) AuthTest:test_addDelegate() (gas: 33557) AuthTest:test_isAuth() (gas: 13625) @@ -107,8 +108,8 @@ FactoryTest:test_NewAccount_State() (gas: 323401) FactoryTest:test_Ownership_NonAccount() (gas: 10980) FactoryTest:test_Ownership_Transfer() (gas: 13152) FactoryTest:test_UpdateAccountOwnership_AccountDoesNotExist() (gas: 11402) -FactoryTest:test_UpdateAccountOwnership_NewOwner_MultipleAccount(uint256) (runs: 256, μ: 507774, ~: 347341) -FactoryTest:test_UpdateAccountOwnership_OldOwner_MultipleAccount(uint256) (runs: 256, μ: 810028, ~: 659300) +FactoryTest:test_UpdateAccountOwnership_NewOwner_MultipleAccount(uint256) (runs: 256, μ: 498160, ~: 347341) +FactoryTest:test_UpdateAccountOwnership_OldOwner_MultipleAccount(uint256) (runs: 256, μ: 805463, ~: 659300) FactoryTest:test_UpdateAccountOwnership_OldOwner_SingleAccount() (gas: 344143) FactoryTest:test_Upgrade_Implementation() (gas: 1034722) FactoryTest:test_Upgrade_Implementation_Event() (gas: 13041) @@ -116,15 +117,17 @@ FactoryTest:test_Upgrade_Implementation_OnlyOwner() (gas: 10957) FactoryTest:test_Upgrade_Implementation_UpgradabilityRemoved() (gas: 14816) FactoryTest:test_Upgrade_Remove() (gas: 11452) FactoryTest:test_Upgrade_Remove_OnlyOwner() (gas: 10761) -MarginBehaviorTest:test_Commands_CancelDelayedOrder() (gas: 1516095) +MarginBehaviorTest:test_Commands_CancelDelayedOrder() (gas: 1516118) MarginBehaviorTest:test_Commands_CancelDelayedOrder_NoneExists() (gas: 291337) -MarginBehaviorTest:test_Commands_CancelOffchainDelayedOrder() (gas: 1525671) -MarginBehaviorTest:test_Commands_CancelOffchainDelayedOrder_NoneExists() (gas: 291404) +MarginBehaviorTest:test_Commands_CancelOffchainDelayedOrder() (gas: 1525694) +MarginBehaviorTest:test_Commands_CancelOffchainDelayedOrder_NoneExists() (gas: 291382) MarginBehaviorTest:test_Commands_ClosePosition() (gas: 1673609) MarginBehaviorTest:test_Commands_ClosePositionWhen_NoneExists() (gas: 390785) -MarginBehaviorTest:test_Commands_ModifyMarginInMarket_ExistingMarginInMarket(int256) (runs: 256, μ: 779175, ~: 715482) -MarginBehaviorTest:test_Commands_ModifyMarginInMarket_NoExistingMarginInMarket(int256) (runs: 256, μ: 330248, ~: 242803) -MarginBehaviorTest:test_Commands_SubmitAtomicOrder() (gas: 1303461) +MarginBehaviorTest:test_Commands_ModifyMarginInMarket_ExistingMarginInMarket(int256) (runs: 256, μ: 776662, ~: 715482) +MarginBehaviorTest:test_Commands_ModifyMarginInMarket_NoExistingMarginInMarket(int256) (runs: 256, μ: 330306, ~: 242803) +MarginBehaviorTest:test_Commands_SetMinKeeperFee() (gas: 242574) +MarginBehaviorTest:test_Commands_SetMinKeeperFee_Fails() (gas: 52897) +MarginBehaviorTest:test_Commands_SubmitAtomicOrder() (gas: 1303439) MarginBehaviorTest:test_Commands_SubmitCloseDelayedOrder() (gas: 2046385) MarginBehaviorTest:test_Commands_SubmitCloseDelayedOrder_NoneExists() (gas: 120693) MarginBehaviorTest:test_Commands_SubmitCloseOffchainDelayedOrder() (gas: 2036294) @@ -133,64 +136,64 @@ MarginBehaviorTest:test_Commands_SubmitDelayedOrder() (gas: 1478227) MarginBehaviorTest:test_Commands_SubmitOffchainDelayedOrder() (gas: 1467970) MarginBehaviorTest:test_Commands_WithdrawAllMarginFromMarket_ExistingMarginInMarket() (gas: 923020) MarginBehaviorTest:test_Commands_WithdrawAllMarginFromMarket_NoExistingMarginInMarket() (gas: 501516) -MarginBehaviorTest:test_Deposit_ETH() (gas: 22833) -MarginBehaviorTest:test_Deposit_Margin(uint256) (runs: 256, μ: 229585, ~: 248137) -MarginBehaviorTest:test_Execute_InputCommandDifferingLengths() (gas: 224314) +MarginBehaviorTest:test_Deposit_ETH() (gas: 22856) +MarginBehaviorTest:test_Deposit_Margin(uint256) (runs: 256, μ: 230553, ~: 248181) +MarginBehaviorTest:test_Execute_InputCommandDifferingLengths() (gas: 224292) MarginBehaviorTest:test_Scenario_1() (gas: 1487208) -MarginBehaviorTest:test_Withdraw_Eth(uint256) (runs: 256, μ: 60811, ~: 66386) -MarginBehaviorTest:test_Withdraw_Margin(int256) (runs: 256, μ: 266672, ~: 241902) -OrderGelatoBehaviorTest:test_CancelConditionalOrder_Event() (gas: 325504) +MarginBehaviorTest:test_Withdraw_Eth(uint256) (runs: 256, μ: 60815, ~: 66431) +MarginBehaviorTest:test_Withdraw_Margin(int256) (runs: 256, μ: 266462, ~: 241968) +OrderGelatoBehaviorTest:test_CancelConditionalOrder_Event() (gas: 325505) OrderGelatoBehaviorTest:test_CancelConditionalOrder_Invalid_NotOwner() (gas: 36633) -OrderGelatoBehaviorTest:test_CancelConditionalOrder_Margin() (gas: 323843) +OrderGelatoBehaviorTest:test_CancelConditionalOrder_Margin() (gas: 323844) OrderGelatoBehaviorTest:test_CancelConditionalOrder_Nonexistent(uint256) (runs: 256, μ: 93339, ~: 93339) -OrderGelatoBehaviorTest:test_CancelConditionalOrder_State() (gas: 321443) -OrderGelatoBehaviorTest:test_ConditionalOrder_Limit_Valid_Execute_Cancel() (gas: 1612463) -OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_AfterUnlock() (gas: 1529589) -OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_InvalidAtExecutionTime() (gas: 489101) -OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Limit_Valid_Margin() (gas: 1530796) -OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Limit_Valid_State() (gas: 1527902) -OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Limit_Valid_Synthetix() (gas: 1543049) -OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_MarketIsPaused() (gas: 415614) -OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Stop_Valid_Margin() (gas: 1530803) -OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Stop_Valid_State() (gas: 1527952) -OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Stop_Valid_Synthetix() (gas: 1543054) -OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Valid_FeeTransfer() (gas: 1523505) -OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Valid_GelatoFee() (gas: 1525898) -OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Valid_InsufficientEth() (gas: 555876) -OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Valid_InvalidReduceOnly_InactiveMarket_FeeTransfer() (gas: 485353) -OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Valid_InvalidReduceOnly_SameSign_FeeTransfer() (gas: 1448835) -OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Valid_TaskCancelled() (gas: 1533866) -OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Valid_TaskRemovedFromGelato() (gas: 1534571) -OrderGelatoBehaviorTest:test_PlaceConditionalOrder_CommittingMargin_Deposit() (gas: 366047) -OrderGelatoBehaviorTest:test_PlaceConditionalOrder_CommittingMargin_Withdraw(uint256,int256) (runs: 256, μ: 423638, ~: 386610) -OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Invalid_InsufficientFreeMargin() (gas: 382833) +OrderGelatoBehaviorTest:test_CancelConditionalOrder_State() (gas: 321444) +OrderGelatoBehaviorTest:test_ConditionalOrder_Limit_Valid_Execute_Cancel() (gas: 1612464) +OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_AfterUnlock() (gas: 1529590) +OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_InvalidAtExecutionTime() (gas: 489102) +OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Limit_Valid_Margin() (gas: 1530797) +OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Limit_Valid_State() (gas: 1527903) +OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Limit_Valid_Synthetix() (gas: 1543050) +OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_MarketIsPaused() (gas: 415615) +OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Stop_Valid_Margin() (gas: 1530804) +OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Stop_Valid_State() (gas: 1527953) +OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Stop_Valid_Synthetix() (gas: 1543055) +OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Valid_FeeTransfer() (gas: 1523506) +OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Valid_GelatoFee() (gas: 1525899) +OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Valid_InsufficientEth() (gas: 555877) +OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Valid_InvalidReduceOnly_InactiveMarket_FeeTransfer() (gas: 485354) +OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Valid_InvalidReduceOnly_SameSign_FeeTransfer() (gas: 1448836) +OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Valid_TaskCancelled() (gas: 1533867) +OrderGelatoBehaviorTest:test_ExecuteConditionalOrder_Valid_TaskRemovedFromGelato() (gas: 1534572) +OrderGelatoBehaviorTest:test_PlaceConditionalOrder_CommittingMargin_Deposit() (gas: 366048) +OrderGelatoBehaviorTest:test_PlaceConditionalOrder_CommittingMargin_Withdraw(uint256,int256) (runs: 256, μ: 421975, ~: 386611) +OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Invalid_InsufficientFreeMargin() (gas: 382834) OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Invalid_InsufficientMargin() (gas: 386614) OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Invalid_NotOwner() (gas: 37357) OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Invalid_OrderType() (gas: 8581) OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Invalid_ZeroSizeDelta() (gas: 35252) -OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Limit_Invalid_Long(uint256) (runs: 256, μ: 438303, ~: 440014) -OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Limit_Invalid_Short(uint256) (runs: 256, μ: 440007, ~: 440007) -OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Limit_Valid_Event(int256) (runs: 256, μ: 380207, ~: 380207) -OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Limit_Valid_Long(uint256) (runs: 256, μ: 439986, ~: 439986) -OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Limit_Valid_Short(uint256) (runs: 256, μ: 438425, ~: 439980) -OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Limit_Valid_State(int256) (runs: 256, μ: 374311, ~: 374311) -OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Stop_Invalid_Long(uint256) (runs: 256, μ: 459952, ~: 459952) -OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Stop_Invalid_Short(uint256) (runs: 256, μ: 458432, ~: 459987) -OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Stop_Valid_Long(uint256) (runs: 256, μ: 458211, ~: 459922) -OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Stop_Valid_Short(uint256) (runs: 256, μ: 459980, ~: 459980) -OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Valid_GelatoTaskId() (gas: 374903) -OrderGelatoBehaviorTest:test_ReduceOnlyOrder_Valid_Long(int256) (runs: 256, μ: 1677445, ~: 1412658) -OrderGelatoBehaviorTest:test_ReduceOnlyOrder_Valid_Short(int256) (runs: 256, μ: 1985728, ~: 2244991) -OrderGelatoBehaviorTest:test_ReduceOnlyOrder_Valid_State() (gas: 2271304) -OrderGelatoBehaviorTest:test_ReduceOnlyOrder_Valid_Synthetix() (gas: 2286446) +OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Limit_Invalid_Long(uint256) (runs: 256, μ: 438304, ~: 440015) +OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Limit_Invalid_Short(uint256) (runs: 256, μ: 440008, ~: 440008) +OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Limit_Valid_Event(int256) (runs: 256, μ: 380208, ~: 380208) +OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Limit_Valid_Long(uint256) (runs: 256, μ: 439987, ~: 439987) +OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Limit_Valid_Short(uint256) (runs: 256, μ: 438270, ~: 439981) +OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Limit_Valid_State(int256) (runs: 256, μ: 374312, ~: 374312) +OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Stop_Invalid_Long(uint256) (runs: 256, μ: 459953, ~: 459953) +OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Stop_Invalid_Short(uint256) (runs: 256, μ: 458277, ~: 459988) +OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Stop_Valid_Long(uint256) (runs: 256, μ: 458212, ~: 459923) +OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Stop_Valid_Short(uint256) (runs: 256, μ: 459981, ~: 459981) +OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Valid_GelatoTaskId() (gas: 374904) +OrderGelatoBehaviorTest:test_ReduceOnlyOrder_Valid_Long(int256) (runs: 256, μ: 1680699, ~: 1412659) +OrderGelatoBehaviorTest:test_ReduceOnlyOrder_Valid_Short(int256) (runs: 256, μ: 1995339, ~: 2244992) +OrderGelatoBehaviorTest:test_ReduceOnlyOrder_Valid_State() (gas: 2271305) +OrderGelatoBehaviorTest:test_ReduceOnlyOrder_Valid_Synthetix() (gas: 2286447) OrderPublicBehaviorTest:test_ExecuteConditionalOrder_Public() (gas: 1405271) OrderPublicBehaviorTest:test_ExecuteConditionalOrder_Public_Cannot_PayExecutorFee() (gas: 233066) OrderPublicBehaviorTest:test_ExecuteConditionalOrder_Public_Invalid_ConditionalOrder() (gas: 96675) OrderPublicBehaviorTest:test_ExecuteConditionalOrder_Public_PayExecutorFee() (gas: 1400926) OrderPublicBehaviorTest:test_ExecuteConditionalOrder_Public_Replay_Prevented() (gas: 1409794) -PermitBehaviorTest:test_Permit() (gas: 100511) -PermitBehaviorTest:test_Permit_UniswapV3Swap() (gas: 357326) -PermitBehaviorTest:test_Permit_UniswapV3Swap_Cant_Replay() (gas: 111990) +PermitBehaviorTest:test_Permit() (gas: 100512) +PermitBehaviorTest:test_Permit_UniswapV3Swap() (gas: 357327) +PermitBehaviorTest:test_Permit_UniswapV3Swap_Cant_Replay() (gas: 111991) SettingsTest:test_Constructor_Owner() (gas: 7612) SettingsTest:test_setAccountExecutionEnabled() (gas: 13567) SettingsTest:test_setAccountExecutionEnabled_Event() (gas: 15721) From ed375ba27a600f61de3229e05450a062f22ddda3 Mon Sep 17 00:00:00 2001 From: JaredBorders Date: Tue, 26 Sep 2023 15:26:39 -0400 Subject: [PATCH 05/15] =?UTF-8?q?=E2=9A=99=EF=B8=8F=20Update=20version?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 2 +- package.json | 2 +- src/Account.sol | 2 +- src/interfaces/IAccount.sol | 2 +- test/unit/Account.t.sol | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4de092f4..4c2d5e98 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@kwenta/cross-margin-manager", - "version": "2.1.0", + "version": "2.1.1", "lockfileVersion": 2, "requires": true, "packages": { diff --git a/package.json b/package.json index ea1dc73d..33ac1f11 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kwenta/cross-margin-manager", - "version": "2.1.0", + "version": "2.1.1", "scripts": { "compile": "forge build", "test": "forge test --fork-url $(grep ARCHIVE_NODE_URL_L2 .env | cut -d '=' -f2) --etherscan-api-key $(grep ETHERSCAN_API_KEY .env | cut -d '=' -f2) --gas-report -vvv", diff --git a/src/Account.sol b/src/Account.sol index 290ba6c7..a7de4cd2 100644 --- a/src/Account.sol +++ b/src/Account.sol @@ -37,7 +37,7 @@ contract Account is IAccount, Auth, OpsReady { //////////////////////////////////////////////////////////////*/ /// @inheritdoc IAccount - bytes32 public constant VERSION = "2.1.0"; + bytes32 public constant VERSION = "2.1.1"; /// @notice tracking code used when modifying positions bytes32 internal constant TRACKING_CODE = "KWENTA"; diff --git a/src/interfaces/IAccount.sol b/src/interfaces/IAccount.sol index ea09c0f4..31f15c77 100644 --- a/src/interfaces/IAccount.sol +++ b/src/interfaces/IAccount.sol @@ -4,7 +4,7 @@ pragma solidity 0.8.18; import {IPerpsV2MarketConsolidated} from "src/interfaces/synthetix/IPerpsV2MarketConsolidated.sol"; -/// @title Kwenta Smart Margin Account v2.1.0 Implementation Interface +/// @title Kwenta Smart Margin Account v2.1.1 Implementation Interface /// @author JaredBorders (jaredborders@pm.me), JChiaramonte7 (jeremy@bytecode.llc) interface IAccount { /*/////////////////////////////////////////////////////////////// diff --git a/test/unit/Account.t.sol b/test/unit/Account.t.sol index 35b1a037..c685fc7d 100644 --- a/test/unit/Account.t.sol +++ b/test/unit/Account.t.sol @@ -118,7 +118,7 @@ contract AccountTest is Test, ConsolidatedEvents { //////////////////////////////////////////////////////////////*/ function test_GetVerison() public view { - assert(account.VERSION() == "2.1.0"); + assert(account.VERSION() == "2.1.1"); } function test_GetTrackingCode() public view { From c46fbdcdb6197e02f086d0a51c9c70acf0842565 Mon Sep 17 00:00:00 2001 From: JaredBorders Date: Tue, 26 Sep 2023 17:43:30 -0400 Subject: [PATCH 06/15] =?UTF-8?q?=F0=9F=9A=80=20Write=20v2.1.1=20upgrade?= =?UTF-8?q?=20script?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/upgrades/v2.1.1/Upgrade.s.sol | 129 +++++++++++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 script/upgrades/v2.1.1/Upgrade.s.sol diff --git a/script/upgrades/v2.1.1/Upgrade.s.sol b/script/upgrades/v2.1.1/Upgrade.s.sol new file mode 100644 index 00000000..db6aa49c --- /dev/null +++ b/script/upgrades/v2.1.1/Upgrade.s.sol @@ -0,0 +1,129 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.18; + +import {Script} from "lib/forge-std/src/Script.sol"; + +import {IAddressResolver} from "script/utils/interfaces/IAddressResolver.sol"; + +import {Account} from "src/Account.sol"; +import {Events} from "src/Events.sol"; +import {Settings} from "src/Settings.sol"; +import {IAccount} from "src/interfaces/IAccount.sol"; + +import { + OPTIMISM_PDAO, + OPTIMISM_GELATO, + OPTIMISM_OPS, + FUTURES_MARKET_MANAGER, + OPTIMISM_FACTORY, + OPTIMISM_EVENTS, + OPTIMISM_SETTINGS, + OPTIMISM_SYNTHETIX_ADDRESS_RESOLVER, + OPTIMISM_UNISWAP_PERMIT2, + OPTIMISM_UNISWAP_UNIVERSAL_ROUTER, + PERPS_V2_EXCHANGE_RATE, + PROXY_SUSD, + SYSTEM_STATUS +} from "script/utils/parameters/OptimismParameters.sol"; +import { + OPTIMISM_GOERLI_DEPLOYER, + OPTIMISM_GOERLI_EVENTS, + OPTIMISM_GOERLI_SETTINGS, + OPTIMISM_GOERLI_FACTORY, + OPTIMISM_GOERLI_GELATO, + OPTIMISM_GOERLI_OPS, + OPTIMISM_GOERLI_SYNTHETIX_ADDRESS_RESOLVER, + OPTIMISM_GOERLI_UNISWAP_PERMIT2, + OPTIMISM_GOERLI_UNISWAP_UNIVERSAL_ROUTER +} from "script/utils/parameters/OptimismGoerliParameters.sol"; + +/// @title Script to upgrade the Account implementation v2.1.0 -> v2.1.1 +/// @author JaredBorders (jaredborders@pm.me) + +/// @dev steps to deploy and verify on Optimism: +/// (1) load the variables in the .env file via `source .env` +/// (2) run `forge script script/upgrades/v2.1.1/Upgrade.s.sol:UpgradeAccountOptimism --rpc-url $ARCHIVE_NODE_URL_L2 --broadcast --verify -vvvv` +/// (3) Smart Margin Account Factory owner (i.e. Kwenta pDAO) will need to call `upgradeAccountImplementation` on the Factory with the address of the new Account implementation +contract UpgradeAccountOptimism is Script { + function run() public { + uint256 deployerPrivateKey = vm.envUint("DEPLOYER_PRIVATE_KEY"); + vm.startBroadcast(deployerPrivateKey); + + upgrade(); + + vm.stopBroadcast(); + } + + function upgrade() public returns (address implementation) { + IAddressResolver addressResolver = + IAddressResolver(OPTIMISM_SYNTHETIX_ADDRESS_RESOLVER); + + address marginAsset = addressResolver.getAddress({name: PROXY_SUSD}); + address perpsV2ExchangeRate = + addressResolver.getAddress({name: PERPS_V2_EXCHANGE_RATE}); + address futuresMarketManager = + addressResolver.getAddress({name: FUTURES_MARKET_MANAGER}); + address systemStatus = addressResolver.getAddress({name: SYSTEM_STATUS}); + + IAccount.AccountConstructorParams memory params = IAccount + .AccountConstructorParams({ + factory: OPTIMISM_FACTORY, + events: OPTIMISM_EVENTS, + marginAsset: marginAsset, + perpsV2ExchangeRate: perpsV2ExchangeRate, + futuresMarketManager: futuresMarketManager, + systemStatus: systemStatus, + gelato: OPTIMISM_GELATO, + ops: OPTIMISM_OPS, + settings: OPTIMISM_SETTINGS, + universalRouter: OPTIMISM_UNISWAP_UNIVERSAL_ROUTER, + permit2: OPTIMISM_UNISWAP_PERMIT2 + }); + + implementation = address(new Account(params)); + } +} + +/// @dev steps to deploy and verify on Optimism Goerli: +/// (1) load the variables in the .env file via `source .env` +/// (2) run `forge script script/upgrades/v2.1.1/Upgrade.s.sol:UpgradeAccountOptimismGoerli --rpc-url $ARCHIVE_NODE_URL_GOERLI_L2 --broadcast --verify -vvvv` +/// (3) Smart Margin Account Factory owner (i.e. Kwenta pDAO) will need to call `upgradeAccountImplementation` on the Factory with the address of the new Account implementation +contract UpgradeAccountOptimismGoerli is Script { + function run() public { + uint256 deployerPrivateKey = vm.envUint("DEPLOYER_PRIVATE_KEY"); + vm.startBroadcast(deployerPrivateKey); + + upgrade(); + + vm.stopBroadcast(); + } + + function upgrade() public returns (address implementation) { + IAddressResolver addressResolver = + IAddressResolver(OPTIMISM_GOERLI_SYNTHETIX_ADDRESS_RESOLVER); + + address marginAsset = addressResolver.getAddress({name: PROXY_SUSD}); + address perpsV2ExchangeRate = + addressResolver.getAddress({name: PERPS_V2_EXCHANGE_RATE}); + address futuresMarketManager = + addressResolver.getAddress({name: FUTURES_MARKET_MANAGER}); + address systemStatus = addressResolver.getAddress({name: SYSTEM_STATUS}); + + IAccount.AccountConstructorParams memory params = IAccount + .AccountConstructorParams({ + factory: OPTIMISM_GOERLI_FACTORY, + events: OPTIMISM_GOERLI_EVENTS, + marginAsset: marginAsset, + perpsV2ExchangeRate: perpsV2ExchangeRate, + futuresMarketManager: futuresMarketManager, + systemStatus: systemStatus, + gelato: OPTIMISM_GOERLI_GELATO, + ops: OPTIMISM_GOERLI_OPS, + settings: OPTIMISM_GOERLI_SETTINGS, + universalRouter: OPTIMISM_GOERLI_UNISWAP_UNIVERSAL_ROUTER, + permit2: OPTIMISM_GOERLI_UNISWAP_PERMIT2 + }); + + implementation = address(new Account(params)); + } +} From a3ac2a98d9a71752e0c0f74ea5e0690c4cca4122 Mon Sep 17 00:00:00 2001 From: JaredBorders Date: Tue, 26 Sep 2023 17:43:45 -0400 Subject: [PATCH 07/15] =?UTF-8?q?=E2=9C=85=20Test=20Upgrade=20Script?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/upgrades/v2.1.0/interfaces/IAccount.sol | 14 +- test/upgrades/v2.1.1/Upgrade.t.sol | 232 ++++++++++++++++++ test/upgrades/v2.1.1/interfaces/IAccount.sol | 234 +++++++++++++++++++ 3 files changed, 473 insertions(+), 7 deletions(-) create mode 100644 test/upgrades/v2.1.1/Upgrade.t.sol create mode 100644 test/upgrades/v2.1.1/interfaces/IAccount.sol diff --git a/test/upgrades/v2.1.0/interfaces/IAccount.sol b/test/upgrades/v2.1.0/interfaces/IAccount.sol index fd8e1a8a..58cd6502 100644 --- a/test/upgrades/v2.1.0/interfaces/IAccount.sol +++ b/test/upgrades/v2.1.0/interfaces/IAccount.sol @@ -16,20 +16,20 @@ interface IAccount { enum Command { ACCOUNT_MODIFY_MARGIN, // 0 ACCOUNT_WITHDRAW_ETH, - UNISWAP_V3_SWAP, - PERMIT2_PERMIT, PERPS_V2_MODIFY_MARGIN, - PERPS_V2_WITHDRAW_ALL_MARGIN, // 5 + PERPS_V2_WITHDRAW_ALL_MARGIN, PERPS_V2_SUBMIT_ATOMIC_ORDER, - PERPS_V2_SUBMIT_DELAYED_ORDER, + PERPS_V2_SUBMIT_DELAYED_ORDER, // 5 PERPS_V2_SUBMIT_OFFCHAIN_DELAYED_ORDER, PERPS_V2_CLOSE_POSITION, - PERPS_V2_SUBMIT_CLOSE_DELAYED_ORDER, // 10 + PERPS_V2_SUBMIT_CLOSE_DELAYED_ORDER, PERPS_V2_SUBMIT_CLOSE_OFFCHAIN_DELAYED_ORDER, - PERPS_V2_CANCEL_DELAYED_ORDER, + PERPS_V2_CANCEL_DELAYED_ORDER, // 10 PERPS_V2_CANCEL_OFFCHAIN_DELAYED_ORDER, GELATO_PLACE_CONDITIONAL_ORDER, - GELATO_CANCEL_CONDITIONAL_ORDER // 15 + GELATO_CANCEL_CONDITIONAL_ORDER, + UNISWAP_V3_SWAP, + PERMIT2_PERMIT // 15 } /// @notice denotes conditional order types for code clarity diff --git a/test/upgrades/v2.1.1/Upgrade.t.sol b/test/upgrades/v2.1.1/Upgrade.t.sol new file mode 100644 index 00000000..21e1da73 --- /dev/null +++ b/test/upgrades/v2.1.1/Upgrade.t.sol @@ -0,0 +1,232 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.18; + +import {Test} from "lib/forge-std/src/Test.sol"; + +import {UpgradeAccountOptimism} from "script/upgrades/v2.1.1/Upgrade.s.sol"; +import { + OPTIMISM_FACTORY, + OPTIMISM_PDAO, + OPTIMISM_UNISWAP_PERMIT2 +} from "script/utils/parameters/OptimismParameters.sol"; + +import {Factory} from "src/Factory.sol"; +import {IAccount as OldAccount} from + "test/upgrades/v2.1.0/interfaces/IAccount.sol"; +import {IAccount as NewAccount} from + "test/upgrades/v2.1.1/interfaces/IAccount.sol"; +import {IERC20} from "src/interfaces/token/IERC20.sol"; +import {ISynth} from "test/utils/interfaces/ISynth.sol"; + +import {IAddressResolver} from "test/utils/interfaces/IAddressResolver.sol"; +import {ADDRESS_RESOLVER, PROXY_SUSD} from "test/utils/Constants.sol"; + +contract UpgradeTest is Test { + // BLOCK_NUMBER_UPGRADE corresponds to Optimism network state @ Sep-26-2023 08:39:37 PM +UTC + // hard coded addresses are only guaranteed for this block + uint256 private constant BLOCK_NUMBER_UPGRADE = 110_081_000; + + address private constant DELEGATE = address(0xDE1A6A7E); + + /*////////////////////////////////////////////////////////////// + V2.1.0 IMPLEMENTATION + //////////////////////////////////////////////////////////////*/ + + address private constant OLD_IMPLEMENTATION = + 0x83E13069aA457778ca349E0128927B417A2c2B3f; + + /*////////////////////////////////////////////////////////////// + V2.1.1 IMPLEMENTATION + //////////////////////////////////////////////////////////////*/ + + address private NEW_IMPLEMENTATION; + + /*////////////////////////////////////////////////////////////// + V2.1.1 ACTIVE ACCOUNT + //////////////////////////////////////////////////////////////*/ + + address private activeAccount; + + /*////////////////////////////////////////////////////////////// + SETUP + //////////////////////////////////////////////////////////////*/ + + function setUp() public { + vm.rollFork(BLOCK_NUMBER_UPGRADE); + + // create active v2.1.0 account + activeAccount = initAccountForStateTesting(); + + // define Setup contract used for upgrades + UpgradeAccountOptimism upgradeAccountOptimism = + new UpgradeAccountOptimism(); + + // deploy v2.1.1 implementation + address implementationAddr = upgradeAccountOptimism.upgrade(); + NEW_IMPLEMENTATION = payable(implementationAddr); + } + + /*////////////////////////////////////////////////////////////// + TESTS + //////////////////////////////////////////////////////////////*/ + + function test_Deployed_Account_Version() public { + (, bytes memory response) = + activeAccount.call(abi.encodeWithSignature("VERSION()")); + (bytes32 version) = abi.decode(response, (bytes32)); + assertEq(version, "2.1.0", "wrong version"); + } + + function test_Upgrade() public { + /** + * RECORD ALL STATE PRIOR TO UPGRADE + */ + + // fetch commited margin from Active Account + (, bytes memory response) = + activeAccount.call(abi.encodeWithSignature("committedMargin()")); + (uint256 commitedMargin) = abi.decode(response, (uint256)); + assertGt(commitedMargin, 0, "commitedMargin is zero"); + + // fetch current conditional order id from Active Account + (, response) = + activeAccount.call(abi.encodeWithSignature("conditionalOrderId()")); + (uint256 conditionalOrderId) = abi.decode(response, (uint256)); + assertGt(conditionalOrderId, 0, "conditionalOrderId is zero"); + + // fetch current conditional orders from Active Account + OldAccount.ConditionalOrder[] memory orders = + new OldAccount.ConditionalOrder[](conditionalOrderId); + for (uint256 index = 0; index < conditionalOrderId; index++) { + (, response) = activeAccount.call( + abi.encodeWithSignature("getConditionalOrder(uint256)", index) + ); + (OldAccount.ConditionalOrder memory order) = + abi.decode(response, (OldAccount.ConditionalOrder)); + orders[index] = order; + } + + // fetch owner from Active Account + (, response) = activeAccount.call(abi.encodeWithSignature("owner()")); + (address owner) = abi.decode(response, (address)); + assert(owner != address(0)); + + // fetch delegate from Active Account + (, response) = activeAccount.call( + abi.encodeWithSignature("delegates(address)", DELEGATE) + ); + assertEq(true, abi.decode(response, (bool)), "delegate missmatch"); + + /** + * EXECUTE UPGRADE + */ + + // upgrade Active Account to v2.1.0 + vm.prank(OPTIMISM_PDAO); + Factory(OPTIMISM_FACTORY).upgradeAccountImplementation( + address(NEW_IMPLEMENTATION) + ); + + /** + * VERIFY VERSION DID CHANGE + */ + + (, response) = + activeAccount.call(abi.encodeWithSignature("VERSION()")); + (bytes32 version) = abi.decode(response, (bytes32)); + assertEq(version, "2.1.1", "wrong version"); + + /** + * CHECK STATE DID NOT CHANGE + */ + + (, response) = + activeAccount.call(abi.encodeWithSignature("committedMargin()")); + assertEq( + commitedMargin, + abi.decode(response, (uint256)), + "commitedMargin missmatch" + ); + + // fetch current conditional order id from Active Account + (, response) = + activeAccount.call(abi.encodeWithSignature("conditionalOrderId()")); + assertEq( + conditionalOrderId, + abi.decode(response, (uint256)), + "conditionalOrderId missmatch" + ); + + // fetch current conditional orders from Active Account + for (uint256 index = 0; index < conditionalOrderId; index++) { + (, response) = activeAccount.call( + abi.encodeWithSignature("getConditionalOrder(uint256)", index) + ); + assertEq( + orders[index].marketKey, + abi.decode(response, (NewAccount.ConditionalOrder)).marketKey, + "conditionalOrder missmatch" + ); + } + + // fetch owner from Active Account + (, response) = activeAccount.call(abi.encodeWithSignature("owner()")); + assertEq(owner, abi.decode(response, (address)), "owner missmatch"); + + // fetch delegate from Active Account + (, response) = activeAccount.call( + abi.encodeWithSignature("delegates(address)", DELEGATE) + ); + assertEq(true, abi.decode(response, (bool)), "delegate missmatch"); + } + + /*////////////////////////////////////////////////////////////// + UTILITIES + //////////////////////////////////////////////////////////////*/ + + function initAccountForStateTesting() internal returns (address) { + uint256 amount = 10_000 ether; + + /// @notice create account + address payable accountAddress = Factory(OPTIMISM_FACTORY).newAccount(); + + /// @notice mint sUSD to this contract + address issuer = IAddressResolver(ADDRESS_RESOLVER).getAddress("Issuer"); + ISynth synthsUSD = + ISynth(IAddressResolver(ADDRESS_RESOLVER).getAddress("SynthsUSD")); + vm.prank(issuer); + synthsUSD.issue(address(this), amount); + + /// @notice fund SM account with eth and sUSD (i.e. margin) + vm.deal(accountAddress, 1 ether); + IERC20(IAddressResolver(ADDRESS_RESOLVER).getAddress(PROXY_SUSD)) + .approve(address(accountAddress), type(uint256).max); + OldAccount.Command[] memory commands = new OldAccount.Command[](1); + commands[0] = OldAccount.Command.ACCOUNT_MODIFY_MARGIN; + bytes[] memory inputs = new bytes[](1); + inputs[0] = abi.encode(amount); + OldAccount(accountAddress).execute(commands, inputs); + + /// @notice create/submit conditional order which lock up margin + commands[0] = OldAccount.Command.GELATO_PLACE_CONDITIONAL_ORDER; + bytes32 marketKey = bytes32("sETHPERP"); + inputs[0] = abi.encode( + marketKey, + int256(amount / 2), + int256(1 ether), + 10_000 ether, + OldAccount.ConditionalOrderTypes.LIMIT, + 1000 ether, + true + ); + OldAccount(accountAddress).execute(commands, inputs); + + /// @notice add delegate + (bool s,) = accountAddress.call( + abi.encodeWithSignature("addDelegate(address)", DELEGATE) + ); + assertEq(s, true, "addDelegate failed"); + + return accountAddress; + } +} diff --git a/test/upgrades/v2.1.1/interfaces/IAccount.sol b/test/upgrades/v2.1.1/interfaces/IAccount.sol new file mode 100644 index 00000000..31f15c77 --- /dev/null +++ b/test/upgrades/v2.1.1/interfaces/IAccount.sol @@ -0,0 +1,234 @@ +// SPDX-License-Identifier: GPL-3.0-or-later +pragma solidity 0.8.18; + +import {IPerpsV2MarketConsolidated} from + "src/interfaces/synthetix/IPerpsV2MarketConsolidated.sol"; + +/// @title Kwenta Smart Margin Account v2.1.1 Implementation Interface +/// @author JaredBorders (jaredborders@pm.me), JChiaramonte7 (jeremy@bytecode.llc) +interface IAccount { + /*/////////////////////////////////////////////////////////////// + Types + ///////////////////////////////////////////////////////////////*/ + + /// @notice Command Flags used to decode commands to execute + /// @dev under the hood ACCOUNT_MODIFY_MARGIN = 0, ACCOUNT_WITHDRAW_ETH = 1 + enum Command { + ACCOUNT_MODIFY_MARGIN, // 0 + ACCOUNT_WITHDRAW_ETH, + PERPS_V2_MODIFY_MARGIN, + PERPS_V2_WITHDRAW_ALL_MARGIN, + PERPS_V2_SUBMIT_ATOMIC_ORDER, + PERPS_V2_SUBMIT_DELAYED_ORDER, // 5 + PERPS_V2_SUBMIT_OFFCHAIN_DELAYED_ORDER, + PERPS_V2_CLOSE_POSITION, + PERPS_V2_SUBMIT_CLOSE_DELAYED_ORDER, + PERPS_V2_SUBMIT_CLOSE_OFFCHAIN_DELAYED_ORDER, + PERPS_V2_CANCEL_DELAYED_ORDER, // 10 + PERPS_V2_CANCEL_OFFCHAIN_DELAYED_ORDER, + GELATO_PLACE_CONDITIONAL_ORDER, + GELATO_CANCEL_CONDITIONAL_ORDER, + UNISWAP_V3_SWAP, + PERMIT2_PERMIT, // 15 + PERPS_V2_SET_MIN_KEEPER_FEE + } + + /// @notice denotes conditional order types for code clarity + /// @dev under the hood LIMIT = 0, STOP = 1 + enum ConditionalOrderTypes { + LIMIT, + STOP + } + + /// @notice denotes conditional order cancelled reasons for code clarity + /// @dev under the hood CONDITIONAL_ORDER_CANCELLED_BY_USER = 0, CONDITIONAL_ORDER_CANCELLED_NOT_REDUCE_ONLY = 1 + enum ConditionalOrderCancelledReason { + CONDITIONAL_ORDER_CANCELLED_BY_USER, + CONDITIONAL_ORDER_CANCELLED_NOT_REDUCE_ONLY + } + + /// @notice denotes what oracle is used for price when executing conditional orders + /// @dev under the hood PYTH = 0, CHAINLINK = 1 + enum PriceOracleUsed { + PYTH, + CHAINLINK + } + + /// @param factory: address of the Smart Margin Account Factory + /// @param events: address of the contract used by all accounts for emitting events + /// @param marginAsset: address of the Synthetix ProxyERC20sUSD contract used as the margin asset + /// @param perpsV2ExchangeRate: address of the Synthetix PerpsV2ExchangeRate + /// @param futuresMarketManager: address of the Synthetix FuturesMarketManager + /// @param systemStatus: address of the Synthetix SystemStatus + /// @param gelato: address of Gelato + /// @param ops: address of Ops + /// @param settings: address of contract used to store global settings + /// @param universalRouter: address of Uniswap's Universal Router + /// @param permit2: address of Uniswap's Permit2 + struct AccountConstructorParams { + address factory; + address events; + address marginAsset; + address perpsV2ExchangeRate; + address futuresMarketManager; + address systemStatus; + address gelato; + address ops; + address settings; + address universalRouter; + address permit2; + } + + /// marketKey: Synthetix PerpsV2 Market id/key + /// marginDelta: amount of margin to deposit or withdraw; positive indicates deposit, negative withdraw + /// sizeDelta: denoted in market currency (i.e. ETH, BTC, etc), size of Synthetix PerpsV2 position + /// targetPrice: limit or stop price target needing to be met to submit Synthetix PerpsV2 order + /// gelatoTaskId: unqiue taskId from gelato necessary for cancelling conditional orders + /// conditionalOrderType: conditional order type to determine conditional order fill logic + /// desiredFillPrice: desired price to fill Synthetix PerpsV2 order at execution time + /// reduceOnly: if true, only allows position's absolute size to decrease + struct ConditionalOrder { + bytes32 marketKey; + int256 marginDelta; + int256 sizeDelta; + uint256 targetPrice; + bytes32 gelatoTaskId; + ConditionalOrderTypes conditionalOrderType; + uint256 desiredFillPrice; + bool reduceOnly; + } + /// @dev see example below elucidating targtPrice vs desiredFillPrice: + /// 1. targetPrice met (ex: targetPrice = X) + /// 2. account submits delayed order to Synthetix PerpsV2 with desiredFillPrice = Y + /// 3. keeper executes Synthetix PerpsV2 order after delay period + /// 4. if current market price defined by Synthetix PerpsV2 + /// after delay period satisfies desiredFillPrice order is filled + + /*////////////////////////////////////////////////////////////// + ERRORS + //////////////////////////////////////////////////////////////*/ + + /// @notice thrown when commands length does not equal inputs length + error LengthMismatch(); + + /// @notice thrown when Command given is not valid + error InvalidCommandType(uint256 commandType); + + /// @notice thrown when conditional order type given is not valid due to zero sizeDelta + error ZeroSizeDelta(); + + /// @notice exceeds useable margin + /// @param available: amount of useable margin asset + /// @param required: amount of margin asset required + error InsufficientFreeMargin(uint256 available, uint256 required); + + /// @notice call to transfer ETH on withdrawal fails + error EthWithdrawalFailed(); + + /// @notice base price from the oracle was invalid + /// @dev Rate can be invalid either due to: + /// 1. Returned as invalid from ExchangeRates - due to being stale or flagged by oracle + /// 2. Out of deviation bounds w.r.t. to previously stored rate + /// 3. if there is no valid stored rate, w.r.t. to previous 3 oracle rates + /// 4. Price is zero + error InvalidPrice(); + + /// @notice thrown when account execution has been disabled in the settings contract + error AccountExecutionDisabled(); + + /// @notice thrown when a call attempts to reenter the protected function + error Reentrancy(); + + /// @notice thrown when token swap attempted with invalid token (i.e. token that is not whitelisted) + /// @param tokenIn: token attempting to swap from + /// @param tokenOut: token attempting to swap to + error TokenSwapNotAllowed(address tokenIn, address tokenOut); + + /// @notice thrown when a conditional order is attempted to be executed during invalid market conditions + /// @param conditionalOrderId: conditional order id + /// @param executor: address of executor + error CannotExecuteConditionalOrder( + uint256 conditionalOrderId, address executor + ); + + /// @notice thrown when a conditional order is attempted to be executed but SM account cannot pay fee + /// @param executorFee: fee required to execute conditional order + error CannotPayExecutorFee(uint256 executorFee, address executor); + + /// @notice thrown when call to set/updates the min keeper fee fails + error SetMinKeeperFeeFailed(); + + /*////////////////////////////////////////////////////////////// + VIEWS + //////////////////////////////////////////////////////////////*/ + + /// @notice returns the version of the Account + function VERSION() external view returns (bytes32); + + /// @return returns the amount of margin locked for future events (i.e. conditional orders) + function committedMargin() external view returns (uint256); + + /// @return returns current conditional order id + function conditionalOrderId() external view returns (uint256); + + /// @notice get delayed order data from Synthetix PerpsV2 + /// @dev call reverts if _marketKey is invalid + /// @param _marketKey: key for Synthetix PerpsV2 Market + /// @return delayed order struct defining delayed order (will return empty struct if no delayed order exists) + function getDelayedOrder(bytes32 _marketKey) + external + returns (IPerpsV2MarketConsolidated.DelayedOrder memory); + + /// @notice checker() is the Resolver for Gelato + /// (see https://docs.gelato.network/developer-services/automate/guides/custom-logic-triggers/smart-contract-resolvers) + /// @notice signal to a keeper that a conditional order is valid/invalid for execution + /// @dev call reverts if conditional order Id does not map to a valid conditional order; + /// ConditionalOrder.marketKey would be invalid + /// @param _conditionalOrderId: key for an active conditional order + /// @return canExec boolean that signals to keeper a conditional order can be executed by Gelato + /// @return execPayload calldata for executing a conditional order + function checker(uint256 _conditionalOrderId) + external + view + returns (bool canExec, bytes memory execPayload); + + /// @notice the current withdrawable or usable balance + /// @return free margin amount + function freeMargin() external view returns (uint256); + + /// @notice get up-to-date position data from Synthetix PerpsV2 + /// @param _marketKey: key for Synthetix PerpsV2 Market + /// @return position struct defining current position + function getPosition(bytes32 _marketKey) + external + returns (IPerpsV2MarketConsolidated.Position memory); + + /// @notice conditional order id mapped to conditional order + /// @param _conditionalOrderId: id of conditional order + /// @return conditional order + function getConditionalOrder(uint256 _conditionalOrderId) + external + view + returns (ConditionalOrder memory); + + /*////////////////////////////////////////////////////////////// + MUTATIVE + //////////////////////////////////////////////////////////////*/ + + /// @notice sets the initial owner of the account + /// @dev only called once by the factory on account creation + /// @param _owner: address of the owner + function setInitialOwnership(address _owner) external; + + /// @notice executes commands along with provided inputs + /// @param _commands: array of commands, each represented as an enum + /// @param _inputs: array of byte strings containing abi encoded inputs for each command + function execute(Command[] calldata _commands, bytes[] calldata _inputs) + external + payable; + + /// @notice execute queued conditional order + /// @dev currently only supports conditional order submission via PERPS_V2_SUBMIT_OFFCHAIN_DELAYED_ORDER COMMAND + /// @param _conditionalOrderId: key for an active conditional order + function executeConditionalOrder(uint256 _conditionalOrderId) external; +} From 346e1eebeaa875698415b1f9ea6f348f84558dd9 Mon Sep 17 00:00:00 2001 From: JaredBorders Date: Tue, 26 Sep 2023 17:44:36 -0400 Subject: [PATCH 08/15] =?UTF-8?q?=E2=9C=A8=20Prettify?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/upgrades/v2.1.1/Upgrade.t.sol | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/upgrades/v2.1.1/Upgrade.t.sol b/test/upgrades/v2.1.1/Upgrade.t.sol index 21e1da73..5cbd9396 100644 --- a/test/upgrades/v2.1.1/Upgrade.t.sol +++ b/test/upgrades/v2.1.1/Upgrade.t.sol @@ -131,8 +131,7 @@ contract UpgradeTest is Test { * VERIFY VERSION DID CHANGE */ - (, response) = - activeAccount.call(abi.encodeWithSignature("VERSION()")); + (, response) = activeAccount.call(abi.encodeWithSignature("VERSION()")); (bytes32 version) = abi.decode(response, (bytes32)); assertEq(version, "2.1.1", "wrong version"); From 8f7e7cd77f27f8f4e79b09a54bcb153afba6339e Mon Sep 17 00:00:00 2001 From: JaredBorders Date: Tue, 26 Sep 2023 17:45:41 -0400 Subject: [PATCH 09/15] =?UTF-8?q?=F0=9F=93=B8=20Update=20gas-snapshot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gas-snapshot | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/.gas-snapshot b/.gas-snapshot index bdf034df..881bab8a 100644 --- a/.gas-snapshot +++ b/.gas-snapshot @@ -52,7 +52,7 @@ AccountTest:test_GetTokenInTokenOut_Multi_Pool() (gas: 11453) AccountTest:test_GetTokenInTokenOut_Single_Pool() (gas: 7468) AccountTest:test_GetTrackingCode() (gas: 5554) AccountTest:test_GetVerison() (gas: 16130) -AccountTest:test_IsSameSign(int256,int256) (runs: 256, μ: 6233, ~: 6081) +AccountTest:test_IsSameSign(int256,int256) (runs: 256, μ: 6232, ~: 6081) AccountTest:test_NonReentrant_Locked() (gas: 31079) AccountTest:test_NonReentrant_Unlocked() (gas: 460695) AccountTest:test_Ownership_Transfer() (gas: 96233) @@ -108,8 +108,8 @@ FactoryTest:test_NewAccount_State() (gas: 323401) FactoryTest:test_Ownership_NonAccount() (gas: 10980) FactoryTest:test_Ownership_Transfer() (gas: 13152) FactoryTest:test_UpdateAccountOwnership_AccountDoesNotExist() (gas: 11402) -FactoryTest:test_UpdateAccountOwnership_NewOwner_MultipleAccount(uint256) (runs: 256, μ: 498160, ~: 347341) -FactoryTest:test_UpdateAccountOwnership_OldOwner_MultipleAccount(uint256) (runs: 256, μ: 805463, ~: 659300) +FactoryTest:test_UpdateAccountOwnership_NewOwner_MultipleAccount(uint256) (runs: 256, μ: 492146, ~: 347341) +FactoryTest:test_UpdateAccountOwnership_OldOwner_MultipleAccount(uint256) (runs: 256, μ: 795114, ~: 659300) FactoryTest:test_UpdateAccountOwnership_OldOwner_SingleAccount() (gas: 344143) FactoryTest:test_Upgrade_Implementation() (gas: 1034722) FactoryTest:test_Upgrade_Implementation_Event() (gas: 13041) @@ -123,8 +123,8 @@ MarginBehaviorTest:test_Commands_CancelOffchainDelayedOrder() (gas: 1525694) MarginBehaviorTest:test_Commands_CancelOffchainDelayedOrder_NoneExists() (gas: 291382) MarginBehaviorTest:test_Commands_ClosePosition() (gas: 1673609) MarginBehaviorTest:test_Commands_ClosePositionWhen_NoneExists() (gas: 390785) -MarginBehaviorTest:test_Commands_ModifyMarginInMarket_ExistingMarginInMarket(int256) (runs: 256, μ: 776662, ~: 715482) -MarginBehaviorTest:test_Commands_ModifyMarginInMarket_NoExistingMarginInMarket(int256) (runs: 256, μ: 330306, ~: 242803) +MarginBehaviorTest:test_Commands_ModifyMarginInMarket_ExistingMarginInMarket(int256) (runs: 256, μ: 777290, ~: 715482) +MarginBehaviorTest:test_Commands_ModifyMarginInMarket_NoExistingMarginInMarket(int256) (runs: 256, μ: 329037, ~: 242803) MarginBehaviorTest:test_Commands_SetMinKeeperFee() (gas: 242574) MarginBehaviorTest:test_Commands_SetMinKeeperFee_Fails() (gas: 52897) MarginBehaviorTest:test_Commands_SubmitAtomicOrder() (gas: 1303439) @@ -137,10 +137,10 @@ MarginBehaviorTest:test_Commands_SubmitOffchainDelayedOrder() (gas: 1467970) MarginBehaviorTest:test_Commands_WithdrawAllMarginFromMarket_ExistingMarginInMarket() (gas: 923020) MarginBehaviorTest:test_Commands_WithdrawAllMarginFromMarket_NoExistingMarginInMarket() (gas: 501516) MarginBehaviorTest:test_Deposit_ETH() (gas: 22856) -MarginBehaviorTest:test_Deposit_Margin(uint256) (runs: 256, μ: 230553, ~: 248181) +MarginBehaviorTest:test_Deposit_Margin(uint256) (runs: 256, μ: 229860, ~: 248181) MarginBehaviorTest:test_Execute_InputCommandDifferingLengths() (gas: 224292) MarginBehaviorTest:test_Scenario_1() (gas: 1487208) -MarginBehaviorTest:test_Withdraw_Eth(uint256) (runs: 256, μ: 60815, ~: 66431) +MarginBehaviorTest:test_Withdraw_Eth(uint256) (runs: 256, μ: 60938, ~: 66431) MarginBehaviorTest:test_Withdraw_Margin(int256) (runs: 256, μ: 266462, ~: 241968) OrderGelatoBehaviorTest:test_CancelConditionalOrder_Event() (gas: 325505) OrderGelatoBehaviorTest:test_CancelConditionalOrder_Invalid_NotOwner() (gas: 36633) @@ -175,15 +175,15 @@ OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Limit_Invalid_Long(uint256) ( OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Limit_Invalid_Short(uint256) (runs: 256, μ: 440008, ~: 440008) OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Limit_Valid_Event(int256) (runs: 256, μ: 380208, ~: 380208) OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Limit_Valid_Long(uint256) (runs: 256, μ: 439987, ~: 439987) -OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Limit_Valid_Short(uint256) (runs: 256, μ: 438270, ~: 439981) +OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Limit_Valid_Short(uint256) (runs: 256, μ: 438348, ~: 439981) OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Limit_Valid_State(int256) (runs: 256, μ: 374312, ~: 374312) OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Stop_Invalid_Long(uint256) (runs: 256, μ: 459953, ~: 459953) -OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Stop_Invalid_Short(uint256) (runs: 256, μ: 458277, ~: 459988) +OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Stop_Invalid_Short(uint256) (runs: 256, μ: 458355, ~: 459988) OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Stop_Valid_Long(uint256) (runs: 256, μ: 458212, ~: 459923) OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Stop_Valid_Short(uint256) (runs: 256, μ: 459981, ~: 459981) OrderGelatoBehaviorTest:test_PlaceConditionalOrder_Valid_GelatoTaskId() (gas: 374904) -OrderGelatoBehaviorTest:test_ReduceOnlyOrder_Valid_Long(int256) (runs: 256, μ: 1680699, ~: 1412659) -OrderGelatoBehaviorTest:test_ReduceOnlyOrder_Valid_Short(int256) (runs: 256, μ: 1995339, ~: 2244992) +OrderGelatoBehaviorTest:test_ReduceOnlyOrder_Valid_Long(int256) (runs: 256, μ: 1677446, ~: 1412659) +OrderGelatoBehaviorTest:test_ReduceOnlyOrder_Valid_Short(int256) (runs: 256, μ: 1988908, ~: 2244992) OrderGelatoBehaviorTest:test_ReduceOnlyOrder_Valid_State() (gas: 2271305) OrderGelatoBehaviorTest:test_ReduceOnlyOrder_Valid_Synthetix() (gas: 2286447) OrderPublicBehaviorTest:test_ExecuteConditionalOrder_Public() (gas: 1405271) @@ -220,4 +220,6 @@ SwapBehaviorTest:test_UniswapV3Swap_SUSD_DAI() (gas: 515632) SwapBehaviorTest:test_UniswapV3Swap_SUSD_DAI_Event() (gas: 510651) SwapBehaviorTest:test_UniswapV3Swap_SUSD_DAI_USDC() (gas: 603817) UpgradeTest:test_Deployed_Account_Version() (gas: 16468) -UpgradeTest:test_Upgrade() (gas: 86517) \ No newline at end of file +UpgradeTest:test_Deployed_Account_Version() (gas: 16468) +UpgradeTest:test_Upgrade() (gas: 86517) +UpgradeTest:test_Upgrade() (gas: 89278) \ No newline at end of file From c2e90d982e83058afb1dbca879a926a5a3cea339 Mon Sep 17 00:00:00 2001 From: JaredBorders Date: Wed, 27 Sep 2023 16:22:26 -0400 Subject: [PATCH 10/15] =?UTF-8?q?=F0=9F=93=9A=20Update=20comment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Account.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Account.sol b/src/Account.sol index a7de4cd2..693d0ae7 100644 --- a/src/Account.sol +++ b/src/Account.sol @@ -488,6 +488,7 @@ contract Account is IAccount, Auth, OpsReady { _cancelConditionalOrder({_conditionalOrderId: orderId}); } } else if (commandIndex == 16) { + /// @dev command indices 14 and 15 have already been checked // Command.PERPS_V2_SET_MIN_KEEPER_FEE if (!PERPS_V2_DYNAMIC_FEES_MODULE.setMinKeeperFee()) { revert SetMinKeeperFeeFailed(); From 78e30b272ea64b040780760143090804c5e87064 Mon Sep 17 00:00:00 2001 From: JaredBorders Date: Mon, 2 Oct 2023 14:58:34 -0400 Subject: [PATCH 11/15] =?UTF-8?q?=F0=9F=8F=85=20v2.1.1=20Audit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...-9 | Macro Audits | The 0xMacro Library.pdf | Bin 0 -> 145540 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 audits/v2.1.1/Kwenta A-9 | Macro Audits | The 0xMacro Library.pdf diff --git a/audits/v2.1.1/Kwenta A-9 | Macro Audits | The 0xMacro Library.pdf b/audits/v2.1.1/Kwenta A-9 | Macro Audits | The 0xMacro Library.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c657b0c56ce8da7f80e6e7094ce2022656dc8b56 GIT binary patch literal 145540 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 W+wLD9UJ%;>fZ349$%Ukak^UDM;4-KH literal 0 HcmV?d00001 From 062a8c40d72809b58503a88ef0b8693ca42196c8 Mon Sep 17 00:00:00 2001 From: JaredBorders Date: Mon, 2 Oct 2023 15:03:12 -0400 Subject: [PATCH 12/15] =?UTF-8?q?=F0=9F=93=9A=20Update=20comment?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/upgrades/v2.1.1/Upgrade.t.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/upgrades/v2.1.1/Upgrade.t.sol b/test/upgrades/v2.1.1/Upgrade.t.sol index 5cbd9396..d40898fd 100644 --- a/test/upgrades/v2.1.1/Upgrade.t.sol +++ b/test/upgrades/v2.1.1/Upgrade.t.sol @@ -121,7 +121,7 @@ contract UpgradeTest is Test { * EXECUTE UPGRADE */ - // upgrade Active Account to v2.1.0 + // upgrade Active Account to v2.1.1 vm.prank(OPTIMISM_PDAO); Factory(OPTIMISM_FACTORY).upgradeAccountImplementation( address(NEW_IMPLEMENTATION) From 84ca96c1fb004c861f8f6f42af566dac5deee4cc Mon Sep 17 00:00:00 2001 From: JaredBorders Date: Mon, 2 Oct 2023 15:33:05 -0400 Subject: [PATCH 13/15] =?UTF-8?q?=F0=9F=9A=80=20Deploy=20Optimism=20Goerli?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy-addresses/optimism-goerli.json | 2 +- script/utils/parameters/OptimismGoerliParameters.sol | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/deploy-addresses/optimism-goerli.json b/deploy-addresses/optimism-goerli.json index b55b8b91..6270b1a2 100644 --- a/deploy-addresses/optimism-goerli.json +++ b/deploy-addresses/optimism-goerli.json @@ -1,5 +1,5 @@ { - "Account": "0x0fCeF9608B9F7a8C57D53B98E78fA64b4D786a9F", + "Account": "0x5f78a5EdF0B356F50886a6829Fc02B16532e8735", "Events": "0xe32F27B27F4ea5f10f269b52223910bA83e2933C", "Factory": "0x30582eeE34719fe22b1B6c3b607636A3ab94522E", "Settings": "0x8B9CbD3da94c637c0652c680Abd3CF7f787aBAF4" diff --git a/script/utils/parameters/OptimismGoerliParameters.sol b/script/utils/parameters/OptimismGoerliParameters.sol index c863e6a1..3932ea85 100644 --- a/script/utils/parameters/OptimismGoerliParameters.sol +++ b/script/utils/parameters/OptimismGoerliParameters.sol @@ -19,19 +19,19 @@ address constant OPTIMISM_GOERLI_GELATO = address constant OPTIMISM_GOERLI_OPS = 0x255F82563b5973264e89526345EcEa766DB3baB2; -// v2.1.0 +// v2.1.1 address constant OPTIMISM_GOERLI_IMPLEMENTATION = - 0x0fCeF9608B9F7a8C57D53B98E78fA64b4D786a9F; + 0x5f78a5EdF0B356F50886a6829Fc02B16532e8735; -// released with v2.1.0 implementation +// released with v2.1.0 implementation (used by v2.1.*) address constant OPTIMISM_GOERLI_EVENTS = 0xe32F27B27F4ea5f10f269b52223910bA83e2933C; -// updated with v2.1.0 implementation +// updated with v2.1.1 implementation address constant OPTIMISM_GOERLI_FACTORY = 0x30582eeE34719fe22b1B6c3b607636A3ab94522E; -// released with v2.1.0 implementation +// released with v2.1.0 implementation (used by v2.1.*) address constant OPTIMISM_GOERLI_SETTINGS = 0x8B9CbD3da94c637c0652c680Abd3CF7f787aBAF4; From 28cf089a446d0aafc699da9ba8c3ba1aa98ef6c1 Mon Sep 17 00:00:00 2001 From: JaredBorders Date: Mon, 2 Oct 2023 15:33:16 -0400 Subject: [PATCH 14/15] =?UTF-8?q?=F0=9F=9A=80=20Deploy=20Optimism?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy-addresses/optimism.json | 2 +- script/utils/parameters/OptimismParameters.sol | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/deploy-addresses/optimism.json b/deploy-addresses/optimism.json index a7439ad9..898218e9 100644 --- a/deploy-addresses/optimism.json +++ b/deploy-addresses/optimism.json @@ -1,5 +1,5 @@ { - "Account": "0x83E13069aA457778ca349E0128927B417A2c2B3f", + "Account": "0x6B86c1A6878940666489780871E1C98B366d0aFF", "Events": "0xB753d2EE5dcA1fF39A83CA3Ec500656c31Be940b", "Factory": "0x8234F990b149Ae59416dc260305E565e5DAfEb54", "Settings": "0x865dA103d126b3Be3599D84caB57109A861F5631" diff --git a/script/utils/parameters/OptimismParameters.sol b/script/utils/parameters/OptimismParameters.sol index 459ea1b4..111bb300 100644 --- a/script/utils/parameters/OptimismParameters.sol +++ b/script/utils/parameters/OptimismParameters.sol @@ -4,7 +4,7 @@ pragma solidity 0.8.18; /// @dev for Synthetix addresses see: /// https://github.com/Synthetixio/synthetix-docs/blob/master/content/addresses.md#mainnet-optimism-l2 -// v2.1.0 deployer +// v2.1.1 deployer address constant OPTIMISM_DEPLOYER = 0xb7CefE980D41F2f83d4272526b0A0F04617da96b; address constant OPTIMISM_PDAO = 0xe826d43961a87fBE71C91d9B73F7ef9b16721C07; @@ -16,17 +16,17 @@ address constant OPTIMISM_GELATO = 0x01051113D81D7d6DA508462F2ad6d7fD96cF42Ef; address constant OPTIMISM_OPS = 0x340759c8346A1E6Ed92035FB8B6ec57cE1D82c2c; -// v2.1.0 +// v2.1.1 address constant OPTIMISM_IMPLEMENTATION = - 0x83E13069aA457778ca349E0128927B417A2c2B3f; + 0x6B86c1A6878940666489780871E1C98B366d0aFF; -// released with v2.1.0 implementation +// released with v2.1.0 implementation (used by v2.1.*) address constant OPTIMISM_EVENTS = 0xB753d2EE5dcA1fF39A83CA3Ec500656c31Be940b; -// updated with v2.1.0 implementation +// updated with v2.1.1 implementation address constant OPTIMISM_FACTORY = 0x8234F990b149Ae59416dc260305E565e5DAfEb54; -// released with v2.1.0 implementation +// released with v2.1.0 implementation (used by v2.1.*) address constant OPTIMISM_SETTINGS = 0x865dA103d126b3Be3599D84caB57109A861F5631; // key(s) used by Synthetix address resolver From 52fa848e53557078e3ea3855a7ab5ba3ea00e519 Mon Sep 17 00:00:00 2001 From: JaredBorders Date: Mon, 2 Oct 2023 15:34:29 -0400 Subject: [PATCH 15/15] =?UTF-8?q?=F0=9F=9A=80=20Deploy=20Optimism=20Goerli?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- script/utils/parameters/OptimismGoerliParameters.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/script/utils/parameters/OptimismGoerliParameters.sol b/script/utils/parameters/OptimismGoerliParameters.sol index 3932ea85..14530c53 100644 --- a/script/utils/parameters/OptimismGoerliParameters.sol +++ b/script/utils/parameters/OptimismGoerliParameters.sol @@ -27,7 +27,7 @@ address constant OPTIMISM_GOERLI_IMPLEMENTATION = address constant OPTIMISM_GOERLI_EVENTS = 0xe32F27B27F4ea5f10f269b52223910bA83e2933C; -// updated with v2.1.1 implementation +// updated with v2.1.1 implementation address constant OPTIMISM_GOERLI_FACTORY = 0x30582eeE34719fe22b1B6c3b607636A3ab94522E;