@strkfarm/sdk 1.1.70 → 2.0.0-dev.2
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.
- package/dist/cli.js +2 -2
- package/dist/cli.mjs +2 -2
- package/dist/index.browser.global.js +67016 -59681
- package/dist/index.browser.mjs +29832 -23221
- package/dist/index.d.ts +2006 -787
- package/dist/index.js +25403 -18769
- package/dist/index.mjs +25333 -18739
- package/package.json +80 -76
- package/src/data/extended-deposit.abi.json +3613 -0
- package/src/data/universal-vault.abi.json +135 -20
- package/src/dataTypes/address.ts +7 -0
- package/src/global.ts +240 -193
- package/src/interfaces/common.tsx +26 -2
- package/src/modules/ExtendedWrapperSDk/index.ts +62 -0
- package/src/modules/ExtendedWrapperSDk/types.ts +311 -0
- package/src/modules/ExtendedWrapperSDk/wrapper.ts +395 -0
- package/src/modules/avnu.ts +17 -4
- package/src/modules/ekubo-quoter.ts +99 -10
- package/src/modules/erc20.ts +67 -21
- package/src/modules/harvests.ts +16 -29
- package/src/modules/index.ts +5 -1
- package/src/modules/lst-apr.ts +36 -0
- package/src/modules/midas.ts +159 -0
- package/src/modules/pricer-from-api.ts +2 -2
- package/src/modules/pricer-lst.ts +1 -1
- package/src/modules/pricer.ts +3 -38
- package/src/modules/token-market-data.ts +202 -0
- package/src/node/deployer.ts +1 -36
- package/src/strategies/autoCompounderStrk.ts +1 -1
- package/src/strategies/base-strategy.ts +20 -3
- package/src/strategies/ekubo-cl-vault.tsx +123 -306
- package/src/strategies/index.ts +4 -1
- package/src/strategies/svk-strategy.ts +247 -0
- package/src/strategies/universal-adapters/adapter-optimizer.ts +65 -0
- package/src/strategies/universal-adapters/adapter-utils.ts +5 -1
- package/src/strategies/universal-adapters/avnu-adapter.ts +411 -0
- package/src/strategies/universal-adapters/baseAdapter.ts +181 -153
- package/src/strategies/universal-adapters/common-adapter.ts +98 -77
- package/src/strategies/universal-adapters/extended-adapter.ts +661 -0
- package/src/strategies/universal-adapters/index.ts +5 -1
- package/src/strategies/universal-adapters/unused-balance-adapter.ts +109 -0
- package/src/strategies/universal-adapters/vesu-adapter.ts +220 -218
- package/src/strategies/universal-adapters/vesu-multiply-adapter.ts +924 -0
- package/src/strategies/universal-adapters/vesu-supply-only-adapter.ts +58 -51
- package/src/strategies/universal-lst-muliplier-strategy.tsx +707 -774
- package/src/strategies/universal-strategy.tsx +1098 -1180
- package/src/strategies/vesu-extended-strategy/services/operationService.ts +34 -0
- package/src/strategies/vesu-extended-strategy/utils/config.runtime.ts +77 -0
- package/src/strategies/vesu-extended-strategy/utils/constants.ts +49 -0
- package/src/strategies/vesu-extended-strategy/utils/helper.ts +376 -0
- package/src/strategies/vesu-extended-strategy/vesu-extended-strategy.tsx +1134 -0
- package/src/strategies/vesu-rebalance.tsx +16 -19
- package/src/utils/health-factor-math.ts +11 -5
|
@@ -1,30 +1,27 @@
|
|
|
1
1
|
import { ContractAddr, Web3Number } from "@/dataTypes";
|
|
2
|
-
import { IConfig, TokenInfo } from "@/interfaces";
|
|
2
|
+
import { IConfig, Protocols, TokenInfo } from "@/interfaces";
|
|
3
3
|
import { PricerBase } from "@/modules/pricerBase";
|
|
4
|
-
import { BaseAdapter, BaseAdapterConfig, SupportedPosition, PositionInfo, PositionAPY, APYType, ManageCall, AdapterLeafType, GenerateCallFn } from "./baseAdapter";
|
|
4
|
+
import { BaseAdapter, BaseAdapterConfig, SupportedPosition, PositionInfo, PositionAPY, APYType, ManageCall, AdapterLeafType, GenerateCallFn, DepositParams, WithdrawParams, PositionAmount } from "./baseAdapter";
|
|
5
5
|
import { SIMPLE_SANITIZER, toBigInt } from "./adapter-utils";
|
|
6
6
|
import { hash, uint256, Contract } from "starknet";
|
|
7
7
|
import { VesuAdapter } from "./vesu-adapter";
|
|
8
8
|
import { logger } from "@/utils";
|
|
9
|
+
import ERC4626Abi from "@/data/erc4626.abi.json";
|
|
10
|
+
import { TokenMarketData } from "@/modules";
|
|
9
11
|
|
|
10
12
|
export interface VesuSupplyOnlyAdapterConfig extends BaseAdapterConfig {
|
|
11
13
|
vTokenContract: ContractAddr;
|
|
12
14
|
}
|
|
13
15
|
|
|
14
|
-
export interface DepositParams {
|
|
15
|
-
amount: Web3Number;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export interface WithdrawParams {
|
|
19
|
-
amount: Web3Number;
|
|
20
|
-
}
|
|
21
16
|
|
|
22
|
-
export class VesuSupplyOnlyAdapter extends BaseAdapter<
|
|
17
|
+
export class VesuSupplyOnlyAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
|
|
23
18
|
readonly config: VesuSupplyOnlyAdapterConfig;
|
|
19
|
+
readonly tokenMarketData: TokenMarketData;
|
|
24
20
|
|
|
25
21
|
constructor(config: VesuSupplyOnlyAdapterConfig) {
|
|
26
|
-
super(config);
|
|
22
|
+
super(config, VesuSupplyOnlyAdapter.name, Protocols.VESU);
|
|
27
23
|
this.config = config;
|
|
24
|
+
this.tokenMarketData = new TokenMarketData(this.config.pricer, this.config.networkConfig);
|
|
28
25
|
}
|
|
29
26
|
|
|
30
27
|
protected async getAPY(supportedPosition: SupportedPosition): Promise<PositionAPY> {
|
|
@@ -71,14 +68,14 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
|
|
|
71
68
|
const supplyApy = Number(assetStats.supplyApy?.value || 0) / 1e18;
|
|
72
69
|
|
|
73
70
|
// Get LST APR if applicable (for LST tokens)
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
// This would need to be implemented based on your LST APR service
|
|
77
|
-
// For now, using a placeholder
|
|
78
|
-
lstAPY = 0;
|
|
79
|
-
}
|
|
71
|
+
const isSupported = this.tokenMarketData.isAPYSupported(baseToken);
|
|
72
|
+
const lstAPY = isSupported ? await this.tokenMarketData.getAPY(baseToken) : 0;
|
|
80
73
|
|
|
81
|
-
const
|
|
74
|
+
const rewardAPY = Number(assetStats.defiSpringSupplyApr?.value || "0") / 1e18;
|
|
75
|
+
|
|
76
|
+
// only account lstAPY if rewardAPY is positive
|
|
77
|
+
// bcz, without rewards, no point in simply depositing LST in vesu
|
|
78
|
+
const totalAPY = rewardAPY > 0 ? rewardAPY + supplyApy + lstAPY : supplyApy;
|
|
82
79
|
|
|
83
80
|
const result = {
|
|
84
81
|
apy: totalAPY,
|
|
@@ -89,16 +86,13 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
|
|
|
89
86
|
return result;
|
|
90
87
|
} catch (error) {
|
|
91
88
|
logger.error(`VesuSupplyOnlyAdapter: Error getting APY for ${supportedPosition.asset.symbol}:`, error);
|
|
92
|
-
|
|
93
|
-
apy: 0,
|
|
94
|
-
type: APYType.BASE
|
|
95
|
-
};
|
|
89
|
+
throw error;
|
|
96
90
|
}
|
|
97
91
|
}
|
|
98
92
|
|
|
99
|
-
protected async getPosition(supportedPosition: SupportedPosition): Promise<
|
|
93
|
+
protected async getPosition(supportedPosition: SupportedPosition): Promise<PositionAmount> {
|
|
100
94
|
const CACHE_KEY = `position_${this.config.vTokenContract.address}`;
|
|
101
|
-
const cacheData = this.getCache<
|
|
95
|
+
const cacheData = this.getCache<PositionAmount>(CACHE_KEY);
|
|
102
96
|
if (cacheData) {
|
|
103
97
|
return cacheData;
|
|
104
98
|
}
|
|
@@ -106,69 +100,78 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
|
|
|
106
100
|
try {
|
|
107
101
|
// Create contract instance for the vToken
|
|
108
102
|
const vTokenContract = new Contract({
|
|
109
|
-
abi:
|
|
103
|
+
abi: ERC4626Abi, // We only need basic ERC20 methods
|
|
110
104
|
address: this.config.vTokenContract.address,
|
|
111
105
|
providerOrAccount: this.config.networkConfig.provider
|
|
112
106
|
});
|
|
113
107
|
|
|
114
108
|
// Get the vault allocator's balance (shares) in the vToken contract
|
|
115
|
-
const shares = await vTokenContract.
|
|
109
|
+
const shares = await vTokenContract.balance_of(this.config.vaultAllocator.address);
|
|
116
110
|
|
|
117
111
|
// Convert shares to assets using convert_to_assets
|
|
118
112
|
const assets = await vTokenContract.convert_to_assets(
|
|
119
113
|
uint256.bnToUint256(shares)
|
|
120
114
|
);
|
|
121
115
|
|
|
122
|
-
const result =
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
116
|
+
const result = {
|
|
117
|
+
amount: Web3Number.fromWei(
|
|
118
|
+
assets.toString(),
|
|
119
|
+
supportedPosition.asset.decimals
|
|
120
|
+
),
|
|
121
|
+
remarks: "Vesu Earn"
|
|
122
|
+
};
|
|
126
123
|
|
|
127
124
|
this.setCache(CACHE_KEY, result, 60000); // Cache for 1 minute
|
|
128
125
|
return result;
|
|
129
126
|
} catch (error) {
|
|
130
127
|
logger.error(`VesuSupplyOnlyAdapter: Error getting position for ${supportedPosition.asset.symbol}:`, error);
|
|
131
|
-
|
|
128
|
+
throw error;
|
|
132
129
|
}
|
|
133
130
|
}
|
|
134
131
|
|
|
135
|
-
|
|
132
|
+
async maxDeposit(amount?: Web3Number): Promise<PositionInfo> {
|
|
136
133
|
const baseToken = this.config.baseToken;
|
|
137
134
|
// todo for assets with some borrowing on Vesu, the yield wont
|
|
138
135
|
// remain same as supply increases. So need to account for that.
|
|
139
136
|
|
|
140
137
|
if (!amount) {
|
|
141
138
|
// Return infinity for max deposit when no amount specified
|
|
142
|
-
return
|
|
139
|
+
return {
|
|
140
|
+
tokenInfo: baseToken,
|
|
143
141
|
amount: new Web3Number('999999999999999999999999999', baseToken.decimals),
|
|
144
142
|
usdValue: 999999999999999999999999999,
|
|
145
143
|
remarks: "Max deposit (infinity)",
|
|
146
|
-
apy: await this.getAPY({ asset: baseToken, isDebt: false })
|
|
147
|
-
|
|
144
|
+
apy: await this.getAPY({ asset: baseToken, isDebt: false }),
|
|
145
|
+
protocol: this.protocol
|
|
146
|
+
};
|
|
148
147
|
}
|
|
149
148
|
|
|
150
149
|
// Return position info based on input amount
|
|
151
150
|
const usdValue = await this.getUSDValue(baseToken, amount);
|
|
152
|
-
return
|
|
151
|
+
return {
|
|
152
|
+
tokenInfo: baseToken,
|
|
153
153
|
amount,
|
|
154
154
|
usdValue,
|
|
155
155
|
remarks: "Deposit amount",
|
|
156
|
-
apy: await this.getAPY({ asset: baseToken, isDebt: false })
|
|
157
|
-
|
|
156
|
+
apy: await this.getAPY({ asset: baseToken, isDebt: false }),
|
|
157
|
+
protocol: this.protocol
|
|
158
|
+
};
|
|
158
159
|
}
|
|
159
160
|
|
|
160
|
-
|
|
161
|
+
async maxWithdraw(): Promise<PositionInfo> {
|
|
161
162
|
const baseToken = this.config.baseToken;
|
|
162
163
|
const currentPosition = await this.getPosition({ asset: baseToken, isDebt: false });
|
|
163
164
|
|
|
164
165
|
// Return the current position as max withdraw
|
|
165
|
-
const usdValue = await this.getUSDValue(baseToken, currentPosition);
|
|
166
|
-
return
|
|
167
|
-
|
|
166
|
+
const usdValue = await this.getUSDValue(baseToken, currentPosition.amount);
|
|
167
|
+
return {
|
|
168
|
+
tokenInfo: baseToken,
|
|
169
|
+
amount: currentPosition.amount,
|
|
168
170
|
usdValue,
|
|
169
171
|
remarks: "Max withdraw",
|
|
170
|
-
apy: await this.getAPY({ asset: baseToken, isDebt: false })
|
|
171
|
-
|
|
172
|
+
apy: await this.getAPY({ asset: baseToken, isDebt: false }),
|
|
173
|
+
protocol: this.protocol
|
|
174
|
+
};
|
|
172
175
|
}
|
|
173
176
|
|
|
174
177
|
protected _getDepositLeaf(): {
|
|
@@ -190,7 +193,7 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
|
|
|
190
193
|
vTokenContract.toBigInt(), // spender
|
|
191
194
|
],
|
|
192
195
|
sanitizer: SIMPLE_SANITIZER,
|
|
193
|
-
id: `
|
|
196
|
+
id: `appr_dep_vtkn_${this.config.vTokenContract.shortString()}`
|
|
194
197
|
},
|
|
195
198
|
// Deposit step
|
|
196
199
|
{
|
|
@@ -200,7 +203,7 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
|
|
|
200
203
|
this.config.vaultAllocator.toBigInt(),
|
|
201
204
|
],
|
|
202
205
|
sanitizer: SIMPLE_SANITIZER,
|
|
203
|
-
id: `deposit_vtoken_${this.config.vTokenContract.
|
|
206
|
+
id: `deposit_vtoken_${this.config.vTokenContract.shortString()}`
|
|
204
207
|
}
|
|
205
208
|
];
|
|
206
209
|
}
|
|
@@ -224,7 +227,7 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
|
|
|
224
227
|
this.config.vaultAllocator.toBigInt(),
|
|
225
228
|
],
|
|
226
229
|
sanitizer: SIMPLE_SANITIZER,
|
|
227
|
-
id: `withdraw_vtoken_${this.config.vTokenContract.
|
|
230
|
+
id: `withdraw_vtoken_${this.config.vTokenContract.shortString()}`
|
|
228
231
|
}
|
|
229
232
|
];
|
|
230
233
|
}
|
|
@@ -241,7 +244,7 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
|
|
|
241
244
|
}, sanitizer);
|
|
242
245
|
return leaf;
|
|
243
246
|
});
|
|
244
|
-
return { leaves, callConstructor: this.
|
|
247
|
+
return { leaves, callConstructor: this.getDepositCall.bind(this) as unknown as GenerateCallFn<DepositParams> };
|
|
245
248
|
}
|
|
246
249
|
|
|
247
250
|
getWithdrawAdapter(): AdapterLeafType<WithdrawParams> {
|
|
@@ -256,10 +259,10 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
|
|
|
256
259
|
}, sanitizer);
|
|
257
260
|
return leaf;
|
|
258
261
|
});
|
|
259
|
-
return { leaves, callConstructor: this.
|
|
262
|
+
return { leaves, callConstructor: this.getWithdrawCall.bind(this) as unknown as GenerateCallFn<WithdrawParams> };
|
|
260
263
|
}
|
|
261
264
|
|
|
262
|
-
|
|
265
|
+
async getDepositCall(params: DepositParams): Promise<ManageCall[]> {
|
|
263
266
|
const baseToken = this.config.baseToken;
|
|
264
267
|
const vTokenContract = this.config.vTokenContract;
|
|
265
268
|
|
|
@@ -296,7 +299,7 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
|
|
|
296
299
|
];
|
|
297
300
|
}
|
|
298
301
|
|
|
299
|
-
|
|
302
|
+
async getWithdrawCall(params: WithdrawParams): Promise<ManageCall[]> {
|
|
300
303
|
const vTokenContract = this.config.vTokenContract;
|
|
301
304
|
|
|
302
305
|
const amount = params.amount;
|
|
@@ -319,4 +322,8 @@ export class VesuSupplyOnlyAdapter extends BaseAdapter<any, any> {
|
|
|
319
322
|
}
|
|
320
323
|
];
|
|
321
324
|
}
|
|
325
|
+
|
|
326
|
+
getHealthFactor(): Promise<number> {
|
|
327
|
+
return Promise.resolve(10);
|
|
328
|
+
}
|
|
322
329
|
}
|