@gainsnetwork/sdk 0.0.24 → 0.0.25-rc2

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.
Files changed (45) hide show
  1. package/lib/contracts/addresses.json +12 -3
  2. package/lib/contracts/index.js +3 -1
  3. package/lib/contracts/types/generated/GNSBorrowingFeesV6_3_2.d.ts +979 -0
  4. package/lib/contracts/types/generated/GNSBorrowingFeesV6_3_2.js +2 -0
  5. package/lib/contracts/types/generated/GNSNftRewardsV6_3_1.d.ts +613 -0
  6. package/lib/contracts/types/generated/GNSNftRewardsV6_3_1.js +2 -0
  7. package/lib/contracts/types/generated/GNSTradingCallbacksV6_3_2.d.ts +806 -0
  8. package/lib/contracts/types/generated/GNSTradingCallbacksV6_3_2.js +2 -0
  9. package/lib/contracts/types/generated/factories/GNSBorrowingFeesV6_3_2__factory.d.ts +88 -0
  10. package/lib/contracts/types/generated/factories/GNSBorrowingFeesV6_3_2__factory.js +1654 -0
  11. package/lib/contracts/types/generated/factories/GNSNftRewardsV6_3_1__factory.d.ts +100 -0
  12. package/lib/contracts/types/generated/factories/GNSNftRewardsV6_3_1__factory.js +1116 -0
  13. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_3_2__factory.d.ts +82 -0
  14. package/lib/contracts/types/generated/factories/GNSTradingCallbacksV6_3_2__factory.js +1273 -0
  15. package/lib/contracts/types/generated/factories/index.d.ts +3 -0
  16. package/lib/contracts/types/generated/factories/index.js +7 -1
  17. package/lib/contracts/types/generated/index.d.ts +6 -0
  18. package/lib/contracts/types/generated/index.js +7 -1
  19. package/lib/contracts/types/index.d.ts +7 -2
  20. package/lib/contracts/utils/openLimitOrders.js +1 -1
  21. package/lib/contracts/utils/openTrades.js +14 -11
  22. package/lib/index.d.ts +2 -0
  23. package/lib/index.js +3 -0
  24. package/lib/trade/fees/borrowing/index.d.ts +53 -0
  25. package/lib/trade/fees/borrowing/index.js +156 -0
  26. package/lib/trade/fees/borrowing/types.d.ts +32 -0
  27. package/lib/trade/fees/borrowing/types.js +2 -0
  28. package/lib/trade/{fees.d.ts → fees/index.d.ts} +2 -1
  29. package/lib/trade/{fees.js → fees/index.js} +15 -0
  30. package/lib/trade/index.d.ts +3 -0
  31. package/lib/trade/index.js +3 -0
  32. package/lib/trade/liquidation.d.ts +7 -0
  33. package/lib/trade/liquidation.js +18 -0
  34. package/lib/trade/pnl.d.ts +5 -3
  35. package/lib/trade/pnl.js +4 -3
  36. package/lib/trade/types.d.ts +12 -0
  37. package/lib/vault/index.d.ts +7 -0
  38. package/lib/vault/index.js +11 -0
  39. package/package.json +1 -1
  40. package/lib/contracts/utils/tradeLastUpdated.d.ts +0 -6
  41. package/lib/contracts/utils/tradeLastUpdated.js +0 -25
  42. package/lib/prices/PricingNetworkClient.d.ts +0 -22
  43. package/lib/prices/PricingNetworkClient.js +0 -179
  44. package/lib/prices/index.d.ts +0 -1
  45. package/lib/prices/index.js +0 -17
@@ -1,5 +1,8 @@
1
1
  export { GFarmTradingStorageV5__factory } from "./GFarmTradingStorageV5__factory";
2
+ export { GNSBorrowingFeesV6_3_2__factory } from "./GNSBorrowingFeesV6_3_2__factory";
2
3
  export { GNSNftRewardsV6__factory } from "./GNSNftRewardsV6__factory";
4
+ export { GNSNftRewardsV6_3_1__factory } from "./GNSNftRewardsV6_3_1__factory";
3
5
  export { GNSPairInfosV6_1__factory } from "./GNSPairInfosV6_1__factory";
4
6
  export { GNSPairsStorageV6__factory } from "./GNSPairsStorageV6__factory";
7
+ export { GNSTradingCallbacksV6_3_2__factory } from "./GNSTradingCallbacksV6_3_2__factory";
5
8
  export { GTokenOpenPnlFeed__factory } from "./GTokenOpenPnlFeed__factory";
@@ -1,16 +1,22 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GTokenOpenPnlFeed__factory = exports.GNSPairsStorageV6__factory = exports.GNSPairInfosV6_1__factory = exports.GNSNftRewardsV6__factory = exports.GFarmTradingStorageV5__factory = void 0;
3
+ exports.GTokenOpenPnlFeed__factory = exports.GNSTradingCallbacksV6_3_2__factory = exports.GNSPairsStorageV6__factory = exports.GNSPairInfosV6_1__factory = exports.GNSNftRewardsV6_3_1__factory = exports.GNSNftRewardsV6__factory = exports.GNSBorrowingFeesV6_3_2__factory = exports.GFarmTradingStorageV5__factory = void 0;
4
4
  /* Autogenerated file. Do not edit manually. */
5
5
  /* tslint:disable */
6
6
  /* eslint-disable */
7
7
  var GFarmTradingStorageV5__factory_1 = require("./GFarmTradingStorageV5__factory");
8
8
  Object.defineProperty(exports, "GFarmTradingStorageV5__factory", { enumerable: true, get: function () { return GFarmTradingStorageV5__factory_1.GFarmTradingStorageV5__factory; } });
9
+ var GNSBorrowingFeesV6_3_2__factory_1 = require("./GNSBorrowingFeesV6_3_2__factory");
10
+ Object.defineProperty(exports, "GNSBorrowingFeesV6_3_2__factory", { enumerable: true, get: function () { return GNSBorrowingFeesV6_3_2__factory_1.GNSBorrowingFeesV6_3_2__factory; } });
9
11
  var GNSNftRewardsV6__factory_1 = require("./GNSNftRewardsV6__factory");
10
12
  Object.defineProperty(exports, "GNSNftRewardsV6__factory", { enumerable: true, get: function () { return GNSNftRewardsV6__factory_1.GNSNftRewardsV6__factory; } });
13
+ var GNSNftRewardsV6_3_1__factory_1 = require("./GNSNftRewardsV6_3_1__factory");
14
+ Object.defineProperty(exports, "GNSNftRewardsV6_3_1__factory", { enumerable: true, get: function () { return GNSNftRewardsV6_3_1__factory_1.GNSNftRewardsV6_3_1__factory; } });
11
15
  var GNSPairInfosV6_1__factory_1 = require("./GNSPairInfosV6_1__factory");
12
16
  Object.defineProperty(exports, "GNSPairInfosV6_1__factory", { enumerable: true, get: function () { return GNSPairInfosV6_1__factory_1.GNSPairInfosV6_1__factory; } });
13
17
  var GNSPairsStorageV6__factory_1 = require("./GNSPairsStorageV6__factory");
14
18
  Object.defineProperty(exports, "GNSPairsStorageV6__factory", { enumerable: true, get: function () { return GNSPairsStorageV6__factory_1.GNSPairsStorageV6__factory; } });
19
+ var GNSTradingCallbacksV6_3_2__factory_1 = require("./GNSTradingCallbacksV6_3_2__factory");
20
+ Object.defineProperty(exports, "GNSTradingCallbacksV6_3_2__factory", { enumerable: true, get: function () { return GNSTradingCallbacksV6_3_2__factory_1.GNSTradingCallbacksV6_3_2__factory; } });
15
21
  var GTokenOpenPnlFeed__factory_1 = require("./GTokenOpenPnlFeed__factory");
16
22
  Object.defineProperty(exports, "GTokenOpenPnlFeed__factory", { enumerable: true, get: function () { return GTokenOpenPnlFeed__factory_1.GTokenOpenPnlFeed__factory; } });
@@ -1,11 +1,17 @@
1
1
  export type { GFarmTradingStorageV5 } from "./GFarmTradingStorageV5";
2
+ export type { GNSBorrowingFeesV6_3_2 } from "./GNSBorrowingFeesV6_3_2";
2
3
  export type { GNSNftRewardsV6 } from "./GNSNftRewardsV6";
4
+ export type { GNSNftRewardsV6_3_1 } from "./GNSNftRewardsV6_3_1";
3
5
  export type { GNSPairInfosV6_1 } from "./GNSPairInfosV6_1";
4
6
  export type { GNSPairsStorageV6 } from "./GNSPairsStorageV6";
7
+ export type { GNSTradingCallbacksV6_3_2 } from "./GNSTradingCallbacksV6_3_2";
5
8
  export type { GTokenOpenPnlFeed } from "./GTokenOpenPnlFeed";
6
9
  export * as factories from "./factories";
7
10
  export { GFarmTradingStorageV5__factory } from "./factories/GFarmTradingStorageV5__factory";
11
+ export { GNSBorrowingFeesV6_3_2__factory } from "./factories/GNSBorrowingFeesV6_3_2__factory";
8
12
  export { GNSNftRewardsV6__factory } from "./factories/GNSNftRewardsV6__factory";
13
+ export { GNSNftRewardsV6_3_1__factory } from "./factories/GNSNftRewardsV6_3_1__factory";
9
14
  export { GNSPairInfosV6_1__factory } from "./factories/GNSPairInfosV6_1__factory";
10
15
  export { GNSPairsStorageV6__factory } from "./factories/GNSPairsStorageV6__factory";
16
+ export { GNSTradingCallbacksV6_3_2__factory } from "./factories/GNSTradingCallbacksV6_3_2__factory";
11
17
  export { GTokenOpenPnlFeed__factory } from "./factories/GTokenOpenPnlFeed__factory";
@@ -23,15 +23,21 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.GTokenOpenPnlFeed__factory = exports.GNSPairsStorageV6__factory = exports.GNSPairInfosV6_1__factory = exports.GNSNftRewardsV6__factory = exports.GFarmTradingStorageV5__factory = exports.factories = void 0;
26
+ exports.GTokenOpenPnlFeed__factory = exports.GNSTradingCallbacksV6_3_2__factory = exports.GNSPairsStorageV6__factory = exports.GNSPairInfosV6_1__factory = exports.GNSNftRewardsV6_3_1__factory = exports.GNSNftRewardsV6__factory = exports.GNSBorrowingFeesV6_3_2__factory = exports.GFarmTradingStorageV5__factory = exports.factories = void 0;
27
27
  exports.factories = __importStar(require("./factories"));
28
28
  var GFarmTradingStorageV5__factory_1 = require("./factories/GFarmTradingStorageV5__factory");
29
29
  Object.defineProperty(exports, "GFarmTradingStorageV5__factory", { enumerable: true, get: function () { return GFarmTradingStorageV5__factory_1.GFarmTradingStorageV5__factory; } });
30
+ var GNSBorrowingFeesV6_3_2__factory_1 = require("./factories/GNSBorrowingFeesV6_3_2__factory");
31
+ Object.defineProperty(exports, "GNSBorrowingFeesV6_3_2__factory", { enumerable: true, get: function () { return GNSBorrowingFeesV6_3_2__factory_1.GNSBorrowingFeesV6_3_2__factory; } });
30
32
  var GNSNftRewardsV6__factory_1 = require("./factories/GNSNftRewardsV6__factory");
31
33
  Object.defineProperty(exports, "GNSNftRewardsV6__factory", { enumerable: true, get: function () { return GNSNftRewardsV6__factory_1.GNSNftRewardsV6__factory; } });
34
+ var GNSNftRewardsV6_3_1__factory_1 = require("./factories/GNSNftRewardsV6_3_1__factory");
35
+ Object.defineProperty(exports, "GNSNftRewardsV6_3_1__factory", { enumerable: true, get: function () { return GNSNftRewardsV6_3_1__factory_1.GNSNftRewardsV6_3_1__factory; } });
32
36
  var GNSPairInfosV6_1__factory_1 = require("./factories/GNSPairInfosV6_1__factory");
33
37
  Object.defineProperty(exports, "GNSPairInfosV6_1__factory", { enumerable: true, get: function () { return GNSPairInfosV6_1__factory_1.GNSPairInfosV6_1__factory; } });
34
38
  var GNSPairsStorageV6__factory_1 = require("./factories/GNSPairsStorageV6__factory");
35
39
  Object.defineProperty(exports, "GNSPairsStorageV6__factory", { enumerable: true, get: function () { return GNSPairsStorageV6__factory_1.GNSPairsStorageV6__factory; } });
40
+ var GNSTradingCallbacksV6_3_2__factory_1 = require("./factories/GNSTradingCallbacksV6_3_2__factory");
41
+ Object.defineProperty(exports, "GNSTradingCallbacksV6_3_2__factory", { enumerable: true, get: function () { return GNSTradingCallbacksV6_3_2__factory_1.GNSTradingCallbacksV6_3_2__factory; } });
36
42
  var GTokenOpenPnlFeed__factory_1 = require("./factories/GTokenOpenPnlFeed__factory");
37
43
  Object.defineProperty(exports, "GTokenOpenPnlFeed__factory", { enumerable: true, get: function () { return GTokenOpenPnlFeed__factory_1.GTokenOpenPnlFeed__factory; } });
@@ -1,10 +1,12 @@
1
- import { GFarmTradingStorageV5, GNSPairInfosV6_1, GNSPairsStorageV6, GTokenOpenPnlFeed, GNSNftRewardsV6 } from "./generated";
1
+ import { GFarmTradingStorageV5, GNSPairInfosV6_1, GNSPairsStorageV6, GTokenOpenPnlFeed, GNSNftRewardsV6_3_1, GNSBorrowingFeesV6_3_2, GNSTradingCallbacksV6_3_2 } from "./generated";
2
2
  export type Contracts = {
3
3
  gfarmTradingStorageV5: GFarmTradingStorageV5;
4
4
  gnsPairInfosV6_1: GNSPairInfosV6_1;
5
5
  gnsPairsStorageV6: GNSPairsStorageV6;
6
6
  gTokenOpenPnlFeed: GTokenOpenPnlFeed;
7
- gnsNftRewardsV6: GNSNftRewardsV6;
7
+ gnsNftRewards: GNSNftRewardsV6_3_1;
8
+ gnsBorrowingFees: GNSBorrowingFeesV6_3_2;
9
+ gnsTradingCallbacks: GNSTradingCallbacksV6_3_2;
8
10
  };
9
11
  export type ContractAddresses = {
10
12
  gfarmTradingStorageV5: string;
@@ -12,5 +14,8 @@ export type ContractAddresses = {
12
14
  gnsPairsStorageV6: string;
13
15
  gTokenOpenPnlFeed: string;
14
16
  gnsNftRewardsV6: string;
17
+ gnsNftRewardsV6_3_1: string;
18
+ gnsBorrowingFeesV6_3_2: string;
19
+ gnsTradingCallbacksV6_3_2: string;
15
20
  };
16
21
  export type BlockTag = number | "latest" | "pending";
@@ -39,7 +39,7 @@ const fetchOpenLimitOrdersRaw = (contracts, overrides = {}) => __awaiter(void 0,
39
39
  }
40
40
  console.time("fetchOpenLimitOrdersRaw");
41
41
  const { useMulticall = false, blockTag = "latest" } = overrides;
42
- const { gfarmTradingStorageV5: storageContract, gnsNftRewardsV6: nftRewards, } = contracts;
42
+ const { gfarmTradingStorageV5: storageContract, gnsNftRewards: nftRewards } = contracts;
43
43
  const openLimitOrders = yield storageContract.getOpenLimitOrders({
44
44
  blockTag,
45
45
  });
@@ -44,7 +44,7 @@ const fetchOpenPairTradesRaw = (contracts, overrides = {}) => __awaiter(void 0,
44
44
  });
45
45
  exports.fetchOpenPairTradesRaw = fetchOpenPairTradesRaw;
46
46
  const fetchOpenPairTradesBatch = (contracts, startPairIndex, endPairIndex) => __awaiter(void 0, void 0, void 0, function* () {
47
- const { gfarmTradingStorageV5: storageContract, gnsPairInfosV6_1: pairInfosContract, } = contracts;
47
+ const { gfarmTradingStorageV5: storageContract, gnsBorrowingFees: borrowingFeesContract, } = contracts;
48
48
  const maxTradesPerPair = (yield storageContract.maxTradesPerPair()).toNumber();
49
49
  const pairIndexesToFetch = Array.from({ length: endPairIndex - startPairIndex + 1 }, (_, i) => i + startPairIndex);
50
50
  const rawTrades = yield Promise.all(pairIndexesToFetch.map((pairIndex) => __awaiter(void 0, void 0, void 0, function* () {
@@ -62,7 +62,7 @@ const fetchOpenPairTradesBatch = (contracts, startPairIndex, endPairIndex) => __
62
62
  const actualOpenTradesForTrader = openTradesForTraderAddress.filter(openTrade => openTrade.trader === pairTraderAddress);
63
63
  const [actualOpenTradesTradeInfos, actualOpenTradesInitialAccFees] = yield Promise.all([
64
64
  Promise.all(actualOpenTradesForTrader.map(aot => storageContract.openTradesInfo(aot.trader, aot.pairIndex, aot.index))),
65
- Promise.all(actualOpenTradesForTrader.map(aot => pairInfosContract.tradeInitialAccFees(aot.trader, aot.pairIndex, aot.index))),
65
+ Promise.all(actualOpenTradesForTrader.map(aot => borrowingFeesContract.getTradeInitialAccFees(aot.trader, aot.pairIndex, aot.index))),
66
66
  ]);
67
67
  const finalOpenTradesForTrader = new Array(actualOpenTradesForTrader.length);
68
68
  for (let tradeIndex = 0; tradeIndex < actualOpenTradesForTrader.length; tradeIndex++) {
@@ -70,10 +70,10 @@ const fetchOpenPairTradesBatch = (contracts, startPairIndex, endPairIndex) => __
70
70
  if (tradeInfo === undefined) {
71
71
  continue;
72
72
  }
73
- const tradeInitialAccFees = actualOpenTradesInitialAccFees[tradeIndex];
74
- if (tradeInitialAccFees === undefined) {
73
+ if (actualOpenTradesInitialAccFees[tradeIndex] === undefined) {
75
74
  continue;
76
75
  }
76
+ const tradeInitialAccFees = Object.assign(Object.assign({}, actualOpenTradesInitialAccFees[tradeIndex].otherFees), { borrowing: actualOpenTradesInitialAccFees[tradeIndex].borrowingFees });
77
77
  const trade = actualOpenTradesForTrader[tradeIndex];
78
78
  finalOpenTradesForTrader[tradeIndex] = {
79
79
  trade,
@@ -89,16 +89,14 @@ const fetchOpenPairTradesBatch = (contracts, startPairIndex, endPairIndex) => __
89
89
  return perPairTrades.reduce((a, b) => a.concat(b), []);
90
90
  });
91
91
  const fetchOpenPairTradesBatchMulticall = (contracts, startPairIndex, endPairIndex, blockTag) => __awaiter(void 0, void 0, void 0, function* () {
92
- const { gfarmTradingStorageV5: storageContract, gnsPairInfosV6_1: pairInfosContract, } = contracts;
92
+ const { gfarmTradingStorageV5: storageContract, gnsBorrowingFees: borrowingFeesContract, } = contracts;
93
93
  // Convert to Multicall for efficient RPC usage
94
94
  const multicallProvider = new ethcall_1.Provider();
95
95
  yield multicallProvider.init(storageContract.provider);
96
96
  const storageContractMulticall = new ethcall_1.Contract(storageContract.address, [
97
97
  ...storageContract.interface.fragments,
98
98
  ]);
99
- const pairInfosContractMulticall = new ethcall_1.Contract(pairInfosContract.address, [
100
- ...pairInfosContract.interface.fragments,
101
- ]);
99
+ const borrowingFeesContractMulticall = new ethcall_1.Contract(borrowingFeesContract.address, [...borrowingFeesContract.interface.fragments]);
102
100
  const maxTradesPerPair = (yield storageContract.maxTradesPerPair()).toNumber();
103
101
  const pairIndexesToFetch = Array.from({ length: endPairIndex - startPairIndex + 1 }, (_, i) => i + startPairIndex);
104
102
  const mcPairTraderAddresses = yield multicallProvider.all(pairIndexesToFetch.map(pairIndex => storageContractMulticall.pairTradersArray(pairIndex)), blockTag);
@@ -119,7 +117,7 @@ const fetchOpenPairTradesBatchMulticall = (contracts, startPairIndex, endPairInd
119
117
  const openTrades = mcFlatOpenTrades.filter(openTrade => openTrade[0] !== "0x0000000000000000000000000000000000000000");
120
118
  const [openTradesTradeInfos, openTradesInitialAccFees] = yield Promise.all([
121
119
  multicallProvider.all(openTrades.map(openTrade => storageContractMulticall.openTradesInfo(openTrade.trader, openTrade.pairIndex, openTrade.index)), blockTag),
122
- multicallProvider.all(openTrades.map(openTrade => pairInfosContractMulticall.tradeInitialAccFees(openTrade.trader, openTrade.pairIndex, openTrade.index)), blockTag),
120
+ multicallProvider.all(openTrades.map(openTrade => borrowingFeesContractMulticall.getTradeInitialAccFees(openTrade.trader, openTrade.pairIndex, openTrade.index)), blockTag),
123
121
  ]);
124
122
  const finalTrades = new Array(openTrades.length);
125
123
  for (let tradeIndex = 0; tradeIndex < openTradesTradeInfos.length; tradeIndex++) {
@@ -128,11 +126,11 @@ const fetchOpenPairTradesBatchMulticall = (contracts, startPairIndex, endPairInd
128
126
  console.error("No trade info found for open trade while fetching open trades!", { trade: openTradesTradeInfos[tradeIndex] });
129
127
  continue;
130
128
  }
131
- const tradeInitialAccFees = openTradesInitialAccFees[tradeIndex];
132
- if (tradeInitialAccFees === undefined) {
129
+ if (openTradesInitialAccFees[tradeIndex] === undefined) {
133
130
  console.error("No initial fees found for open trade while fetching open trades!", { trade: openTrades[tradeIndex] });
134
131
  continue;
135
132
  }
133
+ const tradeInitialAccFees = Object.assign(Object.assign({}, openTradesInitialAccFees[tradeIndex].otherFees), { borrowing: openTradesInitialAccFees[tradeIndex].borrowingFees });
136
134
  const trade = openTrades[tradeIndex];
137
135
  finalTrades[tradeIndex] = {
138
136
  trade,
@@ -165,5 +163,10 @@ const _prepareTradeContainer = (trade, tradeInfo, tradeInitialAccFees) => ({
165
163
  rollover: parseFloat(tradeInitialAccFees.rollover.toString()) / 1e18,
166
164
  funding: parseFloat(tradeInitialAccFees.funding.toString()) / 1e18,
167
165
  openedAfterUpdate: tradeInitialAccFees.openedAfterUpdate.toString() === "true",
166
+ borrowing: {
167
+ accPairFee: parseFloat(tradeInitialAccFees.borrowing.accPairFee.toString()) / 1e4,
168
+ accGroupFee: parseFloat(tradeInitialAccFees.borrowing.accGroupFee.toString()) / 1e4,
169
+ block: parseFloat(tradeInitialAccFees.borrowing.block.toString()),
170
+ },
168
171
  },
169
172
  });
package/lib/index.d.ts CHANGED
@@ -3,3 +3,5 @@ export * from "./contracts";
3
3
  export * from "./markets";
4
4
  export * from "./constants";
5
5
  export * from "./utils";
6
+ export * from "./vault";
7
+ export * from "./trade/fees/borrowing/index";
package/lib/index.js CHANGED
@@ -19,3 +19,6 @@ __exportStar(require("./contracts"), exports);
19
19
  __exportStar(require("./markets"), exports);
20
20
  __exportStar(require("./constants"), exports);
21
21
  __exportStar(require("./utils"), exports);
22
+ __exportStar(require("./vault"), exports);
23
+ // Not sure why this is needed, but it is. Barrel imports are not working.
24
+ __exportStar(require("./trade/fees/borrowing/index"), exports);
@@ -0,0 +1,53 @@
1
+ import { OpenInterest } from "../../types";
2
+ import * as BorrowingFee from "./types";
3
+ export type GetBorrowingFeeContext = {
4
+ currentBlock: number;
5
+ accBlockWeightedMarketCap: number;
6
+ groups: BorrowingFee.Group[];
7
+ pairs: BorrowingFee.Pair[];
8
+ openInterest: OpenInterest;
9
+ };
10
+ export declare const getBorrowingFee: (posDai: number, pairIndex: number, long: boolean, initialAccFees: BorrowingFee.InitialAccFees, context: GetBorrowingFeeContext) => number;
11
+ export declare const borrowingFeeUtils: {
12
+ getPairGroupAccFeesDeltas: (i: number, pairGroups: BorrowingFee.PairGroup[], initialFees: BorrowingFee.InitialAccFees, pairIndex: number, long: boolean, context: GetBorrowingFeeContext) => {
13
+ deltaGroup: number;
14
+ deltaPair: number;
15
+ beforeTradeOpen: boolean;
16
+ };
17
+ getPairPendingAccFees: (pairIndex: number, currentBlock: number, context: {
18
+ pairs: BorrowingFee.Pair[];
19
+ openInterest: OpenInterest;
20
+ accBlockWeightedMarketCap: number;
21
+ }) => {
22
+ accFeeLong: number;
23
+ accFeeShort: number;
24
+ delta: number;
25
+ };
26
+ getPairPendingAccFee: (pairIndex: number, currentBlock: number, long: boolean, context: {
27
+ pairs: BorrowingFee.Pair[];
28
+ openInterest: OpenInterest;
29
+ accBlockWeightedMarketCap: number;
30
+ }) => number;
31
+ getGroupPendingAccFees: (groupIndex: number, currentBlock: number, context: {
32
+ groups: BorrowingFee.Group[];
33
+ accBlockWeightedMarketCap: number;
34
+ }) => {
35
+ accFeeLong: number;
36
+ accFeeShort: number;
37
+ delta: number;
38
+ };
39
+ getGroupPendingAccFee: (groupIndex: number, currentBlock: number, long: boolean, context: {
40
+ groups: BorrowingFee.Group[];
41
+ accBlockWeightedMarketCap: number;
42
+ }) => number;
43
+ getPendingAccFees: (accFeeLong: number, accFeeShort: number, oiLong: number, oiShort: number, feePerBlock: number, currentBlock: number, accLastUpdatedBlock: number, vaultMarketCap: number) => {
44
+ accFeeLong: number;
45
+ accFeeShort: number;
46
+ delta: number;
47
+ };
48
+ getActivePairFeePerBlock: (pair: BorrowingFee.Pair, openInterest: OpenInterest, accBlockWeightedMarketCap: number, currentBlock: number) => number;
49
+ getActiveGroupFeePerBlock: (group: BorrowingFee.Group, accBlockWeightedMarketCap: number, currentBlock: number) => number;
50
+ getActiveFeePerBlock: (pair: BorrowingFee.Pair, group: BorrowingFee.Group | undefined, pairOpenInterest: OpenInterest, accBlockWeightedMarketCap: number, currentBlock: number) => number;
51
+ getWeightedVaultMarketCap: (accBlockWeightedMarketCap: number, lastAccBlockWeightedMarketCap: number, blockDelta: number) => number;
52
+ };
53
+ export * as BorrowingFee from "./types";
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.BorrowingFee = exports.borrowingFeeUtils = exports.getBorrowingFee = void 0;
27
+ const getBorrowingFee = (posDai, pairIndex, long, initialAccFees, context) => {
28
+ if (!context.groups ||
29
+ !context.pairs ||
30
+ !context.openInterest ||
31
+ !context.pairs[pairIndex]) {
32
+ return 0;
33
+ }
34
+ const { pairs } = context;
35
+ const pairGroups = pairs[pairIndex].groups;
36
+ const firstPairGroup = (pairGroups === null || pairGroups === void 0 ? void 0 : pairGroups.length) > 0 ? pairGroups[0] : undefined;
37
+ let fee = 0;
38
+ if (!firstPairGroup || firstPairGroup.block > initialAccFees.block) {
39
+ fee =
40
+ (!firstPairGroup
41
+ ? getPairPendingAccFee(pairIndex, context.currentBlock, long, context)
42
+ : long
43
+ ? firstPairGroup.pairAccFeeLong
44
+ : firstPairGroup.pairAccFeeShort) - initialAccFees.accPairFee;
45
+ }
46
+ for (let i = pairGroups.length; i > 0; i--) {
47
+ const { deltaGroup, deltaPair, beforeTradeOpen } = getPairGroupAccFeesDeltas(i - 1, pairGroups, initialAccFees, pairIndex, long, context);
48
+ fee += Math.max(deltaGroup, deltaPair);
49
+ if (beforeTradeOpen) {
50
+ break;
51
+ }
52
+ }
53
+ return (posDai * fee) / 100;
54
+ };
55
+ exports.getBorrowingFee = getBorrowingFee;
56
+ const getPairPendingAccFees = (pairIndex, currentBlock, context) => {
57
+ const { pairs, openInterest: { long, short }, accBlockWeightedMarketCap, } = context;
58
+ const pair = pairs[pairIndex];
59
+ const vaultMarketCap = getWeightedVaultMarketCap(accBlockWeightedMarketCap, pair.lastAccBlockWeightedMarketCap, currentBlock - pair.accLastUpdatedBlock);
60
+ return getPendingAccFees(pair.accFeeLong, pair.accFeeShort, long, short, pair.feePerBlock, currentBlock, pair.accLastUpdatedBlock, vaultMarketCap);
61
+ };
62
+ const getPairPendingAccFee = (pairIndex, currentBlock, long, context) => {
63
+ const { accFeeLong, accFeeShort } = getPairPendingAccFees(pairIndex, currentBlock, context);
64
+ return long ? accFeeLong : accFeeShort;
65
+ };
66
+ const getGroupPendingAccFees = (groupIndex, currentBlock, context) => {
67
+ const { groups, accBlockWeightedMarketCap } = context;
68
+ const group = groups[groupIndex];
69
+ const vaultMarketCap = getWeightedVaultMarketCap(accBlockWeightedMarketCap, group.lastAccBlockWeightedMarketCap, currentBlock - group.accLastUpdatedBlock);
70
+ return getPendingAccFees(group.accFeeLong, group.accFeeShort, group.oiLong, group.oiShort, group.feePerBlock, currentBlock, group.accLastUpdatedBlock, vaultMarketCap);
71
+ };
72
+ const getGroupPendingAccFee = (groupIndex, currentBlock, long, context) => {
73
+ const { accFeeLong, accFeeShort } = getGroupPendingAccFees(groupIndex, currentBlock, context);
74
+ return long ? accFeeLong : accFeeShort;
75
+ };
76
+ const getPairGroupAccFeesDeltas = (i, pairGroups, initialFees, pairIndex, long, context) => {
77
+ const group = pairGroups[i];
78
+ const beforeTradeOpen = group.block < initialFees.block;
79
+ let deltaGroup, deltaPair;
80
+ if (i == pairGroups.length - 1) {
81
+ const { currentBlock, accBlockWeightedMarketCap, groups, pairs, openInterest, } = context;
82
+ deltaGroup = getGroupPendingAccFee(group.groupIndex, currentBlock, long, {
83
+ groups,
84
+ accBlockWeightedMarketCap,
85
+ });
86
+ deltaPair = getPairPendingAccFee(pairIndex, currentBlock, long, {
87
+ pairs,
88
+ openInterest: openInterest,
89
+ accBlockWeightedMarketCap,
90
+ });
91
+ }
92
+ else {
93
+ const nextGroup = pairGroups[i + 1];
94
+ if (beforeTradeOpen && nextGroup.block <= initialFees.block) {
95
+ return { deltaGroup: 0, deltaPair: 0, beforeTradeOpen };
96
+ }
97
+ deltaGroup = long
98
+ ? nextGroup.prevGroupAccFeeLong
99
+ : nextGroup.prevGroupAccFeeShort;
100
+ deltaPair = long ? nextGroup.pairAccFeeLong : nextGroup.pairAccFeeShort;
101
+ }
102
+ if (beforeTradeOpen) {
103
+ deltaGroup -= initialFees.accGroupFee;
104
+ deltaPair -= initialFees.accPairFee;
105
+ }
106
+ else {
107
+ deltaGroup -= long ? group.initialAccFeeLong : group.initialAccFeeShort;
108
+ deltaPair -= long ? group.pairAccFeeLong : group.pairAccFeeShort;
109
+ }
110
+ return { deltaGroup, deltaPair, beforeTradeOpen };
111
+ };
112
+ const getPendingAccFees = (accFeeLong, accFeeShort, oiLong, oiShort, feePerBlock, currentBlock, accLastUpdatedBlock, vaultMarketCap) => {
113
+ const delta = ((oiLong - oiShort) * feePerBlock * (currentBlock - accLastUpdatedBlock)) /
114
+ vaultMarketCap;
115
+ const newAccFeeLong = delta > 0 ? accFeeLong + delta : accFeeLong;
116
+ const newAccFeeShort = delta < 0 ? accFeeShort - delta : accFeeShort;
117
+ return { accFeeLong: newAccFeeLong, accFeeShort: newAccFeeShort, delta };
118
+ };
119
+ const getWeightedVaultMarketCap = (accBlockWeightedMarketCap, lastAccBlockWeightedMarketCap, blockDelta) => {
120
+ return blockDelta > 0
121
+ ? blockDelta /
122
+ (accBlockWeightedMarketCap - lastAccBlockWeightedMarketCap) /
123
+ 1e18
124
+ : 1;
125
+ };
126
+ const getActivePairFeePerBlock = (pair, openInterest, accBlockWeightedMarketCap, currentBlock) => {
127
+ const { long, short } = openInterest;
128
+ const vaultMarketCap = getWeightedVaultMarketCap(accBlockWeightedMarketCap, pair.lastAccBlockWeightedMarketCap, currentBlock - pair.accLastUpdatedBlock);
129
+ return (Math.abs(long - short) * pair.feePerBlock) / vaultMarketCap;
130
+ };
131
+ const getActiveGroupFeePerBlock = (group, accBlockWeightedMarketCap, currentBlock) => {
132
+ const { oiLong, oiShort } = group;
133
+ const vaultMarketCap = getWeightedVaultMarketCap(accBlockWeightedMarketCap, group.lastAccBlockWeightedMarketCap, currentBlock - group.accLastUpdatedBlock);
134
+ return (Math.abs(oiLong - oiShort) * group.feePerBlock) / vaultMarketCap;
135
+ };
136
+ const getActiveFeePerBlock = (pair, group, pairOpenInterest, accBlockWeightedMarketCap, currentBlock) => {
137
+ const pairFeePerBlock = getActivePairFeePerBlock(pair, pairOpenInterest, accBlockWeightedMarketCap, currentBlock);
138
+ if (!group) {
139
+ return pairFeePerBlock;
140
+ }
141
+ const groupFeePerBlock = getActiveGroupFeePerBlock(group, accBlockWeightedMarketCap, currentBlock);
142
+ return Math.max(pairFeePerBlock + groupFeePerBlock);
143
+ };
144
+ exports.borrowingFeeUtils = {
145
+ getPairGroupAccFeesDeltas,
146
+ getPairPendingAccFees,
147
+ getPairPendingAccFee,
148
+ getGroupPendingAccFees,
149
+ getGroupPendingAccFee,
150
+ getPendingAccFees,
151
+ getActivePairFeePerBlock,
152
+ getActiveGroupFeePerBlock,
153
+ getActiveFeePerBlock,
154
+ getWeightedVaultMarketCap,
155
+ };
156
+ exports.BorrowingFee = __importStar(require("./types"));
@@ -0,0 +1,32 @@
1
+ export type PairGroup = {
2
+ groupIndex: number;
3
+ initialAccFeeLong: number;
4
+ initialAccFeeShort: number;
5
+ prevGroupAccFeeLong: number;
6
+ prevGroupAccFeeShort: number;
7
+ pairAccFeeLong: number;
8
+ pairAccFeeShort: number;
9
+ block: number;
10
+ };
11
+ export type Pair = {
12
+ groups: PairGroup[];
13
+ feePerBlock: number;
14
+ accFeeLong: number;
15
+ accFeeShort: number;
16
+ accLastUpdatedBlock: number;
17
+ lastAccBlockWeightedMarketCap: number;
18
+ };
19
+ export type Group = {
20
+ oiLong: number;
21
+ oiShort: number;
22
+ feePerBlock: number;
23
+ accFeeLong: number;
24
+ accFeeShort: number;
25
+ accLastUpdatedBlock: number;
26
+ lastAccBlockWeightedMarketCap: number;
27
+ };
28
+ export type InitialAccFees = {
29
+ accPairFee: number;
30
+ accGroupFee: number;
31
+ block: number;
32
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,4 +1,4 @@
1
- import { Fee, OpenInterest, PairFundingFees, PairParams, PairRolloverFees } from "./types";
1
+ import { Fee, OpenInterest, PairFundingFees, PairParams, PairRolloverFees } from "../types";
2
2
  export declare const getClosingFee: (posDai: number, leverage: number, pairIndex: number, pairFee: Fee | undefined) => number;
3
3
  export type GetFundingFeeContext = {
4
4
  currentBlock?: number;
@@ -13,3 +13,4 @@ export type GetRolloverFeeContext = {
13
13
  pairRolloverFees?: PairRolloverFees;
14
14
  };
15
15
  export declare const getRolloverFee: (posDai: number, initialAccRolloverFees: number, openedAfterUpdate: boolean, context: GetRolloverFeeContext) => number;
16
+ export * from "./borrowing";
@@ -1,4 +1,18 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
2
16
  Object.defineProperty(exports, "__esModule", { value: true });
3
17
  exports.getRolloverFee = exports.getFundingFee = exports.getClosingFee = void 0;
4
18
  const getClosingFee = (posDai, leverage, pairIndex, pairFee) => {
@@ -43,3 +57,4 @@ const getRolloverFee = (posDai, initialAccRolloverFees, openedAfterUpdate, conte
43
57
  return posDai * (pendingAccRolloverFees - initialAccRolloverFees);
44
58
  };
45
59
  exports.getRolloverFee = getRolloverFee;
60
+ __exportStar(require("./borrowing"), exports);
@@ -2,3 +2,6 @@ export * from "./fees";
2
2
  export * from "./pnl";
3
3
  export * from "./spread";
4
4
  export * from "./openLimitOrder";
5
+ export * from "./liquidation";
6
+ export * from "./fees";
7
+ export * from "./types";
@@ -18,3 +18,6 @@ __exportStar(require("./fees"), exports);
18
18
  __exportStar(require("./pnl"), exports);
19
19
  __exportStar(require("./spread"), exports);
20
20
  __exportStar(require("./openLimitOrder"), exports);
21
+ __exportStar(require("./liquidation"), exports);
22
+ __exportStar(require("./fees"), exports);
23
+ __exportStar(require("./types"), exports);
@@ -0,0 +1,7 @@
1
+ import { GetFundingFeeContext, GetRolloverFeeContext, GetBorrowingFeeContext } from "./fees";
2
+ import { Trade, TradeInfo, TradeInitialAccFees } from "./types";
3
+ export type GetLiqPriceContext = GetFundingFeeContext & GetRolloverFeeContext & GetBorrowingFeeContext & {
4
+ currentBlock: number;
5
+ currentL1Block: number;
6
+ };
7
+ export declare const getLiquidationPrice: (trade: Trade, tradeInfo: TradeInfo, initialAccFees: TradeInitialAccFees, context: GetLiqPriceContext) => number;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getLiquidationPrice = void 0;
4
+ const fees_1 = require("./fees");
5
+ const getLiquidationPrice = (trade, tradeInfo, initialAccFees, context) => {
6
+ const posDai = trade.initialPosToken * tradeInfo.tokenPriceDai;
7
+ const liqPriceDistance = (trade.openPrice *
8
+ (posDai * 0.9 -
9
+ (0, fees_1.getRolloverFee)(posDai, initialAccFees.rollover, initialAccFees.openedAfterUpdate, Object.assign(Object.assign({}, context), { currentBlock: context.currentL1Block })) -
10
+ (0, fees_1.getBorrowingFee)(posDai * trade.leverage, trade.pairIndex, trade.buy, initialAccFees.borrowing, context) -
11
+ (0, fees_1.getFundingFee)(posDai * trade.leverage, initialAccFees.funding, trade.buy, initialAccFees.openedAfterUpdate, Object.assign(Object.assign({}, context), { currentBlock: context.currentL1Block })))) /
12
+ posDai /
13
+ trade.leverage;
14
+ return trade.buy
15
+ ? Math.max(trade.openPrice - liqPriceDistance, 0)
16
+ : Math.max(trade.openPrice + liqPriceDistance, 0);
17
+ };
18
+ exports.getLiquidationPrice = getLiquidationPrice;
@@ -1,7 +1,9 @@
1
- import { GetFundingFeeContext, GetRolloverFeeContext } from "./fees";
1
+ import { GetBorrowingFeeContext, GetFundingFeeContext, GetRolloverFeeContext } from "./fees";
2
2
  import { Fee, Trade, TradeInfo, TradeInitialAccFees } from "./types";
3
- export type GetPnlContext = {
3
+ export type GetPnlContext = GetRolloverFeeContext & GetFundingFeeContext & GetBorrowingFeeContext & {
4
+ currentBlock: number;
5
+ currentL1Block: number;
4
6
  fee: Fee | undefined;
5
7
  maxGainP: number | undefined;
6
- } & GetRolloverFeeContext & GetFundingFeeContext;
8
+ };
7
9
  export declare const getPnl: (price: number | undefined, trade: Trade, tradeInfo: TradeInfo, initialAccFees: TradeInitialAccFees, useFees: boolean, context: GetPnlContext) => number[] | undefined;
package/lib/trade/pnl.js CHANGED
@@ -8,7 +8,7 @@ const getPnl = (price, trade, tradeInfo, initialAccFees, useFees, context) => {
8
8
  }
9
9
  const posDai = trade.initialPosToken * tradeInfo.tokenPriceDai;
10
10
  const { openPrice, leverage } = trade;
11
- const { maxGainP, currentBlock, pairParams, pairRolloverFees, pairFundingFees, openInterest, fee, } = context;
11
+ const { maxGainP, pairParams, pairRolloverFees, pairFundingFees, openInterest, fee, currentL1Block, } = context;
12
12
  const maxGain = maxGainP === undefined ? Infinity : (maxGainP / 100) * posDai;
13
13
  let pnlDai = trade.buy
14
14
  ? ((price - openPrice) / openPrice) * leverage * posDai
@@ -16,16 +16,17 @@ const getPnl = (price, trade, tradeInfo, initialAccFees, useFees, context) => {
16
16
  pnlDai = pnlDai > maxGain ? maxGain : pnlDai;
17
17
  if (useFees) {
18
18
  pnlDai -= (0, fees_1.getRolloverFee)(posDai, initialAccFees.rollover, initialAccFees.openedAfterUpdate, {
19
- currentBlock,
19
+ currentBlock: currentL1Block,
20
20
  pairParams,
21
21
  pairRolloverFees,
22
22
  });
23
23
  pnlDai -= (0, fees_1.getFundingFee)(posDai * trade.leverage, initialAccFees.funding, trade.buy, initialAccFees.openedAfterUpdate, {
24
- currentBlock,
24
+ currentBlock: currentL1Block,
25
25
  pairParams,
26
26
  pairFundingFees,
27
27
  openInterest,
28
28
  });
29
+ pnlDai -= (0, fees_1.getBorrowingFee)(posDai, trade.pairIndex, trade.buy, initialAccFees.borrowing, context);
29
30
  }
30
31
  let pnlPercentage = (pnlDai / posDai) * 100;
31
32
  // Can be liquidated
@@ -1,5 +1,6 @@
1
1
  import { GFarmTradingStorageV5 } from "@/contracts/types/generated";
2
2
  import { BigNumber } from "ethers";
3
+ import { BorrowingFee } from "./fees/borrowing";
3
4
  export type PairIndexes = {
4
5
  [key: string]: number;
5
6
  };
@@ -7,6 +8,7 @@ export type TradeContainer = {
7
8
  trade: Trade;
8
9
  tradeInfo: TradeInfo;
9
10
  initialAccFees: TradeInitialAccFees;
11
+ receivedAt?: number;
10
12
  };
11
13
  export type Trade = {
12
14
  buy: boolean;
@@ -29,6 +31,7 @@ export type TradeInitialAccFees = {
29
31
  rollover: number;
30
32
  funding: number;
31
33
  openedAfterUpdate: boolean;
34
+ borrowing: BorrowingFee.InitialAccFees;
32
35
  };
33
36
  export type TradingGroup = {
34
37
  maxCollateralP: number;
@@ -85,6 +88,10 @@ export type PairFundingFees = {
85
88
  accPerOiShort: number;
86
89
  lastUpdateBlock: number;
87
90
  };
91
+ export type PairParamsBorrowingFees = {
92
+ pairs: BorrowingFee.Pair[];
93
+ groups: BorrowingFee.Group[];
94
+ };
88
95
  export type Pair = {
89
96
  name: string;
90
97
  from: string;
@@ -153,6 +160,11 @@ export type TradeContainerRaw = {
153
160
  rollover: BigNumber;
154
161
  funding: BigNumber;
155
162
  openedAfterUpdate: boolean;
163
+ borrowing: {
164
+ accPairFee: number;
165
+ accGroupFee: number;
166
+ block: number;
167
+ };
156
168
  };
157
169
  };
158
170
  export declare enum OpenLimitOrderType {
@@ -0,0 +1,7 @@
1
+ type GetPendingAccBlockWeightedMarketCap = {
2
+ marketCap: number;
3
+ accBlockWeightedMarketCap: number;
4
+ accBlockWeightedMarketCapLastStored: number;
5
+ };
6
+ export declare const getPendingAccBlockWeightedMarketCap: (currentBlock: number, context: GetPendingAccBlockWeightedMarketCap) => number;
7
+ export {};