@frak-labs/core-sdk 0.0.19 → 0.1.0-beta.afa252b0
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/cdn/bundle.js +5 -5
- package/dist/actions.cjs +1 -1
- package/dist/actions.d.cts +154 -73
- package/dist/actions.d.ts +154 -73
- package/dist/actions.js +1 -1
- package/dist/bundle.cjs +2 -2
- package/dist/bundle.d.cts +257 -192
- package/dist/bundle.d.ts +257 -192
- package/dist/bundle.js +2 -2
- package/dist/index.cjs +11 -11
- package/dist/index.d.cts +199 -185
- package/dist/index.d.ts +199 -185
- package/dist/index.js +2 -2
- package/package.json +5 -1
package/dist/actions.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { Address } from 'viem';
|
|
2
2
|
import { Hex } from 'viem';
|
|
3
|
+
import type { LifecycleMessage } from '@frak-labs/frame-connector';
|
|
3
4
|
import type { OpenPanel } from '@openpanel/web';
|
|
4
|
-
import type {
|
|
5
|
-
import type { RpcSchema } from 'viem';
|
|
5
|
+
import type { RpcClient } from '@frak-labs/frame-connector';
|
|
6
6
|
import type { SiweMessage } from 'viem/siwe';
|
|
7
7
|
|
|
8
8
|
/**
|
|
@@ -237,34 +237,6 @@ declare type EmbeddedViewActionSharing = {
|
|
|
237
237
|
};
|
|
238
238
|
};
|
|
239
239
|
|
|
240
|
-
/**
|
|
241
|
-
* Type that extract the possible return type from a RPC Schema
|
|
242
|
-
* @ignore
|
|
243
|
-
*/
|
|
244
|
-
declare type ExtractedMethodFromRpc<TRpcSchema extends RpcSchema, TMethod extends ExtractedParametersFromRpc<TRpcSchema>["method"] = ExtractedParametersFromRpc<TRpcSchema>["method"]> = Extract<TRpcSchema[number], {
|
|
245
|
-
Method: TMethod;
|
|
246
|
-
}>;
|
|
247
|
-
|
|
248
|
-
/**
|
|
249
|
-
* Type that extract the possible parameters from a RPC Schema
|
|
250
|
-
* @ignore
|
|
251
|
-
*/
|
|
252
|
-
declare type ExtractedParametersFromRpc<TRpcSchema extends RpcSchema> = {
|
|
253
|
-
[K in keyof TRpcSchema]: Prettify<{
|
|
254
|
-
method: TRpcSchema[K] extends TRpcSchema[number] ? TRpcSchema[K]["Method"] : string;
|
|
255
|
-
} & (TRpcSchema[K] extends TRpcSchema[number] ? TRpcSchema[K]["Parameters"] extends undefined ? {
|
|
256
|
-
params?: never;
|
|
257
|
-
} : {
|
|
258
|
-
params: TRpcSchema[K]["Parameters"];
|
|
259
|
-
} : never)>;
|
|
260
|
-
}[number];
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* Type that extract the possible return type from a RPC Schema
|
|
264
|
-
* @ignore
|
|
265
|
-
*/
|
|
266
|
-
declare type ExtractedReturnTypeFromRpc<TRpcSchema extends RpcSchema, TParameters extends ExtractedParametersFromRpc<TRpcSchema> = ExtractedParametersFromRpc<TRpcSchema>> = ExtractedMethodFromRpc<TRpcSchema, TParameters["method"]>["ReturnType"];
|
|
267
|
-
|
|
268
240
|
/**
|
|
269
241
|
* The different types of final actions we can display in the final step
|
|
270
242
|
* @group Modal Display
|
|
@@ -490,40 +462,51 @@ declare type I18nConfig = Record<Language, LocalizedI18nConfig> | LocalizedI18nC
|
|
|
490
462
|
/**
|
|
491
463
|
* RPC interface that's used for the iframe communication
|
|
492
464
|
*
|
|
493
|
-
* Define all the methods available within the iFrame RPC client
|
|
465
|
+
* Define all the methods available within the iFrame RPC client with response type annotations
|
|
494
466
|
*
|
|
495
467
|
* @group RPC Schema
|
|
496
468
|
*
|
|
497
469
|
* @remarks
|
|
498
|
-
*
|
|
470
|
+
* Each method in the schema now includes a ResponseType field that indicates:
|
|
471
|
+
* - "promise": One-shot request that resolves once
|
|
472
|
+
* - "stream": Streaming request that can emit multiple values
|
|
473
|
+
*
|
|
474
|
+
* ### Methods:
|
|
499
475
|
*
|
|
500
|
-
*
|
|
476
|
+
* #### frak_listenToWalletStatus
|
|
501
477
|
* - Params: None
|
|
502
478
|
* - Returns: {@link WalletStatusReturnType}
|
|
479
|
+
* - Response Type: stream (emits updates when wallet status changes)
|
|
503
480
|
*
|
|
504
|
-
*
|
|
505
|
-
* - Params: [{@link ModalRpcStepsInput},
|
|
481
|
+
* #### frak_displayModal
|
|
482
|
+
* - Params: [requests: {@link ModalRpcStepsInput}, metadata?: {@link ModalRpcMetadata}, configMetadata: {@link FrakWalletSdkConfig}["metadata"]]
|
|
506
483
|
* - Returns: {@link ModalRpcStepsResultType}
|
|
484
|
+
* - Response Type: promise (one-shot)
|
|
507
485
|
*
|
|
508
|
-
*
|
|
486
|
+
* #### frak_sendInteraction
|
|
509
487
|
* - Params: [productId: Hex, interaction: {@link PreparedInteraction}, signature?: Hex]
|
|
510
488
|
* - Returns: {@link SendInteractionReturnType}
|
|
489
|
+
* - Response Type: promise (one-shot)
|
|
511
490
|
*
|
|
512
|
-
*
|
|
513
|
-
* - Params [params: {@link OpenSsoParamsType}, name: string, customCss?: string]
|
|
514
|
-
* - Returns:
|
|
491
|
+
* #### frak_sso
|
|
492
|
+
* - Params: [params: {@link OpenSsoParamsType}, name: string, customCss?: string]
|
|
493
|
+
* - Returns: {@link OpenSsoReturnType}
|
|
494
|
+
* - Response Type: promise (one-shot)
|
|
515
495
|
*
|
|
516
|
-
*
|
|
496
|
+
* #### frak_getProductInformation
|
|
517
497
|
* - Params: None
|
|
518
498
|
* - Returns: {@link GetProductInformationReturnType}
|
|
499
|
+
* - Response Type: promise (one-shot)
|
|
519
500
|
*
|
|
520
|
-
*
|
|
521
|
-
* - Params: [{@link DisplayEmbeddedWalletParamsType}]
|
|
501
|
+
* #### frak_displayEmbeddedWallet
|
|
502
|
+
* - Params: [request: {@link DisplayEmbeddedWalletParamsType}, metadata: {@link FrakWalletSdkConfig}["metadata"]]
|
|
522
503
|
* - Returns: {@link DisplayEmbeddedWalletResultType}
|
|
504
|
+
* - Response Type: promise (one-shot)
|
|
523
505
|
*/
|
|
524
506
|
declare type IFrameRpcSchema = [
|
|
525
507
|
/**
|
|
526
508
|
* Method used to listen to the wallet status
|
|
509
|
+
* This is a streaming method that emits updates when wallet status changes
|
|
527
510
|
*/
|
|
528
511
|
{
|
|
529
512
|
Method: "frak_listenToWalletStatus";
|
|
@@ -532,6 +515,7 @@ declare type IFrameRpcSchema = [
|
|
|
532
515
|
},
|
|
533
516
|
/**
|
|
534
517
|
* Method to display a modal with the provided steps
|
|
518
|
+
* This is a one-shot request
|
|
535
519
|
*/
|
|
536
520
|
{
|
|
537
521
|
Method: "frak_displayModal";
|
|
@@ -544,6 +528,7 @@ declare type IFrameRpcSchema = [
|
|
|
544
528
|
},
|
|
545
529
|
/**
|
|
546
530
|
* Method to transmit a user interaction
|
|
531
|
+
* This is a one-shot request
|
|
547
532
|
*/
|
|
548
533
|
{
|
|
549
534
|
Method: "frak_sendInteraction";
|
|
@@ -555,23 +540,40 @@ declare type IFrameRpcSchema = [
|
|
|
555
540
|
ReturnType: SendInteractionReturnType;
|
|
556
541
|
},
|
|
557
542
|
/**
|
|
558
|
-
* Method to
|
|
559
|
-
*
|
|
543
|
+
* Method to prepare SSO (generate URL for popup)
|
|
544
|
+
* Returns the SSO URL that should be opened in a popup
|
|
545
|
+
* Only used for popup flows (not redirect flows)
|
|
560
546
|
*/
|
|
561
547
|
{
|
|
562
|
-
Method: "
|
|
548
|
+
Method: "frak_prepareSso";
|
|
549
|
+
Parameters: [
|
|
550
|
+
params: PrepareSsoParamsType,
|
|
551
|
+
name: string,
|
|
552
|
+
customCss?: string
|
|
553
|
+
];
|
|
554
|
+
ReturnType: PrepareSsoReturnType;
|
|
555
|
+
},
|
|
556
|
+
/**
|
|
557
|
+
* Method to open/trigger SSO
|
|
558
|
+
* Either triggers redirect (if openInSameWindow/redirectUrl)
|
|
559
|
+
* Or waits for popup completion (if popup mode)
|
|
560
|
+
* This method handles BOTH redirect and popup flows
|
|
561
|
+
*/
|
|
562
|
+
{
|
|
563
|
+
Method: "frak_openSso";
|
|
563
564
|
Parameters: [
|
|
564
565
|
params: OpenSsoParamsType,
|
|
565
566
|
name: string,
|
|
566
567
|
customCss?: string
|
|
567
568
|
];
|
|
568
|
-
ReturnType:
|
|
569
|
+
ReturnType: OpenSsoReturnType;
|
|
569
570
|
},
|
|
570
571
|
/**
|
|
571
572
|
* Method to get current product information's
|
|
572
573
|
* - Is product minted?
|
|
573
574
|
* - Does it have running campaign?
|
|
574
575
|
* - Estimated reward on actions
|
|
576
|
+
* This is a one-shot request
|
|
575
577
|
*/
|
|
576
578
|
{
|
|
577
579
|
Method: "frak_getProductInformation";
|
|
@@ -580,6 +582,7 @@ declare type IFrameRpcSchema = [
|
|
|
580
582
|
},
|
|
581
583
|
/**
|
|
582
584
|
* Method to show the embedded wallet, with potential customization
|
|
585
|
+
* This is a one-shot request
|
|
583
586
|
*/
|
|
584
587
|
{
|
|
585
588
|
Method: "frak_displayEmbeddedWallet";
|
|
@@ -606,11 +609,11 @@ declare type IFrameTransport = {
|
|
|
606
609
|
/**
|
|
607
610
|
* Function used to perform a single request via the iframe transport
|
|
608
611
|
*/
|
|
609
|
-
request:
|
|
612
|
+
request: RpcClient<IFrameRpcSchema, LifecycleMessage>["request"];
|
|
610
613
|
/**
|
|
611
614
|
* Function used to listen to a request response via the iframe transport
|
|
612
615
|
*/
|
|
613
|
-
listenerRequest:
|
|
616
|
+
listenerRequest: RpcClient<IFrameRpcSchema, LifecycleMessage>["listen"];
|
|
614
617
|
/**
|
|
615
618
|
* Function used to destroy the iframe transport
|
|
616
619
|
*/
|
|
@@ -652,12 +655,6 @@ declare const interactionTypes: {
|
|
|
652
655
|
*/
|
|
653
656
|
declare type Language = "fr" | "en";
|
|
654
657
|
|
|
655
|
-
/**
|
|
656
|
-
* Type used for a listening request
|
|
657
|
-
* @inline
|
|
658
|
-
*/
|
|
659
|
-
declare type ListenerRequestFn<TRpcSchema extends RpcSchema> = <TParameters extends ExtractedParametersFromRpc<TRpcSchema> = ExtractedParametersFromRpc<TRpcSchema>, _ReturnType = ExtractedReturnTypeFromRpc<TRpcSchema, TParameters>>(args: TParameters, callback: (result: _ReturnType) => void) => Promise<void>;
|
|
660
|
-
|
|
661
658
|
/**
|
|
662
659
|
* A localized i18n config
|
|
663
660
|
* @category Config
|
|
@@ -926,7 +923,16 @@ declare type OpenInteractionSessionReturnType = {
|
|
|
926
923
|
* @param client - The current Frak Client
|
|
927
924
|
* @param args - The SSO parameters
|
|
928
925
|
*
|
|
929
|
-
* @description
|
|
926
|
+
* @description Two SSO flow modes:
|
|
927
|
+
*
|
|
928
|
+
* **Redirect Mode** (openInSameWindow: true):
|
|
929
|
+
* - Wallet generates URL and triggers redirect
|
|
930
|
+
* - Used when redirectUrl is provided
|
|
931
|
+
*
|
|
932
|
+
* **Popup Mode** (openInSameWindow: false/omitted):
|
|
933
|
+
* - SDK generates URL client-side (or uses provided ssoPopupUrl)
|
|
934
|
+
* - Opens popup synchronously (prevents popup blockers)
|
|
935
|
+
* - Waits for SSO completion via postMessage
|
|
930
936
|
*
|
|
931
937
|
* @example
|
|
932
938
|
* First we build the sso metadata
|
|
@@ -940,29 +946,107 @@ declare type OpenInteractionSessionReturnType = {
|
|
|
940
946
|
*
|
|
941
947
|
* Then, either use it with direct exit (and so user is directly redirected to your website), or a custom redirect URL
|
|
942
948
|
* :::code-group
|
|
943
|
-
* ```ts [
|
|
944
|
-
* //
|
|
949
|
+
* ```ts [Popup (default)]
|
|
950
|
+
* // Opens in popup, SDK generates URL automatically
|
|
945
951
|
* await openSso(frakConfig, {
|
|
946
952
|
* directExit: true,
|
|
947
953
|
* metadata,
|
|
948
954
|
* });
|
|
949
955
|
* ```
|
|
950
|
-
* ```ts [
|
|
951
|
-
* //
|
|
956
|
+
* ```ts [Redirect]
|
|
957
|
+
* // Opens in same window with redirect
|
|
952
958
|
* await openSso(frakConfig, {
|
|
953
959
|
* redirectUrl: "https://my-app.com/frak-sso",
|
|
954
960
|
* metadata,
|
|
961
|
+
* openInSameWindow: true,
|
|
962
|
+
* });
|
|
963
|
+
* ```
|
|
964
|
+
* ```ts [Custom popup URL]
|
|
965
|
+
* // Advanced: provide custom SSO URL
|
|
966
|
+
* const { ssoUrl } = await prepareSso(frakConfig, { metadata });
|
|
967
|
+
* await openSso(frakConfig, {
|
|
968
|
+
* metadata,
|
|
969
|
+
* ssoPopupUrl: `${ssoUrl}&custom=param`,
|
|
955
970
|
* });
|
|
956
971
|
* ```
|
|
957
972
|
* :::
|
|
958
973
|
*/
|
|
959
|
-
export declare function openSso(client: FrakClient, args: OpenSsoParamsType): Promise<
|
|
974
|
+
export declare function openSso(client: FrakClient, args: OpenSsoParamsType): Promise<OpenSsoReturnType>;
|
|
960
975
|
|
|
961
976
|
/**
|
|
962
977
|
* Params to start a SSO
|
|
963
978
|
* @group RPC Schema
|
|
964
979
|
*/
|
|
965
|
-
declare type OpenSsoParamsType = {
|
|
980
|
+
declare type OpenSsoParamsType = PrepareSsoParamsType & {
|
|
981
|
+
/**
|
|
982
|
+
* 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
|
|
983
|
+
* Note: Default true if redirectUrl is present, otherwise, false
|
|
984
|
+
*/
|
|
985
|
+
openInSameWindow?: boolean;
|
|
986
|
+
/**
|
|
987
|
+
* Custom SSO popup url if user want additionnal customisation
|
|
988
|
+
*/
|
|
989
|
+
ssoPopupUrl?: string;
|
|
990
|
+
};
|
|
991
|
+
|
|
992
|
+
/**
|
|
993
|
+
* Response after an SSO has been openned
|
|
994
|
+
*/
|
|
995
|
+
declare type OpenSsoReturnType = {
|
|
996
|
+
/**
|
|
997
|
+
* Optional wallet address, returned when SSO completes via postMessage
|
|
998
|
+
* Note: Only present when SSO flow completes (not immediately on open)
|
|
999
|
+
*/
|
|
1000
|
+
wallet?: Hex;
|
|
1001
|
+
};
|
|
1002
|
+
|
|
1003
|
+
/**
|
|
1004
|
+
* Represent a prepared user interaction, ready to be sent on-chain via the wallet
|
|
1005
|
+
*/
|
|
1006
|
+
declare type PreparedInteraction = {
|
|
1007
|
+
handlerTypeDenominator: Hex;
|
|
1008
|
+
interactionData: Hex;
|
|
1009
|
+
};
|
|
1010
|
+
|
|
1011
|
+
/**
|
|
1012
|
+
* Generate SSO URL without opening popup
|
|
1013
|
+
*
|
|
1014
|
+
* This is a **synchronous**, client-side function that generates the SSO URL
|
|
1015
|
+
* without any RPC calls to the wallet iframe. Use this when you need:
|
|
1016
|
+
* - Custom URL modifications before opening popup
|
|
1017
|
+
* - Pre-generation for advanced popup strategies
|
|
1018
|
+
* - URL inspection/logging before SSO flow
|
|
1019
|
+
*
|
|
1020
|
+
* @param client - The current Frak Client
|
|
1021
|
+
* @param args - The SSO parameters
|
|
1022
|
+
* @returns Object containing the generated ssoUrl
|
|
1023
|
+
*
|
|
1024
|
+
* @example
|
|
1025
|
+
* ```ts
|
|
1026
|
+
* // Generate URL for inspection
|
|
1027
|
+
* const { ssoUrl } = prepareSso(client, {
|
|
1028
|
+
* metadata: { logoUrl: "..." },
|
|
1029
|
+
* directExit: true
|
|
1030
|
+
* });
|
|
1031
|
+
* console.log("Opening SSO:", ssoUrl);
|
|
1032
|
+
*
|
|
1033
|
+
* // Add custom params
|
|
1034
|
+
* const customUrl = `${ssoUrl}&tracking=abc123`;
|
|
1035
|
+
* await openSso(client, { metadata, ssoPopupUrl: customUrl });
|
|
1036
|
+
* ```
|
|
1037
|
+
*
|
|
1038
|
+
* @remarks
|
|
1039
|
+
* For most use cases, just use `openSso()` which handles URL generation automatically.
|
|
1040
|
+
* Only use `prepareSso()` when you need explicit control over the URL.
|
|
1041
|
+
*/
|
|
1042
|
+
export declare function prepareSso(client: FrakClient, args: PrepareSsoParamsType): Promise<PrepareSsoReturnType>;
|
|
1043
|
+
|
|
1044
|
+
/**
|
|
1045
|
+
* Params for preparing SSO (generating URL)
|
|
1046
|
+
* Same as OpenSsoParamsType but without openInSameWindow (popup-only operation)
|
|
1047
|
+
* @group RPC Schema
|
|
1048
|
+
*/
|
|
1049
|
+
declare type PrepareSsoParamsType = {
|
|
966
1050
|
/**
|
|
967
1051
|
* Redirect URL after the SSO (optional)
|
|
968
1052
|
*/
|
|
@@ -980,15 +1064,18 @@ declare type OpenSsoParamsType = {
|
|
|
980
1064
|
/**
|
|
981
1065
|
* Custom SSO metadata
|
|
982
1066
|
*/
|
|
983
|
-
metadata
|
|
1067
|
+
metadata?: SsoMetadata;
|
|
984
1068
|
};
|
|
985
1069
|
|
|
986
1070
|
/**
|
|
987
|
-
*
|
|
1071
|
+
* Response after preparing SSO
|
|
1072
|
+
* @group RPC Schema
|
|
988
1073
|
*/
|
|
989
|
-
declare type
|
|
990
|
-
|
|
991
|
-
|
|
1074
|
+
declare type PrepareSsoReturnType = {
|
|
1075
|
+
/**
|
|
1076
|
+
* The SSO URL that should be opened in a popup
|
|
1077
|
+
*/
|
|
1078
|
+
ssoUrl: string;
|
|
992
1079
|
};
|
|
993
1080
|
|
|
994
1081
|
/**
|
|
@@ -1083,12 +1170,6 @@ export declare function referralInteraction(client: FrakClient, { productId, mod
|
|
|
1083
1170
|
*/
|
|
1084
1171
|
declare type ReferralState = "idle" | "processing" | "success" | "no-wallet" | "no-session" | "error" | "no-referrer" | "self-referral";
|
|
1085
1172
|
|
|
1086
|
-
/**
|
|
1087
|
-
* Type used for a one shot request function
|
|
1088
|
-
* @inline
|
|
1089
|
-
*/
|
|
1090
|
-
declare type RequestFn<TRpcSchema extends RpcSchema> = <TParameters extends ExtractedParametersFromRpc<TRpcSchema> = ExtractedParametersFromRpc<TRpcSchema>, _ReturnType = ExtractedReturnTypeFromRpc<TRpcSchema, TParameters>>(args: TParameters) => Promise<_ReturnType>;
|
|
1091
|
-
|
|
1092
1173
|
/**
|
|
1093
1174
|
* Function used to send an interaction
|
|
1094
1175
|
* @param client - The current Frak Client
|
|
@@ -1381,7 +1462,7 @@ declare type WalletStatusReturnType = WalletConnected | WalletNotConnected;
|
|
|
1381
1462
|
* Function used to watch the current frak wallet status
|
|
1382
1463
|
* @param client - The current Frak Client
|
|
1383
1464
|
* @param callback - The callback that will receive any wallet status change
|
|
1384
|
-
* @returns A
|
|
1465
|
+
* @returns A promise resolving with the initial wallet status
|
|
1385
1466
|
*
|
|
1386
1467
|
* @description This function will return the current wallet status, and will listen to any change in the wallet status.
|
|
1387
1468
|
*
|
package/dist/actions.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{Deferred as e,FrakRpcError as t,RpcErrorCodes as r,compressJson as n}from"@frak-labs/frame-connector";import{bytesToHex as a,concatHex as o,hexToBytes as i,isAddressEqual as s,keccak256 as l,pad as c,toHex as u}from"viem";import{generateSiweNonce as d}from"viem/siwe";function f(t,r){if(!r)return t.request({method:"frak_listenToWalletStatus"}).then(e=>(p(t,e),e));let n=new e,a=!1;return t.listenerRequest({method:"frak_listenToWalletStatus"},e=>{p(t,e),r(e),a||(n.resolve(e),a=!0)}),n.promise}function p(e,t){"undefined"!=typeof window&&(e.openPanel?.setGlobalProperties({wallet:t.wallet??null}),t.interactionToken?window.sessionStorage.setItem("frak-wallet-interaction-token",t.interactionToken):window.sessionStorage.removeItem("frak-wallet-interaction-token"))}function w({domain:e}={}){return l(u((e??window.location.host).replace("www.","")))}async function m(e,{productId:t,interaction:r,validation:n}){let a=t??w(e.config);return await e.request({method:"frak_sendInteraction",params:[a,r,n]})}async function h(e,{steps:t,metadata:r}){return await e.request({method:"frak_displayModal",params:[t,r,e.config.metadata]})}async function g(e,t){return await e.request({method:"frak_displayEmbeddedWallet",params:[t,e.config.metadata]})}function k(e){return btoa(Array.from(e,e=>String.fromCharCode(e)).join("")).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function y(e,t){let{metadata:r,customizations:a,walletUrl:o}=e.config;if(t.openInSameWindow??!!t.redirectUrl)return await e.request({method:"frak_openSso",params:[t,r.name,a?.css]});let i=t.ssoPopupUrl??function(e,t,r,a,o){var i;let s=k(n({r:(i={redirectUrl:t.redirectUrl,directExit:t.directExit,lang:t.lang,productId:r,metadata:{name:a,css:o,logoUrl:t.metadata?.logoUrl,homepageLink:t.metadata?.homepageLink}}).redirectUrl,d:i.directExit,l:i.lang,p:i.productId,m:{n:i.metadata?.name,css:i.metadata?.css,l:i.metadata?.logoUrl,h:i.metadata?.homepageLink}})),l=new URL(e);return l.pathname="/sso",l.searchParams.set("p",s),l.toString()}(o??"https://wallet.frak.id",t,w(),r.name,a?.css),s=window.open(i,"frak-sso","menubar=no,status=no,scrollbars=no,fullscreen=no,width=500, height=800");if(!s)throw Error("Popup was blocked. Please allow popups for this site.");return s.focus(),await e.request({method:"frak_openSso",params:[t,r.name,a?.css]})??{}}async function S(e,t){let{metadata:r,customizations:n}=e.config;return await e.request({method:"frak_prepareSso",params:[t,r.name,n?.css]})}async function U(e){return await e.request({method:"frak_getProductInformation"})}async function b(e){if("undefined"==typeof window)return void console.warn("[Frak] No window found, can't track purchase");let t=window.sessionStorage.getItem("frak-wallet-interaction-token");if(!t)return void console.warn("[Frak] No frak session found, skipping purchase check");await fetch("https://backend.frak.id/interactions/listenForPurchase",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","x-wallet-sdk-auth":t},body:JSON.stringify(e)})}async function v(e,{siwe:t,metadata:r}){let n=e.config?.domain??window.location.host,a=t?.statement??`I confirm that I want to use my Frak wallet on: ${e.config.metadata.name}`,o={...t,statement:a,nonce:t?.nonce??d(),uri:t?.uri??`https://${n}`,version:t?.version??"1",domain:n};return(await h(e,{metadata:r,steps:{login:{},siweAuthenticate:{siwe:o}}})).siweAuthenticate}async function I(e,{tx:t,metadata:r}){return(await h(e,{metadata:r,steps:{login:{},sendTransaction:{tx:t}}})).sendTransaction}function P(e,{metadata:t,login:r,openSession:n}){return function e(t,r){async function n(e){return e&&(r.metadata=e(r.metadata??{})),await h(t,r)}return{params:r,sendTx:function(n){return e(t,{...r,steps:{...r.steps,sendTransaction:n}})},reward:function(n){return e(t,{...r,steps:{...r.steps,final:{...n,action:{key:"reward"}}}})},sharing:function(n,a){return e(t,{...r,steps:{...r.steps,final:{...a,action:{key:"sharing",options:n}}}})},display:n}}(e,{steps:{login:r??{},openSession:n??{}},metadata:t})}let x="fCtx";function T({url:e}){if(!e)return null;let t=new URL(e).searchParams.get(x);return t?function(e){if(e&&0!==e.length)try{let t=function(e){let t=e.length%4;return Uint8Array.from(atob(e.replace(/-/g,"+").replace(/_/g,"/").padEnd(e.length+(0===t?0:4-t),"=")),e=>e.charCodeAt(0))}(e);return{r:a(t,{size:20})}}catch(t){console.error("Error decompressing Frak context",{e:t,context:e})}}(t):null}let E={parse:T,replaceUrl:function({url:e,context:t}){let r;if(!window.location?.href||"undefined"==typeof window)return void console.error("No window found, can't update context");let n=e??window.location.href;(r=null!==t?function({url:e,context:t}){if(!e)return null;let r=T({url:e}),n=r?{...r,...t}:t;if(!n.r)return null;let a=function(e){if(e?.r)try{let t=i(e.r);return k(t)}catch(t){console.error("Error compressing Frak context",{e:t,context:e})}}(n);if(!a)return null;let o=new URL(e);return o.searchParams.set(x,a),o.toString()}({url:n,context:t}):function(e){let t=new URL(e);return t.searchParams.delete(x),t.toString()}(n))&&window.history.replaceState(null,"",r.toString())}},_="0x010cc3b9",F="0xb2c0f17c",q={dapp:1,press:2,webshop:3,retail:4,referral:30,purchase:31};Object.entries(q).reduce((e,[t,r])=>(e[t]=BigInt(1)<<BigInt(r),e),{});let A={createLink:()=>({handlerTypeDenominator:u(q.referral),interactionData:F}),referred({referrer:e}){let t=o([_,c(e,{size:32})]);return{handlerTypeDenominator:u(q.referral),interactionData:t}}};async function L(e,{walletStatus:n,frakContext:a,modalConfig:o,productId:i,options:s}){let l=!1;async function c(){if(!l)return l=!0,W(e,{modalConfig:{...o,loggedIn:{action:{key:"referred"}}},walletStatus:n})}async function u(t){let r=A.referred({referrer:t});await Promise.allSettled([m(e,{productId:i,interaction:r}),function(e,t,r={}){if(!e)return void console.debug("[Frak] No client provided, skipping event tracking");try{e.openPanel?.track(t,r)}catch(e){console.debug("[Frak] Failed to track event:",t,e)}}(e,"user_referred",{properties:{referrer:t}})])}try{let{status:e,currentWallet:t}=await C({initialWalletStatus:n,getFreshWalletStatus:c,pushReferralInteraction:u,frakContext:a});return E.replaceUrl({url:window.location?.href,context:s?.alwaysAppendUrl?{r:t}:null}),e}catch(e){return console.log("Error processing referral",{error:e}),E.replaceUrl({url:window.location?.href,context:s?.alwaysAppendUrl?{r:n?.wallet}:null}),function(e){if(e instanceof t)switch(e.code){case r.walletNotConnected:return"no-wallet";case r.serverErrorForInteractionDelegation:return"no-session"}return"error"}(e)}}async function C({initialWalletStatus:e,getFreshWalletStatus:t,pushReferralInteraction:r,frakContext:n}){let a=e?.wallet;return n?.r?(a||(a=await t()),a&&s(n.r,a))?{status:"self-referral",currentWallet:a}:(e?.interactionSession||(a=await t()),await r(n.r),{status:"success",currentWallet:a}):{status:"no-referrer",currentWallet:a}}async function W(e,{modalConfig:t,walletStatus:r}){if(!r?.interactionSession){let r=await g(e,t??{});return r?.wallet??void 0}return r.wallet??void 0}async function N(e,{productId:t,modalConfig:r,options:n}={}){let a=E.parse({url:window.location.href}),o=await f(e);try{return await L(e,{walletStatus:o,frakContext:a,modalConfig:r,productId:t,options:n})}catch(e){console.warn("Error processing referral",{error:e})}}export{g as displayEmbeddedWallet,h as displayModal,U as getProductInformation,P as modalBuilder,y as openSso,S as prepareSso,L as processReferral,N as referralInteraction,m as sendInteraction,I as sendTransaction,v as siweAuthenticate,b as trackPurchaseStatus,f as watchWalletStatus};
|
package/dist/bundle.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";let __rslib_import_meta_url__="undefined"==typeof document?new(require("url".replace("",""))).URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href;var __webpack_require__={};__webpack_require__.d=(e,t)=>{for(var r in t)__webpack_require__.o(t,r)&&!__webpack_require__.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__={};__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{decompressJsonFromB64:()=>decompressJsonFromB64,PressInteractionEncoder:()=>PressInteractionEncoder,getProductInformation:()=>getProductInformation,
|
|
1
|
+
"use strict";let __rslib_import_meta_url__="undefined"==typeof document?new(require("url".replace("",""))).URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href;var __webpack_require__={};__webpack_require__.d=(e,t)=>{for(var r in t)__webpack_require__.o(t,r)&&!__webpack_require__.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__={};__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{decompressJsonFromB64:()=>decompressJsonFromB64,PressInteractionEncoder:()=>PressInteractionEncoder,getProductInformation:()=>getProductInformation,findIframeInOpener:()=>findIframeInOpener,createIFrameFrakClient:()=>createIFrameFrakClient,generateSsoUrl:()=>generateSsoUrl,getCurrencyAmountKey:()=>getCurrencyAmountKey,sendInteraction:()=>sendInteraction,FrakContextManager:()=>FrakContextManager,getSupportedLocale:()=>getSupportedLocale,compressJsonToB64:()=>compressJsonToB64,baseIframeProps:()=>baseIframeProps,DebugInfoGatherer:()=>DebugInfoGatherer,base64urlEncode:()=>base64urlEncode,processReferral:()=>processReferral,ReferralInteractionEncoder:()=>ReferralInteractionEncoder,modalBuilder:()=>modalBuilder,productTypes:()=>productTypes,referralInteraction:()=>referralInteraction,prepareSso:()=>prepareSso,siweAuthenticate:()=>siweAuthenticate,locales:()=>locales,ssoPopupName:()=>ssoPopupName,productTypesMask:()=>productTypesMask,trackPurchaseStatus:()=>trackPurchaseStatus,interactionTypes:()=>interactionTypes,getSupportedCurrency:()=>getSupportedCurrency,PurchaseInteractionEncoder:()=>PurchaseInteractionEncoder,sendTransaction:()=>sendTransaction,formatAmount:()=>formatAmount,trackEvent:()=>trackEvent,base64urlDecode:()=>base64urlDecode,displayEmbeddedWallet:()=>displayEmbeddedWallet,displayModal:()=>displayModal,watchWalletStatus:()=>watchWalletStatus,ssoPopupFeatures:()=>ssoPopupFeatures,RetailInteractionEncoder:()=>RetailInteractionEncoder,setupClient:()=>setupClient,createIframe:()=>createIframe,openSso:()=>openSso,WebShopInteractionEncoder:()=>WebShopInteractionEncoder});let frame_connector_namespaceObject=require("@frak-labs/frame-connector"),middleware_namespaceObject=require("@frak-labs/frame-connector/middleware"),web_namespaceObject=require("@openpanel/web"),BACKUP_KEY="nexus-wallet-backup";function setupSsoUrlListener(e,t){if("undefined"==typeof window)return;let r=new URL(window.location.href),a=r.searchParams.get("sso");a&&(t.then(()=>{e.sendLifecycle({clientLifecycle:"sso-redirect-complete",data:{compressed:a}}),console.log("[SSO URL Listener] Forwarded compressed SSO data to iframe")}).catch(e=>{console.error("[SSO URL Listener] Failed to forward SSO data:",e)}),r.searchParams.delete("sso"),window.history.replaceState({},"",r.toString()),console.log("[SSO URL Listener] SSO parameter detected and URL cleaned"))}class DebugInfoGatherer{config;iframe;isSetupDone=!1;lastResponse=null;lastRequest=null;constructor(e,t){this.config=e,this.iframe=t,this.lastRequest=null,this.lastResponse=null}setLastResponse(e,t){this.lastResponse={message:e,response:t,timestamp:Date.now()}}setLastRequest(e){this.lastRequest={event:e,timestamp:Date.now()}}updateSetupStatus(e){this.isSetupDone=e}base64Encode(e){try{return btoa(JSON.stringify(e))}catch(e){return console.warn("Failed to encode debug data",e),btoa("Failed to encode data")}}getIframeStatus(){return this.iframe?{loading:this.iframe.hasAttribute("loading"),url:this.iframe.src,readyState:this.iframe.contentDocument?.readyState?+("complete"===this.iframe.contentDocument.readyState):-1,contentWindow:!!this.iframe.contentWindow,isConnected:this.iframe.isConnected}:null}getNavigatorInfo(){return navigator?{userAgent:navigator.userAgent,language:navigator.language,onLine:navigator.onLine,screenWidth:window.screen.width,screenHeight:window.screen.height,pixelRatio:window.devicePixelRatio}:null}gatherDebugInfo(e){let t=this.getIframeStatus(),r=this.getNavigatorInfo(),a="Unknown";return e instanceof frame_connector_namespaceObject.FrakRpcError?a=`FrakRpcError: ${e.code} '${e.message}'`:e instanceof Error?a=e.message:"string"==typeof e&&(a=e),{timestamp:new Date().toISOString(),encodedUrl:btoa(window.location.href),encodedConfig:this.config?this.base64Encode(this.config):"no-config",navigatorInfo:r?this.base64Encode(r):"no-navigator",iframeStatus:t?this.base64Encode(t):"not-iframe",lastRequest:this.lastRequest?this.base64Encode(this.lastRequest):"No Frak request logged",lastResponse:this.lastResponse?this.base64Encode(this.lastResponse):"No Frak response logged",clientStatus:this.isSetupDone?"setup":"not-setup",error:a}}static empty(){return new DebugInfoGatherer}formatDebugInfo(e){let t=this.gatherDebugInfo(e);return`
|
|
2
2
|
Debug Information:
|
|
3
3
|
-----------------
|
|
4
4
|
Timestamp: ${t.timestamp}
|
|
@@ -10,4 +10,4 @@
|
|
|
10
10
|
Last Response: ${t.lastResponse}
|
|
11
11
|
Client Status: ${t.clientStatus}
|
|
12
12
|
Error: ${t.error}
|
|
13
|
-
`.trim()}}function createIFrameChannelManager(){let e=new Map;return{createChannel:t=>{let r=Math.random().toString(36).substring(7);return e.set(r,t),r},getRpcResolver:t=>e.get(t),removeChannel:t=>e.delete(t),destroy:()=>e.clear()}}let baseIframeProps={id:"frak-wallet",name:"frak-wallet",title:"Frak Wallet",allow:"publickey-credentials-get *; clipboard-write; web-share *",style:{width:"0",height:"0",border:"0",position:"absolute",zIndex:2000001,top:"-1000px",left:"-1000px",colorScheme:"auto"}};function createIframe({walletBaseUrl:e,config:t}){let r=document.querySelector("#frak-wallet");r&&r.remove();let a=document.createElement("iframe");return a.id=baseIframeProps.id,a.name=baseIframeProps.name,a.allow=baseIframeProps.allow,a.style.zIndex=baseIframeProps.style.zIndex.toString(),changeIframeVisibility({iframe:a,isVisible:!1}),document.body.appendChild(a),new Promise(r=>{a?.addEventListener("load",()=>r(a)),a.src=`${t?.walletUrl??e??"https://wallet.frak.id"}/listener`})}function changeIframeVisibility({iframe:e,isVisible:t}){if(!t){e.style.width="0",e.style.height="0",e.style.border="0",e.style.position="fixed",e.style.top="-1000px",e.style.left="-1000px";return}e.style.position="fixed",e.style.top="0",e.style.left="0",e.style.width="100%",e.style.height="100%",e.style.pointerEvents="auto"}function createIFrameLifecycleManager({iframe:e}){let t=new Deferred;return{handleEvent:async r=>{switch(r.iframeLifecycle){case"connected":t.resolve(!0);break;case"do-backup":r.data.backup?localStorage.setItem(BACKUP_KEY,r.data.backup):localStorage.removeItem(BACKUP_KEY);break;case"remove-backup":localStorage.removeItem(BACKUP_KEY);break;case"show":case"hide":changeIframeVisibility({iframe:e,isVisible:"show"===r.iframeLifecycle});break;case"handshake":e.contentWindow?.postMessage({clientLifecycle:"handshake-response",data:{token:r.data.token,currentUrl:window.location.href}},"*");break;case"redirect":window.location.href=`${r.data.baseRedirectUrl}${encodeURIComponent(window.location.href)}`}},isConnected:t.promise}}function createIFrameMessageHandler({frakWalletUrl:e,iframe:t,channelManager:r,iframeLifecycleManager:a,debugInfo:n}){if("undefined"==typeof window)throw new FrakRpcError(RpcErrorCodes.configError,"iframe client should be used in the browser");if(!t.contentWindow)throw new FrakRpcError(RpcErrorCodes.configError,"The iframe does not have a product window");let o=t.contentWindow;async function s(t){if(!t.origin)return;try{if(new URL(t.origin).origin.toLowerCase()!==new URL(e).origin.toLowerCase())return}catch(e){console.log("Unable to check frak msg origin",e);return}if("object"!=typeof t.data)return;if(n.setLastResponse(t),"iframeLifecycle"in t.data)return void await a.handleEvent(t.data);if("clientLifecycle"in t.data)return void console.error("Client lifecycle event received on the client side, dismissing it");let o=t.data.id,s=r.getRpcResolver(o);s&&s(t.data)}return window.addEventListener("message",s),{sendEvent:function(t){o.postMessage(t,{targetOrigin:e}),n.setLastRequest(t,e)},cleanup:function(){window.removeEventListener("message",s)}}}function createIFrameFrakClient({config:e,iframe:t}){let r,a=createIFrameChannelManager(),n=createIFrameLifecycleManager({iframe:t}),o=new DebugInfoGatherer(e,t),s=createIFrameMessageHandler({frakWalletUrl:e?.walletUrl??"https://wallet.frak.id",iframe:t,channelManager:a,iframeLifecycleManager:n,debugInfo:o}),c=async e=>{if(!await n.isConnected)throw new FrakRpcError(RpcErrorCodes.clientNotConnected,"The iframe provider isn't connected yet");let t=new Deferred,r=a.createChannel(e=>{let n=decompressDataAndCheckHash(e.data);n.error?t.reject(new FrakRpcError(n.error.code,n.error.message,n.error?.data)):t.resolve(n.result),a.removeChannel(r)}),o=hashAndCompressData(e);return s.sendEvent({id:r,topic:e.method,data:o}),t.promise},i=async(e,t)=>{if(!await n.isConnected)throw new FrakRpcError(RpcErrorCodes.clientNotConnected,"The iframe provider isn't connected yet");let r=a.createChannel(e=>{let r=decompressDataAndCheckHash(e.data);if(r.result)t(r.result);else throw new InternalError("No valid result in the response")}),o=hashAndCompressData(e);s.sendEvent({id:r,topic:e.method,data:o})},l=setupHeartbeat(s,n),p=async()=>{l(),a.destroy(),s.cleanup(),t.remove()};console.log("[Frak SDK] Initializing OpenPanel"),(r=new web_namespaceObject.OpenPanel({apiUrl:"https://op-api.gcp.frak.id",clientId:"f305d11d-b93b-487c-80d4-92deb7903e98",trackScreenViews:!0,trackOutgoingLinks:!0,trackAttributes:!1,filter:({type:e,payload:t})=>!("track"===e&&t?.properties)||("sdkVersion"in t.properties||(t.properties={...t.properties,sdkVersion:"0.0.19"}),!0)})).setGlobalProperties({sdkVersion:"0.0.19"}),r.init();let d=postConnectionSetup({config:e,messageHandler:s,lifecycleManager:n}).then(()=>o.updateSetupStatus(!0));return{config:e,debugInfo:o,waitForConnection:n.isConnected,waitForSetup:d,request:c,listenerRequest:i,destroy:p,openPanel:r}}function setupHeartbeat(e,t){let r,a,n=()=>e.sendEvent({clientLifecycle:"heartbeat"});function o(){r&&clearInterval(r),a&&clearTimeout(a)}return async function(){n(),r=setInterval(n,100),a=setTimeout(()=>{o(),console.log("Heartbeat timeout: connection failed")},3e4),await t.isConnected,o()}(),o}async function postConnectionSetup({config:e,messageHandler:t,lifecycleManager:r}){async function a(){let r=e.customizations?.css;r&&t.sendEvent({clientLifecycle:"modal-css",data:{cssLink:r}})}async function n(){let r=e.customizations?.i18n;r&&t.sendEvent({clientLifecycle:"modal-i18n",data:{i18n:r}})}async function o(){if("undefined"==typeof window)return;let e=window.localStorage.getItem(BACKUP_KEY);e&&t.sendEvent({clientLifecycle:"restore-backup",data:{backup:e}})}await r.isConnected,await Promise.allSettled([a(),n(),o()])}let locales={eur:"fr-FR",usd:"en-US",gbp:"en-GB"};function getSupportedCurrency(e){return e&&e in locales?e:"eur"}async function setupClient({config:e}){let t=prepareConfig(e),r=await createIframe({config:t});if(!r)return void console.error("Failed to create iframe");let a=createIFrameFrakClient({config:t,iframe:r});return(await a.waitForSetup,await a.waitForConnection)?a:void console.error("Failed to connect to client")}function prepareConfig(e){let t=getSupportedCurrency(e.metadata?.currency);return{...e,metadata:{...e.metadata,currency:t}}}let contextKey="fCtx";function compress(e){if(e?.r)try{let t=(0,external_viem_namespaceObject.hexToBytes)(e.r);return base64urlEncode(t)}catch(t){console.error("Error compressing Frak context",{e:t,context:e})}}function decompress(e){if(e&&0!==e.length)try{let t=base64urlDecode(e);return{r:(0,external_viem_namespaceObject.bytesToHex)(t,{size:20})}}catch(t){console.error("Error decompressing Frak context",{e:t,context:e})}}function parse({url:e}){if(!e)return null;let t=new URL(e).searchParams.get(contextKey);return t?decompress(t):null}function update({url:e,context:t}){if(!e)return null;let r=parse({url:e}),a=r?{...r,...t}:t;if(!a.r)return null;let n=compress(a);if(!n)return null;let o=new URL(e);return o.searchParams.set(contextKey,n),o.toString()}function remove(e){let t=new URL(e);return t.searchParams.delete(contextKey),t.toString()}function replaceUrl({url:e,context:t}){let r;if(!window.location?.href||"undefined"==typeof window)return void console.error("No window found, can't update context");let a=e??window.location.href;(r=null!==t?update({url:a,context:t}):remove(a))&&window.history.replaceState(null,"",r.toString())}let FrakContextManager={compress,decompress,parse,update,remove,replaceUrl};function getSupportedLocale(e){return e?locales[e]??locales.eur:locales.eur}function getCurrencyAmountKey(e){return e?`${e}Amount`:"eurAmount"}function formatAmount(e,t){let r=getSupportedLocale(t),a=getSupportedCurrency(t);return e.toLocaleString(r,{style:"currency",currency:a,minimumFractionDigits:0,maximumFractionDigits:2})}function trackEvent(e,t,r={}){if(!e)return void console.debug("[Frak] No client provided, skipping event tracking");try{e.openPanel?.track(t,r)}catch(e){console.debug("[Frak] Failed to track event:",t,e)}}let productTypes={dapp:1,press:2,webshop:3,retail:4,referral:30,purchase:31},productTypesMask=Object.entries(productTypes).reduce((e,[t,r])=>(e[t]=BigInt(1)<<BigInt(r),e),{}),interactionTypes={press:{openArticle:"0xc0a24ffb",readArticle:"0xd5bd0fbe"},dapp:{proofVerifiableStorageUpdate:"0x2ab2aeef",callableVerifiableStorageUpdate:"0xa07da986"},webshop:{open:"0xb311798f"},referral:{referred:"0x010cc3b9",createLink:"0xb2c0f17c"},purchase:{started:"0xd87e90c3",completed:"0x8403aeb4",unsafeCompleted:"0x4d5b14e0"},retail:{customerMeeting:"0x74489004"}};function watchWalletStatus(e,t){if(!t)return e.request({method:"frak_listenToWalletStatus"}).then(t=>(walletStatusSideEffect(e,t),t));let r=new Deferred,a=!1;return e.listenerRequest({method:"frak_listenToWalletStatus"},n=>{walletStatusSideEffect(e,n),t(n),a||(r.resolve(n),a=!0)}).then(()=>r.promise)}function walletStatusSideEffect(e,t){"undefined"!=typeof window&&(e.openPanel?.setGlobalProperties({wallet:t.wallet??null}),t.interactionToken?window.sessionStorage.setItem("frak-wallet-interaction-token",t.interactionToken):window.sessionStorage.removeItem("frak-wallet-interaction-token"))}function computeProductId({domain:e}){let t=(e??window.location.host).replace("www.","");return(0,external_viem_namespaceObject.keccak256)((0,external_viem_namespaceObject.toHex)(t))}async function sendInteraction(e,{productId:t,interaction:r,validation:a}){let n=t??computeProductId(e.config);return await e.request({method:"frak_sendInteraction",params:[n,r,a]})}async function displayModal(e,{steps:t,metadata:r}){return await e.request({method:"frak_displayModal",params:[t,r,e.config.metadata]})}async function displayEmbeddedWallet(e,t){return await e.request({method:"frak_displayEmbeddedWallet",params:[t,e.config.metadata]})}async function openSso(e,t){let{metadata:r,customizations:a}=e.config;await e.request({method:"frak_sso",params:[t,r.name,a?.css]})}async function getProductInformation(e){return await e.request({method:"frak_getProductInformation"})}async function trackPurchaseStatus(e){if("undefined"==typeof window)return void console.warn("[Frak] No window found, can't track purchase");let t=window.sessionStorage.getItem("frak-wallet-interaction-token");if(!t)return void console.warn("[Frak] No frak session found, skipping purchase check");await fetch("https://backend.frak.id/interactions/listenForPurchase",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","x-wallet-sdk-auth":t},body:JSON.stringify(e)})}let siwe_namespaceObject=require("viem/siwe");async function siweAuthenticate(e,{siwe:t,metadata:r}){let a=e.config?.domain??window.location.host,n=t?.statement??`I confirm that I want to use my Frak wallet on: ${e.config.metadata.name}`,o={...t,statement:n,nonce:t?.nonce??(0,siwe_namespaceObject.generateSiweNonce)(),uri:t?.uri??`https://${a}`,version:t?.version??"1",domain:a};return(await displayModal(e,{metadata:r,steps:{login:{},siweAuthenticate:{siwe:o}}})).siweAuthenticate}async function sendTransaction(e,{tx:t,metadata:r}){return(await displayModal(e,{metadata:r,steps:{login:{},sendTransaction:{tx:t}}})).sendTransaction}function modalBuilder(e,{metadata:t,login:r,openSession:a}){return modalStepsBuilder(e,{steps:{login:r??{},openSession:a??{}},metadata:t})}function modalStepsBuilder(e,t){async function r(r){return r&&(t.metadata=r(t.metadata??{})),await displayModal(e,t)}return{params:t,sendTx:function(r){return modalStepsBuilder(e,{...t,steps:{...t.steps,sendTransaction:r}})},reward:function(r){return modalStepsBuilder(e,{...t,steps:{...t.steps,final:{...r,action:{key:"reward"}}}})},sharing:function(r,a){return modalStepsBuilder(e,{...t,steps:{...t.steps,final:{...a,action:{key:"sharing",options:r}}}})},display:r}}let ReferralInteractionEncoder={createLink:()=>({handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.referral),interactionData:interactionTypes.referral.createLink}),referred({referrer:e}){let t=(0,external_viem_namespaceObject.concatHex)([interactionTypes.referral.referred,(0,external_viem_namespaceObject.pad)(e,{size:32})]);return{handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.referral),interactionData:t}}};async function processReferral(e,{walletStatus:t,frakContext:r,modalConfig:a,productId:n,options:o}){let s=!1;async function c(){if(!s)return s=!0,ensureWalletConnected(e,{modalConfig:{...a,loggedIn:{action:{key:"referred"}}},walletStatus:t})}async function i(t){let r=ReferralInteractionEncoder.referred({referrer:t});await Promise.allSettled([sendInteraction(e,{productId:n,interaction:r}),trackEvent(e,"user_referred",{properties:{referrer:t}})])}try{let{status:e,currentWallet:a}=await processReferralLogic({initialWalletStatus:t,getFreshWalletStatus:c,pushReferralInteraction:i,frakContext:r});return FrakContextManager.replaceUrl({url:window.location?.href,context:o?.alwaysAppendUrl?{r:a}:null}),e}catch(e){return console.log("Error processing referral",{error:e}),FrakContextManager.replaceUrl({url:window.location?.href,context:o?.alwaysAppendUrl?{r:t?.wallet}:null}),mapErrorToState(e)}}async function processReferralLogic({initialWalletStatus:e,getFreshWalletStatus:t,pushReferralInteraction:r,frakContext:a}){let n=e?.wallet;return a?.r?(n||(n=await t()),n&&(0,external_viem_namespaceObject.isAddressEqual)(a.r,n))?{status:"self-referral",currentWallet:n}:(e?.interactionSession||(n=await t()),await r(a.r),{status:"success",currentWallet:n}):{status:"no-referrer",currentWallet:n}}async function ensureWalletConnected(e,{modalConfig:t,walletStatus:r}){if(!r?.interactionSession){let r=await displayEmbeddedWallet(e,t??{});return r?.wallet??void 0}return r.wallet??void 0}function mapErrorToState(e){if(e instanceof FrakRpcError)switch(e.code){case RpcErrorCodes.walletNotConnected:return"no-wallet";case RpcErrorCodes.serverErrorForInteractionDelegation:return"no-session"}return"error"}async function referralInteraction(e,{productId:t,modalConfig:r,options:a}={}){let n=FrakContextManager.parse({url:window.location.href}),o=await watchWalletStatus(e);try{return await processReferral(e,{walletStatus:o,frakContext:n,modalConfig:r,productId:t,options:a})}catch(e){console.warn("Error processing referral",{error:e})}}let PressInteractionEncoder={openArticle({articleId:e}){let t=(0,external_viem_namespaceObject.concatHex)([interactionTypes.press.openArticle,(0,external_viem_namespaceObject.pad)(e,{size:32})]);return{handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.press),interactionData:t}},readArticle({articleId:e}){let t=(0,external_viem_namespaceObject.concatHex)([interactionTypes.press.readArticle,(0,external_viem_namespaceObject.pad)(e,{size:32})]);return{handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.press),interactionData:t}}},PurchaseInteractionEncoder={startPurchase({purchaseId:e}){let t=(0,external_viem_namespaceObject.concatHex)([interactionTypes.purchase.started,(0,external_viem_namespaceObject.pad)(e,{size:32})]);return{handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.purchase),interactionData:t}},completedPurchase({purchaseId:e,proof:t}){let r=(0,external_viem_namespaceObject.encodeAbiParameters)([{type:"uint256"},{type:"bytes32[]"}],[BigInt(e),t]),a=(0,external_viem_namespaceObject.concatHex)([interactionTypes.purchase.completed,r]);return{handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.purchase),interactionData:a}},unsafeCompletedPurchase({purchaseId:e}){let t=(0,external_viem_namespaceObject.concatHex)([interactionTypes.purchase.unsafeCompleted,(0,external_viem_namespaceObject.pad)(e,{size:32})]);return{handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.purchase),interactionData:t}}},WebShopInteractionEncoder={open:()=>({handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.webshop),interactionData:interactionTypes.webshop.open})},RetailInteractionEncoder={customerMeeting({agencyId:e}){let t=(0,external_viem_namespaceObject.concatHex)([interactionTypes.retail.customerMeeting,(0,external_viem_namespaceObject.pad)(e,{size:32})]);return{handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.retail),interactionData:t}}};for(var __webpack_i__ in exports.ClientNotFound=__webpack_exports__.ClientNotFound,exports.DebugInfoGatherer=__webpack_exports__.DebugInfoGatherer,exports.Deferred=__webpack_exports__.Deferred,exports.FrakContextManager=__webpack_exports__.FrakContextManager,exports.FrakRpcError=__webpack_exports__.FrakRpcError,exports.PressInteractionEncoder=__webpack_exports__.PressInteractionEncoder,exports.PurchaseInteractionEncoder=__webpack_exports__.PurchaseInteractionEncoder,exports.ReferralInteractionEncoder=__webpack_exports__.ReferralInteractionEncoder,exports.RetailInteractionEncoder=__webpack_exports__.RetailInteractionEncoder,exports.RpcErrorCodes=__webpack_exports__.RpcErrorCodes,exports.WebShopInteractionEncoder=__webpack_exports__.WebShopInteractionEncoder,exports.base64urlDecode=__webpack_exports__.base64urlDecode,exports.base64urlEncode=__webpack_exports__.base64urlEncode,exports.baseIframeProps=__webpack_exports__.baseIframeProps,exports.compressJson=__webpack_exports__.compressJson,exports.compressJsonToB64=__webpack_exports__.compressJsonToB64,exports.createIFrameFrakClient=__webpack_exports__.createIFrameFrakClient,exports.createIframe=__webpack_exports__.createIframe,exports.decompressDataAndCheckHash=__webpack_exports__.decompressDataAndCheckHash,exports.decompressJson=__webpack_exports__.decompressJson,exports.decompressJsonFromB64=__webpack_exports__.decompressJsonFromB64,exports.displayEmbeddedWallet=__webpack_exports__.displayEmbeddedWallet,exports.displayModal=__webpack_exports__.displayModal,exports.formatAmount=__webpack_exports__.formatAmount,exports.getCurrencyAmountKey=__webpack_exports__.getCurrencyAmountKey,exports.getProductInformation=__webpack_exports__.getProductInformation,exports.getSupportedCurrency=__webpack_exports__.getSupportedCurrency,exports.getSupportedLocale=__webpack_exports__.getSupportedLocale,exports.hashAndCompressData=__webpack_exports__.hashAndCompressData,exports.interactionTypes=__webpack_exports__.interactionTypes,exports.locales=__webpack_exports__.locales,exports.modalBuilder=__webpack_exports__.modalBuilder,exports.openSso=__webpack_exports__.openSso,exports.processReferral=__webpack_exports__.processReferral,exports.productTypes=__webpack_exports__.productTypes,exports.productTypesMask=__webpack_exports__.productTypesMask,exports.referralInteraction=__webpack_exports__.referralInteraction,exports.sendInteraction=__webpack_exports__.sendInteraction,exports.sendTransaction=__webpack_exports__.sendTransaction,exports.setupClient=__webpack_exports__.setupClient,exports.siweAuthenticate=__webpack_exports__.siweAuthenticate,exports.trackEvent=__webpack_exports__.trackEvent,exports.trackPurchaseStatus=__webpack_exports__.trackPurchaseStatus,exports.watchWalletStatus=__webpack_exports__.watchWalletStatus,__webpack_exports__)-1===["ClientNotFound","DebugInfoGatherer","Deferred","FrakContextManager","FrakRpcError","PressInteractionEncoder","PurchaseInteractionEncoder","ReferralInteractionEncoder","RetailInteractionEncoder","RpcErrorCodes","WebShopInteractionEncoder","base64urlDecode","base64urlEncode","baseIframeProps","compressJson","compressJsonToB64","createIFrameFrakClient","createIframe","decompressDataAndCheckHash","decompressJson","decompressJsonFromB64","displayEmbeddedWallet","displayModal","formatAmount","getCurrencyAmountKey","getProductInformation","getSupportedCurrency","getSupportedLocale","hashAndCompressData","interactionTypes","locales","modalBuilder","openSso","processReferral","productTypes","productTypesMask","referralInteraction","sendInteraction","sendTransaction","setupClient","siweAuthenticate","trackEvent","trackPurchaseStatus","watchWalletStatus"].indexOf(__webpack_i__)&&(exports[__webpack_i__]=__webpack_exports__[__webpack_i__]);Object.defineProperty(exports,"__esModule",{value:!0});
|
|
13
|
+
`.trim()}}let baseIframeProps={id:"frak-wallet",name:"frak-wallet",title:"Frak Wallet",allow:"publickey-credentials-get *; clipboard-write; web-share *",style:{width:"0",height:"0",border:"0",position:"absolute",zIndex:2000001,top:"-1000px",left:"-1000px",colorScheme:"auto"}};function createIframe({walletBaseUrl:e,config:t}){let r=document.querySelector("#frak-wallet");r&&r.remove();let a=document.createElement("iframe");return a.id=baseIframeProps.id,a.name=baseIframeProps.name,a.allow=baseIframeProps.allow,a.style.zIndex=baseIframeProps.style.zIndex.toString(),changeIframeVisibility({iframe:a,isVisible:!1}),document.body.appendChild(a),new Promise(r=>{a?.addEventListener("load",()=>r(a)),a.src=`${t?.walletUrl??e??"https://wallet.frak.id"}/listener`})}function changeIframeVisibility({iframe:e,isVisible:t}){if(!t){e.style.width="0",e.style.height="0",e.style.border="0",e.style.position="fixed",e.style.top="-1000px",e.style.left="-1000px";return}e.style.position="fixed",e.style.top="0",e.style.left="0",e.style.width="100%",e.style.height="100%",e.style.pointerEvents="auto"}function findIframeInOpener(e="/listener"){if(!window.opener)return null;let t=t=>{try{return t.location.origin===window.location.origin&&t.location.pathname===e}catch{return!1}};try{let e=window.opener.frames;for(let r=0;r<e.length;r++)if(t(e[r]))return e[r];return null}catch(t){return console.error(`[findIframeInOpener] Error finding iframe with pathname ${e}:`,t),null}}function createIFrameLifecycleManager({iframe:e}){let t=new frame_connector_namespaceObject.Deferred;return{handleEvent:async r=>{if(!("iframeLifecycle"in r))return;let{iframeLifecycle:a,data:n}=r;switch(a){case"connected":t.resolve(!0);break;case"do-backup":n.backup?localStorage.setItem(BACKUP_KEY,n.backup):localStorage.removeItem(BACKUP_KEY);break;case"remove-backup":localStorage.removeItem(BACKUP_KEY);break;case"show":case"hide":changeIframeVisibility({iframe:e,isVisible:"show"===a});break;case"handshake":e.contentWindow?.postMessage({clientLifecycle:"handshake-response",data:{token:n.token,currentUrl:window.location.href}},"*");break;case"redirect":{let e=new URL(n.baseRedirectUrl);e.searchParams.has("u")?(e.searchParams.delete("u"),e.searchParams.append("u",window.location.href),window.location.href=e.toString()):window.location.href=n.baseRedirectUrl}}},isConnected:t.promise}}function createIFrameFrakClient({config:e,iframe:t}){let r,a=e?.walletUrl??"https://wallet.frak.id",n=createIFrameLifecycleManager({iframe:t}),o=new DebugInfoGatherer(e,t);if(!t.contentWindow)throw new frame_connector_namespaceObject.FrakRpcError(frame_connector_namespaceObject.RpcErrorCodes.configError,"The iframe does not have a content window");let s=(0,frame_connector_namespaceObject.createRpcClient)({emittingTransport:t.contentWindow,listeningTransport:window,targetOrigin:a,middleware:[{async onRequest(e,t){if(!await n.isConnected)throw new frame_connector_namespaceObject.FrakRpcError(frame_connector_namespaceObject.RpcErrorCodes.clientNotConnected,"The iframe provider isn't connected yet");return t}},(0,middleware_namespaceObject.createClientCompressionMiddleware)(),{onRequest:(e,t)=>(o.setLastRequest(e),t),onResponse:(e,t)=>(o.setLastResponse(e,t),t)}],lifecycleHandlers:{iframeLifecycle:async(e,t)=>{await n.handleEvent(e)}}}),c=setupHeartbeat(s,n),i=async()=>{c(),s.cleanup(),t.remove()};console.log("[Frak SDK] Initializing OpenPanel"),(r=new web_namespaceObject.OpenPanel({apiUrl:"https://op-api.gcp.frak.id",clientId:"6eacc8d7-49ac-4936-95e9-81ef29449570",trackScreenViews:!0,trackOutgoingLinks:!0,trackAttributes:!1,filter:({type:e,payload:t})=>!("track"===e&&t?.properties)||("sdkVersion"in t.properties||(t.properties={...t.properties,sdkVersion:"0.1.0"}),!0)})).setGlobalProperties({sdkVersion:"0.1.0"}),r.init();let l=postConnectionSetup({config:e,rpcClient:s,lifecycleManager:n}).then(()=>o.updateSetupStatus(!0));return{config:e,debugInfo:o,waitForConnection:n.isConnected,waitForSetup:l,request:s.request,listenerRequest:s.listen,destroy:i,openPanel:r}}function setupHeartbeat(e,t){let r,a,n=()=>e.sendLifecycle({clientLifecycle:"heartbeat"});function o(){r&&clearInterval(r),a&&clearTimeout(a)}return async function(){n(),r=setInterval(n,1e3),a=setTimeout(()=>{o(),console.log("Heartbeat timeout: connection failed")},3e4),await t.isConnected,o()}(),o}async function postConnectionSetup({config:e,rpcClient:t,lifecycleManager:r}){async function a(){let r=e.customizations?.css;r&&t.sendLifecycle({clientLifecycle:"modal-css",data:{cssLink:r}})}async function n(){let r=e.customizations?.i18n;r&&t.sendLifecycle({clientLifecycle:"modal-i18n",data:{i18n:r}})}async function o(){if("undefined"==typeof window)return;let e=window.localStorage.getItem(BACKUP_KEY);e&&t.sendLifecycle({clientLifecycle:"restore-backup",data:{backup:e}})}await r.isConnected,setupSsoUrlListener(t,r.isConnected),await Promise.allSettled([a(),n(),o()])}let locales={eur:"fr-FR",usd:"en-US",gbp:"en-GB"};function getSupportedCurrency(e){return e&&e in locales?e:"eur"}async function setupClient({config:e}){let t=prepareConfig(e),r=await createIframe({config:t});if(!r)return void console.error("Failed to create iframe");let a=createIFrameFrakClient({config:t,iframe:r});return(await a.waitForSetup,await a.waitForConnection)?a:void console.error("Failed to connect to client")}function prepareConfig(e){let t=getSupportedCurrency(e.metadata?.currency);return{...e,metadata:{...e.metadata,currency:t}}}function base64urlEncode(e){return btoa(Array.from(e,e=>String.fromCharCode(e)).join("")).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function base64urlDecode(e){let t=e.length%4;return Uint8Array.from(atob(e.replace(/-/g,"+").replace(/_/g,"/").padEnd(e.length+(0===t?0:4-t),"=")),e=>e.charCodeAt(0))}function compressJsonToB64(e){return base64urlEncode((0,frame_connector_namespaceObject.compressJson)(e))}function decompressJsonFromB64(e){return(0,frame_connector_namespaceObject.decompressJson)(base64urlDecode(e))}let external_viem_namespaceObject=require("viem"),contextKey="fCtx";function compress(e){if(e?.r)try{let t=(0,external_viem_namespaceObject.hexToBytes)(e.r);return base64urlEncode(t)}catch(t){console.error("Error compressing Frak context",{e:t,context:e})}}function decompress(e){if(e&&0!==e.length)try{let t=base64urlDecode(e);return{r:(0,external_viem_namespaceObject.bytesToHex)(t,{size:20})}}catch(t){console.error("Error decompressing Frak context",{e:t,context:e})}}function parse({url:e}){if(!e)return null;let t=new URL(e).searchParams.get(contextKey);return t?decompress(t):null}function update({url:e,context:t}){if(!e)return null;let r=parse({url:e}),a=r?{...r,...t}:t;if(!a.r)return null;let n=compress(a);if(!n)return null;let o=new URL(e);return o.searchParams.set(contextKey,n),o.toString()}function remove(e){let t=new URL(e);return t.searchParams.delete(contextKey),t.toString()}function replaceUrl({url:e,context:t}){let r;if(!window.location?.href||"undefined"==typeof window)return void console.error("No window found, can't update context");let a=e??window.location.href;(r=null!==t?update({url:a,context:t}):remove(a))&&window.history.replaceState(null,"",r.toString())}let FrakContextManager={compress,decompress,parse,update,remove,replaceUrl};function getSupportedLocale(e){return e?locales[e]??locales.eur:locales.eur}function getCurrencyAmountKey(e){return e?`${e}Amount`:"eurAmount"}function formatAmount(e,t){let r=getSupportedLocale(t),a=getSupportedCurrency(t);return e.toLocaleString(r,{style:"currency",currency:a,minimumFractionDigits:0,maximumFractionDigits:2})}function trackEvent(e,t,r={}){if(!e)return void console.debug("[Frak] No client provided, skipping event tracking");try{e.openPanel?.track(t,r)}catch(e){console.debug("[Frak] Failed to track event:",t,e)}}function generateSsoUrl(e,t,r,a,n){let o=compressJsonToB64(ssoParamsToCompressed({redirectUrl:t.redirectUrl,directExit:t.directExit,lang:t.lang,productId:r,metadata:{name:a,css:n,logoUrl:t.metadata?.logoUrl,homepageLink:t.metadata?.homepageLink}})),s=new URL(e);return s.pathname="/sso",s.searchParams.set("p",o),s.toString()}function ssoParamsToCompressed(e){return{r:e.redirectUrl,d:e.directExit,l:e.lang,p:e.productId,m:{n:e.metadata?.name,css:e.metadata?.css,l:e.metadata?.logoUrl,h:e.metadata?.homepageLink}}}let productTypes={dapp:1,press:2,webshop:3,retail:4,referral:30,purchase:31},productTypesMask=Object.entries(productTypes).reduce((e,[t,r])=>(e[t]=BigInt(1)<<BigInt(r),e),{}),interactionTypes={press:{openArticle:"0xc0a24ffb",readArticle:"0xd5bd0fbe"},dapp:{proofVerifiableStorageUpdate:"0x2ab2aeef",callableVerifiableStorageUpdate:"0xa07da986"},webshop:{open:"0xb311798f"},referral:{referred:"0x010cc3b9",createLink:"0xb2c0f17c"},purchase:{started:"0xd87e90c3",completed:"0x8403aeb4",unsafeCompleted:"0x4d5b14e0"},retail:{customerMeeting:"0x74489004"}};function computeProductId({domain:e}={}){let t=(e??window.location.host).replace("www.","");return(0,external_viem_namespaceObject.keccak256)((0,external_viem_namespaceObject.toHex)(t))}let ssoPopupFeatures="menubar=no,status=no,scrollbars=no,fullscreen=no,width=500, height=800",ssoPopupName="frak-sso";async function openSso(e,t){let{metadata:r,customizations:a,walletUrl:n}=e.config;if(t.openInSameWindow??!!t.redirectUrl)return await e.request({method:"frak_openSso",params:[t,r.name,a?.css]});let o=t.ssoPopupUrl??generateSsoUrl(n??"https://wallet.frak.id",t,computeProductId(),r.name,a?.css),s=window.open(o,ssoPopupName,ssoPopupFeatures);if(!s)throw Error("Popup was blocked. Please allow popups for this site.");return s.focus(),await e.request({method:"frak_openSso",params:[t,r.name,a?.css]})??{}}function watchWalletStatus(e,t){if(!t)return e.request({method:"frak_listenToWalletStatus"}).then(t=>(walletStatusSideEffect(e,t),t));let r=new frame_connector_namespaceObject.Deferred,a=!1;return e.listenerRequest({method:"frak_listenToWalletStatus"},n=>{walletStatusSideEffect(e,n),t(n),a||(r.resolve(n),a=!0)}),r.promise}function walletStatusSideEffect(e,t){"undefined"!=typeof window&&(e.openPanel?.setGlobalProperties({wallet:t.wallet??null}),t.interactionToken?window.sessionStorage.setItem("frak-wallet-interaction-token",t.interactionToken):window.sessionStorage.removeItem("frak-wallet-interaction-token"))}async function sendInteraction(e,{productId:t,interaction:r,validation:a}){let n=t??computeProductId(e.config);return await e.request({method:"frak_sendInteraction",params:[n,r,a]})}async function displayModal(e,{steps:t,metadata:r}){return await e.request({method:"frak_displayModal",params:[t,r,e.config.metadata]})}async function displayEmbeddedWallet(e,t){return await e.request({method:"frak_displayEmbeddedWallet",params:[t,e.config.metadata]})}async function prepareSso(e,t){let{metadata:r,customizations:a}=e.config;return await e.request({method:"frak_prepareSso",params:[t,r.name,a?.css]})}async function getProductInformation(e){return await e.request({method:"frak_getProductInformation"})}async function trackPurchaseStatus(e){if("undefined"==typeof window)return void console.warn("[Frak] No window found, can't track purchase");let t=window.sessionStorage.getItem("frak-wallet-interaction-token");if(!t)return void console.warn("[Frak] No frak session found, skipping purchase check");await fetch("https://backend.frak.id/interactions/listenForPurchase",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","x-wallet-sdk-auth":t},body:JSON.stringify(e)})}let siwe_namespaceObject=require("viem/siwe");async function siweAuthenticate(e,{siwe:t,metadata:r}){let a=e.config?.domain??window.location.host,n=t?.statement??`I confirm that I want to use my Frak wallet on: ${e.config.metadata.name}`,o={...t,statement:n,nonce:t?.nonce??(0,siwe_namespaceObject.generateSiweNonce)(),uri:t?.uri??`https://${a}`,version:t?.version??"1",domain:a};return(await displayModal(e,{metadata:r,steps:{login:{},siweAuthenticate:{siwe:o}}})).siweAuthenticate}async function sendTransaction(e,{tx:t,metadata:r}){return(await displayModal(e,{metadata:r,steps:{login:{},sendTransaction:{tx:t}}})).sendTransaction}function modalBuilder(e,{metadata:t,login:r,openSession:a}){return modalStepsBuilder(e,{steps:{login:r??{},openSession:a??{}},metadata:t})}function modalStepsBuilder(e,t){async function r(r){return r&&(t.metadata=r(t.metadata??{})),await displayModal(e,t)}return{params:t,sendTx:function(r){return modalStepsBuilder(e,{...t,steps:{...t.steps,sendTransaction:r}})},reward:function(r){return modalStepsBuilder(e,{...t,steps:{...t.steps,final:{...r,action:{key:"reward"}}}})},sharing:function(r,a){return modalStepsBuilder(e,{...t,steps:{...t.steps,final:{...a,action:{key:"sharing",options:r}}}})},display:r}}let ReferralInteractionEncoder={createLink:()=>({handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.referral),interactionData:interactionTypes.referral.createLink}),referred({referrer:e}){let t=(0,external_viem_namespaceObject.concatHex)([interactionTypes.referral.referred,(0,external_viem_namespaceObject.pad)(e,{size:32})]);return{handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.referral),interactionData:t}}};async function processReferral(e,{walletStatus:t,frakContext:r,modalConfig:a,productId:n,options:o}){let s=!1;async function c(){if(!s)return s=!0,ensureWalletConnected(e,{modalConfig:{...a,loggedIn:{action:{key:"referred"}}},walletStatus:t})}async function i(t){let r=ReferralInteractionEncoder.referred({referrer:t});await Promise.allSettled([sendInteraction(e,{productId:n,interaction:r}),trackEvent(e,"user_referred",{properties:{referrer:t}})])}try{let{status:e,currentWallet:a}=await processReferralLogic({initialWalletStatus:t,getFreshWalletStatus:c,pushReferralInteraction:i,frakContext:r});return FrakContextManager.replaceUrl({url:window.location?.href,context:o?.alwaysAppendUrl?{r:a}:null}),e}catch(e){return console.log("Error processing referral",{error:e}),FrakContextManager.replaceUrl({url:window.location?.href,context:o?.alwaysAppendUrl?{r:t?.wallet}:null}),mapErrorToState(e)}}async function processReferralLogic({initialWalletStatus:e,getFreshWalletStatus:t,pushReferralInteraction:r,frakContext:a}){let n=e?.wallet;return a?.r?(n||(n=await t()),n&&(0,external_viem_namespaceObject.isAddressEqual)(a.r,n))?{status:"self-referral",currentWallet:n}:(e?.interactionSession||(n=await t()),await r(a.r),{status:"success",currentWallet:n}):{status:"no-referrer",currentWallet:n}}async function ensureWalletConnected(e,{modalConfig:t,walletStatus:r}){if(!r?.interactionSession){let r=await displayEmbeddedWallet(e,t??{});return r?.wallet??void 0}return r.wallet??void 0}function mapErrorToState(e){if(e instanceof frame_connector_namespaceObject.FrakRpcError)switch(e.code){case frame_connector_namespaceObject.RpcErrorCodes.walletNotConnected:return"no-wallet";case frame_connector_namespaceObject.RpcErrorCodes.serverErrorForInteractionDelegation:return"no-session"}return"error"}async function referralInteraction(e,{productId:t,modalConfig:r,options:a}={}){let n=FrakContextManager.parse({url:window.location.href}),o=await watchWalletStatus(e);try{return await processReferral(e,{walletStatus:o,frakContext:n,modalConfig:r,productId:t,options:a})}catch(e){console.warn("Error processing referral",{error:e})}}let PressInteractionEncoder={openArticle({articleId:e}){let t=(0,external_viem_namespaceObject.concatHex)([interactionTypes.press.openArticle,(0,external_viem_namespaceObject.pad)(e,{size:32})]);return{handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.press),interactionData:t}},readArticle({articleId:e}){let t=(0,external_viem_namespaceObject.concatHex)([interactionTypes.press.readArticle,(0,external_viem_namespaceObject.pad)(e,{size:32})]);return{handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.press),interactionData:t}}},PurchaseInteractionEncoder={startPurchase({purchaseId:e}){let t=(0,external_viem_namespaceObject.concatHex)([interactionTypes.purchase.started,(0,external_viem_namespaceObject.pad)(e,{size:32})]);return{handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.purchase),interactionData:t}},completedPurchase({purchaseId:e,proof:t}){let r=(0,external_viem_namespaceObject.encodeAbiParameters)([{type:"uint256"},{type:"bytes32[]"}],[BigInt(e),t]),a=(0,external_viem_namespaceObject.concatHex)([interactionTypes.purchase.completed,r]);return{handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.purchase),interactionData:a}},unsafeCompletedPurchase({purchaseId:e}){let t=(0,external_viem_namespaceObject.concatHex)([interactionTypes.purchase.unsafeCompleted,(0,external_viem_namespaceObject.pad)(e,{size:32})]);return{handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.purchase),interactionData:t}}},WebShopInteractionEncoder={open:()=>({handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.webshop),interactionData:interactionTypes.webshop.open})},RetailInteractionEncoder={customerMeeting({agencyId:e}){let t=(0,external_viem_namespaceObject.concatHex)([interactionTypes.retail.customerMeeting,(0,external_viem_namespaceObject.pad)(e,{size:32})]);return{handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.retail),interactionData:t}}};for(var __webpack_i__ in exports.DebugInfoGatherer=__webpack_exports__.DebugInfoGatherer,exports.FrakContextManager=__webpack_exports__.FrakContextManager,exports.PressInteractionEncoder=__webpack_exports__.PressInteractionEncoder,exports.PurchaseInteractionEncoder=__webpack_exports__.PurchaseInteractionEncoder,exports.ReferralInteractionEncoder=__webpack_exports__.ReferralInteractionEncoder,exports.RetailInteractionEncoder=__webpack_exports__.RetailInteractionEncoder,exports.WebShopInteractionEncoder=__webpack_exports__.WebShopInteractionEncoder,exports.base64urlDecode=__webpack_exports__.base64urlDecode,exports.base64urlEncode=__webpack_exports__.base64urlEncode,exports.baseIframeProps=__webpack_exports__.baseIframeProps,exports.compressJsonToB64=__webpack_exports__.compressJsonToB64,exports.createIFrameFrakClient=__webpack_exports__.createIFrameFrakClient,exports.createIframe=__webpack_exports__.createIframe,exports.decompressJsonFromB64=__webpack_exports__.decompressJsonFromB64,exports.displayEmbeddedWallet=__webpack_exports__.displayEmbeddedWallet,exports.displayModal=__webpack_exports__.displayModal,exports.findIframeInOpener=__webpack_exports__.findIframeInOpener,exports.formatAmount=__webpack_exports__.formatAmount,exports.generateSsoUrl=__webpack_exports__.generateSsoUrl,exports.getCurrencyAmountKey=__webpack_exports__.getCurrencyAmountKey,exports.getProductInformation=__webpack_exports__.getProductInformation,exports.getSupportedCurrency=__webpack_exports__.getSupportedCurrency,exports.getSupportedLocale=__webpack_exports__.getSupportedLocale,exports.interactionTypes=__webpack_exports__.interactionTypes,exports.locales=__webpack_exports__.locales,exports.modalBuilder=__webpack_exports__.modalBuilder,exports.openSso=__webpack_exports__.openSso,exports.prepareSso=__webpack_exports__.prepareSso,exports.processReferral=__webpack_exports__.processReferral,exports.productTypes=__webpack_exports__.productTypes,exports.productTypesMask=__webpack_exports__.productTypesMask,exports.referralInteraction=__webpack_exports__.referralInteraction,exports.sendInteraction=__webpack_exports__.sendInteraction,exports.sendTransaction=__webpack_exports__.sendTransaction,exports.setupClient=__webpack_exports__.setupClient,exports.siweAuthenticate=__webpack_exports__.siweAuthenticate,exports.ssoPopupFeatures=__webpack_exports__.ssoPopupFeatures,exports.ssoPopupName=__webpack_exports__.ssoPopupName,exports.trackEvent=__webpack_exports__.trackEvent,exports.trackPurchaseStatus=__webpack_exports__.trackPurchaseStatus,exports.watchWalletStatus=__webpack_exports__.watchWalletStatus,__webpack_exports__)-1===["DebugInfoGatherer","FrakContextManager","PressInteractionEncoder","PurchaseInteractionEncoder","ReferralInteractionEncoder","RetailInteractionEncoder","WebShopInteractionEncoder","base64urlDecode","base64urlEncode","baseIframeProps","compressJsonToB64","createIFrameFrakClient","createIframe","decompressJsonFromB64","displayEmbeddedWallet","displayModal","findIframeInOpener","formatAmount","generateSsoUrl","getCurrencyAmountKey","getProductInformation","getSupportedCurrency","getSupportedLocale","interactionTypes","locales","modalBuilder","openSso","prepareSso","processReferral","productTypes","productTypesMask","referralInteraction","sendInteraction","sendTransaction","setupClient","siweAuthenticate","ssoPopupFeatures","ssoPopupName","trackEvent","trackPurchaseStatus","watchWalletStatus"].indexOf(__webpack_i__)&&(exports[__webpack_i__]=__webpack_exports__[__webpack_i__]);Object.defineProperty(exports,"__esModule",{value:!0});
|