Skip to content

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

Open
hmalik88 wants to merge 6 commits into
mainfrom
hm/mul-2185
Open

feat(profile-metrics-controller): add batched proof-of-ownership signing#10142
hmalik88 wants to merge 6 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

Medium Risk
Changes how ownership proofs are collected during metrics sync and introduces a hard dependency on snap batch signing without singleton fallback; miswired messengers or outdated snaps can block sync batches from clearing.

Overview
Profile metrics sync now attaches ownership proofs via ProofOfOwnershipService:signBatch instead of one sign call per account, reducing snap RPC fan-out during poll batches.

ProofOfOwnershipService adds batch types and signProofOfOwnershipBatch: EVM accounts still sign individually through the keyring; snap-backed accounts are grouped by snapId and sent one batch request per snap, with per-item proofs or errors returned in input order. ProfileMetricsController maps batch results onto queued accounts, still submits when only some items fail to sign, and leaves the sync queue intact when the whole batch rejects or returns the wrong result count (no fallback to singleton snap signing).

This is a breaking change: messengers must delegate ProofOfOwnershipService:signBatch, and wallet snaps must implement signProofOfOwnershipBatch before upgrading.

Reviewed by Cursor Bugbot for commit e377b45. 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 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
@hmalik88
hmalik88 marked this pull request as ready for review September 10, 2026 15:44

@cursor cursor Bot left a comment

Copy link
Copy Markdown

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 1 potential issue.

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 936c3ce. Configure here.

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