@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 +6 -0
- package/dist/{chunk-KU4EWXRI.mjs → chunk-WWGICY4Q.mjs} +2 -2
- package/dist/index.js +7 -4
- package/dist/index.mjs +7 -4
- package/dist/schemas.d.ts +1 -1
- package/dist/table.js +1 -1
- package/dist/table.mjs +1 -1
- package/dist/types.d.ts +16 -5
- package/package.json +1 -1
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
|
+
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-
|
|
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.
|
|
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-
|
|
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
package/dist/table.mjs
CHANGED
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
|
-
/**
|
|
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
|
|
554
|
+
quote?: Quote;
|
|
552
555
|
surface: Surface;
|
|
553
556
|
error?: FailureReason;
|
|
554
557
|
} | {
|
|
555
558
|
kind: 'KYC';
|
|
556
559
|
phase: 'INPUT_REQUIRED';
|
|
557
|
-
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
|
|
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.
|
|
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": {
|