44 lines
2.7 KiB
Markdown
44 lines
2.7 KiB
Markdown
# sxchnge_kyc
|
|
|
|
Shared Flutter identity verification and backend-owned visible limits. Both web
|
|
and future mobile clients consume the same models, providers and service contracts.
|
|
|
|
- `IdentityProvider` coordinates draft photos, validation errors, submission,
|
|
refresh and semantic analytics. Inject `IdentityService` and `PhotoService`.
|
|
- `LimitsProvider` fetches `LimitsService` models; it does not calculate caps from
|
|
a client-selected status. Refresh after status updates. Existing values are
|
|
marked stale after an error; out-of-order responses cannot replace newer data.
|
|
- `DummyIdentityService` keeps only review metadata in memory. `DummyLimitsService`
|
|
mimics backend policy with explicitly illustrative EUR fixtures. Neither is
|
|
production authorization. `review` exists only on the dummy service.
|
|
- `FilePhotoService` opens the platform picker and validates JPEG/PNG content,
|
|
10 MiB size, minimum 600px per dimension, maximum 40 megapixels and decodability.
|
|
It performs no face matching, OCR or identity approval. Camera capture is not
|
|
implemented; users can take a photo separately and select it.
|
|
- Photo models are transient; clients must dispose providers and evict sensitive
|
|
image cache entries. No disk, browser storage, network or document telemetry is
|
|
used by these stubs. No guarantee of cryptographic memory erasure is made.
|
|
|
|
Replace both identity and limits services when connecting a backend. A submit
|
|
adapter must reuse the supplied idempotency key across retries, scope requests to
|
|
the authenticated account, map safe errors and return server-confirmed status.
|
|
Numeric values use minor currency units (currently a two-decimal currency fixture);
|
|
extend the transport with currency precision before supporting other units.
|
|
|
|
The app's `/identity` route is an explicitly public demo, not an authenticated
|
|
account endpoint. Production requires session/email guards, server authorization,
|
|
private document storage, staff review and support integration. See
|
|
[the UX/measurement contract](../../../docs/ux/kyc.md).
|
|
|
|
Validation: `flutter pub get`, `flutter analyze`, `flutter test`.
|
|
|
|
Photo selection uses Flutter's [file_selector](https://pub.dev/packages/file_selector)
|
|
and [image metadata decoding](https://pub.dev/documentation/image/latest/image/Decoder-class.html).
|
|
For native macOS consumers enable the user-selected read-only file entitlement;
|
|
iOS/Android camera permissions are not required for this file-picker-only flow.
|
|
|
|
Visible limit rows also expose `usedMinor` (committed activity) and `reservedMinor`
|
|
(pending holds). `remainingMinor` is independently provided by the backend and
|
|
must not be inferred as cap minus those fields. The display-only occupied ratio
|
|
includes used plus reserved and is bounded for progress rendering.
|