@gearbox-protocol/sdk 3.0.0-next.153 → 3.0.0-next.154

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,6 +3,8 @@ import { CaTokenBalance, CreditAccountDataPayload } from "../payload/creditAccou
3
3
  import { QuotaInfo } from "../payload/creditManager";
4
4
  import { TokenData } from "../tokens/tokenData";
5
5
  import { Asset, AssetWithAmountInTarget } from "./assets";
6
+ export declare const MIN_INT96 = -39614081257132168796771975168n;
7
+ export declare const MAX_UINT256 = 115792089237316195423570985008687907853269984665640564039457584007913129639935n;
6
8
  export interface CalcOverallAPYProps {
7
9
  caAssets: Array<Asset>;
8
10
  lpAPY: LpTokensAPY | undefined;
@@ -119,6 +121,7 @@ export declare class CreditAccountData {
119
121
  hash(): string;
120
122
  static hash(creditManager: string, borrower: string): string;
121
123
  static calcHealthFactor({ assets, quotas, quotasInfo, liquidationThresholds, underlyingToken, debt, prices, }: CalcHealthFactorProps): number;
124
+ static roundUpQuota(quotaChange: bigint): bigint;
122
125
  static calcRecommendedQuota({ amount, debt, lt, quotaReserve, }: CalcRecommendedQuotaProps): bigint;
123
126
  static calcDefaultQuota({ amount, lt, quotaReserve }: CalcDefaultQuotaProps): bigint;
124
127
  static calcQuotaUpdate(props: CalcQuotaUpdateProps): CalcQuotaUpdateReturnType;
@@ -1,10 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CreditAccountData = void 0;
3
+ exports.CreditAccountData = exports.MAX_UINT256 = exports.MIN_INT96 = void 0;
4
4
  const sdk_gov_1 = require("@gearbox-protocol/sdk-gov");
5
5
  const formatter_1 = require("../utils/formatter");
6
6
  const math_1 = require("../utils/math");
7
7
  const price_1 = require("../utils/price");
8
+ exports.MIN_INT96 = -39614081257132168796771975168n;
9
+ exports.MAX_UINT256 = 115792089237316195423570985008687907853269984665640564039457584007913129639935n;
8
10
  const MAX_UINT16 = 65535;
9
11
  class CreditAccountData {
10
12
  isSuccessful;
@@ -112,10 +114,10 @@ class CreditAccountData {
112
114
  const totalPrice2 = price_1.PriceUtils.calcTotalPrice(price2, amount2, token2?.decimals);
113
115
  if (totalPrice1 === totalPrice2) {
114
116
  return amount1 === amount2
115
- ? CreditAccountData.tokensAbcComparator(token1, token2)
116
- : CreditAccountData.amountAbcComparator(amount1, amount2);
117
+ ? this.tokensAbcComparator(token1, token2)
118
+ : this.amountAbcComparator(amount1, amount2);
117
119
  }
118
- return CreditAccountData.amountAbcComparator(totalPrice1, totalPrice2);
120
+ return this.amountAbcComparator(totalPrice1, totalPrice2);
119
121
  });
120
122
  }
121
123
  static sortAssets(balances, prices, tokens) {
@@ -130,10 +132,10 @@ class CreditAccountData {
130
132
  const totalPrice2 = price_1.PriceUtils.calcTotalPrice(price2, amount2, token2?.decimals);
131
133
  if (totalPrice1 === totalPrice2) {
132
134
  return amount1 === amount2
133
- ? CreditAccountData.tokensAbcComparator(token1, token2)
134
- : CreditAccountData.amountAbcComparator(amount1, amount2);
135
+ ? this.tokensAbcComparator(token1, token2)
136
+ : this.amountAbcComparator(amount1, amount2);
135
137
  }
136
- return CreditAccountData.amountAbcComparator(totalPrice1, totalPrice2);
138
+ return this.amountAbcComparator(totalPrice1, totalPrice2);
137
139
  });
138
140
  }
139
141
  static tokensAbcComparator(t1, t2) {
@@ -227,32 +229,43 @@ class CreditAccountData {
227
229
  : 0n;
228
230
  return Number(hfInPercent);
229
231
  }
232
+ static roundUpQuota(quotaChange) {
233
+ return quotaChange !== exports.MIN_INT96
234
+ ? (quotaChange / sdk_gov_1.PERCENTAGE_FACTOR) * sdk_gov_1.PERCENTAGE_FACTOR
235
+ : quotaChange;
236
+ }
230
237
  static calcRecommendedQuota({ amount, debt, lt, quotaReserve, }) {
231
238
  const recommendedBaseQuota = math_1.BigIntMath.min(debt, (amount * lt) / sdk_gov_1.PERCENTAGE_FACTOR);
232
239
  const recommendedQuota = (recommendedBaseQuota * (sdk_gov_1.PERCENTAGE_FACTOR + quotaReserve)) /
233
240
  sdk_gov_1.PERCENTAGE_FACTOR;
234
- return recommendedQuota;
241
+ return this.roundUpQuota(recommendedQuota);
235
242
  }
236
243
  static calcDefaultQuota({ amount, lt, quotaReserve }) {
237
244
  const recommendedBaseQuota = (amount * lt) / sdk_gov_1.PERCENTAGE_FACTOR;
238
245
  const recommendedQuota = (recommendedBaseQuota * (sdk_gov_1.PERCENTAGE_FACTOR + quotaReserve)) /
239
246
  sdk_gov_1.PERCENTAGE_FACTOR;
240
- return recommendedQuota;
247
+ return this.roundUpQuota(recommendedQuota);
241
248
  }
242
249
  static calcQuotaUpdate(props) {
243
250
  const { quotas, initialQuotas, maxDebt, allowedToSpend, allowedToObtain } = props;
244
251
  const quotaDecrease = Object.keys(allowedToSpend).reduce((acc, token) => {
245
- const ch = CreditAccountData.getSingleQuotaChange(token, 0n, props);
252
+ const ch = this.getSingleQuotaChange(token, 0n, props);
246
253
  if (ch)
247
254
  acc[ch.token] = ch;
248
255
  return acc;
249
256
  }, {});
250
- const quotaCap = maxDebt * 2n;
251
- const quotaBought = Object.values(initialQuotas).reduce((sum, q) => sum + (q?.quota || 0n), 0n);
252
- const quotaReduced = Object.values(quotaDecrease).reduce((sum, q) => sum + (q.balance || 0n), 0n);
253
- const maxQuotaIncrease = math_1.BigIntMath.max(quotaCap - (quotaBought + quotaReduced), 0n);
257
+ const quotaCap = this.roundUpQuota(maxDebt * 2n);
258
+ const quotaBought = Object.values(initialQuotas).reduce((sum, q) => sum + this.roundUpQuota(q?.quota || 0n), 0n);
259
+ const quotaReduced = Object.values(quotaDecrease).reduce((sum, q) => {
260
+ const quotaBalance = q.balance || 0n;
261
+ const safeBalance = quotaBalance === exports.MIN_INT96
262
+ ? math_1.BigIntMath.neg(this.roundUpQuota(initialQuotas[q.token]?.quota || 0n))
263
+ : quotaBalance;
264
+ return sum + safeBalance;
265
+ }, 0n);
266
+ const maxQuotaIncrease = this.roundUpQuota(math_1.BigIntMath.max(quotaCap - (quotaBought + quotaReduced), 0n));
254
267
  const quotaIncrease = Object.keys(allowedToObtain).reduce((acc, token) => {
255
- const ch = CreditAccountData.getSingleQuotaChange(token, maxQuotaIncrease, props);
268
+ const ch = this.getSingleQuotaChange(token, maxQuotaIncrease, props);
256
269
  if (ch)
257
270
  acc[ch.token] = ch;
258
271
  return acc;
@@ -271,7 +284,10 @@ class CreditAccountData {
271
284
  };
272
285
  }
273
286
  else {
274
- const change = quotaChange[token]?.balance || 0n;
287
+ const unsafeChange = quotaChange[token]?.balance || 0n;
288
+ const change = unsafeChange === exports.MIN_INT96
289
+ ? math_1.BigIntMath.neg(this.roundUpQuota(initialQuotas[cmQuota.token]?.quota || 0n))
290
+ : unsafeChange;
275
291
  const quotaAfter = initialQuota + change;
276
292
  acc[token] = {
277
293
  balance: quotaAfter,
@@ -286,9 +302,9 @@ class CreditAccountData {
286
302
  quotaIncrease: Object.values(quotaIncrease),
287
303
  };
288
304
  }
289
- static getSingleQuotaChange(token, maxQuotaIncrease, props) {
305
+ static getSingleQuotaChange(token, unsafeMaxQuotaIncrease, props) {
290
306
  const { isActive = false } = props.quotas[token] || {};
291
- const { quota: initialQuota = 0n } = props.initialQuotas[token] || {};
307
+ const { quota: unsafeInitialQuota = 0n } = props.initialQuotas[token] || {};
292
308
  if (!isActive) {
293
309
  return undefined;
294
310
  }
@@ -296,15 +312,20 @@ class CreditAccountData {
296
312
  const assetAfter = props.assetsAfterUpdate[token];
297
313
  const { amountInTarget = 0n } = assetAfter || {};
298
314
  const lt = props.liquidationThresholds[token] || 0n;
315
+ const maxQuotaIncrease = this.roundUpQuota(unsafeMaxQuotaIncrease);
316
+ const initialQuota = this.roundUpQuota(unsafeInitialQuota);
299
317
  const defaultQuota = this.calcDefaultQuota({
300
318
  lt,
301
319
  quotaReserve: props.quotaReserve,
302
320
  amount: amountInTarget,
303
321
  });
304
- const unsafeQuotaChange = defaultQuota - initialQuota;
322
+ const unsafeQuotaChange = this.roundUpQuota(defaultQuota - initialQuota);
305
323
  const quotaChange = unsafeQuotaChange > 0
306
324
  ? math_1.BigIntMath.min(maxQuotaIncrease, unsafeQuotaChange)
307
- : unsafeQuotaChange;
325
+ : initialQuota !== 0n &&
326
+ math_1.BigIntMath.abs(unsafeQuotaChange) >= initialQuota
327
+ ? exports.MIN_INT96
328
+ : unsafeQuotaChange;
308
329
  const correctIncrease = assetAfter && props.allowedToObtain[token] && quotaChange > 0;
309
330
  const correctDecrease = assetAfter && props.allowedToSpend[token] && quotaChange < 0;
310
331
  if (correctIncrease || correctDecrease) {
@@ -410,10 +410,10 @@ const cmQuotas = {
410
410
  };
411
411
  const caQuota = {
412
412
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
413
- quota: 5n,
413
+ quota: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
414
414
  },
415
415
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
416
- quota: 10n,
416
+ quota: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
417
417
  },
418
418
  };
419
419
  const QUOTA_RESERVE = 100n;
@@ -422,7 +422,7 @@ const DEFAULT_LT = {
422
422
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: sdk_gov_1.PERCENTAGE_FACTOR,
423
423
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: sdk_gov_1.PERCENTAGE_FACTOR,
424
424
  };
425
- const HUGE_MAX_DEBT = 20n;
425
+ const HUGE_MAX_DEBT = 20n * sdk_gov_1.PERCENTAGE_FACTOR;
426
426
  describe("CreditAccount calcQuotaUpdate test", () => {
427
427
  it("open account should buy quota", () => {
428
428
  const result = creditAccount_1.CreditAccountData.calcQuotaUpdate({
@@ -432,12 +432,12 @@ describe("CreditAccount calcQuotaUpdate test", () => {
432
432
  initialQuotas: {},
433
433
  assetsAfterUpdate: {
434
434
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
435
- amountInTarget: 10n,
435
+ amountInTarget: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
436
436
  balance: 0n,
437
437
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
438
438
  },
439
439
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
440
- amountInTarget: 20n,
440
+ amountInTarget: 20n * sdk_gov_1.PERCENTAGE_FACTOR,
441
441
  balance: 0n,
442
442
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
443
443
  },
@@ -451,26 +451,26 @@ describe("CreditAccount calcQuotaUpdate test", () => {
451
451
  });
452
452
  (0, chai_1.expect)(result.quotaIncrease).to.be.deep.eq([
453
453
  {
454
- balance: 10n,
454
+ balance: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
455
455
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
456
456
  },
457
457
  {
458
- balance: 20n,
458
+ balance: 20n * sdk_gov_1.PERCENTAGE_FACTOR,
459
459
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
460
460
  },
461
461
  ]);
462
462
  (0, chai_1.expect)(result.quotaDecrease).to.be.deep.eq([]);
463
463
  (0, chai_1.expect)(result.desiredQuota).to.be.deep.eq({
464
464
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
465
- balance: 10n,
465
+ balance: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
466
466
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
467
467
  },
468
468
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
469
- balance: 20n,
469
+ balance: 20n * sdk_gov_1.PERCENTAGE_FACTOR,
470
470
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
471
471
  },
472
472
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
473
- balance: 0n,
473
+ balance: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
474
474
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
475
475
  },
476
476
  });
@@ -483,7 +483,7 @@ describe("CreditAccount calcQuotaUpdate test", () => {
483
483
  initialQuotas: caQuota,
484
484
  assetsAfterUpdate: {
485
485
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
486
- amountInTarget: 10n,
486
+ amountInTarget: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
487
487
  balance: 0n,
488
488
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
489
489
  },
@@ -496,22 +496,22 @@ describe("CreditAccount calcQuotaUpdate test", () => {
496
496
  });
497
497
  (0, chai_1.expect)(result.quotaIncrease).to.be.deep.eq([
498
498
  {
499
- balance: 10n,
499
+ balance: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
500
500
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
501
501
  },
502
502
  ]);
503
503
  (0, chai_1.expect)(result.quotaDecrease).to.be.deep.eq([]);
504
504
  (0, chai_1.expect)(result.desiredQuota).to.be.deep.eq({
505
505
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
506
- balance: 5n,
506
+ balance: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
507
507
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
508
508
  },
509
509
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
510
- balance: 10n,
510
+ balance: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
511
511
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
512
512
  },
513
513
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
514
- balance: 10n,
514
+ balance: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
515
515
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
516
516
  },
517
517
  });
@@ -524,7 +524,7 @@ describe("CreditAccount calcQuotaUpdate test", () => {
524
524
  initialQuotas: caQuota,
525
525
  assetsAfterUpdate: {
526
526
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
527
- amountInTarget: 10n,
527
+ amountInTarget: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
528
528
  balance: 0n,
529
529
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
530
530
  },
@@ -537,22 +537,22 @@ describe("CreditAccount calcQuotaUpdate test", () => {
537
537
  });
538
538
  (0, chai_1.expect)(result.quotaIncrease).to.be.deep.eq([
539
539
  {
540
- balance: 5n,
540
+ balance: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
541
541
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
542
542
  },
543
543
  ]);
544
544
  (0, chai_1.expect)(result.quotaDecrease).to.be.deep.eq([]);
545
545
  (0, chai_1.expect)(result.desiredQuota).to.be.deep.eq({
546
546
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
547
- balance: 10n,
547
+ balance: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
548
548
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
549
549
  },
550
550
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
551
- balance: 10n,
551
+ balance: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
552
552
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
553
553
  },
554
554
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
555
- balance: 0n,
555
+ balance: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
556
556
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
557
557
  },
558
558
  });
@@ -565,7 +565,7 @@ describe("CreditAccount calcQuotaUpdate test", () => {
565
565
  initialQuotas: caQuota,
566
566
  assetsAfterUpdate: {
567
567
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
568
- amountInTarget: 10n,
568
+ amountInTarget: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
569
569
  balance: 0n,
570
570
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
571
571
  },
@@ -580,15 +580,15 @@ describe("CreditAccount calcQuotaUpdate test", () => {
580
580
  (0, chai_1.expect)(result.quotaDecrease).to.be.deep.eq([]);
581
581
  (0, chai_1.expect)(result.desiredQuota).to.be.deep.eq({
582
582
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
583
- balance: 5n,
583
+ balance: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
584
584
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
585
585
  },
586
586
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
587
- balance: 10n,
587
+ balance: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
588
588
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
589
589
  },
590
590
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
591
- balance: 0n,
591
+ balance: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
592
592
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
593
593
  },
594
594
  });
@@ -601,12 +601,12 @@ describe("CreditAccount calcQuotaUpdate test", () => {
601
601
  initialQuotas: caQuota,
602
602
  assetsAfterUpdate: {
603
603
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
604
- amountInTarget: 10n,
604
+ amountInTarget: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
605
605
  balance: 0n,
606
606
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
607
607
  },
608
608
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
609
- amountInTarget: 0n,
609
+ amountInTarget: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
610
610
  balance: 0n,
611
611
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
612
612
  },
@@ -619,24 +619,27 @@ describe("CreditAccount calcQuotaUpdate test", () => {
619
619
  });
620
620
  (0, chai_1.expect)(result.quotaIncrease).to.be.deep.eq([
621
621
  {
622
- balance: 10n,
622
+ balance: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
623
623
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
624
624
  },
625
625
  ]);
626
626
  (0, chai_1.expect)(result.quotaDecrease).to.be.deep.eq([
627
- { balance: -10n, token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH },
627
+ {
628
+ balance: creditAccount_1.MIN_INT96,
629
+ token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
630
+ },
628
631
  ]);
629
632
  (0, chai_1.expect)(result.desiredQuota).to.be.deep.eq({
630
633
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
631
- balance: 5n,
634
+ balance: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
632
635
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
633
636
  },
634
637
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
635
- balance: 0n,
638
+ balance: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
636
639
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
637
640
  },
638
641
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
639
- balance: 10n,
642
+ balance: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
640
643
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
641
644
  },
642
645
  });
@@ -649,12 +652,12 @@ describe("CreditAccount calcQuotaUpdate test", () => {
649
652
  initialQuotas: caQuota,
650
653
  assetsAfterUpdate: {
651
654
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
652
- amountInTarget: 10n,
655
+ amountInTarget: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
653
656
  balance: 0n,
654
657
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
655
658
  },
656
659
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
657
- amountInTarget: 0n,
660
+ amountInTarget: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
658
661
  balance: 0n,
659
662
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
660
663
  },
@@ -669,27 +672,27 @@ describe("CreditAccount calcQuotaUpdate test", () => {
669
672
  });
670
673
  (0, chai_1.expect)(result.quotaIncrease).to.be.deep.eq([
671
674
  {
672
- balance: 5n,
675
+ balance: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
673
676
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
674
677
  },
675
678
  ]);
676
679
  (0, chai_1.expect)(result.quotaDecrease).to.be.deep.eq([
677
680
  {
678
- balance: -10n,
681
+ balance: creditAccount_1.MIN_INT96,
679
682
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
680
683
  },
681
684
  ]);
682
685
  (0, chai_1.expect)(result.desiredQuota).to.be.deep.eq({
683
686
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
684
- balance: 10n,
687
+ balance: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
685
688
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
686
689
  },
687
690
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
688
- balance: 0n,
691
+ balance: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
689
692
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
690
693
  },
691
694
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
692
- balance: 0n,
695
+ balance: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
693
696
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
694
697
  },
695
698
  });
@@ -702,12 +705,12 @@ describe("CreditAccount calcQuotaUpdate test", () => {
702
705
  initialQuotas: caQuota,
703
706
  assetsAfterUpdate: {
704
707
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
705
- amountInTarget: 10n,
708
+ amountInTarget: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
706
709
  balance: 0n,
707
710
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
708
711
  },
709
712
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
710
- amountInTarget: 0n,
713
+ amountInTarget: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
711
714
  balance: 0n,
712
715
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
713
716
  },
@@ -721,21 +724,21 @@ describe("CreditAccount calcQuotaUpdate test", () => {
721
724
  (0, chai_1.expect)(result.quotaIncrease).to.be.deep.eq([]);
722
725
  (0, chai_1.expect)(result.quotaDecrease).to.be.deep.eq([
723
726
  {
724
- balance: -5n,
727
+ balance: creditAccount_1.MIN_INT96,
725
728
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
726
729
  },
727
730
  ]);
728
731
  (0, chai_1.expect)(result.desiredQuota).to.be.deep.eq({
729
732
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
730
- balance: 0n,
733
+ balance: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
731
734
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
732
735
  },
733
736
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
734
- balance: 10n,
737
+ balance: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
735
738
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
736
739
  },
737
740
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
738
- balance: 0n,
741
+ balance: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
739
742
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
740
743
  },
741
744
  });
@@ -748,12 +751,12 @@ describe("CreditAccount calcQuotaUpdate test", () => {
748
751
  initialQuotas: caQuota,
749
752
  assetsAfterUpdate: {
750
753
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
751
- amountInTarget: 10n,
754
+ amountInTarget: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
752
755
  balance: 0n,
753
756
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
754
757
  },
755
758
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
756
- amountInTarget: 0n,
759
+ amountInTarget: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
757
760
  balance: 0n,
758
761
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
759
762
  },
@@ -766,15 +769,15 @@ describe("CreditAccount calcQuotaUpdate test", () => {
766
769
  (0, chai_1.expect)(result.quotaDecrease).to.be.deep.eq([]);
767
770
  (0, chai_1.expect)(result.desiredQuota).to.be.deep.eq({
768
771
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
769
- balance: 5n,
772
+ balance: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
770
773
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
771
774
  },
772
775
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
773
- balance: 10n,
776
+ balance: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
774
777
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
775
778
  },
776
779
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
777
- balance: 0n,
780
+ balance: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
778
781
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
779
782
  },
780
783
  });
@@ -800,12 +803,12 @@ describe("CreditAccount calcQuotaUpdate test", () => {
800
803
  initialQuotas: caQuota,
801
804
  assetsAfterUpdate: {
802
805
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
803
- amountInTarget: 10n,
806
+ amountInTarget: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
804
807
  balance: 0n,
805
808
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
806
809
  },
807
810
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
808
- amountInTarget: 0n,
811
+ amountInTarget: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
809
812
  balance: 0n,
810
813
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
811
814
  },
@@ -822,15 +825,15 @@ describe("CreditAccount calcQuotaUpdate test", () => {
822
825
  (0, chai_1.expect)(result.quotaDecrease).to.be.deep.eq([]);
823
826
  (0, chai_1.expect)(result.desiredQuota).to.be.deep.eq({
824
827
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
825
- balance: 5n,
828
+ balance: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
826
829
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
827
830
  },
828
831
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
829
- balance: 10n,
832
+ balance: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
830
833
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
831
834
  },
832
835
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
833
- balance: 0n,
836
+ balance: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
834
837
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
835
838
  },
836
839
  });
@@ -843,17 +846,17 @@ describe("CreditAccount calcQuotaUpdate test", () => {
843
846
  initialQuotas: {
844
847
  ...caQuota,
845
848
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
846
- quota: 5n,
849
+ quota: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
847
850
  },
848
851
  },
849
852
  assetsAfterUpdate: {
850
853
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
851
- amountInTarget: 10n,
854
+ amountInTarget: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
852
855
  balance: 0n,
853
856
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
854
857
  },
855
858
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
856
- amountInTarget: 5n,
859
+ amountInTarget: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
857
860
  balance: 0n,
858
861
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
859
862
  },
@@ -866,19 +869,22 @@ describe("CreditAccount calcQuotaUpdate test", () => {
866
869
  });
867
870
  (0, chai_1.expect)(result.quotaIncrease).to.be.deep.eq([]);
868
871
  (0, chai_1.expect)(result.quotaDecrease).to.be.deep.eq([
869
- { balance: -10n, token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH },
872
+ {
873
+ balance: creditAccount_1.MIN_INT96,
874
+ token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
875
+ },
870
876
  ]);
871
877
  (0, chai_1.expect)(result.desiredQuota).to.be.deep.eq({
872
878
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
873
- balance: 5n,
879
+ balance: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
874
880
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
875
881
  },
876
882
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
877
- balance: 0n,
883
+ balance: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
878
884
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
879
885
  },
880
886
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
881
- balance: 5n,
887
+ balance: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
882
888
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
883
889
  },
884
890
  });
@@ -890,16 +896,16 @@ describe("CreditAccount calcQuotaUpdate test", () => {
890
896
  quotas: cmQuotas,
891
897
  initialQuotas: {
892
898
  ...caQuota,
893
- [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: { quota: 5n },
899
+ [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: { quota: 5n * sdk_gov_1.PERCENTAGE_FACTOR },
894
900
  },
895
901
  assetsAfterUpdate: {
896
902
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
897
- amountInTarget: 20n,
903
+ amountInTarget: 20n * sdk_gov_1.PERCENTAGE_FACTOR,
898
904
  balance: 0n,
899
905
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
900
906
  },
901
907
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
902
- amountInTarget: 5n,
908
+ amountInTarget: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
903
909
  balance: 0n,
904
910
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
905
911
  },
@@ -915,24 +921,27 @@ describe("CreditAccount calcQuotaUpdate test", () => {
915
921
  });
916
922
  (0, chai_1.expect)(result.quotaIncrease).to.be.deep.eq([
917
923
  {
918
- balance: 5n,
924
+ balance: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
919
925
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
920
926
  },
921
927
  ]);
922
928
  (0, chai_1.expect)(result.quotaDecrease).to.be.deep.eq([
923
- { balance: -5n, token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH },
929
+ {
930
+ balance: -5n * sdk_gov_1.PERCENTAGE_FACTOR,
931
+ token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
932
+ },
924
933
  ]);
925
934
  (0, chai_1.expect)(result.desiredQuota).to.be.deep.eq({
926
935
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
927
- balance: 5n,
936
+ balance: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
928
937
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
929
938
  },
930
939
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
931
- balance: 5n,
940
+ balance: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
932
941
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
933
942
  },
934
943
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
935
- balance: 10n,
944
+ balance: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
936
945
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
937
946
  },
938
947
  });
@@ -944,16 +953,16 @@ describe("CreditAccount calcQuotaUpdate test", () => {
944
953
  quotas: cmQuotas,
945
954
  initialQuotas: {
946
955
  ...caQuota,
947
- [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: { quota: 5n },
956
+ [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: { quota: 5n * sdk_gov_1.PERCENTAGE_FACTOR },
948
957
  },
949
958
  assetsAfterUpdate: {
950
959
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
951
- amountInTarget: 10n,
960
+ amountInTarget: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
952
961
  balance: 0n,
953
962
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
954
963
  },
955
964
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
956
- amountInTarget: 5n,
965
+ amountInTarget: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
957
966
  balance: 0n,
958
967
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
959
968
  },
@@ -969,42 +978,45 @@ describe("CreditAccount calcQuotaUpdate test", () => {
969
978
  });
970
979
  (0, chai_1.expect)(result.quotaIncrease).to.be.deep.eq([]);
971
980
  (0, chai_1.expect)(result.quotaDecrease).to.be.deep.eq([
972
- { balance: -5n, token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH },
981
+ {
982
+ balance: -5n * sdk_gov_1.PERCENTAGE_FACTOR,
983
+ token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
984
+ },
973
985
  ]);
974
986
  (0, chai_1.expect)(result.desiredQuota).to.be.deep.eq({
975
987
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
976
- balance: 5n,
988
+ balance: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
977
989
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
978
990
  },
979
991
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
980
- balance: 5n,
992
+ balance: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
981
993
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
982
994
  },
983
995
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
984
- balance: 5n,
996
+ balance: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
985
997
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
986
998
  },
987
999
  });
988
1000
  });
989
1001
  it("swap should buy additional quota after limit was increased", () => {
990
1002
  const result = creditAccount_1.CreditAccountData.calcQuotaUpdate({
991
- maxDebt: 10n,
1003
+ maxDebt: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
992
1004
  quotaReserve: QUOTA_RESERVE,
993
1005
  quotas: cmQuotas,
994
1006
  initialQuotas: {
995
1007
  ...caQuota,
996
1008
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
997
- quota: 10n,
1009
+ quota: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
998
1010
  },
999
1011
  },
1000
1012
  assetsAfterUpdate: {
1001
1013
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
1002
- amountInTarget: 20n,
1014
+ amountInTarget: 20n * sdk_gov_1.PERCENTAGE_FACTOR,
1003
1015
  balance: 0n,
1004
1016
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
1005
1017
  },
1006
1018
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
1007
- amountInTarget: 0n,
1019
+ amountInTarget: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
1008
1020
  balance: 0n,
1009
1021
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
1010
1022
  },
@@ -1019,50 +1031,50 @@ describe("CreditAccount calcQuotaUpdate test", () => {
1019
1031
  });
1020
1032
  (0, chai_1.expect)(result.quotaIncrease).to.be.deep.eq([
1021
1033
  {
1022
- balance: 10n,
1034
+ balance: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
1023
1035
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
1024
1036
  },
1025
1037
  ]);
1026
1038
  (0, chai_1.expect)(result.quotaDecrease).to.be.deep.eq([
1027
1039
  {
1028
- balance: -10n,
1040
+ balance: creditAccount_1.MIN_INT96,
1029
1041
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
1030
1042
  },
1031
1043
  ]);
1032
1044
  (0, chai_1.expect)(result.desiredQuota).to.be.deep.eq({
1033
1045
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
1034
- balance: 20n,
1046
+ balance: 20n * sdk_gov_1.PERCENTAGE_FACTOR,
1035
1047
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
1036
1048
  },
1037
1049
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
1038
- balance: 0n,
1050
+ balance: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
1039
1051
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
1040
1052
  },
1041
1053
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
1042
- balance: 0n,
1054
+ balance: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
1043
1055
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
1044
1056
  },
1045
1057
  });
1046
1058
  });
1047
1059
  it("swap should buy additional quota with respect to debt limit", () => {
1048
1060
  const result = creditAccount_1.CreditAccountData.calcQuotaUpdate({
1049
- maxDebt: 9n,
1061
+ maxDebt: 9n * sdk_gov_1.PERCENTAGE_FACTOR,
1050
1062
  quotaReserve: QUOTA_RESERVE,
1051
1063
  quotas: cmQuotas,
1052
1064
  initialQuotas: {
1053
1065
  ...caQuota,
1054
1066
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
1055
- quota: 10n,
1067
+ quota: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
1056
1068
  },
1057
1069
  },
1058
1070
  assetsAfterUpdate: {
1059
1071
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
1060
- amountInTarget: 20n,
1072
+ amountInTarget: 20n * sdk_gov_1.PERCENTAGE_FACTOR,
1061
1073
  balance: 0n,
1062
1074
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
1063
1075
  },
1064
1076
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
1065
- amountInTarget: 0n,
1077
+ amountInTarget: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
1066
1078
  balance: 0n,
1067
1079
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
1068
1080
  },
@@ -1077,50 +1089,50 @@ describe("CreditAccount calcQuotaUpdate test", () => {
1077
1089
  });
1078
1090
  (0, chai_1.expect)(result.quotaIncrease).to.be.deep.eq([
1079
1091
  {
1080
- balance: 8n,
1092
+ balance: 8n * sdk_gov_1.PERCENTAGE_FACTOR,
1081
1093
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
1082
1094
  },
1083
1095
  ]);
1084
1096
  (0, chai_1.expect)(result.quotaDecrease).to.be.deep.eq([
1085
1097
  {
1086
- balance: -10n,
1098
+ balance: creditAccount_1.MIN_INT96,
1087
1099
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
1088
1100
  },
1089
1101
  ]);
1090
1102
  (0, chai_1.expect)(result.desiredQuota).to.be.deep.eq({
1091
1103
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
1092
- balance: 18n,
1104
+ balance: 18n * sdk_gov_1.PERCENTAGE_FACTOR,
1093
1105
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
1094
1106
  },
1095
1107
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
1096
- balance: 0n,
1108
+ balance: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
1097
1109
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
1098
1110
  },
1099
1111
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
1100
- balance: 0n,
1112
+ balance: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
1101
1113
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
1102
1114
  },
1103
1115
  });
1104
1116
  });
1105
1117
  it("swap shouldn't buy additional quota if debt limit more then current quota", () => {
1106
1118
  const result = creditAccount_1.CreditAccountData.calcQuotaUpdate({
1107
- maxDebt: 5n,
1119
+ maxDebt: 5n * sdk_gov_1.PERCENTAGE_FACTOR,
1108
1120
  quotaReserve: QUOTA_RESERVE,
1109
1121
  quotas: cmQuotas,
1110
1122
  initialQuotas: {
1111
1123
  ...caQuota,
1112
1124
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
1113
- quota: 10n,
1125
+ quota: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
1114
1126
  },
1115
1127
  },
1116
1128
  assetsAfterUpdate: {
1117
1129
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
1118
- amountInTarget: 20n,
1130
+ amountInTarget: 20n * sdk_gov_1.PERCENTAGE_FACTOR,
1119
1131
  balance: 0n,
1120
1132
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
1121
1133
  },
1122
1134
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
1123
- amountInTarget: 0n,
1135
+ amountInTarget: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
1124
1136
  balance: 0n,
1125
1137
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
1126
1138
  },
@@ -1136,21 +1148,139 @@ describe("CreditAccount calcQuotaUpdate test", () => {
1136
1148
  (0, chai_1.expect)(result.quotaIncrease).to.be.deep.eq([]);
1137
1149
  (0, chai_1.expect)(result.quotaDecrease).to.be.deep.eq([
1138
1150
  {
1139
- balance: -10n,
1151
+ balance: creditAccount_1.MIN_INT96,
1152
+ token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
1153
+ },
1154
+ ]);
1155
+ (0, chai_1.expect)(result.desiredQuota).to.be.deep.eq({
1156
+ [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
1157
+ balance: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
1158
+ token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
1159
+ },
1160
+ [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
1161
+ balance: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
1162
+ token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
1163
+ },
1164
+ [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
1165
+ balance: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
1166
+ token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
1167
+ },
1168
+ });
1169
+ });
1170
+ it("swap on old accounts should work correctly", () => {
1171
+ const result = creditAccount_1.CreditAccountData.calcQuotaUpdate({
1172
+ maxDebt: HUGE_MAX_DEBT,
1173
+ quotaReserve: QUOTA_RESERVE,
1174
+ quotas: cmQuotas,
1175
+ initialQuotas: {
1176
+ ...caQuota,
1177
+ [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
1178
+ quota: 52345n,
1179
+ },
1180
+ [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
1181
+ quota: 107458n * sdk_gov_1.PERCENTAGE_FACTOR,
1182
+ },
1183
+ },
1184
+ assetsAfterUpdate: {
1185
+ [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
1186
+ amountInTarget: 101345n,
1187
+ balance: 0n,
1188
+ token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
1189
+ },
1190
+ [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
1191
+ amountInTarget: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
1192
+ balance: 0n,
1193
+ token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
1194
+ },
1195
+ },
1196
+ allowedToObtain: {
1197
+ [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {},
1198
+ },
1199
+ allowedToSpend: { [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {} },
1200
+ liquidationThresholds: DEFAULT_LT,
1201
+ });
1202
+ (0, chai_1.expect)(result.quotaIncrease).to.be.deep.eq([
1203
+ {
1204
+ balance: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
1205
+ token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
1206
+ },
1207
+ ]);
1208
+ (0, chai_1.expect)(result.quotaDecrease).to.be.deep.eq([
1209
+ {
1210
+ balance: creditAccount_1.MIN_INT96,
1211
+ token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
1212
+ },
1213
+ ]);
1214
+ (0, chai_1.expect)(result.desiredQuota).to.be.deep.eq({
1215
+ [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
1216
+ balance: 52345n,
1217
+ token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
1218
+ },
1219
+ [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
1220
+ balance: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
1221
+ token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
1222
+ },
1223
+ [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
1224
+ balance: 10n * sdk_gov_1.PERCENTAGE_FACTOR,
1225
+ token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
1226
+ },
1227
+ });
1228
+ });
1229
+ it("swap on old accounts should work correctly and respect maxQuotaIncrease", () => {
1230
+ const result = creditAccount_1.CreditAccountData.calcQuotaUpdate({
1231
+ maxDebt: 6n * sdk_gov_1.PERCENTAGE_FACTOR,
1232
+ quotaReserve: QUOTA_RESERVE,
1233
+ quotas: cmQuotas,
1234
+ initialQuotas: {
1235
+ ...caQuota,
1236
+ [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
1237
+ quota: 52345n,
1238
+ },
1239
+ [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
1240
+ quota: 107458n * sdk_gov_1.PERCENTAGE_FACTOR,
1241
+ },
1242
+ },
1243
+ assetsAfterUpdate: {
1244
+ [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
1245
+ amountInTarget: 101345n,
1246
+ balance: 0n,
1247
+ token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
1248
+ },
1249
+ [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
1250
+ amountInTarget: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
1251
+ balance: 0n,
1252
+ token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
1253
+ },
1254
+ },
1255
+ allowedToObtain: {
1256
+ [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {},
1257
+ },
1258
+ allowedToSpend: { [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {} },
1259
+ liquidationThresholds: DEFAULT_LT,
1260
+ });
1261
+ (0, chai_1.expect)(result.quotaIncrease).to.be.deep.eq([
1262
+ {
1263
+ balance: 7n * sdk_gov_1.PERCENTAGE_FACTOR,
1264
+ token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
1265
+ },
1266
+ ]);
1267
+ (0, chai_1.expect)(result.quotaDecrease).to.be.deep.eq([
1268
+ {
1269
+ balance: creditAccount_1.MIN_INT96,
1140
1270
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
1141
1271
  },
1142
1272
  ]);
1143
1273
  (0, chai_1.expect)(result.desiredQuota).to.be.deep.eq({
1144
1274
  [sdk_gov_1.tokenDataByNetwork.Mainnet.DAI]: {
1145
- balance: 10n,
1275
+ balance: 52345n,
1146
1276
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.DAI,
1147
1277
  },
1148
1278
  [sdk_gov_1.tokenDataByNetwork.Mainnet.WETH]: {
1149
- balance: 0n,
1279
+ balance: 0n * sdk_gov_1.PERCENTAGE_FACTOR,
1150
1280
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.WETH,
1151
1281
  },
1152
1282
  [sdk_gov_1.tokenDataByNetwork.Mainnet.STETH]: {
1153
- balance: 0n,
1283
+ balance: 7n * sdk_gov_1.PERCENTAGE_FACTOR,
1154
1284
  token: sdk_gov_1.tokenDataByNetwork.Mainnet.STETH,
1155
1285
  },
1156
1286
  });
@@ -9,4 +9,5 @@ export declare class BigIntMath {
9
9
  static toHexString: (x: bigint) => string;
10
10
  static max: (a: bigint, b: bigint) => bigint;
11
11
  static min: (a: bigint, b: bigint) => bigint;
12
+ static neg: (a: bigint) => bigint;
12
13
  }
package/lib/utils/math.js CHANGED
@@ -43,5 +43,6 @@ class BigIntMath {
43
43
  static toHexString = (x) => ethers_1.BigNumber.from(x).toHexString();
44
44
  static max = (a, b) => (a > b ? a : b);
45
45
  static min = (a, b) => (a < b ? a : b);
46
+ static neg = (a) => (a > 0 ? a * -1n : a);
46
47
  }
47
48
  exports.BigIntMath = BigIntMath;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gearbox-protocol/sdk",
3
- "version": "3.0.0-next.153",
3
+ "version": "3.0.0-next.154",
4
4
  "description": "Gearbox SDK",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./lib/index.d.ts",