@@ -7,7 +7,6 @@ import type {
77 CreditAccountData ,
88 CreditAccountsService ,
99 CreditSuite ,
10- GearboxSDK ,
1110 ILogger ,
1211} from "../sdk" ;
1312import {
@@ -19,6 +18,7 @@ import {
1918 ierc20Abi ,
2019 MAX_UINT256 ,
2120 PERCENTAGE_FACTOR ,
21+ SDKConstruct ,
2222 sendRawTx ,
2323} from "../sdk" ;
2424import { type AnvilClient , createAnvilClient } from "./createAnvilClient" ;
@@ -34,7 +34,7 @@ export interface TargetAccount {
3434 slippage ?: number ;
3535}
3636
37- export class AccountOpener {
37+ export class AccountOpener extends SDKConstruct {
3838 #service: CreditAccountsService ;
3939 #anvil: AnvilClient ;
4040 #logger?: ILogger ;
@@ -45,6 +45,7 @@ export class AccountOpener {
4545 service : CreditAccountsService ,
4646 options : AccountOpenerOptions = { } ,
4747 ) {
48+ super ( service . sdk ) ;
4849 this . #service = service ;
4950 this . #logger = childLogger ( "AccountOpener" , service . sdk . logger ) ;
5051 this . #anvil = createAnvilClient ( {
@@ -135,26 +136,23 @@ export class AccountOpener {
135136 } ) ;
136137 logger ?. debug ( strategy , "found open strategy" ) ;
137138 const debt = minDebt * BigInt ( leverage - 1 ) ;
138- const collateralLT = BigInt ( cm . collateralTokens [ collateral ] ) ;
139- const inUnderlying = collateral . toLowerCase ( ) === underlying . toLowerCase ( ) ;
139+ const averageQuota = this . #getCollateralQuota(
140+ cm ,
141+ collateral ,
142+ strategy . amount ,
143+ debt ,
144+ ) ;
145+ const minQuota = this . #getCollateralQuota(
146+ cm ,
147+ collateral ,
148+ strategy . minAmount ,
149+ debt ,
150+ ) ;
151+ logger ?. debug ( { averageQuota, minQuota } , "calculated quotas" ) ;
140152 const { tx, calls } = await this . #service. openCA ( {
141153 creditManager : cm . creditManager . address ,
142- averageQuota : inUnderlying
143- ? [ ]
144- : [
145- {
146- token : collateral ,
147- balance : this . #calcQuota( strategy . amount , debt , collateralLT ) ,
148- } ,
149- ] ,
150- minQuota : inUnderlying
151- ? [ ]
152- : [
153- {
154- token : collateral ,
155- balance : this . #calcQuota( strategy . minAmount , debt , collateralLT ) ,
156- } ,
157- ] ,
154+ averageQuota,
155+ minQuota,
158156 collateral : [ { token : underlying , balance : minDebt } ] ,
159157 debt,
160158 calls : strategy . calls ,
@@ -369,6 +367,38 @@ export class AccountOpener {
369367 return this . #borrower;
370368 }
371369
370+ #getCollateralQuota(
371+ cm : CreditSuite ,
372+ collateral : Address ,
373+ amount : bigint ,
374+ debt : bigint ,
375+ ) : Asset [ ] {
376+ const { underlying, collateralTokens } = cm ;
377+ const inUnderlying = collateral . toLowerCase ( ) === underlying . toLowerCase ( ) ;
378+ if ( inUnderlying ) {
379+ return [ ] ;
380+ }
381+ const collateralLT = BigInt ( collateralTokens [ collateral ] ) ;
382+ const market = this . sdk . marketRegister . findByCreditManager (
383+ cm . creditManager . address ,
384+ ) ;
385+ const quotaInfo = market . pool . pqk . quotas . mustGet ( collateral ) ;
386+ const availableQuota = quotaInfo . limit - quotaInfo . totalQuoted ;
387+ if ( availableQuota <= 0n ) {
388+ throw new Error (
389+ `quota exceeded for asset ${ this . labelAddress ( collateral ) } in ${ cm . name } ` ,
390+ ) ;
391+ }
392+ const desiredQuota = this . #calcQuota( amount , debt , collateralLT ) ;
393+
394+ return [
395+ {
396+ token : collateral ,
397+ balance : desiredQuota < availableQuota ? desiredQuota : availableQuota ,
398+ } ,
399+ ] ;
400+ }
401+
372402 #calcQuota( amount : bigint , debt : bigint , lt : bigint ) : bigint {
373403 let quota = ( amount * lt ) / PERCENTAGE_FACTOR ;
374404 quota = debt < quota ? debt : quota ;
@@ -377,8 +407,4 @@ export class AccountOpener {
377407
378408 return ( quota / PERCENTAGE_FACTOR ) * PERCENTAGE_FACTOR ;
379409 }
380-
381- private get sdk ( ) : GearboxSDK {
382- return this . #service. sdk ;
383- }
384410}
0 commit comments