@fun-xyz/fiat-contract 0.11.2 → 0.11.4

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
@@ -78,6 +78,12 @@ this package is [ENG-5268](https://linear.app/funxyz/issue/ENG-5268).
78
78
  13. **Providerless is terminal-routing-only.** `FiatStepResponse.provider` may be absent only for
79
79
  `BLOCKED`, including `ALL_PROVIDERS_DECLINED` when routing selected no provider. Every other state
80
80
  remains provider-bound and requires `provider`; provider-specific blocked responses may keep it.
81
+ 14. **Path commitment is not a quote.** A response may carry `routingSessionRef` while pricing is
82
+ legitimately deferred for provider auth or activation. Transitions echo that opaque reference in
83
+ `params`; clients submit it unchanged. `Quote.quoteRef` remains required whenever a real `Quote`
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.
81
87
 
82
88
  ## KYC SDK hints, results, and client delivery
83
89
 
@@ -1,5 +1,5 @@
1
1
  // package.json
2
- var version = "0.11.2";
2
+ var version = "0.11.4";
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-KU4EWXRI.mjs.map
517
+ //# sourceMappingURL=chunk-WWGICY4Q.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(),
@@ -874,19 +875,21 @@ var $providerBoundStepResponse = obj({
874
875
  state: $providerBoundFlowState,
875
876
  provider: $provider,
876
877
  transitions: import_zod.z.array($transition),
878
+ routingSessionRef: import_zod.z.string().optional(),
877
879
  orderId: import_zod.z.string().optional()
878
880
  });
879
881
  var $blockedStepResponse = obj({
880
882
  state: $blockedState,
881
883
  provider: $provider.optional(),
882
884
  transitions: import_zod.z.array($transition),
885
+ routingSessionRef: import_zod.z.string().optional(),
883
886
  orderId: import_zod.z.string().optional()
884
887
  });
885
888
  var $stepResponse = import_zod.z.union([$providerBoundStepResponse, $blockedStepResponse]);
886
889
  var FiatStepResponseSchema = $stepResponse;
887
890
 
888
891
  // package.json
889
- var version = "0.11.2";
892
+ var version = "0.11.4";
890
893
 
891
894
  // src/table.ts
892
895
  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-KU4EWXRI.mjs";
15
+ } from "./chunk-WWGICY4Q.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(),
@@ -773,12 +774,14 @@ var $providerBoundStepResponse = obj({
773
774
  state: $providerBoundFlowState,
774
775
  provider: $provider,
775
776
  transitions: z.array($transition),
777
+ routingSessionRef: z.string().optional(),
776
778
  orderId: z.string().optional()
777
779
  });
778
780
  var $blockedStepResponse = obj({
779
781
  state: $blockedState,
780
782
  provider: $provider.optional(),
781
783
  transitions: z.array($transition),
784
+ routingSessionRef: z.string().optional(),
782
785
  orderId: z.string().optional()
783
786
  });
784
787
  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.11.2";
39
+ var version = "0.11.4";
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-KU4EWXRI.mjs";
14
+ } from "./chunk-WWGICY4Q.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
@@ -641,6 +644,14 @@ export type BlockedReason = 'REGION_UNSUPPORTED' | 'ASSET_UNSUPPORTED' | 'ALL_PR
641
644
  */
642
645
  type FiatStepResponseBase = {
643
646
  transitions: Transition[];
647
+ /**
648
+ * Stable identity for a routing continuation before provider pricing is observable.
649
+ *
650
+ * A quote-less CONTINUE/PENDING response carries this instead of fabricating a `Quote` or
651
+ * `quoteRef`. It may remain present after a real quote is promoted so the backend can preserve
652
+ * the committed provider path independently from the quote binding.
653
+ */
654
+ routingSessionRef?: string;
644
655
  /** TODO(open-decision): `orderId` placement — see `PAYMENT{INSTRUCT}.orderId` above. */
645
656
  orderId?: string;
646
657
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fun-xyz/fiat-contract",
3
- "version": "0.11.2",
3
+ "version": "0.11.4",
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": {