Skip to content

WIP: jl/neobank demo generalize kyc controller - #9929

Draft
jiexi wants to merge 11 commits into
neobank-demofrom
jl/neobank-demo-generalize-kyc-controller
Draft

WIP: jl/neobank demo generalize kyc controller#9929
jiexi wants to merge 11 commits into
neobank-demofrom
jl/neobank-demo-generalize-kyc-controller

Conversation

@jiexi

@jiexi jiexi commented Aug 20, 2026

Copy link
Copy Markdown
Member

Explanation

Combines the big core PR and generalized vendor changes to the kyc-controller here and then makes necessary changes to the ramps-controller to adopt those kyc-controller changes

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

High Risk
Touches identity/KYC orchestration, persisted terms, bearer-authenticated vendor APIs, and wallet ownership signing. Breaking T&C2 and terms-vendor migration can force reacceptance and break existing callers.

Overview
Adds a vendor-parameterized KYC flow so Money/VBA can use Iron without MoonPay Check/Auth frames: empty-shell customer → vendor disclaimers → consents → SumSub. KycProduct gains 'money' and KycVendor gains 'iron'.

Breaking: acceptTermsAndStartSession now requires explicit sumsubTncSigned / idosTncSigned (no default true). Stored terms are vendor-scoped via persisted termsAcceptedVendor; null (pre-migration) forces reacceptance so disclaimer IDs are never reused across vendors.

New controller surface: createVendorCustomer, getCustomerIdentity, refreshKycStatus plus KycController:statusChanged with pending-status polling. KycService parameterizes /vendors/{vendor}/…, adds consents and GET /kyc/status, optional native fetch, and richer HTTP error bodies.

Ramps: Money Account wallet registration moves here from kyc-controller. Adds createAutoramp and NeoBank Pix/quote/customer/self-hosted-wallet APIs. Customer id prefers KycController:getCustomerIdentity, then Profile Sync + neobank-proxy. Hosts must delegate RAMPS_CONTROLLER_REQUIRED_CONTROLLER_ACTIONS.

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

georgeweiler and others added 10 commits August 18, 2026 20:23
Parameterize vendor HTTP and the consents path so KYC stays vendor-neutral, and add refreshKycStatus / statusChanged for user-keyed KYC status.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
…tus polling

Stored terms acceptance now records the vendor it was given for, so one vendor's
disclaimer ids can no longer satisfy another vendor's flow. `refreshKycStatus`
no longer restarts polling when a `reset()` landed mid-request, and
`acceptTermsAndStartSession` accepts a zero-argument call again.

Co-authored-by: Cursor <cursoragent@cursor.com>
…s to null

The optional `accessToken` and `country` params could be `undefined`, which
is not assignable to TanStack's `Json`-constrained `QueryKey`, breaking the
build.

Co-authored-by: Cursor <cursoragent@cursor.com>
- Fix cross-vendor terms reuse by invalidating null termsAcceptedVendor (Bugbot #1)
- Add validation for MoonPay checkKycRequired params (accessToken, country required)
- Check fetch availability before binding in KycService constructor
- Reorder bearer token check before assert() for better error messages
- Add T&C2 flag persistence (sumsubTncAccepted, idosTncAccepted) for consents-path resume
- Standardize vendor parameter naming (vendorId → vendor in createUkycSession)
- Add comprehensive test coverage for new validation paths

Co-authored-by: George Weiler <georgejweiler@gmail.com>
Co-authored-by: George Weiler <georgejweiler@gmail.com>
Do not default omitted sumsubTncSigned/idosTncSigned to true when starting
a non-MoonPay session. MoonPay callers may still omit them.

Co-authored-by: Cursor <cursoragent@cursor.com>
Make sumsubTncSigned and idosTncSigned required for every vendor. Zero-argument
calls and omitted flags fail instead of defaulting to true.

Co-authored-by: Cursor <cursoragent@cursor.com>
…generalize-kyc-controller

Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	packages/kyc-controller/CHANGELOG.md
#	packages/kyc-controller/src/KycController-method-action-types.ts
#	packages/kyc-controller/src/KycController.test.ts
#	packages/kyc-controller/src/KycController.ts
#	packages/kyc-controller/src/KycService-method-action-types.ts
#	packages/kyc-controller/src/KycService.test.ts
#	packages/kyc-controller/src/KycService.ts
#	packages/kyc-controller/src/index.ts
#	packages/kyc-controller/src/types.ts
@jiexi
jiexi requested review from a team as code owners August 20, 2026 21:47
@jiexi
jiexi deployed to default-branch August 20, 2026 21:47 — with GitHub Actions Active
@jiexi jiexi changed the title jl/neobank demo generalize kyc controller WIP: jl/neobank demo generalize kyc controller Aug 20, 2026
@jiexi
jiexi marked this pull request as draft August 20, 2026 21:47
@jiexi

jiexi commented Aug 20, 2026

Copy link
Copy Markdown
Member Author

@metamaskbot publish-preview

@jiexi
jiexi changed the base branch from main to neobank-demo August 20, 2026 21:48
@jiexi

jiexi commented Aug 20, 2026

Copy link
Copy Markdown
Member Author

@metamaskbot publish-preview

@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.6.1-preview-6b4bcdab3
@metamask-previews/accounts-controller@39.1.0-preview-6b4bcdab3
@metamask-previews/address-book-controller@7.1.2-preview-6b4bcdab3
@metamask-previews/ai-controllers@0.8.0-preview-6b4bcdab3
@metamask-previews/analytics-controller@2.0.0-preview-6b4bcdab3
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-6b4bcdab3
@metamask-previews/announcement-controller@8.1.0-preview-6b4bcdab3
@metamask-previews/app-metadata-controller@2.0.1-preview-6b4bcdab3
@metamask-previews/approval-controller@9.0.2-preview-6b4bcdab3
@metamask-previews/assets-controller@13.1.2-preview-6b4bcdab3
@metamask-previews/assets-controllers@111.1.0-preview-6b4bcdab3
@metamask-previews/authenticated-user-storage@3.0.1-preview-6b4bcdab3
@metamask-previews/base-controller@9.1.0-preview-6b4bcdab3
@metamask-previews/base-data-service@0.1.3-preview-6b4bcdab3
@metamask-previews/bitcoin-regtest-up@1.0.0-preview-6b4bcdab3
@metamask-previews/bridge-controller@79.2.0-preview-6b4bcdab3
@metamask-previews/bridge-status-controller@75.1.0-preview-6b4bcdab3
@metamask-previews/build-utils@3.0.4-preview-6b4bcdab3
@metamask-previews/chain-agnostic-permission@1.7.0-preview-6b4bcdab3
@metamask-previews/chomp-api-service@4.0.0-preview-6b4bcdab3
@metamask-previews/claims-controller@0.6.0-preview-6b4bcdab3
@metamask-previews/client-controller@1.0.1-preview-6b4bcdab3
@metamask-previews/client-utils@2.0.2-preview-6b4bcdab3
@metamask-previews/compliance-controller@2.1.0-preview-6b4bcdab3
@metamask-previews/composable-controller@12.0.1-preview-6b4bcdab3
@metamask-previews/config-registry-controller@2.0.1-preview-6b4bcdab3
@metamask-previews/connectivity-controller@0.3.0-preview-6b4bcdab3
@metamask-previews/controller-utils@12.3.0-preview-6b4bcdab3
@metamask-previews/core-backend@8.1.1-preview-6b4bcdab3
@metamask-previews/delegation-controller@3.0.2-preview-6b4bcdab3
@metamask-previews/earn-controller@12.2.4-preview-6b4bcdab3
@metamask-previews/eip-5792-middleware@3.0.5-preview-6b4bcdab3
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.1-preview-6b4bcdab3
@metamask-previews/eip1193-permission-middleware@2.0.1-preview-6b4bcdab3
@metamask-previews/ens-controller@19.1.6-preview-6b4bcdab3
@metamask-previews/eth-block-tracker@15.0.1-preview-6b4bcdab3
@metamask-previews/eth-json-rpc-middleware@24.0.0-preview-6b4bcdab3
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-6b4bcdab3
@metamask-previews/foundryup@1.0.1-preview-6b4bcdab3
@metamask-previews/gas-fee-controller@26.3.1-preview-6b4bcdab3
@metamask-previews/gator-permissions-controller@5.0.1-preview-6b4bcdab3
@metamask-previews/geolocation-controller@1.0.0-preview-6b4bcdab3
@metamask-previews/java-tron-up@1.0.0-preview-6b4bcdab3
@metamask-previews/json-rpc-engine@10.5.0-preview-6b4bcdab3
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-6b4bcdab3
@metamask-previews/keyring-controller@27.1.1-preview-6b4bcdab3
@metamask-previews/kyc-controller@0.0.0-preview-6b4bcdab3
@metamask-previews/local-node-utils@1.0.0-preview-6b4bcdab3
@metamask-previews/logging-controller@9.0.0-preview-6b4bcdab3
@metamask-previews/message-manager@14.1.2-preview-6b4bcdab3
@metamask-previews/messenger@2.0.0-preview-6b4bcdab3
@metamask-previews/messenger-cli@0.2.0-preview-6b4bcdab3
@metamask-previews/money-account-api-data-service@0.4.0-preview-6b4bcdab3
@metamask-previews/money-account-balance-service@2.4.1-preview-6b4bcdab3
@metamask-previews/money-account-controller@1.0.0-preview-6b4bcdab3
@metamask-previews/money-account-upgrade-controller@3.0.1-preview-6b4bcdab3
@metamask-previews/money-account-utils@1.1.0-preview-6b4bcdab3
@metamask-previews/multichain-account-service@13.0.1-preview-6b4bcdab3
@metamask-previews/multichain-api-middleware@4.0.2-preview-6b4bcdab3
@metamask-previews/multichain-network-controller@3.2.3-preview-6b4bcdab3
@metamask-previews/multichain-transactions-controller@7.1.2-preview-6b4bcdab3
@metamask-previews/name-controller@9.1.2-preview-6b4bcdab3
@metamask-previews/network-connection-banner-controller@0.1.2-preview-6b4bcdab3
@metamask-previews/network-controller@35.0.1-preview-6b4bcdab3
@metamask-previews/network-enablement-controller@6.0.3-preview-6b4bcdab3
@metamask-previews/notification-services-controller@26.0.1-preview-6b4bcdab3
@metamask-previews/passkey-controller@3.0.0-preview-6b4bcdab3
@metamask-previews/permission-controller@13.1.1-preview-6b4bcdab3
@metamask-previews/permission-log-controller@5.1.0-preview-6b4bcdab3
@metamask-previews/perps-controller@11.0.0-preview-6b4bcdab3
@metamask-previews/phishing-controller@17.3.1-preview-6b4bcdab3
@metamask-previews/platform-api-docs@0.0.0-preview-6b4bcdab3
@metamask-previews/polling-controller@16.0.9-preview-6b4bcdab3
@metamask-previews/preferences-controller@23.1.0-preview-6b4bcdab3
@metamask-previews/profile-metrics-controller@4.0.3-preview-6b4bcdab3
@metamask-previews/profile-sync-controller@29.0.0-preview-6b4bcdab3
@metamask-previews/ramps-controller@20.0.0-preview-6b4bcdab3
@metamask-previews/rate-limit-controller@7.0.1-preview-6b4bcdab3
@metamask-previews/react-data-query@0.2.2-preview-6b4bcdab3
@metamask-previews/remote-feature-flag-controller@5.0.0-preview-6b4bcdab3
@metamask-previews/sample-controllers@5.0.4-preview-6b4bcdab3
@metamask-previews/seedless-onboarding-controller@10.1.1-preview-6b4bcdab3
@metamask-previews/selected-network-controller@26.1.6-preview-6b4bcdab3
@metamask-previews/sentinel-api-service@1.0.0-preview-6b4bcdab3
@metamask-previews/shield-controller@6.0.0-preview-6b4bcdab3
@metamask-previews/signature-controller@39.2.9-preview-6b4bcdab3
@metamask-previews/smart-transactions-controller@25.1.0-preview-6b4bcdab3
@metamask-previews/snap-account-service@2.1.2-preview-6b4bcdab3
@metamask-previews/social-controllers@2.7.1-preview-6b4bcdab3
@metamask-previews/solana-test-validator-up@1.0.0-preview-6b4bcdab3
@metamask-previews/stellar-quickstart-up@0.0.0-preview-6b4bcdab3
@metamask-previews/storage-service@1.0.2-preview-6b4bcdab3
@metamask-previews/subscription-controller@7.0.0-preview-6b4bcdab3
@metamask-previews/transaction-controller@69.5.2-preview-6b4bcdab3
@metamask-previews/transaction-pay-controller@26.3.0-preview-6b4bcdab3
@metamask-previews/user-operation-controller@41.2.8-preview-6b4bcdab3
@metamask-previews/wallet@10.0.0-preview-6b4bcdab3
@metamask-previews/wallet-cli@0.0.0-preview-6b4bcdab3

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.

3 participants