@strkfarm/sdk 2.0.0-dev.28 → 2.0.0-dev.29
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/index.browser.global.js +1938 -771
- package/dist/index.browser.mjs +1960 -791
- package/dist/index.d.ts +343 -124
- package/dist/index.js +1971 -794
- package/dist/index.mjs +1963 -791
- package/package.json +1 -1
- package/src/dataTypes/bignumber.browser.ts +6 -1
- package/src/dataTypes/bignumber.node.ts +5 -1
- package/src/interfaces/common.tsx +8 -1
- package/src/strategies/universal-adapters/baseAdapter.ts +1 -1
- package/src/strategies/universal-adapters/extended-adapter.ts +7 -7
- package/src/strategies/universal-adapters/index.ts +2 -1
- package/src/strategies/universal-adapters/svk-troves-adapter.ts +364 -0
- package/src/strategies/universal-adapters/vesu-multiply-adapter.ts +88 -34
- package/src/strategies/vesu-extended-strategy/services/executionService.ts +36 -55
- package/src/strategies/vesu-extended-strategy/services/extended-vesu-state-manager.ts +1553 -538
- package/src/strategies/vesu-extended-strategy/services/ltv-imbalance-rebalance-math.ts +730 -0
- package/src/strategies/vesu-extended-strategy/services/operationService.ts +4 -3
- package/src/strategies/vesu-extended-strategy/vesu-extended-strategy.tsx +27 -83
- package/src/utils/index.ts +1 -0
|
@@ -2,8 +2,10 @@ import { Web3Number } from "@/dataTypes";
|
|
|
2
2
|
import { ExtendedAdapter } from "@/strategies/universal-adapters/extended-adapter";
|
|
3
3
|
import { VesuMultiplyAdapter } from "../../universal-adapters/vesu-multiply-adapter";
|
|
4
4
|
import { CycleType, TransactionResult } from "../types/transaction-metadata";
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
|
|
6
|
+
/** Planned asset routing between protocols (concrete `Operations` subclasses define shape). */
|
|
7
|
+
export interface AssetMovementPlan {}
|
|
8
|
+
|
|
7
9
|
export abstract class Operations {
|
|
8
10
|
|
|
9
11
|
abstract computeAssetMovements(
|
|
@@ -38,7 +40,6 @@ export abstract class Operations {
|
|
|
38
40
|
params: { from: string; to: string; amount: Web3Number, cycleType: CycleType },
|
|
39
41
|
extendedAdapter: ExtendedAdapter,
|
|
40
42
|
vesuAdapter: VesuMultiplyAdapter,
|
|
41
|
-
usdcToUsdceAdapter: UsdcToUsdceAdapter,
|
|
42
43
|
): Promise<TransactionResult>;
|
|
43
44
|
/**
|
|
44
45
|
* Handle deposit operation.
|
|
@@ -63,7 +63,6 @@ import { ExtendedAdapter } from "../universal-adapters/extended-adapter";
|
|
|
63
63
|
import { SVKStrategy } from "../svk-strategy";
|
|
64
64
|
import { AvnuAdapter } from "../universal-adapters/avnu-adapter";
|
|
65
65
|
import { SingleTokenInfo } from "../base-strategy";
|
|
66
|
-
import { UsdcToUsdceAdapter } from "../universal-adapters/usdc<>usdce-adapter";
|
|
67
66
|
import { VesuConfig } from "./utils/config.runtime";
|
|
68
67
|
|
|
69
68
|
export interface VesuExtendedStrategySettings extends UniversalStrategySettings {
|
|
@@ -82,7 +81,6 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
82
81
|
> extends SVKStrategy<S> {
|
|
83
82
|
public wbtcToken: TokenInfo;
|
|
84
83
|
public usdcToken: TokenInfo;
|
|
85
|
-
public usdceToken: TokenInfo;
|
|
86
84
|
public readonly stateManager: ExtendedSVKVesuStateManager;
|
|
87
85
|
|
|
88
86
|
constructor(
|
|
@@ -104,10 +102,6 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
104
102
|
// todo check if this can be generalized
|
|
105
103
|
this.wbtcToken = Global.getDefaultTokens().find((token) => token.symbol === "WBTC")!;
|
|
106
104
|
this.usdcToken = this.metadata.additionalInfo.borrowable_assets[0]!;
|
|
107
|
-
this.usdceToken = Global.getDefaultTokens().find(
|
|
108
|
-
(token) => token.symbol === "USDC.e",
|
|
109
|
-
)!;
|
|
110
|
-
|
|
111
105
|
this.stateManager = this._initializeStateManager();
|
|
112
106
|
}
|
|
113
107
|
|
|
@@ -136,8 +130,8 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
136
130
|
extendedAdapter: extendedAdapterEntry.adapter as ExtendedAdapter,
|
|
137
131
|
vaultAllocator: this.metadata.additionalInfo.vaultAllocator,
|
|
138
132
|
walletAddress: this.metadata.additionalInfo.walletAddress,
|
|
139
|
-
assetToken:
|
|
140
|
-
|
|
133
|
+
assetToken: this.asset(),
|
|
134
|
+
usdcToken: this.usdcToken,
|
|
141
135
|
collateralToken: this.wbtcToken,
|
|
142
136
|
limitBalanceBufferFactor: LIMIT_BALANCE,
|
|
143
137
|
};
|
|
@@ -177,7 +171,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
177
171
|
return { collateralPrice, debtPrice };
|
|
178
172
|
}
|
|
179
173
|
|
|
180
|
-
async
|
|
174
|
+
async getVesuMultiplyAdapter(): Promise<VesuMultiplyAdapter> {
|
|
181
175
|
const vesuAdapter = this.metadata.additionalInfo.adapters.find(
|
|
182
176
|
(adapter) => adapter.adapter.name === VesuMultiplyAdapter.name,
|
|
183
177
|
);
|
|
@@ -201,16 +195,16 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
201
195
|
return vesuModifyPositionAdapter.adapter as VesuModifyPositionAdapter;
|
|
202
196
|
}
|
|
203
197
|
|
|
204
|
-
async
|
|
205
|
-
const
|
|
198
|
+
async getUsdcTransferAdapter(): Promise<TokenTransferAdapter> {
|
|
199
|
+
const usdcTransferAdapter = this.metadata.additionalInfo.adapters.find(
|
|
206
200
|
(adapter) => adapter.adapter.name === TokenTransferAdapter.name,
|
|
207
201
|
);
|
|
208
|
-
if (!
|
|
202
|
+
if (!usdcTransferAdapter) {
|
|
209
203
|
throw new Error(
|
|
210
|
-
`${this.getTag()}
|
|
204
|
+
`${this.getTag()} Usdc transfer adapter not configured in metadata.`
|
|
211
205
|
);
|
|
212
206
|
}
|
|
213
|
-
return
|
|
207
|
+
return usdcTransferAdapter.adapter as TokenTransferAdapter;
|
|
214
208
|
}
|
|
215
209
|
|
|
216
210
|
async getAvnuAdapter(): Promise<AvnuAdapter> {
|
|
@@ -242,18 +236,6 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
242
236
|
return extendedAdapter.adapter as ExtendedAdapter;
|
|
243
237
|
}
|
|
244
238
|
|
|
245
|
-
async getUsdcToUsdceAdapter(): Promise<UsdcToUsdceAdapter> {
|
|
246
|
-
const usdcToUsdceAdapter = this.metadata.additionalInfo.adapters.find(
|
|
247
|
-
(adapter) => adapter.adapter.name === UsdcToUsdceAdapter.name,
|
|
248
|
-
);
|
|
249
|
-
if (!usdcToUsdceAdapter) {
|
|
250
|
-
throw new Error(
|
|
251
|
-
`${this.getTag()} UsdcToUsdce adapter not configured in metadata.`
|
|
252
|
-
);
|
|
253
|
-
}
|
|
254
|
-
return usdcToUsdceAdapter.adapter as UsdcToUsdceAdapter;
|
|
255
|
-
}
|
|
256
|
-
|
|
257
239
|
/**
|
|
258
240
|
* Creates an ExecutionService wired to this strategy's adapters and config.
|
|
259
241
|
* Use with `stateManager.solve()` to get a SolveResult, then pass it to
|
|
@@ -269,36 +251,32 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
269
251
|
maxPriceDivergenceBps?: number;
|
|
270
252
|
}): Promise<ExecutionService> {
|
|
271
253
|
const [
|
|
272
|
-
|
|
254
|
+
vesuMultiplyAdapter,
|
|
273
255
|
vesuModifyPositionAdapter,
|
|
274
|
-
usdceTransferAdapter,
|
|
275
256
|
extendedAdapter,
|
|
276
257
|
avnuAdapter,
|
|
277
|
-
|
|
258
|
+
usdcTransferAdapter,
|
|
278
259
|
] =
|
|
279
260
|
await Promise.all([
|
|
280
|
-
this.
|
|
261
|
+
this.getVesuMultiplyAdapter(),
|
|
281
262
|
this.getVesuModifyPositionAdapter(),
|
|
282
|
-
this.getUsdceTransferAdapter(),
|
|
283
263
|
this.getExtendedAdapter(),
|
|
284
264
|
this.getAvnuAdapter(),
|
|
285
|
-
this.
|
|
265
|
+
this.getUsdcTransferAdapter(),
|
|
286
266
|
]);
|
|
287
267
|
|
|
288
268
|
const executionConfig: ExecutionConfig = {
|
|
289
269
|
networkConfig: this.config,
|
|
290
270
|
pricer: this.pricer,
|
|
291
|
-
|
|
271
|
+
vesuMultiplyAdapter,
|
|
292
272
|
vesuModifyPositionAdapter,
|
|
293
273
|
extendedAdapter,
|
|
294
274
|
avnuAdapter,
|
|
295
|
-
|
|
275
|
+
usdcTransferAdapter,
|
|
296
276
|
vaultAllocator: this.metadata.additionalInfo.vaultAllocator,
|
|
297
277
|
walletAddress: this.metadata.additionalInfo.walletAddress,
|
|
298
|
-
usdceTransferAdapter,
|
|
299
278
|
wbtcToken: this.wbtcToken,
|
|
300
279
|
usdcToken: this.usdcToken,
|
|
301
|
-
usdceToken: this.usdceToken,
|
|
302
280
|
getMerkleTree: () => this.getMerkleTree(),
|
|
303
281
|
getManageCall: (proofs, manageCalls) => this.getManageCall(proofs, manageCalls),
|
|
304
282
|
getBringLiquidityCall: (params) => this.getBringLiquidityCall(params),
|
|
@@ -325,9 +303,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
325
303
|
for (let adapter of this.metadata.additionalInfo.adapters) {
|
|
326
304
|
let positions = await adapter.adapter.getPositions();
|
|
327
305
|
if (positions && positions.length > 0) {
|
|
328
|
-
const filteredPositions = positions
|
|
329
|
-
return position.tokenInfo.address !== this.usdceToken.address;
|
|
330
|
-
});
|
|
306
|
+
const filteredPositions = positions;
|
|
331
307
|
allPositions.push(...filteredPositions);
|
|
332
308
|
}
|
|
333
309
|
}
|
|
@@ -539,7 +515,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
539
515
|
}
|
|
540
516
|
|
|
541
517
|
/**
|
|
542
|
-
* Fetches the operator wallet's current holdings for USDC
|
|
518
|
+
* Fetches the operator wallet's current holdings for USDC and WBTC,
|
|
543
519
|
* returning each token's balance and USD value.
|
|
544
520
|
*/
|
|
545
521
|
async getWalletHoldings(): Promise<
|
|
@@ -549,33 +525,19 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
549
525
|
usdValue: number;
|
|
550
526
|
}[]
|
|
551
527
|
> {
|
|
552
|
-
if (!this.
|
|
528
|
+
if (!this.wbtcToken || !this.usdcToken) {
|
|
553
529
|
return [];
|
|
554
530
|
}
|
|
555
531
|
const walletAddress = this.metadata.additionalInfo.walletAddress;
|
|
556
|
-
const usdceWalletBalance = await new ERC20(this.config).balanceOf(
|
|
557
|
-
this.usdceToken.address,
|
|
558
|
-
walletAddress,
|
|
559
|
-
this.usdceToken.decimals,
|
|
560
|
-
);
|
|
561
532
|
const usdcWalletBalance = await new ERC20(this.config).balanceOf(
|
|
562
533
|
this.usdcToken.address,
|
|
563
534
|
walletAddress,
|
|
564
535
|
this.usdcToken.decimals,
|
|
565
536
|
);
|
|
566
|
-
const price = await this.pricer.getPrice(this.
|
|
567
|
-
const wbtcPrice = await this.pricer.getPrice(this.wbtcToken.symbol);
|
|
568
|
-
const usdceUsdValue =
|
|
569
|
-
Number(usdceWalletBalance.toFixed(this.usdceToken.decimals)) *
|
|
570
|
-
price.price;
|
|
537
|
+
const price = await this.pricer.getPrice(this.usdcToken.symbol);
|
|
571
538
|
const usdcUsdValue =
|
|
572
539
|
Number(usdcWalletBalance.toFixed(this.usdcToken.decimals)) * price.price;
|
|
573
540
|
return [
|
|
574
|
-
{
|
|
575
|
-
tokenInfo: this.usdceToken,
|
|
576
|
-
amount: usdceWalletBalance,
|
|
577
|
-
usdValue: usdceUsdValue,
|
|
578
|
-
},
|
|
579
541
|
{
|
|
580
542
|
tokenInfo: this.usdcToken,
|
|
581
543
|
amount: usdcWalletBalance,
|
|
@@ -586,7 +548,7 @@ export class VesuExtendedMultiplierStrategy<
|
|
|
586
548
|
}
|
|
587
549
|
|
|
588
550
|
/**
|
|
589
|
-
* Configures all adapters (Vesu, Extended, Avnu,
|
|
551
|
+
* Configures all adapters (Vesu, Extended, Avnu, TokenTransfer)
|
|
590
552
|
* and registers their leaf adapters on the vault settings. This is the central
|
|
591
553
|
* wiring function that connects the strategy to its underlying protocol adapters.
|
|
592
554
|
*/
|
|
@@ -612,9 +574,6 @@ function getLooperSettings(
|
|
|
612
574
|
const usdcToken = Global.getDefaultTokens().find(
|
|
613
575
|
(token) => token.symbol === underlyingSymbol,
|
|
614
576
|
)!;
|
|
615
|
-
const usdceToken = Global.getDefaultTokens().find(
|
|
616
|
-
(token) => token.symbol === "USDC.e",
|
|
617
|
-
)!;
|
|
618
577
|
|
|
619
578
|
const baseAdapterConfig: BaseAdapterConfig = {
|
|
620
579
|
baseToken: wbtcToken,
|
|
@@ -640,18 +599,10 @@ function getLooperSettings(
|
|
|
640
599
|
maximumExtendedPriceDifferenceForSwapClosing,
|
|
641
600
|
});
|
|
642
601
|
|
|
643
|
-
const usdcToUsdceAdapter = new UsdcToUsdceAdapter({
|
|
644
|
-
...baseAdapterConfig,
|
|
645
|
-
supportedPositions: [
|
|
646
|
-
{ asset: usdcToken, isDebt: true },
|
|
647
|
-
{ asset: usdceToken, isDebt: false },
|
|
648
|
-
],
|
|
649
|
-
});
|
|
650
|
-
|
|
651
602
|
const extendedAdapter = new ExtendedAdapter({
|
|
652
603
|
...baseAdapterConfig,
|
|
653
604
|
supportedPositions: [
|
|
654
|
-
{ asset:
|
|
605
|
+
{ asset: usdcToken, isDebt: false },
|
|
655
606
|
],
|
|
656
607
|
vaultIdExtended: vaultIdExtended,
|
|
657
608
|
extendedContract: EXTENDED_CONTRACT,
|
|
@@ -699,10 +650,10 @@ function getLooperSettings(
|
|
|
699
650
|
});
|
|
700
651
|
|
|
701
652
|
// Transfers USDC between the vault allocator (fromAddress) and the operator wallet (toAddress)
|
|
702
|
-
const
|
|
653
|
+
const usdcTransferAdapter = new TokenTransferAdapter({
|
|
703
654
|
...baseAdapterConfig,
|
|
704
|
-
baseToken:
|
|
705
|
-
supportedPositions: [{ asset:
|
|
655
|
+
baseToken: usdcToken,
|
|
656
|
+
supportedPositions: [{ asset: usdcToken, isDebt: false }],
|
|
706
657
|
fromAddress: vaultSettings.vaultAllocator,
|
|
707
658
|
toAddress: ContractAddr.from(vaultSettings.walletAddress),
|
|
708
659
|
});
|
|
@@ -718,13 +669,8 @@ function getLooperSettings(
|
|
|
718
669
|
});
|
|
719
670
|
|
|
720
671
|
vaultSettings.adapters.push({
|
|
721
|
-
id: `${
|
|
722
|
-
adapter:
|
|
723
|
-
});
|
|
724
|
-
|
|
725
|
-
vaultSettings.adapters.push({
|
|
726
|
-
id: `${usdcToUsdceAdapter.name}_${usdceToken.symbol}_${usdcToken.symbol}`,
|
|
727
|
-
adapter: usdcToUsdceAdapter,
|
|
672
|
+
id: `${usdcTransferAdapter.name}_${usdcToken.symbol}`,
|
|
673
|
+
adapter: usdcTransferAdapter,
|
|
728
674
|
});
|
|
729
675
|
|
|
730
676
|
vaultSettings.adapters.push({
|
|
@@ -750,12 +696,10 @@ function getLooperSettings(
|
|
|
750
696
|
vaultSettings.leafAdapters.push(() => vesuModifyPositionAdapter.getDepositLeaf());
|
|
751
697
|
vaultSettings.leafAdapters.push(() => vesuModifyPositionAdapter.getWithdrawLeaf());
|
|
752
698
|
vaultSettings.leafAdapters.push(() => extendedAdapter.getDepositLeaf());
|
|
753
|
-
vaultSettings.leafAdapters.push(() => usdcToUsdceAdapter.getDepositLeaf());
|
|
754
|
-
vaultSettings.leafAdapters.push(() => usdcToUsdceAdapter.getWithdrawLeaf());
|
|
755
699
|
vaultSettings.leafAdapters.push(() => avnuAdapter.getDepositLeaf());
|
|
756
700
|
vaultSettings.leafAdapters.push(() => avnuAdapter.getWithdrawLeaf());
|
|
757
|
-
vaultSettings.leafAdapters.push(() =>
|
|
758
|
-
vaultSettings.leafAdapters.push(() =>
|
|
701
|
+
vaultSettings.leafAdapters.push(() => usdcTransferAdapter.getDepositLeaf());
|
|
702
|
+
vaultSettings.leafAdapters.push(() => usdcTransferAdapter.getWithdrawLeaf());
|
|
759
703
|
vaultSettings.leafAdapters.push(
|
|
760
704
|
commonAdapter
|
|
761
705
|
.getApproveAdapter(
|
package/src/utils/index.ts
CHANGED
|
@@ -2,6 +2,7 @@ export * from '@/utils/logger';
|
|
|
2
2
|
export * from './oz-merkle';
|
|
3
3
|
export * from "./strategy-utils";
|
|
4
4
|
export * from "./starknet-call-parser";
|
|
5
|
+
export * from "./health-factor-math";
|
|
5
6
|
|
|
6
7
|
// Utility type to make all optional properties required
|
|
7
8
|
export type RequiredFields<T> = {
|