@frak-labs/core-sdk 0.1.0-beta.afa252b0 → 0.1.0-beta.dd44738a

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.
Files changed (77) hide show
  1. package/cdn/bundle.js +3 -3
  2. package/dist/bundle.cjs +1 -1
  3. package/dist/bundle.js +1 -1
  4. package/dist/index.cjs +1 -1
  5. package/dist/index.js +1 -1
  6. package/package.json +4 -2
  7. package/src/actions/displayEmbeddedWallet.ts +20 -0
  8. package/src/actions/displayModal.ts +131 -0
  9. package/src/actions/getProductInformation.ts +14 -0
  10. package/src/actions/index.ts +29 -0
  11. package/src/actions/openSso.ts +116 -0
  12. package/src/actions/prepareSso.ts +48 -0
  13. package/src/actions/referral/processReferral.ts +230 -0
  14. package/src/actions/referral/referralInteraction.ts +57 -0
  15. package/src/actions/sendInteraction.ts +32 -0
  16. package/src/actions/trackPurchaseStatus.ts +53 -0
  17. package/src/actions/watchWalletStatus.ts +94 -0
  18. package/src/actions/wrapper/modalBuilder.ts +212 -0
  19. package/src/actions/wrapper/sendTransaction.ts +62 -0
  20. package/src/actions/wrapper/siweAuthenticate.ts +94 -0
  21. package/src/bundle.ts +3 -0
  22. package/src/clients/DebugInfo.ts +182 -0
  23. package/src/clients/createIFrameFrakClient.ts +287 -0
  24. package/src/clients/index.ts +3 -0
  25. package/src/clients/setupClient.ts +71 -0
  26. package/src/clients/transports/iframeLifecycleManager.ts +88 -0
  27. package/src/constants/interactionTypes.ts +44 -0
  28. package/src/constants/locales.ts +14 -0
  29. package/src/constants/productTypes.ts +33 -0
  30. package/src/index.ts +103 -0
  31. package/src/interactions/index.ts +5 -0
  32. package/src/interactions/pressEncoder.ts +53 -0
  33. package/src/interactions/purchaseEncoder.ts +94 -0
  34. package/src/interactions/referralEncoder.ts +47 -0
  35. package/src/interactions/retailEncoder.ts +37 -0
  36. package/src/interactions/webshopEncoder.ts +30 -0
  37. package/src/types/client.ts +14 -0
  38. package/src/types/compression.ts +22 -0
  39. package/src/types/config.ts +111 -0
  40. package/src/types/context.ts +13 -0
  41. package/src/types/index.ts +70 -0
  42. package/src/types/lifecycle/client.ts +46 -0
  43. package/src/types/lifecycle/iframe.ts +35 -0
  44. package/src/types/lifecycle/index.ts +2 -0
  45. package/src/types/rpc/displayModal.ts +84 -0
  46. package/src/types/rpc/embedded/index.ts +68 -0
  47. package/src/types/rpc/embedded/loggedIn.ts +55 -0
  48. package/src/types/rpc/embedded/loggedOut.ts +28 -0
  49. package/src/types/rpc/interaction.ts +43 -0
  50. package/src/types/rpc/modal/final.ts +46 -0
  51. package/src/types/rpc/modal/generic.ts +46 -0
  52. package/src/types/rpc/modal/index.ts +20 -0
  53. package/src/types/rpc/modal/login.ts +32 -0
  54. package/src/types/rpc/modal/openSession.ts +25 -0
  55. package/src/types/rpc/modal/siweAuthenticate.ts +37 -0
  56. package/src/types/rpc/modal/transaction.ts +33 -0
  57. package/src/types/rpc/productInformation.ts +59 -0
  58. package/src/types/rpc/sso.ts +80 -0
  59. package/src/types/rpc/walletStatus.ts +35 -0
  60. package/src/types/rpc.ts +158 -0
  61. package/src/types/transport.ts +34 -0
  62. package/src/utils/FrakContext.ts +152 -0
  63. package/src/utils/compression/b64.ts +29 -0
  64. package/src/utils/compression/compress.ts +11 -0
  65. package/src/utils/compression/decompress.ts +11 -0
  66. package/src/utils/compression/index.ts +3 -0
  67. package/src/utils/computeProductId.ts +11 -0
  68. package/src/utils/constants.ts +4 -0
  69. package/src/utils/formatAmount.ts +18 -0
  70. package/src/utils/getCurrencyAmountKey.ts +15 -0
  71. package/src/utils/getSupportedCurrency.ts +14 -0
  72. package/src/utils/getSupportedLocale.ts +16 -0
  73. package/src/utils/iframeHelper.ts +142 -0
  74. package/src/utils/index.ts +21 -0
  75. package/src/utils/sso.ts +119 -0
  76. package/src/utils/ssoUrlListener.ts +60 -0
  77. package/src/utils/trackEvent.ts +26 -0
@@ -0,0 +1,68 @@
1
+ import type { Address } from "viem";
2
+ import type { FullInteractionTypesKey } from "../../../constants/interactionTypes";
3
+ import type { I18nConfig } from "../../config";
4
+ import type {
5
+ EmbeddedViewActionReferred,
6
+ EmbeddedViewActionSharing,
7
+ LoggedInEmbeddedView,
8
+ } from "./loggedIn";
9
+ import type { LoggedOutEmbeddedView } from "./loggedOut";
10
+
11
+ export type {
12
+ EmbeddedViewActionSharing,
13
+ LoggedInEmbeddedView,
14
+ LoggedOutEmbeddedView,
15
+ EmbeddedViewActionReferred,
16
+ };
17
+
18
+ /**
19
+ * The params used to display the embedded wallet
20
+ *
21
+ * @group Embedded wallet
22
+ */
23
+ export type DisplayEmbeddedWalletParamsType = {
24
+ /**
25
+ * The embedded view to display once the user is logged in
26
+ */
27
+ loggedIn?: LoggedInEmbeddedView;
28
+ /**
29
+ * The embedded view to display once the user is logged out
30
+ */
31
+ loggedOut?: LoggedOutEmbeddedView;
32
+ /**
33
+ * Some metadata to customize the embedded view
34
+ */
35
+ metadata?: {
36
+ /**
37
+ * The logo to display on the embedded wallet
38
+ * If undefined, will default to no logo displayed
39
+ */
40
+ logo?: string;
41
+ /**
42
+ * Link to the homepage of the calling website
43
+ * If undefined, will default to the domain of the calling website
44
+ */
45
+ homepageLink?: string;
46
+ /**
47
+ * The target interaction behind this modal
48
+ */
49
+ targetInteraction?: FullInteractionTypesKey;
50
+ /**
51
+ * The position of the component
52
+ */
53
+ position?: "left" | "right";
54
+ /**
55
+ * Some i18n override for the displayed modal (i.e. update the displayed text only for this modal)
56
+ */
57
+ i18n?: I18nConfig;
58
+ };
59
+ };
60
+
61
+ /**
62
+ * The result of the display embedded wallet rpc request
63
+ *
64
+ * @group Embedded wallet
65
+ */
66
+ export type DisplayEmbeddedWalletResultType = {
67
+ wallet: Address;
68
+ };
@@ -0,0 +1,55 @@
1
+ /**
2
+ * The different type of action we can have on the embedded view (once the user is logged in)
3
+ *
4
+ * @group Embedded wallet
5
+ */
6
+ export type EmbeddedViewActionSharing = {
7
+ key: "sharing";
8
+
9
+ /**
10
+ * Some sharing options
11
+ */
12
+ options?: {
13
+ /**
14
+ * The title that will be displayed on the system popup once the system sharing window is open
15
+ * @deprecated Use the top level `config.metadata.i18n` instead
16
+ */
17
+ popupTitle?: string;
18
+ /**
19
+ * The text that will be shared alongside the link.
20
+ * Can contain the variable {LINK} to specify where the link is placed, otherwise it will be added at the end
21
+ * @deprecated Use the top level `config.metadata.i18n` instead
22
+ */
23
+ text?: string;
24
+ /**
25
+ * The link to be shared (will be suffixed with the Frak sharing context)
26
+ */
27
+ link?: string;
28
+ };
29
+ };
30
+
31
+ /**
32
+ * The action to display on the logged out embedded view when the user is referred
33
+ *
34
+ * @group Embedded wallet
35
+ */
36
+ export type EmbeddedViewActionReferred = {
37
+ key: "referred";
38
+
39
+ /**
40
+ * No options for a referred action
41
+ */
42
+ options?: never;
43
+ };
44
+
45
+ /**
46
+ * Some configuration options for the embedded view
47
+ *
48
+ * @group Embedded wallet
49
+ */
50
+ export type LoggedInEmbeddedView = {
51
+ /**
52
+ * The main action to display on the logged in embedded view
53
+ */
54
+ action?: EmbeddedViewActionSharing | EmbeddedViewActionReferred;
55
+ };
@@ -0,0 +1,28 @@
1
+ /**
2
+ * The view when a user is logged out
3
+ * @group Embedded wallet
4
+ */
5
+ export type LoggedOutEmbeddedView = {
6
+ /**
7
+ * Metadata option when displaying the embedded view
8
+ */
9
+ metadata?: {
10
+ /**
11
+ * The main CTA for the logged out view
12
+ * - can include some variable, available ones are:
13
+ * - {REWARD} -> The maximum reward a user can receive when interacting on your website
14
+ * - can be formatted in markdown
15
+ *
16
+ * If not set, it will default to a internationalized message
17
+ * @deprecated Use the top level `config.customizations.i18n`, or `metadata.i18n` instead
18
+ */
19
+ text?: string;
20
+ /**
21
+ * The text that will be displayed on the login button
22
+ *
23
+ * If not set, it will default to a internationalized message
24
+ * @deprecated Use the top level `config.customizations.i18n`, or `metadata.i18n` instead
25
+ */
26
+ buttonText?: string;
27
+ };
28
+ };
@@ -0,0 +1,43 @@
1
+ import type { Hex } from "viem";
2
+
3
+ /**
4
+ * Represent a prepared user interaction, ready to be sent on-chain via the wallet
5
+ */
6
+ export type PreparedInteraction = {
7
+ handlerTypeDenominator: Hex;
8
+ interactionData: Hex;
9
+ };
10
+
11
+ /**
12
+ * Parameters that will be used to send an interaction to the blockchain
13
+ * @inline
14
+ */
15
+ export type SendInteractionParamsType = {
16
+ /**
17
+ * The product id where this interaction has been made
18
+ * @defaultValue keccak256(toHex(window.location.host))
19
+ */
20
+ productId?: Hex;
21
+ /**
22
+ * The prepared interaction, built from an Interaction Encoder
23
+ */
24
+ interaction: PreparedInteraction;
25
+ /**
26
+ * A pre-computed interaction signature
27
+ * If none provided, the delegated interaction validator of your product will sign it (you can manage it in the business dashboard)
28
+ *
29
+ * @defaultValue undefined
30
+ */
31
+ validation?: Hex;
32
+ };
33
+
34
+ /**
35
+ * Return type of the send interaction rpc request
36
+ * @group RPC Schema
37
+ */
38
+ export type SendInteractionReturnType = {
39
+ /**
40
+ * The id of the interaction in the interaction pool
41
+ */
42
+ delegationId: string;
43
+ };
@@ -0,0 +1,46 @@
1
+ import type { GenericModalStepType, ModalStepMetadata } from "./generic";
2
+
3
+ /**
4
+ * The final modal step type, could be used to display sharing options or a success reward screen.
5
+ *
6
+ * **Input**: What type final step to display?
7
+ * **Output**: None
8
+ *
9
+ * @group Modal Display
10
+ */
11
+ export type FinalModalStepType = GenericModalStepType<
12
+ "final",
13
+ {
14
+ // Custom metadata in the case it was dismissed
15
+ dismissedMetadata?: ModalStepMetadata["metadata"];
16
+ // Action to perform on this final step
17
+ action: FinalActionType;
18
+ // Do we want to auto skip this step (don't display anything to the user, once we reached it we exit)
19
+ autoSkip?: boolean;
20
+ },
21
+ object
22
+ >;
23
+
24
+ /**
25
+ * The different types of final actions we can display in the final step
26
+ * @group Modal Display
27
+ */
28
+ export type FinalActionType =
29
+ | {
30
+ key: "sharing";
31
+ options?: {
32
+ /**
33
+ * @deprecated Use the top level `config.metadata.i18n` instead
34
+ */
35
+ popupTitle?: string;
36
+ /**
37
+ * @deprecated Use the top level `config.metadata.i18n` instead
38
+ */
39
+ text?: string;
40
+ link?: string;
41
+ };
42
+ }
43
+ | {
44
+ key: "reward";
45
+ options?: never;
46
+ };
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Represent a generic modal step type
3
+ * @ignore
4
+ * @inline
5
+ */
6
+ export type GenericModalStepType<TKey, TParams, TReturns> = {
7
+ key: TKey;
8
+ params: TParams extends never
9
+ ? ModalStepMetadata
10
+ : ModalStepMetadata & TParams;
11
+ returns: TReturns;
12
+ };
13
+
14
+ /**
15
+ * Metadata that can be used to customize a modal step
16
+ * @group Modal Display
17
+ * @deprecated Use the top level `config.customizations.i18n`, or `metadata.i18n` instead
18
+ */
19
+ export type ModalStepMetadata = {
20
+ metadata?: {
21
+ /**
22
+ * Custom title for the step
23
+ * If none provided, it will use an internationalized text
24
+ * @deprecated Use the top level `config.customizations.i18n`, or `metadata.i18n` instead
25
+ */
26
+ title?: string;
27
+ /**
28
+ * Custom description for the step
29
+ * If none provided, it will use an internationalized text
30
+ * @deprecated Use the top level `config.customizations.i18n`, or `metadata.i18n` instead
31
+ */
32
+ description?: string;
33
+ /**
34
+ * Custom text for the primary action of the step
35
+ * If none provided, it will use an internationalized text
36
+ * @deprecated Use the top level `config.customizations.i18n`, or `metadata.i18n` instead
37
+ */
38
+ primaryActionText?: string;
39
+ /**
40
+ * Custom text for the secondary action of the step
41
+ * If none provided, it will use an internationalized text
42
+ * @deprecated Use the top level `config.customizations.i18n`, or `metadata.i18n` instead
43
+ */
44
+ secondaryActionText?: string;
45
+ };
46
+ };
@@ -0,0 +1,20 @@
1
+ export type { LoginModalStepType } from "./login";
2
+ export type {
3
+ SiweAuthenticateModalStepType,
4
+ SiweAuthenticationParams,
5
+ SiweAuthenticateReturnType,
6
+ } from "./siweAuthenticate";
7
+ export type {
8
+ SendTransactionModalStepType,
9
+ SendTransactionTxType,
10
+ SendTransactionReturnType,
11
+ } from "./transaction";
12
+ export type {
13
+ OpenInteractionSessionReturnType,
14
+ OpenInteractionSessionModalStepType,
15
+ } from "./openSession";
16
+ export type { ModalStepMetadata } from "./generic";
17
+ export type {
18
+ FinalModalStepType,
19
+ FinalActionType,
20
+ } from "./final";
@@ -0,0 +1,32 @@
1
+ import type { Address } from "viem";
2
+ import type { SsoMetadata } from "../sso";
3
+ import type { GenericModalStepType } from "./generic";
4
+
5
+ /** @inline */
6
+ type LoginWithSso = {
7
+ allowSso: true;
8
+ // Optional metadata for the SSO (if not provided, will be recomputed from the top level wallet sdk)
9
+ ssoMetadata?: SsoMetadata;
10
+ };
11
+
12
+ /** @inline */
13
+ type LoginWithoutSso = {
14
+ allowSso?: false;
15
+ ssoMetadata?: never;
16
+ };
17
+
18
+ /**
19
+ * The login step for a Modal
20
+ *
21
+ * **Input**: Do we allow SSO or not? Is yes then the SSO metadata
22
+ * **Output**: The logged in wallet address
23
+ *
24
+ * @group Modal Display
25
+ */
26
+ export type LoginModalStepType = GenericModalStepType<
27
+ "login",
28
+ LoginWithSso | LoginWithoutSso,
29
+ {
30
+ wallet: Address;
31
+ }
32
+ >;
@@ -0,0 +1,25 @@
1
+ import type { GenericModalStepType } from "./generic";
2
+
3
+ /**
4
+ * Return type of the open session modal step
5
+ * @inline
6
+ * @ignore
7
+ */
8
+ export type OpenInteractionSessionReturnType = {
9
+ startTimestamp: number;
10
+ endTimestamp: number;
11
+ };
12
+
13
+ /**
14
+ * The open interaction session step for a Modal
15
+ *
16
+ * **Input**: None
17
+ * **Output**: The interactions session period (start and end timestamp)
18
+ *
19
+ * @group Modal Display
20
+ */
21
+ export type OpenInteractionSessionModalStepType = GenericModalStepType<
22
+ "openSession",
23
+ object,
24
+ OpenInteractionSessionReturnType
25
+ >;
@@ -0,0 +1,37 @@
1
+ import type { Hex } from "viem";
2
+ import type { SiweMessage } from "viem/siwe";
3
+ import type { GenericModalStepType } from "./generic";
4
+
5
+ /**
6
+ * Parameters used send a SIWE rpc request
7
+ */
8
+ export type SiweAuthenticationParams = Omit<
9
+ SiweMessage,
10
+ "address" | "chainId" | "expirationTime" | "issuedAt" | "notBefore"
11
+ > & {
12
+ expirationTimeTimestamp?: number;
13
+ notBeforeTimestamp?: number;
14
+ };
15
+
16
+ /**
17
+ * Return type of the Siwe transaction rpc request
18
+ * @inline
19
+ */
20
+ export type SiweAuthenticateReturnType = {
21
+ signature: Hex;
22
+ message: string;
23
+ };
24
+
25
+ /**
26
+ * The SIWE authentication step for a Modal
27
+ *
28
+ * **Input**: SIWE message parameters
29
+ * **Output**: SIWE result (message signed and wallet signature)
30
+ *
31
+ * @group Modal Display
32
+ */
33
+ export type SiweAuthenticateModalStepType = GenericModalStepType<
34
+ "siweAuthenticate",
35
+ { siwe: SiweAuthenticationParams },
36
+ SiweAuthenticateReturnType
37
+ >;
@@ -0,0 +1,33 @@
1
+ import type { Address, Hex } from "viem";
2
+ import type { GenericModalStepType } from "./generic";
3
+
4
+ /**
5
+ * Generic format representing a tx to be sent
6
+ */
7
+ export type SendTransactionTxType = {
8
+ to: Address;
9
+ data?: Hex;
10
+ value?: Hex;
11
+ };
12
+
13
+ /**
14
+ * Return type of the send transaction rpc request
15
+ * @inline
16
+ */
17
+ export type SendTransactionReturnType = {
18
+ hash: Hex;
19
+ };
20
+
21
+ /**
22
+ * The send transaction step for a Modal
23
+ *
24
+ * **Input**: Either a single tx or an array of tx to be sent
25
+ * **Output**: The hash of the tx(s) hash (in case of multiple tx, still returns a single hash because it's bundled on the wallet level)
26
+ *
27
+ * @group Modal Display
28
+ */
29
+ export type SendTransactionModalStepType = GenericModalStepType<
30
+ "sendTransaction",
31
+ { tx: SendTransactionTxType | SendTransactionTxType[] },
32
+ SendTransactionReturnType
33
+ >;
@@ -0,0 +1,59 @@
1
+ import type { Address, Hex } from "viem";
2
+ import type { FullInteractionTypesKey } from "../../constants/interactionTypes";
3
+ import type { ProductTypesKey } from "../../constants/productTypes";
4
+
5
+ /**
6
+ * The type for the amount of tokens
7
+ */
8
+ export type TokenAmountType = {
9
+ amount: number;
10
+ eurAmount: number;
11
+ usdAmount: number;
12
+ gbpAmount: number;
13
+ };
14
+
15
+ /**
16
+ * Response of the `frak_getProductInformation` RPC method
17
+ * @group RPC Schema
18
+ */
19
+ export type GetProductInformationReturnType = {
20
+ /**
21
+ * Current product id
22
+ */
23
+ id: Hex;
24
+ /**
25
+ * Some metadata
26
+ */
27
+ onChainMetadata: {
28
+ /**
29
+ * Name of the product on-chain
30
+ */
31
+ name: string;
32
+ /**
33
+ * Domain of the product on-chain
34
+ */
35
+ domain: string;
36
+ /**
37
+ * The supported product types
38
+ */
39
+ productTypes: ProductTypesKey[];
40
+ };
41
+ /**
42
+ * The max potential reward for the referrer
43
+ */
44
+ maxReferrer?: TokenAmountType;
45
+ /**
46
+ * The max potential reward for the referee
47
+ */
48
+ maxReferee?: TokenAmountType;
49
+ /**
50
+ * List of all the potentials reward arround this product
51
+ */
52
+ rewards: {
53
+ token: Address;
54
+ campaign: Address;
55
+ interactionTypeKey: FullInteractionTypesKey;
56
+ referrer: TokenAmountType;
57
+ referee: TokenAmountType;
58
+ }[];
59
+ };
@@ -0,0 +1,80 @@
1
+ import type { Hex } from "viem";
2
+
3
+ /**
4
+ * SSO Metadata
5
+ */
6
+ export type SsoMetadata = {
7
+ /**
8
+ * URL to your client, if provided will be displayed in the SSO header
9
+ */
10
+ logoUrl?: string;
11
+ /**
12
+ * Link to your homepage, if referenced your app name will contain a link on the sso page
13
+ */
14
+ homepageLink?: string;
15
+ };
16
+
17
+ /**
18
+ * Params for preparing SSO (generating URL)
19
+ * Same as OpenSsoParamsType but without openInSameWindow (popup-only operation)
20
+ * @group RPC Schema
21
+ */
22
+ export type PrepareSsoParamsType = {
23
+ /**
24
+ * Redirect URL after the SSO (optional)
25
+ */
26
+ redirectUrl?: string;
27
+ /**
28
+ * If the SSO should directly exit after completion
29
+ * @defaultValue true
30
+ */
31
+ directExit?: boolean;
32
+ /**
33
+ * Language of the SSO page (optional)
34
+ * It will default to the current user language (or "en" if unsupported language)
35
+ */
36
+ lang?: "en" | "fr";
37
+ /**
38
+ * Custom SSO metadata
39
+ */
40
+ metadata?: SsoMetadata;
41
+ };
42
+
43
+ /**
44
+ * Response after preparing SSO
45
+ * @group RPC Schema
46
+ */
47
+ export type PrepareSsoReturnType = {
48
+ /**
49
+ * The SSO URL that should be opened in a popup
50
+ */
51
+ ssoUrl: string;
52
+ };
53
+
54
+ /**
55
+ * Response after an SSO has been openned
56
+ */
57
+ export type OpenSsoReturnType = {
58
+ /**
59
+ * Optional wallet address, returned when SSO completes via postMessage
60
+ * Note: Only present when SSO flow completes (not immediately on open)
61
+ */
62
+ wallet?: Hex;
63
+ };
64
+
65
+ /**
66
+ * Params to start a SSO
67
+ * @group RPC Schema
68
+ */
69
+ export type OpenSsoParamsType = PrepareSsoParamsType & {
70
+ /**
71
+ * Indicate whether we want todo the flow within the same window context, or if we want to do it with an external popup window openned
72
+ * Note: Default true if redirectUrl is present, otherwise, false
73
+ */
74
+ openInSameWindow?: boolean;
75
+
76
+ /**
77
+ * Custom SSO popup url if user want additionnal customisation
78
+ */
79
+ ssoPopupUrl?: string;
80
+ };
@@ -0,0 +1,35 @@
1
+ import type { Address } from "viem";
2
+
3
+ /**
4
+ * RPC Response for the method `frak_listenToWalletStatus`
5
+ * @group RPC Schema
6
+ */
7
+ export type WalletStatusReturnType = WalletConnected | WalletNotConnected;
8
+
9
+ /**
10
+ * @ignore
11
+ * @inline
12
+ */
13
+ export type WalletConnected = {
14
+ key: "connected";
15
+ // The user wallet address
16
+ wallet: Address;
17
+ // The interaction token, used to push interactions to the delegator if needed
18
+ interactionToken?: string;
19
+ // The current onchain interaction session of the user
20
+ interactionSession?: {
21
+ startTimestamp: number;
22
+ endTimestamp: number;
23
+ };
24
+ };
25
+
26
+ /**
27
+ * @ignore
28
+ * @inline
29
+ */
30
+ export type WalletNotConnected = {
31
+ key: "not-connected";
32
+ wallet?: never;
33
+ interactionToken?: never;
34
+ interactionSession?: never;
35
+ };