@fun-xyz/fiat-contract 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -82,6 +82,8 @@ this package is [ENG-5268](https://linear.app/funxyz/issue/ENG-5268).
82
82
  legitimately deferred for provider auth or activation. Transitions echo that opaque reference in
83
83
  `params`; clients submit it unchanged. `Quote.quoteRef` remains required whenever a real `Quote`
84
84
  is present, and PAY must never be exposed without real current economics.
85
+ 15. **KYC may precede pricing.** Provider auth or activation may legitimately defer pricing, so a
86
+ KYC state may omit `quote`. A real `Quote` still requires `quoteRef`, and PAY is never quote-less.
85
87
 
86
88
  ## KYC SDK hints, results, and client delivery
87
89
 
@@ -1,5 +1,5 @@
1
1
  // package.json
2
- var version = "0.12.0";
2
+ var version = "0.13.0";
3
3
 
4
4
  // src/table.ts
5
5
  var TABLE_VERSION = version;
@@ -514,4 +514,4 @@ export {
514
514
  tableEntry,
515
515
  isTerminal
516
516
  };
517
- //# sourceMappingURL=chunk-PHLBEDMK.mjs.map
517
+ //# sourceMappingURL=chunk-AI66DLZT.mjs.map
package/dist/index.js CHANGED
@@ -555,6 +555,7 @@ var STANDARD_KYC_FIELD_IDS = [
555
555
  "RESIDENTIAL_ADDRESS_POSTAL_CODE",
556
556
  "RESIDENTIAL_ADDRESS_COUNTRY",
557
557
  "TAX_IDENTIFIER",
558
+ "US_SSN_LAST_FOUR",
558
559
  "TAX_RESIDENCE_COUNTRY",
559
560
  "EMPLOYMENT_STATUS",
560
561
  "OCCUPATION_INDUSTRY",
@@ -777,7 +778,7 @@ var SessionAuthStateSchema = $sessionAuthState;
777
778
  var $kycCaptureState = obj({
778
779
  kind: import_zod.z.literal("KYC"),
779
780
  phase: import_zod.z.literal("CAPTURE"),
780
- quote: $quote,
781
+ quote: $quote.optional(),
781
782
  surface: $surface,
782
783
  error: $failureReason.optional()
783
784
  });
@@ -785,7 +786,7 @@ var KycCaptureStateSchema = $kycCaptureState;
785
786
  var $kycInputRequiredState = obj({
786
787
  kind: import_zod.z.literal("KYC"),
787
788
  phase: import_zod.z.literal("INPUT_REQUIRED"),
788
- quote: $quote,
789
+ quote: $quote.optional(),
789
790
  form: $formDescriptor,
790
791
  error: $failureReason.optional()
791
792
  });
@@ -793,7 +794,7 @@ var KycInputRequiredStateSchema = $kycInputRequiredState;
793
794
  var $kycNoActionRequiredState = obj({
794
795
  kind: import_zod.z.literal("KYC"),
795
796
  phase: import_zod.z.literal("NO_ACTION_REQUIRED"),
796
- quote: $quote,
797
+ quote: $quote.optional(),
797
798
  reason: import_zod.z.enum(["IN_REVIEW", "ON_HOLD", "REJECTED"]),
798
799
  retryAfter: import_zod.z.string().optional(),
799
800
  failureReason: $failureReason.optional(),
@@ -875,6 +876,10 @@ var $providerBoundStepResponse = obj({
875
876
  provider: $provider,
876
877
  transitions: import_zod.z.array($transition),
877
878
  routingSessionRef: import_zod.z.string().optional(),
879
+ providerAuthToken: obj({
880
+ clientSecret: import_zod.z.string(),
881
+ expiresAt: import_zod.z.string()
882
+ }).optional(),
878
883
  orderId: import_zod.z.string().optional()
879
884
  });
880
885
  var $blockedStepResponse = obj({
@@ -882,13 +887,17 @@ var $blockedStepResponse = obj({
882
887
  provider: $provider.optional(),
883
888
  transitions: import_zod.z.array($transition),
884
889
  routingSessionRef: import_zod.z.string().optional(),
890
+ providerAuthToken: obj({
891
+ clientSecret: import_zod.z.string(),
892
+ expiresAt: import_zod.z.string()
893
+ }).optional(),
885
894
  orderId: import_zod.z.string().optional()
886
895
  });
887
896
  var $stepResponse = import_zod.z.union([$providerBoundStepResponse, $blockedStepResponse]);
888
897
  var FiatStepResponseSchema = $stepResponse;
889
898
 
890
899
  // package.json
891
- var version = "0.12.0";
900
+ var version = "0.13.0";
892
901
 
893
902
  // src/table.ts
894
903
  var TABLE_VERSION = version;
package/dist/index.mjs CHANGED
@@ -12,7 +12,7 @@ import {
12
12
  tableEntry,
13
13
  unofferedEndpoints,
14
14
  unreachableStates
15
- } from "./chunk-PHLBEDMK.mjs";
15
+ } from "./chunk-AI66DLZT.mjs";
16
16
 
17
17
  // src/codes.ts
18
18
  var COUNTRY_CURRENCY_LIST = [
@@ -454,6 +454,7 @@ var STANDARD_KYC_FIELD_IDS = [
454
454
  "RESIDENTIAL_ADDRESS_POSTAL_CODE",
455
455
  "RESIDENTIAL_ADDRESS_COUNTRY",
456
456
  "TAX_IDENTIFIER",
457
+ "US_SSN_LAST_FOUR",
457
458
  "TAX_RESIDENCE_COUNTRY",
458
459
  "EMPLOYMENT_STATUS",
459
460
  "OCCUPATION_INDUSTRY",
@@ -676,7 +677,7 @@ var SessionAuthStateSchema = $sessionAuthState;
676
677
  var $kycCaptureState = obj({
677
678
  kind: z.literal("KYC"),
678
679
  phase: z.literal("CAPTURE"),
679
- quote: $quote,
680
+ quote: $quote.optional(),
680
681
  surface: $surface,
681
682
  error: $failureReason.optional()
682
683
  });
@@ -684,7 +685,7 @@ var KycCaptureStateSchema = $kycCaptureState;
684
685
  var $kycInputRequiredState = obj({
685
686
  kind: z.literal("KYC"),
686
687
  phase: z.literal("INPUT_REQUIRED"),
687
- quote: $quote,
688
+ quote: $quote.optional(),
688
689
  form: $formDescriptor,
689
690
  error: $failureReason.optional()
690
691
  });
@@ -692,7 +693,7 @@ var KycInputRequiredStateSchema = $kycInputRequiredState;
692
693
  var $kycNoActionRequiredState = obj({
693
694
  kind: z.literal("KYC"),
694
695
  phase: z.literal("NO_ACTION_REQUIRED"),
695
- quote: $quote,
696
+ quote: $quote.optional(),
696
697
  reason: z.enum(["IN_REVIEW", "ON_HOLD", "REJECTED"]),
697
698
  retryAfter: z.string().optional(),
698
699
  failureReason: $failureReason.optional(),
@@ -774,6 +775,10 @@ var $providerBoundStepResponse = obj({
774
775
  provider: $provider,
775
776
  transitions: z.array($transition),
776
777
  routingSessionRef: z.string().optional(),
778
+ providerAuthToken: obj({
779
+ clientSecret: z.string(),
780
+ expiresAt: z.string()
781
+ }).optional(),
777
782
  orderId: z.string().optional()
778
783
  });
779
784
  var $blockedStepResponse = obj({
@@ -781,6 +786,10 @@ var $blockedStepResponse = obj({
781
786
  provider: $provider.optional(),
782
787
  transitions: z.array($transition),
783
788
  routingSessionRef: z.string().optional(),
789
+ providerAuthToken: obj({
790
+ clientSecret: z.string(),
791
+ expiresAt: z.string()
792
+ }).optional(),
784
793
  orderId: z.string().optional()
785
794
  });
786
795
  var $stepResponse = z.union([$providerBoundStepResponse, $blockedStepResponse]);
package/dist/schemas.d.ts CHANGED
@@ -53,7 +53,7 @@ export declare const TxSchema: z.ZodType<Tx>;
53
53
  export declare const RefundSchema: z.ZodType<Refund>;
54
54
  export declare const SurfaceKindSchema: z.ZodType<SurfaceKind>;
55
55
  export declare const PreferredIdentityDocumentSchema: z.ZodType<PreferredIdentityDocument>;
56
- export declare const STANDARD_KYC_FIELD_IDS: readonly ["LEGAL_FIRST_NAME", "LEGAL_MIDDLE_NAME", "LEGAL_LAST_NAME", "DATE_OF_BIRTH", "COUNTRY_OF_BIRTH", "CITY_OF_BIRTH", "NATIONALITY", "EMAIL_ADDRESS", "EMAIL_OWNERSHIP_VERIFICATION", "PHONE_NUMBER", "PHONE_OWNERSHIP_VERIFICATION", "RESIDENTIAL_ADDRESS_LINE_1", "RESIDENTIAL_ADDRESS_LINE_2", "RESIDENTIAL_ADDRESS_CITY", "RESIDENTIAL_ADDRESS_REGION", "RESIDENTIAL_ADDRESS_POSTAL_CODE", "RESIDENTIAL_ADDRESS_COUNTRY", "TAX_IDENTIFIER", "TAX_RESIDENCE_COUNTRY", "EMPLOYMENT_STATUS", "OCCUPATION_INDUSTRY", "OCCUPATION_TITLE", "SOURCE_OF_FUNDS_DECLARATION", "SOURCE_OF_INCOME_DECLARATION", "SOURCE_OF_WEALTH_DECLARATION", "PURPOSE_OF_SERVICE", "PURPOSE_OF_TRANSACTION", "CUSTOMER_CATEGORY"];
56
+ export declare const STANDARD_KYC_FIELD_IDS: readonly ["LEGAL_FIRST_NAME", "LEGAL_MIDDLE_NAME", "LEGAL_LAST_NAME", "DATE_OF_BIRTH", "COUNTRY_OF_BIRTH", "CITY_OF_BIRTH", "NATIONALITY", "EMAIL_ADDRESS", "EMAIL_OWNERSHIP_VERIFICATION", "PHONE_NUMBER", "PHONE_OWNERSHIP_VERIFICATION", "RESIDENTIAL_ADDRESS_LINE_1", "RESIDENTIAL_ADDRESS_LINE_2", "RESIDENTIAL_ADDRESS_CITY", "RESIDENTIAL_ADDRESS_REGION", "RESIDENTIAL_ADDRESS_POSTAL_CODE", "RESIDENTIAL_ADDRESS_COUNTRY", "TAX_IDENTIFIER", "US_SSN_LAST_FOUR", "TAX_RESIDENCE_COUNTRY", "EMPLOYMENT_STATUS", "OCCUPATION_INDUSTRY", "OCCUPATION_TITLE", "SOURCE_OF_FUNDS_DECLARATION", "SOURCE_OF_INCOME_DECLARATION", "SOURCE_OF_WEALTH_DECLARATION", "PURPOSE_OF_SERVICE", "PURPOSE_OF_TRANSACTION", "CUSTOMER_CATEGORY"];
57
57
  export declare const KYC_ACKNOWLEDGEMENT_FIELD_IDS: readonly ["RISK_ACKNOWLEDGEMENT", "COOLING_OFF_ACKNOWLEDGEMENT", "TERMS_ACCEPTANCE"];
58
58
  export declare const ClientExecutedDeliverySchema: z.ZodType<ClientExecutedDelivery>;
59
59
  export declare const SurfaceSchema: z.ZodType<Surface>;
package/dist/table.js CHANGED
@@ -36,7 +36,7 @@ __export(table_exports, {
36
36
  module.exports = __toCommonJS(table_exports);
37
37
 
38
38
  // package.json
39
- var version = "0.12.0";
39
+ var version = "0.13.0";
40
40
 
41
41
  // src/table.ts
42
42
  var TABLE_VERSION = version;
package/dist/table.mjs CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  tableEntry,
12
12
  unofferedEndpoints,
13
13
  unreachableStates
14
- } from "./chunk-PHLBEDMK.mjs";
14
+ } from "./chunk-AI66DLZT.mjs";
15
15
  export {
16
16
  DOCUMENTED_ENDPOINTS,
17
17
  STATE_KEYS,
package/dist/types.d.ts CHANGED
@@ -265,7 +265,7 @@ export interface PreferredIdentityDocument {
265
265
  country: string;
266
266
  }
267
267
  /** Canonical KYC values a declarative form or current-session delivery may name. */
268
- export type StandardKycFieldId = 'LEGAL_FIRST_NAME' | 'LEGAL_MIDDLE_NAME' | 'LEGAL_LAST_NAME' | 'DATE_OF_BIRTH' | 'COUNTRY_OF_BIRTH' | 'CITY_OF_BIRTH' | 'NATIONALITY' | 'EMAIL_ADDRESS' | 'EMAIL_OWNERSHIP_VERIFICATION' | 'PHONE_NUMBER' | 'PHONE_OWNERSHIP_VERIFICATION' | 'RESIDENTIAL_ADDRESS_LINE_1' | 'RESIDENTIAL_ADDRESS_LINE_2' | 'RESIDENTIAL_ADDRESS_CITY' | 'RESIDENTIAL_ADDRESS_REGION' | 'RESIDENTIAL_ADDRESS_POSTAL_CODE' | 'RESIDENTIAL_ADDRESS_COUNTRY' | 'TAX_IDENTIFIER' | 'TAX_RESIDENCE_COUNTRY' | 'EMPLOYMENT_STATUS' | 'OCCUPATION_INDUSTRY' | 'OCCUPATION_TITLE' | 'SOURCE_OF_FUNDS_DECLARATION' | 'SOURCE_OF_INCOME_DECLARATION' | 'SOURCE_OF_WEALTH_DECLARATION' | 'PURPOSE_OF_SERVICE' | 'PURPOSE_OF_TRANSACTION' | 'CUSTOMER_CATEGORY';
268
+ export type StandardKycFieldId = 'LEGAL_FIRST_NAME' | 'LEGAL_MIDDLE_NAME' | 'LEGAL_LAST_NAME' | 'DATE_OF_BIRTH' | 'COUNTRY_OF_BIRTH' | 'CITY_OF_BIRTH' | 'NATIONALITY' | 'EMAIL_ADDRESS' | 'EMAIL_OWNERSHIP_VERIFICATION' | 'PHONE_NUMBER' | 'PHONE_OWNERSHIP_VERIFICATION' | 'RESIDENTIAL_ADDRESS_LINE_1' | 'RESIDENTIAL_ADDRESS_LINE_2' | 'RESIDENTIAL_ADDRESS_CITY' | 'RESIDENTIAL_ADDRESS_REGION' | 'RESIDENTIAL_ADDRESS_POSTAL_CODE' | 'RESIDENTIAL_ADDRESS_COUNTRY' | 'TAX_IDENTIFIER' | 'US_SSN_LAST_FOUR' | 'TAX_RESIDENCE_COUNTRY' | 'EMPLOYMENT_STATUS' | 'OCCUPATION_INDUSTRY' | 'OCCUPATION_TITLE' | 'SOURCE_OF_FUNDS_DECLARATION' | 'SOURCE_OF_INCOME_DECLARATION' | 'SOURCE_OF_WEALTH_DECLARATION' | 'PURPOSE_OF_SERVICE' | 'PURPOSE_OF_TRANSACTION' | 'CUSTOMER_CATEGORY';
269
269
  export type KycAcknowledgementFieldId = 'RISK_ACKNOWLEDGEMENT' | 'COOLING_OFF_ACKNOWLEDGEMENT' | 'TERMS_ACCEPTANCE';
270
270
  export type QuestionnaireKycFieldId = `QUESTIONNAIRE_RESPONSE:${string}:${string}`;
271
271
  export type KycFieldId = StandardKycFieldId | KycAcknowledgementFieldId | QuestionnaireKycFieldId;
@@ -544,23 +544,26 @@ export type FlowState =
544
544
  surface?: Surface;
545
545
  error?: FailureReason;
546
546
  }
547
- /** Pre-order KYC states carry the routed quote so the entry screen can keep price visible. */
547
+ /**
548
+ * Pre-order KYC normally carries the routed quote so the entry screen can keep price visible.
549
+ * `quote` may be absent when provider auth or activation gates pricing.
550
+ */
548
551
  | {
549
552
  kind: 'KYC';
550
553
  phase: 'CAPTURE';
551
- quote: Quote;
554
+ quote?: Quote;
552
555
  surface: Surface;
553
556
  error?: FailureReason;
554
557
  } | {
555
558
  kind: 'KYC';
556
559
  phase: 'INPUT_REQUIRED';
557
- quote: Quote;
560
+ quote?: Quote;
558
561
  form: FormDescriptor;
559
562
  error?: FailureReason;
560
563
  } | {
561
564
  kind: 'KYC';
562
565
  phase: 'NO_ACTION_REQUIRED';
563
- quote: Quote;
566
+ quote?: Quote;
564
567
  /**
565
568
  * Note the deliberate name collision (Charles's nit, review 2026-08-14): `ON_HOLD` appears
566
569
  * here as a KYC reason *and* in `OrderStatus`. They are different things and both names come
@@ -649,6 +652,14 @@ type FiatStepResponseBase = {
649
652
  * the committed provider path independently from the quote binding.
650
653
  */
651
654
  routingSessionRef?: string;
655
+ /**
656
+ * Short-lived provider credential the client redeems for a silent sign-in before it renders the
657
+ * state. Absent means no silent path; the interactive `SESSION_AUTH` flow still applies.
658
+ */
659
+ providerAuthToken?: {
660
+ clientSecret: string;
661
+ expiresAt: string;
662
+ };
652
663
  /** TODO(open-decision): `orderId` placement — see `PAYMENT{INSTRUCT}.orderId` above. */
653
664
  orderId?: string;
654
665
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fun-xyz/fiat-contract",
3
- "version": "0.12.0",
3
+ "version": "0.13.0",
4
4
  "description": "Published conformance contract for Fun's headless fiat onramp: FlowState/Transition types, zod schemas, the transition table as data, recorded fixtures, assertion helpers.",
5
5
  "license": "MIT",
6
6
  "repository": {