From 31a8e1188d4806ba7a90baad4750e7dbf58ba8e6 Mon Sep 17 00:00:00 2001 From: akiraonstarknet Date: Wed, 1 Oct 2025 04:43:13 +0800 Subject: [PATCH 1/7] push --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 6f4c4ea5..f33a1db8 100755 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@prisma/client": "5.18.0", "@starknet-react/chains": "^5.0.1", "@starknet-react/core": "^5.0.1", - "@strkfarm/sdk": "1.1.28", + "@strkfarm/sdk": "1.1.29", "@tanstack/query-core": "5.28.0", "@types/mixpanel-browser": "2.49.0", "@types/mustache": "4.2.5", diff --git a/yarn.lock b/yarn.lock index 4c07f784..6d09ad76 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2557,10 +2557,10 @@ viem "^2.21.1" zod "^3.22.4" -"@strkfarm/sdk@1.1.28": - version "1.1.28" - resolved "https://registry.yarnpkg.com/@strkfarm/sdk/-/sdk-1.1.28.tgz#c74504cc1e8d2a31474518a41871128935842d7e" - integrity sha512-fGxVR8pnzdtOT9+NxTKI9+cCRUa6zSXBrxQU9KepsVzY7ZdtKikcyfA0c8RlRz3q8VpFDFey1fgTH/rhnrGtgQ== +"@strkfarm/sdk@1.1.29": + version "1.1.29" + resolved "https://registry.yarnpkg.com/@strkfarm/sdk/-/sdk-1.1.29.tgz#66cac92368910d52d87c7af802a0ee9a96548d17" + integrity sha512-sZrSdl1MSBSGNQi1837quhO4CswxcL2GzH3Gl+2fdaZZk4ia5W864a1r+oBFIHGEYxLmkgpGKdz0P4bMnUiTqg== dependencies: "@apollo/client" "3.11.8" "@avnu/avnu-sdk" "3.0.2" @@ -2568,7 +2568,7 @@ "@noble/curves" "^1.0.0" "@noble/hashes" "^2.0.0" "@scure/starknet" "^2.0.0" - "@strkfarm/sdk" "link:../../Library/Caches/Yarn/v6/npm-@strkfarm-sdk-1.1.28-c74504cc1e8d2a31474518a41871128935842d7e-integrity/node_modules/@strkfarm/sdk" + "@strkfarm/sdk" "link:../../Library/Caches/Yarn/v6/npm-@strkfarm-sdk-1.1.29-66cac92368910d52d87c7af802a0ee9a96548d17-integrity/node_modules/@strkfarm/sdk" bignumber.js "4.0.4" browser-assert "^1.2.1" chalk "^4.1.2" From 22e94a77689495c65422e076a28f93377f9be807 Mon Sep 17 00:00:00 2001 From: akiraonstarknet Date: Thu, 2 Oct 2025 03:44:16 +0800 Subject: [PATCH 2/7] switch LST api --- package.json | 2 +- yarn.lock | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index f33a1db8..67eb2f13 100755 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@prisma/client": "5.18.0", "@starknet-react/chains": "^5.0.1", "@starknet-react/core": "^5.0.1", - "@strkfarm/sdk": "1.1.29", + "@strkfarm/sdk": "1.1.31", "@tanstack/query-core": "5.28.0", "@types/mixpanel-browser": "2.49.0", "@types/mustache": "4.2.5", diff --git a/yarn.lock b/yarn.lock index 6d09ad76..2fd55266 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2557,10 +2557,10 @@ viem "^2.21.1" zod "^3.22.4" -"@strkfarm/sdk@1.1.29": - version "1.1.29" - resolved "https://registry.yarnpkg.com/@strkfarm/sdk/-/sdk-1.1.29.tgz#66cac92368910d52d87c7af802a0ee9a96548d17" - integrity sha512-sZrSdl1MSBSGNQi1837quhO4CswxcL2GzH3Gl+2fdaZZk4ia5W864a1r+oBFIHGEYxLmkgpGKdz0P4bMnUiTqg== +"@strkfarm/sdk@1.1.31": + version "1.1.31" + resolved "https://registry.yarnpkg.com/@strkfarm/sdk/-/sdk-1.1.31.tgz#055365b32f2b2b77bd580902ccfbc1bb877bbded" + integrity sha512-b3RqV3gqbtU9QfH2iXZyQqb75scT8R+OPBHbGueS6OG2AOTq7f78a1Vrbc+dwvwotssBncQNzutM1+iykeo32Q== dependencies: "@apollo/client" "3.11.8" "@avnu/avnu-sdk" "3.0.2" @@ -2568,7 +2568,7 @@ "@noble/curves" "^1.0.0" "@noble/hashes" "^2.0.0" "@scure/starknet" "^2.0.0" - "@strkfarm/sdk" "link:../../Library/Caches/Yarn/v6/npm-@strkfarm-sdk-1.1.29-66cac92368910d52d87c7af802a0ee9a96548d17-integrity/node_modules/@strkfarm/sdk" + "@strkfarm/sdk" "link:../../Library/Caches/Yarn/v6/npm-@strkfarm-sdk-1.1.31-055365b32f2b2b77bd580902ccfbc1bb877bbded-integrity/node_modules/@strkfarm/sdk" bignumber.js "4.0.4" browser-assert "^1.2.1" chalk "^4.1.2" From 2b36ef28bd0ca72caee919ab3eb68351989ff82d Mon Sep 17 00:00:00 2001 From: akiraonstarknet Date: Thu, 2 Oct 2025 16:08:10 +0800 Subject: [PATCH 3/7] minor fixes, sorting order, disclaimers --- package.json | 2 +- src/app/api/strategies/route.ts | 15 ++++++++++++--- yarn.lock | 10 +++++----- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 67eb2f13..fa7dbcbf 100755 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@prisma/client": "5.18.0", "@starknet-react/chains": "^5.0.1", "@starknet-react/core": "^5.0.1", - "@strkfarm/sdk": "1.1.31", + "@strkfarm/sdk": "1.1.32", "@tanstack/query-core": "5.28.0", "@types/mixpanel-browser": "2.49.0", "@types/mustache": "4.2.5", diff --git a/src/app/api/strategies/route.ts b/src/app/api/strategies/route.ts index 4fb3eea9..42a112d4 100755 --- a/src/app/api/strategies/route.ts +++ b/src/app/api/strategies/route.ts @@ -172,9 +172,18 @@ export async function GET(req: Request) { // sort based on risk factor, live status and apy // const aRisk = a.riskFactor; // const bRisk = b.riskFactor; - const aLive = a.status.number < 5 ? 0 : a.status.number; - const bLive = b.status.number < 5 ? 0 : b.status.number; - if (aLive !== bLive) return aLive - bLive; + + // Priority: status < 5 (priority 0), then status 5 (priority 1), then others (priority 2) + const getPriority = (statusNumber: number) => { + if (statusNumber < 5) return 0; + if (statusNumber === 5) return 1; + return 2; + }; + + const aPriority = getPriority(a.status.number); + const bPriority = getPriority(b.status.number); + + if (aPriority !== bPriority) return aPriority - bPriority; // if (aRisk !== bRisk) return aRisk - bRisk; return b.apy - a.apy; }); diff --git a/yarn.lock b/yarn.lock index 2fd55266..0419fd25 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2557,10 +2557,10 @@ viem "^2.21.1" zod "^3.22.4" -"@strkfarm/sdk@1.1.31": - version "1.1.31" - resolved "https://registry.yarnpkg.com/@strkfarm/sdk/-/sdk-1.1.31.tgz#055365b32f2b2b77bd580902ccfbc1bb877bbded" - integrity sha512-b3RqV3gqbtU9QfH2iXZyQqb75scT8R+OPBHbGueS6OG2AOTq7f78a1Vrbc+dwvwotssBncQNzutM1+iykeo32Q== +"@strkfarm/sdk@1.1.32": + version "1.1.32" + resolved "https://registry.yarnpkg.com/@strkfarm/sdk/-/sdk-1.1.32.tgz#12a6525ec337d1df0e856e497629ad8d868da10e" + integrity sha512-Po4/Ox5Kx12pRtzR1y5s3JeAY6felSgqKHj79abJD/AHxFRUFCWyjPXh/lkvF35hl/OAAqHJ4uEWvfbg2DDJjg== dependencies: "@apollo/client" "3.11.8" "@avnu/avnu-sdk" "3.0.2" @@ -2568,7 +2568,7 @@ "@noble/curves" "^1.0.0" "@noble/hashes" "^2.0.0" "@scure/starknet" "^2.0.0" - "@strkfarm/sdk" "link:../../Library/Caches/Yarn/v6/npm-@strkfarm-sdk-1.1.31-055365b32f2b2b77bd580902ccfbc1bb877bbded-integrity/node_modules/@strkfarm/sdk" + "@strkfarm/sdk" "link:../../Library/Caches/Yarn/v6/npm-@strkfarm-sdk-1.1.32-12a6525ec337d1df0e856e497629ad8d868da10e-integrity/node_modules/@strkfarm/sdk" bignumber.js "4.0.4" browser-assert "^1.2.1" chalk "^4.1.2" From 363e1959f39206db42854fdc5aa28f137019b1b1 Mon Sep 17 00:00:00 2001 From: akiraonstarknet Date: Thu, 2 Oct 2025 16:37:07 +0800 Subject: [PATCH 4/7] fix sorting --- package.json | 2 +- src/app/api/strategies/route.ts | 3 ++- src/store/strategies.atoms.tsx | 12 ++++++------ yarn.lock | 10 +++++----- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/package.json b/package.json index fa7dbcbf..fdeb4e0c 100755 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@prisma/client": "5.18.0", "@starknet-react/chains": "^5.0.1", "@starknet-react/core": "^5.0.1", - "@strkfarm/sdk": "1.1.32", + "@strkfarm/sdk": "1.1.33", "@tanstack/query-core": "5.28.0", "@types/mixpanel-browser": "2.49.0", "@types/mustache": "4.2.5", diff --git a/src/app/api/strategies/route.ts b/src/app/api/strategies/route.ts index 42a112d4..1a10f66d 100755 --- a/src/app/api/strategies/route.ts +++ b/src/app/api/strategies/route.ts @@ -174,6 +174,7 @@ export async function GET(req: Request) { // const bRisk = b.riskFactor; // Priority: status < 5 (priority 0), then status 5 (priority 1), then others (priority 2) + // console.log('statusNumber', a.status, b.status, a.name, b.name); const getPriority = (statusNumber: number) => { if (statusNumber < 5) return 0; if (statusNumber === 5) return 1; @@ -183,7 +184,7 @@ export async function GET(req: Request) { const aPriority = getPriority(a.status.number); const bPriority = getPriority(b.status.number); - if (aPriority !== bPriority) return aPriority - bPriority; + // if (aPriority !== bPriority) return aPriority - bPriority; // if (aRisk !== bRisk) return aRisk - bRisk; return b.apy - a.apy; }); diff --git a/src/store/strategies.atoms.tsx b/src/store/strategies.atoms.tsx index e985bc1d..60be3f22 100755 --- a/src/store/strategies.atoms.tsx +++ b/src/store/strategies.atoms.tsx @@ -439,12 +439,12 @@ export function getStrategies() { // undo const strategies: IStrategy[] = [ - autoStrkStrategy, - autoUSDCStrategy, - deltaNeutralMMUSDCETH, - deltaNeutralMMETHUSDC, - deltaNeutralMMSTRKETH, - deltaNeutralMMETHUSDCReverse, + // autoStrkStrategy, + // autoUSDCStrategy, + // deltaNeutralMMUSDCETH, + // deltaNeutralMMETHUSDC, + // deltaNeutralMMSTRKETH, + // deltaNeutralMMETHUSDCReverse, deltaNeutralxSTRKSTRK, ...vesuRebalanceStrats, ...ekuboCLStrats, diff --git a/yarn.lock b/yarn.lock index 0419fd25..4b11e4ae 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2557,10 +2557,10 @@ viem "^2.21.1" zod "^3.22.4" -"@strkfarm/sdk@1.1.32": - version "1.1.32" - resolved "https://registry.yarnpkg.com/@strkfarm/sdk/-/sdk-1.1.32.tgz#12a6525ec337d1df0e856e497629ad8d868da10e" - integrity sha512-Po4/Ox5Kx12pRtzR1y5s3JeAY6felSgqKHj79abJD/AHxFRUFCWyjPXh/lkvF35hl/OAAqHJ4uEWvfbg2DDJjg== +"@strkfarm/sdk@1.1.33": + version "1.1.33" + resolved "https://registry.yarnpkg.com/@strkfarm/sdk/-/sdk-1.1.33.tgz#a8bc90ba1af3a5b3290618751251411c79e27dfe" + integrity sha512-ohDR6UBiwoOB0h6TRwWyCVcp3jD7l+jmF29o6R9/LKhnTkkmjimT2ZVt9YlRr9EHJT/GXkVzmNS/O7j39/ygNA== dependencies: "@apollo/client" "3.11.8" "@avnu/avnu-sdk" "3.0.2" @@ -2568,7 +2568,7 @@ "@noble/curves" "^1.0.0" "@noble/hashes" "^2.0.0" "@scure/starknet" "^2.0.0" - "@strkfarm/sdk" "link:../../Library/Caches/Yarn/v6/npm-@strkfarm-sdk-1.1.32-12a6525ec337d1df0e856e497629ad8d868da10e-integrity/node_modules/@strkfarm/sdk" + "@strkfarm/sdk" "link:../../Library/Caches/Yarn/v6/npm-@strkfarm-sdk-1.1.33-a8bc90ba1af3a5b3290618751251411c79e27dfe-integrity/node_modules/@strkfarm/sdk" bignumber.js "4.0.4" browser-assert "^1.2.1" chalk "^4.1.2" From 84f013d28f2b9ce39f217f03cb9a6d83c0828cb2 Mon Sep 17 00:00:00 2001 From: akiraonstarknet Date: Thu, 2 Oct 2025 23:46:12 +0800 Subject: [PATCH 5/7] rm starkntember rewards --- src/app/api/lib.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/app/api/lib.ts b/src/app/api/lib.ts index 79937fec..ff0e91b4 100644 --- a/src/app/api/lib.ts +++ b/src/app/api/lib.ts @@ -54,27 +54,27 @@ export const getRewardsInfo = async ( { token: 'ETH', maxAPY: 100, // in % - maxRewardsPerDay: 0.538755 / 30, // tokem amount / days + maxRewardsPerDay: 0, // tokem amount / days }, { token: 'WBTC', maxAPY: 100, // in % - maxRewardsPerDay: 0.02191182 / 30, // tokem amount / days + maxRewardsPerDay: 0, // tokem amount / days }, { token: 'USDC', maxAPY: 100, // in % - maxRewardsPerDay: 2306 / 30, // tokem amount / days + maxRewardsPerDay: 0, // tokem amount / days }, { token: 'USDT', maxAPY: 75, // in % - maxRewardsPerDay: 1349 / 30, // tokem amount / days + maxRewardsPerDay: 0, // tokem amount / days }, { token: 'STRK', maxAPY: 75, // in % - maxRewardsPerDay: 10500 / 30, // tokem amount / days + maxRewardsPerDay: 0, // tokem amount / days }, ]; const allowedStrats = UniversalStrategies.map((u) => { From 391e8cd89f024148b75f0e1badbe4f9ff82a3b2d Mon Sep 17 00:00:00 2001 From: akiraonstarknet Date: Wed, 8 Oct 2025 19:34:50 +0800 Subject: [PATCH 6/7] add Max limits, update sdk to 39 --- package.json | 2 +- src/store/protocols.ts | 44 ++++++++++++++----------------- src/store/strategies.atoms.tsx | 10 ++++++- src/strategies/hyper-lst.strat.ts | 24 +++++++++++++++++ yarn.lock | 10 +++---- 5 files changed, 59 insertions(+), 31 deletions(-) diff --git a/package.json b/package.json index fdeb4e0c..af4e8212 100755 --- a/package.json +++ b/package.json @@ -36,7 +36,7 @@ "@prisma/client": "5.18.0", "@starknet-react/chains": "^5.0.1", "@starknet-react/core": "^5.0.1", - "@strkfarm/sdk": "1.1.33", + "@strkfarm/sdk": "1.1.39", "@tanstack/query-core": "5.28.0", "@types/mixpanel-browser": "2.49.0", "@types/mustache": "4.2.5", diff --git a/src/store/protocols.ts b/src/store/protocols.ts index c5a3656b..7505c744 100644 --- a/src/store/protocols.ts +++ b/src/store/protocols.ts @@ -1,11 +1,7 @@ import trovesLogo from '@public/logo.png'; import { atom } from 'jotai'; -import CarmineAtoms, { carmine } from './carmine.store'; import EkuboAtoms, { ekubo } from './ekobu.store'; import EndurAtoms, { endur } from './endur.store'; -import NostraDegenAtoms, { nostraDegen } from './nostradegen.store'; -import NostraDexAtoms, { nostraDex } from './nostradex.store'; -import NostraLendingAtoms, { nostraLending } from './nostralending.store'; import { Category, isPoolRetired, PoolInfo, PoolType } from './pools'; import { getLiveStatusEnum } from '@/utils/strategyStatus'; import TrovesAtoms, { troves, TrovesStrategyAPIResult } from './troves.atoms'; @@ -38,21 +34,21 @@ export const getProtocols = () => [ // class: tenkswap, // atoms: TenkSwapAtoms, // }, - { - name: nostraDex.name, - class: nostraDex, - atoms: NostraDexAtoms, - }, - { - name: nostraDegen.name, - class: nostraDegen, - atoms: NostraDegenAtoms, - }, - { - name: carmine.name, - class: carmine, - atoms: CarmineAtoms, - }, + // { + // name: nostraDex.name, + // class: nostraDex, + // atoms: NostraDexAtoms, + // }, + // { + // name: nostraDegen.name, + // class: nostraDegen, + // atoms: NostraDegenAtoms, + // }, + // { + // name: carmine.name, + // class: carmine, + // atoms: CarmineAtoms, + // }, // { // name: starkDefi.name, // class: starkDefi, @@ -63,11 +59,11 @@ export const getProtocols = () => [ // class: sithswap, // atoms: SithswapAtoms, // }, - { - name: nostraLending.name, - class: nostraLending, - atoms: NostraLendingAtoms, - }, + // { + // name: nostraLending.name, + // class: nostraLending, + // atoms: NostraLendingAtoms, + // }, { name: vesu.name, class: vesu, diff --git a/src/store/strategies.atoms.tsx b/src/store/strategies.atoms.tsx index 60be3f22..fb7ffea3 100755 --- a/src/store/strategies.atoms.tsx +++ b/src/store/strategies.atoms.tsx @@ -383,6 +383,14 @@ export function getStrategies() { ); }); + const lstMaxTVLs = { + xWBTC: 18, + xLBTC: 5, + xtBTC: 5, + xsBTC: 5, + xstrk: 200000, + }; + const hyperLSTStrategies = HyperLSTStrategies.map((hyper) => { const lstToken = hyper.depositTokens[0].symbol; const baseToken = lstToken.replace('x', ''); @@ -394,7 +402,7 @@ export function getStrategies() { hyper, StrategyLiveStatus.HOT, { - maxTVL: 0, + maxTVL: lstMaxTVLs[lstToken as keyof typeof lstMaxTVLs], isPaused: false, alerts: [ { diff --git a/src/strategies/hyper-lst.strat.ts b/src/strategies/hyper-lst.strat.ts index d1b0555c..706d80e2 100644 --- a/src/strategies/hyper-lst.strat.ts +++ b/src/strategies/hyper-lst.strat.ts @@ -11,9 +11,11 @@ import { DepositActionInputs, IStrategySettings, StrategyLiveStatus, + StrategyStatus, TokenInfo, } from './IStrategy'; import { buildStrategyActionHook, DummyStrategyActionHook } from '@/utils'; +import { PoolInfo } from '@/store/pools'; export class HyperLSTStrategy extends UniversalStrategyClass< typeof UniversalLstMultiplierStrategy @@ -104,4 +106,26 @@ export class HyperLSTStrategy extends UniversalStrategyClass< // buildStrategyActionHook([...swapCalls.calls, ...calls], [lstUnderlying]), ]; }; + + async solve(pools: PoolInfo[], amount: string) { + const yieldInfo = await this.universalStrategy.netAPY(); + // todo to deduct fee + const LSTYield = yieldInfo.splits.find((split) => split.id == 'lst_apy'); + if (!LSTYield) { + throw new Error('LST yield not found'); + } + console.log( + `${this.metadata.name}::LST APY: ${LSTYield.apy}, net APY: ${yieldInfo.net}, fee factor: ${this.fee_factor}`, + ); + this.netYield = + LSTYield.apy + (yieldInfo.net - LSTYield.apy) * (1 - this.fee_factor); + console.log('netYield2', this.netYield, Number(amount)); + this.leverage = 1; + + this.investmentFlows = []; + + this.postSolve(); + + this.status = StrategyStatus.SOLVED; + } } diff --git a/yarn.lock b/yarn.lock index 4b11e4ae..f50131ff 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2557,10 +2557,10 @@ viem "^2.21.1" zod "^3.22.4" -"@strkfarm/sdk@1.1.33": - version "1.1.33" - resolved "https://registry.yarnpkg.com/@strkfarm/sdk/-/sdk-1.1.33.tgz#a8bc90ba1af3a5b3290618751251411c79e27dfe" - integrity sha512-ohDR6UBiwoOB0h6TRwWyCVcp3jD7l+jmF29o6R9/LKhnTkkmjimT2ZVt9YlRr9EHJT/GXkVzmNS/O7j39/ygNA== +"@strkfarm/sdk@1.1.39": + version "1.1.39" + resolved "https://registry.yarnpkg.com/@strkfarm/sdk/-/sdk-1.1.39.tgz#4a17855011b09272eb4d203bd4ae6f0678a2de43" + integrity sha512-GNwO8SeCSjNwj38TvGpZBYAGmwLQmUYIjEOgaLhEYxg0oahI6cHo95Y60NCq9ItAabrAZTLcH8/W6Xa2hHQxYg== dependencies: "@apollo/client" "3.11.8" "@avnu/avnu-sdk" "3.0.2" @@ -2568,7 +2568,7 @@ "@noble/curves" "^1.0.0" "@noble/hashes" "^2.0.0" "@scure/starknet" "^2.0.0" - "@strkfarm/sdk" "link:../../Library/Caches/Yarn/v6/npm-@strkfarm-sdk-1.1.33-a8bc90ba1af3a5b3290618751251411c79e27dfe-integrity/node_modules/@strkfarm/sdk" + "@strkfarm/sdk" "link:../../Library/Caches/Yarn/v6/npm-@strkfarm-sdk-1.1.39-4a17855011b09272eb4d203bd4ae6f0678a2de43-integrity/node_modules/@strkfarm/sdk" bignumber.js "4.0.4" browser-assert "^1.2.1" chalk "^4.1.2" From b8da81e701097c36e530ef1d7adb543752cd7428 Mon Sep 17 00:00:00 2001 From: akiraonstarknet Date: Wed, 8 Oct 2025 21:57:12 +0800 Subject: [PATCH 7/7] fix xSTRK max bug --- src/store/strategies.atoms.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/store/strategies.atoms.tsx b/src/store/strategies.atoms.tsx index fb7ffea3..b2ca453f 100755 --- a/src/store/strategies.atoms.tsx +++ b/src/store/strategies.atoms.tsx @@ -388,7 +388,7 @@ export function getStrategies() { xLBTC: 5, xtBTC: 5, xsBTC: 5, - xstrk: 200000, + xSTRK: 200000, }; const hyperLSTStrategies = HyperLSTStrategies.map((hyper) => {