From 0f26123bb7eada81d7b4f8820bbf866d250d283f Mon Sep 17 00:00:00 2001 From: joey Date: Wed, 5 Jul 2023 10:40:36 +1000 Subject: [PATCH] Let call site emit MarketUpdated event to avoid emitting events from library --- .../interfaces/IAsyncOrderModule.sol | 9 ----- .../IAsyncOrderSettlementModule.sol | 2 +- .../contracts/interfaces/IMarketEvents.sol | 13 ++++++ .../modules/AsyncOrderSettlementModule.sol | 20 +++++++--- .../contracts/storage/PerpsMarket.sol | 40 ++++++++++--------- 5 files changed, 51 insertions(+), 33 deletions(-) create mode 100644 markets/perps-market/contracts/interfaces/IMarketEvents.sol diff --git a/markets/perps-market/contracts/interfaces/IAsyncOrderModule.sol b/markets/perps-market/contracts/interfaces/IAsyncOrderModule.sol index efd99b71da..5ebfd07873 100644 --- a/markets/perps-market/contracts/interfaces/IAsyncOrderModule.sol +++ b/markets/perps-market/contracts/interfaces/IAsyncOrderModule.sol @@ -27,15 +27,6 @@ interface IAsyncOrderModule { uint256 acceptablePrice ); - event MarketUpdated( - uint128 marketId, - int256 skew, - uint256 size, - int256 sizeDelta, - int256 currentFundingRate, - int256 currentFundingVelocity - ); - error OrderAlreadyCommitted(uint128 marketId, uint128 accountId); function commitOrder( diff --git a/markets/perps-market/contracts/interfaces/IAsyncOrderSettlementModule.sol b/markets/perps-market/contracts/interfaces/IAsyncOrderSettlementModule.sol index 9a2d2a10d8..012d8da767 100644 --- a/markets/perps-market/contracts/interfaces/IAsyncOrderSettlementModule.sol +++ b/markets/perps-market/contracts/interfaces/IAsyncOrderSettlementModule.sol @@ -36,7 +36,7 @@ interface IAsyncOrderSettlementModule { bytes32 trackingCode; } - function settle(uint128 marketId, uint128 accountId) external; + function settle(uint128 marketId, uint128 accountId) external view; function settlePythOrder(bytes calldata result, bytes calldata extraData) external payable; } diff --git a/markets/perps-market/contracts/interfaces/IMarketEvents.sol b/markets/perps-market/contracts/interfaces/IMarketEvents.sol new file mode 100644 index 0000000000..4e34731757 --- /dev/null +++ b/markets/perps-market/contracts/interfaces/IMarketEvents.sol @@ -0,0 +1,13 @@ +//SPDX-License-Identifier: MIT +pragma solidity >=0.8.11 <0.9.0; + +interface IMarketEvents { + event MarketUpdated( + uint128 marketId, + int256 skew, + uint256 size, + int256 sizeDelta, + int256 currentFundingRate, + int256 currentFundingVelocity + ); +} diff --git a/markets/perps-market/contracts/modules/AsyncOrderSettlementModule.sol b/markets/perps-market/contracts/modules/AsyncOrderSettlementModule.sol index dad23dd909..084a3884a5 100644 --- a/markets/perps-market/contracts/modules/AsyncOrderSettlementModule.sol +++ b/markets/perps-market/contracts/modules/AsyncOrderSettlementModule.sol @@ -18,8 +18,9 @@ import {GlobalPerpsMarket} from "../storage/GlobalPerpsMarket.sol"; import {PerpsMarketConfiguration} from "../storage/PerpsMarketConfiguration.sol"; import {SettlementStrategy} from "../storage/SettlementStrategy.sol"; import {PerpsMarketFactory} from "../storage/PerpsMarketFactory.sol"; +import {IMarketEvents} from "../interfaces/IMarketEvents.sol"; -contract AsyncOrderSettlementModule is IAsyncOrderSettlementModule { +contract AsyncOrderSettlementModule is IAsyncOrderSettlementModule, IMarketEvents { using DecimalMath for int256; using DecimalMath for uint256; using DecimalMath for int64; @@ -37,7 +38,7 @@ contract AsyncOrderSettlementModule is IAsyncOrderSettlementModule { int256 public constant PRECISION = 18; - function settle(uint128 marketId, uint128 accountId) external { + function settle(uint128 marketId, uint128 accountId) external view { GlobalPerpsMarket.load().checkLiquidation(accountId); ( AsyncOrder.Data storage order, @@ -137,9 +138,18 @@ contract AsyncOrderSettlementModule is IAsyncOrderSettlementModule { // all gets deposited below with fees } - // after pnl is realized, update position - PerpsMarket.Data storage market = PerpsMarket.loadValid(runtime.marketId); - market.updatePositionData(runtime.accountId, newPosition); + // after pnl is realized, update position on the perps market, this will also update the position. + PerpsMarket.MarketUpdateData memory updateData = PerpsMarket + .loadValid(runtime.marketId) + .updatePositionData(runtime.accountId, newPosition); + emit MarketUpdated( + updateData.marketId, + updateData.skew, + updateData.size, + updateData.sizeDelta, + updateData.currentFundingRate, + updateData.currentFundingVelocity + ); perpsAccount.updatePositionMarkets(runtime.marketId, runtime.newPositionSize); perpsAccount.deductFromAccount(totalFees); diff --git a/markets/perps-market/contracts/storage/PerpsMarket.sol b/markets/perps-market/contracts/storage/PerpsMarket.sol index 604a3f885c..c977b43fa0 100644 --- a/markets/perps-market/contracts/storage/PerpsMarket.sol +++ b/markets/perps-market/contracts/storage/PerpsMarket.sol @@ -30,15 +30,6 @@ library PerpsMarket { error PriceFeedNotSet(uint128 marketId); - event MarketUpdated( - uint128 marketId, - int256 skew, - uint256 size, - int256 sizeDelta, - int256 currentFundingRate, - int256 currentFundingVelocity - ); - struct Data { address owner; address nominatedOwner; @@ -142,11 +133,23 @@ library PerpsMarket { } } + struct MarketUpdateData { + uint128 marketId; + int256 skew; + uint256 size; + int256 sizeDelta; + int256 currentFundingRate; + int256 currentFundingVelocity; + } + + /** + * @dev If you call this method, please ensure you emit an event so offchain solution can index market state history properly + */ function updatePositionData( Data storage self, uint128 accountId, Position.Data memory newPosition - ) internal { + ) internal returns (MarketUpdateData memory) { Position.Data storage oldPosition = self.positions[accountId]; int128 oldPositionSize = oldPosition.size; @@ -155,14 +158,15 @@ library PerpsMarket { oldPosition.updatePosition(newPosition); int128 sizeDelta = newPosition.size - oldPositionSize; // TODO add current market debt - emit MarketUpdated( - self.id, - self.skew, - self.size, - sizeDelta, - currentFundingRate(self), - currentFundingVelocity(self) - ); + return + MarketUpdateData( + self.id, + self.skew, + self.size, + sizeDelta, + self.lastFundingRate, + currentFundingVelocity(self) + ); } function loadWithVerifiedOwner(