Skip to content

Gw/kyc generalized demo - #11277

Open
georgeweiler wants to merge 3 commits into
mainfrom
gw/kyc-generalized-demo
Open

georgeweiler wants to merge 3 commits into
mainfrom
gw/kyc-generalized-demo

Conversation

@georgeweiler

@georgeweiler georgeweiler commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Explanation

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
Large breaking API and persisted-state shape changes in identity/KYC orchestration, with downstream ramps integration; clients must migrate stored state and every KycController call site.

Overview
BREAKING: @metamask/kyc-controller replaces the single active session with a persisted sessions map keyed by identity vendor. Top-level email, vendor, and geoCountry are removed; each entry holds that vendor's sessionStatus, disclaimer acceptance, provider flow state, and residenceCountry. Session APIs now take { vendor }, startSession no longer rejects vendor/email/country mismatches, and vendor is required on KycService.fetchVendorDisclaimers / createUkycSession (no default moonpay).

New flows split vendor T&Cs into acceptVendorDisclaimers (local, pre-session, submitted: false) and recordVendorDisclaimers (POST stored acceptance once a session exists). getSessionDecision({ vendor }) (plus exported getKycSessionDecision) collapses session + provider flow into none | new | pending | approved | rejected | retry. Selectors become selectKycSession(state, vendor) and selectKycSessionStatus(state, vendor); KycPhase, KycProduct, and related legacy types are dropped. launchProviderFlow only allows one SumSub UI at a time; per-vendor status polling and clearState/reset clear all vendors.

@metamask/ramps-controller adopts the new messenger contract for Iron VBA onboarding: KYC calls pass { vendor: 'iron' }, KycController:getSessionDecision is required, and hydrateVbaOnboarding uses that action instead of local resolveVbaKycStatus.

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

georgeweiler and others added 3 commits November 3, 2026 15:56
Replace the single-session KycController state with `sessions`, keyed by
vendor, so a second vendor (e.g. Kalshi) can hold its own session next to
Iron. Every session method takes `{ vendor }`; there is no active vendor.

- Add getSessionDecision (none/new/pending/approved/rejected/retry), moved
  from RampsController's resolveVbaKycStatus
- Add acceptVendorDisclaimers so vendor terms accepted before a session
  exists are stored on the controller, then submitted by
  recordVendorDisclaimers({ vendor })
- Drop the stored email/vendor/geoCountry and their 'different X' guards;
  email is only required when creating a session
- One SumSub flow on screen at a time; per-vendor polling loops
- Make vendor required on KycService.fetchVendorDisclaimers and
  createUkycSession
- Remove dead KycPhase / KycProduct types
- RampsController passes vendor 'iron' and reads getSessionDecision

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ions

Also require a session id in the controller's session lookup, stop
recordVendorDisclaimers recreating an entry cleared mid-request, and update
ARCHITECTURE.md's state and selectors sections.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@georgeweiler
georgeweiler requested review from a team as code owners November 4, 2026 02:51
@georgeweiler
georgeweiler deployed to default-branch November 4, 2026 02:51 — with GitHub Actions Active

@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 using default effort 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 7cf90a1. Configure here.

session = await this.messenger.call(
'KycController:fetchSessionStatusOnce',
session.id,
vendorParams,

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

KYC reset wipes every vendor

Medium Severity

VBA hydration still calls KycController:clearState when the Iron session is from another profile or the status GET returns 404. That action now deletes every vendor entry and stops every poll loop, so a valid MoonPay session, its accepted terms, and in-flight polling are discarded even though only the Iron session is invalid.

Additional Locations (1)
Fix in Cursor Fix in Web

Reviewed by Cursor Bugbot for commit 7cf90a1. Configure here.

This branch was successfully deployed

1 active deployment
default-branch — 7cf90a17 Deployed Nov 4, 2026 by georgeweiler via Determine whether this PR is a release PR #6446
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