@strkfarm/sdk 2.0.0-dev.2 → 2.0.0-dev.21
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 +2006 -1062
- package/dist/index.browser.mjs +1845 -911
- package/dist/index.d.ts +144 -37
- package/dist/index.js +1853 -915
- package/dist/index.mjs +1845 -911
- package/package.json +1 -1
- package/src/modules/ExtendedWrapperSDk/types.ts +1 -1
- package/src/modules/ExtendedWrapperSDk/wrapper.ts +39 -8
- package/src/modules/ekubo-quoter.ts +0 -12
- package/src/strategies/index.ts +2 -1
- package/src/strategies/universal-adapters/avnu-adapter.ts +17 -9
- package/src/strategies/universal-adapters/extended-adapter.ts +500 -146
- package/src/strategies/universal-adapters/index.ts +2 -1
- package/src/strategies/universal-adapters/vesu-adapter.ts +6 -6
- package/src/strategies/universal-adapters/vesu-multiply-adapter.ts +778 -396
- package/src/strategies/universal-lst-muliplier-strategy.tsx +2 -1
- package/src/strategies/universal-strategy.tsx +5 -0
- package/src/strategies/vesu-extended-strategy/services/operationService.ts +25 -16
- package/src/strategies/vesu-extended-strategy/types/transaction-metadata.ts +36 -0
- package/src/strategies/vesu-extended-strategy/utils/constants.ts +3 -6
- package/src/strategies/vesu-extended-strategy/utils/helper.ts +50 -16
- package/src/strategies/vesu-extended-strategy/vesu-extended-strategy.tsx +746 -305
package/package.json
CHANGED
|
@@ -76,8 +76,33 @@ export class ExtendedWrapper {
|
|
|
76
76
|
}`
|
|
77
77
|
);
|
|
78
78
|
}
|
|
79
|
-
|
|
80
|
-
const
|
|
79
|
+
|
|
80
|
+
const text = await response.text();
|
|
81
|
+
|
|
82
|
+
// Replace large integers (greater than MAX_SAFE_INTEGER) with quoted strings
|
|
83
|
+
// This regex finds numbers that are likely to be large integers in the "data" field
|
|
84
|
+
const MAX_SAFE_INTEGER_STR = '9007199254740991';
|
|
85
|
+
const largeIntegerRegex = /"data"\s*:\s*(\d{16,})/g;
|
|
86
|
+
|
|
87
|
+
const modifiedText = text.replace(largeIntegerRegex, (match, largeInt) => {
|
|
88
|
+
// Compare as strings to avoid precision loss
|
|
89
|
+
if (largeInt.length > MAX_SAFE_INTEGER_STR.length ||
|
|
90
|
+
(largeInt.length === MAX_SAFE_INTEGER_STR.length && largeInt > MAX_SAFE_INTEGER_STR)) {
|
|
91
|
+
// Replace the number with a quoted string to preserve precision
|
|
92
|
+
return `"data":"${largeInt}"`;
|
|
93
|
+
}
|
|
94
|
+
return match; // Keep original if it's a safe integer
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
const data = JSON.parse(modifiedText);
|
|
98
|
+
|
|
99
|
+
if (data && typeof data.data === 'string' && /^\d+$/.test(data.data)) {
|
|
100
|
+
const numValue = Number(data.data);
|
|
101
|
+
if (Number.isSafeInteger(numValue)) {
|
|
102
|
+
data.data = numValue;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
81
106
|
return data;
|
|
82
107
|
} catch (error) {
|
|
83
108
|
lastError = error as Error;
|
|
@@ -159,11 +184,12 @@ export class ExtendedWrapper {
|
|
|
159
184
|
|
|
160
185
|
/**
|
|
161
186
|
* Initiate a withdrawal from Extended Exchange
|
|
187
|
+
* Returns data as number | string to preserve precision for large integers
|
|
162
188
|
*/
|
|
163
189
|
async withdraw(
|
|
164
190
|
request: WithdrawRequest
|
|
165
|
-
): Promise<ExtendedApiResponse<number>> {
|
|
166
|
-
return this.makeRequest<number>("/api/v1/withdraw", {
|
|
191
|
+
): Promise<ExtendedApiResponse<number | string>> {
|
|
192
|
+
return this.makeRequest<number | string>("/api/v1/withdraw", {
|
|
167
193
|
method: "POST",
|
|
168
194
|
body: JSON.stringify(request),
|
|
169
195
|
});
|
|
@@ -369,8 +395,9 @@ export class ExtendedWrapper {
|
|
|
369
395
|
|
|
370
396
|
/**
|
|
371
397
|
* Withdraw USDC (convenience method)
|
|
398
|
+
* Returns data as number | string to preserve precision for large integers
|
|
372
399
|
*/
|
|
373
|
-
async withdrawUSDC(amount: string): Promise<ExtendedApiResponse<number>> {
|
|
400
|
+
async withdrawUSDC(amount: string): Promise<ExtendedApiResponse<number | string>> {
|
|
374
401
|
return this.withdraw({ amount, asset: "USDC" });
|
|
375
402
|
}
|
|
376
403
|
|
|
@@ -381,15 +408,19 @@ export class ExtendedWrapper {
|
|
|
381
408
|
*/
|
|
382
409
|
async getFundingRates(
|
|
383
410
|
marketName: string,
|
|
384
|
-
side: string
|
|
411
|
+
side: string,
|
|
412
|
+
startTime: number,
|
|
413
|
+
endTime?: number,
|
|
414
|
+
// in epoch milliseconds
|
|
385
415
|
): Promise<ExtendedApiResponse<FundingRate[]>> {
|
|
416
|
+
const endTimeParam = endTime !== undefined ? `&end_time=${endTime}` : '';
|
|
417
|
+
const startTimeParam = startTime !== undefined ? `&start_time=${startTime}` : '';
|
|
386
418
|
return this.makeRequest<FundingRate[]>(
|
|
387
419
|
`/api/v1/markets/funding-rates?market_name=${encodeURIComponent(
|
|
388
420
|
marketName
|
|
389
|
-
)}&side=${encodeURIComponent(side)}`
|
|
421
|
+
)}&side=${encodeURIComponent(side)}${startTimeParam}${endTimeParam}`
|
|
390
422
|
);
|
|
391
423
|
}
|
|
392
|
-
|
|
393
424
|
}
|
|
394
425
|
|
|
395
426
|
export default ExtendedWrapper;
|
|
@@ -70,21 +70,14 @@ export class EkuboQuoter {
|
|
|
70
70
|
async getDexPrice(baseToken: TokenInfo, quoteToken: TokenInfo, amount: Web3Number) {
|
|
71
71
|
const lstTokenInfo = baseToken;
|
|
72
72
|
const lstUnderlyingTokenInfo = quoteToken;
|
|
73
|
-
console.log("lstTokenInfo", lstTokenInfo);
|
|
74
|
-
console.log("lstUnderlyingTokenInfo", lstUnderlyingTokenInfo);
|
|
75
|
-
console.log("amount", amount);
|
|
76
73
|
const quote = await this.getQuote(
|
|
77
74
|
lstTokenInfo.address.address,
|
|
78
75
|
lstUnderlyingTokenInfo.address.address,
|
|
79
76
|
amount
|
|
80
77
|
);
|
|
81
|
-
console.log("quote", quote);
|
|
82
78
|
// in Underlying
|
|
83
79
|
const outputAmount = Web3Number.fromWei(quote.total_calculated, lstUnderlyingTokenInfo.decimals);
|
|
84
|
-
console.log("outputAmount", outputAmount);
|
|
85
|
-
console.log("amount", amount);
|
|
86
80
|
const price = outputAmount.toNumber() / amount.toNumber();
|
|
87
|
-
console.log("price", price);
|
|
88
81
|
logger.verbose(`${EkuboQuoter.name}:: LST Dex Price: ${price}`);
|
|
89
82
|
return price;
|
|
90
83
|
}
|
|
@@ -105,7 +98,6 @@ export class EkuboQuoter {
|
|
|
105
98
|
// debt collateral
|
|
106
99
|
async getSwapLimitAmount(fromToken: TokenInfo, toToken: TokenInfo, amount: Web3Number, max_slippage: number = 0.002): Promise<Web3Number> {
|
|
107
100
|
const isExactAmountIn = amount.greaterThanOrEqualTo(0);
|
|
108
|
-
console.log("isExactAmountIn", isExactAmountIn);
|
|
109
101
|
logger.verbose(`${EkuboQuoter.name}::getSwapLimitAmount isExactAmountIn: ${isExactAmountIn}, fromToken: ${fromToken.symbol}, toToken: ${toToken.symbol}, amount: ${amount}`);
|
|
110
102
|
const isYieldToken = this.tokenMarketData.isAPYSupported(toToken);
|
|
111
103
|
console.log("isYieldToken", isYieldToken);
|
|
@@ -114,13 +106,10 @@ export class EkuboQuoter {
|
|
|
114
106
|
// wbtc
|
|
115
107
|
const baseToken = isExactAmountIn ? toToken : fromToken; // fromToken -> wbtc,
|
|
116
108
|
const quoteToken = isExactAmountIn ? fromToken : toToken; // toToken -> usdc,
|
|
117
|
-
console.log("baseToken", baseToken);
|
|
118
|
-
console.log("quoteToken", quoteToken);
|
|
119
109
|
// need dex price of from token in toToken
|
|
120
110
|
// from baseToken to underlying token
|
|
121
111
|
// for withdraw, usdc to btc with amount negative
|
|
122
112
|
const dexPrice = await this.getDexPrice(baseToken, quoteToken, amount);
|
|
123
|
-
console.log("dexPrice", dexPrice);
|
|
124
113
|
const trueExchangeRate = isYieldToken ? await this.tokenMarketData.getTruePrice(baseToken) : dexPrice;
|
|
125
114
|
console.log("trueExchangeRate", trueExchangeRate);
|
|
126
115
|
if (isExactAmountIn) {
|
|
@@ -155,7 +144,6 @@ export class EkuboQuoter {
|
|
|
155
144
|
|
|
156
145
|
const isNegativeAmount = BigInt(split.amount_specified) <= 0n;
|
|
157
146
|
const token = isNegativeAmount ? toTokenInfo : fromTokenInfo;
|
|
158
|
-
console.log("token for withdrawal", token, isNegativeAmount);
|
|
159
147
|
return {
|
|
160
148
|
route: split.route.map(_route => ({
|
|
161
149
|
pool_key: {
|
package/src/strategies/index.ts
CHANGED
|
@@ -8,4 +8,5 @@ export * from './universal-strategy';
|
|
|
8
8
|
export * from './universal-lst-muliplier-strategy';
|
|
9
9
|
export * from './vesu-extended-strategy/vesu-extended-strategy';
|
|
10
10
|
export * from './vesu-extended-strategy/utils/config.runtime';
|
|
11
|
-
export * from './vesu-extended-strategy/utils/helper';
|
|
11
|
+
export * from './vesu-extended-strategy/utils/helper';
|
|
12
|
+
export * from './vesu-extended-strategy/types/transaction-metadata';
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
WithdrawParams,
|
|
5
5
|
BaseAdapterConfig,
|
|
6
6
|
} from "./baseAdapter";
|
|
7
|
-
import {
|
|
7
|
+
import { toBigInt } from "./adapter-utils";
|
|
8
8
|
import { Protocols } from "@/interfaces";
|
|
9
9
|
import { MAX_DELAY } from "../vesu-extended-strategy/utils/constants";
|
|
10
10
|
import { SupportedPosition } from "./baseAdapter";
|
|
@@ -13,20 +13,21 @@ import { Web3Number } from "@/dataTypes";
|
|
|
13
13
|
import { PositionInfo } from "./baseAdapter";
|
|
14
14
|
import { ManageCall } from "./baseAdapter";
|
|
15
15
|
import { ContractAddr } from "@/dataTypes";
|
|
16
|
-
import { TokenInfo } from "@/interfaces";
|
|
17
16
|
import { AVNU_EXCHANGE } from "./adapter-utils";
|
|
18
17
|
import { MAX_RETRIES } from "../vesu-extended-strategy/utils/constants";
|
|
19
18
|
import { Quote } from "@avnu/avnu-sdk";
|
|
20
19
|
import { hash, uint256 } from "starknet";
|
|
21
20
|
import { AvnuWrapper } from "@/modules/avnu";
|
|
22
21
|
import axios from "axios";
|
|
23
|
-
import {
|
|
22
|
+
import {SIMPLE_SANITIZER } from "./adapter-utils";
|
|
24
23
|
import { returnFormattedAmount } from "../vesu-extended-strategy/utils/helper";
|
|
25
24
|
import { logger } from "@/utils";
|
|
26
25
|
export interface AvnuAdapterConfig extends BaseAdapterConfig {
|
|
27
26
|
baseUrl: string;
|
|
28
27
|
avnuContract: ContractAddr; //0x04270219d365d6b017231b52e92b3fb5d7c8378b05e9abc97724537a80e93b0f
|
|
29
28
|
slippage: number;
|
|
29
|
+
minimumExtendedPriceDifferenceForSwapOpen: number;
|
|
30
|
+
maximumExtendedPriceDifferenceForSwapClosing: number;
|
|
30
31
|
}
|
|
31
32
|
|
|
32
33
|
export class AvnuAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
|
|
@@ -48,7 +49,7 @@ export class AvnuAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
|
|
|
48
49
|
protected async getPosition(
|
|
49
50
|
supportedPosition: SupportedPosition
|
|
50
51
|
): Promise<PositionAmount> {
|
|
51
|
-
return Promise.resolve({ amount: new Web3Number(0, 0), remarks: "" });
|
|
52
|
+
return Promise.resolve({ amount: new Web3Number(0, 0), remarks: "Avnu Positions" });
|
|
52
53
|
}
|
|
53
54
|
|
|
54
55
|
async maxDeposit(amount?: Web3Number): Promise<PositionInfo> {
|
|
@@ -156,8 +157,8 @@ export class AvnuAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
|
|
|
156
157
|
|
|
157
158
|
async getDepositCall(params: DepositParams): Promise<ManageCall[]> {
|
|
158
159
|
try {
|
|
159
|
-
const fromToken = this.config.supportedPositions[0].asset;
|
|
160
|
-
const toToken = this.config.supportedPositions[1].asset;
|
|
160
|
+
const fromToken = this.config.supportedPositions[0].asset; //usdc
|
|
161
|
+
const toToken = this.config.supportedPositions[1].asset; //wbtc
|
|
161
162
|
const vaultAllocator = ContractAddr.from(
|
|
162
163
|
this.config.vaultAllocator.address
|
|
163
164
|
);
|
|
@@ -169,15 +170,18 @@ export class AvnuAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
|
|
|
169
170
|
toToken.decimals,
|
|
170
171
|
true
|
|
171
172
|
)
|
|
173
|
+
//console.log(`${AvnuAdapter.name}::getDepositCall quote: ${JSON.stringify(quote)}`);
|
|
172
174
|
if (!quote) {
|
|
173
175
|
logger.error("error getting quote from avnu");
|
|
174
176
|
return [];
|
|
175
177
|
}
|
|
178
|
+
|
|
176
179
|
const getCalldata = await this.avnuWrapper.getSwapCallData(
|
|
177
180
|
quote,
|
|
178
181
|
vaultAllocator.address
|
|
179
182
|
);
|
|
180
183
|
const swapCallData = getCalldata[0];
|
|
184
|
+
|
|
181
185
|
// const approveCallData = getCalldata[0];
|
|
182
186
|
const amount = uint256.bnToUint256(quote.sellAmountInUsd*10**7)
|
|
183
187
|
return [
|
|
@@ -300,11 +304,11 @@ export class AvnuAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
|
|
|
300
304
|
toTokenDecimals: number,
|
|
301
305
|
usdcToBtc: boolean,
|
|
302
306
|
maxIterations: number = 5,
|
|
303
|
-
tolerance: number =
|
|
307
|
+
tolerance: number = 5000
|
|
304
308
|
): Promise<Quote | null>{
|
|
305
309
|
try {
|
|
306
|
-
const fromToken = this.config.supportedPositions[0].asset;
|
|
307
|
-
const toToken = this.config.supportedPositions[1].asset;
|
|
310
|
+
const fromToken = this.config.supportedPositions[0].asset; //usdc
|
|
311
|
+
const toToken = this.config.supportedPositions[1].asset; //wbtc
|
|
308
312
|
if(!usdcToBtc) {
|
|
309
313
|
const sellAmount = returnFormattedAmount(amount, toTokenDecimals);
|
|
310
314
|
const params: Record<string, any> = {
|
|
@@ -327,7 +331,9 @@ export class AvnuAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
|
|
|
327
331
|
return null;
|
|
328
332
|
}
|
|
329
333
|
const estimatedUsdcAmount = Math.floor(amount * btcPrice);
|
|
334
|
+
logger.info(`${AvnuAdapter.name}::getQuotesAvnu estimatedUsdcAmount: ${estimatedUsdcAmount}`);
|
|
330
335
|
const targetBtcBig = BigInt(returnFormattedAmount(amount, toTokenDecimals));
|
|
336
|
+
logger.info(`${AvnuAdapter.name}::getQuotesAvnu targetBtcBig: ${targetBtcBig}`);
|
|
331
337
|
let low = BigInt(
|
|
332
338
|
Math.floor(
|
|
333
339
|
(estimatedUsdcAmount * 10 ** fromToken.decimals) * 0.9
|
|
@@ -381,6 +387,8 @@ export class AvnuAdapter extends BaseAdapter<DepositParams, WithdrawParams> {
|
|
|
381
387
|
return null;
|
|
382
388
|
}
|
|
383
389
|
const dataObject: Quote = finalQuote.data[0];
|
|
390
|
+
const wbtcAmountOut = parseInt(dataObject.buyAmount.toString(), 16);
|
|
391
|
+
logger.info(`${AvnuAdapter.name}::getQuotesAvnu finalAmountOfWbtcOut : ${wbtcAmountOut} ${dataObject.buyAmount} ${dataObject.sellAmount.toString()} ${dataObject.sellAmount.toString()}`);
|
|
384
392
|
return dataObject;
|
|
385
393
|
} catch (err) {
|
|
386
394
|
logger.error(`No quotes available for this swap: ${err}`);
|