@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 +2 -0
- package/dist/{chunk-PHLBEDMK.mjs → chunk-AI66DLZT.mjs} +2 -2
- package/dist/index.js +13 -4
- package/dist/index.mjs +13 -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
|
@@ -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.
|
|
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-
|
|
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.
|
|
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-
|
|
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
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
|
|
@@ -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.
|
|
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": {
|