Skip to content

Commit

Permalink
accrued funding remove hard code
Browse files Browse the repository at this point in the history
  • Loading branch information
sunnyvempati committed Jul 4, 2023
1 parent 9fa0cde commit 3db5319
Showing 1 changed file with 84 additions and 44 deletions.
128 changes: 84 additions & 44 deletions markets/perps-market/test/integration/Position/Funding.test.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,15 @@
import { DEFAULT_SETTLEMENT_STRATEGY, PerpsMarket, bn, bootstrapMarkets } from '../bootstrap';
import { openPosition } from '../helpers';
import Wei, { wei } from '@synthetixio/wei';
import { fastForwardTo } from '@synthetixio/core-utils/utils/hardhat/rpc';
import assertBn from '@synthetixio/core-utils/utils/assertions/assert-bignumber';

const SECONDS_IN_DAY = 24 * 60 * 60;
const _SECONDS_IN_DAY = 24 * 60 * 60;

const _SKEW_SCALE = bn(10_000);
const _MAX_FUNDING_VELOCITY = bn(3);
const _TRADER_SIZE = bn(20);
const _ETH_PRICE = bn(2000);

describe('Position - funding', () => {
const { systems, perpsMarkets, provider, trader1, trader2, keeper } = bootstrapMarkets({
Expand All @@ -12,8 +18,8 @@ describe('Position - funding', () => {
{
name: 'Ether',
token: 'snxETH',
price: bn(2000),
fundingParams: { skewScale: bn(10_000), maxFundingVelocity: bn(3) },
price: _ETH_PRICE,
fundingParams: { skewScale: _SKEW_SCALE, maxFundingVelocity: bn(3) },
},
],
traderAccountIds: [2, 3],
Expand All @@ -40,7 +46,7 @@ describe('Position - funding', () => {
accountId: 2,
keeper: keeper(),
marketId: ethMarket.marketId(),
sizeDelta: bn(20),
sizeDelta: _TRADER_SIZE,
settlementStrategyId: ethMarket.strategyId(),
price: bn(2000),
});
Expand All @@ -64,48 +70,82 @@ describe('Position - funding', () => {
*/

[
{ daysElapsed: 1, newOrderSize: bn(-60), expectedAccruedFunding: bn(-120) },
{ daysElapsed: 2, newOrderSize: bn(15), expectedAccruedFunding: bn(-120) },
{ daysElapsed: 2.25, newOrderSize: bn(37), expectedAccruedFunding: bn(-50.63) },
{ daysElapsed: 4.25, newOrderSize: bn(-17), expectedAccruedFunding: bn(291.38) },
{ daysElapsed: 4.45, newOrderSize: bn(155), expectedAccruedFunding: bn(297.98) },
{ daysElapsed: 4.55, newOrderSize: bn(-150), expectedAccruedFunding: bn(292.88) },
{ daysElapsed: 4.65, newOrderSize: bn(-15), expectedAccruedFunding: bn(278.78) },
{ daysElapsed: 4.68, newOrderSize: bn(-4), expectedAccruedFunding: bn(274.63) },
{ daysElapsed: 7.68, newOrderSize: bn(19), expectedAccruedFunding: bn(893.83) },
].forEach(({ daysElapsed, newOrderSize, expectedAccruedFunding }) => {
describe(`after ${daysElapsed} days`, () => {
before('move time', async () => {
await fastForwardTo(
openPositionTime -
// this enables the market summary check to be as close as possible to the settlement time
(DEFAULT_SETTLEMENT_STRATEGY.settlementDelay - 1) + // settlement strategy delay accounted for
SECONDS_IN_DAY * daysElapsed,
provider()
);
});
{ daysElapsed: 1, newOrderSize: bn(-60) },
{ daysElapsed: 1, newOrderSize: bn(15) },
{ daysElapsed: 0.25, newOrderSize: bn(37) },
{ daysElapsed: 2, newOrderSize: bn(-17) },
{ daysElapsed: 0.2, newOrderSize: bn(155) },
{ daysElapsed: 0.1, newOrderSize: bn(-150) },
{ daysElapsed: 0.1, newOrderSize: bn(-15) },
{ daysElapsed: 0.03, newOrderSize: bn(-4) },
{ daysElapsed: 3, newOrderSize: bn(19) },
].reduce(
(
{ prevFrVelocity, prevFundingRate, prevAccruedFunding, prevSkew, accDaysElapsed },
{ daysElapsed, newOrderSize }
) => {
accDaysElapsed += daysElapsed;

// ACCRUED FUNDING CALC ----------------------------------------------
const currentSkew = prevSkew.add(newOrderSize);
const frVelocity = wei(currentSkew).div(_SKEW_SCALE).mul(_MAX_FUNDING_VELOCITY);
const fundingRate = prevFrVelocity.mul(daysElapsed).add(prevFundingRate);
const expectedAccruedFunding = Wei.avg(wei(prevFundingRate), wei(fundingRate))
.mul(_TRADER_SIZE)
.mul(_ETH_PRICE)
.mul(daysElapsed)
.add(prevAccruedFunding);
// END ACCRUED FUNDING CALC -------------------------------------------

before('trader2 moves skew', async () => {
await openPosition({
systems,
provider,
trader: trader2(),
accountId: 3,
keeper: trader2(),
marketId: ethMarket.marketId(),
sizeDelta: newOrderSize,
settlementStrategyId: ethMarket.strategyId(),
price: bn(2000),
describe(`after ${daysElapsed} days`, () => {
before('move time', async () => {
await fastForwardTo(
openPositionTime -
// this enables the market summary check to be as close as possible to the settlement time
(DEFAULT_SETTLEMENT_STRATEGY.settlementDelay - 1) + // settlement strategy delay accounted for
_SECONDS_IN_DAY * accDaysElapsed,
provider()
);
});

before('trader2 moves skew', async () => {
await openPosition({
systems,
provider,
trader: trader2(),
accountId: 3,
keeper: trader2(),
marketId: ethMarket.marketId(),
sizeDelta: newOrderSize,
settlementStrategyId: ethMarket.strategyId(),
price: bn(2000),
});
});
});

it('funding accrued is correct', async () => {
const [, accruedFunding] = await systems().PerpsMarket.getOpenPosition(
2,
ethMarket.marketId()
);
assertBn.near(accruedFunding, expectedAccruedFunding, bn(0.1));
it('funding accrued is correct', async () => {
const [, accruedFunding] = await systems().PerpsMarket.getOpenPosition(
2,
ethMarket.marketId()
);
// using negative value because trader pnl
assertBn.near(accruedFunding, expectedAccruedFunding.mul(-1).toBN(), bn(0.1));
});
});
});
});

return {
prevFrVelocity: frVelocity,
prevFundingRate: fundingRate,
prevAccruedFunding: expectedAccruedFunding,
prevSkew: currentSkew,
accDaysElapsed,
};
},
{
prevFrVelocity: wei(0.006),
prevFundingRate: wei(0),
prevAccruedFunding: wei(0),
prevSkew: wei(20),
accDaysElapsed: 0,
}
);
});

0 comments on commit 3db5319

Please sign in to comment.