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

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.
@@ -5,6 +5,4 @@
5
5
  * @license MIT
6
6
  */
7
7
 
8
- /*! ieee754. BSD-3-Clause License. Feross Aboukhadijeh <https://feross.org/opensource> */
9
-
10
8
  /*! noble-hashes - MIT License (c) 2022 Paul Miller (paulmillr.com) */
package/dist/actions.cjs CHANGED
@@ -1 +1 @@
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__,{getProductInformation:()=>getProductInformation,displayModal:()=>displayModal,displayEmbeddedWallet:()=>displayEmbeddedWallet,processReferral:()=>processReferral,sendInteraction:()=>sendInteraction,watchWalletStatus:()=>watchWalletStatus,sendTransaction:()=>sendTransaction,modalBuilder:()=>modalBuilder,trackPurchaseStatus:()=>trackPurchaseStatus,siweAuthenticate:()=>siweAuthenticate,referralInteraction:()=>referralInteraction,prepareSso:()=>prepareSso,openSso:()=>openSso});let frame_connector_namespaceObject=require("@frak-labs/frame-connector");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"))}let external_viem_namespaceObject=require("viem");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]})}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 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 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,"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 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 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},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"}},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),{}),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}}};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)}}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})}}for(var __webpack_i__ in exports.displayEmbeddedWallet=__webpack_exports__.displayEmbeddedWallet,exports.displayModal=__webpack_exports__.displayModal,exports.getProductInformation=__webpack_exports__.getProductInformation,exports.modalBuilder=__webpack_exports__.modalBuilder,exports.openSso=__webpack_exports__.openSso,exports.prepareSso=__webpack_exports__.prepareSso,exports.processReferral=__webpack_exports__.processReferral,exports.referralInteraction=__webpack_exports__.referralInteraction,exports.sendInteraction=__webpack_exports__.sendInteraction,exports.sendTransaction=__webpack_exports__.sendTransaction,exports.siweAuthenticate=__webpack_exports__.siweAuthenticate,exports.trackPurchaseStatus=__webpack_exports__.trackPurchaseStatus,exports.watchWalletStatus=__webpack_exports__.watchWalletStatus,__webpack_exports__)-1===["displayEmbeddedWallet","displayModal","getProductInformation","modalBuilder","openSso","prepareSso","processReferral","referralInteraction","sendInteraction","sendTransaction","siweAuthenticate","trackPurchaseStatus","watchWalletStatus"].indexOf(__webpack_i__)&&(exports[__webpack_i__]=__webpack_exports__[__webpack_i__]);Object.defineProperty(exports,"__esModule",{value:!0});
1
+ "use strict";const __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__={};async function displayEmbeddedWallet(e,t){return await e.request({method:"frak_displayEmbeddedWallet",params:[t,e.config.metadata]})}async function displayModal(e,{steps:t,metadata:r}){return await e.request({method:"frak_displayModal",params:[t,r,e.config.metadata]})}async function getProductInformation(e){return await e.request({method:"frak_getProductInformation"})}__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{getProductInformation:()=>getProductInformation,displayModal:()=>displayModal,displayEmbeddedWallet:()=>displayEmbeddedWallet,openSso:()=>openSso,processReferral:()=>processReferral,sendInteraction:()=>sendInteraction,sendTransaction:()=>sendTransaction,modalBuilder:()=>modalBuilder,trackPurchaseStatus:()=>trackPurchaseStatus,siweAuthenticate:()=>siweAuthenticate,referralInteraction:()=>referralInteraction,prepareSso:()=>prepareSso,watchWalletStatus:()=>watchWalletStatus});const external_viem_namespaceObject=require("viem");function computeProductId({domain:e}={}){let t=(e??window.location.host).replace("www.","");return(0,external_viem_namespaceObject.keccak256)((0,external_viem_namespaceObject.toHex)(t))}const frame_connector_namespaceObject=require("@frak-labs/frame-connector");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 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}}}const 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,"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 prepareSso(e,t){let{metadata:r,customizations:a}=e.config;return await e.request({method:"frak_prepareSso",params:[t,r.name,a?.css]})}const 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"}},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),{}),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}}};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)}}const 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())}const FrakContextManager={compress,decompress,parse,update,remove,replaceUrl};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 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"}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 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})}}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");t?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)}):console.warn("[Frak] No frak session found, skipping purchase check")}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}}async function sendTransaction(e,{tx:t,metadata:r}){return(await displayModal(e,{metadata:r,steps:{login:{},sendTransaction:{tx:t}}})).sendTransaction}const 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}for(var __webpack_i__ in exports.displayEmbeddedWallet=__webpack_exports__.displayEmbeddedWallet,exports.displayModal=__webpack_exports__.displayModal,exports.getProductInformation=__webpack_exports__.getProductInformation,exports.modalBuilder=__webpack_exports__.modalBuilder,exports.openSso=__webpack_exports__.openSso,exports.prepareSso=__webpack_exports__.prepareSso,exports.processReferral=__webpack_exports__.processReferral,exports.referralInteraction=__webpack_exports__.referralInteraction,exports.sendInteraction=__webpack_exports__.sendInteraction,exports.sendTransaction=__webpack_exports__.sendTransaction,exports.siweAuthenticate=__webpack_exports__.siweAuthenticate,exports.trackPurchaseStatus=__webpack_exports__.trackPurchaseStatus,exports.watchWalletStatus=__webpack_exports__.watchWalletStatus,__webpack_exports__)-1===["displayEmbeddedWallet","displayModal","getProductInformation","modalBuilder","openSso","prepareSso","processReferral","referralInteraction","sendInteraction","sendTransaction","siweAuthenticate","trackPurchaseStatus","watchWalletStatus"].indexOf(__webpack_i__)&&(exports[__webpack_i__]=__webpack_exports__[__webpack_i__]);Object.defineProperty(exports,"__esModule",{value:!0});
package/dist/actions.js CHANGED
@@ -1 +1 @@
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};
1
+ import{bytesToHex as e,concatHex as t,hexToBytes as r,isAddressEqual as n,keccak256 as a,pad as o,toHex as i}from"viem";import{Deferred as s,FrakRpcError as l,RpcErrorCodes as c,compressJson as u}from"@frak-labs/frame-connector";import{generateSiweNonce as d}from"viem/siwe";async function f(e,t){return await e.request({method:"frak_displayEmbeddedWallet",params:[t,e.config.metadata]})}async function p(e,{steps:t,metadata:r}){return await e.request({method:"frak_displayModal",params:[t,r,e.config.metadata]})}async function w(e){return await e.request({method:"frak_getProductInformation"})}function m({domain:e}={}){return a(i((e??window.location.host).replace("www.","")))}function h(e){return btoa(Array.from(e,e=>String.fromCharCode(e)).join("")).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}async function g(e,t){var r,n,a,o,i,s;let l,c,{metadata:d,customizations:f,walletUrl:p}=e.config;if(t.openInSameWindow??!!t.redirectUrl)return await e.request({method:"frak_openSso",params:[t,d.name,f?.css]});let w=t.ssoPopupUrl??(r=p??"https://wallet.frak.id",n=t,a=m(),o=d.name,i=f?.css,l=h(u({r:(s={redirectUrl:n.redirectUrl,directExit:n.directExit,lang:n.lang,productId:a,metadata:{name:o,css:i,logoUrl:n.metadata?.logoUrl,homepageLink:n.metadata?.homepageLink}}).redirectUrl,d:s.directExit,l:s.lang,p:s.productId,m:{n:s.metadata?.name,css:s.metadata?.css,l:s.metadata?.logoUrl,h:s.metadata?.homepageLink}})),(c=new URL(r)).pathname="/sso",c.searchParams.set("p",l),c.toString()),g=window.open(w,"frak-sso","menubar=no,status=no,scrollbars=no,fullscreen=no,width=500, height=800");if(!g)throw Error("Popup was blocked. Please allow popups for this site.");return g.focus(),await e.request({method:"frak_openSso",params:[t,d.name,f?.css]})??{}}async function k(e,t){let{metadata:r,customizations:n}=e.config;return await e.request({method:"frak_prepareSso",params:[t,r.name,n?.css]})}let y="0x010cc3b9",S="0xb2c0f17c",b={dapp:1,press:2,webshop:3,retail:4,referral:30,purchase:31};Object.entries(b).reduce((e,[t,r])=>(e[t]=BigInt(1)<<BigInt(r),e),{});let v={createLink:()=>({handlerTypeDenominator:i(b.referral),interactionData:S}),referred({referrer:e}){let r=t([y,o(e,{size:32})]);return{handlerTypeDenominator:i(b.referral),interactionData:r}}},I="fCtx";function P({url:t}){if(!t)return null;let r=new URL(t).searchParams.get(I);return r?function(t){if(t&&0!==t.length)try{let r,n=(r=t.length%4,Uint8Array.from(atob(t.replace(/-/g,"+").replace(/_/g,"/").padEnd(t.length+(0===r?0:4-r),"=")),e=>e.charCodeAt(0)));return{r:e(n,{size:20})}}catch(e){console.error("Error decompressing Frak context",{e,context:t})}}(r):null}let U=function({url:e,context:t}){let n,a;if(!window.location?.href||"undefined"==typeof window)return void console.error("No window found, can't update context");let o=e??window.location.href;(n=null!==t?function({url:e,context:t}){if(!e)return null;let n=P({url:e}),a=n?{...n,...t}:t;if(!a.r)return null;let o=function(e){if(e?.r)try{let t=r(e.r);return h(t)}catch(t){console.error("Error compressing Frak context",{e:t,context:e})}}(a);if(!o)return null;let i=new URL(e);return i.searchParams.set(I,o),i.toString()}({url:o,context:t}):((a=new URL(o)).searchParams.delete(I),a.toString()))&&window.history.replaceState(null,"",n.toString())};async function x(e,{productId:t,interaction:r,validation:n}){let a=t??m(e.config);return await e.request({method:"frak_sendInteraction",params:[a,r,n]})}async function T(e,{walletStatus:t,frakContext:r,modalConfig:n,productId:a,options:o}){let i=!1;async function s(){if(!i)return i=!0,_(e,{modalConfig:{...n,loggedIn:{action:{key:"referred"}}},walletStatus:t})}async function u(t){let r=v.referred({referrer:t});await Promise.allSettled([x(e,{productId:a,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:n}=await E({initialWalletStatus:t,getFreshWalletStatus:s,pushReferralInteraction:u,frakContext:r});return U({url:window.location?.href,context:o?.alwaysAppendUrl?{r:n}:null}),e}catch(e){return console.log("Error processing referral",{error:e}),U({url:window.location?.href,context:o?.alwaysAppendUrl?{r:t?.wallet}:null}),function(e){if(e instanceof l)switch(e.code){case c.walletNotConnected:return"no-wallet";case c.serverErrorForInteractionDelegation:return"no-session"}return"error"}(e)}}async function E({initialWalletStatus:e,getFreshWalletStatus:t,pushReferralInteraction:r,frakContext:a}){let o=e?.wallet;return a?.r?(o||(o=await t()),o&&n(a.r,o))?{status:"self-referral",currentWallet:o}:(e?.interactionSession||(o=await t()),await r(a.r),{status:"success",currentWallet:o}):{status:"no-referrer",currentWallet:o}}async function _(e,{modalConfig:t,walletStatus:r}){if(!r?.interactionSession){let r=await f(e,t??{});return r?.wallet??void 0}return r.wallet??void 0}function F(e,t){if(!t)return e.request({method:"frak_listenToWalletStatus"}).then(t=>(q(e,t),t));let r=new s,n=!1;return e.listenerRequest({method:"frak_listenToWalletStatus"},a=>{q(e,a),t(a),n||(r.resolve(a),n=!0)}),r.promise}function q(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 A(e,{productId:t,modalConfig:r,options:n}={}){let a=P({url:window.location.href}),o=await F(e);try{return await T(e,{walletStatus:o,frakContext:a,modalConfig:r,productId:t,options:n})}catch(e){console.warn("Error processing referral",{error:e})}}async function L(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");t?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)}):console.warn("[Frak] No frak session found, skipping purchase check")}function C(e,{metadata:t,login:r,openSession:n}){return function e(t,r){async function n(e){return e&&(r.metadata=e(r.metadata??{})),await p(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})}async function W(e,{tx:t,metadata:r}){return(await p(e,{metadata:r,steps:{login:{},sendTransaction:{tx:t}}})).sendTransaction}async function N(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 p(e,{metadata:r,steps:{login:{},siweAuthenticate:{siwe:o}}})).siweAuthenticate}export{f as displayEmbeddedWallet,p as displayModal,w as getProductInformation,C as modalBuilder,g as openSso,k as prepareSso,T as processReferral,A as referralInteraction,x as sendInteraction,W as sendTransaction,N as siweAuthenticate,L 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,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`
1
+ "use strict";const __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__={};async function displayEmbeddedWallet(e,t){return await e.request({method:"frak_displayEmbeddedWallet",params:[t,e.config.metadata]})}async function displayModal(e,{steps:t,metadata:r}){return await e.request({method:"frak_displayModal",params:[t,r,e.config.metadata]})}async function getProductInformation(e){return await e.request({method:"frak_getProductInformation"})}__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{decompressJsonFromB64:()=>decompressJsonFromB64,PressInteractionEncoder:()=>PressInteractionEncoder,getProductInformation:()=>getProductInformation,findIframeInOpener:()=>findIframeInOpener,createIFrameFrakClient:()=>createIFrameFrakClient,generateSsoUrl:()=>generateSsoUrl,getCurrencyAmountKey:()=>getCurrencyAmountKey,locales:()=>locales,sendInteraction:()=>sendInteraction,FrakContextManager:()=>FrakContextManager,getSupportedLocale:()=>getSupportedLocale,compressJsonToB64:()=>compressJsonToB64,baseIframeProps:()=>baseIframeProps,DebugInfoGatherer:()=>DebugInfoGatherer,base64urlEncode:()=>base64urlEncode,openSso:()=>openSso,processReferral:()=>processReferral,ReferralInteractionEncoder:()=>ReferralInteractionEncoder,modalBuilder:()=>modalBuilder,productTypes:()=>productTypes,referralInteraction:()=>referralInteraction,prepareSso:()=>prepareSso,siweAuthenticate:()=>siweAuthenticate,ssoPopupName:()=>ssoPopupName,trackPurchaseStatus:()=>trackPurchaseStatus,productTypesMask:()=>productTypesMask,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,WebShopInteractionEncoder:()=>WebShopInteractionEncoder});const external_viem_namespaceObject=require("viem");function computeProductId({domain:e}={}){let t=(e??window.location.host).replace("www.","");return(0,external_viem_namespaceObject.keccak256)((0,external_viem_namespaceObject.toHex)(t))}const frame_connector_namespaceObject=require("@frak-labs/frame-connector");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 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}}}const 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]})??{}}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]})}const 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"}},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),{}),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}}};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)}}const 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())}const FrakContextManager={compress,decompress,parse,update,remove,replaceUrl};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 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"}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 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})}}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");t?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)}):console.warn("[Frak] No frak session found, skipping purchase check")}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}}async function sendTransaction(e,{tx:t,metadata:r}){return(await displayModal(e,{metadata:r,steps:{login:{},sendTransaction:{tx:t}}})).sendTransaction}const 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}const 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()}}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}};if(t(window.opener))return window.opener;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});
13
+ `.trim()}}const 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}};if(t(window.opener))return window.opener;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 p=postConnectionSetup({config:e,rpcClient:s,lifecycleManager:n}).then(()=>o.updateSetupStatus(!0));return{config:e,debugInfo:o,waitForConnection:n.isConnected,waitForSetup:p,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()])}const 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 decompressJsonFromB64(e){return(0,frame_connector_namespaceObject.decompressJson)(base64urlDecode(e))}function getSupportedLocale(e){return e?locales[e]??locales.eur:locales.eur}function formatAmount(e,t){let r=getSupportedLocale(t),a=getSupportedCurrency(t);return e.toLocaleString(r,{style:"currency",currency:a,minimumFractionDigits:0,maximumFractionDigits:2})}function getCurrencyAmountKey(e){return e?`${e}Amount`:"eurAmount"}const 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}}},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}}},WebShopInteractionEncoder={open:()=>({handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.webshop),interactionData:interactionTypes.webshop.open})};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});
package/dist/bundle.js CHANGED
@@ -1,4 +1,4 @@
1
- import{Deferred as e,FrakRpcError as t,RpcErrorCodes as n,compressJson as r,createRpcClient as a,decompressJson as o}from"@frak-labs/frame-connector";import{createClientCompressionMiddleware as i}from"@frak-labs/frame-connector/middleware";import{OpenPanel as s}from"@openpanel/web";import{bytesToHex as c,concatHex as l,encodeAbiParameters as u,hexToBytes as d,isAddressEqual as f,keccak256 as p,pad as m,toHex as w}from"viem";import{generateSiweNonce as h}from"viem/siwe";let g="nexus-wallet-backup";class y{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 n=this.getIframeStatus(),r=this.getNavigatorInfo(),a="Unknown";return e instanceof t?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:n?this.base64Encode(n):"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 y}formatDebugInfo(e){let t=this.gatherDebugInfo(e);return`
1
+ import{bytesToHex as e,concatHex as t,encodeAbiParameters as n,hexToBytes as r,isAddressEqual as a,keccak256 as o,pad as i,toHex as s}from"viem";import{Deferred as c,FrakRpcError as l,RpcErrorCodes as u,compressJson as d,createRpcClient as f,decompressJson as p}from"@frak-labs/frame-connector";import{generateSiweNonce as m}from"viem/siwe";import{createClientCompressionMiddleware as w}from"@frak-labs/frame-connector/middleware";import{OpenPanel as h}from"@openpanel/web";async function g(e,t){return await e.request({method:"frak_displayEmbeddedWallet",params:[t,e.config.metadata]})}async function y(e,{steps:t,metadata:n}){return await e.request({method:"frak_displayModal",params:[t,n,e.config.metadata]})}async function k(e){return await e.request({method:"frak_getProductInformation"})}function S({domain:e}={}){return o(s((e??window.location.host).replace("www.","")))}function b(e){return btoa(Array.from(e,e=>String.fromCharCode(e)).join("")).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function I(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 L(e){return b(d(e))}function v(e,t,n,r,a){var o;let i=L({r:(o={redirectUrl:t.redirectUrl,directExit:t.directExit,lang:t.lang,productId:n,metadata:{name:r,css:a,logoUrl:t.metadata?.logoUrl,homepageLink:t.metadata?.homepageLink}}).redirectUrl,d:o.directExit,l:o.lang,p:o.productId,m:{n:o.metadata?.name,css:o.metadata?.css,l:o.metadata?.logoUrl,h:o.metadata?.homepageLink}}),s=new URL(e);return s.pathname="/sso",s.searchParams.set("p",i),s.toString()}let R="menubar=no,status=no,scrollbars=no,fullscreen=no,width=500, height=800",U="frak-sso";async function x(e,t){let{metadata:n,customizations:r,walletUrl:a}=e.config;if(t.openInSameWindow??!!t.redirectUrl)return await e.request({method:"frak_openSso",params:[t,n.name,r?.css]});let o=t.ssoPopupUrl??v(a??"https://wallet.frak.id",t,S(),n.name,r?.css),i=window.open(o,U,R);if(!i)throw Error("Popup was blocked. Please allow popups for this site.");return i.focus(),await e.request({method:"frak_openSso",params:[t,n.name,r?.css]})??{}}async function E(e,t){let{metadata:n,customizations:r}=e.config;return await e.request({method:"frak_prepareSso",params:[t,n.name,r?.css]})}let P={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"}},F={dapp:1,press:2,webshop:3,retail:4,referral:30,purchase:31},C=Object.entries(F).reduce((e,[t,n])=>(e[t]=BigInt(1)<<BigInt(n),e),{}),T={createLink:()=>({handlerTypeDenominator:s(F.referral),interactionData:P.referral.createLink}),referred({referrer:e}){let n=t([P.referral.referred,i(e,{size:32})]);return{handlerTypeDenominator:s(F.referral),interactionData:n}}};function D(e,t,n={}){if(!e)return void console.debug("[Frak] No client provided, skipping event tracking");try{e.openPanel?.track(t,n)}catch(e){console.debug("[Frak] Failed to track event:",t,e)}}let q="fCtx";function A(e){if(e?.r)try{let t=r(e.r);return b(t)}catch(t){console.error("Error compressing Frak context",{e:t,context:e})}}function $(t){if(t&&0!==t.length)try{let n=I(t);return{r:e(n,{size:20})}}catch(e){console.error("Error decompressing Frak context",{e,context:t})}}function O({url:e}){if(!e)return null;let t=new URL(e).searchParams.get(q);return t?$(t):null}function W({url:e,context:t}){if(!e)return null;let n=O({url:e}),r=n?{...n,...t}:t;if(!r.r)return null;let a=A(r);if(!a)return null;let o=new URL(e);return o.searchParams.set(q,a),o.toString()}function N(e){let t=new URL(e);return t.searchParams.delete(q),t.toString()}let z={compress:A,decompress:$,parse:O,update:W,remove:N,replaceUrl:function({url:e,context:t}){let n;if(!window.location?.href||"undefined"==typeof window)return void console.error("No window found, can't update context");let r=e??window.location.href;(n=null!==t?W({url:r,context:t}):N(r))&&window.history.replaceState(null,"",n.toString())}};async function _(e,{productId:t,interaction:n,validation:r}){let a=t??S(e.config);return await e.request({method:"frak_sendInteraction",params:[a,n,r]})}async function M(e,{walletStatus:t,frakContext:n,modalConfig:r,productId:a,options:o}){let i=!1;async function s(){if(!i)return i=!0,B(e,{modalConfig:{...r,loggedIn:{action:{key:"referred"}}},walletStatus:t})}async function c(t){let n=T.referred({referrer:t});await Promise.allSettled([_(e,{productId:a,interaction:n}),D(e,"user_referred",{properties:{referrer:t}})])}try{let{status:e,currentWallet:r}=await V({initialWalletStatus:t,getFreshWalletStatus:s,pushReferralInteraction:c,frakContext:n});return z.replaceUrl({url:window.location?.href,context:o?.alwaysAppendUrl?{r:r}:null}),e}catch(e){return console.log("Error processing referral",{error:e}),z.replaceUrl({url:window.location?.href,context:o?.alwaysAppendUrl?{r:t?.wallet}:null}),function(e){if(e instanceof l)switch(e.code){case u.walletNotConnected:return"no-wallet";case u.serverErrorForInteractionDelegation:return"no-session"}return"error"}(e)}}async function V({initialWalletStatus:e,getFreshWalletStatus:t,pushReferralInteraction:n,frakContext:r}){let o=e?.wallet;return r?.r?(o||(o=await t()),o&&a(r.r,o))?{status:"self-referral",currentWallet:o}:(e?.interactionSession||(o=await t()),await n(r.r),{status:"success",currentWallet:o}):{status:"no-referrer",currentWallet:o}}async function B(e,{modalConfig:t,walletStatus:n}){if(!n?.interactionSession){let n=await g(e,t??{});return n?.wallet??void 0}return n.wallet??void 0}function j(e,t){if(!t)return e.request({method:"frak_listenToWalletStatus"}).then(t=>(G(e,t),t));let n=new c,r=!1;return e.listenerRequest({method:"frak_listenToWalletStatus"},a=>{G(e,a),t(a),r||(n.resolve(a),r=!0)}),n.promise}function G(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 J(e,{productId:t,modalConfig:n,options:r}={}){let a=z.parse({url:window.location.href}),o=await j(e);try{return await M(e,{walletStatus:o,frakContext:a,modalConfig:n,productId:t,options:r})}catch(e){console.warn("Error processing referral",{error:e})}}async function H(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");t?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)}):console.warn("[Frak] No frak session found, skipping purchase check")}function K(e,{metadata:t,login:n,openSession:r}){return function e(t,n){async function r(e){return e&&(n.metadata=e(n.metadata??{})),await y(t,n)}return{params:n,sendTx:function(r){return e(t,{...n,steps:{...n.steps,sendTransaction:r}})},reward:function(r){return e(t,{...n,steps:{...n.steps,final:{...r,action:{key:"reward"}}}})},sharing:function(r,a){return e(t,{...n,steps:{...n.steps,final:{...a,action:{key:"sharing",options:r}}}})},display:r}}(e,{steps:{login:n??{},openSession:r??{}},metadata:t})}async function Q(e,{tx:t,metadata:n}){return(await y(e,{metadata:n,steps:{login:{},sendTransaction:{tx:t}}})).sendTransaction}async function X(e,{siwe:t,metadata:n}){let r=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??m(),uri:t?.uri??`https://${r}`,version:t?.version??"1",domain:r};return(await y(e,{metadata:n,steps:{login:{},siweAuthenticate:{siwe:o}}})).siweAuthenticate}let Y="nexus-wallet-backup";class Z{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(),n=this.getNavigatorInfo(),r="Unknown";return e instanceof l?r=`FrakRpcError: ${e.code} '${e.message}'`:e instanceof Error?r=e.message:"string"==typeof e&&(r=e),{timestamp:new Date().toISOString(),encodedUrl:btoa(window.location.href),encodedConfig:this.config?this.base64Encode(this.config):"no-config",navigatorInfo:n?this.base64Encode(n):"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:r}}static empty(){return new Z}formatDebugInfo(e){let t=this.gatherDebugInfo(e);return`
2
2
  Debug Information:
3
3
  -----------------
4
4
  Timestamp: ${t.timestamp}
@@ -10,4 +10,4 @@ import{Deferred as e,FrakRpcError as t,RpcErrorCodes as n,compressJson as r,crea
10
10
  Last Response: ${t.lastResponse}
11
11
  Client Status: ${t.clientStatus}
12
12
  Error: ${t.error}
13
- `.trim()}}let k={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 S({walletBaseUrl:e,config:t}){let n=document.querySelector("#frak-wallet");n&&n.remove();let r=document.createElement("iframe");return r.id=k.id,r.name=k.name,r.allow=k.allow,r.style.zIndex=k.style.zIndex.toString(),b({iframe:r,isVisible:!1}),document.body.appendChild(r),new Promise(n=>{r?.addEventListener("load",()=>n(r)),r.src=`${t?.walletUrl??e??"https://wallet.frak.id"}/listener`})}function b({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 I(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}};if(t(window.opener))return window.opener;try{let e=window.opener.frames;for(let n=0;n<e.length;n++)if(t(e[n]))return e[n];return null}catch(t){return console.error(`[findIframeInOpener] Error finding iframe with pathname ${e}:`,t),null}}function L({config:r,iframe:o}){let c,l=r?.walletUrl??"https://wallet.frak.id",u=function({iframe:t}){let n=new e;return{handleEvent:async e=>{if(!("iframeLifecycle"in e))return;let{iframeLifecycle:r,data:a}=e;switch(r){case"connected":n.resolve(!0);break;case"do-backup":a.backup?localStorage.setItem(g,a.backup):localStorage.removeItem(g);break;case"remove-backup":localStorage.removeItem(g);break;case"show":case"hide":b({iframe:t,isVisible:"show"===r});break;case"handshake":t.contentWindow?.postMessage({clientLifecycle:"handshake-response",data:{token:a.token,currentUrl:window.location.href}},"*");break;case"redirect":{let e=new URL(a.baseRedirectUrl);e.searchParams.has("u")?(e.searchParams.delete("u"),e.searchParams.append("u",window.location.href),window.location.href=e.toString()):window.location.href=a.baseRedirectUrl}}},isConnected:n.promise}}({iframe:o}),d=new y(r,o);if(!o.contentWindow)throw new t(n.configError,"The iframe does not have a content window");let f=a({emittingTransport:o.contentWindow,listeningTransport:window,targetOrigin:l,middleware:[{async onRequest(e,r){if(!await u.isConnected)throw new t(n.clientNotConnected,"The iframe provider isn't connected yet");return r}},i(),{onRequest:(e,t)=>(d.setLastRequest(e),t),onResponse:(e,t)=>(d.setLastResponse(e,t),t)}],lifecycleHandlers:{iframeLifecycle:async(e,t)=>{await u.handleEvent(e)}}}),p=function(e,t){let n,r,a=()=>e.sendLifecycle({clientLifecycle:"heartbeat"});function o(){n&&clearInterval(n),r&&clearTimeout(r)}return async function(){a(),n=setInterval(a,1e3),r=setTimeout(()=>{o(),console.log("Heartbeat timeout: connection failed")},3e4),await t.isConnected,o()}(),o}(f,u),m=async()=>{p(),f.cleanup(),o.remove()};console.log("[Frak SDK] Initializing OpenPanel"),(c=new s({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"}),c.init();let w=v({config:r,rpcClient:f,lifecycleManager:u}).then(()=>d.updateSetupStatus(!0));return{config:r,debugInfo:d,waitForConnection:u.isConnected,waitForSetup:w,request:f.request,listenerRequest:f.listen,destroy:m,openPanel:c}}async function v({config:e,rpcClient:t,lifecycleManager:n}){async function r(){let n=e.customizations?.css;n&&t.sendLifecycle({clientLifecycle:"modal-css",data:{cssLink:n}})}async function a(){let n=e.customizations?.i18n;n&&t.sendLifecycle({clientLifecycle:"modal-i18n",data:{i18n:n}})}async function o(){if("undefined"==typeof window)return;let e=window.localStorage.getItem(g);e&&t.sendLifecycle({clientLifecycle:"restore-backup",data:{backup:e}})}await n.isConnected,function(e,t){if("undefined"==typeof window)return;let n=new URL(window.location.href),r=n.searchParams.get("sso");r&&(t.then(()=>{e.sendLifecycle({clientLifecycle:"sso-redirect-complete",data:{compressed:r}}),console.log("[SSO URL Listener] Forwarded compressed SSO data to iframe")}).catch(e=>{console.error("[SSO URL Listener] Failed to forward SSO data:",e)}),n.searchParams.delete("sso"),window.history.replaceState({},"",n.toString()),console.log("[SSO URL Listener] SSO parameter detected and URL cleaned"))}(t,n.isConnected),await Promise.allSettled([r(),a(),o()])}let R={eur:"fr-FR",usd:"en-US",gbp:"en-GB"};function U(e){return e&&e in R?e:"eur"}async function x({config:e}){let t=function(e){let t=U(e.metadata?.currency);return{...e,metadata:{...e.metadata,currency:t}}}(e),n=await S({config:t});if(!n)return void console.error("Failed to create iframe");let r=L({config:t,iframe:n});return(await r.waitForSetup,await r.waitForConnection)?r:void console.error("Failed to connect to client")}function E(e){return btoa(Array.from(e,e=>String.fromCharCode(e)).join("")).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function P(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 F(e){return E(r(e))}function C(e){return o(P(e))}let T="fCtx";function D(e){if(e?.r)try{let t=d(e.r);return E(t)}catch(t){console.error("Error compressing Frak context",{e:t,context:e})}}function q(e){if(e&&0!==e.length)try{let t=P(e);return{r:c(t,{size:20})}}catch(t){console.error("Error decompressing Frak context",{e:t,context:e})}}function A({url:e}){if(!e)return null;let t=new URL(e).searchParams.get(T);return t?q(t):null}function $({url:e,context:t}){if(!e)return null;let n=A({url:e}),r=n?{...n,...t}:t;if(!r.r)return null;let a=D(r);if(!a)return null;let o=new URL(e);return o.searchParams.set(T,a),o.toString()}function O(e){let t=new URL(e);return t.searchParams.delete(T),t.toString()}let W={compress:D,decompress:q,parse:A,update:$,remove:O,replaceUrl:function({url:e,context:t}){let n;if(!window.location?.href||"undefined"==typeof window)return void console.error("No window found, can't update context");let r=e??window.location.href;(n=null!==t?$({url:r,context:t}):O(r))&&window.history.replaceState(null,"",n.toString())}};function N(e){return e?R[e]??R.eur:R.eur}function z(e){return e?`${e}Amount`:"eurAmount"}function _(e,t){let n=N(t),r=U(t);return e.toLocaleString(n,{style:"currency",currency:r,minimumFractionDigits:0,maximumFractionDigits:2})}function M(e,t,n={}){if(!e)return void console.debug("[Frak] No client provided, skipping event tracking");try{e.openPanel?.track(t,n)}catch(e){console.debug("[Frak] Failed to track event:",t,e)}}function V(e,t,n,r,a){var o;let i=F({r:(o={redirectUrl:t.redirectUrl,directExit:t.directExit,lang:t.lang,productId:n,metadata:{name:r,css:a,logoUrl:t.metadata?.logoUrl,homepageLink:t.metadata?.homepageLink}}).redirectUrl,d:o.directExit,l:o.lang,p:o.productId,m:{n:o.metadata?.name,css:o.metadata?.css,l:o.metadata?.logoUrl,h:o.metadata?.homepageLink}}),s=new URL(e);return s.pathname="/sso",s.searchParams.set("p",i),s.toString()}let B={dapp:1,press:2,webshop:3,retail:4,referral:30,purchase:31},j=Object.entries(B).reduce((e,[t,n])=>(e[t]=BigInt(1)<<BigInt(n),e),{}),G={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 J({domain:e}={}){return p(w((e??window.location.host).replace("www.","")))}let H="menubar=no,status=no,scrollbars=no,fullscreen=no,width=500, height=800",K="frak-sso";async function Q(e,t){let{metadata:n,customizations:r,walletUrl:a}=e.config;if(t.openInSameWindow??!!t.redirectUrl)return await e.request({method:"frak_openSso",params:[t,n.name,r?.css]});let o=t.ssoPopupUrl??V(a??"https://wallet.frak.id",t,J(),n.name,r?.css),i=window.open(o,K,H);if(!i)throw Error("Popup was blocked. Please allow popups for this site.");return i.focus(),await e.request({method:"frak_openSso",params:[t,n.name,r?.css]})??{}}function X(t,n){if(!n)return t.request({method:"frak_listenToWalletStatus"}).then(e=>(Y(t,e),e));let r=new e,a=!1;return t.listenerRequest({method:"frak_listenToWalletStatus"},e=>{Y(t,e),n(e),a||(r.resolve(e),a=!0)}),r.promise}function Y(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 Z(e,{productId:t,interaction:n,validation:r}){let a=t??J(e.config);return await e.request({method:"frak_sendInteraction",params:[a,n,r]})}async function ee(e,{steps:t,metadata:n}){return await e.request({method:"frak_displayModal",params:[t,n,e.config.metadata]})}async function et(e,t){return await e.request({method:"frak_displayEmbeddedWallet",params:[t,e.config.metadata]})}async function en(e,t){let{metadata:n,customizations:r}=e.config;return await e.request({method:"frak_prepareSso",params:[t,n.name,r?.css]})}async function er(e){return await e.request({method:"frak_getProductInformation"})}async function ea(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 eo(e,{siwe:t,metadata:n}){let r=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??h(),uri:t?.uri??`https://${r}`,version:t?.version??"1",domain:r};return(await ee(e,{metadata:n,steps:{login:{},siweAuthenticate:{siwe:o}}})).siweAuthenticate}async function ei(e,{tx:t,metadata:n}){return(await ee(e,{metadata:n,steps:{login:{},sendTransaction:{tx:t}}})).sendTransaction}function es(e,{metadata:t,login:n,openSession:r}){return function e(t,n){async function r(e){return e&&(n.metadata=e(n.metadata??{})),await ee(t,n)}return{params:n,sendTx:function(r){return e(t,{...n,steps:{...n.steps,sendTransaction:r}})},reward:function(r){return e(t,{...n,steps:{...n.steps,final:{...r,action:{key:"reward"}}}})},sharing:function(r,a){return e(t,{...n,steps:{...n.steps,final:{...a,action:{key:"sharing",options:r}}}})},display:r}}(e,{steps:{login:n??{},openSession:r??{}},metadata:t})}let ec={createLink:()=>({handlerTypeDenominator:w(B.referral),interactionData:G.referral.createLink}),referred({referrer:e}){let t=l([G.referral.referred,m(e,{size:32})]);return{handlerTypeDenominator:w(B.referral),interactionData:t}}};async function el(e,{walletStatus:r,frakContext:a,modalConfig:o,productId:i,options:s}){let c=!1;async function l(){if(!c)return c=!0,ed(e,{modalConfig:{...o,loggedIn:{action:{key:"referred"}}},walletStatus:r})}async function u(t){let n=ec.referred({referrer:t});await Promise.allSettled([Z(e,{productId:i,interaction:n}),M(e,"user_referred",{properties:{referrer:t}})])}try{let{status:e,currentWallet:t}=await eu({initialWalletStatus:r,getFreshWalletStatus:l,pushReferralInteraction:u,frakContext:a});return W.replaceUrl({url:window.location?.href,context:s?.alwaysAppendUrl?{r:t}:null}),e}catch(e){return console.log("Error processing referral",{error:e}),W.replaceUrl({url:window.location?.href,context:s?.alwaysAppendUrl?{r:r?.wallet}:null}),function(e){if(e instanceof t)switch(e.code){case n.walletNotConnected:return"no-wallet";case n.serverErrorForInteractionDelegation:return"no-session"}return"error"}(e)}}async function eu({initialWalletStatus:e,getFreshWalletStatus:t,pushReferralInteraction:n,frakContext:r}){let a=e?.wallet;return r?.r?(a||(a=await t()),a&&f(r.r,a))?{status:"self-referral",currentWallet:a}:(e?.interactionSession||(a=await t()),await n(r.r),{status:"success",currentWallet:a}):{status:"no-referrer",currentWallet:a}}async function ed(e,{modalConfig:t,walletStatus:n}){if(!n?.interactionSession){let n=await et(e,t??{});return n?.wallet??void 0}return n.wallet??void 0}async function ef(e,{productId:t,modalConfig:n,options:r}={}){let a=W.parse({url:window.location.href}),o=await X(e);try{return await el(e,{walletStatus:o,frakContext:a,modalConfig:n,productId:t,options:r})}catch(e){console.warn("Error processing referral",{error:e})}}let ep={openArticle({articleId:e}){let t=l([G.press.openArticle,m(e,{size:32})]);return{handlerTypeDenominator:w(B.press),interactionData:t}},readArticle({articleId:e}){let t=l([G.press.readArticle,m(e,{size:32})]);return{handlerTypeDenominator:w(B.press),interactionData:t}}},em={startPurchase({purchaseId:e}){let t=l([G.purchase.started,m(e,{size:32})]);return{handlerTypeDenominator:w(B.purchase),interactionData:t}},completedPurchase({purchaseId:e,proof:t}){let n=u([{type:"uint256"},{type:"bytes32[]"}],[BigInt(e),t]),r=l([G.purchase.completed,n]);return{handlerTypeDenominator:w(B.purchase),interactionData:r}},unsafeCompletedPurchase({purchaseId:e}){let t=l([G.purchase.unsafeCompleted,m(e,{size:32})]);return{handlerTypeDenominator:w(B.purchase),interactionData:t}}},ew={open:()=>({handlerTypeDenominator:w(B.webshop),interactionData:G.webshop.open})},eh={customerMeeting({agencyId:e}){let t=l([G.retail.customerMeeting,m(e,{size:32})]);return{handlerTypeDenominator:w(B.retail),interactionData:t}}};export{y as DebugInfoGatherer,W as FrakContextManager,ep as PressInteractionEncoder,em as PurchaseInteractionEncoder,ec as ReferralInteractionEncoder,eh as RetailInteractionEncoder,ew as WebShopInteractionEncoder,P as base64urlDecode,E as base64urlEncode,k as baseIframeProps,F as compressJsonToB64,L as createIFrameFrakClient,S as createIframe,C as decompressJsonFromB64,et as displayEmbeddedWallet,ee as displayModal,I as findIframeInOpener,_ as formatAmount,V as generateSsoUrl,z as getCurrencyAmountKey,er as getProductInformation,U as getSupportedCurrency,N as getSupportedLocale,G as interactionTypes,R as locales,es as modalBuilder,Q as openSso,en as prepareSso,el as processReferral,B as productTypes,j as productTypesMask,ef as referralInteraction,Z as sendInteraction,ei as sendTransaction,x as setupClient,eo as siweAuthenticate,H as ssoPopupFeatures,K as ssoPopupName,M as trackEvent,ea as trackPurchaseStatus,X as watchWalletStatus};
13
+ `.trim()}}let ee={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 et({walletBaseUrl:e,config:t}){let n=document.querySelector("#frak-wallet");n&&n.remove();let r=document.createElement("iframe");return r.id=ee.id,r.name=ee.name,r.allow=ee.allow,r.style.zIndex=ee.style.zIndex.toString(),en({iframe:r,isVisible:!1}),document.body.appendChild(r),new Promise(n=>{r?.addEventListener("load",()=>n(r)),r.src=`${t?.walletUrl??e??"https://wallet.frak.id"}/listener`})}function en({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 er(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}};if(t(window.opener))return window.opener;try{let e=window.opener.frames;for(let n=0;n<e.length;n++)if(t(e[n]))return e[n];return null}catch(t){return console.error(`[findIframeInOpener] Error finding iframe with pathname ${e}:`,t),null}}function ea({config:e,iframe:t}){let n,r=e?.walletUrl??"https://wallet.frak.id",a=function({iframe:e}){let t=new c;return{handleEvent:async n=>{if(!("iframeLifecycle"in n))return;let{iframeLifecycle:r,data:a}=n;switch(r){case"connected":t.resolve(!0);break;case"do-backup":a.backup?localStorage.setItem(Y,a.backup):localStorage.removeItem(Y);break;case"remove-backup":localStorage.removeItem(Y);break;case"show":case"hide":en({iframe:e,isVisible:"show"===r});break;case"handshake":e.contentWindow?.postMessage({clientLifecycle:"handshake-response",data:{token:a.token,currentUrl:window.location.href}},"*");break;case"redirect":{let e=new URL(a.baseRedirectUrl);e.searchParams.has("u")?(e.searchParams.delete("u"),e.searchParams.append("u",window.location.href),window.location.href=e.toString()):window.location.href=a.baseRedirectUrl}}},isConnected:t.promise}}({iframe:t}),o=new Z(e,t);if(!t.contentWindow)throw new l(u.configError,"The iframe does not have a content window");let i=f({emittingTransport:t.contentWindow,listeningTransport:window,targetOrigin:r,middleware:[{async onRequest(e,t){if(!await a.isConnected)throw new l(u.clientNotConnected,"The iframe provider isn't connected yet");return t}},w(),{onRequest:(e,t)=>(o.setLastRequest(e),t),onResponse:(e,t)=>(o.setLastResponse(e,t),t)}],lifecycleHandlers:{iframeLifecycle:async(e,t)=>{await a.handleEvent(e)}}}),s=function(e,t){let n,r,a=()=>e.sendLifecycle({clientLifecycle:"heartbeat"});function o(){n&&clearInterval(n),r&&clearTimeout(r)}return async function(){a(),n=setInterval(a,1e3),r=setTimeout(()=>{o(),console.log("Heartbeat timeout: connection failed")},3e4),await t.isConnected,o()}(),o}(i,a),d=async()=>{s(),i.cleanup(),t.remove()};console.log("[Frak SDK] Initializing OpenPanel"),(n=new h({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"}),n.init();let p=eo({config:e,rpcClient:i,lifecycleManager:a}).then(()=>o.updateSetupStatus(!0));return{config:e,debugInfo:o,waitForConnection:a.isConnected,waitForSetup:p,request:i.request,listenerRequest:i.listen,destroy:d,openPanel:n}}async function eo({config:e,rpcClient:t,lifecycleManager:n}){async function r(){let n=e.customizations?.css;n&&t.sendLifecycle({clientLifecycle:"modal-css",data:{cssLink:n}})}async function a(){let n=e.customizations?.i18n;n&&t.sendLifecycle({clientLifecycle:"modal-i18n",data:{i18n:n}})}async function o(){if("undefined"==typeof window)return;let e=window.localStorage.getItem(Y);e&&t.sendLifecycle({clientLifecycle:"restore-backup",data:{backup:e}})}await n.isConnected,function(e,t){if("undefined"==typeof window)return;let n=new URL(window.location.href),r=n.searchParams.get("sso");r&&(t.then(()=>{e.sendLifecycle({clientLifecycle:"sso-redirect-complete",data:{compressed:r}}),console.log("[SSO URL Listener] Forwarded compressed SSO data to iframe")}).catch(e=>{console.error("[SSO URL Listener] Failed to forward SSO data:",e)}),n.searchParams.delete("sso"),window.history.replaceState({},"",n.toString()),console.log("[SSO URL Listener] SSO parameter detected and URL cleaned"))}(t,n.isConnected),await Promise.allSettled([r(),a(),o()])}let ei={eur:"fr-FR",usd:"en-US",gbp:"en-GB"};function es(e){return e&&e in ei?e:"eur"}async function ec({config:e}){var t;let n,r=(t=e,n=es(t.metadata?.currency),{...t,metadata:{...t.metadata,currency:n}}),a=await et({config:r});if(!a)return void console.error("Failed to create iframe");let o=ea({config:r,iframe:a});return(await o.waitForSetup,await o.waitForConnection)?o:void console.error("Failed to connect to client")}function el(e){return p(I(e))}function eu(e){return e?ei[e]??ei.eur:ei.eur}function ed(e,t){let n=eu(t),r=es(t);return e.toLocaleString(n,{style:"currency",currency:r,minimumFractionDigits:0,maximumFractionDigits:2})}function ef(e){return e?`${e}Amount`:"eurAmount"}let ep={openArticle({articleId:e}){let n=t([P.press.openArticle,i(e,{size:32})]);return{handlerTypeDenominator:s(F.press),interactionData:n}},readArticle({articleId:e}){let n=t([P.press.readArticle,i(e,{size:32})]);return{handlerTypeDenominator:s(F.press),interactionData:n}}},em={startPurchase({purchaseId:e}){let n=t([P.purchase.started,i(e,{size:32})]);return{handlerTypeDenominator:s(F.purchase),interactionData:n}},completedPurchase({purchaseId:e,proof:r}){let a=n([{type:"uint256"},{type:"bytes32[]"}],[BigInt(e),r]),o=t([P.purchase.completed,a]);return{handlerTypeDenominator:s(F.purchase),interactionData:o}},unsafeCompletedPurchase({purchaseId:e}){let n=t([P.purchase.unsafeCompleted,i(e,{size:32})]);return{handlerTypeDenominator:s(F.purchase),interactionData:n}}},ew={customerMeeting({agencyId:e}){let n=t([P.retail.customerMeeting,i(e,{size:32})]);return{handlerTypeDenominator:s(F.retail),interactionData:n}}},eh={open:()=>({handlerTypeDenominator:s(F.webshop),interactionData:P.webshop.open})};export{Z as DebugInfoGatherer,z as FrakContextManager,ep as PressInteractionEncoder,em as PurchaseInteractionEncoder,T as ReferralInteractionEncoder,ew as RetailInteractionEncoder,eh as WebShopInteractionEncoder,I as base64urlDecode,b as base64urlEncode,ee as baseIframeProps,L as compressJsonToB64,ea as createIFrameFrakClient,et as createIframe,el as decompressJsonFromB64,g as displayEmbeddedWallet,y as displayModal,er as findIframeInOpener,ed as formatAmount,v as generateSsoUrl,ef as getCurrencyAmountKey,k as getProductInformation,es as getSupportedCurrency,eu as getSupportedLocale,P as interactionTypes,ei as locales,K as modalBuilder,x as openSso,E as prepareSso,M as processReferral,F as productTypes,C as productTypesMask,J as referralInteraction,_ as sendInteraction,Q as sendTransaction,ec as setupClient,X as siweAuthenticate,R as ssoPopupFeatures,U as ssoPopupName,D as trackEvent,H as trackPurchaseStatus,j as watchWalletStatus};
package/dist/index.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,productTypesMask:()=>productTypesMask,findIframeInOpener:()=>findIframeInOpener,createIFrameFrakClient:()=>createIFrameFrakClient,generateSsoUrl:()=>sso_generateSsoUrl,getCurrencyAmountKey:()=>getCurrencyAmountKey,getSupportedCurrency:()=>getSupportedCurrency,interactionTypes:()=>interactionTypes,FrakContextManager:()=>FrakContextManager,formatAmount:()=>formatAmount,getSupportedLocale:()=>getSupportedLocale,trackEvent:()=>trackEvent,compressJsonToB64:()=>compressJsonToB64,base64urlDecode:()=>base64urlDecode,baseIframeProps:()=>baseIframeProps,DebugInfoGatherer:()=>DebugInfoGatherer,base64urlEncode:()=>base64urlEncode,ssoPopupFeatures:()=>ssoPopupFeatures,productTypes:()=>productTypes,setupClient:()=>setupClient,createIframe:()=>createIframe,ssoPopupName:()=>ssoPopupName,locales:()=>locales});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),o=r.searchParams.get("sso");o&&(t.then(()=>{e.sendLifecycle({clientLifecycle:"sso-redirect-complete",data:{compressed:o}}),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(),o="Unknown";return e instanceof frame_connector_namespaceObject.FrakRpcError?o=`FrakRpcError: ${e.code} '${e.message}'`:e instanceof Error?o=e.message:"string"==typeof e&&(o=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:o}}static empty(){return new DebugInfoGatherer}formatDebugInfo(e){let t=this.gatherDebugInfo(e);return`
1
+ "use strict";const __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,productTypesMask:()=>productTypesMask,findIframeInOpener:()=>findIframeInOpener,createIFrameFrakClient:()=>createIFrameFrakClient,generateSsoUrl:()=>sso_generateSsoUrl,getCurrencyAmountKey:()=>getCurrencyAmountKey,getSupportedCurrency:()=>getSupportedCurrency,interactionTypes:()=>interactionTypes,FrakContextManager:()=>FrakContextManager,formatAmount:()=>formatAmount,getSupportedLocale:()=>getSupportedLocale,locales:()=>locales,trackEvent:()=>trackEvent,compressJsonToB64:()=>compressJsonToB64,base64urlDecode:()=>base64urlDecode,baseIframeProps:()=>baseIframeProps,DebugInfoGatherer:()=>DebugInfoGatherer,base64urlEncode:()=>base64urlEncode,ssoPopupFeatures:()=>ssoPopupFeatures,productTypes:()=>productTypes,setupClient:()=>setupClient,createIframe:()=>createIframe,ssoPopupName:()=>ssoPopupName});const 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:o,walletUrl:a}=e.config;if(t.openInSameWindow??!!t.redirectUrl)return await e.request({method:"frak_openSso",params:[t,r.name,o?.css]});let n=t.ssoPopupUrl??generateSsoUrl(a??"https://wallet.frak.id",t,computeProductId(),r.name,o?.css),s=window.open(n,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,o?.css]})??{}}const 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),o=r.searchParams.get("sso");o&&(t.then(()=>{e.sendLifecycle({clientLifecycle:"sso-redirect-complete",data:{compressed:o}}),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(),o="Unknown";return e instanceof frame_connector_namespaceObject.FrakRpcError?o=`FrakRpcError: ${e.code} '${e.message}'`:e instanceof Error?o=e.message:"string"==typeof e&&(o=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:o}}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()}}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 o=document.createElement("iframe");return o.id=baseIframeProps.id,o.name=baseIframeProps.name,o.allow=baseIframeProps.allow,o.style.zIndex=baseIframeProps.style.zIndex.toString(),changeIframeVisibility({iframe:o,isVisible:!1}),document.body.appendChild(o),new Promise(r=>{o?.addEventListener("load",()=>r(o)),o.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}};if(t(window.opener))return window.opener;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:o,data:a}=r;switch(o){case"connected":t.resolve(!0);break;case"do-backup":a.backup?localStorage.setItem(BACKUP_KEY,a.backup):localStorage.removeItem(BACKUP_KEY);break;case"remove-backup":localStorage.removeItem(BACKUP_KEY);break;case"show":case"hide":changeIframeVisibility({iframe:e,isVisible:"show"===o});break;case"handshake":e.contentWindow?.postMessage({clientLifecycle:"handshake-response",data:{token:a.token,currentUrl:window.location.href}},"*");break;case"redirect":{let e=new URL(a.baseRedirectUrl);e.searchParams.has("u")?(e.searchParams.delete("u"),e.searchParams.append("u",window.location.href),window.location.href=e.toString()):window.location.href=a.baseRedirectUrl}}},isConnected:t.promise}}function createIFrameFrakClient({config:e,iframe:t}){let r,o=e?.walletUrl??"https://wallet.frak.id",a=createIFrameLifecycleManager({iframe:t}),n=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:o,middleware:[{async onRequest(e,t){if(!await a.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)=>(n.setLastRequest(e),t),onResponse:(e,t)=>(n.setLastResponse(e,t),t)}],lifecycleHandlers:{iframeLifecycle:async(e,t)=>{await a.handleEvent(e)}}}),c=setupHeartbeat(s,a),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 p=postConnectionSetup({config:e,rpcClient:s,lifecycleManager:a}).then(()=>n.updateSetupStatus(!0));return{config:e,debugInfo:n,waitForConnection:a.isConnected,waitForSetup:p,request:s.request,listenerRequest:s.listen,destroy:i,openPanel:r}}function setupHeartbeat(e,t){let r,o,a=()=>e.sendLifecycle({clientLifecycle:"heartbeat"});function n(){r&&clearInterval(r),o&&clearTimeout(o)}return async function(){a(),r=setInterval(a,1e3),o=setTimeout(()=>{n(),console.log("Heartbeat timeout: connection failed")},3e4),await t.isConnected,n()}(),n}async function postConnectionSetup({config:e,rpcClient:t,lifecycleManager:r}){async function o(){let r=e.customizations?.css;r&&t.sendLifecycle({clientLifecycle:"modal-css",data:{cssLink:r}})}async function a(){let r=e.customizations?.i18n;r&&t.sendLifecycle({clientLifecycle:"modal-i18n",data:{i18n:r}})}async function n(){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([o(),a(),n()])}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 o=createIFrameFrakClient({config:t,iframe:r});return(await o.waitForSetup,await o.waitForConnection)?o: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}),o=r?{...r,...t}:t;if(!o.r)return null;let a=compress(o);if(!a)return null;let n=new URL(e);return n.searchParams.set(contextKey,a),n.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 o=e??window.location.href;(r=null!==t?update({url:o,context:t}):remove(o))&&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),o=getSupportedCurrency(t);return e.toLocaleString(r,{style:"currency",currency:o,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 sso_generateSsoUrl(e,t,r,o,a){let n=compressJsonToB64(ssoParamsToCompressed({redirectUrl:t.redirectUrl,directExit:t.directExit,lang:t.lang,productId:r,metadata:{name:o,css:a,logoUrl:t.metadata?.logoUrl,homepageLink:t.metadata?.homepageLink}})),s=new URL(e);return s.pathname="/sso",s.searchParams.set("p",n),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"}},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:o,walletUrl:a}=e.config;if(t.openInSameWindow??!!t.redirectUrl)return await e.request({method:"frak_openSso",params:[t,r.name,o?.css]});let n=t.ssoPopupUrl??generateSsoUrl(a??"https://wallet.frak.id",t,computeProductId(),r.name,o?.css),s=window.open(n,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,o?.css]})??{}}for(var __webpack_i__ in exports.DebugInfoGatherer=__webpack_exports__.DebugInfoGatherer,exports.FrakContextManager=__webpack_exports__.FrakContextManager,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.findIframeInOpener=__webpack_exports__.findIframeInOpener,exports.formatAmount=__webpack_exports__.formatAmount,exports.generateSsoUrl=__webpack_exports__.generateSsoUrl,exports.getCurrencyAmountKey=__webpack_exports__.getCurrencyAmountKey,exports.getSupportedCurrency=__webpack_exports__.getSupportedCurrency,exports.getSupportedLocale=__webpack_exports__.getSupportedLocale,exports.interactionTypes=__webpack_exports__.interactionTypes,exports.locales=__webpack_exports__.locales,exports.productTypes=__webpack_exports__.productTypes,exports.productTypesMask=__webpack_exports__.productTypesMask,exports.setupClient=__webpack_exports__.setupClient,exports.ssoPopupFeatures=__webpack_exports__.ssoPopupFeatures,exports.ssoPopupName=__webpack_exports__.ssoPopupName,exports.trackEvent=__webpack_exports__.trackEvent,__webpack_exports__)-1===["DebugInfoGatherer","FrakContextManager","base64urlDecode","base64urlEncode","baseIframeProps","compressJsonToB64","createIFrameFrakClient","createIframe","decompressJsonFromB64","findIframeInOpener","formatAmount","generateSsoUrl","getCurrencyAmountKey","getSupportedCurrency","getSupportedLocale","interactionTypes","locales","productTypes","productTypesMask","setupClient","ssoPopupFeatures","ssoPopupName","trackEvent"].indexOf(__webpack_i__)&&(exports[__webpack_i__]=__webpack_exports__[__webpack_i__]);Object.defineProperty(exports,"__esModule",{value:!0});
13
+ `.trim()}}const 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 o=document.createElement("iframe");return o.id=baseIframeProps.id,o.name=baseIframeProps.name,o.allow=baseIframeProps.allow,o.style.zIndex=baseIframeProps.style.zIndex.toString(),changeIframeVisibility({iframe:o,isVisible:!1}),document.body.appendChild(o),new Promise(r=>{o?.addEventListener("load",()=>r(o)),o.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}};if(t(window.opener))return window.opener;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:o,data:a}=r;switch(o){case"connected":t.resolve(!0);break;case"do-backup":a.backup?localStorage.setItem(BACKUP_KEY,a.backup):localStorage.removeItem(BACKUP_KEY);break;case"remove-backup":localStorage.removeItem(BACKUP_KEY);break;case"show":case"hide":changeIframeVisibility({iframe:e,isVisible:"show"===o});break;case"handshake":e.contentWindow?.postMessage({clientLifecycle:"handshake-response",data:{token:a.token,currentUrl:window.location.href}},"*");break;case"redirect":{let e=new URL(a.baseRedirectUrl);e.searchParams.has("u")?(e.searchParams.delete("u"),e.searchParams.append("u",window.location.href),window.location.href=e.toString()):window.location.href=a.baseRedirectUrl}}},isConnected:t.promise}}function createIFrameFrakClient({config:e,iframe:t}){let r,o=e?.walletUrl??"https://wallet.frak.id",a=createIFrameLifecycleManager({iframe:t}),n=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:o,middleware:[{async onRequest(e,t){if(!await a.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)=>(n.setLastRequest(e),t),onResponse:(e,t)=>(n.setLastResponse(e,t),t)}],lifecycleHandlers:{iframeLifecycle:async(e,t)=>{await a.handleEvent(e)}}}),c=setupHeartbeat(s,a),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 p=postConnectionSetup({config:e,rpcClient:s,lifecycleManager:a}).then(()=>n.updateSetupStatus(!0));return{config:e,debugInfo:n,waitForConnection:a.isConnected,waitForSetup:p,request:s.request,listenerRequest:s.listen,destroy:i,openPanel:r}}function setupHeartbeat(e,t){let r,o,a=()=>e.sendLifecycle({clientLifecycle:"heartbeat"});function n(){r&&clearInterval(r),o&&clearTimeout(o)}return async function(){a(),r=setInterval(a,1e3),o=setTimeout(()=>{n(),console.log("Heartbeat timeout: connection failed")},3e4),await t.isConnected,n()}(),n}async function postConnectionSetup({config:e,rpcClient:t,lifecycleManager:r}){async function o(){let r=e.customizations?.css;r&&t.sendLifecycle({clientLifecycle:"modal-css",data:{cssLink:r}})}async function a(){let r=e.customizations?.i18n;r&&t.sendLifecycle({clientLifecycle:"modal-i18n",data:{i18n:r}})}async function n(){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([o(),a(),n()])}const 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 o=createIFrameFrakClient({config:t,iframe:r});return(await o.waitForSetup,await o.waitForConnection)?o:void console.error("Failed to connect to client")}function prepareConfig(e){let t=getSupportedCurrency(e.metadata?.currency);return{...e,metadata:{...e.metadata,currency:t}}}const 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"}},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),{});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))}const 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}),o=r?{...r,...t}:t;if(!o.r)return null;let a=compress(o);if(!a)return null;let n=new URL(e);return n.searchParams.set(contextKey,a),n.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 o=e??window.location.href;(r=null!==t?update({url:o,context:t}):remove(o))&&window.history.replaceState(null,"",r.toString())}const FrakContextManager={compress,decompress,parse,update,remove,replaceUrl};function getSupportedLocale(e){return e?locales[e]??locales.eur:locales.eur}function formatAmount(e,t){let r=getSupportedLocale(t),o=getSupportedCurrency(t);return e.toLocaleString(r,{style:"currency",currency:o,minimumFractionDigits:0,maximumFractionDigits:2})}function sso_generateSsoUrl(e,t,r,o,a){let n=compressJsonToB64(ssoParamsToCompressed({redirectUrl:t.redirectUrl,directExit:t.directExit,lang:t.lang,productId:r,metadata:{name:o,css:a,logoUrl:t.metadata?.logoUrl,homepageLink:t.metadata?.homepageLink}})),s=new URL(e);return s.pathname="/sso",s.searchParams.set("p",n),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}}}function getCurrencyAmountKey(e){return e?`${e}Amount`:"eurAmount"}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)}}for(var __webpack_i__ in exports.DebugInfoGatherer=__webpack_exports__.DebugInfoGatherer,exports.FrakContextManager=__webpack_exports__.FrakContextManager,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.findIframeInOpener=__webpack_exports__.findIframeInOpener,exports.formatAmount=__webpack_exports__.formatAmount,exports.generateSsoUrl=__webpack_exports__.generateSsoUrl,exports.getCurrencyAmountKey=__webpack_exports__.getCurrencyAmountKey,exports.getSupportedCurrency=__webpack_exports__.getSupportedCurrency,exports.getSupportedLocale=__webpack_exports__.getSupportedLocale,exports.interactionTypes=__webpack_exports__.interactionTypes,exports.locales=__webpack_exports__.locales,exports.productTypes=__webpack_exports__.productTypes,exports.productTypesMask=__webpack_exports__.productTypesMask,exports.setupClient=__webpack_exports__.setupClient,exports.ssoPopupFeatures=__webpack_exports__.ssoPopupFeatures,exports.ssoPopupName=__webpack_exports__.ssoPopupName,exports.trackEvent=__webpack_exports__.trackEvent,__webpack_exports__)-1===["DebugInfoGatherer","FrakContextManager","base64urlDecode","base64urlEncode","baseIframeProps","compressJsonToB64","createIFrameFrakClient","createIframe","decompressJsonFromB64","findIframeInOpener","formatAmount","generateSsoUrl","getCurrencyAmountKey","getSupportedCurrency","getSupportedLocale","interactionTypes","locales","productTypes","productTypesMask","setupClient","ssoPopupFeatures","ssoPopupName","trackEvent"].indexOf(__webpack_i__)&&(exports[__webpack_i__]=__webpack_exports__[__webpack_i__]);Object.defineProperty(exports,"__esModule",{value:!0});
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import{Deferred as e,FrakRpcError as t,RpcErrorCodes as n,compressJson as r,createRpcClient as a,decompressJson as o}from"@frak-labs/frame-connector";import{createClientCompressionMiddleware as i}from"@frak-labs/frame-connector/middleware";import{OpenPanel as s}from"@openpanel/web";import{bytesToHex as c,hexToBytes as l}from"viem";let d="nexus-wallet-backup";class u{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 n=this.getIframeStatus(),r=this.getNavigatorInfo(),a="Unknown";return e instanceof t?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:n?this.base64Encode(n):"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 u}formatDebugInfo(e){let t=this.gatherDebugInfo(e);return`
1
+ import{Deferred as e,FrakRpcError as t,RpcErrorCodes as n,compressJson as r,createRpcClient as a,decompressJson as o}from"@frak-labs/frame-connector";import{createClientCompressionMiddleware as i}from"@frak-labs/frame-connector/middleware";import{OpenPanel as s}from"@openpanel/web";import{bytesToHex as c,hexToBytes as l}from"viem";let d="menubar=no,status=no,scrollbars=no,fullscreen=no,width=500, height=800",u="frak-sso",f="nexus-wallet-backup";class p{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 n=this.getIframeStatus(),r=this.getNavigatorInfo(),a="Unknown";return e instanceof t?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:n?this.base64Encode(n):"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 p}formatDebugInfo(e){let t=this.gatherDebugInfo(e);return`
2
2
  Debug Information:
3
3
  -----------------
4
4
  Timestamp: ${t.timestamp}
@@ -10,4 +10,4 @@ import{Deferred as e,FrakRpcError as t,RpcErrorCodes as n,compressJson as r,crea
10
10
  Last Response: ${t.lastResponse}
11
11
  Client Status: ${t.clientStatus}
12
12
  Error: ${t.error}
13
- `.trim()}}let f={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 p({walletBaseUrl:e,config:t}){let n=document.querySelector("#frak-wallet");n&&n.remove();let r=document.createElement("iframe");return r.id=f.id,r.name=f.name,r.allow=f.allow,r.style.zIndex=f.style.zIndex.toString(),m({iframe:r,isVisible:!1}),document.body.appendChild(r),new Promise(n=>{r?.addEventListener("load",()=>n(r)),r.src=`${t?.walletUrl??e??"https://wallet.frak.id"}/listener`})}function m({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 g(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}};if(t(window.opener))return window.opener;try{let e=window.opener.frames;for(let n=0;n<e.length;n++)if(t(e[n]))return e[n];return null}catch(t){return console.error(`[findIframeInOpener] Error finding iframe with pathname ${e}:`,t),null}}function h({config:r,iframe:o}){let c,l=r?.walletUrl??"https://wallet.frak.id",f=function({iframe:t}){let n=new e;return{handleEvent:async e=>{if(!("iframeLifecycle"in e))return;let{iframeLifecycle:r,data:a}=e;switch(r){case"connected":n.resolve(!0);break;case"do-backup":a.backup?localStorage.setItem(d,a.backup):localStorage.removeItem(d);break;case"remove-backup":localStorage.removeItem(d);break;case"show":case"hide":m({iframe:t,isVisible:"show"===r});break;case"handshake":t.contentWindow?.postMessage({clientLifecycle:"handshake-response",data:{token:a.token,currentUrl:window.location.href}},"*");break;case"redirect":{let e=new URL(a.baseRedirectUrl);e.searchParams.has("u")?(e.searchParams.delete("u"),e.searchParams.append("u",window.location.href),window.location.href=e.toString()):window.location.href=a.baseRedirectUrl}}},isConnected:n.promise}}({iframe:o}),p=new u(r,o);if(!o.contentWindow)throw new t(n.configError,"The iframe does not have a content window");let g=a({emittingTransport:o.contentWindow,listeningTransport:window,targetOrigin:l,middleware:[{async onRequest(e,r){if(!await f.isConnected)throw new t(n.clientNotConnected,"The iframe provider isn't connected yet");return r}},i(),{onRequest:(e,t)=>(p.setLastRequest(e),t),onResponse:(e,t)=>(p.setLastResponse(e,t),t)}],lifecycleHandlers:{iframeLifecycle:async(e,t)=>{await f.handleEvent(e)}}}),h=function(e,t){let n,r,a=()=>e.sendLifecycle({clientLifecycle:"heartbeat"});function o(){n&&clearInterval(n),r&&clearTimeout(r)}return async function(){a(),n=setInterval(a,1e3),r=setTimeout(()=>{o(),console.log("Heartbeat timeout: connection failed")},3e4),await t.isConnected,o()}(),o}(g,f),y=async()=>{h(),g.cleanup(),o.remove()};console.log("[Frak SDK] Initializing OpenPanel"),(c=new s({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"}),c.init();let b=w({config:r,rpcClient:g,lifecycleManager:f}).then(()=>p.updateSetupStatus(!0));return{config:r,debugInfo:p,waitForConnection:f.isConnected,waitForSetup:b,request:g.request,listenerRequest:g.listen,destroy:y,openPanel:c}}async function w({config:e,rpcClient:t,lifecycleManager:n}){async function r(){let n=e.customizations?.css;n&&t.sendLifecycle({clientLifecycle:"modal-css",data:{cssLink:n}})}async function a(){let n=e.customizations?.i18n;n&&t.sendLifecycle({clientLifecycle:"modal-i18n",data:{i18n:n}})}async function o(){if("undefined"==typeof window)return;let e=window.localStorage.getItem(d);e&&t.sendLifecycle({clientLifecycle:"restore-backup",data:{backup:e}})}await n.isConnected,function(e,t){if("undefined"==typeof window)return;let n=new URL(window.location.href),r=n.searchParams.get("sso");r&&(t.then(()=>{e.sendLifecycle({clientLifecycle:"sso-redirect-complete",data:{compressed:r}}),console.log("[SSO URL Listener] Forwarded compressed SSO data to iframe")}).catch(e=>{console.error("[SSO URL Listener] Failed to forward SSO data:",e)}),n.searchParams.delete("sso"),window.history.replaceState({},"",n.toString()),console.log("[SSO URL Listener] SSO parameter detected and URL cleaned"))}(t,n.isConnected),await Promise.allSettled([r(),a(),o()])}let y={eur:"fr-FR",usd:"en-US",gbp:"en-GB"};function b(e){return e&&e in y?e:"eur"}async function S({config:e}){let t=function(e){let t=b(e.metadata?.currency);return{...e,metadata:{...e.metadata,currency:t}}}(e),n=await p({config:t});if(!n)return void console.error("Failed to create iframe");let r=h({config:t,iframe:n});return(await r.waitForSetup,await r.waitForConnection)?r:void console.error("Failed to connect to client")}function k(e){return btoa(Array.from(e,e=>String.fromCharCode(e)).join("")).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function L(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 R(e){return k(r(e))}function v(e){return o(L(e))}let I="fCtx";function x(e){if(e?.r)try{let t=l(e.r);return k(t)}catch(t){console.error("Error compressing Frak context",{e:t,context:e})}}function U(e){if(e&&0!==e.length)try{let t=L(e);return{r:c(t,{size:20})}}catch(t){console.error("Error decompressing Frak context",{e:t,context:e})}}function F({url:e}){if(!e)return null;let t=new URL(e).searchParams.get(I);return t?U(t):null}function C({url:e,context:t}){if(!e)return null;let n=F({url:e}),r=n?{...n,...t}:t;if(!r.r)return null;let a=x(r);if(!a)return null;let o=new URL(e);return o.searchParams.set(I,a),o.toString()}function E(e){let t=new URL(e);return t.searchParams.delete(I),t.toString()}let P={compress:x,decompress:U,parse:F,update:C,remove:E,replaceUrl:function({url:e,context:t}){let n;if(!window.location?.href||"undefined"==typeof window)return void console.error("No window found, can't update context");let r=e??window.location.href;(n=null!==t?C({url:r,context:t}):E(r))&&window.history.replaceState(null,"",n.toString())}};function q(e){return e?y[e]??y.eur:y.eur}function D(e){return e?`${e}Amount`:"eurAmount"}function $(e,t){let n=q(t),r=b(t);return e.toLocaleString(n,{style:"currency",currency:r,minimumFractionDigits:0,maximumFractionDigits:2})}function O(e,t,n={}){if(!e)return void console.debug("[Frak] No client provided, skipping event tracking");try{e.openPanel?.track(t,n)}catch(e){console.debug("[Frak] Failed to track event:",t,e)}}function A(e,t,n,r,a){var o;let i=R({r:(o={redirectUrl:t.redirectUrl,directExit:t.directExit,lang:t.lang,productId:n,metadata:{name:r,css:a,logoUrl:t.metadata?.logoUrl,homepageLink:t.metadata?.homepageLink}}).redirectUrl,d:o.directExit,l:o.lang,p:o.productId,m:{n:o.metadata?.name,css:o.metadata?.css,l:o.metadata?.logoUrl,h:o.metadata?.homepageLink}}),s=new URL(e);return s.pathname="/sso",s.searchParams.set("p",i),s.toString()}let T={dapp:1,press:2,webshop:3,retail:4,referral:30,purchase:31},N=Object.entries(T).reduce((e,[t,n])=>(e[t]=BigInt(1)<<BigInt(n),e),{}),V={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"}},z="menubar=no,status=no,scrollbars=no,fullscreen=no,width=500, height=800",W="frak-sso";export{u as DebugInfoGatherer,P as FrakContextManager,L as base64urlDecode,k as base64urlEncode,f as baseIframeProps,R as compressJsonToB64,h as createIFrameFrakClient,p as createIframe,v as decompressJsonFromB64,g as findIframeInOpener,$ as formatAmount,A as generateSsoUrl,D as getCurrencyAmountKey,b as getSupportedCurrency,q as getSupportedLocale,V as interactionTypes,y as locales,T as productTypes,N as productTypesMask,S as setupClient,z as ssoPopupFeatures,W as ssoPopupName,O as trackEvent};
13
+ `.trim()}}let m={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 g({walletBaseUrl:e,config:t}){let n=document.querySelector("#frak-wallet");n&&n.remove();let r=document.createElement("iframe");return r.id=m.id,r.name=m.name,r.allow=m.allow,r.style.zIndex=m.style.zIndex.toString(),h({iframe:r,isVisible:!1}),document.body.appendChild(r),new Promise(n=>{r?.addEventListener("load",()=>n(r)),r.src=`${t?.walletUrl??e??"https://wallet.frak.id"}/listener`})}function h({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 w(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}};if(t(window.opener))return window.opener;try{let e=window.opener.frames;for(let n=0;n<e.length;n++)if(t(e[n]))return e[n];return null}catch(t){return console.error(`[findIframeInOpener] Error finding iframe with pathname ${e}:`,t),null}}function y({config:r,iframe:o}){let c,l=r?.walletUrl??"https://wallet.frak.id",d=function({iframe:t}){let n=new e;return{handleEvent:async e=>{if(!("iframeLifecycle"in e))return;let{iframeLifecycle:r,data:a}=e;switch(r){case"connected":n.resolve(!0);break;case"do-backup":a.backup?localStorage.setItem(f,a.backup):localStorage.removeItem(f);break;case"remove-backup":localStorage.removeItem(f);break;case"show":case"hide":h({iframe:t,isVisible:"show"===r});break;case"handshake":t.contentWindow?.postMessage({clientLifecycle:"handshake-response",data:{token:a.token,currentUrl:window.location.href}},"*");break;case"redirect":{let e=new URL(a.baseRedirectUrl);e.searchParams.has("u")?(e.searchParams.delete("u"),e.searchParams.append("u",window.location.href),window.location.href=e.toString()):window.location.href=a.baseRedirectUrl}}},isConnected:n.promise}}({iframe:o}),u=new p(r,o);if(!o.contentWindow)throw new t(n.configError,"The iframe does not have a content window");let m=a({emittingTransport:o.contentWindow,listeningTransport:window,targetOrigin:l,middleware:[{async onRequest(e,r){if(!await d.isConnected)throw new t(n.clientNotConnected,"The iframe provider isn't connected yet");return r}},i(),{onRequest:(e,t)=>(u.setLastRequest(e),t),onResponse:(e,t)=>(u.setLastResponse(e,t),t)}],lifecycleHandlers:{iframeLifecycle:async(e,t)=>{await d.handleEvent(e)}}}),g=function(e,t){let n,r,a=()=>e.sendLifecycle({clientLifecycle:"heartbeat"});function o(){n&&clearInterval(n),r&&clearTimeout(r)}return async function(){a(),n=setInterval(a,1e3),r=setTimeout(()=>{o(),console.log("Heartbeat timeout: connection failed")},3e4),await t.isConnected,o()}(),o}(m,d),w=async()=>{g(),m.cleanup(),o.remove()};console.log("[Frak SDK] Initializing OpenPanel"),(c=new s({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"}),c.init();let y=b({config:r,rpcClient:m,lifecycleManager:d}).then(()=>u.updateSetupStatus(!0));return{config:r,debugInfo:u,waitForConnection:d.isConnected,waitForSetup:y,request:m.request,listenerRequest:m.listen,destroy:w,openPanel:c}}async function b({config:e,rpcClient:t,lifecycleManager:n}){async function r(){let n=e.customizations?.css;n&&t.sendLifecycle({clientLifecycle:"modal-css",data:{cssLink:n}})}async function a(){let n=e.customizations?.i18n;n&&t.sendLifecycle({clientLifecycle:"modal-i18n",data:{i18n:n}})}async function o(){if("undefined"==typeof window)return;let e=window.localStorage.getItem(f);e&&t.sendLifecycle({clientLifecycle:"restore-backup",data:{backup:e}})}await n.isConnected,function(e,t){if("undefined"==typeof window)return;let n=new URL(window.location.href),r=n.searchParams.get("sso");r&&(t.then(()=>{e.sendLifecycle({clientLifecycle:"sso-redirect-complete",data:{compressed:r}}),console.log("[SSO URL Listener] Forwarded compressed SSO data to iframe")}).catch(e=>{console.error("[SSO URL Listener] Failed to forward SSO data:",e)}),n.searchParams.delete("sso"),window.history.replaceState({},"",n.toString()),console.log("[SSO URL Listener] SSO parameter detected and URL cleaned"))}(t,n.isConnected),await Promise.allSettled([r(),a(),o()])}let S={eur:"fr-FR",usd:"en-US",gbp:"en-GB"};function k(e){return e&&e in S?e:"eur"}async function L({config:e}){var t;let n,r=(t=e,n=k(t.metadata?.currency),{...t,metadata:{...t.metadata,currency:n}}),a=await g({config:r});if(!a)return void console.error("Failed to create iframe");let o=y({config:r,iframe:a});return(await o.waitForSetup,await o.waitForConnection)?o:void console.error("Failed to connect to client")}let R={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"}},v={dapp:1,press:2,webshop:3,retail:4,referral:30,purchase:31},I=Object.entries(v).reduce((e,[t,n])=>(e[t]=BigInt(1)<<BigInt(n),e),{});function x(e){return btoa(Array.from(e,e=>String.fromCharCode(e)).join("")).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function U(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 F(e){return x(r(e))}function C(e){return o(U(e))}let E="fCtx";function P(e){if(e?.r)try{let t=l(e.r);return x(t)}catch(t){console.error("Error compressing Frak context",{e:t,context:e})}}function q(e){if(e&&0!==e.length)try{let t=U(e);return{r:c(t,{size:20})}}catch(t){console.error("Error decompressing Frak context",{e:t,context:e})}}function D({url:e}){if(!e)return null;let t=new URL(e).searchParams.get(E);return t?q(t):null}function $({url:e,context:t}){if(!e)return null;let n=D({url:e}),r=n?{...n,...t}:t;if(!r.r)return null;let a=P(r);if(!a)return null;let o=new URL(e);return o.searchParams.set(E,a),o.toString()}function O(e){let t=new URL(e);return t.searchParams.delete(E),t.toString()}let A={compress:P,decompress:q,parse:D,update:$,remove:O,replaceUrl:function({url:e,context:t}){let n;if(!window.location?.href||"undefined"==typeof window)return void console.error("No window found, can't update context");let r=e??window.location.href;(n=null!==t?$({url:r,context:t}):O(r))&&window.history.replaceState(null,"",n.toString())}};function T(e){return e?S[e]??S.eur:S.eur}function N(e,t){let n=T(t),r=k(t);return e.toLocaleString(n,{style:"currency",currency:r,minimumFractionDigits:0,maximumFractionDigits:2})}function V(e,t,n,r,a){var o;let i=F({r:(o={redirectUrl:t.redirectUrl,directExit:t.directExit,lang:t.lang,productId:n,metadata:{name:r,css:a,logoUrl:t.metadata?.logoUrl,homepageLink:t.metadata?.homepageLink}}).redirectUrl,d:o.directExit,l:o.lang,p:o.productId,m:{n:o.metadata?.name,css:o.metadata?.css,l:o.metadata?.logoUrl,h:o.metadata?.homepageLink}}),s=new URL(e);return s.pathname="/sso",s.searchParams.set("p",i),s.toString()}function z(e){return e?`${e}Amount`:"eurAmount"}function W(e,t,n={}){if(!e)return void console.debug("[Frak] No client provided, skipping event tracking");try{e.openPanel?.track(t,n)}catch(e){console.debug("[Frak] Failed to track event:",t,e)}}export{p as DebugInfoGatherer,A as FrakContextManager,U as base64urlDecode,x as base64urlEncode,m as baseIframeProps,F as compressJsonToB64,y as createIFrameFrakClient,g as createIframe,C as decompressJsonFromB64,w as findIframeInOpener,N as formatAmount,V as generateSsoUrl,z as getCurrencyAmountKey,k as getSupportedCurrency,T as getSupportedLocale,R as interactionTypes,S as locales,v as productTypes,I as productTypesMask,L as setupClient,d as ssoPopupFeatures,u as ssoPopupName,W as trackEvent};
@@ -1 +1 @@
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,r)=>{for(var t in r)__webpack_require__.o(r,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},__webpack_require__.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),__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__,{PressInteractionEncoder:()=>PressInteractionEncoder,ReferralInteractionEncoder:()=>ReferralInteractionEncoder,RetailInteractionEncoder:()=>RetailInteractionEncoder,PurchaseInteractionEncoder:()=>PurchaseInteractionEncoder,WebShopInteractionEncoder:()=>WebShopInteractionEncoder});let external_viem_namespaceObject=require("viem"),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"}},productTypes={dapp:1,press:2,webshop:3,retail:4,referral:30,purchase:31},productTypesMask=Object.entries(productTypes).reduce((e,[r,t])=>(e[r]=BigInt(1)<<BigInt(t),e),{}),PressInteractionEncoder={openArticle({articleId:e}){let r=(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:r}},readArticle({articleId:e}){let r=(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:r}}},ReferralInteractionEncoder={createLink:()=>({handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.referral),interactionData:interactionTypes.referral.createLink}),referred({referrer:e}){let r=(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:r}}},PurchaseInteractionEncoder={startPurchase({purchaseId:e}){let r=(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:r}},completedPurchase({purchaseId:e,proof:r}){let t=(0,external_viem_namespaceObject.encodeAbiParameters)([{type:"uint256"},{type:"bytes32[]"}],[BigInt(e),r]),a=(0,external_viem_namespaceObject.concatHex)([interactionTypes.purchase.completed,t]);return{handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.purchase),interactionData:a}},unsafeCompletedPurchase({purchaseId:e}){let r=(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:r}}},WebShopInteractionEncoder={open:()=>({handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.webshop),interactionData:interactionTypes.webshop.open})},RetailInteractionEncoder={customerMeeting({agencyId:e}){let r=(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:r}}};for(var __webpack_i__ in 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,__webpack_exports__)-1===["PressInteractionEncoder","PurchaseInteractionEncoder","ReferralInteractionEncoder","RetailInteractionEncoder","WebShopInteractionEncoder"].indexOf(__webpack_i__)&&(exports[__webpack_i__]=__webpack_exports__[__webpack_i__]);Object.defineProperty(exports,"__esModule",{value:!0});
1
+ "use strict";const __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,r)=>{for(var t in r)__webpack_require__.o(r,t)&&!__webpack_require__.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},__webpack_require__.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),__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__,{PressInteractionEncoder:()=>PressInteractionEncoder,ReferralInteractionEncoder:()=>ReferralInteractionEncoder,RetailInteractionEncoder:()=>RetailInteractionEncoder,PurchaseInteractionEncoder:()=>PurchaseInteractionEncoder,WebShopInteractionEncoder:()=>WebShopInteractionEncoder});const external_viem_namespaceObject=require("viem"),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"}},productTypes={dapp:1,press:2,webshop:3,retail:4,referral:30,purchase:31},productTypesMask=Object.entries(productTypes).reduce((e,[r,t])=>(e[r]=BigInt(1)<<BigInt(t),e),{}),PressInteractionEncoder={openArticle({articleId:e}){let r=(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:r}},readArticle({articleId:e}){let r=(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:r}}},PurchaseInteractionEncoder={startPurchase({purchaseId:e}){let r=(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:r}},completedPurchase({purchaseId:e,proof:r}){let t=(0,external_viem_namespaceObject.encodeAbiParameters)([{type:"uint256"},{type:"bytes32[]"}],[BigInt(e),r]),a=(0,external_viem_namespaceObject.concatHex)([interactionTypes.purchase.completed,t]);return{handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.purchase),interactionData:a}},unsafeCompletedPurchase({purchaseId:e}){let r=(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:r}}},ReferralInteractionEncoder={createLink:()=>({handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.referral),interactionData:interactionTypes.referral.createLink}),referred({referrer:e}){let r=(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:r}}},RetailInteractionEncoder={customerMeeting({agencyId:e}){let r=(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:r}}},WebShopInteractionEncoder={open:()=>({handlerTypeDenominator:(0,external_viem_namespaceObject.toHex)(productTypes.webshop),interactionData:interactionTypes.webshop.open})};for(var __webpack_i__ in 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,__webpack_exports__)-1===["PressInteractionEncoder","PurchaseInteractionEncoder","ReferralInteractionEncoder","RetailInteractionEncoder","WebShopInteractionEncoder"].indexOf(__webpack_i__)&&(exports[__webpack_i__]=__webpack_exports__[__webpack_i__]);Object.defineProperty(exports,"__esModule",{value:!0});
@@ -1 +1 @@
1
- import{concatHex as e,encodeAbiParameters as r,pad as t,toHex as n}from"viem";let a="0xc0a24ffb",o="0xd5bd0fbe",i="0xb311798f",c="0x010cc3b9",l="0xb2c0f17c",p="0xd87e90c3",s="0x8403aeb4",d="0x4d5b14e0",h="0x74489004",u={dapp:1,press:2,webshop:3,retail:4,referral:30,purchase:31};Object.entries(u).reduce((e,[r,t])=>(e[r]=BigInt(1)<<BigInt(t),e),{});let m={openArticle({articleId:r}){let o=e([a,t(r,{size:32})]);return{handlerTypeDenominator:n(u.press),interactionData:o}},readArticle({articleId:r}){let a=e([o,t(r,{size:32})]);return{handlerTypeDenominator:n(u.press),interactionData:a}}},b={createLink:()=>({handlerTypeDenominator:n(u.referral),interactionData:l}),referred({referrer:r}){let a=e([c,t(r,{size:32})]);return{handlerTypeDenominator:n(u.referral),interactionData:a}}},f={startPurchase({purchaseId:r}){let a=e([p,t(r,{size:32})]);return{handlerTypeDenominator:n(u.purchase),interactionData:a}},completedPurchase({purchaseId:t,proof:a}){let o=r([{type:"uint256"},{type:"bytes32[]"}],[BigInt(t),a]),i=e([s,o]);return{handlerTypeDenominator:n(u.purchase),interactionData:i}},unsafeCompletedPurchase({purchaseId:r}){let a=e([d,t(r,{size:32})]);return{handlerTypeDenominator:n(u.purchase),interactionData:a}}},y={open:()=>({handlerTypeDenominator:n(u.webshop),interactionData:i})},D={customerMeeting({agencyId:r}){let a=e([h,t(r,{size:32})]);return{handlerTypeDenominator:n(u.retail),interactionData:a}}};export{m as PressInteractionEncoder,f as PurchaseInteractionEncoder,b as ReferralInteractionEncoder,D as RetailInteractionEncoder,y as WebShopInteractionEncoder};
1
+ import{concatHex as e,encodeAbiParameters as r,pad as t,toHex as n}from"viem";let a="0xc0a24ffb",o="0xd5bd0fbe",i="0xb311798f",c="0x010cc3b9",l="0xb2c0f17c",p="0xd87e90c3",s="0x8403aeb4",d="0x4d5b14e0",h="0x74489004",u={dapp:1,press:2,webshop:3,retail:4,referral:30,purchase:31};Object.entries(u).reduce((e,[r,t])=>(e[r]=BigInt(1)<<BigInt(t),e),{});let m={openArticle({articleId:r}){let o=e([a,t(r,{size:32})]);return{handlerTypeDenominator:n(u.press),interactionData:o}},readArticle({articleId:r}){let a=e([o,t(r,{size:32})]);return{handlerTypeDenominator:n(u.press),interactionData:a}}},b={startPurchase({purchaseId:r}){let a=e([p,t(r,{size:32})]);return{handlerTypeDenominator:n(u.purchase),interactionData:a}},completedPurchase({purchaseId:t,proof:a}){let o=r([{type:"uint256"},{type:"bytes32[]"}],[BigInt(t),a]),i=e([s,o]);return{handlerTypeDenominator:n(u.purchase),interactionData:i}},unsafeCompletedPurchase({purchaseId:r}){let a=e([d,t(r,{size:32})]);return{handlerTypeDenominator:n(u.purchase),interactionData:a}}},f={createLink:()=>({handlerTypeDenominator:n(u.referral),interactionData:l}),referred({referrer:r}){let a=e([c,t(r,{size:32})]);return{handlerTypeDenominator:n(u.referral),interactionData:a}}},y={customerMeeting({agencyId:r}){let a=e([h,t(r,{size:32})]);return{handlerTypeDenominator:n(u.retail),interactionData:a}}},D={open:()=>({handlerTypeDenominator:n(u.webshop),interactionData:i})};export{m as PressInteractionEncoder,b as PurchaseInteractionEncoder,f as ReferralInteractionEncoder,y as RetailInteractionEncoder,D as WebShopInteractionEncoder};