flash-sdk 2.3.16 → 2.3.17

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