Skip to content

Commit

Permalink
fix pid bug
Browse files Browse the repository at this point in the history
  • Loading branch information
kbrizzle committed Jul 18, 2023
1 parent 72b2f3b commit 96390d0
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 32 deletions.
10 changes: 3 additions & 7 deletions packages/perennial/contracts/Market.sol
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ contract Market is IMarket, Instance {
function _loadCurrentPositionContext(
Context memory context,
address account
) private returns (PositionContext memory positionContext) {
) private view returns (PositionContext memory positionContext) {
positionContext.global = _pendingPosition[context.global.currentId].read();
positionContext.local = _pendingPositions[account][context.local.currentId].read();
if (context.global.currentId == context.latestPosition.global.id)
Expand Down Expand Up @@ -566,18 +566,14 @@ contract Market is IMarket, Instance {

if (
!protected &&
!context.marketParameter.closed &&
(!context.marketParameter.makerCloseAlways) &&
(!context.marketParameter.takerCloseAlways || newOrder.increasesTaker()) &&
newOrder.liquidityCheckApplicable(context.marketParameter) &&
newOrder.efficiency.lt(Fixed6Lib.ZERO) &&
context.currentPosition.global.efficiency().lt(context.riskParameter.efficiencyLimit)
) { if (LOG_REVERTS) console.log("MarketEfficiencyUnderLimitError"); revert MarketEfficiencyUnderLimitError(); }

if (
!protected &&
!context.marketParameter.closed &&
(!context.marketParameter.makerCloseAlways) &&
(!context.marketParameter.takerCloseAlways || newOrder.increasesTaker()) &&
newOrder.liquidityCheckApplicable(context.marketParameter) &&
context.currentPosition.global.socialized() &&
newOrder.decreasesLiquidity()
) { if (LOG_REVERTS) console.log("MarketInsufficientLiquidityError"); revert MarketInsufficientLiquidityError(); }
Expand Down
9 changes: 9 additions & 0 deletions packages/perennial/contracts/types/Order.sol
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,15 @@ library OrderLib {
return self.maker.lt(self.net);
}

function liquidityCheckApplicable(
Order memory self,
MarketParameter memory marketParameter
) internal pure returns (bool) {
return !marketParameter.closed &&
!marketParameter.makerCloseAlways &&
(!marketParameter.takerCloseAlways || increasesTaker(self));
}

function isEmpty(Order memory self) internal pure returns (bool) {
return self.maker.add(self.long).add(self.short).isZero();
}
Expand Down
59 changes: 40 additions & 19 deletions packages/perennial/contracts/types/Version.sol
Original file line number Diff line number Diff line change
Expand Up @@ -88,20 +88,38 @@ library VersionLib {
if (marketParameter.closed) return (values, UFixed6Lib.ZERO);

// accumulate position
(values.positionFeeMaker, values.positionFeeFee) = _accumulatePositionFee(self, fromPosition, toPosition, marketParameter);
(values.positionFeeMaker, values.positionFeeFee) =
_accumulatePositionFee(self, fromPosition, toPosition, marketParameter);

// accumulate funding
_FundingValues memory fundingValues = _accumulateFunding(self, global, fromPosition, fromOracleVersion, toOracleVersion, marketParameter, riskParameter);
(values.fundingMaker, values.fundingLong, values.fundingShort, values.fundingFee) = (fundingValues.fundingMaker, fundingValues.fundingLong, fundingValues.fundingShort, fundingValues.fundingFee);
_FundingValues memory fundingValues = _accumulateFunding(
self,
global,
fromPosition,
toPosition,
fromOracleVersion,
toOracleVersion,
marketParameter,
riskParameter
);
(values.fundingMaker, values.fundingLong, values.fundingShort, values.fundingFee) = (
fundingValues.fundingMaker,
fundingValues.fundingLong,
fundingValues.fundingShort,
fundingValues.fundingFee
);

// accumulate interest
(values.interestMaker, values.interestLong, values.interestShort, values.interestFee) = _accumulateInterest(self, fromPosition, fromOracleVersion, toOracleVersion, marketParameter, riskParameter);
(values.interestMaker,values.interestLong, values.interestShort, values.interestFee) =
_accumulateInterest(self, fromPosition, fromOracleVersion, toOracleVersion, marketParameter, riskParameter);

// accumulate P&L
(values.pnlMaker, values.pnlLong, values.pnlShort) = _accumulatePNL(self, fromPosition, fromOracleVersion, toOracleVersion);
(values.pnlMaker, values.pnlLong, values.pnlShort) =
_accumulatePNL(self, fromPosition, fromOracleVersion, toOracleVersion);

// accumulate reward
(values.rewardMaker, values.rewardLong, values.rewardShort) = _accumulateReward(self, fromPosition, fromOracleVersion, toOracleVersion, marketParameter);
(values.rewardMaker, values.rewardLong, values.rewardShort) =
_accumulateReward(self, fromPosition, fromOracleVersion, toOracleVersion, marketParameter);

// record validity
self.valid = toOracleVersion.valid;
Expand Down Expand Up @@ -151,7 +169,8 @@ library VersionLib {
function _accumulateFunding(
Version memory self,
Global memory global,
Position memory position,
Position memory fromPosition,
Position memory toPosition,
OracleVersion memory fromOracleVersion,
OracleVersion memory toOracleVersion,
MarketParameter memory marketParameter,
Expand All @@ -160,14 +179,14 @@ library VersionLib {
// Compute long-short funding rate
Fixed6 funding = global.pAccumulator.accumulate(
riskParameter.pController,
position.skew(),
toPosition.skew(),
fromOracleVersion.timestamp,
toOracleVersion.timestamp,
position.takerSocialized().mul(fromOracleVersion.price.abs())
fromPosition.takerSocialized().mul(fromOracleVersion.price.abs())
);

// Handle maker receive-only status
if (riskParameter.makerReceiveOnly && funding.sign() != position.skew().sign())
if (riskParameter.makerReceiveOnly && funding.sign() != fromPosition.skew().sign())
funding = funding.mul(Fixed6Lib.NEG_ONE);

// Initialize long and short funding
Expand All @@ -178,22 +197,24 @@ library VersionLib {
Fixed6 fundingSpread = Fixed6Lib.from(fundingValues.fundingFee).div(Fixed6Lib.from(2));

// Adjust funding with spread
(fundingValues.fundingLong, fundingValues.fundingShort) =
(fundingValues.fundingLong.sub(Fixed6Lib.from(fundingValues.fundingFee)).add(fundingSpread), fundingValues.fundingShort.sub(fundingSpread));
(fundingValues.fundingLong, fundingValues.fundingShort) = (
fundingValues.fundingLong.sub(Fixed6Lib.from(fundingValues.fundingFee)).add(fundingSpread),
fundingValues.fundingShort.sub(fundingSpread)
);

// Redirect net portion of minor's side to maker
if (position.long.gt(position.short)) {
fundingValues.fundingMaker = fundingValues.fundingShort.mul(Fixed6Lib.from(position.skew().abs()));
if (fromPosition.long.gt(fromPosition.short)) {
fundingValues.fundingMaker = fundingValues.fundingShort.mul(Fixed6Lib.from(fromPosition.skew().abs()));
fundingValues.fundingShort = fundingValues.fundingShort.sub(fundingValues.fundingMaker);
}
if (position.short.gt(position.long)) {
fundingValues.fundingMaker = fundingValues.fundingLong.mul(Fixed6Lib.from(position.skew().abs()));
if (fromPosition.short.gt(fromPosition.long)) {
fundingValues.fundingMaker = fundingValues.fundingLong.mul(Fixed6Lib.from(fromPosition.skew().abs()));
fundingValues.fundingLong = fundingValues.fundingLong.sub(fundingValues.fundingMaker);
}

self.makerValue.increment(fundingValues.fundingMaker, position.maker);
self.longValue.increment(fundingValues.fundingLong, position.long);
self.shortValue.increment(fundingValues.fundingShort, position.short);
self.makerValue.increment(fundingValues.fundingMaker, fromPosition.maker);
self.longValue.increment(fundingValues.fundingLong, fromPosition.long);
self.shortValue.increment(fundingValues.fundingShort, fromPosition.short);
}

/**
Expand Down
8 changes: 4 additions & 4 deletions packages/perennial/test/integration/core/fees.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1255,8 +1255,8 @@ describe('Fees', () => {
e => e.event === 'PositionProcessed',
)?.args as unknown as PositionProcessedEventObject

const expectedFunding = BigNumber.from('1215')
const expectedFundingFee = BigNumber.from('115') // = 1215 * .1 - 6 (due to precision loss)
const expectedFunding = BigNumber.from('819')
const expectedFundingFee = BigNumber.from('78') // = 819 * .1 - 3 (due to precision loss)
expect(accountProcessEvent.accumulationResult.collateralAmount).to.equal(expectedFunding.mul(-1))
expect(positionProcessEvent.accumulationResult.fundingFee).to.equal(expectedFundingFee)
expect(
Expand Down Expand Up @@ -1284,8 +1284,8 @@ describe('Fees', () => {
e => e.event === 'PositionProcessed',
)?.args as unknown as PositionProcessedEventObject

const expectedFunding = BigNumber.from('1214')
const expectedFundingFee = BigNumber.from('115') // = 1214 * .1 - 6 (due to precision loss)
const expectedFunding = BigNumber.from('819')
const expectedFundingFee = BigNumber.from('78') // = // = 819 * .1 - 3 (due to precision loss)
expect(accountProcessEvent.accumulationResult.collateralAmount).to.equal(expectedFunding.mul(-1))
expect(positionProcessEvent.accumulationResult.fundingFee).to.equal(expectedFundingFee)
expect(
Expand Down
1 change: 0 additions & 1 deletion packages/perennial/test/unit/market/Market.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ import {
expectPositionEq,
expectVersionEq,
parse6decimal,
Position,
} from '../../../../common/testutil/types'
import { IMarket, MarketParameterStruct, RiskParameterStruct } from '../../../types/generated/contracts/Market'
import { MilliPowerTwo__factory } from '@equilibria/perennial-v2-payoff/types/generated'
Expand Down
2 changes: 1 addition & 1 deletion packages/root-v2/contracts/PAccumulator6.sol
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ library PAccumulator6Lib {
UFixed6 notional
) internal pure returns (Fixed6 accumulated) {
(Fixed6 newValue, UFixed6 interceptTimestamp) =
controller.compute(self._value, skew, fromTimestamp, toTimestamp);
controller.compute(self._value, self._skew, fromTimestamp, toTimestamp);

// within max
accumulated = _accumulate(
Expand Down

0 comments on commit 96390d0

Please sign in to comment.