Skip to content

feat: MUSD-248 create money-account-balance-service#8428

Merged
Matt561 merged 21 commits intomainfrom
feat/musd-248-create-money-account-balance-service
Apr 14, 2026
Merged

feat: MUSD-248 create money-account-balance-service#8428
Matt561 merged 21 commits intomainfrom
feat/musd-248-create-money-account-balance-service

Conversation

@Matt561
Copy link
Copy Markdown
Contributor

@Matt561 Matt561 commented Apr 10, 2026

Explanation

Adds MoneyAccountBalanceService to @metamask/money-account-controller to support the MetaMask Money feature (mUSD stablecoin and musdSHFvd Veda vault shares). The service exposes five messenger actions: fetching mUSD and musdSHFvd ERC-20 balances via RPC, reading the Veda Accountant contract exchange rate, computing mUSD-equivalent vault share value, and fetching vault APY from Veda's Seven Seas REST API. All on-chain reads use @ethersproject/contracts with a Web3Provider resolved through NetworkController messenger actions.

Key design decisions

  • TanStack Query caching: RPC calls use a 30-second staleTime; the Veda APY endpoint uses 5 minutes. getMusdEquivalentValue delegates to the two underlying cached queries and performs BigInt arithmetic over cached results rather than issuing its own fetchQuery, avoiding cache coordination issues.
  • VedaResponseValidationError excluded from retry policy: Malformed API responses are a deterministic failure — retrying them wastes quota. A custom error class signals the service policy to skip retry for validation failures.
  • Loose Superstruct validation: The Veda APY schema uses type() rather than object() so unknown fields don't cause validation failures, guarding against future API additions without breaking the service.
  • @metamask/utils promoted to production dependency: Previously a dev dependency, it is now required at runtime for hex/BigInt utilities used in balance and exchange rate computation.

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
  • I've introduced breaking changes in this PR and have prepared draft pull requests for clients and consumer packages to resolve them

Note

Medium Risk
Adds a new cached data service that performs on-chain RPC reads and external REST fetches; correctness and error-handling/caching behavior could impact displayed balances/APY, but changes are largely additive and isolated to a new package.

Overview
Introduces a new package, @metamask/money-account-balance-service, implementing MoneyAccountBalanceService (a BaseDataService) that exposes messenger actions to fetch mUSD and vault-share ERC-20 balances, read the Veda Accountant exchange rate, compute mUSD-equivalent vault-share value, and fetch/normalize vault APY from Veda’s Seven Seas REST API (with Superstruct response validation and a non-retryable VedaResponseValidationError).

Wires the new package into repo metadata (adds to README package list/dependency graph, CODEOWNERS, teams.json, and yarn.lock) and includes full package scaffolding (build/test/typedoc configs, changelog, and extensive Jest coverage including caching and error-path behavior).

Reviewed by Cursor Bugbot for commit 2deb59b. Bugbot is set up for automated code reviews on this repo. Configure here.

@Matt561
Copy link
Copy Markdown
Contributor Author

Matt561 commented Apr 10, 2026

@metamaskbot publish-previews

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.0.0-preview-aa31fa3
@metamask-previews/accounts-controller@37.2.0-preview-aa31fa3
@metamask-previews/address-book-controller@7.1.1-preview-aa31fa3
@metamask-previews/ai-controllers@0.6.3-preview-aa31fa3
@metamask-previews/analytics-controller@1.0.1-preview-aa31fa3
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-aa31fa3
@metamask-previews/announcement-controller@8.1.0-preview-aa31fa3
@metamask-previews/app-metadata-controller@2.0.1-preview-aa31fa3
@metamask-previews/approval-controller@9.0.1-preview-aa31fa3
@metamask-previews/assets-controller@5.0.0-preview-aa31fa3
@metamask-previews/assets-controllers@103.1.1-preview-aa31fa3
@metamask-previews/base-controller@9.0.1-preview-aa31fa3
@metamask-previews/base-data-service@0.1.1-preview-aa31fa3
@metamask-previews/bridge-controller@70.0.1-preview-aa31fa3
@metamask-previews/bridge-status-controller@70.0.5-preview-aa31fa3
@metamask-previews/build-utils@3.0.4-preview-aa31fa3
@metamask-previews/chain-agnostic-permission@1.5.0-preview-aa31fa3
@metamask-previews/claims-controller@0.5.0-preview-aa31fa3
@metamask-previews/client-controller@1.0.1-preview-aa31fa3
@metamask-previews/compliance-controller@2.0.0-preview-aa31fa3
@metamask-previews/composable-controller@12.0.1-preview-aa31fa3
@metamask-previews/config-registry-controller@0.2.0-preview-aa31fa3
@metamask-previews/connectivity-controller@0.2.0-preview-aa31fa3
@metamask-previews/controller-utils@11.20.0-preview-aa31fa3
@metamask-previews/core-backend@6.2.1-preview-aa31fa3
@metamask-previews/delegation-controller@2.1.0-preview-aa31fa3
@metamask-previews/earn-controller@11.2.1-preview-aa31fa3
@metamask-previews/eip-5792-middleware@3.0.3-preview-aa31fa3
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-aa31fa3
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-aa31fa3
@metamask-previews/ens-controller@19.1.1-preview-aa31fa3
@metamask-previews/eth-block-tracker@15.0.1-preview-aa31fa3
@metamask-previews/eth-json-rpc-middleware@23.1.1-preview-aa31fa3
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-aa31fa3
@metamask-previews/foundryup@1.0.1-preview-aa31fa3
@metamask-previews/gas-fee-controller@26.1.1-preview-aa31fa3
@metamask-previews/gator-permissions-controller@3.0.1-preview-aa31fa3
@metamask-previews/geolocation-controller@0.1.2-preview-aa31fa3
@metamask-previews/json-rpc-engine@10.2.4-preview-aa31fa3
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-aa31fa3
@metamask-previews/keyring-controller@25.2.0-preview-aa31fa3
@metamask-previews/logging-controller@8.0.1-preview-aa31fa3
@metamask-previews/message-manager@14.1.1-preview-aa31fa3
@metamask-previews/messenger@1.1.1-preview-aa31fa3
@metamask-previews/messenger-cli@0.1.0-preview-aa31fa3
@metamask-previews/money-account-controller@0.1.0-preview-aa31fa3
@metamask-previews/multichain-account-service@8.0.1-preview-aa31fa3
@metamask-previews/multichain-api-middleware@2.0.0-preview-aa31fa3
@metamask-previews/multichain-network-controller@3.0.6-preview-aa31fa3
@metamask-previews/multichain-transactions-controller@7.0.4-preview-aa31fa3
@metamask-previews/name-controller@9.1.1-preview-aa31fa3
@metamask-previews/network-controller@30.0.1-preview-aa31fa3
@metamask-previews/network-enablement-controller@5.0.2-preview-aa31fa3
@metamask-previews/notification-services-controller@23.0.1-preview-aa31fa3
@metamask-previews/permission-controller@12.3.0-preview-aa31fa3
@metamask-previews/permission-log-controller@5.1.0-preview-aa31fa3
@metamask-previews/perps-controller@3.0.0-preview-aa31fa3
@metamask-previews/phishing-controller@17.1.1-preview-aa31fa3
@metamask-previews/polling-controller@16.0.4-preview-aa31fa3
@metamask-previews/preferences-controller@23.1.0-preview-aa31fa3
@metamask-previews/profile-metrics-controller@3.1.3-preview-aa31fa3
@metamask-previews/profile-sync-controller@28.0.2-preview-aa31fa3
@metamask-previews/ramps-controller@13.1.0-preview-aa31fa3
@metamask-previews/rate-limit-controller@7.0.1-preview-aa31fa3
@metamask-previews/react-data-query@0.2.0-preview-aa31fa3
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-aa31fa3
@metamask-previews/sample-controllers@4.0.4-preview-aa31fa3
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-aa31fa3
@metamask-previews/selected-network-controller@26.1.0-preview-aa31fa3
@metamask-previews/shield-controller@5.1.1-preview-aa31fa3
@metamask-previews/signature-controller@39.1.2-preview-aa31fa3
@metamask-previews/social-controllers@0.1.0-preview-aa31fa3
@metamask-previews/storage-service@1.0.1-preview-aa31fa3
@metamask-previews/subscription-controller@6.1.2-preview-aa31fa3
@metamask-previews/transaction-controller@64.0.0-preview-aa31fa3
@metamask-previews/transaction-pay-controller@19.1.0-preview-aa31fa3
@metamask-previews/user-operation-controller@41.2.0-preview-aa31fa3

…mestamp. Vaults aren't guaranteed to have the other properties when there's no activity
@Matt561
Copy link
Copy Markdown
Contributor Author

Matt561 commented Apr 10, 2026

@metamaskbot publish-previews

@Matt561
Copy link
Copy Markdown
Contributor Author

Matt561 commented Apr 10, 2026

@metamaskbot publish-previews

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.0.0-preview-6e596eb
@metamask-previews/accounts-controller@37.2.0-preview-6e596eb
@metamask-previews/address-book-controller@7.1.1-preview-6e596eb
@metamask-previews/ai-controllers@0.6.3-preview-6e596eb
@metamask-previews/analytics-controller@1.0.1-preview-6e596eb
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-6e596eb
@metamask-previews/announcement-controller@8.1.0-preview-6e596eb
@metamask-previews/app-metadata-controller@2.0.1-preview-6e596eb
@metamask-previews/approval-controller@9.0.1-preview-6e596eb
@metamask-previews/assets-controller@5.0.0-preview-6e596eb
@metamask-previews/assets-controllers@103.1.1-preview-6e596eb
@metamask-previews/base-controller@9.0.1-preview-6e596eb
@metamask-previews/base-data-service@0.1.1-preview-6e596eb
@metamask-previews/bridge-controller@70.0.1-preview-6e596eb
@metamask-previews/bridge-status-controller@70.0.5-preview-6e596eb
@metamask-previews/build-utils@3.0.4-preview-6e596eb
@metamask-previews/chain-agnostic-permission@1.5.0-preview-6e596eb
@metamask-previews/claims-controller@0.5.0-preview-6e596eb
@metamask-previews/client-controller@1.0.1-preview-6e596eb
@metamask-previews/compliance-controller@2.0.0-preview-6e596eb
@metamask-previews/composable-controller@12.0.1-preview-6e596eb
@metamask-previews/config-registry-controller@0.2.0-preview-6e596eb
@metamask-previews/connectivity-controller@0.2.0-preview-6e596eb
@metamask-previews/controller-utils@11.20.0-preview-6e596eb
@metamask-previews/core-backend@6.2.1-preview-6e596eb
@metamask-previews/delegation-controller@2.1.0-preview-6e596eb
@metamask-previews/earn-controller@11.2.1-preview-6e596eb
@metamask-previews/eip-5792-middleware@3.0.3-preview-6e596eb
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-6e596eb
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-6e596eb
@metamask-previews/ens-controller@19.1.1-preview-6e596eb
@metamask-previews/eth-block-tracker@15.0.1-preview-6e596eb
@metamask-previews/eth-json-rpc-middleware@23.1.1-preview-6e596eb
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-6e596eb
@metamask-previews/foundryup@1.0.1-preview-6e596eb
@metamask-previews/gas-fee-controller@26.1.1-preview-6e596eb
@metamask-previews/gator-permissions-controller@3.0.1-preview-6e596eb
@metamask-previews/geolocation-controller@0.1.2-preview-6e596eb
@metamask-previews/json-rpc-engine@10.2.4-preview-6e596eb
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-6e596eb
@metamask-previews/keyring-controller@25.2.0-preview-6e596eb
@metamask-previews/logging-controller@8.0.1-preview-6e596eb
@metamask-previews/message-manager@14.1.1-preview-6e596eb
@metamask-previews/messenger@1.1.1-preview-6e596eb
@metamask-previews/messenger-cli@0.1.0-preview-6e596eb
@metamask-previews/money-account-controller@0.1.0-preview-6e596eb
@metamask-previews/multichain-account-service@8.0.1-preview-6e596eb
@metamask-previews/multichain-api-middleware@2.0.0-preview-6e596eb
@metamask-previews/multichain-network-controller@3.0.6-preview-6e596eb
@metamask-previews/multichain-transactions-controller@7.0.4-preview-6e596eb
@metamask-previews/name-controller@9.1.1-preview-6e596eb
@metamask-previews/network-controller@30.0.1-preview-6e596eb
@metamask-previews/network-enablement-controller@5.0.2-preview-6e596eb
@metamask-previews/notification-services-controller@23.0.1-preview-6e596eb
@metamask-previews/permission-controller@12.3.0-preview-6e596eb
@metamask-previews/permission-log-controller@5.1.0-preview-6e596eb
@metamask-previews/perps-controller@3.0.0-preview-6e596eb
@metamask-previews/phishing-controller@17.1.1-preview-6e596eb
@metamask-previews/polling-controller@16.0.4-preview-6e596eb
@metamask-previews/preferences-controller@23.1.0-preview-6e596eb
@metamask-previews/profile-metrics-controller@3.1.3-preview-6e596eb
@metamask-previews/profile-sync-controller@28.0.2-preview-6e596eb
@metamask-previews/ramps-controller@13.1.0-preview-6e596eb
@metamask-previews/rate-limit-controller@7.0.1-preview-6e596eb
@metamask-previews/react-data-query@0.2.0-preview-6e596eb
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-6e596eb
@metamask-previews/sample-controllers@4.0.4-preview-6e596eb
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-6e596eb
@metamask-previews/selected-network-controller@26.1.0-preview-6e596eb
@metamask-previews/shield-controller@5.1.1-preview-6e596eb
@metamask-previews/signature-controller@39.1.2-preview-6e596eb
@metamask-previews/social-controllers@0.1.0-preview-6e596eb
@metamask-previews/storage-service@1.0.1-preview-6e596eb
@metamask-previews/subscription-controller@6.1.2-preview-6e596eb
@metamask-previews/transaction-controller@64.0.0-preview-6e596eb
@metamask-previews/transaction-pay-controller@19.1.0-preview-6e596eb
@metamask-previews/user-operation-controller@41.2.0-preview-6e596eb

@Matt561 Matt561 force-pushed the feat/musd-248-create-money-account-balance-service branch from dda94fc to 9b51e57 Compare April 14, 2026 17:02
@Matt561
Copy link
Copy Markdown
Contributor Author

Matt561 commented Apr 14, 2026

@metamaskbot publish-previews

@Matt561
Copy link
Copy Markdown
Contributor Author

Matt561 commented Apr 14, 2026

@metamaskbot publish-previews

@Matt561 Matt561 marked this pull request as ready for review April 14, 2026 19:05
@Matt561 Matt561 requested a review from a team as a code owner April 14, 2026 19:05
shane-t
shane-t previously approved these changes Apr 14, 2026
Copy link
Copy Markdown

@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.

Cursor Bugbot has reviewed your changes and found 2 potential issues.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit cc71b5c. Configure here.

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.0.0-preview-cc71b5c28
@metamask-previews/accounts-controller@37.2.0-preview-cc71b5c28
@metamask-previews/address-book-controller@7.1.1-preview-cc71b5c28
@metamask-previews/ai-controllers@0.6.3-preview-cc71b5c28
@metamask-previews/analytics-controller@1.0.1-preview-cc71b5c28
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-cc71b5c28
@metamask-previews/announcement-controller@8.1.0-preview-cc71b5c28
@metamask-previews/app-metadata-controller@2.0.1-preview-cc71b5c28
@metamask-previews/approval-controller@9.0.1-preview-cc71b5c28
@metamask-previews/assets-controller@5.0.0-preview-cc71b5c28
@metamask-previews/assets-controllers@103.1.1-preview-cc71b5c28
@metamask-previews/base-controller@9.0.1-preview-cc71b5c28
@metamask-previews/base-data-service@0.1.1-preview-cc71b5c28
@metamask-previews/bridge-controller@70.0.1-preview-cc71b5c28
@metamask-previews/bridge-status-controller@70.0.5-preview-cc71b5c28
@metamask-previews/build-utils@3.0.4-preview-cc71b5c28
@metamask-previews/chain-agnostic-permission@1.5.0-preview-cc71b5c28
@metamask-previews/claims-controller@0.5.0-preview-cc71b5c28
@metamask-previews/client-controller@1.0.1-preview-cc71b5c28
@metamask-previews/compliance-controller@2.0.0-preview-cc71b5c28
@metamask-previews/composable-controller@12.0.1-preview-cc71b5c28
@metamask-previews/config-registry-controller@0.2.0-preview-cc71b5c28
@metamask-previews/connectivity-controller@0.2.0-preview-cc71b5c28
@metamask-previews/controller-utils@11.20.0-preview-cc71b5c28
@metamask-previews/core-backend@6.2.1-preview-cc71b5c28
@metamask-previews/delegation-controller@3.0.0-preview-cc71b5c28
@metamask-previews/earn-controller@12.0.0-preview-cc71b5c28
@metamask-previews/eip-5792-middleware@3.0.3-preview-cc71b5c28
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-cc71b5c28
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-cc71b5c28
@metamask-previews/ens-controller@19.1.1-preview-cc71b5c28
@metamask-previews/eth-block-tracker@15.0.1-preview-cc71b5c28
@metamask-previews/eth-json-rpc-middleware@23.1.1-preview-cc71b5c28
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-cc71b5c28
@metamask-previews/foundryup@1.0.1-preview-cc71b5c28
@metamask-previews/gas-fee-controller@26.1.1-preview-cc71b5c28
@metamask-previews/gator-permissions-controller@3.0.1-preview-cc71b5c28
@metamask-previews/geolocation-controller@0.1.2-preview-cc71b5c28
@metamask-previews/json-rpc-engine@10.2.4-preview-cc71b5c28
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-cc71b5c28
@metamask-previews/keyring-controller@25.2.0-preview-cc71b5c28
@metamask-previews/logging-controller@8.0.1-preview-cc71b5c28
@metamask-previews/message-manager@14.1.1-preview-cc71b5c28
@metamask-previews/messenger@1.1.1-preview-cc71b5c28
@metamask-previews/messenger-cli@0.1.0-preview-cc71b5c28
@metamask-previews/money-account-balance-service@0.0.0-preview-cc71b5c28
@metamask-previews/money-account-controller@0.1.0-preview-cc71b5c28
@metamask-previews/multichain-account-service@8.0.1-preview-cc71b5c28
@metamask-previews/multichain-api-middleware@2.0.0-preview-cc71b5c28
@metamask-previews/multichain-network-controller@3.0.6-preview-cc71b5c28
@metamask-previews/multichain-transactions-controller@7.0.4-preview-cc71b5c28
@metamask-previews/name-controller@9.1.1-preview-cc71b5c28
@metamask-previews/network-controller@30.0.1-preview-cc71b5c28
@metamask-previews/network-enablement-controller@5.0.2-preview-cc71b5c28
@metamask-previews/notification-services-controller@23.1.0-preview-cc71b5c28
@metamask-previews/permission-controller@12.3.0-preview-cc71b5c28
@metamask-previews/permission-log-controller@5.1.0-preview-cc71b5c28
@metamask-previews/perps-controller@3.0.0-preview-cc71b5c28
@metamask-previews/phishing-controller@17.1.1-preview-cc71b5c28
@metamask-previews/polling-controller@16.0.4-preview-cc71b5c28
@metamask-previews/preferences-controller@23.1.0-preview-cc71b5c28
@metamask-previews/profile-metrics-controller@3.1.3-preview-cc71b5c28
@metamask-previews/profile-sync-controller@28.0.2-preview-cc71b5c28
@metamask-previews/ramps-controller@13.1.0-preview-cc71b5c28
@metamask-previews/rate-limit-controller@7.0.1-preview-cc71b5c28
@metamask-previews/react-data-query@0.2.0-preview-cc71b5c28
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-cc71b5c28
@metamask-previews/sample-controllers@4.0.4-preview-cc71b5c28
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-cc71b5c28
@metamask-previews/selected-network-controller@26.1.0-preview-cc71b5c28
@metamask-previews/shield-controller@5.1.1-preview-cc71b5c28
@metamask-previews/signature-controller@39.1.2-preview-cc71b5c28
@metamask-previews/social-controllers@0.1.0-preview-cc71b5c28
@metamask-previews/storage-service@1.0.1-preview-cc71b5c28
@metamask-previews/subscription-controller@6.1.2-preview-cc71b5c28
@metamask-previews/transaction-controller@64.2.0-preview-cc71b5c28
@metamask-previews/transaction-pay-controller@19.1.1-preview-cc71b5c28
@metamask-previews/user-operation-controller@41.2.0-preview-cc71b5c28

@Matt561
Copy link
Copy Markdown
Contributor Author

Matt561 commented Apr 14, 2026

@metamaskbot publish-previews

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.0.0-preview-142edb67b
@metamask-previews/accounts-controller@37.2.0-preview-142edb67b
@metamask-previews/address-book-controller@7.1.1-preview-142edb67b
@metamask-previews/ai-controllers@0.6.3-preview-142edb67b
@metamask-previews/analytics-controller@1.0.1-preview-142edb67b
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-142edb67b
@metamask-previews/announcement-controller@8.1.0-preview-142edb67b
@metamask-previews/app-metadata-controller@2.0.1-preview-142edb67b
@metamask-previews/approval-controller@9.0.1-preview-142edb67b
@metamask-previews/assets-controller@5.0.0-preview-142edb67b
@metamask-previews/assets-controllers@103.1.1-preview-142edb67b
@metamask-previews/base-controller@9.1.0-preview-142edb67b
@metamask-previews/base-data-service@0.1.1-preview-142edb67b
@metamask-previews/bridge-controller@70.0.1-preview-142edb67b
@metamask-previews/bridge-status-controller@70.0.5-preview-142edb67b
@metamask-previews/build-utils@3.0.4-preview-142edb67b
@metamask-previews/chain-agnostic-permission@1.5.0-preview-142edb67b
@metamask-previews/claims-controller@0.5.0-preview-142edb67b
@metamask-previews/client-controller@1.0.1-preview-142edb67b
@metamask-previews/compliance-controller@2.0.0-preview-142edb67b
@metamask-previews/composable-controller@12.0.1-preview-142edb67b
@metamask-previews/config-registry-controller@0.2.0-preview-142edb67b
@metamask-previews/connectivity-controller@0.2.0-preview-142edb67b
@metamask-previews/controller-utils@11.20.0-preview-142edb67b
@metamask-previews/core-backend@6.2.1-preview-142edb67b
@metamask-previews/delegation-controller@3.0.0-preview-142edb67b
@metamask-previews/earn-controller@12.0.0-preview-142edb67b
@metamask-previews/eip-5792-middleware@3.0.3-preview-142edb67b
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-142edb67b
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-142edb67b
@metamask-previews/ens-controller@19.1.1-preview-142edb67b
@metamask-previews/eth-block-tracker@15.0.1-preview-142edb67b
@metamask-previews/eth-json-rpc-middleware@23.1.1-preview-142edb67b
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-142edb67b
@metamask-previews/foundryup@1.0.1-preview-142edb67b
@metamask-previews/gas-fee-controller@26.1.1-preview-142edb67b
@metamask-previews/gator-permissions-controller@3.0.1-preview-142edb67b
@metamask-previews/geolocation-controller@0.1.2-preview-142edb67b
@metamask-previews/json-rpc-engine@10.2.4-preview-142edb67b
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-142edb67b
@metamask-previews/keyring-controller@25.2.0-preview-142edb67b
@metamask-previews/logging-controller@8.0.1-preview-142edb67b
@metamask-previews/message-manager@14.1.1-preview-142edb67b
@metamask-previews/messenger@1.1.1-preview-142edb67b
@metamask-previews/messenger-cli@0.1.0-preview-142edb67b
@metamask-previews/money-account-balance-service@0.0.0-preview-142edb67b
@metamask-previews/money-account-controller@0.1.0-preview-142edb67b
@metamask-previews/multichain-account-service@8.0.1-preview-142edb67b
@metamask-previews/multichain-api-middleware@2.0.0-preview-142edb67b
@metamask-previews/multichain-network-controller@3.0.6-preview-142edb67b
@metamask-previews/multichain-transactions-controller@7.0.4-preview-142edb67b
@metamask-previews/name-controller@9.1.1-preview-142edb67b
@metamask-previews/network-controller@30.0.1-preview-142edb67b
@metamask-previews/network-enablement-controller@5.0.2-preview-142edb67b
@metamask-previews/notification-services-controller@23.1.0-preview-142edb67b
@metamask-previews/permission-controller@12.3.0-preview-142edb67b
@metamask-previews/permission-log-controller@5.1.0-preview-142edb67b
@metamask-previews/perps-controller@3.0.0-preview-142edb67b
@metamask-previews/phishing-controller@17.1.1-preview-142edb67b
@metamask-previews/polling-controller@16.0.4-preview-142edb67b
@metamask-previews/preferences-controller@23.1.0-preview-142edb67b
@metamask-previews/profile-metrics-controller@3.1.3-preview-142edb67b
@metamask-previews/profile-sync-controller@28.0.2-preview-142edb67b
@metamask-previews/ramps-controller@13.1.0-preview-142edb67b
@metamask-previews/rate-limit-controller@7.0.1-preview-142edb67b
@metamask-previews/react-data-query@0.2.0-preview-142edb67b
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-142edb67b
@metamask-previews/sample-controllers@4.0.4-preview-142edb67b
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-142edb67b
@metamask-previews/selected-network-controller@26.1.0-preview-142edb67b
@metamask-previews/shield-controller@5.1.1-preview-142edb67b
@metamask-previews/signature-controller@39.1.2-preview-142edb67b
@metamask-previews/social-controllers@0.1.0-preview-142edb67b
@metamask-previews/storage-service@1.0.1-preview-142edb67b
@metamask-previews/subscription-controller@6.1.2-preview-142edb67b
@metamask-previews/transaction-controller@64.2.0-preview-142edb67b
@metamask-previews/transaction-pay-controller@19.1.1-preview-142edb67b
@metamask-previews/user-operation-controller@41.2.0-preview-142edb67b

Copy link
Copy Markdown
Contributor

@mcmire mcmire left a comment

Choose a reason for hiding this comment

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

This looks pretty good. Many of the comments below are minor.


this.#config = {
...config,
vedaApiBaseUrl: config.vedaApiBaseUrl ?? VEDA_PERFORMANCE_API_BASE_URL,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

It looks like this service takes a base URL as an option. Is there a particular reason for this? We don't recommend this because it means that consumers (i.e. some other team, even) may use this class in a way that you didn't intend.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I thought this would be convenient should Veda change their URL (e.g. new version) so we could update via remote flag. I'll remove.

constructor({
messenger,
policyOptions = {},
config,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Nit: Is there a reason why you are taking a separate set of options here? We recommend that all options for your data service be in the same "options bag". It's true that messenger and policyOptions are passed to BaseDataService, but consumers don't really know that (nor should they). All options should be treated on the same level.

If you want to have a single type for all options, you could create a MoneyAccountBalanceServiceOptions type and add messenger and policyOptions to it.

Copy link
Copy Markdown
Contributor Author

@Matt561 Matt561 Apr 14, 2026

Choose a reason for hiding this comment

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

I thought the separate options bag would be more intuitive but I understand your point. I'll refactor to place all options at the same level.


const rawResponse = await response.json();

// Validate raw response inside queryFn to avoid poisoned cache.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Hmm, this is a point we didn't consider when creating the data service examples. I guess that does make sense.

* const { balance } = await service.getMusdBalance('0xYourMoneyAccount...');
* ```
*/
export class MoneyAccountBalanceService extends BaseDataService<
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Since this talks to the Veda API would it make more sense to be literal and call this VedaApiService? Or do we expect to wrap this API in the future?

Copy link
Copy Markdown
Contributor Author

@Matt561 Matt561 Apr 14, 2026

Choose a reason for hiding this comment

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

Good question. I ultimately picked this name to better convey intent/context. If it's okay, I'd prefer to leave as is for now.

*/
export function normalizeVaultApyResponse(
rawResponse: Infer<typeof VaultApyResponseStruct>,
): VaultApyResponse {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Nit: It might be confusing that VaultApyResponse and Infer<typeof VaultApyResponseStruct> are not the same thing.

Copy link
Copy Markdown
Contributor Author

@Matt561 Matt561 Apr 14, 2026

Choose a reason for hiding this comment

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

I've renamed VaultApyResponseStruct to VaultApyRawResponseStruct and VaultApyResponse to NormalizedVaultApyResponse. I'd like to differentiate between the raw response structure we get from Veda's API and our internal usage.

@@ -0,0 +1,22 @@
export {
MoneyAccountBalanceService,
serviceName as moneyAccountBalanceServiceName,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The name of the service is not conventionally exported, can you remove this?

Suggested change
serviceName as moneyAccountBalanceServiceName,

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This is something I copied from the SocialService here

I will remove though if that's preferred.

@Matt561
Copy link
Copy Markdown
Contributor Author

Matt561 commented Apr 14, 2026

@metamaskbot publish-previews

@Matt561 Matt561 requested review from mcmire and shane-t April 14, 2026 21:06
@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.0.0-preview-2deb59b44
@metamask-previews/accounts-controller@37.2.0-preview-2deb59b44
@metamask-previews/address-book-controller@7.1.1-preview-2deb59b44
@metamask-previews/ai-controllers@0.6.3-preview-2deb59b44
@metamask-previews/analytics-controller@1.0.1-preview-2deb59b44
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-2deb59b44
@metamask-previews/announcement-controller@8.1.0-preview-2deb59b44
@metamask-previews/app-metadata-controller@2.0.1-preview-2deb59b44
@metamask-previews/approval-controller@9.0.1-preview-2deb59b44
@metamask-previews/assets-controller@5.0.0-preview-2deb59b44
@metamask-previews/assets-controllers@103.1.1-preview-2deb59b44
@metamask-previews/base-controller@9.1.0-preview-2deb59b44
@metamask-previews/base-data-service@0.1.1-preview-2deb59b44
@metamask-previews/bridge-controller@70.0.1-preview-2deb59b44
@metamask-previews/bridge-status-controller@70.0.5-preview-2deb59b44
@metamask-previews/build-utils@3.0.4-preview-2deb59b44
@metamask-previews/chain-agnostic-permission@1.5.0-preview-2deb59b44
@metamask-previews/claims-controller@0.5.0-preview-2deb59b44
@metamask-previews/client-controller@1.0.1-preview-2deb59b44
@metamask-previews/compliance-controller@2.0.0-preview-2deb59b44
@metamask-previews/composable-controller@12.0.1-preview-2deb59b44
@metamask-previews/config-registry-controller@0.2.0-preview-2deb59b44
@metamask-previews/connectivity-controller@0.2.0-preview-2deb59b44
@metamask-previews/controller-utils@11.20.0-preview-2deb59b44
@metamask-previews/core-backend@6.2.1-preview-2deb59b44
@metamask-previews/delegation-controller@3.0.0-preview-2deb59b44
@metamask-previews/earn-controller@12.0.0-preview-2deb59b44
@metamask-previews/eip-5792-middleware@3.0.3-preview-2deb59b44
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-2deb59b44
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-2deb59b44
@metamask-previews/ens-controller@19.1.1-preview-2deb59b44
@metamask-previews/eth-block-tracker@15.0.1-preview-2deb59b44
@metamask-previews/eth-json-rpc-middleware@23.1.1-preview-2deb59b44
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-2deb59b44
@metamask-previews/foundryup@1.0.1-preview-2deb59b44
@metamask-previews/gas-fee-controller@26.1.1-preview-2deb59b44
@metamask-previews/gator-permissions-controller@3.0.1-preview-2deb59b44
@metamask-previews/geolocation-controller@0.1.2-preview-2deb59b44
@metamask-previews/json-rpc-engine@10.2.4-preview-2deb59b44
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-2deb59b44
@metamask-previews/keyring-controller@25.2.0-preview-2deb59b44
@metamask-previews/logging-controller@8.0.1-preview-2deb59b44
@metamask-previews/message-manager@14.1.1-preview-2deb59b44
@metamask-previews/messenger@1.1.1-preview-2deb59b44
@metamask-previews/messenger-cli@0.1.0-preview-2deb59b44
@metamask-previews/money-account-balance-service@0.0.0-preview-2deb59b44
@metamask-previews/money-account-controller@0.1.0-preview-2deb59b44
@metamask-previews/multichain-account-service@8.0.1-preview-2deb59b44
@metamask-previews/multichain-api-middleware@2.0.0-preview-2deb59b44
@metamask-previews/multichain-network-controller@3.0.6-preview-2deb59b44
@metamask-previews/multichain-transactions-controller@7.0.4-preview-2deb59b44
@metamask-previews/name-controller@9.1.1-preview-2deb59b44
@metamask-previews/network-controller@30.0.1-preview-2deb59b44
@metamask-previews/network-enablement-controller@5.0.2-preview-2deb59b44
@metamask-previews/notification-services-controller@23.1.0-preview-2deb59b44
@metamask-previews/permission-controller@12.3.0-preview-2deb59b44
@metamask-previews/permission-log-controller@5.1.0-preview-2deb59b44
@metamask-previews/perps-controller@3.0.0-preview-2deb59b44
@metamask-previews/phishing-controller@17.1.1-preview-2deb59b44
@metamask-previews/polling-controller@16.0.4-preview-2deb59b44
@metamask-previews/preferences-controller@23.1.0-preview-2deb59b44
@metamask-previews/profile-metrics-controller@3.1.3-preview-2deb59b44
@metamask-previews/profile-sync-controller@28.0.2-preview-2deb59b44
@metamask-previews/ramps-controller@13.1.0-preview-2deb59b44
@metamask-previews/rate-limit-controller@7.0.1-preview-2deb59b44
@metamask-previews/react-data-query@0.2.0-preview-2deb59b44
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-2deb59b44
@metamask-previews/sample-controllers@4.0.4-preview-2deb59b44
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-2deb59b44
@metamask-previews/selected-network-controller@26.1.0-preview-2deb59b44
@metamask-previews/shield-controller@5.1.1-preview-2deb59b44
@metamask-previews/signature-controller@39.1.2-preview-2deb59b44
@metamask-previews/social-controllers@0.1.0-preview-2deb59b44
@metamask-previews/storage-service@1.0.1-preview-2deb59b44
@metamask-previews/subscription-controller@6.1.2-preview-2deb59b44
@metamask-previews/transaction-controller@64.2.0-preview-2deb59b44
@metamask-previews/transaction-pay-controller@19.1.1-preview-2deb59b44
@metamask-previews/user-operation-controller@41.2.0-preview-2deb59b44

Copy link
Copy Markdown
Contributor

@mcmire mcmire left a comment

Choose a reason for hiding this comment

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

Two more comments, but they are non-blocking. LGTM!

Comment on lines +269 to +272
afterEach(() => {
jest.resetAllMocks();
});

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Nit: This happens in our test setup already, so this should not be necessary:

Suggested change
afterEach(() => {
jest.resetAllMocks();
});

describe('MoneyAccountBalanceService', () => {
beforeEach(() => {
MockWeb3Provider.mockImplementation(() => ({}) as unknown as Web3Provider);
nockCleanAll();
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Nit: This happens in our test setup already, so this should not be necessary:

Suggested change
nockCleanAll();

@Matt561
Copy link
Copy Markdown
Contributor Author

Matt561 commented Apr 14, 2026

Triple-checking that functionality works in Mobile before merging.

@Matt561 Matt561 added this pull request to the merge queue Apr 14, 2026
Merged via the queue into main with commit ebd81f5 Apr 14, 2026
345 checks passed
@Matt561 Matt561 deleted the feat/musd-248-create-money-account-balance-service branch April 14, 2026 22:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants