Skip to content

feat(profile-metrics-controller): add batched proof-of-ownership signing - #10142

Draft
hmalik88 wants to merge 4 commits into
mainfrom
hm/mul-2185
Draft

feat(profile-metrics-controller): add batched proof-of-ownership signing#10142
hmalik88 wants to merge 4 commits into
mainfrom
hm/mul-2185

Conversation

@hmalik88

@hmalik88 hmalik88 commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

Explanation

This PR adds batched proof-of-ownership signing to @metamask/profile-metrics-controller. Previously, ProfileMetricsController requested one proof signature per queued account by calling ProofOfOwnershipService:sign for each account. For snap-backed non-EVM accounts, that meant one SnapController:handleRequest call per account, causing large proof-signing fan-out during profile metrics sync.

This PR adds ProofOfOwnershipService:signBatch and updates ProfileMetricsController to call it once per entropy-source batch. The service keeps EVM behavior unchanged by signing each EVM account through KeyringController:signPersonalMessage, but groups snap-backed non-EVM accounts by snapId and sends one signProofOfOwnershipBatch request per snap.

Batch responses preserve input order. Per-item snap errors are handled per account, so successful proofs in the same batch are still submitted. Whole snap batch failures or malformed responses are allowed to throw, so the sync queue is not cleared on a broken batch integration.

References

Requires wallet snaps to support signProofOfOwnershipBatch:

Breaking Change

ProfileMetricsController now calls ProofOfOwnershipService:signBatch when attaching ownership proofs during profile metrics sync.

Consumers must update their controller messenger wiring to delegate ProofOfOwnershipService:signBatch to ProfileMetricsController. Clients must also ensure the involved wallet snaps support the signProofOfOwnershipBatch JSON-RPC method before adopting this core version, because this change does not fall back to singleton signProofOfOwnership calls.

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

High Risk
Breaking messenger and snap contract changes affect profile metrics proof signing; miswired clients or snaps without batch support can block sync or fail polls until fixed.

Overview
Profile metrics sync now attaches ownership proofs via a single batch signing call per entropy-source batch instead of one ProofOfOwnershipService:sign per account.

ProofOfOwnershipService exposes signBatch: EVM accounts still sign through the keyring individually; snap-backed accounts are grouped by snap ID and sent one signProofOfOwnershipBatch JSON-RPC call per snap. Responses stay in input order, with per-item { proof } or { error } for partial failures.

ProfileMetricsController #attachProofs builds all account/nonce pairs, calls ProofOfOwnershipService:signBatch once, and maps results back onto queued accounts. Whole-batch failures (rejection, wrong result count) throw and leave the sync queue intact; individual signing errors still allow submit without proof for those accounts.

This is a breaking change: consumers must wire ProofOfOwnershipService:signBatch on the controller messenger, and wallet snaps must implement signProofOfOwnershipBatch (no fallback to single-account snap signing).

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

@hmalik88
hmalik88 marked this pull request as ready for review September 8, 2026 12:35
@hmalik88
hmalik88 requested review from a team as code owners September 8, 2026 12:35
@hmalik88
hmalik88 deployed to default-branch September 8, 2026 12:35 — with GitHub Actions Active
@hmalik88

hmalik88 commented Sep 8, 2026

Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-previews

@github-actions

github-actions Bot commented Sep 8, 2026

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@9.0.0-preview-cb8f74370
@metamask-previews/accounts-controller@39.1.1-preview-cb8f74370
@metamask-previews/address-book-controller@7.1.2-preview-cb8f74370
@metamask-previews/ai-controllers@1.0.0-preview-cb8f74370
@metamask-previews/analytics-controller@2.1.0-preview-cb8f74370
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-cb8f74370
@metamask-previews/announcement-controller@8.1.0-preview-cb8f74370
@metamask-previews/app-metadata-controller@2.0.1-preview-cb8f74370
@metamask-previews/approval-controller@9.0.2-preview-cb8f74370
@metamask-previews/assets-controller@15.1.0-preview-cb8f74370
@metamask-previews/assets-controllers@111.2.0-preview-cb8f74370
@metamask-previews/authenticated-user-storage@3.0.2-preview-cb8f74370
@metamask-previews/base-controller@9.1.0-preview-cb8f74370
@metamask-previews/base-data-service@1.0.0-preview-cb8f74370
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-cb8f74370
@metamask-previews/bridge-controller@80.2.1-preview-cb8f74370
@metamask-previews/bridge-status-controller@75.5.1-preview-cb8f74370
@metamask-previews/build-utils@3.0.4-preview-cb8f74370
@metamask-previews/chain-agnostic-permission@1.7.0-preview-cb8f74370
@metamask-previews/chomp-api-service@4.0.2-preview-cb8f74370
@metamask-previews/claims-controller@0.6.2-preview-cb8f74370
@metamask-previews/client-controller@1.0.1-preview-cb8f74370
@metamask-previews/client-utils@2.1.1-preview-cb8f74370
@metamask-previews/compliance-controller@2.1.0-preview-cb8f74370
@metamask-previews/composable-controller@12.0.1-preview-cb8f74370
@metamask-previews/config-registry-controller@3.1.0-preview-cb8f74370
@metamask-previews/connectivity-controller@0.3.0-preview-cb8f74370
@metamask-previews/controller-utils@12.3.0-preview-cb8f74370
@metamask-previews/core-backend@9.1.1-preview-cb8f74370
@metamask-previews/cryptography@0.0.0-preview-cb8f74370
@metamask-previews/delegation-controller@3.0.2-preview-cb8f74370
@metamask-previews/earn-controller@12.2.7-preview-cb8f74370
@metamask-previews/eip-5792-middleware@3.0.5-preview-cb8f74370
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-cb8f74370
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-cb8f74370
@metamask-previews/eth-block-tracker@15.0.1-preview-cb8f74370
@metamask-previews/eth-json-rpc-middleware@24.0.2-preview-cb8f74370
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-cb8f74370
@metamask-previews/foundryup@1.0.1-preview-cb8f74370
@metamask-previews/gas-fee-controller@26.3.2-preview-cb8f74370
@metamask-previews/gator-permissions-controller@5.0.2-preview-cb8f74370
@metamask-previews/geolocation-controller@1.0.0-preview-cb8f74370
@metamask-previews/java-tron-up@1.0.0-preview-cb8f74370
@metamask-previews/json-rpc-engine@10.5.0-preview-cb8f74370
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-cb8f74370
@metamask-previews/keyring-controller@27.1.1-preview-cb8f74370
@metamask-previews/kyc-controller@0.0.0-preview-cb8f74370
@metamask-previews/local-node-utils@1.0.0-preview-cb8f74370
@metamask-previews/logging-controller@9.0.0-preview-cb8f74370
@metamask-previews/message-manager@14.1.2-preview-cb8f74370
@metamask-previews/messenger@2.0.0-preview-cb8f74370
@metamask-previews/messenger-cli@0.2.0-preview-cb8f74370
@metamask-previews/money-account-api-data-service@0.4.1-preview-cb8f74370
@metamask-previews/money-account-balance-service@2.4.3-preview-cb8f74370
@metamask-previews/money-account-controller@1.0.0-preview-cb8f74370
@metamask-previews/money-account-upgrade-controller@4.0.0-preview-cb8f74370
@metamask-previews/money-account-utils@1.2.0-preview-cb8f74370
@metamask-previews/multichain-account-service@13.0.2-preview-cb8f74370
@metamask-previews/multichain-api-middleware@4.0.3-preview-cb8f74370
@metamask-previews/multichain-network-controller@3.2.4-preview-cb8f74370
@metamask-previews/multichain-transactions-controller@7.1.2-preview-cb8f74370
@metamask-previews/name-controller@9.1.2-preview-cb8f74370
@metamask-previews/network-connection-banner-controller@0.2.1-preview-cb8f74370
@metamask-previews/network-controller@36.0.0-preview-cb8f74370
@metamask-previews/network-enablement-controller@6.0.5-preview-cb8f74370
@metamask-previews/notification-services-controller@27.0.2-preview-cb8f74370
@metamask-previews/passkey-controller@3.1.0-preview-cb8f74370
@metamask-previews/permission-controller@13.1.1-preview-cb8f74370
@metamask-previews/permission-log-controller@5.1.0-preview-cb8f74370
@metamask-previews/perps-controller@16.1.0-preview-cb8f74370
@metamask-previews/phishing-controller@17.4.1-preview-cb8f74370
@metamask-previews/platform-api-docs@0.1.0-preview-cb8f74370
@metamask-previews/polling-controller@16.0.9-preview-cb8f74370
@metamask-previews/preferences-controller@23.1.0-preview-cb8f74370
@metamask-previews/profile-metrics-controller@4.0.4-preview-cb8f74370
@metamask-previews/profile-sync-controller@30.0.0-preview-cb8f74370
@metamask-previews/ramps-controller@20.3.0-preview-cb8f74370
@metamask-previews/rate-limit-controller@7.0.1-preview-cb8f74370
@metamask-previews/react-data-query@1.0.0-preview-cb8f74370
@metamask-previews/remote-feature-flag-controller@6.1.1-preview-cb8f74370
@metamask-previews/sample-controllers@5.0.6-preview-cb8f74370
@metamask-previews/seedless-onboarding-controller@10.1.1-preview-cb8f74370
@metamask-previews/selected-network-controller@26.1.7-preview-cb8f74370
@metamask-previews/sentinel-api-service@1.0.1-preview-cb8f74370
@metamask-previews/shield-controller@6.0.2-preview-cb8f74370
@metamask-previews/signature-controller@39.2.10-preview-cb8f74370
@metamask-previews/smart-transactions-controller@26.0.1-preview-cb8f74370
@metamask-previews/snap-account-service@2.1.2-preview-cb8f74370
@metamask-previews/social-controllers@2.8.1-preview-cb8f74370
@metamask-previews/solana-test-validator-up@1.0.0-preview-cb8f74370
@metamask-previews/stellar-quickstart-up@0.0.0-preview-cb8f74370
@metamask-previews/storage-service@1.0.2-preview-cb8f74370
@metamask-previews/subscription-controller@8.1.0-preview-cb8f74370
@metamask-previews/transaction-controller@69.8.1-preview-cb8f74370
@metamask-previews/transaction-pay-controller@27.1.2-preview-cb8f74370
@metamask-previews/user-operation-controller@41.2.9-preview-cb8f74370
@metamask-previews/wallet@12.0.3-preview-cb8f74370
@metamask-previews/wallet-cli@0.0.0-preview-cb8f74370

@hmalik88
hmalik88 marked this pull request as draft September 8, 2026 13:11
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