@reyaxyz/api-sdk 0.64.4 → 0.65.0

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.
@@ -79,6 +79,7 @@ var TradeSimulationClient = /** @class */ (function () {
79
79
  };
80
80
  // Synchronous method to simulate operations based on an amount
81
81
  TradeSimulationClient.prototype.simulate = function (params) {
82
+ var _this = this;
82
83
  if (!this.loadedData) {
83
84
  throw new Error('Data not loaded. Call arm() first.');
84
85
  }
@@ -91,11 +92,27 @@ var TradeSimulationClient = /** @class */ (function () {
91
92
  var estimatedPrice = common_1.ExposureCommand.calculateEstimatedPrice(this.loadedData.exposureDataPassivePool.oraclePricePerMarket[this.loadedData.marketConfiguration.market_id], slippage);
92
93
  var fees = common_1.ExposureCommand.calculateFee(this.loadedData.exposureDataPassivePool.oraclePricePerMarket[this.loadedData.marketConfiguration.market_id], amount, this.loadedData.feeParameter);
93
94
  var oldMarginInfo = userAccountExposure.getUsdNodeMarginInfo;
94
- var newMarginInfo = userAccountExposure.getUsdNodeMarginInfoPostTrade(amount, this.loadedData.marketStorage.quote_collateral, this.loadedData.marketConfiguration, this.loadedData.marketStorage.risk_block_id);
95
+ var oldTokenMarginInfo = userAccountExposure.tokenMarginInfoPerAsset.find(function (marginInfo) {
96
+ var _a, _b;
97
+ return (marginInfo.assetAddress ===
98
+ ((_b = (_a = _this.loadedData) === null || _a === void 0 ? void 0 : _a.marketStorage) === null || _b === void 0 ? void 0 : _b.quote_collateral));
99
+ });
100
+ if (!oldTokenMarginInfo) {
101
+ throw new Error('Error performing simulation');
102
+ }
103
+ var _a = userAccountExposure.getUsdNodeMarginInfoPostTrade(amount, this.loadedData.marketStorage.quote_collateral, this.loadedData.marketConfiguration, this.loadedData.marketStorage.risk_block_id), newMarginInfo = _a.usdNodeMarginInfo, tokenMarginInfoPerAsset = _a.tokenMarginInfoPerAsset;
104
+ var newTokenMarginInfo = tokenMarginInfoPerAsset.find(function (marginInfo) {
105
+ var _a, _b;
106
+ return (marginInfo.assetAddress ===
107
+ ((_b = (_a = _this.loadedData) === null || _a === void 0 ? void 0 : _a.marketStorage) === null || _b === void 0 ? void 0 : _b.quote_collateral));
108
+ });
109
+ if (!newTokenMarginInfo) {
110
+ throw new Error('Error performing simulation');
111
+ }
95
112
  var impliedLeverage = common_1.ExposureCommand.calculateImpliedLeverage(amount *
96
- this.loadedData.exposureDataPassivePool.oraclePricePerMarket[this.loadedData.marketConfiguration.market_id], oldMarginInfo.marginBalance - oldMarginInfo.initialDelta, newMarginInfo.marginBalance - newMarginInfo.initialDelta);
97
- var postTradeImr = newMarginInfo.marginBalance - newMarginInfo.initialDelta;
98
- var liquidationPrice = common_1.ExposureCommand.calculateLiquidation(newMarginInfo, this.loadedData.exposureDataPassivePool.oraclePricePerMarket[this.loadedData.marketConfiguration.market_id], amount);
113
+ this.loadedData.exposureDataPassivePool.oraclePricePerMarket[this.loadedData.marketConfiguration.market_id], oldMarginInfo.marginBalance - oldTokenMarginInfo.initialDelta, newMarginInfo.marginBalance - newTokenMarginInfo.initialDelta);
114
+ var postTradeImr = newMarginInfo.marginBalance - newTokenMarginInfo.initialDelta;
115
+ var liquidationPrice = common_1.ExposureCommand.calculateLiquidation(newMarginInfo.marginBalance, newTokenMarginInfo.liquidationMarginRequirement, this.loadedData.exposureDataPassivePool.oraclePricePerMarket[this.loadedData.marketConfiguration.market_id], amount);
99
116
  var marginRatio = common_1.ExposureCommand.getMarginRatio(newMarginInfo);
100
117
  var marginRatioHealth = common_1.ExposureCommand.evaluateHealthStatus(marginRatio, newMarginInfo);
101
118
  var baseSpacing = (0, common_1.amountNormalizer)(this.loadedData.marketConfiguration.base_spacing).toNumber();
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"/","sources":["clients/modules/trade.simulation/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n SimulateTradeEntity,\n TradeSimulationConvertValueParams,\n TradeSimulationConvertValueResult,\n TradeSimulationLoadDataParams,\n TradeSimulationSimulateParams,\n} from './types';\nimport AccountClient from '../account';\nimport {\n amountNormalizer,\n ExposureCommand,\n TradeSimulationState,\n} from '@reyaxyz/common';\nimport BigNumber from 'bignumber.js';\n\nexport default class TradeSimulationClient {\n private marketId: number | null = null;\n private accountId: number | null = null;\n private loadedData: TradeSimulationState | null = null;\n private accountClient: AccountClient;\n constructor(accountClient: AccountClient) {\n // Constructor added\n this.accountClient = accountClient;\n }\n\n // Method to asynchronously load data based on marketId and accountId\n async arm(params: TradeSimulationLoadDataParams): Promise<void> {\n this.marketId = params.marketId;\n this.accountId = params.marginAccountId;\n\n this.loadedData = await this.fetchMarketData(this.marketId, this.accountId);\n }\n\n private async fetchMarketData(\n marketId: number,\n accountId: number,\n ): Promise<TradeSimulationState> {\n return this.accountClient.getTransactionSimulationInitialData({\n marginAccountId: accountId,\n marketId: marketId,\n });\n }\n\n // Synchronous method to simulate operations based on an amount\n simulate(params: TradeSimulationSimulateParams): SimulateTradeEntity {\n if (!this.loadedData) {\n throw new Error('Data not loaded. Call arm() first.');\n }\n\n const amount = BigNumber(params.amount)\n .div(\n this.loadedData.exposureDataPassivePool.oraclePricePerMarket[\n this.loadedData.marketConfiguration.market_id\n ],\n )\n .toNumber();\n\n const userAccountExposure = new ExposureCommand(\n this.loadedData.exposureDataAccount.accountId,\n this.loadedData.exposureDataAccount.rootCollateralPoolId,\n this.loadedData.exposureDataAccount.oraclePricePerMarket,\n this.loadedData.exposureDataAccount.accountBalancePerAsset,\n this.loadedData.exposureDataAccount.groupedByCollateral,\n this.loadedData.exposureDataAccount.riskMultipliers,\n this.loadedData.exposureDataAccount.riskMatrices,\n this.loadedData.exposureDataAccount.exchangeInfoPerAsset,\n this.loadedData.exposureDataAccount.positionInfoMarketConfiguration,\n this.loadedData.exposureDataAccount.uniqueTokenAddresses,\n this.loadedData.exposureDataAccount.uniqueQuoteCollaterals,\n this.loadedData.exposureDataAccount.tokenMarginInfoPerAsset,\n this.loadedData.exposureDataAccount.realizedPnLSum,\n this.loadedData.exposureDataAccount.unrealizedPnLSum,\n this.loadedData.exposureDataAccount.collateralAddressToExchangePrice,\n );\n\n const passivePoolExposure = new ExposureCommand(\n this.loadedData.exposureDataPassivePool.accountId,\n this.loadedData.exposureDataPassivePool.rootCollateralPoolId,\n this.loadedData.exposureDataPassivePool.oraclePricePerMarket,\n this.loadedData.exposureDataPassivePool.accountBalancePerAsset,\n this.loadedData.exposureDataPassivePool.groupedByCollateral,\n this.loadedData.exposureDataPassivePool.riskMultipliers,\n this.loadedData.exposureDataPassivePool.riskMatrices,\n this.loadedData.exposureDataPassivePool.exchangeInfoPerAsset,\n this.loadedData.exposureDataPassivePool.positionInfoMarketConfiguration,\n this.loadedData.exposureDataPassivePool.uniqueTokenAddresses,\n this.loadedData.exposureDataPassivePool.uniqueQuoteCollaterals,\n this.loadedData.exposureDataPassivePool.tokenMarginInfoPerAsset,\n this.loadedData.exposureDataPassivePool.realizedPnLSum,\n this.loadedData.exposureDataPassivePool.unrealizedPnLSum,\n this.loadedData.exposureDataPassivePool.collateralAddressToExchangePrice,\n );\n\n const slippage = passivePoolExposure.getSlippage(\n BigNumber(amount).negated().toNumber(),\n this.loadedData.marketConfiguration,\n this.loadedData.marketStorage,\n );\n const estimatedPrice = ExposureCommand.calculateEstimatedPrice(\n this.loadedData.exposureDataPassivePool.oraclePricePerMarket[\n this.loadedData.marketConfiguration.market_id\n ],\n slippage,\n );\n const fees = ExposureCommand.calculateFee(\n this.loadedData.exposureDataPassivePool.oraclePricePerMarket[\n this.loadedData.marketConfiguration.market_id\n ],\n amount,\n this.loadedData.feeParameter,\n );\n\n const oldMarginInfo = userAccountExposure.getUsdNodeMarginInfo;\n\n const newMarginInfo = userAccountExposure.getUsdNodeMarginInfoPostTrade(\n amount,\n this.loadedData.marketStorage.quote_collateral,\n this.loadedData.marketConfiguration,\n this.loadedData.marketStorage.risk_block_id,\n );\n\n const impliedLeverage = ExposureCommand.calculateImpliedLeverage(\n amount *\n this.loadedData.exposureDataPassivePool.oraclePricePerMarket[\n this.loadedData.marketConfiguration.market_id\n ],\n oldMarginInfo.marginBalance - oldMarginInfo.initialDelta,\n newMarginInfo.marginBalance - newMarginInfo.initialDelta,\n );\n\n const postTradeImr =\n newMarginInfo.marginBalance - newMarginInfo.initialDelta;\n\n const liquidationPrice = ExposureCommand.calculateLiquidation(\n newMarginInfo,\n this.loadedData.exposureDataPassivePool.oraclePricePerMarket[\n this.loadedData.marketConfiguration.market_id\n ],\n amount,\n );\n\n const marginRatio = ExposureCommand.getMarginRatio(newMarginInfo);\n\n const marginRatioHealth = ExposureCommand.evaluateHealthStatus(\n marginRatio,\n newMarginInfo,\n );\n\n const baseSpacing = amountNormalizer(\n this.loadedData.marketConfiguration.base_spacing,\n ).toNumber();\n\n const spotPrice =\n this.loadedData.exposureDataPassivePool.oraclePricePerMarket[\n this.loadedData.marketConfiguration.market_id\n ];\n return {\n estimatedPrice: estimatedPrice,\n estimatedSlippage: slippage * 100,\n fees: fees,\n impliedLeverage: impliedLeverage,\n imr: postTradeImr,\n liquidationPrice: liquidationPrice.toNumber(),\n marginRatio: marginRatio * 100,\n marginRatioHealth: marginRatioHealth,\n snappedAmount: this.roundToBaseSpacing(amount, baseSpacing) * spotPrice,\n snappedAmountInBase: this.roundToBaseSpacing(amount, baseSpacing),\n } as SimulateTradeEntity;\n }\n\n convertValue(\n params: TradeSimulationConvertValueParams,\n ): TradeSimulationConvertValueResult {\n if (!this.loadedData) {\n throw new Error('Data not loaded. Call arm() first.');\n }\n\n if (!params.fromBase)\n return BigNumber(params.amount)\n .div(\n this.loadedData.exposureDataPassivePool.oraclePricePerMarket[\n this.loadedData.marketConfiguration.market_id\n ],\n )\n .toNumber();\n else\n return BigNumber(params.amount)\n .times(\n this.loadedData.exposureDataPassivePool.oraclePricePerMarket[\n this.loadedData.marketConfiguration.market_id\n ],\n )\n .toNumber();\n }\n\n roundToBaseSpacing(amount: number, baseSpacing: number): number {\n return Math.floor(amount / baseSpacing) * baseSpacing;\n }\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["clients/modules/trade.simulation/index.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n SimulateTradeEntity,\n TradeSimulationConvertValueParams,\n TradeSimulationConvertValueResult,\n TradeSimulationLoadDataParams,\n TradeSimulationSimulateParams,\n} from './types';\nimport AccountClient from '../account';\nimport {\n amountNormalizer,\n ExposureCommand,\n MarginInfo,\n TradeSimulationState,\n} from '@reyaxyz/common';\nimport BigNumber from 'bignumber.js';\n\nexport default class TradeSimulationClient {\n private marketId: number | null = null;\n private accountId: number | null = null;\n private loadedData: TradeSimulationState | null = null;\n private accountClient: AccountClient;\n constructor(accountClient: AccountClient) {\n // Constructor added\n this.accountClient = accountClient;\n }\n\n // Method to asynchronously load data based on marketId and accountId\n async arm(params: TradeSimulationLoadDataParams): Promise<void> {\n this.marketId = params.marketId;\n this.accountId = params.marginAccountId;\n\n this.loadedData = await this.fetchMarketData(this.marketId, this.accountId);\n }\n\n private async fetchMarketData(\n marketId: number,\n accountId: number,\n ): Promise<TradeSimulationState> {\n return this.accountClient.getTransactionSimulationInitialData({\n marginAccountId: accountId,\n marketId: marketId,\n });\n }\n\n // Synchronous method to simulate operations based on an amount\n simulate(params: TradeSimulationSimulateParams): SimulateTradeEntity {\n if (!this.loadedData) {\n throw new Error('Data not loaded. Call arm() first.');\n }\n\n const amount = BigNumber(params.amount)\n .div(\n this.loadedData.exposureDataPassivePool.oraclePricePerMarket[\n this.loadedData.marketConfiguration.market_id\n ],\n )\n .toNumber();\n\n const userAccountExposure = new ExposureCommand(\n this.loadedData.exposureDataAccount.accountId,\n this.loadedData.exposureDataAccount.rootCollateralPoolId,\n this.loadedData.exposureDataAccount.oraclePricePerMarket,\n this.loadedData.exposureDataAccount.accountBalancePerAsset,\n this.loadedData.exposureDataAccount.groupedByCollateral,\n this.loadedData.exposureDataAccount.riskMultipliers,\n this.loadedData.exposureDataAccount.riskMatrices,\n this.loadedData.exposureDataAccount.exchangeInfoPerAsset,\n this.loadedData.exposureDataAccount.positionInfoMarketConfiguration,\n this.loadedData.exposureDataAccount.uniqueTokenAddresses,\n this.loadedData.exposureDataAccount.uniqueQuoteCollaterals,\n this.loadedData.exposureDataAccount.tokenMarginInfoPerAsset,\n this.loadedData.exposureDataAccount.realizedPnLSum,\n this.loadedData.exposureDataAccount.unrealizedPnLSum,\n this.loadedData.exposureDataAccount.collateralAddressToExchangePrice,\n );\n\n const passivePoolExposure = new ExposureCommand(\n this.loadedData.exposureDataPassivePool.accountId,\n this.loadedData.exposureDataPassivePool.rootCollateralPoolId,\n this.loadedData.exposureDataPassivePool.oraclePricePerMarket,\n this.loadedData.exposureDataPassivePool.accountBalancePerAsset,\n this.loadedData.exposureDataPassivePool.groupedByCollateral,\n this.loadedData.exposureDataPassivePool.riskMultipliers,\n this.loadedData.exposureDataPassivePool.riskMatrices,\n this.loadedData.exposureDataPassivePool.exchangeInfoPerAsset,\n this.loadedData.exposureDataPassivePool.positionInfoMarketConfiguration,\n this.loadedData.exposureDataPassivePool.uniqueTokenAddresses,\n this.loadedData.exposureDataPassivePool.uniqueQuoteCollaterals,\n this.loadedData.exposureDataPassivePool.tokenMarginInfoPerAsset,\n this.loadedData.exposureDataPassivePool.realizedPnLSum,\n this.loadedData.exposureDataPassivePool.unrealizedPnLSum,\n this.loadedData.exposureDataPassivePool.collateralAddressToExchangePrice,\n );\n\n const slippage = passivePoolExposure.getSlippage(\n BigNumber(amount).negated().toNumber(),\n this.loadedData.marketConfiguration,\n this.loadedData.marketStorage,\n );\n const estimatedPrice = ExposureCommand.calculateEstimatedPrice(\n this.loadedData.exposureDataPassivePool.oraclePricePerMarket[\n this.loadedData.marketConfiguration.market_id\n ],\n slippage,\n );\n const fees = ExposureCommand.calculateFee(\n this.loadedData.exposureDataPassivePool.oraclePricePerMarket[\n this.loadedData.marketConfiguration.market_id\n ],\n amount,\n this.loadedData.feeParameter,\n );\n\n const oldMarginInfo = userAccountExposure.getUsdNodeMarginInfo;\n\n const oldTokenMarginInfo = userAccountExposure.tokenMarginInfoPerAsset.find(\n (marginInfo: MarginInfo) => {\n return (\n marginInfo.assetAddress ===\n this.loadedData?.marketStorage?.quote_collateral\n );\n },\n );\n if (!oldTokenMarginInfo) {\n throw new Error('Error performing simulation');\n }\n\n const { usdNodeMarginInfo: newMarginInfo, tokenMarginInfoPerAsset } =\n userAccountExposure.getUsdNodeMarginInfoPostTrade(\n amount,\n this.loadedData.marketStorage.quote_collateral,\n this.loadedData.marketConfiguration,\n this.loadedData.marketStorage.risk_block_id,\n );\n\n const newTokenMarginInfo = tokenMarginInfoPerAsset.find(\n (marginInfo: MarginInfo) => {\n return (\n marginInfo.assetAddress ===\n this.loadedData?.marketStorage?.quote_collateral\n );\n },\n );\n\n if (!newTokenMarginInfo) {\n throw new Error('Error performing simulation');\n }\n\n const impliedLeverage = ExposureCommand.calculateImpliedLeverage(\n amount *\n this.loadedData.exposureDataPassivePool.oraclePricePerMarket[\n this.loadedData.marketConfiguration.market_id\n ],\n oldMarginInfo.marginBalance - oldTokenMarginInfo.initialDelta,\n newMarginInfo.marginBalance - newTokenMarginInfo.initialDelta,\n );\n\n const postTradeImr =\n newMarginInfo.marginBalance - newTokenMarginInfo.initialDelta;\n\n const liquidationPrice = ExposureCommand.calculateLiquidation(\n newMarginInfo.marginBalance,\n newTokenMarginInfo.liquidationMarginRequirement,\n this.loadedData.exposureDataPassivePool.oraclePricePerMarket[\n this.loadedData.marketConfiguration.market_id\n ],\n amount,\n );\n\n const marginRatio = ExposureCommand.getMarginRatio(newMarginInfo);\n\n const marginRatioHealth = ExposureCommand.evaluateHealthStatus(\n marginRatio,\n newMarginInfo,\n );\n\n const baseSpacing = amountNormalizer(\n this.loadedData.marketConfiguration.base_spacing,\n ).toNumber();\n\n const spotPrice =\n this.loadedData.exposureDataPassivePool.oraclePricePerMarket[\n this.loadedData.marketConfiguration.market_id\n ];\n return {\n estimatedPrice: estimatedPrice,\n estimatedSlippage: slippage * 100,\n fees: fees,\n impliedLeverage: impliedLeverage,\n imr: postTradeImr,\n liquidationPrice: liquidationPrice.toNumber(),\n marginRatio: marginRatio * 100,\n marginRatioHealth: marginRatioHealth,\n snappedAmount: this.roundToBaseSpacing(amount, baseSpacing) * spotPrice,\n snappedAmountInBase: this.roundToBaseSpacing(amount, baseSpacing),\n } as SimulateTradeEntity;\n }\n\n convertValue(\n params: TradeSimulationConvertValueParams,\n ): TradeSimulationConvertValueResult {\n if (!this.loadedData) {\n throw new Error('Data not loaded. Call arm() first.');\n }\n\n if (!params.fromBase)\n return BigNumber(params.amount)\n .div(\n this.loadedData.exposureDataPassivePool.oraclePricePerMarket[\n this.loadedData.marketConfiguration.market_id\n ],\n )\n .toNumber();\n else\n return BigNumber(params.amount)\n .times(\n this.loadedData.exposureDataPassivePool.oraclePricePerMarket[\n this.loadedData.marketConfiguration.market_id\n ],\n )\n .toNumber();\n }\n\n roundToBaseSpacing(amount: number, baseSpacing: number): number {\n return Math.floor(amount / baseSpacing) * baseSpacing;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"/","sources":["clients/modules/trade.simulation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,iCAAiC,EACjC,iCAAiC,EACjC,6BAA6B,EAC7B,6BAA6B,EAC9B,MAAM,SAAS,CAAC;AACjB,OAAO,aAAa,MAAM,YAAY,CAAC;AAQvC,MAAM,CAAC,OAAO,OAAO,qBAAqB;IACxC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,aAAa,CAAgB;gBACzB,aAAa,EAAE,aAAa;IAMlC,GAAG,CAAC,MAAM,EAAE,6BAA6B,GAAG,OAAO,CAAC,IAAI,CAAC;YAOjD,eAAe;IAW7B,QAAQ,CAAC,MAAM,EAAE,6BAA6B,GAAG,mBAAmB;IA8HpE,YAAY,CACV,MAAM,EAAE,iCAAiC,GACxC,iCAAiC;IAuBpC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;CAGhE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"/","sources":["clients/modules/trade.simulation/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,iCAAiC,EACjC,iCAAiC,EACjC,6BAA6B,EAC7B,6BAA6B,EAC9B,MAAM,SAAS,CAAC;AACjB,OAAO,aAAa,MAAM,YAAY,CAAC;AASvC,MAAM,CAAC,OAAO,OAAO,qBAAqB;IACxC,OAAO,CAAC,QAAQ,CAAuB;IACvC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,UAAU,CAAqC;IACvD,OAAO,CAAC,aAAa,CAAgB;gBACzB,aAAa,EAAE,aAAa;IAMlC,GAAG,CAAC,MAAM,EAAE,6BAA6B,GAAG,OAAO,CAAC,IAAI,CAAC;YAOjD,eAAe;IAW7B,QAAQ,CAAC,MAAM,EAAE,6BAA6B,GAAG,mBAAmB;IAyJpE,YAAY,CACV,MAAM,EAAE,iCAAiC,GACxC,iCAAiC;IAuBpC,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM;CAGhE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reyaxyz/api-sdk",
3
- "version": "0.64.4",
3
+ "version": "0.65.0",
4
4
  "publishConfig": {
5
5
  "access": "public",
6
6
  "registry": "https://registry.npmjs.org"
@@ -33,9 +33,9 @@
33
33
  "generate:coverage-badges": "npx istanbul-badges-readme --silent"
34
34
  },
35
35
  "dependencies": {
36
- "@reyaxyz/common": "0.57.0",
36
+ "@reyaxyz/common": "0.58.0",
37
37
  "bignumber.js": "^9.1.2"
38
38
  },
39
39
  "packageManager": "pnpm@8.10.4",
40
- "gitHead": "58d9e1729861ee7ab5299cf86ba59027799dab22"
40
+ "gitHead": "8b2fc18cffccdeca0d96423fa6691c4a1d022b61"
41
41
  }
@@ -9,6 +9,7 @@ import AccountClient from '../account';
9
9
  import {
10
10
  amountNormalizer,
11
11
  ExposureCommand,
12
+ MarginInfo,
12
13
  TradeSimulationState,
13
14
  } from '@reyaxyz/common';
14
15
  import BigNumber from 'bignumber.js';
@@ -112,27 +113,54 @@ export default class TradeSimulationClient {
112
113
 
113
114
  const oldMarginInfo = userAccountExposure.getUsdNodeMarginInfo;
114
115
 
115
- const newMarginInfo = userAccountExposure.getUsdNodeMarginInfoPostTrade(
116
- amount,
117
- this.loadedData.marketStorage.quote_collateral,
118
- this.loadedData.marketConfiguration,
119
- this.loadedData.marketStorage.risk_block_id,
116
+ const oldTokenMarginInfo = userAccountExposure.tokenMarginInfoPerAsset.find(
117
+ (marginInfo: MarginInfo) => {
118
+ return (
119
+ marginInfo.assetAddress ===
120
+ this.loadedData?.marketStorage?.quote_collateral
121
+ );
122
+ },
123
+ );
124
+ if (!oldTokenMarginInfo) {
125
+ throw new Error('Error performing simulation');
126
+ }
127
+
128
+ const { usdNodeMarginInfo: newMarginInfo, tokenMarginInfoPerAsset } =
129
+ userAccountExposure.getUsdNodeMarginInfoPostTrade(
130
+ amount,
131
+ this.loadedData.marketStorage.quote_collateral,
132
+ this.loadedData.marketConfiguration,
133
+ this.loadedData.marketStorage.risk_block_id,
134
+ );
135
+
136
+ const newTokenMarginInfo = tokenMarginInfoPerAsset.find(
137
+ (marginInfo: MarginInfo) => {
138
+ return (
139
+ marginInfo.assetAddress ===
140
+ this.loadedData?.marketStorage?.quote_collateral
141
+ );
142
+ },
120
143
  );
121
144
 
145
+ if (!newTokenMarginInfo) {
146
+ throw new Error('Error performing simulation');
147
+ }
148
+
122
149
  const impliedLeverage = ExposureCommand.calculateImpliedLeverage(
123
150
  amount *
124
151
  this.loadedData.exposureDataPassivePool.oraclePricePerMarket[
125
152
  this.loadedData.marketConfiguration.market_id
126
153
  ],
127
- oldMarginInfo.marginBalance - oldMarginInfo.initialDelta,
128
- newMarginInfo.marginBalance - newMarginInfo.initialDelta,
154
+ oldMarginInfo.marginBalance - oldTokenMarginInfo.initialDelta,
155
+ newMarginInfo.marginBalance - newTokenMarginInfo.initialDelta,
129
156
  );
130
157
 
131
158
  const postTradeImr =
132
- newMarginInfo.marginBalance - newMarginInfo.initialDelta;
159
+ newMarginInfo.marginBalance - newTokenMarginInfo.initialDelta;
133
160
 
134
161
  const liquidationPrice = ExposureCommand.calculateLiquidation(
135
- newMarginInfo,
162
+ newMarginInfo.marginBalance,
163
+ newTokenMarginInfo.liquidationMarginRequirement,
136
164
  this.loadedData.exposureDataPassivePool.oraclePricePerMarket[
137
165
  this.loadedData.marketConfiguration.market_id
138
166
  ],