@@ -1137,4 +1137,94 @@ et.testSet({
1137
1137
] ,
1138
1138
} )
1139
1139
1140
+
1141
+
1142
+
1143
+ . test ( {
1144
+ desc : "XV Liquidate self-collateral with override on self-collateral factor" ,
1145
+ dev : 1 ,
1146
+ actions : ctx => [
1147
+ { action : 'setAssetConfig' , tok : 'TST3' , config : { collateralFactor : .5 } , } ,
1148
+ { send : 'tokens.TST3.mint' , args : [ ctx . wallet2 . address , et . eth ( 200 ) ] , } ,
1149
+ { from : ctx . wallet2 , send : 'tokens.TST3.approve' , args : [ ctx . contracts . euler . address , et . MaxUint256 , ] , } ,
1150
+ { from : ctx . wallet2 , send : 'eTokens.eTST3.deposit' , args : [ 0 , et . eth ( 30 ) ] , } ,
1151
+ { from : ctx . wallet2 , send : 'markets.enterMarket' , args : [ 0 , ctx . contracts . tokens . TST3 . address ] , } ,
1152
+
1153
+
1154
+ { send : 'tokens.TST6.mint' , args : [ ctx . wallet2 . address , et . eth ( 100 ) ] , } ,
1155
+ { from : ctx . wallet2 , send : 'tokens.TST6.approve' , args : [ ctx . contracts . euler . address , et . MaxUint256 , ] , } ,
1156
+ { from : ctx . wallet2 , send : 'eTokens.eTST6.deposit' , args : [ 0 , et . eth ( 10 ) ] , } ,
1157
+ { from : ctx . wallet2 , send : 'markets.enterMarket' , args : [ 0 , ctx . contracts . tokens . TST6 . address ] , } ,
1158
+
1159
+ { send : 'governance.setOverride' , args : [
1160
+ ctx . contracts . tokens . TST . address ,
1161
+ ctx . contracts . tokens . TST6 . address ,
1162
+ {
1163
+ enabled : true ,
1164
+ collateralFactor : Math . floor ( 0.6 * 4e9 ) ,
1165
+ } ,
1166
+ ] , } ,
1167
+
1168
+ { from : ctx . wallet2 , send : 'eTokens.eTST.mint' , args : [ 0 , et . eth ( 45 ) ] , } ,
1169
+
1170
+ { send : 'governance.setOverride' , args : [
1171
+ ctx . contracts . tokens . TST . address ,
1172
+ ctx . contracts . tokens . TST2 . address ,
1173
+ {
1174
+ enabled : true ,
1175
+ collateralFactor : Math . floor ( 0.9 * 4e9 ) ,
1176
+ } ,
1177
+ ] , } ,
1178
+
1179
+
1180
+ { action : 'updateUniswapPrice' , pair : 'TST/WETH' , price : '7.4' , } ,
1181
+
1182
+ { send : 'governance.setOverride' , args : [
1183
+ ctx . contracts . tokens . TST . address ,
1184
+ ctx . contracts . tokens . TST . address ,
1185
+ {
1186
+ enabled : true ,
1187
+ collateralFactor : Math . floor ( 0.8 * 4e9 ) ,
1188
+ } ,
1189
+ ] , } ,
1190
+
1191
+ { call : 'exec.liquidity' , args : [ ctx . wallet2 . address ] , onResult : r => {
1192
+ et . equals ( r . collateralValue / r . liabilityValue , 0.914 , 0.001 ) ;
1193
+ } , } ,
1194
+ testDetailedLiability ( ctx , 0.914 ) ,
1195
+
1196
+ { callStatic : 'liquidation.checkLiquidation' , args : [ ctx . wallet . address , ctx . wallet2 . address , ctx . contracts . tokens . TST . address , ctx . contracts . tokens . TST . address ] ,
1197
+ onResult : r => {
1198
+ et . equals ( r . healthScore , 0.914 , 0.001 ) ;
1199
+ ctx . stash . repay = r . repay ;
1200
+ ctx . stash . yield = r . yield ;
1201
+ } ,
1202
+ } ,
1203
+
1204
+ // Successful liquidation
1205
+
1206
+ { call : 'eTokens.eTST.reserveBalanceUnderlying' , args : [ ] , equals : [ 0 , '0.000000000001' ] } ,
1207
+ { call : 'dTokens.dTST.balanceOf' , args : [ ctx . wallet2 . address ] , equals : et . eth ( '45' ) , } ,
1208
+
1209
+ { send : 'liquidation.liquidate' , args : [ ctx . wallet2 . address , ctx . contracts . tokens . TST . address , ctx . contracts . tokens . TST . address , ( ) => ctx . stash . repay , 0 ] , } ,
1210
+
1211
+ // liquidator:
1212
+ { call : 'dTokens.dTST.balanceOf' , args : [ ctx . wallet . address ] , equals : ( ) => ctx . stash . repay , } ,
1213
+ { call : 'eTokens.eTST.balanceOfUnderlying' , args : [ ctx . wallet . address ] , equals : ( ) => [ ctx . stash . yield . add ( et . eth ( 100 ) ) , '0.00001' ] , } , // 100 pre-existing depsit
1214
+
1215
+ // reserves:
1216
+ { call : 'eTokens.eTST.reserveBalanceUnderlying' , onResult : ( r ) => ctx . stash . reserves = r , } ,
1217
+
1218
+ // violator:
1219
+ { call : 'dTokens.dTST.balanceOf' , args : [ ctx . wallet2 . address ] , equals : ( ) => [ et . units ( 45 ) . sub ( ctx . stash . repay ) . add ( ctx . stash . reserves ) , '0.000000000001' ] , } ,
1220
+ { call : 'eTokens.eTST.balanceOfUnderlying' , args : [ ctx . wallet2 . address ] , equals : ( ) => [ et . units ( 45 ) . sub ( ctx . stash . yield ) , '0.000000000001' ] , } ,
1221
+
1222
+ { call : 'exec.liquidity' , args : [ ctx . wallet2 . address ] , onResult : async ( r ) => {
1223
+ let targetHealth = ( await ctx . contracts . liquidation . TARGET_HEALTH ( ) ) / 1e18 ;
1224
+ et . equals ( r . collateralValue / r . liabilityValue , targetHealth , 0.00000001 ) ;
1225
+ } } ,
1226
+ testDetailedLiability ( ctx , 1.25 ) ,
1227
+ ] ,
1228
+ } )
1229
+
1140
1230
. run ( ) ;
0 commit comments