flash-sdk 2.3.15 → 2.3.16

Sign up to get free protection for your applications and to get access to all the features.
@@ -341,7 +341,7 @@ var PerpetualsClient = (function () {
341
341
  }
342
342
  });
343
343
  }); };
344
- this.addPool = function (name, maxAumUsd, permissions, metadataSymbol, metadataTitle, metadataUri, stakingFeeShareBps, vpVolumeFactor) { return __awaiter(_this, void 0, void 0, function () {
344
+ this.addPool = function (name, maxAumUsd, permissions, metadataSymbol, metadataTitle, metadataUri) { return __awaiter(_this, void 0, void 0, function () {
345
345
  return __generator(this, function (_a) {
346
346
  switch (_a.label) {
347
347
  case 0: return [4, this.program.methods
@@ -351,9 +351,7 @@ var PerpetualsClient = (function () {
351
351
  permissions: permissions,
352
352
  metadataSymbol: metadataSymbol,
353
353
  metadataTitle: metadataTitle,
354
- metadataUri: metadataUri,
355
- stakingFeeShareBps: stakingFeeShareBps,
356
- vpVolumeFactor: vpVolumeFactor
354
+ metadataUri: metadataUri
357
355
  })
358
356
  .accounts({
359
357
  admin: this.provider.wallet.publicKey,
@@ -586,7 +584,7 @@ var PerpetualsClient = (function () {
586
584
  throw new Error("exponent mistach");
587
585
  }
588
586
  var minMaxPrice = _this.getMinAndMaxOraclePriceSync(inputTokenPrice, inputTokenEmaPrice, inputTokenCustodyAccount);
589
- var fee = _this.getFeeHelper(types_1.FeesAction.AddLiquidity, amountIn, constants_1.BN_ZERO, inputTokenCustodyAccount, minMaxPrice.max, poolAumUsdMax, poolAccount, poolConfig).feeAmount;
587
+ var fee = _this.getFeeHelper(types_1.FeesAction.AddLiquidity, amountIn, constants_1.BN_ZERO, inputTokenCustodyAccount, minMaxPrice.max.price, poolAumUsdMax, poolAccount, poolConfig).feeAmount;
590
588
  var tokenAmountUsd = minMaxPrice.min.getAssetAmountUsd((amountIn.sub(fee)), inputTokenCustodyAccount.decimals);
591
589
  var lpTokenOut;
592
590
  if (poolAumUsdMax.isZero()) {
@@ -614,13 +612,13 @@ var PerpetualsClient = (function () {
614
612
  else {
615
613
  removeAmount = minMaxPrice.max.getTokenAmount(removeAmountUsd, outputTokenCustodyAccount.decimals);
616
614
  }
617
- var fee = _this.getFeeHelper(types_1.FeesAction.RemoveLiquidity, constants_1.BN_ZERO, removeAmount, outputTokenCustodyAccount, minMaxPrice.max, poolAumUsdMax, poolAccount, poolConfig).feeAmount;
615
+ var fee = _this.getFeeHelper(types_1.FeesAction.RemoveLiquidity, constants_1.BN_ZERO, removeAmount, outputTokenCustodyAccount, minMaxPrice.max.price, poolAumUsdMax, poolAccount, poolConfig).feeAmount;
618
616
  return {
619
617
  tokenAmountOut: removeAmount.sub(fee),
620
618
  fee: fee,
621
619
  };
622
620
  };
623
- this.getFeeHelper = function (action, amountAdd, amountRemove, inputTokenCustodyAccount, maxOraclePrice, poolAumUsdMax, poolAccount, poolConfig) {
621
+ this.getFeeHelper = function (action, amountAdd, amountRemove, inputTokenCustodyAccount, maxPrice, poolAumUsdMax, poolAccount, poolConfig) {
624
622
  var fees;
625
623
  switch (action) {
626
624
  case types_1.FeesAction.AddLiquidity:
@@ -639,7 +637,7 @@ var PerpetualsClient = (function () {
639
637
  if (inputTokenCustodyAccount.fees.mode == types_1.FeesMode.Fixed) {
640
638
  return { feeBps: fees.minFee, feeAmount: anchor_1.BN.max(amountAdd, amountRemove).mul(fees.minFee).div(new anchor_1.BN(constants_1.RATE_POWER)) };
641
639
  }
642
- var newRatio = _this.getNewRatioHelper(amountAdd, amountRemove, inputTokenCustodyAccount, maxOraclePrice, poolAumUsdMax);
640
+ var newRatio = _this.getNewRatioHelper(amountAdd, amountRemove, inputTokenCustodyAccount, maxPrice, poolAumUsdMax);
643
641
  var inputCustodyConfig = poolConfig.custodies.find(function (i) { return i.custodyAccount.equals(inputTokenCustodyAccount.publicKey); });
644
642
  var index = inputCustodyConfig.custodyId;
645
643
  var ratios = poolAccount.ratios[index];
@@ -676,43 +674,45 @@ var PerpetualsClient = (function () {
676
674
  return { feeBps: fee, feeAmount: feeAmount };
677
675
  };
678
676
  this.getMinAndMaxOraclePriceSync = function (price, emaPrice, custodyAccount) {
679
- var maxPrice = price;
680
- var minPrice = price;
677
+ var maxPriceUsd = price.scale_to_exponent(new anchor_1.BN(-1 * constants_1.USD_DECIMALS));
678
+ var minPriceUsd = maxPriceUsd.scale_to_exponent(new anchor_1.BN(-1 * constants_1.USD_DECIMALS));
681
679
  var divergenceBps;
682
680
  if (custodyAccount.isStable) {
683
- var oneUsdPrice = OraclePrice_1.OraclePrice.from({
684
- price: new anchor_1.BN(10).pow(maxPrice.exponent.abs()),
685
- exponent: maxPrice.exponent,
686
- confidence: maxPrice.confidence,
687
- timestamp: maxPrice.timestamp
688
- });
689
- divergenceBps = maxPrice.getDivergenceFactor(oneUsdPrice);
681
+ divergenceBps = maxPriceUsd.getDeviationFactor(OraclePrice_1.OraclePrice.from({
682
+ price: new anchor_1.BN(10).pow(maxPriceUsd.exponent.abs()),
683
+ exponent: maxPriceUsd.exponent,
684
+ confidence: maxPriceUsd.confidence,
685
+ timestamp: maxPriceUsd.timestamp
686
+ }));
690
687
  }
691
688
  else {
692
- divergenceBps = maxPrice.getDivergenceFactor(emaPrice);
689
+ var emaPriceInPriceDecimals = emaPrice.scale_to_exponent(new anchor_1.BN(-1 * constants_1.USD_DECIMALS));
690
+ divergenceBps = maxPriceUsd.getDeviationFactor(emaPriceInPriceDecimals);
693
691
  }
694
692
  if (divergenceBps.gte(custodyAccount.oracle.maxDivergenceBps)) {
695
- var confBps = (maxPrice.confidence.muln(constants_1.BPS_POWER)).div(maxPrice.price);
693
+ var factorBps = (divergenceBps.mul(new anchor_1.BN(constants_1.BPS_POWER))).div(custodyAccount.oracle.maxDivergenceBps);
694
+ var confBps = (maxPriceUsd.confidence.muln(constants_1.BPS_POWER)).div(maxPriceUsd.price);
696
695
  if (confBps.lt(custodyAccount.oracle.maxConfBps)) {
697
- minPrice.price = maxPrice.price.sub(maxPrice.confidence);
698
- maxPrice.price = maxPrice.price.add(maxPrice.confidence);
696
+ var confFactor = anchor_1.BN.min(factorBps, new anchor_1.BN(50000));
697
+ var confScale = (maxPriceUsd.confidence.mul(confFactor)).div(new anchor_1.BN(constants_1.BPS_POWER));
698
+ minPriceUsd.price = maxPriceUsd.price.sub(confScale);
699
699
  return {
700
- min: minPrice,
701
- max: maxPrice
700
+ min: minPriceUsd,
701
+ max: maxPriceUsd
702
702
  };
703
703
  }
704
704
  else {
705
- minPrice.price = maxPrice.price.sub(maxPrice.confidence);
705
+ minPriceUsd.price = maxPriceUsd.price.sub(maxPriceUsd.confidence);
706
706
  return {
707
- min: minPrice,
708
- max: maxPrice
707
+ min: minPriceUsd,
708
+ max: maxPriceUsd
709
709
  };
710
710
  }
711
711
  }
712
712
  else {
713
713
  return {
714
- min: maxPrice,
715
- max: maxPrice
714
+ min: maxPriceUsd,
715
+ max: maxPriceUsd
716
716
  };
717
717
  }
718
718
  };
@@ -720,10 +720,10 @@ var PerpetualsClient = (function () {
720
720
  var minPrice = price;
721
721
  var divergenceBps;
722
722
  if (custodyAccount.isStable) {
723
- divergenceBps = price.getDivergenceFactor(OraclePrice_1.OraclePrice.from({ price: new anchor_1.BN(10).pow(price.exponent.abs()), exponent: price.exponent, confidence: price.confidence, timestamp: price.timestamp }));
723
+ divergenceBps = price.getDeviationFactor(OraclePrice_1.OraclePrice.from({ price: new anchor_1.BN(10).pow(price.exponent.abs()), exponent: price.exponent, confidence: price.confidence, timestamp: price.timestamp }));
724
724
  }
725
725
  else {
726
- divergenceBps = price.getDivergenceFactor(emaPrice);
726
+ divergenceBps = price.getDeviationFactor(emaPrice);
727
727
  }
728
728
  if (divergenceBps.gte(custodyAccount.oracle.maxDivergenceBps)) {
729
729
  var factorBps = (divergenceBps.mul(new anchor_1.BN(constants_1.BPS_POWER))).div(custodyAccount.oracle.maxDivergenceBps);
@@ -757,10 +757,10 @@ var PerpetualsClient = (function () {
757
757
  }
758
758
  var deviation;
759
759
  if (custodyAccount.isStable) {
760
- deviation = price.getDivergenceFactor(OraclePrice_1.OraclePrice.from({ price: new anchor_1.BN(10).pow(price.exponent.abs()), exponent: price.exponent, confidence: price.confidence, timestamp: price.timestamp }));
760
+ deviation = price.getDeviationFactor(OraclePrice_1.OraclePrice.from({ price: new anchor_1.BN(10).pow(price.exponent.abs()), exponent: price.exponent, confidence: price.confidence, timestamp: price.timestamp }));
761
761
  }
762
762
  else {
763
- deviation = price.getDivergenceFactor(emaPrice);
763
+ deviation = price.getDeviationFactor(emaPrice);
764
764
  }
765
765
  if (deviation.gte(custodyAccount.oracle.maxDivergenceBps)) {
766
766
  var confFactor = (price.confidence.muln(constants_1.BPS_POWER)).div(price.price);
@@ -802,10 +802,11 @@ var PerpetualsClient = (function () {
802
802
  finalCollateralAmount = swapAmountOut;
803
803
  }
804
804
  }
805
- var entryOraclePrice = _this.getEntryPriceUsdSync(side, targetTokenPrice, targetTokenEmaPrice, targetTokenCustodyAccount);
805
+ var entryPriceUsdBN = _this.getEntryPriceUsdSync(side, targetTokenPrice, targetTokenEmaPrice, targetTokenCustodyAccount);
806
806
  var openFeeUsd = constants_1.BN_ZERO;
807
807
  if (sizeDeltaAmount != constants_1.BN_ZERO) {
808
- var sizeDeltaUsd = entryOraclePrice.getAssetAmountUsd(sizeDeltaAmount, targetTokenCustodyAccount.decimals);
808
+ var newEntryPriceOracle = new OraclePrice_1.OraclePrice({ price: entryPriceUsdBN, exponent: new anchor_1.BN(constants_1.USD_DECIMALS).neg(), confidence: targetTokenPrice.confidence, timestamp: targetTokenPrice.timestamp });
809
+ var sizeDeltaUsd = newEntryPriceOracle.getAssetAmountUsd(sizeDeltaAmount, targetTokenCustodyAccount.decimals);
809
810
  openFeeUsd = sizeDeltaUsd.mul(targetTokenCustodyAccount.fees.openPosition).div(new anchor_1.BN(constants_1.RATE_POWER));
810
811
  }
811
812
  if (positionAccount === null) {
@@ -819,14 +820,16 @@ var PerpetualsClient = (function () {
819
820
  exponent: new anchor_1.BN(positionAccount.entryPrice.exponent),
820
821
  confidence: constants_1.BN_ZERO,
821
822
  timestamp: constants_1.BN_ZERO
822
- });
823
- entryOraclePrice.price = _this.getAveragePriceSync(positionEntryPrice.price, positionAccount.sizeAmount, entryOraclePrice.price, sizeDeltaAmount);
823
+ })
824
+ .scale_to_exponent(new anchor_1.BN(-1 * constants_1.USD_DECIMALS));
825
+ entryPriceUsdBN = _this.getAveragePriceSync(positionEntryPrice.price, positionAccount.sizeAmount, entryPriceUsdBN, sizeDeltaAmount);
824
826
  }
825
827
  var collateralMinOraclePrice = _this.getMinAndMaxOraclePriceSync(collateralTokenPrice, collateralTokenEmaPrice, collateralTokenCustodyAccount).min;
826
828
  var collateralAmount = positionAccount.collateralAmount.add(finalCollateralAmount);
827
829
  var currentCollateralUsd = collateralMinOraclePrice.getAssetAmountUsd(collateralAmount, collateralTokenCustodyAccount.decimals);
828
830
  var currentCollateralUsdIncludingPnl = currentCollateralUsd.add(pnlUsd).sub(openFeeUsd);
829
831
  var sizeAmount = positionAccount.sizeAmount.add(sizeDeltaAmount);
832
+ var entryOraclePrice = new OraclePrice_1.OraclePrice({ price: entryPriceUsdBN, exponent: new anchor_1.BN(constants_1.USD_DECIMALS).neg(), confidence: targetTokenPrice.confidence, timestamp: targetTokenPrice.timestamp });
830
833
  var sizeAmountUsd = entryOraclePrice.getAssetAmountUsd(sizeAmount, targetTokenCustodyAccount.decimals);
831
834
  if (currentCollateralUsdIncludingPnl.gt(constants_1.BN_ZERO)) {
832
835
  return sizeAmountUsd.mul(new anchor_1.BN(constants_1.BPS_POWER)).div(currentCollateralUsdIncludingPnl);
@@ -840,11 +843,12 @@ var PerpetualsClient = (function () {
840
843
  if (collateralDeltaAmount.isNeg() || sizeDeltaAmount.isNeg()) {
841
844
  throw new Error("Delta Amounts cannot be negative.");
842
845
  }
843
- var entryOraclePrice = _this.getEntryPriceUsdSync(side, targetPrice, targetEmaPrice, targetCustodyAccount);
846
+ var entryPriceUsdBN = _this.getEntryPriceUsdSync(side, targetPrice, targetEmaPrice, targetCustodyAccount);
847
+ var oracleEntryPrice = OraclePrice_1.OraclePrice.from({ price: entryPriceUsdBN, exponent: new anchor_1.BN(-1 * constants_1.USD_DECIMALS), confidence: constants_1.BN_ZERO, timestamp: constants_1.BN_ZERO });
844
848
  if (positionAccount === null) {
845
849
  var data = __assign({}, types_1.DEFAULT_POSITION);
846
850
  positionAccount = PositionAccount_1.PositionAccount.from(web3_js_1.PublicKey.default, data);
847
- var sizeUsd = entryOraclePrice.getAssetAmountUsd(sizeDeltaAmount, targetCustodyAccount.decimals);
851
+ var sizeUsd = oracleEntryPrice.getAssetAmountUsd(sizeDeltaAmount, targetCustodyAccount.decimals);
848
852
  positionAccount.sizeUsd = sizeUsd;
849
853
  positionAccount.sizeDecimals = targetCustodyAccount.decimals;
850
854
  positionAccount.collateralDecimals = collateralCustodyAccount.decimals;
@@ -857,15 +861,17 @@ var PerpetualsClient = (function () {
857
861
  exponent: new anchor_1.BN(positionAccount.entryPrice.exponent),
858
862
  confidence: constants_1.BN_ZERO,
859
863
  timestamp: constants_1.BN_ZERO
860
- });
861
- entryOraclePrice.price = _this.getAveragePriceSync(positionEntryPrice.price, positionAccount.sizeAmount, entryOraclePrice.price, sizeDeltaAmount);
862
- var sizeDeltaUsd = entryOraclePrice.getAssetAmountUsd(sizeDeltaAmount, targetCustodyAccount.decimals);
864
+ })
865
+ .scale_to_exponent(new anchor_1.BN(-1 * constants_1.USD_DECIMALS));
866
+ entryPriceUsdBN = _this.getAveragePriceSync(positionEntryPrice.price, positionAccount.sizeAmount, entryPriceUsdBN, sizeDeltaAmount);
867
+ var sizeDeltaUsd = oracleEntryPrice.getAssetAmountUsd(sizeDeltaAmount, targetCustodyAccount.decimals);
863
868
  positionAccount.sizeUsd = positionAccount.sizeUsd.add(sizeDeltaUsd);
864
869
  }
865
870
  positionAccount.collateralAmount = positionAccount.collateralAmount.add(collateralDeltaAmount);
866
871
  positionAccount.sizeAmount = positionAccount.sizeAmount.add(sizeDeltaAmount);
867
872
  var lockFeeUsd = _this.getLockFeeAndUnsettledUsdForPosition(positionAccount, collateralCustodyAccount, currentTimestamp);
868
- var liquidationPrice = _this.getLiquidationPriceSync(positionAccount.collateralAmount, positionAccount.sizeAmount, entryOraclePrice, lockFeeUsd, marketCorrelation, side, targetCustodyAccount, collateralPrice, collateralEmaPrice, collateralCustodyAccount, positionAccount);
873
+ var liquidationPrice = _this.getLiquidationPriceSync(positionAccount.collateralAmount, positionAccount.sizeAmount, entryPriceUsdBN, lockFeeUsd, marketCorrelation, side, targetCustodyAccount, collateralPrice, collateralEmaPrice, collateralCustodyAccount, positionAccount);
874
+ var entryOraclePrice = new OraclePrice_1.OraclePrice({ price: entryPriceUsdBN, exponent: new anchor_1.BN(constants_1.USD_DECIMALS).neg(), confidence: targetPrice.confidence, timestamp: targetPrice.timestamp });
869
875
  var sizeAmountUsd = entryOraclePrice.getAssetAmountUsd(sizeDeltaAmount, targetCustodyAccount.decimals);
870
876
  var collateralTokenMinOraclePrice = _this.getMinAndMaxOraclePriceSync(collateralPrice, collateralEmaPrice, collateralCustodyAccount).min;
871
877
  var feeUsd = constants_1.BN_ZERO;
@@ -888,7 +894,7 @@ var PerpetualsClient = (function () {
888
894
  }
889
895
  }
890
896
  return {
891
- entryOraclePrice: entryOraclePrice,
897
+ entryPrice: entryPriceUsdBN,
892
898
  feeUsd: feeUsd,
893
899
  feeAmount: feeAmount,
894
900
  feeUsdAfterDiscount: feeUsdAfterDiscount,
@@ -897,12 +903,11 @@ var PerpetualsClient = (function () {
897
903
  };
898
904
  };
899
905
  this.getEntryPriceUsdSync = function (side, targetPrice, targetEmaPrice, targetCustodyAccount) {
900
- var _a = _this.getMinAndMaxOraclePriceSync(targetPrice, targetEmaPrice, targetCustodyAccount), minPrice = _a.min, maxPrice = _a.max;
906
+ var _a = _this.getMinAndMaxPriceSync(targetPrice, targetEmaPrice, targetCustodyAccount), minPrice = _a.min, maxPrice = _a.max;
901
907
  var entryPriceBN = (0, types_1.isVariant)(side, 'long') === types_1.Side.Long ?
902
- maxPrice.price.add(maxPrice.price.mul(targetCustodyAccount.pricing.tradeSpreadLong).div(new anchor_1.BN(constants_1.BPS_POWER))) :
903
- minPrice.price.sub(minPrice.price.mul(targetCustodyAccount.pricing.tradeSpreadShort).div(new anchor_1.BN(constants_1.BPS_POWER)));
904
- var entryOraclePrice = OraclePrice_1.OraclePrice.from({ price: entryPriceBN, exponent: maxPrice.exponent, confidence: maxPrice.confidence, timestamp: maxPrice.timestamp });
905
- return entryOraclePrice;
908
+ maxPrice.add(maxPrice.mul(targetCustodyAccount.pricing.tradeSpreadLong).div(new anchor_1.BN(constants_1.BPS_POWER))) :
909
+ minPrice.sub(minPrice.mul(targetCustodyAccount.pricing.tradeSpreadShort).div(new anchor_1.BN(constants_1.BPS_POWER)));
910
+ return entryPriceBN;
906
911
  };
907
912
  this.getExitFeeSync = function (positionAccount, targetCustody, collateralCustodyAccount, collateralPrice, collateralEmaPrice, discountBps) {
908
913
  if (discountBps === void 0) { discountBps = constants_1.BN_ZERO; }
@@ -949,11 +954,12 @@ var PerpetualsClient = (function () {
949
954
  }
950
955
  var positionEntryOraclePrice = new OraclePrice_1.OraclePrice({
951
956
  price: positionAccount.entryPrice.price, exponent: new anchor_1.BN(positionAccount.entryPrice.exponent), confidence: constants_1.BN_ZERO, timestamp: constants_1.BN_ZERO
952
- });
957
+ }).scale_to_exponent(new anchor_1.BN(-1 * constants_1.USD_DECIMALS));
958
+ var positionEntryPriceUsd = positionEntryOraclePrice.price;
953
959
  resultingPositionAccount.sizeUsd = positionEntryOraclePrice.getAssetAmountUsd(resultingPositionAccount.sizeAmount, targetCustodyAccount.decimals);
954
- var liquidationPrice = _this.getLiquidationPriceSync(resultingPositionAccount.collateralAmount, resultingPositionAccount.sizeAmount, positionEntryOraclePrice, lockAndUnsettledFeeUsd, marketCorrelation, side, targetCustodyAccount, collateralPrice, collateralEmaPrice, collateralCustodyAccount, positionAccount);
960
+ var liquidationPrice = _this.getLiquidationPriceSync(resultingPositionAccount.collateralAmount, resultingPositionAccount.sizeAmount, positionEntryPriceUsd, lockAndUnsettledFeeUsd, marketCorrelation, side, targetCustodyAccount, collateralPrice, collateralEmaPrice, collateralCustodyAccount, positionAccount);
955
961
  return {
956
- exitOraclePrice: exitOraclePrice,
962
+ exitPrice: exitOraclePrice.scale_to_exponent(new anchor_1.BN(-1 * constants_1.USD_DECIMALS)).price,
957
963
  borrowFeeUsd: lockAndUnsettledFeeUsd,
958
964
  borrowFeeAmount: lockAndUnsettledFee,
959
965
  exitFeeUsd: exitFeeUsd,
@@ -983,8 +989,8 @@ var PerpetualsClient = (function () {
983
989
  if (discountBps === void 0) { discountBps = constants_1.BN_ZERO; }
984
990
  var collateralTokenMinPrice = _this.getMinAndMaxPriceSync(collateralPrice, collateralEmaPrice, collateralCustodyAccount).min;
985
991
  var collateralTokenMinPriceUi = new bignumber_js_1.default(collateralTokenMinPrice.toString()).dividedBy(Math.pow(10, constants_1.USD_DECIMALS));
986
- var entryOraclePrice = _this.getEntryPriceUsdSync(side, targetPrice, targetEmaPrice, targetCustodyAccount);
987
- var entryPriceUsdUi = new bignumber_js_1.default(entryOraclePrice.toUiPrice(constants_1.ORACLE_EXPONENT));
992
+ var entryPriceUsdBN = _this.getEntryPriceUsdSync(side, targetPrice, targetEmaPrice, targetCustodyAccount);
993
+ var entryPriceUsdUi = new bignumber_js_1.default(entryPriceUsdBN.toString()).dividedBy(Math.pow(10, constants_1.USD_DECIMALS));
988
994
  var collateralAmtMinUsdUi = new bignumber_js_1.default(collateralAmtWithFee.toString()).dividedBy(Math.pow(10, collateralToken.decimals))
989
995
  .multipliedBy(collateralTokenMinPriceUi);
990
996
  var openPosFeeRateUi = new bignumber_js_1.default(targetCustodyAccount.fees.openPosition.toString()).dividedBy(Math.pow(10, constants_1.RATE_DECIMALS));
@@ -1010,8 +1016,8 @@ var PerpetualsClient = (function () {
1010
1016
  }
1011
1017
  var collateralTokenMinPrice = _this.getMinAndMaxPriceSync(collateralTokenPrice, collateralTokenEmaPrice, collateralTokenCustodyAccount).min;
1012
1018
  var collateralTokenMinPriceUi = new bignumber_js_1.default(collateralTokenMinPrice.toString()).dividedBy(Math.pow(10, constants_1.USD_DECIMALS));
1013
- var entryOraclePrice = _this.getEntryPriceUsdSync(side, targetTokenPrice, targetTokenEmaPrice, targetTokenCustodyAccount);
1014
- var entryPriceUsdUi = new bignumber_js_1.default(entryOraclePrice.toUiPrice(constants_1.ORACLE_EXPONENT));
1019
+ var entryPriceUsdBN = _this.getEntryPriceUsdSync(side, targetTokenPrice, targetTokenEmaPrice, targetTokenCustodyAccount);
1020
+ var entryPriceUsdUi = new bignumber_js_1.default(entryPriceUsdBN.toString()).dividedBy(Math.pow(10, constants_1.USD_DECIMALS));
1015
1021
  var collateralAmtMinUsdUi = new bignumber_js_1.default(finalCollateralAmount.toString()).dividedBy(Math.pow(10, collateralTokenCustodyAccount.decimals))
1016
1022
  .multipliedBy(collateralTokenMinPriceUi);
1017
1023
  var openPosFeeRateUi = new bignumber_js_1.default(targetTokenCustodyAccount.fees.openPosition.toString()).dividedBy(Math.pow(10, constants_1.RATE_DECIMALS));
@@ -1028,8 +1034,8 @@ var PerpetualsClient = (function () {
1028
1034
  if (discountBps === void 0) { discountBps = constants_1.BN_ZERO; }
1029
1035
  var collateralTokenMinPrice = _this.getMinAndMaxPriceSync(collateralPrice, collateralEmaPrice, collateralCustodyAccount).min;
1030
1036
  var collateralTokenMinPriceUi = new bignumber_js_1.default(collateralTokenMinPrice.toString()).dividedBy(Math.pow(10, constants_1.USD_DECIMALS));
1031
- var entryOraclePrice = _this.getEntryPriceUsdSync(side, targetPrice, targetEmaPrice, targetCustodyAccount);
1032
- var entryPriceUsdUi = new bignumber_js_1.default(entryOraclePrice.toUiPrice(constants_1.ORACLE_EXPONENT));
1037
+ var entryPriceUsdBN = _this.getEntryPriceUsdSync(side, targetPrice, targetEmaPrice, targetCustodyAccount);
1038
+ var entryPriceUsdUi = new bignumber_js_1.default(entryPriceUsdBN.toString()).dividedBy(Math.pow(10, constants_1.USD_DECIMALS));
1033
1039
  var openPosFeeRateUi = new bignumber_js_1.default(targetCustodyAccount.fees.openPosition.toString()).dividedBy(Math.pow(10, constants_1.RATE_DECIMALS));
1034
1040
  if (!discountBps.isZero()) {
1035
1041
  var discountBpsUi = new bignumber_js_1.default(discountBps.toString()).dividedBy(Math.pow(10, constants_1.BPS_DECIMALS));
@@ -1044,8 +1050,8 @@ var PerpetualsClient = (function () {
1044
1050
  this.getCollateralAmountWithSwapSync = function (sizeAmount, leverage, side, poolAccount, inputTokenPrice, inputTokenEmaPrice, inputTokenCustodyAccount, swapOutTokenPrice, swapOutTokenEmaPrice, swapOutTokenCustodyAccount, collateralTokenPrice, collateralTokenEmaPrice, collateralTokenCustodyAccount, targetTokenPrice, targetTokenEmaPrice, targetTokenCustodyAccount, swapPoolAumUsdMax, poolConfigPosition, poolConfigSwap) {
1045
1051
  var collateralTokenMinPrice = _this.getMinAndMaxPriceSync(collateralTokenPrice, collateralTokenEmaPrice, collateralTokenCustodyAccount).min;
1046
1052
  var collateralTokenMinPriceUi = new bignumber_js_1.default(collateralTokenMinPrice.toString()).dividedBy(Math.pow(10, constants_1.USD_DECIMALS));
1047
- var entryOraclePrice = _this.getEntryPriceUsdSync(side, targetTokenPrice, targetTokenEmaPrice, targetTokenCustodyAccount);
1048
- var entryPriceUsdUi = new bignumber_js_1.default(entryOraclePrice.toUiPrice(constants_1.ORACLE_EXPONENT));
1053
+ var entryPriceUsdBN = _this.getEntryPriceUsdSync(side, targetTokenPrice, targetTokenEmaPrice, targetTokenCustodyAccount);
1054
+ var entryPriceUsdUi = new bignumber_js_1.default(entryPriceUsdBN.toString()).dividedBy(Math.pow(10, constants_1.USD_DECIMALS));
1049
1055
  var openPosFeeRateUi = new bignumber_js_1.default(targetTokenCustodyAccount.fees.openPosition.toString()).dividedBy(Math.pow(10, constants_1.RATE_DECIMALS));
1050
1056
  var sizeAmountUi = new bignumber_js_1.default(sizeAmount.toString()).dividedBy(Math.pow(10, targetTokenCustodyAccount.decimals));
1051
1057
  var sizeUsdUi = entryPriceUsdUi.multipliedBy(sizeAmountUi);
@@ -1152,7 +1158,7 @@ var PerpetualsClient = (function () {
1152
1158
  newPosition.collateralUsd = collateralMinMaxPrice.min.getAssetAmountUsd(newPosition.collateralAmount, collateralCustodyAccount.decimals);
1153
1159
  var entryPrice = OraclePrice_1.OraclePrice.from({ price: newPosition.entryPrice.price, exponent: new anchor_1.BN(newPosition.entryPrice.exponent), confidence: constants_1.BN_ZERO, timestamp: constants_1.BN_ZERO });
1154
1160
  var finalInterestUsd = _this.getLockFeeAndUnsettledUsdForPosition(newPosition, collateralCustodyAccount, currentTimestamp);
1155
- var finalLiquidationPrice = _this.getLiquidationPriceSync(newPosition.collateralAmount, newPosition.sizeAmount, entryPrice, finalInterestUsd, marketCorrelation, side, targetCustodyAccount, collateralPrice, collateralEmaPrice, collateralCustodyAccount, newPosition);
1161
+ var finalLiquidationPrice = _this.getLiquidationPriceSync(newPosition.collateralAmount, newPosition.sizeAmount, entryPrice.scale_to_exponent(new anchor_1.BN(constants_1.USD_DECIMALS).neg()).price, finalInterestUsd, marketCorrelation, side, targetCustodyAccount, collateralPrice, collateralEmaPrice, collateralCustodyAccount, newPosition);
1156
1162
  var finalPnl = _this.getPnlSync(newPosition, targetPrice, targetEmaPrice, targetCustodyAccount, collateralPrice, collateralEmaPrice, collateralCustodyAccount, currentTimestamp, targetCustodyAccount.pricing.delaySeconds, poolConfig);
1157
1163
  var finalPnlUsd = finalPnl.profitUsd.sub(finalPnl.lossUsd);
1158
1164
  var newExitFee = _this.getExitFeeSync(newPosition, targetCustodyAccount, collateralCustodyAccount, collateralPrice, collateralEmaPrice);
@@ -1172,7 +1178,7 @@ var PerpetualsClient = (function () {
1172
1178
  else {
1173
1179
  var entryPrice = OraclePrice_1.OraclePrice.from({ price: newPosition.entryPrice.price, exponent: new anchor_1.BN(newPosition.entryPrice.exponent), confidence: constants_1.BN_ZERO, timestamp: constants_1.BN_ZERO });
1174
1180
  var finalInterestUsd = _this.getLockFeeAndUnsettledUsdForPosition(newPosition, collateralCustodyAccount, currentTimestamp);
1175
- var finalLiquidationPrice = _this.getLiquidationPriceSync(newPosition.collateralAmount, newPosition.sizeAmount, entryPrice, finalInterestUsd, marketCorrelation, side, targetCustodyAccount, collateralPrice, collateralEmaPrice, collateralCustodyAccount, newPosition);
1181
+ var finalLiquidationPrice = _this.getLiquidationPriceSync(newPosition.collateralAmount, newPosition.sizeAmount, entryPrice.scale_to_exponent(new anchor_1.BN(constants_1.USD_DECIMALS).neg()).price, finalInterestUsd, marketCorrelation, side, targetCustodyAccount, collateralPrice, collateralEmaPrice, collateralCustodyAccount, newPosition);
1176
1182
  var finalPnl = _this.getPnlSync(newPosition, targetPrice, targetEmaPrice, targetCustodyAccount, collateralPrice, collateralEmaPrice, collateralCustodyAccount, currentTimestamp, targetCustodyAccount.pricing.delaySeconds, poolConfig);
1177
1183
  var finalPnlUsd = finalPnl.profitUsd.sub(finalPnl.lossUsd);
1178
1184
  var exitFee = _this.getExitFeeSync(newPosition, targetCustodyAccount, collateralCustodyAccount, collateralPrice, collateralEmaPrice);
@@ -1273,133 +1279,73 @@ var PerpetualsClient = (function () {
1273
1279
  lockFeeUsd = lockFeeUsd.add(position.unsettledFeesUsd);
1274
1280
  return lockFeeUsd;
1275
1281
  };
1276
- this.getLiquidationPriceSync = function (collateralAmount, sizeAmount, entryOraclePrice, lockAndUnsettledFeeUsd, marketCorrelation, side, custodyAccount, collateralPrice, collateralEmaPrice, collateralCustodyAccount, positionAccount) {
1277
- var zeroOraclePrice = OraclePrice_1.OraclePrice.from({
1278
- price: constants_1.BN_ZERO,
1279
- exponent: constants_1.BN_ZERO,
1280
- confidence: constants_1.BN_ZERO,
1281
- timestamp: constants_1.BN_ZERO
1282
- });
1282
+ this.getLiquidationPriceSync = function (collateralAmount, sizeAmount, entryPriceUsd, lockAndUnsettledFeeUsd, marketCorrelation, side, custodyAccount, collateralPrice, collateralEmaPrice, collateralCustodyAccount, positionAccount) {
1283
1283
  if (collateralAmount.isZero() || sizeAmount.isZero()) {
1284
- return zeroOraclePrice;
1285
- }
1286
- if (positionAccount.entryPrice.exponent && !entryOraclePrice.exponent.eq(new anchor_1.BN(positionAccount.entryPrice.exponent))) {
1287
- throw new Error("Exponent mismatch : ".concat(positionAccount.entryPrice.exponent, " & ").concat(entryOraclePrice.exponent.toString(), " ").concat(entryOraclePrice === null || entryOraclePrice === void 0 ? void 0 : entryOraclePrice.toUiPrice(8)));
1284
+ return constants_1.BN_ZERO;
1288
1285
  }
1289
1286
  var exitFeeUsd = positionAccount.sizeUsd.mul(custodyAccount.fees.closePosition).div(new anchor_1.BN(constants_1.RATE_POWER));
1290
1287
  var unsettledLossUsd = exitFeeUsd.add(lockAndUnsettledFeeUsd);
1291
- var liablitiesUsd = positionAccount.sizeUsd.mul(new anchor_1.BN(constants_1.BPS_POWER)).div(custodyAccount.pricing.maxLeverage).add(unsettledLossUsd);
1292
- var assetsUsd = constants_1.BN_ZERO;
1293
- if (marketCorrelation) {
1294
- assetsUsd = positionAccount.collateralUsd;
1288
+ var liablityThresholdUsd = positionAccount.sizeUsd.mul(new anchor_1.BN(constants_1.BPS_POWER)).div(custodyAccount.pricing.maxLeverage).add(unsettledLossUsd);
1289
+ var collateralMinPriceOracle = _this.getMinAndMaxOraclePriceSync(collateralPrice, collateralEmaPrice, collateralCustodyAccount).min;
1290
+ var currentCollateralUsd = collateralMinPriceOracle.getAssetAmountUsd(collateralAmount, collateralCustodyAccount.decimals);
1291
+ var nominalSolvency;
1292
+ if (currentCollateralUsd.gt(liablityThresholdUsd)) {
1293
+ nominalSolvency = true;
1295
1294
  }
1296
1295
  else {
1297
- var collateralMinPriceOracle = _this.getMinAndMaxOraclePriceSync(collateralPrice, collateralEmaPrice, collateralCustodyAccount).min;
1298
- assetsUsd = collateralMinPriceOracle.getAssetAmountUsd(collateralAmount, collateralCustodyAccount.decimals);
1296
+ nominalSolvency = false;
1299
1297
  }
1300
- var liquidationPrice;
1301
- if (marketCorrelation && (0, types_1.isVariant)(side, 'long')) {
1302
- var lp = OraclePrice_1.OraclePrice.from({
1303
- price: (positionAccount.sizeUsd.add(liablitiesUsd)).mul(new anchor_1.BN(Math.pow(10, (positionAccount.sizeDecimals + 3))))
1304
- .div(sizeAmount.add(collateralAmount)),
1305
- exponent: new anchor_1.BN(-1 * constants_1.RATE_DECIMALS),
1306
- confidence: constants_1.BN_ZERO,
1307
- timestamp: constants_1.BN_ZERO
1308
- });
1309
- liquidationPrice = lp.scale_to_exponent(new anchor_1.BN(entryOraclePrice.exponent));
1298
+ var remainingMarginUsd, requiredMarginUsd;
1299
+ if (nominalSolvency) {
1300
+ remainingMarginUsd = currentCollateralUsd.sub(liablityThresholdUsd);
1301
+ requiredMarginUsd = constants_1.BN_ZERO;
1310
1302
  }
1311
1303
  else {
1312
- if (assetsUsd.gte(liablitiesUsd)) {
1313
- var priceDiffLossOracle = OraclePrice_1.OraclePrice.from({
1314
- price: (assetsUsd.sub(liablitiesUsd)).mul(new anchor_1.BN(Math.pow(10, (positionAccount.sizeDecimals + 3))))
1315
- .div(positionAccount.sizeAmount),
1316
- exponent: new anchor_1.BN(-1 * constants_1.RATE_DECIMALS),
1317
- confidence: constants_1.BN_ZERO,
1318
- timestamp: constants_1.BN_ZERO
1319
- }).scale_to_exponent(new anchor_1.BN(entryOraclePrice.exponent));
1320
- if ((0, types_1.isVariant)(side, 'long')) {
1321
- liquidationPrice = OraclePrice_1.OraclePrice.from({
1322
- price: entryOraclePrice.price.sub(priceDiffLossOracle.price),
1323
- exponent: new anchor_1.BN(entryOraclePrice.exponent),
1324
- confidence: constants_1.BN_ZERO,
1325
- timestamp: constants_1.BN_ZERO
1326
- });
1327
- }
1328
- else {
1329
- liquidationPrice = OraclePrice_1.OraclePrice.from({
1330
- price: entryOraclePrice.price.add(priceDiffLossOracle.price),
1331
- exponent: new anchor_1.BN(entryOraclePrice.exponent),
1332
- confidence: constants_1.BN_ZERO,
1333
- timestamp: constants_1.BN_ZERO
1334
- });
1335
- }
1304
+ remainingMarginUsd = constants_1.BN_ZERO;
1305
+ requiredMarginUsd = liablityThresholdUsd.sub(currentCollateralUsd);
1306
+ }
1307
+ var liquidationPrice = constants_1.BN_ZERO;
1308
+ if ((0, types_1.isVariant)(side, 'long')) {
1309
+ if (marketCorrelation) {
1310
+ liquidationPrice = positionAccount.sizeUsd.add(liablityThresholdUsd).mul(new anchor_1.BN(10).pow(new anchor_1.BN(positionAccount.sizeDecimals))).div(sizeAmount.add(collateralAmount));
1311
+ }
1312
+ else if (nominalSolvency) {
1313
+ var priceDiscount = (remainingMarginUsd.mul(new anchor_1.BN(10).pow(new anchor_1.BN(positionAccount.sizeDecimals)))).div(sizeAmount);
1314
+ liquidationPrice = entryPriceUsd.sub(priceDiscount);
1336
1315
  }
1337
1316
  else {
1338
- var priceDiffProfitOracle = OraclePrice_1.OraclePrice.from({
1339
- price: (liablitiesUsd.sub(assetsUsd)).mul(new anchor_1.BN(Math.pow(10, (positionAccount.sizeDecimals + 3))))
1340
- .div(positionAccount.sizeAmount),
1341
- exponent: new anchor_1.BN(-1 * constants_1.RATE_DECIMALS),
1342
- confidence: constants_1.BN_ZERO,
1343
- timestamp: constants_1.BN_ZERO
1344
- }).scale_to_exponent(new anchor_1.BN(entryOraclePrice.exponent));
1345
- if ((0, types_1.isVariant)(side, 'long')) {
1346
- liquidationPrice = OraclePrice_1.OraclePrice.from({
1347
- price: entryOraclePrice.price.add(priceDiffProfitOracle.price),
1348
- exponent: new anchor_1.BN(entryOraclePrice.exponent),
1349
- confidence: constants_1.BN_ZERO,
1350
- timestamp: constants_1.BN_ZERO
1351
- });
1352
- }
1353
- else {
1354
- liquidationPrice = OraclePrice_1.OraclePrice.from({
1355
- price: entryOraclePrice.price.sub(priceDiffProfitOracle.price),
1356
- exponent: new anchor_1.BN(entryOraclePrice.exponent),
1357
- confidence: constants_1.BN_ZERO,
1358
- timestamp: constants_1.BN_ZERO
1359
- });
1360
- }
1317
+ var pricePremium = (requiredMarginUsd.mul(new anchor_1.BN(10).pow(new anchor_1.BN(positionAccount.sizeDecimals)))).div(sizeAmount);
1318
+ liquidationPrice = entryPriceUsd.add(pricePremium);
1361
1319
  }
1362
1320
  }
1363
- return liquidationPrice.price.isNeg() ? zeroOraclePrice : liquidationPrice;
1321
+ else {
1322
+ if (nominalSolvency) {
1323
+ var pricePremium = (remainingMarginUsd.mul(new anchor_1.BN(10).pow(new anchor_1.BN(positionAccount.sizeDecimals)))).div(sizeAmount);
1324
+ liquidationPrice = entryPriceUsd.add(pricePremium);
1325
+ }
1326
+ else {
1327
+ var priceDiscount = (requiredMarginUsd.mul(new anchor_1.BN(10).pow(new anchor_1.BN(positionAccount.sizeDecimals)))).div(sizeAmount);
1328
+ liquidationPrice = entryPriceUsd.sub(priceDiscount);
1329
+ }
1330
+ }
1331
+ return liquidationPrice.isNeg() ? constants_1.BN_ZERO : liquidationPrice;
1364
1332
  };
1365
- this.getMaxProfitPriceSync = function (entryPrice, marketCorrelation, side, positionAccount) {
1366
- var zeroOraclePrice = OraclePrice_1.OraclePrice.from({
1367
- price: constants_1.BN_ZERO,
1368
- exponent: constants_1.BN_ZERO,
1369
- confidence: constants_1.BN_ZERO,
1370
- timestamp: constants_1.BN_ZERO
1371
- });
1333
+ this.getMaxProfitPriceSync = function (entryPriceUsd, marketCorrelation, side, positionAccount) {
1372
1334
  if (positionAccount.sizeAmount.isZero()) {
1373
- return zeroOraclePrice;
1335
+ return constants_1.BN_ZERO;
1374
1336
  }
1375
- var priceDiffProfit = OraclePrice_1.OraclePrice.from({
1376
- price: positionAccount.lockedUsd.mul(new anchor_1.BN(10).pow(new anchor_1.BN(positionAccount.sizeDecimals + 3)))
1377
- .div(positionAccount.sizeAmount),
1378
- exponent: new anchor_1.BN(-1 * constants_1.RATE_DECIMALS),
1379
- confidence: constants_1.BN_ZERO,
1380
- timestamp: constants_1.BN_ZERO
1381
- }).scale_to_exponent(new anchor_1.BN(positionAccount.entryPrice.exponent));
1382
- var maxProfitPrice;
1337
+ var priceDiffProfit = positionAccount.lockedUsd.mul(new anchor_1.BN(10).pow(new anchor_1.BN(positionAccount.sizeDecimals))).div(positionAccount.sizeAmount);
1338
+ var maxProfitPrice = constants_1.BN_ZERO;
1383
1339
  if ((0, types_1.isVariant)(side, 'long')) {
1384
1340
  if (marketCorrelation) {
1385
- return zeroOraclePrice;
1341
+ return constants_1.BN_ZERO;
1386
1342
  }
1387
- maxProfitPrice = OraclePrice_1.OraclePrice.from({
1388
- price: entryPrice.price.add(priceDiffProfit.price),
1389
- exponent: new anchor_1.BN(-1 * constants_1.RATE_DECIMALS),
1390
- confidence: constants_1.BN_ZERO,
1391
- timestamp: constants_1.BN_ZERO
1392
- });
1343
+ maxProfitPrice = entryPriceUsd.add(priceDiffProfit);
1393
1344
  }
1394
1345
  else {
1395
- maxProfitPrice = OraclePrice_1.OraclePrice.from({
1396
- price: entryPrice.price.sub(priceDiffProfit.price),
1397
- exponent: new anchor_1.BN(-1 * constants_1.RATE_DECIMALS),
1398
- confidence: constants_1.BN_ZERO,
1399
- timestamp: constants_1.BN_ZERO
1400
- });
1346
+ maxProfitPrice = entryPriceUsd.sub(priceDiffProfit);
1401
1347
  }
1402
- return maxProfitPrice.price.isNeg() ? zeroOraclePrice : maxProfitPrice;
1348
+ return maxProfitPrice.isNeg() ? constants_1.BN_ZERO : maxProfitPrice;
1403
1349
  };
1404
1350
  this.getPnlSync = function (positionAccount, targetTokenPrice, targetTokenEmaPrice, targetCustodyAccount, collateralPrice, collateralEmaPrice, collateralCustodyAccount, currentTimestamp, delay, poolConfig) {
1405
1351
  if (positionAccount.sizeUsd.isZero() || positionAccount.entryPrice.price.isZero()) {
@@ -1409,64 +1355,61 @@ var PerpetualsClient = (function () {
1409
1355
  };
1410
1356
  }
1411
1357
  var side = poolConfig.getMarketConfigByPk(positionAccount.market).side;
1412
- var exitOraclePrice = _this.getExitOraclePriceSync(side, targetTokenPrice, targetTokenEmaPrice, targetCustodyAccount);
1358
+ var exitPrice = _this.getExitPriceSync(side, targetTokenPrice, targetTokenEmaPrice, targetCustodyAccount);
1413
1359
  var collateralMinPrice = _this.getMinAndMaxOraclePriceSync(collateralPrice, collateralEmaPrice, collateralCustodyAccount).min;
1414
- var priceDiffProfit, priceDiffLoss;
1360
+ var priceDiffProfitUsd, priceDiffLossUsd;
1415
1361
  var positionEntryPrice = OraclePrice_1.OraclePrice.from({
1416
1362
  price: positionAccount.entryPrice.price,
1417
1363
  exponent: new anchor_1.BN(positionAccount.entryPrice.exponent),
1418
1364
  confidence: constants_1.BN_ZERO,
1419
1365
  timestamp: constants_1.BN_ZERO
1420
- });
1421
- if (!exitOraclePrice.exponent.eq(positionEntryPrice.exponent)) {
1422
- throw new Error("exponent mistach");
1423
- }
1366
+ })
1367
+ .scale_to_exponent(new anchor_1.BN(-1 * constants_1.USD_DECIMALS));
1424
1368
  if ((0, types_1.isVariant)(side, 'long')) {
1425
- if (exitOraclePrice.price.gt(positionEntryPrice.price)) {
1369
+ if (exitPrice.gt(positionEntryPrice.price)) {
1426
1370
  if (currentTimestamp.gt(positionAccount.updateTime.add(delay))) {
1427
- priceDiffProfit = new OraclePrice_1.OraclePrice({ price: exitOraclePrice.price.sub(positionEntryPrice.price), exponent: exitOraclePrice.exponent, confidence: exitOraclePrice.confidence, timestamp: constants_1.BN_ZERO });
1428
- priceDiffLoss = new OraclePrice_1.OraclePrice({ price: constants_1.BN_ZERO, exponent: exitOraclePrice.exponent, confidence: constants_1.BN_ZERO, timestamp: constants_1.BN_ZERO });
1371
+ priceDiffProfitUsd = exitPrice.sub(positionEntryPrice.price);
1372
+ priceDiffLossUsd = constants_1.BN_ZERO;
1429
1373
  }
1430
1374
  else {
1431
- priceDiffProfit = new OraclePrice_1.OraclePrice({ price: constants_1.BN_ZERO, exponent: exitOraclePrice.exponent, confidence: constants_1.BN_ZERO, timestamp: constants_1.BN_ZERO });
1432
- priceDiffLoss = new OraclePrice_1.OraclePrice({ price: constants_1.BN_ZERO, exponent: exitOraclePrice.exponent, confidence: constants_1.BN_ZERO, timestamp: constants_1.BN_ZERO });
1375
+ priceDiffProfitUsd = constants_1.BN_ZERO;
1376
+ priceDiffLossUsd = constants_1.BN_ZERO;
1433
1377
  }
1434
1378
  }
1435
1379
  else {
1436
- priceDiffProfit = new OraclePrice_1.OraclePrice({ price: constants_1.BN_ZERO, exponent: exitOraclePrice.exponent, confidence: constants_1.BN_ZERO, timestamp: constants_1.BN_ZERO });
1437
- priceDiffLoss = new OraclePrice_1.OraclePrice({ price: positionEntryPrice.price.sub(exitOraclePrice.price), exponent: exitOraclePrice.exponent, confidence: constants_1.BN_ZERO, timestamp: constants_1.BN_ZERO });
1380
+ priceDiffProfitUsd = constants_1.BN_ZERO;
1381
+ priceDiffLossUsd = positionEntryPrice.price.sub(exitPrice);
1438
1382
  }
1439
1383
  }
1440
1384
  else {
1441
- if (exitOraclePrice.price.lt(positionEntryPrice.price)) {
1385
+ if (exitPrice.lt(positionEntryPrice.price)) {
1442
1386
  if (currentTimestamp.gt(positionAccount.updateTime.add(delay))) {
1443
- priceDiffProfit = new OraclePrice_1.OraclePrice({ price: positionEntryPrice.price.sub(exitOraclePrice.price), exponent: exitOraclePrice.exponent, confidence: constants_1.BN_ZERO, timestamp: constants_1.BN_ZERO });
1444
- priceDiffLoss = new OraclePrice_1.OraclePrice({ price: constants_1.BN_ZERO, exponent: exitOraclePrice.exponent, confidence: constants_1.BN_ZERO, timestamp: constants_1.BN_ZERO });
1387
+ priceDiffProfitUsd = positionEntryPrice.price.sub(exitPrice);
1388
+ priceDiffLossUsd = constants_1.BN_ZERO;
1445
1389
  }
1446
1390
  else {
1447
- priceDiffProfit = new OraclePrice_1.OraclePrice({ price: constants_1.BN_ZERO, exponent: exitOraclePrice.exponent, confidence: constants_1.BN_ZERO, timestamp: constants_1.BN_ZERO });
1448
- priceDiffLoss = new OraclePrice_1.OraclePrice({ price: constants_1.BN_ZERO, exponent: exitOraclePrice.exponent, confidence: constants_1.BN_ZERO, timestamp: constants_1.BN_ZERO });
1391
+ priceDiffProfitUsd = constants_1.BN_ZERO;
1392
+ priceDiffLossUsd = constants_1.BN_ZERO;
1449
1393
  }
1450
1394
  }
1451
1395
  else {
1452
- priceDiffProfit = new OraclePrice_1.OraclePrice({ price: constants_1.BN_ZERO, exponent: exitOraclePrice.exponent, confidence: constants_1.BN_ZERO, timestamp: constants_1.BN_ZERO });
1453
- priceDiffLoss = new OraclePrice_1.OraclePrice({ price: exitOraclePrice.price.sub(positionEntryPrice.price), exponent: exitOraclePrice.exponent, confidence: constants_1.BN_ZERO, timestamp: constants_1.BN_ZERO });
1396
+ priceDiffProfitUsd = constants_1.BN_ZERO;
1397
+ priceDiffLossUsd = exitPrice.sub(positionEntryPrice.price);
1454
1398
  }
1455
1399
  }
1456
1400
  ;
1457
- if (!priceDiffProfit.exponent.eq(priceDiffLoss.exponent)) {
1458
- throw new Error("exponent mistach");
1459
- }
1460
- if (priceDiffProfit.price.gt(constants_1.BN_ZERO)) {
1401
+ var priceDiffProfitOracle = new OraclePrice_1.OraclePrice({ price: priceDiffProfitUsd, exponent: new anchor_1.BN(constants_1.USD_DECIMALS).neg(), confidence: constants_1.BN_ZERO, timestamp: constants_1.BN_ZERO });
1402
+ var priceDiffLossOracle = new OraclePrice_1.OraclePrice({ price: priceDiffLossUsd, exponent: new anchor_1.BN(constants_1.USD_DECIMALS).neg(), confidence: constants_1.BN_ZERO, timestamp: constants_1.BN_ZERO });
1403
+ if (priceDiffProfitUsd.gt(constants_1.BN_ZERO)) {
1461
1404
  return {
1462
- profitUsd: anchor_1.BN.min(priceDiffProfit.getAssetAmountUsd(positionAccount.sizeAmount, positionAccount.sizeDecimals), collateralMinPrice.getAssetAmountUsd(positionAccount.lockedAmount, positionAccount.lockedDecimals)),
1405
+ profitUsd: anchor_1.BN.min(priceDiffProfitOracle.getAssetAmountUsd(positionAccount.sizeAmount, positionAccount.sizeDecimals), collateralMinPrice.getAssetAmountUsd(positionAccount.lockedAmount, positionAccount.lockedDecimals)),
1463
1406
  lossUsd: constants_1.BN_ZERO,
1464
1407
  };
1465
1408
  }
1466
1409
  else {
1467
1410
  return {
1468
1411
  profitUsd: constants_1.BN_ZERO,
1469
- lossUsd: priceDiffLoss.getAssetAmountUsd(positionAccount.sizeAmount, positionAccount.sizeDecimals),
1412
+ lossUsd: priceDiffLossOracle.getAssetAmountUsd(positionAccount.sizeAmount, positionAccount.sizeDecimals),
1470
1413
  };
1471
1414
  }
1472
1415
  };
@@ -1482,46 +1425,31 @@ var PerpetualsClient = (function () {
1482
1425
  feeOut: constants_1.BN_ZERO,
1483
1426
  };
1484
1427
  }
1485
- var newInputTokenPrice, newInputTokenEmaPrice;
1486
- var newOutputTokenPrice, newOutputTokenEmaPrice;
1487
- if (inputTokenPrice.exponent.lte(outputTokenPrice.exponent)) {
1488
- newInputTokenPrice = inputTokenPrice;
1489
- newInputTokenEmaPrice = inputTokenEmaPrice;
1490
- newOutputTokenPrice = outputTokenPrice.scale_to_exponent(inputTokenPrice.exponent);
1491
- newOutputTokenEmaPrice = outputTokenEmaPrice.scale_to_exponent(inputTokenPrice.exponent);
1492
- }
1493
- else {
1494
- newInputTokenPrice = inputTokenPrice.scale_to_exponent(outputTokenPrice.exponent);
1495
- newInputTokenEmaPrice = inputTokenEmaPrice.scale_to_exponent(outputTokenPrice.exponent);
1496
- newOutputTokenPrice = outputTokenPrice;
1497
- newOutputTokenEmaPrice = outputTokenEmaPrice;
1498
- }
1499
- if (!newInputTokenPrice.exponent.eq(newOutputTokenPrice.exponent)) {
1500
- throw "Exponents mistmatch ".concat(newInputTokenPrice.exponent.toNumber(), " != ").concat(newOutputTokenPrice.exponent.toNumber());
1428
+ if (!inputTokenPrice.exponent.eq(outputTokenPrice.exponent) ||
1429
+ !inputTokenEmaPrice.exponent.eq(outputTokenEmaPrice.exponent)) {
1430
+ throw new Error("exponent mismatch");
1501
1431
  }
1502
- var inputMinMaxPrice = _this.getMinAndMaxOraclePriceSync(newInputTokenPrice, newInputTokenEmaPrice, inputTokenCustodyAccount);
1503
- var outputMinMaxPrice = _this.getMinAndMaxOraclePriceSync(newOutputTokenPrice, newOutputTokenEmaPrice, outputTokenCustodyAccount);
1432
+ var inputMinMaxPrice = _this.getMinAndMaxOraclePriceSync(inputTokenPrice, inputTokenEmaPrice, inputTokenCustodyAccount);
1433
+ var outputMinMaxPrice = _this.getMinAndMaxOraclePriceSync(outputTokenPrice, outputTokenEmaPrice, outputTokenCustodyAccount);
1504
1434
  var pairPrice;
1505
- var inputTokenAmount;
1506
- var outputTokenAmount;
1435
+ var swapAmount;
1507
1436
  var feeIn;
1508
1437
  var feeOut;
1509
1438
  if (amountIn.isZero()) {
1510
1439
  if (inputTokenCustodyAccount.isStable &&
1511
1440
  inputMinMaxPrice.min != inputMinMaxPrice.max &&
1512
- inputTokenCustodyAccount.depegAdjustment) {
1441
+ inputMinMaxPrice.max.price.lt(new anchor_1.BN(10).pow(inputMinMaxPrice.max.exponent))) {
1513
1442
  pairPrice = outputMinMaxPrice.min.price;
1514
1443
  }
1515
1444
  else {
1516
1445
  pairPrice = outputMinMaxPrice.min.price.mul(new anchor_1.BN(10).pow(outputMinMaxPrice.min.exponent)).div(inputMinMaxPrice.max.price);
1517
1446
  }
1518
1447
  var swapPrice = pairPrice.sub(pairPrice.mul(outputTokenCustodyAccount.pricing.swapSpread).div(new anchor_1.BN(constants_1.BPS_POWER)));
1519
- inputTokenAmount = (0, utils_1.checkedDecimalMul)(amountOut, new anchor_1.BN(-1 * outputTokenCustodyAccount.decimals), swapPrice, inputMinMaxPrice.min.exponent, new anchor_1.BN(-1 * inputTokenCustodyAccount.decimals));
1520
- feeIn = _this.getFeeHelper(types_1.FeesAction.SwapIn, inputTokenAmount, constants_1.BN_ZERO, inputTokenCustodyAccount, inputMinMaxPrice.max, poolAumUsdMax, poolAccount, poolConfig).feeAmount;
1521
- feeOut = _this.getFeeHelper(types_1.FeesAction.SwapOut, constants_1.BN_ZERO, amountOut, outputTokenCustodyAccount, outputMinMaxPrice.max, poolAumUsdMax, poolAccount, poolConfig).feeAmount;
1522
- var swapAmount = (0, utils_1.checkedDecimalMul)(amountOut.add(feeOut), new anchor_1.BN(-1 * outputTokenCustodyAccount.decimals), swapPrice, inputMinMaxPrice.min.exponent, new anchor_1.BN(-1 * inputTokenCustodyAccount.decimals)).add(feeIn);
1448
+ swapAmount = (0, utils_1.checkedDecimalMul)(amountOut, new anchor_1.BN(-1 * outputTokenCustodyAccount.decimals), swapPrice, inputMinMaxPrice.min.exponent, new anchor_1.BN(-1 * inputTokenCustodyAccount.decimals));
1449
+ feeIn = _this.getFeeHelper(types_1.FeesAction.SwapIn, swapAmount, constants_1.BN_ZERO, inputTokenCustodyAccount, inputMinMaxPrice.max.price, poolAumUsdMax, poolAccount, poolConfig).feeAmount;
1450
+ feeOut = _this.getFeeHelper(types_1.FeesAction.SwapOut, constants_1.BN_ZERO, amountOut, outputTokenCustodyAccount, outputMinMaxPrice.max.price, poolAumUsdMax, poolAccount, poolConfig).feeAmount;
1523
1451
  return {
1524
- minAmountIn: swapAmount,
1452
+ minAmountIn: swapAmount.add(feeIn),
1525
1453
  minAmountOut: constants_1.BN_ZERO,
1526
1454
  feeIn: feeIn,
1527
1455
  feeOut: feeOut,
@@ -1530,20 +1458,19 @@ var PerpetualsClient = (function () {
1530
1458
  else {
1531
1459
  if (outputTokenCustodyAccount.isStable &&
1532
1460
  outputMinMaxPrice.min != outputMinMaxPrice.max &&
1533
- outputTokenCustodyAccount.depegAdjustment) {
1461
+ outputMinMaxPrice.max.price.lt(new anchor_1.BN(10).pow(outputMinMaxPrice.max.exponent))) {
1534
1462
  pairPrice = inputMinMaxPrice.min.price;
1535
1463
  }
1536
1464
  else {
1537
1465
  pairPrice = inputMinMaxPrice.min.price.mul(new anchor_1.BN(10).pow(inputMinMaxPrice.min.exponent)).div(outputMinMaxPrice.max.price);
1538
1466
  }
1539
1467
  var swapPrice = pairPrice.sub(pairPrice.mul(inputTokenCustodyAccount.pricing.swapSpread).div(new anchor_1.BN(constants_1.BPS_POWER)));
1540
- outputTokenAmount = (0, utils_1.checkedDecimalMul)(amountIn, new anchor_1.BN(-1 * inputTokenCustodyAccount.decimals), swapPrice, inputMinMaxPrice.min.exponent, new anchor_1.BN(-1 * outputTokenCustodyAccount.decimals));
1541
- feeIn = _this.getFeeHelper(types_1.FeesAction.SwapIn, amountIn, constants_1.BN_ZERO, inputTokenCustodyAccount, inputMinMaxPrice.max, poolAumUsdMax, poolAccount, poolConfig).feeAmount;
1542
- feeOut = _this.getFeeHelper(types_1.FeesAction.SwapOut, constants_1.BN_ZERO, outputTokenAmount, outputTokenCustodyAccount, outputMinMaxPrice.max, poolAumUsdMax, poolAccount, poolConfig).feeAmount;
1543
- var swapAmount = (0, utils_1.checkedDecimalMul)(amountIn.sub(feeIn), new anchor_1.BN(-1 * inputTokenCustodyAccount.decimals), swapPrice, inputMinMaxPrice.min.exponent, new anchor_1.BN(-1 * outputTokenCustodyAccount.decimals)).sub(feeOut);
1468
+ swapAmount = (0, utils_1.checkedDecimalMul)(amountIn, new anchor_1.BN(-1 * inputTokenCustodyAccount.decimals), swapPrice, inputMinMaxPrice.min.exponent, new anchor_1.BN(-1 * outputTokenCustodyAccount.decimals));
1469
+ feeIn = _this.getFeeHelper(types_1.FeesAction.SwapIn, amountIn, constants_1.BN_ZERO, inputTokenCustodyAccount, inputMinMaxPrice.max.price, poolAumUsdMax, poolAccount, poolConfig).feeAmount;
1470
+ feeOut = _this.getFeeHelper(types_1.FeesAction.SwapOut, constants_1.BN_ZERO, swapAmount, outputTokenCustodyAccount, outputMinMaxPrice.max.price, poolAumUsdMax, poolAccount, poolConfig).feeAmount;
1544
1471
  return {
1545
1472
  minAmountIn: constants_1.BN_ZERO,
1546
- minAmountOut: swapAmount,
1473
+ minAmountOut: swapAmount.sub(feeOut),
1547
1474
  feeIn: feeIn,
1548
1475
  feeOut: feeOut,
1549
1476
  };
@@ -2926,7 +2853,7 @@ var PerpetualsClient = (function () {
2926
2853
  perpetuals: poolConfig.perpetuals,
2927
2854
  pool: poolConfig.poolAddress,
2928
2855
  custody: payTokenCustodyConfig.custodyAccount,
2929
- custodyOracleAccount: payTokenCustodyConfig.oracleAddress,
2856
+ custodyOracleAccount: this.useCustomOracle ? payTokenCustodyConfig.customOracleAddress : payTokenCustodyConfig.oracleAddress,
2930
2857
  custodyTokenAccount: payTokenCustodyConfig.tokenAccount,
2931
2858
  lpTokenMint: poolConfig.lpTokenMint,
2932
2859
  eventAuthority: this.eventAuthority.publicKey,
@@ -4150,8 +4077,9 @@ var PerpetualsClient = (function () {
4150
4077
  this.getMarketPk(targetCustody, collateralCustody, side),
4151
4078
  ]).publicKey;
4152
4079
  };
4153
- PerpetualsClient.prototype.getNewRatioHelper = function (amountAdd, amountRemove, custodyAccount, maxPriceOracle, poolAumUsdMax) {
4080
+ PerpetualsClient.prototype.getNewRatioHelper = function (amountAdd, amountRemove, custodyAccount, maxPrice, poolAumUsdMax) {
4154
4081
  var newRatio = constants_1.BN_ZERO;
4082
+ var maxPriceOracle = OraclePrice_1.OraclePrice.from({ price: new anchor_1.BN(maxPrice), exponent: new anchor_1.BN(-1 * constants_1.USD_DECIMALS), confidence: constants_1.BN_ZERO, timestamp: constants_1.BN_ZERO });
4155
4083
  var tokenAumUsd = maxPriceOracle.getAssetAmountUsd(custodyAccount.assets.owned, custodyAccount.decimals);
4156
4084
  if (amountAdd.gt(constants_1.BN_ZERO) && amountRemove.gt(constants_1.BN_ZERO)) {
4157
4085
  throw new Error("cannot add and remove liquidity together");
@@ -4174,16 +4102,50 @@ var PerpetualsClient = (function () {
4174
4102
  }
4175
4103
  return newRatio;
4176
4104
  };
4105
+ PerpetualsClient.prototype.getPriceAfterSlippageOld = function (isEntry, slippageBps, targetPrice, targetEmaPrice, side, custody) {
4106
+ if (isEntry) {
4107
+ var current_price_usd = this.getEntryPriceUsdSync(side, targetPrice, targetEmaPrice, custody);
4108
+ var spread_i = (0, utils_1.checkedDecimalCeilMul)(current_price_usd, new anchor_1.BN(-1 * constants_1.USD_DECIMALS), slippageBps, new anchor_1.BN(-1 * constants_1.BPS_DECIMALS), new anchor_1.BN(-1 * constants_1.USD_DECIMALS));
4109
+ if ((0, types_1.isVariant)(side, 'long')) {
4110
+ return { price: current_price_usd.add(spread_i), exponent: targetPrice.exponent.toNumber() };
4111
+ }
4112
+ else {
4113
+ if (spread_i.lt(current_price_usd)) {
4114
+ return { price: current_price_usd.sub(spread_i), exponent: targetPrice.exponent.toNumber() };
4115
+ }
4116
+ else {
4117
+ return { price: constants_1.BN_ZERO, exponent: targetPrice.exponent.toNumber() };
4118
+ }
4119
+ ;
4120
+ }
4121
+ }
4122
+ else {
4123
+ var current_price = this.getExitPriceSync(side, targetPrice, targetEmaPrice, custody);
4124
+ var spread_i = (0, utils_1.checkedDecimalCeilMul)(current_price, new anchor_1.BN(-1 * constants_1.USD_DECIMALS), slippageBps, new anchor_1.BN(-1 * constants_1.BPS_DECIMALS), new anchor_1.BN(-1 * constants_1.USD_DECIMALS));
4125
+ if ((0, types_1.isVariant)(side, 'long')) {
4126
+ if (spread_i.lt(current_price)) {
4127
+ return { price: current_price.sub(spread_i), exponent: targetPrice.exponent.toNumber() };
4128
+ }
4129
+ else {
4130
+ return { price: constants_1.BN_ZERO, exponent: targetPrice.exponent.toNumber() };
4131
+ }
4132
+ ;
4133
+ }
4134
+ else {
4135
+ return { price: current_price.add(spread_i), exponent: targetPrice.exponent.toNumber() };
4136
+ }
4137
+ }
4138
+ };
4177
4139
  PerpetualsClient.prototype.getPriceAfterSlippage = function (isEntry, slippageBps, targetPrice, side) {
4178
4140
  if (isEntry) {
4179
- var currentPrice = targetPrice.price;
4180
- var spread_i = (0, utils_1.checkedDecimalCeilMul)(currentPrice, targetPrice.exponent, slippageBps, new anchor_1.BN(-1 * constants_1.BPS_DECIMALS), targetPrice.exponent);
4141
+ var current_price = targetPrice.price;
4142
+ var spread_i = (0, utils_1.checkedDecimalCeilMul)(current_price, new anchor_1.BN(-1 * constants_1.USD_DECIMALS), slippageBps, new anchor_1.BN(-1 * constants_1.BPS_DECIMALS), new anchor_1.BN(-1 * constants_1.USD_DECIMALS));
4181
4143
  if ((0, types_1.isVariant)(side, 'long')) {
4182
- return { price: currentPrice.add(spread_i), exponent: targetPrice.exponent.toNumber() };
4144
+ return { price: current_price.add(spread_i), exponent: targetPrice.exponent.toNumber() };
4183
4145
  }
4184
4146
  else {
4185
- if (spread_i.lt(currentPrice)) {
4186
- return { price: currentPrice.sub(spread_i), exponent: targetPrice.exponent.toNumber() };
4147
+ if (spread_i.lt(current_price)) {
4148
+ return { price: current_price.sub(spread_i), exponent: targetPrice.exponent.toNumber() };
4187
4149
  }
4188
4150
  else {
4189
4151
  return { price: constants_1.BN_ZERO, exponent: targetPrice.exponent.toNumber() };
@@ -4193,7 +4155,7 @@ var PerpetualsClient = (function () {
4193
4155
  }
4194
4156
  else {
4195
4157
  var current_price = targetPrice.price;
4196
- var spread_i = (0, utils_1.checkedDecimalCeilMul)(current_price, targetPrice.exponent, slippageBps, new anchor_1.BN(-1 * constants_1.BPS_DECIMALS), targetPrice.exponent);
4158
+ var spread_i = (0, utils_1.checkedDecimalCeilMul)(current_price, new anchor_1.BN(-1 * constants_1.USD_DECIMALS), slippageBps, new anchor_1.BN(-1 * constants_1.BPS_DECIMALS), new anchor_1.BN(-1 * constants_1.USD_DECIMALS));
4197
4159
  if ((0, types_1.isVariant)(side, 'long')) {
4198
4160
  if (spread_i.lt(current_price)) {
4199
4161
  return { price: current_price.sub(spread_i), exponent: targetPrice.exponent.toNumber() };