1- import { iPartialLiquidatorAbi } from "@gearbox-protocol/liquidator-v2-contracts/abi" ;
21import type { CreditAccountData } from "@gearbox-protocol/sdk" ;
3- import { ADDRESS_0X0 , formatBN , TypedObjectUtils } from "@gearbox-protocol/sdk" ;
2+ import { TypedObjectUtils } from "@gearbox-protocol/sdk" ;
43import {
54 calcLiquidatableLTs ,
65 createAnvilClient ,
76 setLTs ,
87} from "@gearbox-protocol/sdk/dev" ;
98import type { Address , SimulateContractReturnType } from "viem" ;
109
11- import { exceptionsAbis } from "../../data/index.js" ;
1210import {
1311 createPartialLiquidators ,
12+ humanizeOptimalLiquidation ,
1413 type IPartialLiquidatorContract ,
1514} from "./partial/index.js" ;
1615import SingularFullLiquidator from "./SingularFullLiquidator.js" ;
@@ -158,69 +157,30 @@ export default class SingularPartialLiquidator extends SingularLiquidator<Partia
158157 ca ,
159158 undefined ,
160159 ) ;
161- const liquidatorAddr = this . liquidatorForCA ( ca ) ;
162- if ( ! liquidatorAddr ) {
160+ const liquidatorContract = this . liquidatorForCA ( ca ) ;
161+ if ( ! liquidatorContract ) {
163162 throw new Error (
164163 `no partial liquidator contract found for account ${ ca . creditAccount } in ${ cm . name } ` ,
165164 ) ;
166165 }
167- const {
168- result : [
169- tokenOut ,
170- optimalAmount ,
171- repaidAmount ,
172- flashLoanAmount ,
173- isOptimalRepayable ,
174- ] ,
175- } = await this . client . pub . simulateContract ( {
176- account : this . client . account ,
177- abi : [ ...iPartialLiquidatorAbi , ...exceptionsAbis ] ,
178- address : liquidatorAddr ,
179- functionName : "getOptimalLiquidation" ,
180- args : [ ca . creditAccount , 10100n , priceUpdates as any ] ,
181- } ) ;
182- const [ symb , decimals , uSymb , uDec ] = [
183- this . sdk . tokensMeta . symbol ( tokenOut ) ,
184- this . sdk . tokensMeta . decimals ( tokenOut ) ,
185- this . sdk . tokensMeta . symbol ( cm . underlying ) ,
186- this . sdk . tokensMeta . decimals ( cm . underlying ) ,
187- ] ;
166+ const optimalLiquidation = await liquidatorContract . getOptimalLiquidation (
167+ ca . creditAccount ,
168+ priceUpdates ,
169+ ) ;
188170 logger . debug (
189- {
190- tokenOut : `${ symb } (${ tokenOut } )` ,
191- optimalAmount :
192- formatBN ( optimalAmount , decimals ) + ` ${ symb } (${ optimalAmount } )` ,
193- flashLoanAmount :
194- formatBN ( flashLoanAmount , uDec ) + ` ${ uSymb } (${ flashLoanAmount } )` ,
195- repaidAmount :
196- formatBN ( repaidAmount , uDec ) + ` ${ uSymb } (${ repaidAmount } )` ,
197- isOptimalRepayable,
198- } ,
171+ humanizeOptimalLiquidation ( cm , optimalLiquidation ) ,
199172 "found optimal liquidation" ,
200173 ) ;
201- const connectors = this . sdk
202- . routerFor ( cm )
203- . getAvailableConnectors ( cm . creditManager . collateralTokens ) ;
204174
205175 try {
206- const { result : preview } = await this . client . pub . simulateContract ( {
207- account : ADDRESS_0X0 ,
208- address : liquidatorAddr ,
209- abi : [ ...iPartialLiquidatorAbi , ...exceptionsAbis ] ,
210- functionName : "previewPartialLiquidation" ,
211- args : [
212- ca . creditManager ,
213- ca . creditAccount ,
214- tokenOut ,
215- optimalAmount ,
216- flashLoanAmount ,
217- priceUpdates ,
218- connectors ,
219- BigInt ( this . config . slippage ) ,
220- ] ,
221- } ) ;
176+ const preview = await liquidatorContract . previewPartialLiquidation (
177+ ca ,
178+ cm ,
179+ optimalLiquidation ,
180+ priceUpdates ,
181+ ) ;
222182 if ( preview . profit < 0n ) {
223- if ( isOptimalRepayable ) {
183+ if ( optimalLiquidation . isOptimalRepayable ) {
224184 throw new Error ( "optimal liquidation is not profitable or errored" ) ;
225185 } else {
226186 throw new Error (
@@ -229,19 +189,19 @@ export default class SingularPartialLiquidator extends SingularLiquidator<Partia
229189 }
230190 }
231191 return {
232- assetOut : tokenOut as Address ,
233- amountOut : optimalAmount ,
234- flashLoanAmount,
192+ assetOut : optimalLiquidation . tokenOut ,
193+ amountOut : optimalLiquidation . optimalAmount ,
194+ flashLoanAmount : optimalLiquidation . flashLoanAmount ,
235195 priceUpdates,
236196 calls : preview . calls . map ( c => ( {
237197 callData : c . callData ,
238198 target : c . target ,
239199 } ) ) ,
240200 underlyingBalance : preview . profit ,
241- skipOnFailure : ! isOptimalRepayable ,
201+ skipOnFailure : ! optimalLiquidation . isOptimalRepayable ,
242202 } ;
243203 } catch ( e ) {
244- if ( ! isOptimalRepayable ) {
204+ if ( ! optimalLiquidation . isOptimalRepayable ) {
245205 throw new Error ( `warning: ${ e } ` ) ;
246206 }
247207 throw e ;
@@ -267,27 +227,13 @@ export default class SingularPartialLiquidator extends SingularLiquidator<Partia
267227 account : CreditAccountData ,
268228 preview : PartialLiquidationPreview ,
269229 ) : Promise < SimulateContractReturnType > {
270- const liquidatorAddr = this . liquidatorForCA ( account ) ;
271- if ( ! liquidatorAddr ) {
230+ const liquidator = this . liquidatorForCA ( account ) ;
231+ if ( ! liquidator ) {
272232 throw new Error (
273233 `no partial liquidator contract found for account ${ account . creditAccount } in ${ account . creditManager } ` ,
274234 ) ;
275235 }
276- return this . client . pub . simulateContract ( {
277- account : this . client . account ,
278- address : liquidatorAddr ,
279- abi : [ ...iPartialLiquidatorAbi , ...exceptionsAbis ] ,
280- functionName : "partialLiquidateAndConvert" ,
281- args : [
282- account . creditManager ,
283- account . creditAccount ,
284- preview . assetOut ,
285- preview . amountOut ,
286- preview . flashLoanAmount ,
287- preview . priceUpdates ,
288- preview . calls ,
289- ] ,
290- } ) ;
236+ return liquidator . partialLiquidateAndConvert ( account , preview ) ;
291237 }
292238
293239 /**
@@ -316,8 +262,9 @@ export default class SingularPartialLiquidator extends SingularLiquidator<Partia
316262 * @param ca
317263 * @returns
318264 */
319- private liquidatorForCA ( ca : CreditAccountData ) : Address | undefined {
320- const contract = this . #liquidatorForCM[ ca . creditManager ] ;
321- return contract ?. address ;
265+ private liquidatorForCA (
266+ ca : CreditAccountData ,
267+ ) : IPartialLiquidatorContract | undefined {
268+ return this . #liquidatorForCM[ ca . creditManager ] ;
322269 }
323270}
0 commit comments