@defisaver/ethena-sdk 0.0.2 → 0.0.4

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 (47) hide show
  1. package/cjs/index.d.ts +5 -0
  2. package/cjs/index.js +45 -0
  3. package/cjs/marketData/index.d.ts +4 -0
  4. package/cjs/marketData/index.js +34 -0
  5. package/cjs/marketData/morpho.d.ts +4 -0
  6. package/cjs/marketData/morpho.js +76 -0
  7. package/cjs/positionData/index.d.ts +3 -0
  8. package/cjs/positionData/index.js +34 -0
  9. package/cjs/positionData/morpho.d.ts +4 -0
  10. package/cjs/positionData/morpho.js +78 -0
  11. package/cjs/services/viem.d.ts +4404 -0
  12. package/cjs/services/viem.js +27 -0
  13. package/cjs/setup.d.ts +1 -0
  14. package/cjs/setup.js +12 -0
  15. package/cjs/types/common.d.ts +24 -0
  16. package/cjs/types/common.js +5 -0
  17. package/cjs/types/index.d.ts +2 -0
  18. package/cjs/types/index.js +18 -0
  19. package/cjs/types/markets.d.ts +3 -0
  20. package/cjs/types/markets.js +7 -0
  21. package/esm/index.d.ts +5 -0
  22. package/esm/index.js +5 -0
  23. package/esm/marketData/index.d.ts +4 -0
  24. package/esm/marketData/index.js +29 -0
  25. package/esm/marketData/morpho.d.ts +4 -0
  26. package/esm/marketData/morpho.js +68 -0
  27. package/esm/positionData/index.d.ts +3 -0
  28. package/esm/positionData/index.js +29 -0
  29. package/esm/positionData/morpho.d.ts +4 -0
  30. package/esm/positionData/morpho.js +70 -0
  31. package/esm/services/viem.d.ts +4394 -0
  32. package/esm/services/viem.js +22 -0
  33. package/esm/setup.d.ts +1 -0
  34. package/esm/setup.js +7 -0
  35. package/esm/types/common.d.ts +24 -0
  36. package/esm/types/common.js +2 -0
  37. package/esm/types/index.d.ts +2 -0
  38. package/esm/types/index.js +2 -0
  39. package/esm/types/markets.d.ts +3 -0
  40. package/esm/types/markets.js +4 -0
  41. package/package.json +1 -5
  42. package/.env.example +0 -1
  43. package/.eslintrc.js +0 -34
  44. package/tests/morpho.ts +0 -51
  45. package/tsconfig.cjs.json +0 -7
  46. package/tsconfig.esm.json +0 -11
  47. package/tsconfig.json +0 -25
package/cjs/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import './setup';
2
+ import * as positionData from './positionData';
3
+ import * as marketData from './marketData';
4
+ export * from './types';
5
+ export { positionData, marketData, };
package/cjs/index.js ADDED
@@ -0,0 +1,45 @@
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 () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
36
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.marketData = exports.positionData = void 0;
40
+ require("./setup");
41
+ const positionData = __importStar(require("./positionData"));
42
+ exports.positionData = positionData;
43
+ const marketData = __importStar(require("./marketData"));
44
+ exports.marketData = marketData;
45
+ __exportStar(require("./types"), exports);
@@ -0,0 +1,4 @@
1
+ import { NetworkNumber } from '@defisaver/positions-sdk';
2
+ import { MarketData, SupportedMarkets } from '../types';
3
+ export declare const getMarketData: (market: SupportedMarkets, rpcUrl: string, network: NetworkNumber) => Promise<MarketData>;
4
+ export declare const getNetApy: (marketData: MarketData, leverage: number) => string;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.getNetApy = exports.getMarketData = void 0;
13
+ const types_1 = require("../types");
14
+ const morpho_1 = require("./morpho");
15
+ const getMarketData = (market, rpcUrl, network) => __awaiter(void 0, void 0, void 0, function* () {
16
+ switch (market) {
17
+ case types_1.SupportedMarkets.MorphoBlueSUSDeUSDtb_915: {
18
+ return (0, morpho_1.getMorphoMarketData)(market, rpcUrl, network);
19
+ }
20
+ default:
21
+ throw new Error(`Unsupported market: ${market}`);
22
+ }
23
+ });
24
+ exports.getMarketData = getMarketData;
25
+ const getNetApy = (marketData, leverage) => {
26
+ switch (marketData.market) {
27
+ case types_1.SupportedMarkets.MorphoBlueSUSDeUSDtb_915: {
28
+ return (0, morpho_1.getMorphoNetApy)(marketData, leverage);
29
+ }
30
+ default:
31
+ throw new Error(`Unsupported market: ${marketData.market}`);
32
+ }
33
+ };
34
+ exports.getNetApy = getNetApy;
@@ -0,0 +1,4 @@
1
+ import { NetworkNumber } from '@defisaver/positions-sdk';
2
+ import { MarketData, SupportedMarkets } from '../types';
3
+ export declare const getMorphoMarketData: (market: SupportedMarkets, rpcUrl: string, network: NetworkNumber) => Promise<MarketData>;
4
+ export declare const getMorphoNetApy: (marketData: MarketData, leverage: number) => string;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.getMorphoNetApy = exports.getMorphoMarketData = void 0;
16
+ const positions_sdk_1 = require("@defisaver/positions-sdk");
17
+ const decimal_js_1 = __importDefault(require("decimal.js"));
18
+ const tokens_1 = require("@defisaver/tokens");
19
+ const viem_1 = require("../services/viem");
20
+ const getMaxLeverage = (collateralFactor) => new decimal_js_1.default(1)
21
+ .div(new decimal_js_1.default(1).sub(collateralFactor))
22
+ .toDP(2).toString();
23
+ const scaleMaxLeverage = (leverage) => leverage * 0.9;
24
+ const getLevApy = (leverage, supplyAsset, borrowAsset) => {
25
+ const supplyRate = new decimal_js_1.default(supplyAsset.supplyRate).add(supplyAsset.supplyIncentives.reduce((acc, curr) => acc.add(curr.apy), new decimal_js_1.default(0)));
26
+ const borrowRate = new decimal_js_1.default(borrowAsset.borrowRate).add(borrowAsset.borrowIncentives.reduce((acc, curr) => acc.add(curr.apy), new decimal_js_1.default(0)));
27
+ return new decimal_js_1.default(leverage).mul(supplyRate)
28
+ .sub(new decimal_js_1.default(leverage).sub(1).mul(borrowRate))
29
+ .toDP(4)
30
+ .toString();
31
+ };
32
+ const formatAssetsData = (assetsData) => {
33
+ const formattedData = {};
34
+ Object.entries(assetsData).forEach(([assetSymbol, assetData]) => {
35
+ formattedData[assetSymbol] = {
36
+ symbol: assetData.symbol,
37
+ address: assetData.address,
38
+ supplyRate: assetData.supplyRate,
39
+ borrowRate: assetData.borrowRate,
40
+ supplyIncentives: assetData.supplyIncentives,
41
+ borrowIncentives: assetData.borrowIncentives,
42
+ isDebtAsset: assetData.canBeBorrowed,
43
+ };
44
+ });
45
+ return formattedData;
46
+ };
47
+ const getMorphoMarketData = (market, rpcUrl, network) => __awaiter(void 0, void 0, void 0, function* () {
48
+ const provider = (0, viem_1.getViemProvider)(rpcUrl, network);
49
+ const morphoMarket = positions_sdk_1.markets.MorphoBlueMarkets(network)[positions_sdk_1.MorphoBlueVersions.MorphoBlueSUSDeUSDtb_915];
50
+ const [marketData, { reallocatableLiquidity: availableLiquidityWei }] = yield Promise.all([
51
+ positions_sdk_1.morphoBlue._getMorphoBlueMarketData(provider, network, morphoMarket),
52
+ positions_sdk_1.helpers.morphoBlueHelpers.getReallocatableLiquidity(morphoMarket.marketId, network),
53
+ ]);
54
+ const maxLeverageFactor = getMaxLeverage(marketData.lltv);
55
+ const scaledMaxLeverage = scaleMaxLeverage(parseFloat(maxLeverageFactor));
56
+ const assetsData = formatAssetsData(marketData.assetsData);
57
+ const availableLiquidity = (0, tokens_1.assetAmountInEth)(availableLiquidityWei, 'USDtb');
58
+ const leftToBorrowGlobal = new decimal_js_1.default(marketData.assetsData.USDtb.totalSupply || '0').sub(marketData.assetsData.USDtb.totalBorrow || '0').toString();
59
+ const leftToBorrowGlobalAdjusted = new decimal_js_1.default(availableLiquidity).add(leftToBorrowGlobal).toString();
60
+ return {
61
+ market,
62
+ maxLeverage: scaledMaxLeverage,
63
+ assetsData,
64
+ maxApy: getLevApy(scaledMaxLeverage, assetsData.sUSDe, assetsData.USDtb),
65
+ leftToBorrowGlobal: leftToBorrowGlobalAdjusted,
66
+ lltv: marketData.lltv,
67
+ rate: marketData.oracle,
68
+ };
69
+ });
70
+ exports.getMorphoMarketData = getMorphoMarketData;
71
+ const getMorphoNetApy = (marketData, leverage) => {
72
+ const supplyAsset = Object.values(marketData.assetsData).find((asset) => !asset.isDebtAsset);
73
+ const borrowAsset = Object.values(marketData.assetsData).find((asset) => asset.isDebtAsset);
74
+ return getLevApy(leverage, supplyAsset, borrowAsset);
75
+ };
76
+ exports.getMorphoNetApy = getMorphoNetApy;
@@ -0,0 +1,3 @@
1
+ import { MarketData, NetworkNumber, PositionData } from '../types';
2
+ export declare const getMaxLeverageForSupplyAmount: (marketData: MarketData, supplyAmount: string) => number;
3
+ export declare const getResultingPosition: (marketData: MarketData, supplyAmount: string, leverage: number, rpcUrl: string, network: NetworkNumber) => Promise<PositionData>;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.getResultingPosition = exports.getMaxLeverageForSupplyAmount = void 0;
13
+ const types_1 = require("../types");
14
+ const morpho_1 = require("./morpho");
15
+ const getMaxLeverageForSupplyAmount = (marketData, supplyAmount) => {
16
+ switch (marketData.market) {
17
+ case types_1.SupportedMarkets.MorphoBlueSUSDeUSDtb_915: {
18
+ return (0, morpho_1.getMorphoMaxLeverageForSupplyAmount)(marketData, supplyAmount);
19
+ }
20
+ default:
21
+ throw new Error(`Unsupported market: ${marketData.market}`);
22
+ }
23
+ };
24
+ exports.getMaxLeverageForSupplyAmount = getMaxLeverageForSupplyAmount;
25
+ const getResultingPosition = (marketData, supplyAmount, leverage, rpcUrl, network) => __awaiter(void 0, void 0, void 0, function* () {
26
+ switch (marketData.market) {
27
+ case types_1.SupportedMarkets.MorphoBlueSUSDeUSDtb_915: {
28
+ return (0, morpho_1.getMorphoResultingPosition)(marketData, supplyAmount, leverage, rpcUrl, network);
29
+ }
30
+ default:
31
+ throw new Error(`Unsupported market: ${marketData.market}`);
32
+ }
33
+ });
34
+ exports.getResultingPosition = getResultingPosition;
@@ -0,0 +1,4 @@
1
+ import { NetworkNumber } from '@defisaver/positions-sdk';
2
+ import { MarketData, PositionData } from '../types';
3
+ export declare const getMorphoMaxLeverageForSupplyAmount: (marketData: MarketData, supplyAmount: string) => number;
4
+ export declare const getMorphoResultingPosition: (marketData: MarketData, supplyAmount: string, leverage: number, rpcUrl: string, network: NetworkNumber) => Promise<PositionData>;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.getMorphoResultingPosition = exports.getMorphoMaxLeverageForSupplyAmount = void 0;
16
+ const decimal_js_1 = __importDefault(require("decimal.js"));
17
+ const tokens_1 = require("@defisaver/tokens");
18
+ const positions_sdk_1 = require("@defisaver/positions-sdk");
19
+ const viem_1 = require("../services/viem");
20
+ const getMaxBoostUsd = (lltv, borrowLimit, debt, targetRatio = 1.01, bufferPercent = 1) => new decimal_js_1.default(targetRatio).mul(debt).sub(borrowLimit)
21
+ .div(new decimal_js_1.default(lltv).sub(targetRatio).toString())
22
+ .mul((100 - bufferPercent) / 100)
23
+ .toString();
24
+ const getMorphoMaxLeverageBorrow = (marketData, supplyAmount) => {
25
+ const { lltv, rate: oracle, assetsData, leftToBorrowGlobal, } = marketData;
26
+ const borrowAsset = Object.values(assetsData).find((asset) => asset.isDebtAsset);
27
+ const maxBorrow = new decimal_js_1.default(supplyAmount).mul(oracle).mul(lltv).toString();
28
+ const maxBoost = getMaxBoostUsd(lltv, maxBorrow, '0');
29
+ return decimal_js_1.default.min(decimal_js_1.default.max(0, maxBoost), leftToBorrowGlobal).toDP((0, tokens_1.getAssetInfo)(borrowAsset === null || borrowAsset === void 0 ? void 0 : borrowAsset.symbol).decimals).toString();
30
+ };
31
+ const getMorphoMaxLeverageForSupplyAmount = (marketData, supplyAmount) => {
32
+ // TODO: implement FL logic
33
+ const feeMultiplier = 1;
34
+ const maxDebt = new decimal_js_1.default(getMorphoMaxLeverageBorrow(marketData, supplyAmount)).div(feeMultiplier).toString();
35
+ const rate = new decimal_js_1.default(1).div(marketData.rate).toString();
36
+ const maxLeverage = new decimal_js_1.default(supplyAmount).plus(new decimal_js_1.default(maxDebt).times(rate)).div(supplyAmount).toNumber();
37
+ return maxLeverage;
38
+ };
39
+ exports.getMorphoMaxLeverageForSupplyAmount = getMorphoMaxLeverageForSupplyAmount;
40
+ const getMorphoResultingPosition = (marketData, supplyAmount, leverage, rpcUrl, network) => __awaiter(void 0, void 0, void 0, function* () {
41
+ const provider = (0, viem_1.getViemProvider)(rpcUrl, network);
42
+ const morphoMarket = positions_sdk_1.markets.MorphoBlueMarkets(network)[positions_sdk_1.MorphoBlueVersions.MorphoBlueSUSDeUSDtb_915];
43
+ const { rate: oracle, assetsData, } = marketData;
44
+ const debtAmount = new decimal_js_1.default(leverage)
45
+ .times(supplyAmount).minus(supplyAmount).times(oracle)
46
+ .toString();
47
+ // TODO: add price fetching logic
48
+ const priceForAmount = new decimal_js_1.default(1).div(oracle).toString();
49
+ const leveragedAmount = new decimal_js_1.default(debtAmount).times(priceForAmount);
50
+ const collIncrease = new decimal_js_1.default(supplyAmount).plus(leveragedAmount).toString();
51
+ const supplyAsset = Object.values(assetsData).find((asset) => !asset.isDebtAsset);
52
+ const borrowAsset = Object.values(assetsData).find((asset) => asset.isDebtAsset);
53
+ const morphoMarketData = yield positions_sdk_1.morphoBlue._getMorphoBlueMarketData(provider, network, morphoMarket);
54
+ const usedAssets = {};
55
+ usedAssets[borrowAsset.symbol] = {
56
+ symbol: borrowAsset.symbol,
57
+ supplied: '0',
58
+ borrowed: debtAmount,
59
+ isSupplied: false,
60
+ isBorrowed: true,
61
+ collateral: false,
62
+ suppliedUsd: '0',
63
+ borrowedUsd: new decimal_js_1.default(debtAmount).mul(morphoMarketData.assetsData[borrowAsset.symbol].price).toString(),
64
+ };
65
+ usedAssets[supplyAsset.symbol] = {
66
+ symbol: supplyAsset.symbol,
67
+ supplied: collIncrease,
68
+ borrowed: '0',
69
+ isSupplied: true,
70
+ isBorrowed: false,
71
+ collateral: true,
72
+ suppliedUsd: new decimal_js_1.default(collIncrease).mul(morphoMarketData.assetsData[supplyAsset.symbol].price).toString(),
73
+ borrowedUsd: '0',
74
+ };
75
+ const aggregatedPosition = positions_sdk_1.helpers.morphoBlueHelpers.getMorphoBlueAggregatedPositionData({ usedAssets, assetsData: morphoMarketData.assetsData, marketInfo: morphoMarketData });
76
+ return Object.assign({ usedAssets }, aggregatedPosition);
77
+ });
78
+ exports.getMorphoResultingPosition = getMorphoResultingPosition;