flash-sdk 2.3.15 → 2.3.16

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.
@@ -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() };