@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.
Files changed (70) hide show
  1. package/dist/cli.js +190 -36
  2. package/dist/cli.mjs +188 -34
  3. package/dist/index.browser.global.js +79130 -49354
  4. package/dist/index.browser.mjs +18039 -11431
  5. package/dist/index.d.ts +2869 -898
  6. package/dist/index.js +19036 -12207
  7. package/dist/index.mjs +18942 -12158
  8. package/package.json +1 -1
  9. package/src/data/avnu.abi.json +840 -0
  10. package/src/data/ekubo-price-fethcer.abi.json +265 -0
  11. package/src/dataTypes/_bignumber.ts +13 -4
  12. package/src/dataTypes/index.ts +3 -2
  13. package/src/dataTypes/mynumber.ts +141 -0
  14. package/src/global.ts +76 -41
  15. package/src/index.browser.ts +2 -1
  16. package/src/interfaces/common.tsx +167 -2
  17. package/src/modules/ExtendedWrapperSDk/types.ts +26 -4
  18. package/src/modules/ExtendedWrapperSDk/wrapper.ts +110 -67
  19. package/src/modules/apollo-client-config.ts +28 -0
  20. package/src/modules/avnu.ts +4 -4
  21. package/src/modules/ekubo-pricer.ts +79 -0
  22. package/src/modules/ekubo-quoter.ts +46 -30
  23. package/src/modules/erc20.ts +17 -0
  24. package/src/modules/harvests.ts +43 -29
  25. package/src/modules/pragma.ts +23 -8
  26. package/src/modules/pricer-from-api.ts +156 -15
  27. package/src/modules/pricer-lst.ts +1 -1
  28. package/src/modules/pricer.ts +40 -4
  29. package/src/modules/pricerBase.ts +2 -1
  30. package/src/node/deployer.ts +36 -1
  31. package/src/node/pricer-redis.ts +2 -1
  32. package/src/strategies/base-strategy.ts +78 -10
  33. package/src/strategies/ekubo-cl-vault.tsx +906 -347
  34. package/src/strategies/factory.ts +159 -0
  35. package/src/strategies/index.ts +6 -1
  36. package/src/strategies/registry.ts +239 -0
  37. package/src/strategies/sensei.ts +335 -7
  38. package/src/strategies/svk-strategy.ts +97 -27
  39. package/src/strategies/types.ts +4 -0
  40. package/src/strategies/universal-adapters/adapter-utils.ts +2 -1
  41. package/src/strategies/universal-adapters/avnu-adapter.ts +177 -268
  42. package/src/strategies/universal-adapters/baseAdapter.ts +263 -251
  43. package/src/strategies/universal-adapters/common-adapter.ts +206 -203
  44. package/src/strategies/universal-adapters/extended-adapter.ts +155 -336
  45. package/src/strategies/universal-adapters/index.ts +9 -8
  46. package/src/strategies/universal-adapters/token-transfer-adapter.ts +200 -0
  47. package/src/strategies/universal-adapters/usdc<>usdce-adapter.ts +200 -0
  48. package/src/strategies/universal-adapters/vesu-adapter.ts +110 -75
  49. package/src/strategies/universal-adapters/vesu-modify-position-adapter.ts +476 -0
  50. package/src/strategies/universal-adapters/vesu-multiply-adapter.ts +762 -844
  51. package/src/strategies/universal-adapters/vesu-position-common.ts +251 -0
  52. package/src/strategies/universal-adapters/vesu-supply-only-adapter.ts +18 -3
  53. package/src/strategies/universal-lst-muliplier-strategy.tsx +396 -204
  54. package/src/strategies/universal-strategy.tsx +1426 -1178
  55. package/src/strategies/vesu-extended-strategy/services/executionService.ts +2251 -0
  56. package/src/strategies/vesu-extended-strategy/services/extended-vesu-state-manager.ts +2941 -0
  57. package/src/strategies/vesu-extended-strategy/services/operationService.ts +12 -1
  58. package/src/strategies/vesu-extended-strategy/types/transaction-metadata.ts +52 -0
  59. package/src/strategies/vesu-extended-strategy/utils/config.runtime.ts +1 -0
  60. package/src/strategies/vesu-extended-strategy/utils/constants.ts +3 -1
  61. package/src/strategies/vesu-extended-strategy/utils/helper.ts +158 -124
  62. package/src/strategies/vesu-extended-strategy/vesu-extended-strategy.tsx +377 -1781
  63. package/src/strategies/vesu-rebalance.tsx +255 -152
  64. package/src/utils/health-factor-math.ts +4 -1
  65. package/src/utils/index.ts +2 -1
  66. package/src/utils/logger.browser.ts +22 -4
  67. package/src/utils/logger.node.ts +259 -24
  68. package/src/utils/starknet-call-parser.ts +1036 -0
  69. package/src/utils/strategy-utils.ts +61 -0
  70. 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 });
@@ -1,2 +1,3 @@
1
- export * from '@/dataTypes/bignumber';
2
- export * from './address';
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
- name: "USDCe",
54
- symbol: "USDCe",
55
- logo: "https://assets.troves.fi/integrations/tokens/usdc.svg",
56
- address: ContractAddr.from(
57
- "0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8"
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: "xLBTC",
166
- symbol: "xLBTC",
167
- logo: "https://assets.strkfarm.com/integrations/tokens/xlbtc.svg",
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
- name: "USDC",
203
- symbol: "USDC",
204
- logo: "https://assets.troves.fi/integrations/tokens/usdc.svg",
205
- address: ContractAddr.from(
206
- "0x033068f6539f8e6e6b131e6b2b814e6c34a5224bc66947c47dab9dfee93b35fb"
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
- static async getTokenInfoFromAddr(addr: ContractAddr) {
312
+
313
+ static async getTokenInfoFromName(tokenName: string) {
293
314
  // if tokens are not loaded, load them
294
315
  if (tokens.length == defaultTokens.length) {
295
- await Global.getTokens();
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
- throw new FatalError(`Token not found: ${addr.address}`);
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
- Global.cache[key] = {
307
- value: data,
308
- ttl,
309
- timestamp: Date.now(),
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
- const cached = Global.cache[key];
315
- if (!cached) return null;
316
- if (Date.now() - cached.timestamp > cached.ttl) {
317
- delete Global.cache[key];
318
- return null;
319
- }
320
- return cached.value;
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
  }
@@ -3,4 +3,5 @@ export * from './modules';
3
3
  export * from './interfaces';
4
4
  export * from './dataTypes';
5
5
  export * from './global';
6
- export * from './strategies';
6
+ export * from './strategies';
7
+ export * from "./utils";