diff --git a/markets/perps-market/test/integration/Market/PerpsMarketModule.test.ts b/markets/perps-market/test/integration/Market/PerpsMarketModule.test.ts index 466435953e..83e8a94c24 100644 --- a/markets/perps-market/test/integration/Market/PerpsMarketModule.test.ts +++ b/markets/perps-market/test/integration/Market/PerpsMarketModule.test.ts @@ -2,7 +2,8 @@ import { ethers } from 'ethers'; import assertBn from '@synthetixio/core-utils/src/utils/assertions/assert-bignumber'; import { bn, bootstrapMarkets } from '../bootstrap'; import { OpenPositionData, openPosition } from '../helpers'; -import { formatEther } from 'ethers/lib/utils'; +import { wei } from '@synthetixio/wei'; +import { calculateFillPrice } from '../helpers/fillPrice'; import { snapshotCheckpoint } from '@synthetixio/core-utils/utils/mocha/snapshot'; describe('PerpsMarketModule', () => { @@ -96,29 +97,29 @@ describe('PerpsMarketModule', () => { const tests = [ { marketSkew: 0, - sizeAndExpectedPrice: [ - { size: 1, price: bn(1010), expectedPrice: bn(1010.0505) }, - { size: -1, price: bn(1010), expectedPrice: bn(1009.9495) }, + sizeAndPrice: [ + { size: 1, price: 1010 }, + { size: -1, price: 1010 }, ], }, { marketSkew: 10, - sizeAndExpectedPrice: [ - { size: 1, price: bn(1010), expectedPrice: bn(1011.0605) }, - { size: -1, price: bn(1010), expectedPrice: bn(1010.9595) }, - { size: -11, price: bn(1010), expectedPrice: bn(1010.4545) }, + sizeAndPrice: [ + { size: 1, price: 1010 }, + { size: -1, price: 1010 }, + { size: -11, price: 1010 }, ], }, { marketSkew: -10, - sizeAndExpectedPrice: [ - { size: 1, price: bn(1010), expectedPrice: bn(1009.0405) }, - { size: -1, price: bn(1010), expectedPrice: bn(1008.9395) }, - { size: 11, price: bn(1010), expectedPrice: bn(1009.5455) }, + sizeAndPrice: [ + { size: 1, price: 1010 }, + { size: -1, price: 1010 }, + { size: 11, price: 1010 }, ], }, ]; - tests.forEach(({ marketSkew, sizeAndExpectedPrice }) => { + tests.forEach(({ marketSkew, sizeAndPrice }) => { describe(`marketSkew ${marketSkew}`, () => { const restoreMarketSkew = snapshotCheckpoint(provider); before('create market skew', async () => { @@ -129,10 +130,17 @@ describe('PerpsMarketModule', () => { price: fixture.marketTokenPrice, }); }); - sizeAndExpectedPrice.forEach(({ size, price, expectedPrice }) => { - it(`fillPrice for size ${size} and price ${formatEther(price)}`, async () => { - const fillPrice = await systems().PerpsMarket.fillPrice(marketId, bn(size), price); - assertBn.equal(fillPrice, expectedPrice); + sizeAndPrice.forEach(({ size, price }) => { + it(`fillPrice for size ${size} and price ${price}`, async () => { + const fillPrice = await systems().PerpsMarket.fillPrice(marketId, bn(size), bn(price)); + const expectedFillPrice = calculateFillPrice( + wei(marketSkew), + wei(fixture.skewScale), + wei(size), + wei(price) + ).toBN(); + + assertBn.equal(fillPrice, expectedFillPrice); }); }); after('restore market skew', restoreMarketSkew); diff --git a/markets/perps-market/test/integration/Orders/OffchainAsyncOrder.settle.test.ts b/markets/perps-market/test/integration/Orders/OffchainAsyncOrder.settle.test.ts index 23f864f967..7e34c86c48 100644 --- a/markets/perps-market/test/integration/Orders/OffchainAsyncOrder.settle.test.ts +++ b/markets/perps-market/test/integration/Orders/OffchainAsyncOrder.settle.test.ts @@ -8,6 +8,7 @@ import assertBn from '@synthetixio/core-utils/utils/assertions/assert-bignumber' import assertEvent from '@synthetixio/core-utils/utils/assertions/assert-event'; import assertRevert from '@synthetixio/core-utils/utils/assertions/assert-revert'; import { getTxTime } from '@synthetixio/core-utils/src/utils/hardhat/rpc'; +import { calculateFillPrice } from '../helpers/fillPrice'; import { wei } from '@synthetixio/wei'; import { calcCurrentFundingVelocity } from '../helpers/funding-calcs'; @@ -382,10 +383,8 @@ describe('Settle Offchain Async Order test', () => { }); it('emits event settle event', async () => { - // TODO Calculate the correct fill price instead of hardcoding - const accountId = 2; - const fillPrice = bn(1000.005); + const fillPrice = calculateFillPrice(wei(0), wei(100_000), wei(1), wei(1000)).toBN(); const pnl = 0; const newPositionSize = bn(1); const totalFees = DEFAULT_SETTLEMENT_STRATEGY.settlementReward; diff --git a/markets/perps-market/test/integration/helpers/fillPrice.ts b/markets/perps-market/test/integration/helpers/fillPrice.ts new file mode 100644 index 0000000000..c66a96dd3b --- /dev/null +++ b/markets/perps-market/test/integration/helpers/fillPrice.ts @@ -0,0 +1,19 @@ +import Wei from '@synthetixio/wei'; + +// Calculates PD +const calculatePD = (skew: Wei, skewScale: Wei) => skew.div(skewScale); +// Calculates the price with pd applied +const calculateAdjustedPrice = (price: Wei, pd: Wei) => price.add(price.mul(pd)); + +export function calculateFillPrice(skew: Wei, skewScale: Wei, size: Wei, price: Wei) { + if (skewScale.eq(0)) { + return price; + } + const pdBefore = calculatePD(skew, skewScale); + const pdAfter = calculatePD(skew.add(size), skewScale); + + const priceBefore = calculateAdjustedPrice(price, pdBefore); + const priceAfter = calculateAdjustedPrice(price, pdAfter); + + return priceBefore.add(priceAfter).div(2); +}