@@ -7,12 +7,6 @@ import { ethers } from 'ethers';
7
7
const accountId = 4 ;
8
8
9
9
const synthMarketsConfig = [
10
- {
11
- name : 'btc' ,
12
- token : 'snxBTC' ,
13
- buyPrice : bn ( 20_000 ) ,
14
- sellPrice : bn ( 20_000 ) ,
15
- } ,
16
10
{
17
11
name : 'eth' ,
18
12
token : 'snxETH' ,
@@ -29,7 +23,7 @@ const orderFees = {
29
23
const ethPerpsMarketId = bn ( 26 ) ;
30
24
31
25
describe ( 'Account Debt' , ( ) => {
32
- const { systems, provider, perpsMarkets, trader1, trader2 , synthMarkets } = bootstrapMarkets ( {
26
+ const { systems, provider, perpsMarkets, trader1, synthMarkets } = bootstrapMarkets ( {
33
27
synthMarkets : synthMarketsConfig ,
34
28
perpsMarkets : [
35
29
{
@@ -53,7 +47,7 @@ describe('Account Debt', () => {
53
47
} ,
54
48
} ,
55
49
] ,
56
- traderAccountIds : [ accountId , 5 ] ,
50
+ traderAccountIds : [ accountId ] ,
57
51
liquidationGuards : {
58
52
minLiquidationReward : bn ( 0 ) ,
59
53
minKeeperProfitRatioD18 : bn ( 0 ) ,
@@ -72,31 +66,27 @@ describe('Account Debt', () => {
72
66
synthMarket : ( ) => synthMarkets ( ) [ 0 ] ,
73
67
snxUSDAmount : ( ) => bn ( 240_000 ) ,
74
68
} ,
75
- {
76
- synthMarket : ( ) => synthMarkets ( ) [ 1 ] ,
77
- snxUSDAmount : ( ) => bn ( 1_400_000 ) ,
78
- } ,
79
- ] ,
80
- } ) ;
81
-
82
- await depositCollateral ( {
83
- systems,
84
- trader : trader2 ,
85
- accountId : ( ) => 5 ,
86
- collaterals : [
87
- {
88
- synthMarket : ( ) => synthMarkets ( ) [ 0 ] ,
89
- snxUSDAmount : ( ) => bn ( 16_000 ) ,
90
- } ,
91
- {
92
- synthMarket : ( ) => synthMarkets ( ) [ 1 ] ,
93
- snxUSDAmount : ( ) => bn ( 20_000 ) ,
94
- } ,
95
69
] ,
96
70
} ) ;
97
71
} ) ;
98
72
99
73
const openAndClosePosition = ( size : Wei , startingPrice : Wei , endingPrice : Wei ) => {
74
+ const initialFillPrice = calculateFillPrice ( wei ( 0 ) , wei ( 1000 ) , size , startingPrice ) ;
75
+ const finalFillPrice = calculateFillPrice ( size , wei ( 1000 ) , size . mul ( - 1 ) , endingPrice ) ;
76
+
77
+ const openOrderFee = computeFees ( wei ( 0 ) , wei ( 50 ) , initialFillPrice , orderFees ) ;
78
+ const closeOrderFee = computeFees ( wei ( 50 ) , wei ( - 50 ) , finalFillPrice , orderFees ) ;
79
+
80
+ let synthUsedForOpenOrderFee : Wei , synthUsedForCloseOrderFee : Wei ;
81
+ before ( 'identify synth amount required to pay open order fee' , async ( ) => {
82
+ const { synthToBurn } = await systems ( ) . SpotMarket . quoteSellExactOut (
83
+ synthMarkets ( ) [ 0 ] . marketId ( ) ,
84
+ openOrderFee . totalFees ,
85
+ bn ( 0 )
86
+ ) ;
87
+ synthUsedForOpenOrderFee = wei ( synthToBurn ) ;
88
+ } ) ;
89
+
100
90
before ( `open position size ${ size . toString ( ) } ` , async ( ) => {
101
91
await perpsMarkets ( ) [ 0 ] . aggregator ( ) . mockSetCurrentPrice ( startingPrice . toBN ( ) ) ;
102
92
@@ -113,9 +103,20 @@ describe('Account Debt', () => {
113
103
} ) ;
114
104
} ) ;
115
105
116
- before ( 'close position ' , async ( ) => {
106
+ before ( 'set ending price ' , async ( ) => {
117
107
await perpsMarkets ( ) [ 0 ] . aggregator ( ) . mockSetCurrentPrice ( endingPrice . toBN ( ) ) ;
108
+ } ) ;
109
+
110
+ before ( 'identify synth amount required to pay open order fee' , async ( ) => {
111
+ const { synthToBurn } = await systems ( ) . SpotMarket . quoteSellExactOut (
112
+ synthMarkets ( ) [ 0 ] . marketId ( ) ,
113
+ closeOrderFee . totalFees ,
114
+ bn ( 0 )
115
+ ) ;
116
+ synthUsedForCloseOrderFee = wei ( synthToBurn ) ;
117
+ } ) ;
118
118
119
+ before ( 'close position' , async ( ) => {
119
120
await openPosition ( {
120
121
systems,
121
122
provider,
@@ -129,24 +130,42 @@ describe('Account Debt', () => {
129
130
} ) ;
130
131
} ) ;
131
132
132
- const initialFillPrice = calculateFillPrice ( wei ( 0 ) , wei ( 1000 ) , size , startingPrice ) ;
133
- const finalFillPrice = calculateFillPrice ( size , wei ( 1000 ) , size . mul ( - 1 ) , endingPrice ) ;
134
-
135
133
return {
136
- openOrderFee : computeFees ( wei ( 0 ) , wei ( 50 ) , initialFillPrice , orderFees ) ,
137
- closeOrderFee : computeFees ( wei ( 50 ) , wei ( - 50 ) , finalFillPrice , orderFees ) ,
134
+ openOrderFee,
135
+ closeOrderFee,
136
+ synthUsedForOpenOrderFee : ( ) => synthUsedForOpenOrderFee ,
137
+ synthUsedForCloseOrderFee : ( ) => synthUsedForCloseOrderFee ,
138
138
pnl : finalFillPrice . sub ( initialFillPrice ) . mul ( size ) ,
139
139
} ;
140
140
} ;
141
141
142
142
let currentDebt : Wei ;
143
143
describe ( 'negative pnl' , ( ) => {
144
- const { pnl : expectedPnl } = openAndClosePosition ( wei ( 50 ) , wei ( 2000 ) , wei ( 1500 ) ) ;
144
+ let startingCollateralAmount : Wei ;
145
+ before ( 'identify collateral amount' , async ( ) => {
146
+ startingCollateralAmount = wei (
147
+ await systems ( ) . PerpsMarket . getCollateralAmount ( accountId , synthMarkets ( ) [ 0 ] . marketId ( ) )
148
+ ) ;
149
+ } ) ;
150
+
151
+ const {
152
+ pnl : expectedPnl ,
153
+ synthUsedForOpenOrderFee,
154
+ synthUsedForCloseOrderFee,
155
+ } = openAndClosePosition ( wei ( 50 ) , wei ( 2000 ) , wei ( 1500 ) ) ;
145
156
146
157
it ( 'accrues correct amount of debt' , async ( ) => {
147
158
currentDebt = expectedPnl ;
148
159
assertBn . equal ( currentDebt . abs ( ) . toBN ( ) , await systems ( ) . PerpsMarket . debt ( accountId ) ) ;
149
160
} ) ;
161
+
162
+ it ( 'used collateral to pay order fees' , async ( ) => {
163
+ const synthUsedForFees = synthUsedForOpenOrderFee ( ) . add ( synthUsedForCloseOrderFee ( ) ) ;
164
+ assertBn . equal (
165
+ startingCollateralAmount . sub ( synthUsedForFees ) . toBN ( ) ,
166
+ await systems ( ) . PerpsMarket . getCollateralAmount ( accountId , synthMarkets ( ) [ 0 ] . marketId ( ) )
167
+ ) ;
168
+ } ) ;
150
169
} ) ;
151
170
152
171
describe ( 'positive pnl to lower debt' , ( ) => {
0 commit comments