@strkfarm/sdk 2.0.0-dev.26 → 2.0.0-dev.28
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 +190 -36
- package/dist/cli.mjs +188 -34
- package/dist/index.browser.global.js +79130 -49354
- package/dist/index.browser.mjs +18039 -11431
- package/dist/index.d.ts +2869 -898
- package/dist/index.js +19036 -12207
- package/dist/index.mjs +18942 -12158
- package/package.json +1 -1
- package/src/data/avnu.abi.json +840 -0
- package/src/data/ekubo-price-fethcer.abi.json +265 -0
- package/src/dataTypes/_bignumber.ts +13 -4
- package/src/dataTypes/index.ts +3 -2
- package/src/dataTypes/mynumber.ts +141 -0
- package/src/global.ts +76 -41
- package/src/index.browser.ts +2 -1
- package/src/interfaces/common.tsx +167 -2
- package/src/modules/ExtendedWrapperSDk/types.ts +26 -4
- package/src/modules/ExtendedWrapperSDk/wrapper.ts +110 -67
- package/src/modules/apollo-client-config.ts +28 -0
- package/src/modules/avnu.ts +4 -4
- package/src/modules/ekubo-pricer.ts +79 -0
- package/src/modules/ekubo-quoter.ts +46 -30
- package/src/modules/erc20.ts +17 -0
- package/src/modules/harvests.ts +43 -29
- package/src/modules/pragma.ts +23 -8
- package/src/modules/pricer-from-api.ts +156 -15
- package/src/modules/pricer-lst.ts +1 -1
- package/src/modules/pricer.ts +40 -4
- package/src/modules/pricerBase.ts +2 -1
- package/src/node/deployer.ts +36 -1
- package/src/node/pricer-redis.ts +2 -1
- package/src/strategies/base-strategy.ts +78 -10
- package/src/strategies/ekubo-cl-vault.tsx +906 -347
- package/src/strategies/factory.ts +159 -0
- package/src/strategies/index.ts +6 -1
- package/src/strategies/registry.ts +239 -0
- package/src/strategies/sensei.ts +335 -7
- package/src/strategies/svk-strategy.ts +97 -27
- package/src/strategies/types.ts +4 -0
- package/src/strategies/universal-adapters/adapter-utils.ts +2 -1
- package/src/strategies/universal-adapters/avnu-adapter.ts +177 -268
- package/src/strategies/universal-adapters/baseAdapter.ts +263 -251
- package/src/strategies/universal-adapters/common-adapter.ts +206 -203
- package/src/strategies/universal-adapters/extended-adapter.ts +155 -336
- package/src/strategies/universal-adapters/index.ts +9 -8
- package/src/strategies/universal-adapters/token-transfer-adapter.ts +200 -0
- package/src/strategies/universal-adapters/usdc<>usdce-adapter.ts +200 -0
- package/src/strategies/universal-adapters/vesu-adapter.ts +110 -75
- package/src/strategies/universal-adapters/vesu-modify-position-adapter.ts +476 -0
- package/src/strategies/universal-adapters/vesu-multiply-adapter.ts +762 -844
- package/src/strategies/universal-adapters/vesu-position-common.ts +251 -0
- package/src/strategies/universal-adapters/vesu-supply-only-adapter.ts +18 -3
- package/src/strategies/universal-lst-muliplier-strategy.tsx +396 -204
- package/src/strategies/universal-strategy.tsx +1426 -1178
- package/src/strategies/vesu-extended-strategy/services/executionService.ts +2251 -0
- package/src/strategies/vesu-extended-strategy/services/extended-vesu-state-manager.ts +2941 -0
- package/src/strategies/vesu-extended-strategy/services/operationService.ts +12 -1
- package/src/strategies/vesu-extended-strategy/types/transaction-metadata.ts +52 -0
- package/src/strategies/vesu-extended-strategy/utils/config.runtime.ts +1 -0
- package/src/strategies/vesu-extended-strategy/utils/constants.ts +3 -1
- package/src/strategies/vesu-extended-strategy/utils/helper.ts +158 -124
- package/src/strategies/vesu-extended-strategy/vesu-extended-strategy.tsx +377 -1781
- package/src/strategies/vesu-rebalance.tsx +255 -152
- package/src/utils/health-factor-math.ts +4 -1
- package/src/utils/index.ts +2 -1
- package/src/utils/logger.browser.ts +22 -4
- package/src/utils/logger.node.ts +259 -24
- package/src/utils/starknet-call-parser.ts +1036 -0
- package/src/utils/strategy-utils.ts +61 -0
- package/src/strategies/universal-adapters/unused-balance-adapter.ts +0 -109
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"type": "impl",
|
|
4
|
+
"name": "PriceFetcherImpl",
|
|
5
|
+
"interface_name": "ekubo_oracle_extension::price_fetcher::IPriceFetcher"
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"type": "struct",
|
|
9
|
+
"name": "core::array::Span::<core::starknet::contract_address::ContractAddress>",
|
|
10
|
+
"members": [
|
|
11
|
+
{
|
|
12
|
+
"name": "snapshot",
|
|
13
|
+
"type": "@core::array::Array::<core::starknet::contract_address::ContractAddress>"
|
|
14
|
+
}
|
|
15
|
+
]
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
"type": "struct",
|
|
19
|
+
"name": "core::integer::u256",
|
|
20
|
+
"members": [
|
|
21
|
+
{
|
|
22
|
+
"name": "low",
|
|
23
|
+
"type": "core::integer::u128"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"name": "high",
|
|
27
|
+
"type": "core::integer::u128"
|
|
28
|
+
}
|
|
29
|
+
]
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"type": "enum",
|
|
33
|
+
"name": "ekubo_oracle_extension::price_fetcher::PriceResult",
|
|
34
|
+
"variants": [
|
|
35
|
+
{
|
|
36
|
+
"name": "NotInitialized",
|
|
37
|
+
"type": "()"
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"name": "InsufficientLiquidity",
|
|
41
|
+
"type": "()"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"name": "PeriodTooLong",
|
|
45
|
+
"type": "()"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"name": "Price",
|
|
49
|
+
"type": "core::integer::u256"
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"type": "struct",
|
|
55
|
+
"name": "core::array::Span::<ekubo_oracle_extension::price_fetcher::PriceResult>",
|
|
56
|
+
"members": [
|
|
57
|
+
{
|
|
58
|
+
"name": "snapshot",
|
|
59
|
+
"type": "@core::array::Array::<ekubo_oracle_extension::price_fetcher::PriceResult>"
|
|
60
|
+
}
|
|
61
|
+
]
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"type": "struct",
|
|
65
|
+
"name": "ekubo_oracle_extension::price_fetcher::CandlestickPoint",
|
|
66
|
+
"members": [
|
|
67
|
+
{
|
|
68
|
+
"name": "time",
|
|
69
|
+
"type": "core::integer::u64"
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
"name": "low",
|
|
73
|
+
"type": "core::integer::u256"
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"name": "high",
|
|
77
|
+
"type": "core::integer::u256"
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"name": "open",
|
|
81
|
+
"type": "core::integer::u256"
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"name": "close",
|
|
85
|
+
"type": "core::integer::u256"
|
|
86
|
+
}
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"type": "struct",
|
|
91
|
+
"name": "core::array::Span::<ekubo_oracle_extension::price_fetcher::CandlestickPoint>",
|
|
92
|
+
"members": [
|
|
93
|
+
{
|
|
94
|
+
"name": "snapshot",
|
|
95
|
+
"type": "@core::array::Array::<ekubo_oracle_extension::price_fetcher::CandlestickPoint>"
|
|
96
|
+
}
|
|
97
|
+
]
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"type": "interface",
|
|
101
|
+
"name": "ekubo_oracle_extension::price_fetcher::IPriceFetcher",
|
|
102
|
+
"items": [
|
|
103
|
+
{
|
|
104
|
+
"type": "function",
|
|
105
|
+
"name": "get_prices",
|
|
106
|
+
"inputs": [
|
|
107
|
+
{
|
|
108
|
+
"name": "quote_token",
|
|
109
|
+
"type": "core::starknet::contract_address::ContractAddress"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"name": "base_tokens",
|
|
113
|
+
"type": "core::array::Span::<core::starknet::contract_address::ContractAddress>"
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
"name": "period",
|
|
117
|
+
"type": "core::integer::u64"
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
"name": "min_token",
|
|
121
|
+
"type": "core::integer::u128"
|
|
122
|
+
}
|
|
123
|
+
],
|
|
124
|
+
"outputs": [
|
|
125
|
+
{
|
|
126
|
+
"type": "core::array::Span::<ekubo_oracle_extension::price_fetcher::PriceResult>"
|
|
127
|
+
}
|
|
128
|
+
],
|
|
129
|
+
"state_mutability": "view"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"type": "function",
|
|
133
|
+
"name": "get_prices_in_oracle_tokens",
|
|
134
|
+
"inputs": [
|
|
135
|
+
{
|
|
136
|
+
"name": "base_tokens",
|
|
137
|
+
"type": "core::array::Span::<core::starknet::contract_address::ContractAddress>"
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"name": "period",
|
|
141
|
+
"type": "core::integer::u64"
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
"name": "min_token",
|
|
145
|
+
"type": "core::integer::u128"
|
|
146
|
+
}
|
|
147
|
+
],
|
|
148
|
+
"outputs": [
|
|
149
|
+
{
|
|
150
|
+
"type": "(core::starknet::contract_address::ContractAddress, core::array::Span::<ekubo_oracle_extension::price_fetcher::PriceResult>)"
|
|
151
|
+
}
|
|
152
|
+
],
|
|
153
|
+
"state_mutability": "view"
|
|
154
|
+
},
|
|
155
|
+
{
|
|
156
|
+
"type": "function",
|
|
157
|
+
"name": "get_candlestick_chart_data",
|
|
158
|
+
"inputs": [
|
|
159
|
+
{
|
|
160
|
+
"name": "base_token",
|
|
161
|
+
"type": "core::starknet::contract_address::ContractAddress"
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"name": "quote_token",
|
|
165
|
+
"type": "core::starknet::contract_address::ContractAddress"
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"name": "interval_seconds",
|
|
169
|
+
"type": "core::integer::u32"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"name": "num_intervals",
|
|
173
|
+
"type": "core::integer::u32"
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"name": "max_resolution",
|
|
177
|
+
"type": "core::integer::u8"
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
"name": "end_time",
|
|
181
|
+
"type": "core::integer::u64"
|
|
182
|
+
}
|
|
183
|
+
],
|
|
184
|
+
"outputs": [
|
|
185
|
+
{
|
|
186
|
+
"type": "core::array::Span::<ekubo_oracle_extension::price_fetcher::CandlestickPoint>"
|
|
187
|
+
}
|
|
188
|
+
],
|
|
189
|
+
"state_mutability": "view"
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"type": "function",
|
|
193
|
+
"name": "get_candlestick_chart_data_now",
|
|
194
|
+
"inputs": [
|
|
195
|
+
{
|
|
196
|
+
"name": "base_token",
|
|
197
|
+
"type": "core::starknet::contract_address::ContractAddress"
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"name": "quote_token",
|
|
201
|
+
"type": "core::starknet::contract_address::ContractAddress"
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
"name": "interval_seconds",
|
|
205
|
+
"type": "core::integer::u32"
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
"name": "num_intervals",
|
|
209
|
+
"type": "core::integer::u32"
|
|
210
|
+
},
|
|
211
|
+
{
|
|
212
|
+
"name": "max_resolution",
|
|
213
|
+
"type": "core::integer::u8"
|
|
214
|
+
}
|
|
215
|
+
],
|
|
216
|
+
"outputs": [
|
|
217
|
+
{
|
|
218
|
+
"type": "(core::integer::u64, core::array::Span::<ekubo_oracle_extension::price_fetcher::CandlestickPoint>)"
|
|
219
|
+
}
|
|
220
|
+
],
|
|
221
|
+
"state_mutability": "view"
|
|
222
|
+
}
|
|
223
|
+
]
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"type": "struct",
|
|
227
|
+
"name": "ekubo::interfaces::core::ICoreDispatcher",
|
|
228
|
+
"members": [
|
|
229
|
+
{
|
|
230
|
+
"name": "contract_address",
|
|
231
|
+
"type": "core::starknet::contract_address::ContractAddress"
|
|
232
|
+
}
|
|
233
|
+
]
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
"type": "struct",
|
|
237
|
+
"name": "ekubo_oracle_extension::oracle::IOracleDispatcher",
|
|
238
|
+
"members": [
|
|
239
|
+
{
|
|
240
|
+
"name": "contract_address",
|
|
241
|
+
"type": "core::starknet::contract_address::ContractAddress"
|
|
242
|
+
}
|
|
243
|
+
]
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
"type": "constructor",
|
|
247
|
+
"name": "constructor",
|
|
248
|
+
"inputs": [
|
|
249
|
+
{
|
|
250
|
+
"name": "core",
|
|
251
|
+
"type": "ekubo::interfaces::core::ICoreDispatcher"
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
"name": "oracle",
|
|
255
|
+
"type": "ekubo_oracle_extension::oracle::IOracleDispatcher"
|
|
256
|
+
}
|
|
257
|
+
]
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
"type": "event",
|
|
261
|
+
"name": "ekubo_oracle_extension::price_fetcher::PriceFetcher::Event",
|
|
262
|
+
"kind": "enum",
|
|
263
|
+
"variants": []
|
|
264
|
+
}
|
|
265
|
+
]
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { logger } from "@/utils/logger";
|
|
2
2
|
import BigNumber from "bignumber.js";
|
|
3
|
+
import { uint256 } from "starknet";
|
|
3
4
|
|
|
4
5
|
export class _Web3Number<T extends _Web3Number<T>> extends BigNumber {
|
|
5
6
|
decimals: number;
|
|
@@ -26,11 +27,11 @@ export class _Web3Number<T extends _Web3Number<T>> extends BigNumber {
|
|
|
26
27
|
plus(value: string | number | T): T {
|
|
27
28
|
// Convert to raw number/string to avoid calling overridden methods
|
|
28
29
|
const rawValue = this.getStandardString(value);
|
|
29
|
-
|
|
30
|
+
|
|
30
31
|
// Create a fresh BigNumber instance to do the math
|
|
31
32
|
const thisBN = new BigNumber(this.toString());
|
|
32
33
|
const result = thisBN.plus(rawValue);
|
|
33
|
-
|
|
34
|
+
|
|
34
35
|
return this.construct(result.toString(), this.decimals);
|
|
35
36
|
// const _value = this.getStandardString(value);
|
|
36
37
|
// return this.construct(super.plus(_value).toString(), this.decimals);
|
|
@@ -38,11 +39,11 @@ export class _Web3Number<T extends _Web3Number<T>> extends BigNumber {
|
|
|
38
39
|
|
|
39
40
|
minus(n: number | string | T, base?: number): T {
|
|
40
41
|
const rawValue = this.getStandardString(n);
|
|
41
|
-
|
|
42
|
+
|
|
42
43
|
// Create a fresh BigNumber instance to do the math
|
|
43
44
|
const thisBN = new BigNumber(this.toString());
|
|
44
45
|
const result = thisBN.minus(rawValue, base);
|
|
45
|
-
|
|
46
|
+
|
|
46
47
|
return this.construct(result.toString(), this.decimals);
|
|
47
48
|
// const _value = this.getStandardString(n);
|
|
48
49
|
// return this.construct(super.minus(_value, base).toString(), this.decimals);
|
|
@@ -100,6 +101,10 @@ export class _Web3Number<T extends _Web3Number<T>> extends BigNumber {
|
|
|
100
101
|
return this.construct(Math.abs(this.toNumber()).toFixed(12), this.decimals);
|
|
101
102
|
}
|
|
102
103
|
|
|
104
|
+
toFixedRoundDown(dp?: number): string {
|
|
105
|
+
return this.toFixed(dp, BigNumber.ROUND_DOWN);
|
|
106
|
+
}
|
|
107
|
+
|
|
103
108
|
toI129(): { mag: bigint, sign: 0 | 1 } {
|
|
104
109
|
const sign = this.isNegative() ? 1 : 0;
|
|
105
110
|
return {
|
|
@@ -107,6 +112,10 @@ export class _Web3Number<T extends _Web3Number<T>> extends BigNumber {
|
|
|
107
112
|
sign: sign,
|
|
108
113
|
}
|
|
109
114
|
}
|
|
115
|
+
|
|
116
|
+
toUint256() {
|
|
117
|
+
return uint256.bnToUint256(this.toWei());
|
|
118
|
+
}
|
|
110
119
|
}
|
|
111
120
|
|
|
112
121
|
BigNumber.config({ DECIMAL_PLACES: 18, ROUNDING_MODE: BigNumber.ROUND_DOWN });
|
package/src/dataTypes/index.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
1
|
+
export * from "@/dataTypes/bignumber";
|
|
2
|
+
export * from "./address";
|
|
3
|
+
export * from "./mynumber";
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import BigNumber from "bignumber.js";
|
|
2
|
+
import { ethers } from "ethers";
|
|
3
|
+
|
|
4
|
+
const customInspectSymbol = Symbol.for("nodejs.util.inspect.custom");
|
|
5
|
+
|
|
6
|
+
BigNumber.config({
|
|
7
|
+
DECIMAL_PLACES: 18
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
export class MyNumber {
|
|
11
|
+
bigNumber: BigNumber;
|
|
12
|
+
decimals: number;
|
|
13
|
+
|
|
14
|
+
constructor(bigNumber: string, decimals: number) {
|
|
15
|
+
this.bigNumber = new BigNumber(bigNumber);
|
|
16
|
+
this.decimals = decimals;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
static fromEther(num: string, decimals: number) {
|
|
20
|
+
try {
|
|
21
|
+
return new MyNumber(
|
|
22
|
+
Number(
|
|
23
|
+
ethers.parseUnits(Number(num).toFixed(10), decimals)
|
|
24
|
+
).toFixed(6),
|
|
25
|
+
decimals
|
|
26
|
+
);
|
|
27
|
+
} catch (e) {
|
|
28
|
+
console.error("fromEther", e, num, decimals);
|
|
29
|
+
throw e;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
static fromZero() {
|
|
34
|
+
return new MyNumber("0", 0);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
toString() {
|
|
38
|
+
return this.bigNumber.toFixed();
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
toEtherStr() {
|
|
42
|
+
return ethers.formatUnits(this.bigNumber.toFixed(), this.decimals);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
toFixedStr(decimals: number) {
|
|
46
|
+
return Number(this.toEtherStr()).toFixed(decimals);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
toEtherToFixedDecimals(decimals: number) {
|
|
50
|
+
// rounding down
|
|
51
|
+
if (this.bigNumber.isNaN()) {
|
|
52
|
+
return "NaN";
|
|
53
|
+
}
|
|
54
|
+
return (
|
|
55
|
+
Math.floor(parseFloat(this.toEtherStr()) * 10 ** decimals) /
|
|
56
|
+
10 ** decimals
|
|
57
|
+
).toFixed(decimals);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
isZero() {
|
|
61
|
+
return this.bigNumber.eq("0");
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
*
|
|
66
|
+
* @param amountEther in token terms without decimal e.g. 1 for 1 STRK
|
|
67
|
+
* @param command BigNumber compare funds. e.g. gte, gt, lt
|
|
68
|
+
* @returns
|
|
69
|
+
* @dev Add more commands as needed
|
|
70
|
+
*/
|
|
71
|
+
compare(amountEther: string, command: "gte" | "gt" | "lt") {
|
|
72
|
+
const fullNum = new BigNumber(
|
|
73
|
+
ethers.parseUnits(amountEther, this.decimals).toString()
|
|
74
|
+
);
|
|
75
|
+
return this.bigNumber[command](fullNum);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
operate(command: "div" | "plus" | "mul", value: string | number) {
|
|
79
|
+
const bn = new BigNumber(Number(value).toFixed(6));
|
|
80
|
+
return new MyNumber(
|
|
81
|
+
this.bigNumber[command](bn).toFixed(0),
|
|
82
|
+
this.decimals
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
subtract(value: MyNumber) {
|
|
87
|
+
const bn = this.bigNumber.minus(value.bigNumber);
|
|
88
|
+
return new MyNumber(bn.toString(), this.decimals);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
static min(a: MyNumber, b: MyNumber) {
|
|
92
|
+
if (a.decimals !== b.decimals) {
|
|
93
|
+
const diff = Math.abs(a.decimals - b.decimals);
|
|
94
|
+
if (a.decimals > b.decimals) {
|
|
95
|
+
b = new MyNumber(
|
|
96
|
+
b.bigNumber.times(10 ** diff).toString(),
|
|
97
|
+
a.decimals
|
|
98
|
+
);
|
|
99
|
+
} else {
|
|
100
|
+
a = new MyNumber(
|
|
101
|
+
a.bigNumber.times(10 ** diff).toString(),
|
|
102
|
+
b.decimals
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const bn = BigNumber.min(a.bigNumber, b.bigNumber);
|
|
107
|
+
return new MyNumber(
|
|
108
|
+
bn.toString(),
|
|
109
|
+
a.decimals > b.decimals ? a.decimals : b.decimals
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
static max(a: MyNumber, b: MyNumber) {
|
|
114
|
+
if (a.decimals !== b.decimals) {
|
|
115
|
+
const diff = Math.abs(a.decimals - b.decimals);
|
|
116
|
+
if (a.decimals > b.decimals) {
|
|
117
|
+
b = new MyNumber(
|
|
118
|
+
b.bigNumber.times(10 ** diff).toString(),
|
|
119
|
+
a.decimals
|
|
120
|
+
);
|
|
121
|
+
} else {
|
|
122
|
+
a = new MyNumber(
|
|
123
|
+
a.bigNumber.times(10 ** diff).toString(),
|
|
124
|
+
b.decimals
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
const bn = BigNumber.max(a.bigNumber, b.bigNumber);
|
|
129
|
+
return new MyNumber(
|
|
130
|
+
bn.toString(),
|
|
131
|
+
a.decimals > b.decimals ? a.decimals : b.decimals
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
[customInspectSymbol](depth: any, inspectOptions: any, inspect: any) {
|
|
136
|
+
return JSON.stringify({
|
|
137
|
+
raw: this.toString(),
|
|
138
|
+
decimals: this.decimals
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
}
|
package/src/global.ts
CHANGED
|
@@ -48,14 +48,21 @@ const defaultTokens: TokenInfo[] = [
|
|
|
48
48
|
coingeckId: undefined,
|
|
49
49
|
priceCheckAmount: 0.1,
|
|
50
50
|
displayDecimals: 6,
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
51
|
+
}, {
|
|
52
|
+
name: 'USDC.e',
|
|
53
|
+
symbol: 'USDC.e',
|
|
54
|
+
logo: 'https://assets.troves.fi/integrations/tokens/usdc.svg',
|
|
55
|
+
address: ContractAddr.from('0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8'),
|
|
56
|
+
decimals: 6,
|
|
57
|
+
coingeckId: undefined,
|
|
58
|
+
displayDecimals: 2,
|
|
59
|
+
priceCheckAmount: 1000,
|
|
60
|
+
priceProxySymbol: 'USDC'
|
|
61
|
+
}, {
|
|
62
|
+
name: 'USDC',
|
|
63
|
+
symbol: 'USDC',
|
|
64
|
+
logo: 'https://assets.troves.fi/integrations/tokens/usdc.svg',
|
|
65
|
+
address: ContractAddr.from('0x033068F6539f8e6e6b131e6B2B814e6c34A5224bC66947c47DaB9dFeE93b35fb'),
|
|
59
66
|
decimals: 6,
|
|
60
67
|
coingeckId: undefined,
|
|
61
68
|
displayDecimals: 2,
|
|
@@ -133,6 +140,7 @@ const defaultTokens: TokenInfo[] = [
|
|
|
133
140
|
decimals: 8,
|
|
134
141
|
coingeckId: undefined,
|
|
135
142
|
displayDecimals: 6,
|
|
143
|
+
priceProxySymbol: 'WBTC',
|
|
136
144
|
priceCheckAmount: 0.001, // 112000 * 0.0001 = $110.2
|
|
137
145
|
},
|
|
138
146
|
{
|
|
@@ -160,14 +168,12 @@ const defaultTokens: TokenInfo[] = [
|
|
|
160
168
|
coingeckId: undefined,
|
|
161
169
|
displayDecimals: 6,
|
|
162
170
|
priceCheckAmount: 0.001, // 112000 * 0.0001 = $110.2
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
name:
|
|
166
|
-
symbol:
|
|
167
|
-
logo:
|
|
168
|
-
address: ContractAddr.from(
|
|
169
|
-
"0x07dd3c80de9fcc5545f0cb83678826819c79619ed7992cc06ff81fc67cd2efe0"
|
|
170
|
-
),
|
|
171
|
+
priceProxySymbol: 'WBTC',
|
|
172
|
+
}, {
|
|
173
|
+
name: 'xLBTC',
|
|
174
|
+
symbol: 'xLBTC',
|
|
175
|
+
logo: 'https://assets.strkfarm.com/integrations/tokens/xlbtc.svg',
|
|
176
|
+
address: ContractAddr.from('0x07dd3c80de9fcc5545f0cb83678826819c79619ed7992cc06ff81fc67cd2efe0'),
|
|
171
177
|
decimals: 8,
|
|
172
178
|
coingeckId: undefined,
|
|
173
179
|
displayDecimals: 6,
|
|
@@ -197,20 +203,34 @@ const defaultTokens: TokenInfo[] = [
|
|
|
197
203
|
coingeckId: undefined,
|
|
198
204
|
displayDecimals: 2,
|
|
199
205
|
priceCheckAmount: 100,
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
206
|
+
}, {
|
|
207
|
+
name: "fyWBTC",
|
|
208
|
+
symbol: "fyWBTC",
|
|
209
|
+
logo: 'https://assets.strkfarm.com/integrations/tokens/wbtc.svg',
|
|
210
|
+
address: ContractAddr.from('0x04dd39de0a588f5e1c7a8377e1bef2c49caaee49a11433429d2c48f587b3a492'),
|
|
211
|
+
decimals: 8,
|
|
212
|
+
coingeckId: undefined,
|
|
213
|
+
displayDecimals: 6,
|
|
214
|
+
priceCheckAmount: 0.001, // 112000 * 0.0001 = $110.2
|
|
215
|
+
}, {
|
|
216
|
+
name: "fyETH",
|
|
217
|
+
symbol: "fyETH",
|
|
218
|
+
logo: 'https://assets.strkfarm.com/integrations/tokens/eth.svg',
|
|
219
|
+
address: ContractAddr.from('0x050707bC3b8730022F10530C2c6f6b9467644129C50C2868Ad0036c5e4E9e616'),
|
|
220
|
+
decimals: 18,
|
|
221
|
+
coingeckId: undefined,
|
|
222
|
+
displayDecimals: 4,
|
|
223
|
+
priceCheckAmount: 0.1,
|
|
224
|
+
}, {
|
|
225
|
+
name: "fyUSDC",
|
|
226
|
+
symbol: "fyUSDC",
|
|
227
|
+
logo: 'https://assets.strkfarm.com/integrations/tokens/usdc.svg',
|
|
228
|
+
address: ContractAddr.from('0x07fdcec0cef01294c9c3d52415215949805c77bae8003702a7928fd6d2c36bc1'),
|
|
208
229
|
decimals: 6,
|
|
209
230
|
coingeckId: undefined,
|
|
210
231
|
displayDecimals: 2,
|
|
211
232
|
priceCheckAmount: 100,
|
|
212
|
-
|
|
213
|
-
];
|
|
233
|
+
}]
|
|
214
234
|
const tokens: TokenInfo[] = defaultTokens;
|
|
215
235
|
|
|
216
236
|
/** Contains globally useful functions.
|
|
@@ -289,34 +309,49 @@ export class Global {
|
|
|
289
309
|
}
|
|
290
310
|
}
|
|
291
311
|
|
|
292
|
-
|
|
312
|
+
|
|
313
|
+
static async getTokenInfoFromName(tokenName: string) {
|
|
293
314
|
// if tokens are not loaded, load them
|
|
294
315
|
if (tokens.length == defaultTokens.length) {
|
|
295
|
-
|
|
316
|
+
await Global.getTokens();
|
|
296
317
|
}
|
|
297
318
|
|
|
319
|
+
const token = tokens.find(
|
|
320
|
+
(token) => token.name.toLowerCase() === tokenName.toLowerCase()
|
|
321
|
+
);
|
|
322
|
+
if (!token) {
|
|
323
|
+
throw new FatalError(`Token not found: ${tokenName}`);
|
|
324
|
+
}
|
|
325
|
+
return token;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
static async getTokenInfoFromAddr(addr: ContractAddr) {
|
|
329
|
+
// if tokens are not loaded, load them
|
|
330
|
+
if (tokens.length == defaultTokens.length) {
|
|
331
|
+
await Global.getTokens();
|
|
332
|
+
}
|
|
298
333
|
const token = tokens.find((token) => addr.eq(token.address));
|
|
299
334
|
if (!token) {
|
|
300
|
-
|
|
335
|
+
throw new FatalError(`Token not found: ${addr.address}`);
|
|
301
336
|
}
|
|
302
337
|
return token;
|
|
303
338
|
}
|
|
304
339
|
|
|
305
340
|
static setGlobalCache(key: string, data: any, ttl: number = 60000) {
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
341
|
+
Global.cache[key] = {
|
|
342
|
+
value: data,
|
|
343
|
+
ttl,
|
|
344
|
+
timestamp: Date.now()
|
|
345
|
+
};
|
|
311
346
|
}
|
|
312
347
|
|
|
313
348
|
static getGlobalCache<T>(key: string): T | null {
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
349
|
+
const cached = Global.cache[key];
|
|
350
|
+
if (!cached) return null;
|
|
351
|
+
if (Date.now() - cached.timestamp > cached.ttl) {
|
|
352
|
+
delete Global.cache[key];
|
|
353
|
+
return null;
|
|
354
|
+
}
|
|
355
|
+
return cached.value;
|
|
321
356
|
}
|
|
322
357
|
}
|
package/src/index.browser.ts
CHANGED