Skip to content

chore: remove usages of NetworkController:getState in EarnController #6153

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 4 commits into
base: main
Choose a base branch
from

Conversation

ameliejyc
Copy link

@ameliejyc ameliejyc commented Jul 21, 2025

Explanation

The Global Network Selector is being removed and these changes for the EarnController ensure that we are not relying on global state via NetworkController:getState. Instead, information required such as the selected network client ID or chain ID is passed in contextually.

  • Removes NetworkController:getState. Instead:
    • EarnController requires selectedNetworkClientId to be passed in when constructed and it is used in initializeSDK.
    • Optional chainId parameter with fallback to Ethereum Mainnet used in Pooled Staking data calls: refreshPooledStakingVaultApyAverages, refreshPooledStakingVaultDailyApys, refreshPooledStakingVaultMetadata and refreshPooledStakes
    • Compulsory chainId parameter required in all Lending transaction calls: executeLendingTokenApprove, executeLendingWithdraw and executeLendingDeposit
    • Compulsory chainId parameter required in Lending data calls:getLendingMarketDailyApysAndAverages andgetLendingPositionHistory. The other Lending data fetches do not require a chainId.
  • Uses NetworkController:networkDidChange rather than NetworkController:stateChange as this is a more granular and less frequent event to listen to.
  • Updates tests

References

Checklist

  • I've updated the test suite for new or updated code as appropriate
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
  • I've communicated my changes to consumers by updating changelogs for packages I've changed, highlighting breaking changes as necessary
  • I've prepared draft pull requests for clients and consumer packages to resolve any breaking changes

@ameliejyc
Copy link
Author

@metamaskbot publish-preview

@ameliejyc ameliejyc changed the title Tat 1264 mobile remove usage s of global chain id in earn experiences chore: remove usages of networkController:getState in earn controller Jul 21, 2025
Copy link
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/account-tree-controller": "0.4.0-preview-243e64f7",
  "@metamask-previews/accounts-controller": "31.0.0-preview-243e64f7",
  "@metamask-previews/address-book-controller": "6.1.1-preview-243e64f7",
  "@metamask-previews/announcement-controller": "7.0.3-preview-243e64f7",
  "@metamask-previews/app-metadata-controller": "1.0.0-preview-243e64f7",
  "@metamask-previews/approval-controller": "7.1.3-preview-243e64f7",
  "@metamask-previews/assets-controllers": "72.0.0-preview-243e64f7",
  "@metamask-previews/base-controller": "8.0.1-preview-243e64f7",
  "@metamask-previews/bridge-controller": "36.1.0-preview-243e64f7",
  "@metamask-previews/bridge-status-controller": "36.0.0-preview-243e64f7",
  "@metamask-previews/build-utils": "3.0.3-preview-243e64f7",
  "@metamask-previews/chain-agnostic-permission": "1.0.0-preview-243e64f7",
  "@metamask-previews/composable-controller": "11.0.0-preview-243e64f7",
  "@metamask-previews/controller-utils": "11.11.0-preview-243e64f7",
  "@metamask-previews/delegation-controller": "0.5.0-preview-243e64f7",
  "@metamask-previews/earn-controller": "3.0.0-preview-243e64f7",
  "@metamask-previews/eip1193-permission-middleware": "1.0.0-preview-243e64f7",
  "@metamask-previews/ens-controller": "17.0.1-preview-243e64f7",
  "@metamask-previews/error-reporting-service": "2.0.0-preview-243e64f7",
  "@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-243e64f7",
  "@metamask-previews/foundryup": "1.0.0-preview-243e64f7",
  "@metamask-previews/gas-fee-controller": "24.0.0-preview-243e64f7",
  "@metamask-previews/json-rpc-engine": "10.0.3-preview-243e64f7",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-243e64f7",
  "@metamask-previews/keyring-controller": "22.1.0-preview-243e64f7",
  "@metamask-previews/logging-controller": "6.0.4-preview-243e64f7",
  "@metamask-previews/message-manager": "12.0.2-preview-243e64f7",
  "@metamask-previews/messenger": "0.0.0-preview-243e64f7",
  "@metamask-previews/multichain-api-middleware": "1.0.0-preview-243e64f7",
  "@metamask-previews/multichain-network-controller": "0.10.0-preview-243e64f7",
  "@metamask-previews/multichain-transactions-controller": "3.0.0-preview-243e64f7",
  "@metamask-previews/name-controller": "8.0.3-preview-243e64f7",
  "@metamask-previews/network-controller": "24.0.0-preview-243e64f7",
  "@metamask-previews/notification-services-controller": "14.0.0-preview-243e64f7",
  "@metamask-previews/permission-controller": "11.0.6-preview-243e64f7",
  "@metamask-previews/permission-log-controller": "3.0.3-preview-243e64f7",
  "@metamask-previews/phishing-controller": "13.1.0-preview-243e64f7",
  "@metamask-previews/polling-controller": "14.0.0-preview-243e64f7",
  "@metamask-previews/preferences-controller": "18.4.1-preview-243e64f7",
  "@metamask-previews/profile-sync-controller": "21.0.0-preview-243e64f7",
  "@metamask-previews/rate-limit-controller": "6.0.3-preview-243e64f7",
  "@metamask-previews/remote-feature-flag-controller": "1.6.0-preview-243e64f7",
  "@metamask-previews/sample-controllers": "1.0.0-preview-243e64f7",
  "@metamask-previews/seedless-onboarding-controller": "2.1.0-preview-243e64f7",
  "@metamask-previews/selected-network-controller": "23.0.0-preview-243e64f7",
  "@metamask-previews/signature-controller": "31.0.1-preview-243e64f7",
  "@metamask-previews/token-search-discovery-controller": "3.3.0-preview-243e64f7",
  "@metamask-previews/transaction-controller": "58.1.1-preview-243e64f7",
  "@metamask-previews/user-operation-controller": "37.0.0-preview-243e64f7"
}

@ameliejyc ameliejyc changed the title chore: remove usages of networkController:getState in earn controller chore: remove usages of NetworkController:getState in earn controller Jul 21, 2025
@ameliejyc ameliejyc changed the title chore: remove usages of NetworkController:getState in earn controller chore: remove usages of NetworkController:getState in EarnController Jul 21, 2025
@ameliejyc ameliejyc force-pushed the TAT-1264-mobile-remove-usage-s-of-global-chain-id-in-earn-experiences branch from 243e64f to 8886aa1 Compare July 21, 2025 12:53
Comment on lines +333 to +337
// refresh pooled staking data
this.refreshPooledStakingVaultMetadata().catch(console.error);
this.refreshPooledStakingVaultDailyApys().catch(console.error);
this.refreshPooledStakingVaultApyAverages().catch(console.error);
this.refreshPooledStakes().catch(console.error);
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I've left these calls the same here but I don't know if it brings much value to refresh PS data on each network change given PS isn't multi-chain? For the Lending calls below it seems to make more sense.

@ameliejyc ameliejyc force-pushed the TAT-1264-mobile-remove-usage-s-of-global-chain-id-in-earn-experiences branch from 8886aa1 to 6a9a827 Compare July 21, 2025 13:16
@ameliejyc
Copy link
Author

@metamaskbot publish-preview

Copy link
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/account-tree-controller": "0.5.0-preview-6a9a827",
  "@metamask-previews/accounts-controller": "31.0.0-preview-6a9a827",
  "@metamask-previews/address-book-controller": "6.1.1-preview-6a9a827",
  "@metamask-previews/announcement-controller": "7.0.3-preview-6a9a827",
  "@metamask-previews/app-metadata-controller": "1.0.0-preview-6a9a827",
  "@metamask-previews/approval-controller": "7.1.3-preview-6a9a827",
  "@metamask-previews/assets-controllers": "72.0.0-preview-6a9a827",
  "@metamask-previews/base-controller": "8.0.1-preview-6a9a827",
  "@metamask-previews/bridge-controller": "36.1.0-preview-6a9a827",
  "@metamask-previews/bridge-status-controller": "36.0.0-preview-6a9a827",
  "@metamask-previews/build-utils": "3.0.3-preview-6a9a827",
  "@metamask-previews/chain-agnostic-permission": "1.0.0-preview-6a9a827",
  "@metamask-previews/composable-controller": "11.0.0-preview-6a9a827",
  "@metamask-previews/controller-utils": "11.11.0-preview-6a9a827",
  "@metamask-previews/delegation-controller": "0.5.0-preview-6a9a827",
  "@metamask-previews/earn-controller": "3.0.0-preview-6a9a827",
  "@metamask-previews/eip1193-permission-middleware": "1.0.0-preview-6a9a827",
  "@metamask-previews/ens-controller": "17.0.1-preview-6a9a827",
  "@metamask-previews/error-reporting-service": "2.0.0-preview-6a9a827",
  "@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-6a9a827",
  "@metamask-previews/foundryup": "1.0.0-preview-6a9a827",
  "@metamask-previews/gas-fee-controller": "24.0.0-preview-6a9a827",
  "@metamask-previews/json-rpc-engine": "10.0.3-preview-6a9a827",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-6a9a827",
  "@metamask-previews/keyring-controller": "22.1.0-preview-6a9a827",
  "@metamask-previews/logging-controller": "6.0.4-preview-6a9a827",
  "@metamask-previews/message-manager": "12.0.2-preview-6a9a827",
  "@metamask-previews/messenger": "0.0.0-preview-6a9a827",
  "@metamask-previews/multichain-account-service": "0.0.0-preview-6a9a827",
  "@metamask-previews/multichain-api-middleware": "1.0.0-preview-6a9a827",
  "@metamask-previews/multichain-network-controller": "0.10.0-preview-6a9a827",
  "@metamask-previews/multichain-transactions-controller": "3.0.0-preview-6a9a827",
  "@metamask-previews/name-controller": "8.0.3-preview-6a9a827",
  "@metamask-previews/network-controller": "24.0.1-preview-6a9a827",
  "@metamask-previews/notification-services-controller": "14.0.0-preview-6a9a827",
  "@metamask-previews/permission-controller": "11.0.6-preview-6a9a827",
  "@metamask-previews/permission-log-controller": "3.0.3-preview-6a9a827",
  "@metamask-previews/phishing-controller": "13.1.0-preview-6a9a827",
  "@metamask-previews/polling-controller": "14.0.0-preview-6a9a827",
  "@metamask-previews/preferences-controller": "18.4.1-preview-6a9a827",
  "@metamask-previews/profile-sync-controller": "21.0.0-preview-6a9a827",
  "@metamask-previews/rate-limit-controller": "6.0.3-preview-6a9a827",
  "@metamask-previews/remote-feature-flag-controller": "1.6.0-preview-6a9a827",
  "@metamask-previews/sample-controllers": "1.0.0-preview-6a9a827",
  "@metamask-previews/seedless-onboarding-controller": "2.3.0-preview-6a9a827",
  "@metamask-previews/selected-network-controller": "23.0.0-preview-6a9a827",
  "@metamask-previews/signature-controller": "31.0.1-preview-6a9a827",
  "@metamask-previews/token-search-discovery-controller": "3.3.0-preview-6a9a827",
  "@metamask-previews/transaction-controller": "58.1.1-preview-6a9a827",
  "@metamask-previews/user-operation-controller": "37.0.0-preview-6a9a827"
}

@ameliejyc ameliejyc force-pushed the TAT-1264-mobile-remove-usage-s-of-global-chain-id-in-earn-experiences branch from 7853624 to d05158e Compare July 22, 2025 09:56
@ameliejyc
Copy link
Author

@metamaskbot publish-preview

Copy link
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/account-tree-controller": "0.5.0-preview-d05158e7",
  "@metamask-previews/accounts-controller": "31.0.0-preview-d05158e7",
  "@metamask-previews/address-book-controller": "6.1.1-preview-d05158e7",
  "@metamask-previews/announcement-controller": "7.0.3-preview-d05158e7",
  "@metamask-previews/app-metadata-controller": "1.0.0-preview-d05158e7",
  "@metamask-previews/approval-controller": "7.1.3-preview-d05158e7",
  "@metamask-previews/assets-controllers": "72.0.0-preview-d05158e7",
  "@metamask-previews/base-controller": "8.0.1-preview-d05158e7",
  "@metamask-previews/bridge-controller": "36.1.0-preview-d05158e7",
  "@metamask-previews/bridge-status-controller": "36.0.0-preview-d05158e7",
  "@metamask-previews/build-utils": "3.0.3-preview-d05158e7",
  "@metamask-previews/chain-agnostic-permission": "1.0.0-preview-d05158e7",
  "@metamask-previews/composable-controller": "11.0.0-preview-d05158e7",
  "@metamask-previews/controller-utils": "11.11.0-preview-d05158e7",
  "@metamask-previews/delegation-controller": "0.5.0-preview-d05158e7",
  "@metamask-previews/earn-controller": "3.0.0-preview-d05158e7",
  "@metamask-previews/eip1193-permission-middleware": "1.0.0-preview-d05158e7",
  "@metamask-previews/ens-controller": "17.0.1-preview-d05158e7",
  "@metamask-previews/error-reporting-service": "2.0.0-preview-d05158e7",
  "@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-d05158e7",
  "@metamask-previews/foundryup": "1.0.0-preview-d05158e7",
  "@metamask-previews/gas-fee-controller": "24.0.0-preview-d05158e7",
  "@metamask-previews/json-rpc-engine": "10.0.3-preview-d05158e7",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-d05158e7",
  "@metamask-previews/keyring-controller": "22.1.0-preview-d05158e7",
  "@metamask-previews/logging-controller": "6.0.4-preview-d05158e7",
  "@metamask-previews/message-manager": "12.0.2-preview-d05158e7",
  "@metamask-previews/messenger": "0.0.0-preview-d05158e7",
  "@metamask-previews/multichain-account-service": "0.0.0-preview-d05158e7",
  "@metamask-previews/multichain-api-middleware": "1.0.0-preview-d05158e7",
  "@metamask-previews/multichain-network-controller": "0.10.0-preview-d05158e7",
  "@metamask-previews/multichain-transactions-controller": "3.0.0-preview-d05158e7",
  "@metamask-previews/name-controller": "8.0.3-preview-d05158e7",
  "@metamask-previews/network-controller": "24.0.1-preview-d05158e7",
  "@metamask-previews/notification-services-controller": "14.0.0-preview-d05158e7",
  "@metamask-previews/permission-controller": "11.0.6-preview-d05158e7",
  "@metamask-previews/permission-log-controller": "3.0.3-preview-d05158e7",
  "@metamask-previews/phishing-controller": "13.1.0-preview-d05158e7",
  "@metamask-previews/polling-controller": "14.0.0-preview-d05158e7",
  "@metamask-previews/preferences-controller": "18.4.1-preview-d05158e7",
  "@metamask-previews/profile-sync-controller": "21.0.0-preview-d05158e7",
  "@metamask-previews/rate-limit-controller": "6.0.3-preview-d05158e7",
  "@metamask-previews/remote-feature-flag-controller": "1.6.0-preview-d05158e7",
  "@metamask-previews/sample-controllers": "1.0.0-preview-d05158e7",
  "@metamask-previews/seedless-onboarding-controller": "2.3.0-preview-d05158e7",
  "@metamask-previews/selected-network-controller": "23.0.0-preview-d05158e7",
  "@metamask-previews/signature-controller": "31.0.1-preview-d05158e7",
  "@metamask-previews/token-search-discovery-controller": "3.3.0-preview-d05158e7",
  "@metamask-previews/transaction-controller": "58.1.1-preview-d05158e7",
  "@metamask-previews/user-operation-controller": "37.0.0-preview-d05158e7"
}

Copy link

@cursor cursor bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: Chain ID Typing Mismatch Causes Hex Conversion Errors

Type inconsistency in executeLendingDeposit, executeLendingWithdraw, and executeLendingTokenApprove methods. The chainId parameter is typed as string but is passed to toHex(), which expects a number. This can lead to incorrect behavior if chainId is already a hex string (e.g., '0x1'). The chainId parameter should either be typed as number, or the toHex() call should be removed.

packages/earn-controller/src/EarnController.ts#L872-L928

*/
async executeLendingDeposit({
amount,
chainId,
protocol,
underlyingTokenAddress,
gasOptions,
txOptions,
}: {
amount: string;
chainId: string;
protocol: LendingMarket['protocol'];
underlyingTokenAddress: string;
gasOptions: {
gasLimit?: GasLimitParams;
gasBufferPct?: number;
};
txOptions: Parameters<
typeof TransactionController.prototype.addTransaction
>[1];
}) {
const address = this.#getCurrentAccount()?.address;
const transactionData = await this.#earnSDK?.contracts?.lending?.[
protocol
]?.[underlyingTokenAddress]?.encodeDepositTransactionData(
amount,
address,
gasOptions,
);
if (!transactionData) {
throw new Error('Transaction data not found');
}
if (!this.#selectedNetworkClientId) {
throw new Error('Selected network client id not found');
}
const gasLimit = !transactionData.gasLimit
? undefined
: toHex(transactionData.gasLimit);
const txHash = await this.#addTransactionFn(
{
...transactionData,
value: transactionData.value.toString(),
chainId: toHex(chainId),
gasLimit,
},
{
...txOptions,
networkClientId: this.#selectedNetworkClientId,
},
);
return txHash;
}

packages/earn-controller/src/EarnController.ts#L943-L999

*/
async executeLendingWithdraw({
amount,
chainId,
protocol,
underlyingTokenAddress,
gasOptions,
txOptions,
}: {
amount: string;
chainId: string;
protocol: LendingMarket['protocol'];
underlyingTokenAddress: string;
gasOptions: {
gasLimit?: GasLimitParams;
gasBufferPct?: number;
};
txOptions: Parameters<
typeof TransactionController.prototype.addTransaction
>[1];
}) {
const address = this.#getCurrentAccount()?.address;
const transactionData = await this.#earnSDK?.contracts?.lending?.[
protocol
]?.[underlyingTokenAddress]?.encodeWithdrawTransactionData(
amount,
address,
gasOptions,
);
if (!transactionData) {
throw new Error('Transaction data not found');
}
if (!this.#selectedNetworkClientId) {
throw new Error('Selected network client id not found');
}
const gasLimit = !transactionData.gasLimit
? undefined
: toHex(transactionData.gasLimit);
const txHash = await this.#addTransactionFn(
{
...transactionData,
value: transactionData.value.toString(),
chainId: toHex(chainId),
gasLimit,
},
{
...txOptions,
networkClientId: this.#selectedNetworkClientId,
},
);
return txHash;

packages/earn-controller/src/EarnController.ts#L1015-L1071

*/
async executeLendingTokenApprove({
protocol,
amount,
chainId,
underlyingTokenAddress,
gasOptions,
txOptions,
}: {
protocol: LendingMarket['protocol'];
amount: string;
chainId: string;
underlyingTokenAddress: string;
gasOptions: {
gasLimit?: GasLimitParams;
gasBufferPct?: number;
};
txOptions: Parameters<
typeof TransactionController.prototype.addTransaction
>[1];
}) {
const address = this.#getCurrentAccount()?.address;
const transactionData = await this.#earnSDK?.contracts?.lending?.[
protocol
]?.[underlyingTokenAddress]?.encodeUnderlyingTokenApproveTransactionData(
amount,
address,
gasOptions,
);
if (!transactionData) {
throw new Error('Transaction data not found');
}
if (!this.#selectedNetworkClientId) {
throw new Error('Selected network client id not found');
}
const gasLimit = !transactionData.gasLimit
? undefined
: toHex(transactionData.gasLimit);
const txHash = await this.#addTransactionFn(
{
...transactionData,
value: transactionData.value.toString(),
chainId: toHex(chainId),
gasLimit,
},
{
...txOptions,
networkClientId: this.#selectedNetworkClientId,
},
);
return txHash;

Fix in CursorFix in Web


Bug: Redundant API Calls in Loop

The refreshEarnEligibility() method is redundantly called inside the refreshPooledStakingData() loop for each supported chain. As this method performs a global, address-based eligibility check independent of chain ID, these multiple calls cause unnecessary API requests, performance overhead, and potential race conditions. It should be called once outside the loop.

packages/earn-controller/src/EarnController.ts#L636-L657

for (const chainId of this.#supportedPooledStakingChains) {
await Promise.all([
this.refreshPooledStakes({ resetCache, address, chainId }).catch(
(error) => {
errors.push(error);
},
),
this.refreshEarnEligibility({ address }).catch((error) => {
errors.push(error);
}),
this.refreshPooledStakingVaultMetadata(chainId).catch((error) => {
errors.push(error);
}),
this.refreshPooledStakingVaultDailyApys(chainId).catch((error) => {
errors.push(error);
}),
this.refreshPooledStakingVaultApyAverages(chainId).catch((error) => {
errors.push(error);
}),
]);
}

Fix in CursorFix in Web


Was this report helpful? Give feedback by reacting with 👍 or 👎

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant