@metamask-previews/earn-controller 0.14.0-preview-2e9de6b → 0.14.0-preview-7bb49dcb

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.
@@ -1 +1 @@
1
- {"version":3,"file":"EarnController.mjs","sourceRoot":"","sources":["../src/EarnController.ts"],"names":[],"mappings":"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","sourcesContent":["import { Web3Provider } from '@ethersproject/providers';\nimport type {\n AccountsControllerGetSelectedAccountAction,\n AccountsControllerSelectedAccountChangeEvent,\n} from '@metamask/accounts-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n RestrictedMessenger,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport { convertHexToDecimal } from '@metamask/controller-utils';\nimport type {\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetStateAction,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport {\n StakeSdk,\n StakingApiService,\n type PooledStake,\n type StakeSdkConfig,\n type VaultData,\n type VaultDailyApy,\n type VaultApyAverages,\n ChainId,\n} from '@metamask/stake-sdk';\nimport {\n TransactionType,\n type TransactionControllerTransactionConfirmedEvent,\n} from '@metamask/transaction-controller';\n\nimport type {\n RefreshPooledStakesOptions,\n RefreshPooledStakingDataOptions,\n RefreshStakingEligibilityOptions,\n} from './types';\n\nexport const controllerName = 'EarnController';\n\nexport type PooledStakingState = {\n pooledStakes: PooledStake;\n exchangeRate: string;\n vaultMetadata: VaultData;\n vaultDailyApys: VaultDailyApy[];\n vaultApyAverages: VaultApyAverages;\n isEligible: boolean;\n};\n\nexport type StablecoinLendingState = {\n vaults: StablecoinVault[];\n};\n\nexport type StablecoinVault = {\n symbol: string;\n name: string;\n chainId: number;\n tokenAddress: string;\n vaultAddress: string;\n currentAPY: string;\n supply: string;\n liquidity: string;\n};\n\ntype StakingTransactionTypes =\n | TransactionType.stakingDeposit\n | TransactionType.stakingUnstake\n | TransactionType.stakingClaim;\n\nconst stakingTransactionTypes = new Set<StakingTransactionTypes>([\n TransactionType.stakingDeposit,\n TransactionType.stakingUnstake,\n TransactionType.stakingClaim,\n]);\n\n/**\n * Metadata for the EarnController.\n */\nconst earnControllerMetadata: StateMetadata<EarnControllerState> = {\n pooled_staking: {\n persist: true,\n anonymous: false,\n },\n stablecoin_lending: {\n persist: true,\n anonymous: false,\n },\n lastUpdated: {\n persist: false,\n anonymous: true,\n },\n};\n\n// === State Types ===\nexport type EarnControllerState = {\n pooled_staking: PooledStakingState;\n stablecoin_lending?: StablecoinLendingState;\n lastUpdated: number;\n};\n\n// === Default State ===\nconst DEFAULT_STABLECOIN_VAULT: StablecoinVault = {\n symbol: '',\n name: '',\n chainId: 0,\n tokenAddress: '',\n vaultAddress: '',\n currentAPY: '0',\n supply: '0',\n liquidity: '0',\n};\n\nconst DEFAULT_POOLED_STAKING_VAULT_APY_AVERAGES: VaultApyAverages = {\n oneDay: '0',\n oneWeek: '0',\n oneMonth: '0',\n threeMonths: '0',\n sixMonths: '0',\n oneYear: '0',\n};\n\n/**\n * Gets the default state for the EarnController.\n *\n * @returns The default EarnController state.\n */\nexport function getDefaultEarnControllerState(): EarnControllerState {\n return {\n pooled_staking: {\n pooledStakes: {\n account: '',\n lifetimeRewards: '0',\n assets: '0',\n exitRequests: [],\n },\n exchangeRate: '1',\n vaultMetadata: {\n apy: '0',\n capacity: '0',\n feePercent: 0,\n totalAssets: '0',\n vaultAddress: '0x0000000000000000000000000000000000000000',\n },\n vaultDailyApys: [],\n vaultApyAverages: DEFAULT_POOLED_STAKING_VAULT_APY_AVERAGES,\n isEligible: false,\n },\n stablecoin_lending: {\n vaults: [DEFAULT_STABLECOIN_VAULT],\n },\n lastUpdated: 0,\n };\n}\n\n// === MESSENGER ===\n\n/**\n * The action which can be used to retrieve the state of the EarnController.\n */\nexport type EarnControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n EarnControllerState\n>;\n\n/**\n * All actions that EarnController registers, to be called externally.\n */\nexport type EarnControllerActions = EarnControllerGetStateAction;\n\n/**\n * All actions that EarnController calls internally.\n */\nexport type AllowedActions =\n | NetworkControllerGetNetworkClientByIdAction\n | NetworkControllerGetStateAction\n | AccountsControllerGetSelectedAccountAction;\n\n/**\n * The event that EarnController publishes when updating state.\n */\nexport type EarnControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n EarnControllerState\n>;\n\n/**\n * All events that EarnController publishes, to be subscribed to externally.\n */\nexport type EarnControllerEvents = EarnControllerStateChangeEvent;\n\n/**\n * All events that EarnController subscribes to internally.\n */\nexport type AllowedEvents =\n | AccountsControllerSelectedAccountChangeEvent\n | NetworkControllerStateChangeEvent\n | TransactionControllerTransactionConfirmedEvent;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * EarnController.\n */\nexport type EarnControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n EarnControllerActions | AllowedActions,\n EarnControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\n// === CONTROLLER DEFINITION ===\n\n/**\n * EarnController manages DeFi earning opportunities across different protocols and chains.\n */\nexport class EarnController extends BaseController<\n typeof controllerName,\n EarnControllerState,\n EarnControllerMessenger\n> {\n #stakeSDK: StakeSdk | null = null;\n\n #selectedNetworkClientId?: string;\n\n readonly #stakingApiService: StakingApiService = new StakingApiService();\n\n constructor({\n messenger,\n state = {},\n }: {\n messenger: EarnControllerMessenger;\n state?: Partial<EarnControllerState>;\n }) {\n super({\n name: controllerName,\n metadata: earnControllerMetadata,\n messenger,\n state: {\n ...getDefaultEarnControllerState(),\n ...state,\n },\n });\n\n this.#initializeSDK();\n this.refreshPooledStakingData().catch(console.error);\n\n const { selectedNetworkClientId } = this.messagingSystem.call(\n 'NetworkController:getState',\n );\n this.#selectedNetworkClientId = selectedNetworkClientId;\n\n // Listen for network changes\n this.messagingSystem.subscribe(\n 'NetworkController:stateChange',\n (networkControllerState) => {\n if (\n networkControllerState.selectedNetworkClientId !==\n this.#selectedNetworkClientId\n ) {\n this.#initializeSDK(networkControllerState.selectedNetworkClientId);\n this.refreshPooledStakingVaultMetadata().catch(console.error);\n this.refreshPooledStakingVaultDailyApys().catch(console.error);\n this.refreshPooledStakingVaultApyAverages().catch(console.error);\n this.refreshPooledStakes().catch(console.error);\n }\n this.#selectedNetworkClientId =\n networkControllerState.selectedNetworkClientId;\n },\n );\n\n // Listen for account changes\n this.messagingSystem.subscribe(\n 'AccountsController:selectedAccountChange',\n (account) => {\n const address = account?.address;\n /**\n * TEMP: There's a race condition where the account state isn't updated immediately.\n * Until this has been fixed, we rely on the event payload for the latest account instead of #getCurrentAccount().\n * Issue: https://github.com/MetaMask/accounts-planning/issues/887\n */\n this.refreshStakingEligibility({ address }).catch(console.error);\n this.refreshPooledStakes({ address }).catch(console.error);\n },\n );\n\n // Listen for confirmed staking transactions\n this.messagingSystem.subscribe(\n 'TransactionController:transactionConfirmed',\n (transactionMeta) => {\n /**\n * When we speed up a transaction, we set the type as Retry and we lose\n * information about type of transaction that is being set up, so we use\n * original type to track that information.\n */\n const { type, originalType } = transactionMeta;\n\n const isStakingTransaction =\n stakingTransactionTypes.has(type as StakingTransactionTypes) ||\n stakingTransactionTypes.has(originalType as StakingTransactionTypes);\n\n if (isStakingTransaction) {\n const sender = transactionMeta.txParams.from;\n this.refreshPooledStakes({ resetCache: true, address: sender }).catch(\n console.error,\n );\n }\n },\n );\n }\n\n #initializeSDK(networkClientId?: string) {\n const { selectedNetworkClientId } = networkClientId\n ? { selectedNetworkClientId: networkClientId }\n : this.messagingSystem.call('NetworkController:getState');\n\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n\n if (!networkClient?.provider) {\n this.#stakeSDK = null;\n return;\n }\n\n const provider = new Web3Provider(networkClient.provider);\n const { chainId } = networkClient.configuration;\n\n // Initialize appropriate contracts based on chainId\n const config: StakeSdkConfig = {\n chainId: convertHexToDecimal(chainId),\n };\n\n try {\n this.#stakeSDK = StakeSdk.create(config);\n this.#stakeSDK.pooledStakingContract.connectSignerOrProvider(provider);\n } catch (error) {\n this.#stakeSDK = null;\n // Only log unexpected errors, not unsupported chain errors\n if (\n !(\n error instanceof Error &&\n error.message.includes('Unsupported chainId')\n )\n ) {\n console.error('Stake SDK initialization failed:', error);\n }\n }\n }\n\n #getCurrentAccount() {\n return this.messagingSystem.call('AccountsController:getSelectedAccount');\n }\n\n #getCurrentChainId(): number {\n // const { selectedNetworkClientId } = this.messagingSystem.call(\n // 'NetworkController:getState',\n // );\n // const {\n // configuration: { chainId },\n // } = this.messagingSystem.call(\n // 'NetworkController:getNetworkClientById',\n // selectedNetworkClientId,\n // );\n // return convertHexToDecimal(chainId);\n\n // TEMP: Until we update our data-fetching and storage solution to not depend on single selected network.\n return ChainId.ETHEREUM;\n }\n\n /**\n * Refreshes the pooled stakes data for the current account.\n * Fetches updated stake information including lifetime rewards, assets, and exit requests\n * from the staking API service and updates the state.\n *\n * @param options - Optional arguments\n * @param [options.resetCache] - Control whether the BE cache should be invalidated (optional).\n * @param [options.address] - The address to refresh pooled stakes for (optional).\n * @returns A promise that resolves when the stakes data has been updated\n */\n async refreshPooledStakes({\n resetCache = false,\n address,\n }: RefreshPooledStakesOptions = {}): Promise<void> {\n const addressToUse = address ?? this.#getCurrentAccount()?.address;\n\n if (!addressToUse) {\n return;\n }\n\n const chainId = this.#getCurrentChainId();\n\n const { accounts, exchangeRate } =\n await this.#stakingApiService.getPooledStakes(\n [addressToUse],\n chainId,\n resetCache,\n );\n\n this.update((state) => {\n state.pooled_staking.pooledStakes = accounts[0];\n state.pooled_staking.exchangeRate = exchangeRate;\n });\n }\n\n /**\n * Refreshes the staking eligibility status for the current account.\n * Updates the eligibility status in the controller state based on the location and address blocklist for compliance.\n *\n * @param options - Optional arguments\n * @param [options.address] - Address to refresh staking eligibility for (optional).\n * @returns A promise that resolves when the eligibility status has been updated\n */\n async refreshStakingEligibility({\n address,\n }: RefreshStakingEligibilityOptions = {}): Promise<void> {\n const addressToCheck = address ?? this.#getCurrentAccount()?.address;\n\n if (!addressToCheck) {\n return;\n }\n\n const { eligible: isEligible } =\n await this.#stakingApiService.getPooledStakingEligibility([\n addressToCheck,\n ]);\n\n this.update((state) => {\n state.pooled_staking.isEligible = isEligible;\n });\n }\n\n /**\n * Refreshes pooled staking vault metadata for the current chain.\n * Updates the vault metadata in the controller state including APY, capacity,\n * fee percentage, total assets, and vault address.\n *\n * @returns A promise that resolves when the vault metadata has been updated\n */\n async refreshPooledStakingVaultMetadata(): Promise<void> {\n const chainId = this.#getCurrentChainId();\n const vaultMetadata = await this.#stakingApiService.getVaultData(chainId);\n\n this.update((state) => {\n state.pooled_staking.vaultMetadata = vaultMetadata;\n });\n }\n\n /**\n * Refreshes pooled staking vault daily apys for the current chain.\n * Updates the pooled staking vault daily apys controller state.\n *\n * @param days - The number of days to fetch pooled staking vault daily apys for (defaults to 365).\n * @param order - The order in which to fetch pooled staking vault daily apys. Descending order fetches the latest N days (latest working backwards). Ascending order fetches the oldest N days (oldest working forwards) (defaults to 'desc').\n * @returns A promise that resolves when the pooled staking vault daily apys have been updated.\n */\n async refreshPooledStakingVaultDailyApys(\n days = 365,\n order: 'asc' | 'desc' = 'desc',\n ): Promise<void> {\n const chainId = this.#getCurrentChainId();\n const vaultDailyApys = await this.#stakingApiService.getVaultDailyApys(\n chainId,\n days,\n order,\n );\n\n this.update((state) => {\n state.pooled_staking.vaultDailyApys = vaultDailyApys;\n });\n }\n\n /**\n * Refreshes pooled staking vault apy averages for the current chain.\n * Updates the pooled staking vault apy averages controller state.\n *\n * @returns A promise that resolves when the pooled staking vault apy averages have been updated.\n */\n async refreshPooledStakingVaultApyAverages() {\n const chainId = this.#getCurrentChainId();\n const vaultApyAverages =\n await this.#stakingApiService.getVaultApyAverages(chainId);\n\n this.update((state) => {\n state.pooled_staking.vaultApyAverages = vaultApyAverages;\n });\n }\n\n /**\n * Refreshes all pooled staking related data including stakes, eligibility, and vault data.\n * This method allows partial success, meaning some data may update while other requests fail.\n * All errors are collected and thrown as a single error message.\n *\n * @param options - Optional arguments\n * @param [options.resetCache] - Control whether the BE cache should be invalidated (optional).\n * @param [options.address] - The address to refresh pooled stakes for (optional).\n * @returns A promise that resolves when all possible data has been updated\n * @throws {Error} If any of the refresh operations fail, with concatenated error messages\n */\n async refreshPooledStakingData({\n resetCache,\n address,\n }: RefreshPooledStakingDataOptions = {}): Promise<void> {\n const errors: Error[] = [];\n\n await Promise.all([\n this.refreshPooledStakes({ resetCache, address }).catch((error) => {\n errors.push(error);\n }),\n this.refreshStakingEligibility({ address }).catch((error) => {\n errors.push(error);\n }),\n this.refreshPooledStakingVaultMetadata().catch((error) => {\n errors.push(error);\n }),\n this.refreshPooledStakingVaultDailyApys().catch((error) => {\n errors.push(error);\n }),\n this.refreshPooledStakingVaultApyAverages().catch((error) => {\n errors.push(error);\n }),\n ]);\n\n if (errors.length > 0) {\n throw new Error(\n `Failed to refresh some staking data: ${errors\n .map((e) => e.message)\n .join(', ')}`,\n );\n }\n }\n}\n"]}
1
+ {"version":3,"file":"EarnController.mjs","sourceRoot":"","sources":["../src/EarnController.ts"],"names":[],"mappings":"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","sourcesContent":["import { Web3Provider } from '@ethersproject/providers';\nimport type {\n AccountsControllerGetSelectedAccountAction,\n AccountsControllerSelectedAccountChangeEvent,\n} from '@metamask/accounts-controller';\nimport type {\n ControllerGetStateAction,\n ControllerStateChangeEvent,\n RestrictedMessenger,\n StateMetadata,\n} from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport { convertHexToDecimal, toHex } from '@metamask/controller-utils';\nimport type {\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetStateAction,\n NetworkControllerStateChangeEvent,\n} from '@metamask/network-controller';\nimport {\n EarnSdk,\n EarnApiService,\n type LendingMarket,\n type PooledStake,\n type EarnSdkConfig,\n type VaultData,\n type VaultDailyApy,\n type VaultApyAverages,\n type LendingPosition,\n type GasLimitParams,\n} from '@metamask/stake-sdk';\nimport {\n type TransactionController,\n TransactionType,\n type TransactionControllerTransactionConfirmedEvent,\n} from '@metamask/transaction-controller';\n\nimport type {\n RefreshLendingEligibilityOptions,\n RefreshLendingPositionsOptions,\n RefreshPooledStakesOptions,\n RefreshPooledStakingDataOptions,\n RefreshStakingEligibilityOptions,\n} from './types';\n\nexport const controllerName = 'EarnController';\n\nexport type PooledStakingState = {\n [chainId: number]: {\n pooledStakes: PooledStake;\n exchangeRate: string;\n vaultMetadata: VaultData;\n vaultDailyApys: VaultDailyApy[];\n vaultApyAverages: VaultApyAverages;\n };\n isEligible: boolean;\n};\n\nexport type LendingPositionWithMarket = LendingPosition & {\n marketId: string;\n marketAddress: string;\n protocol: string;\n};\n\n// extends LendingPosition to include a marketId, marketAddress, and protocol reference\nexport type LendingPositionWithMarketReference = Omit<\n LendingPosition,\n 'market'\n> & {\n marketId: string;\n marketAddress: string;\n protocol: string;\n};\n\nexport type LendingMarketWithPosition = LendingMarket & {\n position: LendingPositionWithMarketReference;\n};\n\nexport type LendingState = {\n markets: LendingMarket[]; // list of markets\n positions: LendingPositionWithMarketReference[]; // list of positions\n isEligible: boolean;\n};\n\ntype StakingTransactionTypes =\n | TransactionType.stakingDeposit\n | TransactionType.stakingUnstake\n | TransactionType.stakingClaim;\n\nconst stakingTransactionTypes = new Set<StakingTransactionTypes>([\n TransactionType.stakingDeposit,\n TransactionType.stakingUnstake,\n TransactionType.stakingClaim,\n]);\n\ntype LendingTransactionTypes =\n | TransactionType.lendingDeposit\n | 'lendingWithdraw';\n\nconst lendingTransactionTypes = new Set<LendingTransactionTypes>([\n TransactionType.lendingDeposit,\n 'lendingWithdraw',\n]);\n\n/**\n * Metadata for the EarnController.\n */\nconst earnControllerMetadata: StateMetadata<EarnControllerState> = {\n pooled_staking: {\n persist: true,\n anonymous: false,\n },\n lending: {\n persist: true,\n anonymous: false,\n },\n lastUpdated: {\n persist: false,\n anonymous: true,\n },\n};\n\n// === State Types ===\nexport type EarnControllerState = {\n pooled_staking: PooledStakingState;\n lending: LendingState;\n lastUpdated: number;\n};\n\n// === Default State ===\nexport const DEFAULT_LENDING_MARKET: LendingMarket = {\n id: '',\n chainId: 0,\n protocol: '' as LendingMarket['protocol'],\n name: '',\n address: '',\n tvlUnderlying: '0',\n netSupplyRate: 0,\n totalSupplyRate: 0,\n underlying: {\n address: '',\n chainId: 0,\n },\n outputToken: {\n address: '',\n chainId: 0,\n },\n rewards: [\n {\n token: {\n address: '',\n chainId: 0,\n },\n rate: 0,\n },\n ],\n};\n\nexport const DEFAULT_LENDING_POSITION: LendingPositionWithMarketReference = {\n id: '',\n chainId: 0,\n assets: '0',\n marketId: '',\n marketAddress: '',\n protocol: '',\n};\n\nexport const DEFAULT_POOLED_STAKING_VAULT_APY_AVERAGES: VaultApyAverages = {\n oneDay: '0',\n oneWeek: '0',\n oneMonth: '0',\n threeMonths: '0',\n sixMonths: '0',\n oneYear: '0',\n};\n\nexport const DEFAULT_POOLED_STAKING_CHAIN_STATE = {\n pooledStakes: {\n account: '',\n lifetimeRewards: '0',\n assets: '0',\n exitRequests: [],\n },\n exchangeRate: '1',\n vaultMetadata: {\n apy: '0',\n capacity: '0',\n feePercent: 0,\n totalAssets: '0',\n vaultAddress: '0x0000000000000000000000000000000000000000',\n },\n vaultDailyApys: [],\n vaultApyAverages: DEFAULT_POOLED_STAKING_VAULT_APY_AVERAGES,\n};\n\n/**\n * Gets the default state for the EarnController.\n *\n * @returns The default EarnController state.\n */\nexport function getDefaultEarnControllerState(): EarnControllerState {\n return {\n pooled_staking: {\n isEligible: false,\n },\n lending: {\n markets: [DEFAULT_LENDING_MARKET],\n positions: [DEFAULT_LENDING_POSITION],\n isEligible: false,\n },\n lastUpdated: 0,\n };\n}\n\n// === MESSENGER ===\n\n/**\n * The action which can be used to retrieve the state of the EarnController.\n */\nexport type EarnControllerGetStateAction = ControllerGetStateAction<\n typeof controllerName,\n EarnControllerState\n>;\n\n/**\n * All actions that EarnController registers, to be called externally.\n */\nexport type EarnControllerActions = EarnControllerGetStateAction;\n\n/**\n * All actions that EarnController calls internally.\n */\nexport type AllowedActions =\n | NetworkControllerGetNetworkClientByIdAction\n | NetworkControllerGetStateAction\n | AccountsControllerGetSelectedAccountAction;\n\n/**\n * The event that EarnController publishes when updating state.\n */\nexport type EarnControllerStateChangeEvent = ControllerStateChangeEvent<\n typeof controllerName,\n EarnControllerState\n>;\n\n/**\n * All events that EarnController publishes, to be subscribed to externally.\n */\nexport type EarnControllerEvents = EarnControllerStateChangeEvent;\n\n/**\n * All events that EarnController subscribes to internally.\n */\nexport type AllowedEvents =\n | AccountsControllerSelectedAccountChangeEvent\n | NetworkControllerStateChangeEvent\n | TransactionControllerTransactionConfirmedEvent;\n\n/**\n * The messenger which is restricted to actions and events accessed by\n * EarnController.\n */\nexport type EarnControllerMessenger = RestrictedMessenger<\n typeof controllerName,\n EarnControllerActions | AllowedActions,\n EarnControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\n// === CONTROLLER DEFINITION ===\n\n/**\n * EarnController manages DeFi earning opportunities across different protocols and chains.\n */\nexport class EarnController extends BaseController<\n typeof controllerName,\n EarnControllerState,\n EarnControllerMessenger\n> {\n #earnSDK: EarnSdk | null = null;\n\n #selectedNetworkClientId?: string;\n\n readonly #earnApiService: EarnApiService = new EarnApiService();\n\n readonly #addTransactionFn: typeof TransactionController.prototype.addTransaction;\n\n readonly #supportedPooledStakingChains: number[];\n\n constructor({\n messenger,\n state = {},\n addTransactionFn,\n }: {\n messenger: EarnControllerMessenger;\n state?: Partial<EarnControllerState>;\n addTransactionFn: typeof TransactionController.prototype.addTransaction;\n }) {\n super({\n name: controllerName,\n metadata: earnControllerMetadata,\n messenger,\n state: {\n ...getDefaultEarnControllerState(),\n ...state,\n },\n });\n\n // temporary array of supported chains\n // TODO: remove this once we have a more permanent solution\n // from sdk or api to get lending and pooled staking chains\n this.#supportedPooledStakingChains = [1, 560048];\n\n this.#addTransactionFn = addTransactionFn;\n\n this.#initializeSDK().catch(console.error);\n this.refreshPooledStakingData().catch(console.error);\n this.refreshLendingData().catch(console.error);\n\n const { selectedNetworkClientId } = this.messagingSystem.call(\n 'NetworkController:getState',\n );\n this.#selectedNetworkClientId = selectedNetworkClientId;\n\n // Listen for network changes\n this.messagingSystem.subscribe(\n 'NetworkController:stateChange',\n (networkControllerState) => {\n if (\n networkControllerState.selectedNetworkClientId !==\n this.#selectedNetworkClientId\n ) {\n const chainId = this.#getCurrentChainId(\n networkControllerState.selectedNetworkClientId,\n );\n this.#initializeSDK(\n networkControllerState.selectedNetworkClientId,\n ).catch(console.error);\n if (this.#supportedPooledStakingChains.includes(chainId)) {\n // only refresh pool staking data for the chain we are switching to\n this.refreshPooledStakingVaultMetadata(chainId).catch(\n console.error,\n );\n this.refreshPooledStakingVaultDailyApys(chainId).catch(\n console.error,\n );\n this.refreshPooledStakingVaultApyAverages(chainId).catch(\n console.error,\n );\n this.refreshPooledStakes({ chainId }).catch(console.error);\n }\n // refresh lending data for all chains\n this.refreshLendingMarkets().catch(console.error);\n this.refreshLendingPositions().catch(console.error);\n }\n this.#selectedNetworkClientId =\n networkControllerState.selectedNetworkClientId;\n },\n );\n\n // Listen for account changes\n this.messagingSystem.subscribe(\n 'AccountsController:selectedAccountChange',\n (account) => {\n const address = account?.address;\n /**\n * TEMP: There's a race condition where the account state isn't updated immediately.\n * Until this has been fixed, we rely on the event payload for the latest account instead of #getCurrentAccount().\n * Issue: https://github.com/MetaMask/accounts-planning/issues/887\n */\n\n // TODO: temp solution, this will refresh lending eligibility also\n // we could have a more general check, as what is happening is a compliance address check\n this.refreshStakingEligibility({ address }).catch(console.error);\n\n this.refreshPooledStakes({ address }).catch(console.error);\n this.refreshLendingPositions({ address }).catch(console.error);\n },\n );\n\n // Listen for confirmed staking transactions\n this.messagingSystem.subscribe(\n 'TransactionController:transactionConfirmed',\n (transactionMeta) => {\n /**\n * When we speed up a transaction, we set the type as Retry and we lose\n * information about type of transaction that is being set up, so we use\n * original type to track that information.\n */\n const { type, originalType } = transactionMeta;\n\n const isStakingTransaction =\n stakingTransactionTypes.has(type as StakingTransactionTypes) ||\n stakingTransactionTypes.has(originalType as StakingTransactionTypes);\n\n const isLendingTransaction =\n lendingTransactionTypes.has(type as LendingTransactionTypes) ||\n lendingTransactionTypes.has(originalType as LendingTransactionTypes);\n\n const sender = transactionMeta.txParams.from;\n\n if (isStakingTransaction) {\n this.refreshPooledStakes({ resetCache: true, address: sender }).catch(\n console.error,\n );\n }\n if (isLendingTransaction) {\n this.refreshLendingPositions({ address: sender }).catch(\n console.error,\n );\n }\n },\n );\n }\n\n /**\n * Initializes the Earn SDK.\n *\n * @param networkClientId - The network client id to initialize the Earn SDK for (optional).\n */\n async #initializeSDK(networkClientId?: string) {\n const { selectedNetworkClientId } = networkClientId\n ? { selectedNetworkClientId: networkClientId }\n : this.messagingSystem.call('NetworkController:getState');\n\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n selectedNetworkClientId,\n );\n\n if (!networkClient?.provider) {\n this.#earnSDK = null;\n return;\n }\n\n const provider = new Web3Provider(networkClient.provider);\n const { chainId } = networkClient.configuration;\n\n // Initialize appropriate contracts based on chainId\n const config: EarnSdkConfig = {\n chainId: convertHexToDecimal(chainId),\n };\n\n try {\n this.#earnSDK = await EarnSdk.create(provider, config);\n } catch (error) {\n this.#earnSDK = null;\n // Only log unexpected errors, not unsupported chain errors\n if (\n !(\n error instanceof Error &&\n error.message.includes('Unsupported chainId')\n )\n ) {\n console.error('Earn SDK initialization failed:', error);\n }\n }\n }\n\n /**\n * Gets the current account.\n *\n * @returns The current account.\n */\n #getCurrentAccount() {\n return this.messagingSystem.call('AccountsController:getSelectedAccount');\n }\n\n /**\n * Gets the current chain id.\n *\n * @param networkClientId - The network client id to get the chain id for (optional).\n * @returns The current chain id in decimal.\n */\n #getCurrentChainId(networkClientId?: string): number {\n const networkClientIdToUse =\n networkClientId ??\n this.messagingSystem.call('NetworkController:getState')\n .selectedNetworkClientId;\n\n const {\n configuration: { chainId },\n } = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n networkClientIdToUse,\n );\n return convertHexToDecimal(chainId);\n }\n\n /**\n * Refreshes the pooled stakes data for the current account.\n * Fetches updated stake information including lifetime rewards, assets, and exit requests\n * from the staking API service and updates the state.\n *\n * @param options - Optional arguments\n * @param [options.resetCache] - Control whether the BE cache should be invalidated (optional).\n * @param [options.address] - The address to refresh pooled stakes for (optional).\n * @param [options.chainId] - The chain id to refresh pooled stakes for (optional).\n * @returns A promise that resolves when the stakes data has been updated\n */\n async refreshPooledStakes({\n resetCache = false,\n address,\n chainId,\n }: RefreshPooledStakesOptions = {}): Promise<void> {\n const addressToUse = address ?? this.#getCurrentAccount()?.address;\n\n if (!addressToUse) {\n return;\n }\n\n const chainIdToUse = chainId ?? this.#getCurrentChainId();\n\n const { accounts, exchangeRate } =\n await this.#earnApiService.pooledStaking.getPooledStakes(\n [addressToUse],\n chainIdToUse,\n resetCache,\n );\n\n this.update((state) => {\n const chainState =\n state.pooled_staking[chainIdToUse] ??\n DEFAULT_POOLED_STAKING_CHAIN_STATE;\n state.pooled_staking[chainIdToUse] = {\n ...chainState,\n pooledStakes: accounts[0],\n exchangeRate,\n };\n });\n }\n\n /**\n * Refreshes the staking eligibility status for the current account.\n * Updates the eligibility status in the controller state based on the location and address blocklist for compliance.\n *\n * @param options - Optional arguments\n * @param [options.address] - Address to refresh staking eligibility for (optional).\n * @returns A promise that resolves when the eligibility status has been updated\n */\n async refreshStakingEligibility({\n address,\n }: RefreshStakingEligibilityOptions = {}): Promise<void> {\n const addressToCheck = address ?? this.#getCurrentAccount()?.address;\n\n if (!addressToCheck) {\n return;\n }\n\n const { eligible: isEligible } =\n await this.#earnApiService.pooledStaking.getPooledStakingEligibility([\n addressToCheck,\n ]);\n\n this.update((state) => {\n state.pooled_staking.isEligible = isEligible;\n state.lending.isEligible = isEligible;\n });\n }\n\n /**\n * Refreshes pooled staking vault metadata for the current chain.\n * Updates the vault metadata in the controller state including APY, capacity,\n * fee percentage, total assets, and vault address.\n *\n * @param chainId - The chain id to refresh pooled staking vault metadata for (optional).\n * @returns A promise that resolves when the vault metadata has been updated\n */\n async refreshPooledStakingVaultMetadata(chainId?: number): Promise<void> {\n const chainIdToUse = chainId ?? this.#getCurrentChainId();\n const vaultMetadata =\n await this.#earnApiService.pooledStaking.getVaultData(chainIdToUse);\n\n this.update((state) => {\n const chainState =\n state.pooled_staking[chainIdToUse] ??\n DEFAULT_POOLED_STAKING_CHAIN_STATE;\n state.pooled_staking[chainIdToUse] = {\n ...chainState,\n vaultMetadata,\n };\n });\n }\n\n /**\n * Refreshes pooled staking vault daily apys for the current chain.\n * Updates the pooled staking vault daily apys controller state.\n *\n * @param chainId - The chain id to refresh pooled staking vault daily apys for (optional).\n * @param days - The number of days to fetch pooled staking vault daily apys for (defaults to 365).\n * @param order - The order in which to fetch pooled staking vault daily apys. Descending order fetches the latest N days (latest working backwards). Ascending order fetches the oldest N days (oldest working forwards) (defaults to 'desc').\n * @returns A promise that resolves when the pooled staking vault daily apys have been updated.\n */\n async refreshPooledStakingVaultDailyApys(\n chainId?: number,\n days = 365,\n order: 'asc' | 'desc' = 'desc',\n ): Promise<void> {\n const chainIdToUse = chainId ?? this.#getCurrentChainId();\n const vaultDailyApys =\n await this.#earnApiService.pooledStaking.getVaultDailyApys(\n chainIdToUse,\n days,\n order,\n );\n\n this.update((state) => {\n const chainState =\n state.pooled_staking[chainIdToUse] ??\n DEFAULT_POOLED_STAKING_CHAIN_STATE;\n state.pooled_staking[chainIdToUse] = {\n ...chainState,\n vaultDailyApys,\n };\n });\n }\n\n /**\n * Refreshes pooled staking vault apy averages for the current chain.\n * Updates the pooled staking vault apy averages controller state.\n *\n * @param chainId - The chain id to refresh pooled staking vault apy averages for (optional).\n * @returns A promise that resolves when the pooled staking vault apy averages have been updated.\n */\n async refreshPooledStakingVaultApyAverages(chainId?: number) {\n const chainIdToUse = chainId ?? this.#getCurrentChainId();\n const vaultApyAverages =\n await this.#earnApiService.pooledStaking.getVaultApyAverages(\n chainIdToUse,\n );\n\n this.update((state) => {\n const chainState =\n state.pooled_staking[chainIdToUse] ??\n DEFAULT_POOLED_STAKING_CHAIN_STATE;\n state.pooled_staking[chainIdToUse] = {\n ...chainState,\n vaultApyAverages,\n };\n });\n }\n\n /**\n * Refreshes all pooled staking related data including stakes, eligibility, and vault data.\n * This method allows partial success, meaning some data may update while other requests fail.\n * All errors are collected and thrown as a single error message.\n *\n * @param options - Optional arguments\n * @param [options.resetCache] - Control whether the BE cache should be invalidated (optional).\n * @param [options.address] - The address to refresh pooled stakes for (optional).\n * @returns A promise that resolves when all possible data has been updated\n * @throws {Error} If any of the refresh operations fail, with concatenated error messages\n */\n async refreshPooledStakingData({\n resetCache,\n address,\n }: RefreshPooledStakingDataOptions = {}): Promise<void> {\n const errors: Error[] = [];\n for (const chainId of this.#supportedPooledStakingChains) {\n await Promise.all([\n this.refreshPooledStakes({ resetCache, address, chainId }).catch(\n (error) => {\n errors.push(error);\n },\n ),\n this.refreshStakingEligibility({ address }).catch((error) => {\n errors.push(error);\n }),\n this.refreshPooledStakingVaultMetadata(chainId).catch((error) => {\n errors.push(error);\n }),\n this.refreshPooledStakingVaultDailyApys(chainId).catch((error) => {\n errors.push(error);\n }),\n this.refreshPooledStakingVaultApyAverages(chainId).catch((error) => {\n errors.push(error);\n }),\n ]);\n }\n\n if (errors.length > 0) {\n throw new Error(\n `Failed to refresh some staking data: ${errors\n .map((e) => e.message)\n .join(', ')}`,\n );\n }\n }\n\n /**\n * Refreshes the lending markets data for all chains.\n * Updates the lending markets in the controller state.\n *\n * @returns A promise that resolves when the lending markets have been updated\n */\n async refreshLendingMarkets(): Promise<void> {\n const markets = await this.#earnApiService.lending.getMarkets();\n\n this.update((state) => {\n state.lending.markets = markets;\n });\n }\n\n /**\n * Refreshes the lending positions for the current account.\n * Updates the lending positions in the controller state.\n *\n * @param options - Optional arguments\n * @param [options.address] - The address to refresh lending positions for (optional).\n * @returns A promise that resolves when the lending positions have been updated\n */\n async refreshLendingPositions({\n address,\n }: RefreshLendingPositionsOptions = {}): Promise<void> {\n const addressToUse = address ?? this.#getCurrentAccount()?.address;\n\n if (!addressToUse) {\n return;\n }\n\n // linter complaining about this not being a promise, but it is\n // TODO: figure out why this is not seen as a promise\n const positions = await Promise.resolve(\n this.#earnApiService.lending.getPositions(addressToUse),\n );\n\n this.update((state) => {\n state.lending.positions = positions.map((position) => ({\n ...position,\n marketId: position.market.id,\n marketAddress: position.market.address,\n protocol: position.market.protocol,\n }));\n });\n }\n\n /**\n * Refreshes the lending eligibility status for the current account.\n * Updates the eligibility status in the controller state based on the location and address blocklist for compliance.\n *\n * @param options - Optional arguments\n * @param [options.address] - The address to refresh lending eligibility for (optional).\n * @returns A promise that resolves when the eligibility status has been updated\n */\n async refreshLendingEligibility({\n address,\n }: RefreshLendingEligibilityOptions = {}): Promise<void> {\n const addressToUse = address ?? this.#getCurrentAccount()?.address;\n // TODO: this is a temporary solution to refresh lending eligibility as\n // the eligibility check is not yet implemented for lending\n // this check will check the address against the same blocklist as the\n // staking eligibility check\n\n if (!addressToUse) {\n return;\n }\n\n const { eligible: isEligible } =\n await this.#earnApiService.pooledStaking.getPooledStakingEligibility([\n addressToUse,\n ]);\n\n this.update((state) => {\n state.lending.isEligible = isEligible;\n state.pooled_staking.isEligible = isEligible;\n });\n }\n\n /**\n * Refreshes all lending related data including markets, positions, and eligibility.\n * This method allows partial success, meaning some data may update while other requests fail.\n * All errors are collected and thrown as a single error message.\n *\n * @returns A promise that resolves when all possible data has been updated\n * @throws {Error} If any of the refresh operations fail, with concatenated error messages\n */\n async refreshLendingData(): Promise<void> {\n const errors: Error[] = [];\n\n await Promise.all([\n this.refreshLendingMarkets().catch((error) => {\n errors.push(error);\n }),\n this.refreshLendingPositions().catch((error) => {\n errors.push(error);\n }),\n this.refreshLendingEligibility().catch((error) => {\n errors.push(error);\n }),\n ]);\n\n if (errors.length > 0) {\n throw new Error(\n `Failed to refresh some lending data: ${errors\n .map((e) => e.message)\n .join(', ')}`,\n );\n }\n }\n\n /**\n * Gets the lending position history for the current account.\n *\n * @param options - Optional arguments\n * @param [options.address] - The address to get lending position history for (optional).\n * @param [options.chainId] - The chain id to get lending position history for (optional).\n * @param [options.positionId] - The position id to get lending position history for.\n * @param [options.marketId] - The market id to get lending position history for.\n * @param [options.marketAddress] - The market address to get lending position history for.\n * @param [options.protocol] - The protocol to get lending position history for.\n * @param [options.days] - The number of days to get lending position history for (optional).\n * @returns A promise that resolves when the lending position history has been updated\n */\n getLendingPositionHistory({\n address,\n chainId,\n positionId,\n marketId,\n marketAddress,\n protocol,\n days = 730,\n }: {\n address?: string;\n chainId?: number;\n positionId: string;\n marketId: string;\n marketAddress: string;\n protocol: string;\n days?: number;\n }) {\n const addressToUse = address ?? this.#getCurrentAccount()?.address;\n const chainIdToUse = chainId ?? this.#getCurrentChainId();\n\n if (!addressToUse) {\n return [];\n }\n\n return this.#earnApiService.lending.getPositionHistory(\n addressToUse,\n chainIdToUse,\n protocol,\n marketId,\n marketAddress,\n positionId,\n days,\n );\n }\n\n /**\n * Gets the lending market daily apys and averages for the current chain.\n *\n * @param options - Optional arguments\n * @param [options.chainId] - The chain id to get lending market daily apys and averages for (optional).\n * @param [options.protocol] - The protocol to get lending market daily apys and averages for.\n * @param [options.marketId] - The market id to get lending market daily apys and averages for.\n * @param [options.days] - The number of days to get lending market daily apys and averages for (optional).\n * @returns A promise that resolves when the lending market daily apys and averages have been updated\n */\n getLendingMarketDailyApysAndAverages({\n chainId,\n protocol,\n marketId,\n days = 365,\n }: {\n chainId?: number;\n protocol: string;\n marketId: string;\n days?: number;\n }) {\n const chainIdToUse = chainId ?? this.#getCurrentChainId();\n return this.#earnApiService.lending.getHistoricMarketApys(\n chainIdToUse,\n protocol,\n marketId,\n days,\n );\n }\n\n /**\n * Executes a lending deposit transaction.\n *\n * @param options - The options for the lending deposit transaction.\n * @param options.amount - The amount to deposit.\n * @param options.protocol - The protocol of the lending market.\n * @param options.underlyingTokenAddress - The address of the underlying token.\n * @param options.gasOptions - The gas options for the transaction.\n * @param options.gasOptions.gasLimit - The gas limit for the transaction.\n * @param options.gasOptions.gasBufferPct - The gas buffer percentage for the transaction.\n * @param options.txOptions - The transaction options for the transaction.\n * @returns A promise that resolves to the transaction hash.\n */\n async executeLendingDeposit({\n amount,\n protocol,\n underlyingTokenAddress,\n gasOptions,\n txOptions,\n }: {\n amount: string;\n protocol: LendingMarket['protocol'];\n underlyingTokenAddress: string;\n gasOptions: {\n gasLimit?: GasLimitParams;\n gasBufferPct?: number;\n };\n txOptions: Parameters<\n typeof TransactionController.prototype.addTransaction\n >[1];\n }) {\n const address = this.#getCurrentAccount()?.address;\n\n const transactionData = await this.#earnSDK?.contracts?.lending?.[\n protocol\n ]?.[underlyingTokenAddress]?.encodeDepositTransactionData(\n amount,\n address,\n gasOptions,\n );\n\n if (!transactionData) {\n throw new Error('Transaction data not found');\n }\n if (!this.#selectedNetworkClientId) {\n throw new Error('Selected network client id not found');\n }\n\n const txHash = await this.#addTransactionFn(\n {\n ...transactionData,\n value: transactionData.value.toString(),\n chainId: toHex(this.#getCurrentChainId()),\n gasLimit: String(transactionData.gasLimit),\n },\n {\n ...txOptions,\n networkClientId: this.#selectedNetworkClientId,\n },\n );\n\n return txHash;\n }\n\n /**\n * Executes a lending withdraw transaction.\n *\n * @param options - The options for the lending withdraw transaction.\n * @param options.amount - The amount to withdraw.\n * @param options.protocol - The protocol of the lending market.\n * @param options.underlyingTokenAddress - The address of the underlying token.\n * @param options.gasOptions - The gas options for the transaction.\n * @param options.gasOptions.gasLimit - The gas limit for the transaction.\n * @param options.gasOptions.gasBufferPct - The gas buffer percentage for the transaction.\n * @param options.txOptions - The transaction options for the transaction.\n * @returns A promise that resolves to the transaction hash.\n */\n async executeLendingWithdraw({\n amount,\n protocol,\n underlyingTokenAddress,\n gasOptions,\n txOptions,\n }: {\n amount: string;\n protocol: LendingMarket['protocol'];\n underlyingTokenAddress: string;\n gasOptions: {\n gasLimit?: GasLimitParams;\n gasBufferPct?: number;\n };\n txOptions: Parameters<\n typeof TransactionController.prototype.addTransaction\n >[1];\n }) {\n const address = this.#getCurrentAccount()?.address;\n\n const transactionData = await this.#earnSDK?.contracts?.lending?.[\n protocol\n ]?.[underlyingTokenAddress]?.encodeWithdrawTransactionData(\n amount,\n address,\n gasOptions,\n );\n\n if (!transactionData) {\n throw new Error('Transaction data not found');\n }\n\n if (!this.#selectedNetworkClientId) {\n throw new Error('Selected network client id not found');\n }\n\n const txHash = await this.#addTransactionFn(\n {\n ...transactionData,\n value: transactionData.value.toString(),\n chainId: toHex(this.#getCurrentChainId()),\n gasLimit: String(transactionData.gasLimit),\n },\n {\n ...txOptions,\n networkClientId: this.#selectedNetworkClientId,\n },\n );\n\n return txHash;\n }\n\n /**\n * Executes a lending token approve transaction.\n *\n * @param options - The options for the lending token approve transaction.\n * @param options.amount - The amount to approve.\n * @param options.protocol - The protocol of the lending market.\n * @param options.underlyingTokenAddress - The address of the underlying token.\n * @param options.gasOptions - The gas options for the transaction.\n * @param options.gasOptions.gasLimit - The gas limit for the transaction.\n * @param options.gasOptions.gasBufferPct - The gas buffer percentage for the transaction.\n * @param options.txOptions - The transaction options for the transaction.\n * @returns A promise that resolves to the transaction hash.\n */\n async executeLendingTokenApprove({\n protocol,\n amount,\n underlyingTokenAddress,\n gasOptions,\n txOptions,\n }: {\n protocol: LendingMarket['protocol'];\n amount: string;\n underlyingTokenAddress: string;\n gasOptions: {\n gasLimit?: GasLimitParams;\n gasBufferPct?: number;\n };\n txOptions: Parameters<\n typeof TransactionController.prototype.addTransaction\n >[1];\n }) {\n const address = this.#getCurrentAccount()?.address;\n\n const transactionData = await this.#earnSDK?.contracts?.lending?.[\n protocol\n ]?.[underlyingTokenAddress]?.encodeUnderlyingTokenApproveTransactionData(\n amount,\n address,\n gasOptions,\n );\n\n if (!transactionData) {\n throw new Error('Transaction data not found');\n }\n\n if (!this.#selectedNetworkClientId) {\n throw new Error('Selected network client id not found');\n }\n\n const txHash = await this.#addTransactionFn(\n {\n ...transactionData,\n value: transactionData.value.toString(),\n chainId: toHex(this.#getCurrentChainId()),\n gasLimit: String(transactionData.gasLimit),\n },\n {\n ...txOptions,\n networkClientId: this.#selectedNetworkClientId,\n },\n );\n\n return txHash;\n }\n\n /**\n * Gets the allowance for a lending token.\n *\n * @param protocol - The protocol of the lending market.\n * @param underlyingTokenAddress - The address of the underlying token.\n * @returns A promise that resolves to the allowance.\n */\n async getLendingTokenAllowance(\n protocol: LendingMarket['protocol'],\n underlyingTokenAddress: string,\n ) {\n const address = this.#getCurrentAccount()?.address;\n\n const allowance =\n await this.#earnSDK?.contracts?.lending?.[protocol]?.[\n underlyingTokenAddress\n ]?.underlyingTokenAllowance(address);\n\n return allowance;\n }\n\n /**\n * Gets the maximum withdraw amount for a lending token's output token or shares if no output token.\n *\n * @param protocol - The protocol of the lending market.\n * @param underlyingTokenAddress - The address of the underlying token.\n * @returns A promise that resolves to the maximum withdraw amount.\n */\n async getLendingTokenMaxWithdraw(\n protocol: LendingMarket['protocol'],\n underlyingTokenAddress: string,\n ) {\n const address = this.#getCurrentAccount()?.address;\n\n const maxWithdraw =\n await this.#earnSDK?.contracts?.lending?.[protocol]?.[\n underlyingTokenAddress\n ]?.maxWithdraw(address);\n\n return maxWithdraw;\n }\n\n /**\n * Gets the maximum deposit amount for a lending token.\n *\n * @param protocol - The protocol of the lending market.\n * @param underlyingTokenAddress - The address of the underlying token.\n * @returns A promise that resolves to the maximum deposit amount.\n */\n async getLendingTokenMaxDeposit(\n protocol: LendingMarket['protocol'],\n underlyingTokenAddress: string,\n ) {\n const address = this.#getCurrentAccount()?.address;\n\n const maxDeposit =\n await this.#earnSDK?.contracts?.lending?.[protocol]?.[\n underlyingTokenAddress\n ]?.maxDeposit(address);\n\n return maxDeposit;\n }\n}\n"]}
package/dist/index.cjs CHANGED
@@ -1,8 +1,21 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.EarnController = exports.getDefaultEarnControllerState = exports.controllerName = void 0;
3
+ exports.selectLendingMarketsForChainId = exports.selectLendingPositionsWithMarket = exports.selectLendingMarketForProtocolAndId = exports.selectLendingMarketsByProtocolAndId = exports.selectLendingMarketsByChainId = exports.selectLendingPositionsByChainId = exports.selectLendingMarketForProtocolAndTokenAddress = exports.selectLendingMarketByProtocolAndTokenAddress = exports.selectLendingPositionsByProtocol = exports.selectLendingMarketsWithPosition = exports.selectLendingPositions = exports.selectLendingMarkets = exports.EarnController = exports.getDefaultEarnControllerState = exports.controllerName = void 0;
4
4
  var EarnController_1 = require("./EarnController.cjs");
5
5
  Object.defineProperty(exports, "controllerName", { enumerable: true, get: function () { return EarnController_1.controllerName; } });
6
6
  Object.defineProperty(exports, "getDefaultEarnControllerState", { enumerable: true, get: function () { return EarnController_1.getDefaultEarnControllerState; } });
7
7
  Object.defineProperty(exports, "EarnController", { enumerable: true, get: function () { return EarnController_1.EarnController; } });
8
+ var selectors_1 = require("./selectors.cjs");
9
+ Object.defineProperty(exports, "selectLendingMarkets", { enumerable: true, get: function () { return selectors_1.selectLendingMarkets; } });
10
+ Object.defineProperty(exports, "selectLendingPositions", { enumerable: true, get: function () { return selectors_1.selectLendingPositions; } });
11
+ Object.defineProperty(exports, "selectLendingMarketsWithPosition", { enumerable: true, get: function () { return selectors_1.selectLendingMarketsWithPosition; } });
12
+ Object.defineProperty(exports, "selectLendingPositionsByProtocol", { enumerable: true, get: function () { return selectors_1.selectLendingPositionsByProtocol; } });
13
+ Object.defineProperty(exports, "selectLendingMarketByProtocolAndTokenAddress", { enumerable: true, get: function () { return selectors_1.selectLendingMarketByProtocolAndTokenAddress; } });
14
+ Object.defineProperty(exports, "selectLendingMarketForProtocolAndTokenAddress", { enumerable: true, get: function () { return selectors_1.selectLendingMarketForProtocolAndTokenAddress; } });
15
+ Object.defineProperty(exports, "selectLendingPositionsByChainId", { enumerable: true, get: function () { return selectors_1.selectLendingPositionsByChainId; } });
16
+ Object.defineProperty(exports, "selectLendingMarketsByChainId", { enumerable: true, get: function () { return selectors_1.selectLendingMarketsByChainId; } });
17
+ Object.defineProperty(exports, "selectLendingMarketsByProtocolAndId", { enumerable: true, get: function () { return selectors_1.selectLendingMarketsByProtocolAndId; } });
18
+ Object.defineProperty(exports, "selectLendingMarketForProtocolAndId", { enumerable: true, get: function () { return selectors_1.selectLendingMarketForProtocolAndId; } });
19
+ Object.defineProperty(exports, "selectLendingPositionsWithMarket", { enumerable: true, get: function () { return selectors_1.selectLendingPositionsWithMarket; } });
20
+ Object.defineProperty(exports, "selectLendingMarketsForChainId", { enumerable: true, get: function () { return selectors_1.selectLendingMarketsForChainId; } });
8
21
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAYA,uDAI0B;AAHxB,gHAAA,cAAc,OAAA;AACd,+HAAA,6BAA6B,OAAA;AAC7B,gHAAA,cAAc,OAAA","sourcesContent":["export type {\n PooledStakingState,\n StablecoinLendingState,\n StablecoinVault,\n EarnControllerState,\n EarnControllerGetStateAction,\n EarnControllerStateChangeEvent,\n EarnControllerActions,\n EarnControllerEvents,\n EarnControllerMessenger,\n} from './EarnController';\n\nexport {\n controllerName,\n getDefaultEarnControllerState,\n EarnController,\n} from './EarnController';\n"]}
1
+ {"version":3,"file":"index.cjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAcA,uDAI0B;AAHxB,gHAAA,cAAc,OAAA;AACd,+HAAA,6BAA6B,OAAA;AAC7B,gHAAA,cAAc,OAAA;AAGhB,6CAaqB;AAZnB,iHAAA,oBAAoB,OAAA;AACpB,mHAAA,sBAAsB,OAAA;AACtB,6HAAA,gCAAgC,OAAA;AAChC,6HAAA,gCAAgC,OAAA;AAChC,yIAAA,4CAA4C,OAAA;AAC5C,0IAAA,6CAA6C,OAAA;AAC7C,4HAAA,+BAA+B,OAAA;AAC/B,0HAAA,6BAA6B,OAAA;AAC7B,gIAAA,mCAAmC,OAAA;AACnC,gIAAA,mCAAmC,OAAA;AACnC,6HAAA,gCAAgC,OAAA;AAChC,2HAAA,8BAA8B,OAAA","sourcesContent":["export type {\n PooledStakingState,\n LendingState,\n LendingMarketWithPosition,\n LendingPositionWithMarket,\n LendingPositionWithMarketReference,\n EarnControllerState,\n EarnControllerGetStateAction,\n EarnControllerStateChangeEvent,\n EarnControllerActions,\n EarnControllerEvents,\n EarnControllerMessenger,\n} from './EarnController';\n\nexport {\n controllerName,\n getDefaultEarnControllerState,\n EarnController,\n} from './EarnController';\n\nexport {\n selectLendingMarkets,\n selectLendingPositions,\n selectLendingMarketsWithPosition,\n selectLendingPositionsByProtocol,\n selectLendingMarketByProtocolAndTokenAddress,\n selectLendingMarketForProtocolAndTokenAddress,\n selectLendingPositionsByChainId,\n selectLendingMarketsByChainId,\n selectLendingMarketsByProtocolAndId,\n selectLendingMarketForProtocolAndId,\n selectLendingPositionsWithMarket,\n selectLendingMarketsForChainId,\n} from './selectors';\n"]}
package/dist/index.d.cts CHANGED
@@ -1,3 +1,4 @@
1
- export type { PooledStakingState, StablecoinLendingState, StablecoinVault, EarnControllerState, EarnControllerGetStateAction, EarnControllerStateChangeEvent, EarnControllerActions, EarnControllerEvents, EarnControllerMessenger, } from "./EarnController.cjs";
1
+ export type { PooledStakingState, LendingState, LendingMarketWithPosition, LendingPositionWithMarket, LendingPositionWithMarketReference, EarnControllerState, EarnControllerGetStateAction, EarnControllerStateChangeEvent, EarnControllerActions, EarnControllerEvents, EarnControllerMessenger, } from "./EarnController.cjs";
2
2
  export { controllerName, getDefaultEarnControllerState, EarnController, } from "./EarnController.cjs";
3
+ export { selectLendingMarkets, selectLendingPositions, selectLendingMarketsWithPosition, selectLendingPositionsByProtocol, selectLendingMarketByProtocolAndTokenAddress, selectLendingMarketForProtocolAndTokenAddress, selectLendingPositionsByChainId, selectLendingMarketsByChainId, selectLendingMarketsByProtocolAndId, selectLendingMarketForProtocolAndId, selectLendingPositionsWithMarket, selectLendingMarketsForChainId, } from "./selectors.cjs";
3
4
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,EACf,mBAAmB,EACnB,4BAA4B,EAC5B,8BAA8B,EAC9B,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,GACxB,6BAAyB;AAE1B,OAAO,EACL,cAAc,EACd,6BAA6B,EAC7B,cAAc,GACf,6BAAyB"}
1
+ {"version":3,"file":"index.d.cts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,yBAAyB,EACzB,yBAAyB,EACzB,kCAAkC,EAClC,mBAAmB,EACnB,4BAA4B,EAC5B,8BAA8B,EAC9B,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,GACxB,6BAAyB;AAE1B,OAAO,EACL,cAAc,EACd,6BAA6B,EAC7B,cAAc,GACf,6BAAyB;AAE1B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,gCAAgC,EAChC,gCAAgC,EAChC,4CAA4C,EAC5C,6CAA6C,EAC7C,+BAA+B,EAC/B,6BAA6B,EAC7B,mCAAmC,EACnC,mCAAmC,EACnC,gCAAgC,EAChC,8BAA8B,GAC/B,wBAAoB"}
package/dist/index.d.mts CHANGED
@@ -1,3 +1,4 @@
1
- export type { PooledStakingState, StablecoinLendingState, StablecoinVault, EarnControllerState, EarnControllerGetStateAction, EarnControllerStateChangeEvent, EarnControllerActions, EarnControllerEvents, EarnControllerMessenger, } from "./EarnController.mjs";
1
+ export type { PooledStakingState, LendingState, LendingMarketWithPosition, LendingPositionWithMarket, LendingPositionWithMarketReference, EarnControllerState, EarnControllerGetStateAction, EarnControllerStateChangeEvent, EarnControllerActions, EarnControllerEvents, EarnControllerMessenger, } from "./EarnController.mjs";
2
2
  export { controllerName, getDefaultEarnControllerState, EarnController, } from "./EarnController.mjs";
3
+ export { selectLendingMarkets, selectLendingPositions, selectLendingMarketsWithPosition, selectLendingPositionsByProtocol, selectLendingMarketByProtocolAndTokenAddress, selectLendingMarketForProtocolAndTokenAddress, selectLendingPositionsByChainId, selectLendingMarketsByChainId, selectLendingMarketsByProtocolAndId, selectLendingMarketForProtocolAndId, selectLendingPositionsWithMarket, selectLendingMarketsForChainId, } from "./selectors.mjs";
3
4
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,EACf,mBAAmB,EACnB,4BAA4B,EAC5B,8BAA8B,EAC9B,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,GACxB,6BAAyB;AAE1B,OAAO,EACL,cAAc,EACd,6BAA6B,EAC7B,cAAc,GACf,6BAAyB"}
1
+ {"version":3,"file":"index.d.mts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,yBAAyB,EACzB,yBAAyB,EACzB,kCAAkC,EAClC,mBAAmB,EACnB,4BAA4B,EAC5B,8BAA8B,EAC9B,qBAAqB,EACrB,oBAAoB,EACpB,uBAAuB,GACxB,6BAAyB;AAE1B,OAAO,EACL,cAAc,EACd,6BAA6B,EAC7B,cAAc,GACf,6BAAyB;AAE1B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,gCAAgC,EAChC,gCAAgC,EAChC,4CAA4C,EAC5C,6CAA6C,EAC7C,+BAA+B,EAC/B,6BAA6B,EAC7B,mCAAmC,EACnC,mCAAmC,EACnC,gCAAgC,EAChC,8BAA8B,GAC/B,wBAAoB"}
package/dist/index.mjs CHANGED
@@ -1,2 +1,3 @@
1
1
  export { controllerName, getDefaultEarnControllerState, EarnController } from "./EarnController.mjs";
2
+ export { selectLendingMarkets, selectLendingPositions, selectLendingMarketsWithPosition, selectLendingPositionsByProtocol, selectLendingMarketByProtocolAndTokenAddress, selectLendingMarketForProtocolAndTokenAddress, selectLendingPositionsByChainId, selectLendingMarketsByChainId, selectLendingMarketsByProtocolAndId, selectLendingMarketForProtocolAndId, selectLendingPositionsWithMarket, selectLendingMarketsForChainId } from "./selectors.mjs";
2
3
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAYA,OAAO,EACL,cAAc,EACd,6BAA6B,EAC7B,cAAc,EACf,6BAAyB","sourcesContent":["export type {\n PooledStakingState,\n StablecoinLendingState,\n StablecoinVault,\n EarnControllerState,\n EarnControllerGetStateAction,\n EarnControllerStateChangeEvent,\n EarnControllerActions,\n EarnControllerEvents,\n EarnControllerMessenger,\n} from './EarnController';\n\nexport {\n controllerName,\n getDefaultEarnControllerState,\n EarnController,\n} from './EarnController';\n"]}
1
+ {"version":3,"file":"index.mjs","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAcA,OAAO,EACL,cAAc,EACd,6BAA6B,EAC7B,cAAc,EACf,6BAAyB;AAE1B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,gCAAgC,EAChC,gCAAgC,EAChC,4CAA4C,EAC5C,6CAA6C,EAC7C,+BAA+B,EAC/B,6BAA6B,EAC7B,mCAAmC,EACnC,mCAAmC,EACnC,gCAAgC,EAChC,8BAA8B,EAC/B,wBAAoB","sourcesContent":["export type {\n PooledStakingState,\n LendingState,\n LendingMarketWithPosition,\n LendingPositionWithMarket,\n LendingPositionWithMarketReference,\n EarnControllerState,\n EarnControllerGetStateAction,\n EarnControllerStateChangeEvent,\n EarnControllerActions,\n EarnControllerEvents,\n EarnControllerMessenger,\n} from './EarnController';\n\nexport {\n controllerName,\n getDefaultEarnControllerState,\n EarnController,\n} from './EarnController';\n\nexport {\n selectLendingMarkets,\n selectLendingPositions,\n selectLendingMarketsWithPosition,\n selectLendingPositionsByProtocol,\n selectLendingMarketByProtocolAndTokenAddress,\n selectLendingMarketForProtocolAndTokenAddress,\n selectLendingPositionsByChainId,\n selectLendingMarketsByChainId,\n selectLendingMarketsByProtocolAndId,\n selectLendingMarketForProtocolAndId,\n selectLendingPositionsWithMarket,\n selectLendingMarketsForChainId,\n} from './selectors';\n"]}
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.selectLendingMarketForProtocolAndTokenAddress = exports.selectLendingMarketByProtocolAndTokenAddress = exports.selectLendingPositionsByProtocol = exports.selectLendingMarketsWithPosition = exports.selectLendingPositionsByChainId = exports.selectLendingPositionsWithMarket = exports.selectLendingMarketsByChainId = exports.selectLendingMarketForProtocolAndId = exports.selectLendingMarketsByProtocolAndId = exports.selectLendingMarketsForChainId = exports.selectLendingPositions = exports.selectLendingMarkets = void 0;
4
+ const reselect_1 = require("reselect");
5
+ const selectLendingMarkets = (state) => state.lending.markets;
6
+ exports.selectLendingMarkets = selectLendingMarkets;
7
+ const selectLendingPositions = (state) => state.lending.positions;
8
+ exports.selectLendingPositions = selectLendingPositions;
9
+ const selectLendingMarketsForChainId = (chainId) => (0, reselect_1.createSelector)(exports.selectLendingMarkets, (markets) => markets.filter((market) => market.chainId === chainId));
10
+ exports.selectLendingMarketsForChainId = selectLendingMarketsForChainId;
11
+ exports.selectLendingMarketsByProtocolAndId = (0, reselect_1.createSelector)(exports.selectLendingMarkets, (markets) => {
12
+ return markets.reduce((acc, market) => {
13
+ acc[market.protocol] = acc[market.protocol] || {};
14
+ acc[market.protocol][market.id] = market;
15
+ return acc;
16
+ }, {});
17
+ });
18
+ const selectLendingMarketForProtocolAndId = (protocol, id) => (0, reselect_1.createSelector)(exports.selectLendingMarketsByProtocolAndId, (marketsByProtocolAndId) => marketsByProtocolAndId?.[protocol]?.[id]);
19
+ exports.selectLendingMarketForProtocolAndId = selectLendingMarketForProtocolAndId;
20
+ exports.selectLendingMarketsByChainId = (0, reselect_1.createSelector)(exports.selectLendingMarkets, (markets) => {
21
+ return markets.reduce((acc, market) => {
22
+ acc[market.chainId] = acc[market.chainId] || [];
23
+ acc[market.chainId].push(market);
24
+ return acc;
25
+ }, {});
26
+ });
27
+ exports.selectLendingPositionsWithMarket = (0, reselect_1.createSelector)(exports.selectLendingPositions, exports.selectLendingMarketsByProtocolAndId, (positions, marketsByProtocolAndId) => {
28
+ return positions.map((position) => {
29
+ return {
30
+ ...position,
31
+ market: marketsByProtocolAndId?.[position.protocol]?.[position.marketId],
32
+ };
33
+ });
34
+ });
35
+ exports.selectLendingPositionsByChainId = (0, reselect_1.createSelector)(exports.selectLendingPositionsWithMarket, (positionsWithMarket) => {
36
+ return positionsWithMarket.reduce((acc, position) => {
37
+ const chainId = position.market?.chainId;
38
+ if (chainId) {
39
+ acc[chainId] = acc[chainId] || [];
40
+ acc[chainId].push(position);
41
+ }
42
+ return acc;
43
+ }, {});
44
+ });
45
+ exports.selectLendingMarketsWithPosition = (0, reselect_1.createSelector)(exports.selectLendingPositionsWithMarket, (positionsWithMarket) => {
46
+ return positionsWithMarket
47
+ .filter((position) => position.market !== undefined)
48
+ .map((positionWithMarket) => {
49
+ return {
50
+ ...positionWithMarket.market,
51
+ position: {
52
+ ...positionWithMarket,
53
+ market: undefined,
54
+ },
55
+ };
56
+ });
57
+ });
58
+ exports.selectLendingPositionsByProtocol = (0, reselect_1.createSelector)(exports.selectLendingPositionsWithMarket, (positionsWithMarket) => {
59
+ return positionsWithMarket.reduce((acc, position) => {
60
+ acc[position.protocol] = acc[position.protocol] || [];
61
+ acc[position.protocol].push(position);
62
+ return acc;
63
+ }, {});
64
+ });
65
+ exports.selectLendingMarketByProtocolAndTokenAddress = (0, reselect_1.createSelector)(exports.selectLendingMarketsWithPosition, (marketsWithPosition) => {
66
+ return marketsWithPosition.reduce((acc, market) => {
67
+ if (market.underlying?.address) {
68
+ acc[market.protocol] = acc[market.protocol] || {};
69
+ acc[market.protocol][market.underlying.address] = market;
70
+ }
71
+ return acc;
72
+ }, {});
73
+ });
74
+ const selectLendingMarketForProtocolAndTokenAddress = (protocol, tokenAddress) => (0, reselect_1.createSelector)(exports.selectLendingMarketByProtocolAndTokenAddress, (marketsByProtocolAndTokenAddress) => marketsByProtocolAndTokenAddress?.[protocol]?.[tokenAddress]);
75
+ exports.selectLendingMarketForProtocolAndTokenAddress = selectLendingMarketForProtocolAndTokenAddress;
76
+ //# sourceMappingURL=selectors.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selectors.cjs","sourceRoot":"","sources":["../src/selectors.ts"],"names":[],"mappings":"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","sourcesContent":["import type { LendingMarket } from '@metamask/stake-sdk';\nimport { createSelector, type Selector } from 'reselect';\n\nimport type {\n EarnControllerState,\n LendingMarketWithPosition,\n LendingPositionWithMarket,\n} from './EarnController';\n\nexport const selectLendingMarkets = (state: EarnControllerState) =>\n state.lending.markets;\n\nexport const selectLendingPositions = (state: EarnControllerState) =>\n state.lending.positions;\n\nexport const selectLendingMarketsForChainId = (chainId: number) =>\n createSelector(selectLendingMarkets, (markets) =>\n markets.filter((market) => market.chainId === chainId),\n );\n\nexport const selectLendingMarketsByProtocolAndId = createSelector(\n selectLendingMarkets,\n (markets) => {\n return markets.reduce(\n (acc, market) => {\n acc[market.protocol] = acc[market.protocol] || {};\n acc[market.protocol][market.id] = market;\n return acc;\n },\n {} as Record<string, Record<string, LendingMarket>>,\n );\n },\n);\n\nexport const selectLendingMarketForProtocolAndId = (\n protocol: string,\n id: string,\n) =>\n createSelector(\n selectLendingMarketsByProtocolAndId,\n (marketsByProtocolAndId) => marketsByProtocolAndId?.[protocol]?.[id],\n );\n\nexport const selectLendingMarketsByChainId = createSelector(\n selectLendingMarkets,\n (markets) => {\n return markets.reduce(\n (acc, market) => {\n acc[market.chainId] = acc[market.chainId] || [];\n acc[market.chainId].push(market);\n return acc;\n },\n {} as Record<number, LendingMarket[]>,\n );\n },\n);\n\nexport const selectLendingPositionsWithMarket = createSelector(\n selectLendingPositions,\n selectLendingMarketsByProtocolAndId,\n (positions, marketsByProtocolAndId): LendingPositionWithMarket[] => {\n return positions.map((position) => {\n return {\n ...position,\n market:\n marketsByProtocolAndId?.[position.protocol]?.[position.marketId],\n };\n });\n },\n);\n\nexport const selectLendingPositionsByChainId = createSelector(\n selectLendingPositionsWithMarket,\n (positionsWithMarket) => {\n return positionsWithMarket.reduce(\n (acc, position) => {\n const chainId = position.market?.chainId;\n if (chainId) {\n acc[chainId] = acc[chainId] || [];\n acc[chainId].push(position);\n }\n return acc;\n },\n {} as Record<number, LendingPositionWithMarket[]>,\n );\n },\n);\n\nexport const selectLendingMarketsWithPosition: Selector<\n EarnControllerState,\n LendingMarketWithPosition[]\n> = createSelector(selectLendingPositionsWithMarket, (positionsWithMarket) => {\n return positionsWithMarket\n .filter(\n (\n position,\n ): position is LendingPositionWithMarket & {\n market: NonNullable<LendingPositionWithMarket['market']>;\n } => position.market !== undefined,\n )\n .map((positionWithMarket) => {\n return {\n ...positionWithMarket.market,\n position: {\n ...positionWithMarket,\n market: undefined,\n },\n };\n });\n});\n\nexport const selectLendingPositionsByProtocol = createSelector(\n selectLendingPositionsWithMarket,\n (positionsWithMarket) => {\n return positionsWithMarket.reduce(\n (acc, position) => {\n acc[position.protocol] = acc[position.protocol] || [];\n acc[position.protocol].push(position);\n return acc;\n },\n {} as Record<string, LendingPositionWithMarket[]>,\n );\n },\n);\n\nexport const selectLendingMarketByProtocolAndTokenAddress = createSelector(\n selectLendingMarketsWithPosition,\n (marketsWithPosition) => {\n return marketsWithPosition.reduce(\n (acc, market) => {\n if (market.underlying?.address) {\n acc[market.protocol] = acc[market.protocol] || {};\n acc[market.protocol][market.underlying.address] = market;\n }\n return acc;\n },\n {} as Record<string, Record<string, LendingMarketWithPosition>>,\n );\n },\n);\n\nexport const selectLendingMarketForProtocolAndTokenAddress = (\n protocol: string,\n tokenAddress: string,\n) =>\n createSelector(\n selectLendingMarketByProtocolAndTokenAddress,\n (marketsByProtocolAndTokenAddress) =>\n marketsByProtocolAndTokenAddress?.[protocol]?.[tokenAddress],\n );\n"]}