@frak-labs/core-sdk 1.1.3 → 1.1.5-beta.727c2f3f

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/cdn/bundle.js +1 -1
  2. package/dist/actions-DrZ_PIs1.cjs +2 -0
  3. package/dist/actions-DrZ_PIs1.cjs.map +1 -0
  4. package/dist/actions-HG5M8wX7.js +2 -0
  5. package/dist/actions-HG5M8wX7.js.map +1 -0
  6. package/dist/actions.cjs +1 -1
  7. package/dist/actions.d.cts +3 -3
  8. package/dist/actions.d.ts +3 -3
  9. package/dist/actions.js +1 -1
  10. package/dist/bundle.cjs +1 -1
  11. package/dist/bundle.d.cts +4 -4
  12. package/dist/bundle.d.ts +4 -4
  13. package/dist/bundle.js +1 -1
  14. package/dist/frakContext-Bgidv-Se.js +2 -0
  15. package/dist/frakContext-Bgidv-Se.js.map +1 -0
  16. package/dist/frakContext-CeVlWFcX.cjs +2 -0
  17. package/dist/frakContext-CeVlWFcX.cjs.map +1 -0
  18. package/dist/{index-lcImYQyL.d.ts → index-BJMazhpm.d.ts} +3 -2
  19. package/dist/{index-C5pP_9We.d.cts → index-BysidNLB.d.ts} +42 -6
  20. package/dist/{index-DR4n-QOe.d.cts → index-C1A3I4x1.d.cts} +3 -2
  21. package/dist/{index-DrYZwIjb.d.ts → index-k1lfbVkl.d.cts} +42 -6
  22. package/dist/index.cjs +1 -1
  23. package/dist/index.d.cts +3 -3
  24. package/dist/index.d.ts +3 -3
  25. package/dist/index.js +1 -1
  26. package/dist/{openSso-DRLH4D9a.d.ts → openSso-B0igO6Iu.d.cts} +9 -3
  27. package/dist/{openSso-BErs7_Bg.d.cts → openSso-BWeD0Fb2.d.ts} +9 -3
  28. package/dist/src-CCJgTN1H.cjs +2 -0
  29. package/dist/src-CCJgTN1H.cjs.map +1 -0
  30. package/dist/src-DKLOAY9w.js +2 -0
  31. package/dist/src-DKLOAY9w.js.map +1 -0
  32. package/package.json +4 -3
  33. package/src/actions/referral/processReferral.test.ts +4 -4
  34. package/src/actions/referral/processReferral.ts +4 -4
  35. package/src/clients/createIFrameFrakClient.ts +7 -7
  36. package/src/clients/transports/iframeLifecycleManager.ts +5 -21
  37. package/src/config/sdkConfigStore.ts +6 -3
  38. package/src/context/frakContext.test.ts +55 -0
  39. package/src/context/frakContext.ts +13 -2
  40. package/src/index.ts +2 -0
  41. package/src/types/rpc/merchantInformation.ts +13 -6
  42. package/src/utils/analytics/events/lifecycle.ts +1 -1
  43. package/src/utils/analytics/events/referral.ts +3 -3
  44. package/src/utils/browser/deepLinkWithFallback.ts +4 -1
  45. package/src/utils/browser/inAppBrowser.ts +2 -2
  46. package/src/utils/cache/withCache.ts +30 -11
  47. package/src/utils/iframe/iframeHelper.test.ts +39 -0
  48. package/src/utils/iframe/iframeHelper.ts +31 -2
  49. package/src/utils/index.ts +5 -0
  50. package/src/utils/url/queryParams.test.ts +85 -0
  51. package/src/utils/url/queryParams.ts +57 -0
  52. package/dist/actions-D5rNeJC0.js +0 -1
  53. package/dist/actions-gmdNZvNh.cjs +0 -1
  54. package/dist/frakContext-Cfp7sSid.cjs +0 -1
  55. package/dist/frakContext-UEOk9Bk4.js +0 -1
  56. package/dist/src-BEMVYU3J.js +0 -1
  57. package/dist/src-C9inMs4I.cjs +0 -1
package/cdn/bundle.js CHANGED
@@ -1 +1 @@
1
- var FrakSDK=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=Object.defineProperty,n=(e,t)=>()=>(e&&(t=e(e=0)),t),r=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r};async function i(e,t,n){return await e.request({method:`frak_displayEmbeddedWallet`,params:n?[t,e.config.metadata,n]:[t,e.config.metadata]})}async function a(e,{steps:t,metadata:n},r){return await e.request({method:`frak_displayModal`,params:r?[t,n,e.config.metadata,r]:[t,n,e.config.metadata]})}async function o(e,t,n){return await e.request({method:`frak_displaySharingPage`,params:n?[t,e.config.metadata,n]:[t,e.config.metadata]})}let s=`https://backend.frak.id`;function c(e){return e.includes(`localhost:3000`)||e.includes(`localhost:3010`)}function l(e){return c(e)?`https://localhost:3030`:e.includes(`wallet-dev.frak.id`)||e.includes(`wallet.gcp-dev.frak.id`)?`https://backend.gcp-dev.frak.id`:s}function u(e){if(e)return l(e);if(typeof window<`u`){let e=window.FrakSetup?.client?.config?.walletUrl;if(e)return l(e)}return s}let d=`frak-client-id`;function f(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function p(){if(typeof window>`u`||!window.localStorage)return f();let e=localStorage.getItem(d);return e||(e=f(),localStorage.setItem(d,e)),e}var m=class extends Map{maxSize;constructor(e){super(),this.maxSize=e}get(e){let t=super.get(e);return super.has(e)&&(super.delete(e),super.set(e,t)),t}set(e,t){if(super.has(e)&&super.delete(e),super.set(e,t),this.maxSize&&this.size>this.maxSize){let e=super.keys().next().value;e!==void 0&&super.delete(e)}return this}};let h=new m(1024),g=new m(1024),_=new m(1024);async function v(e,{cacheKey:t,cacheTime:n=3e4}){if(n>0){let e=g.get(t);if(e&&Date.now()-e.created<n)return e.data}let r=_.get(t);if(r&&Date.now()-r<1e3)throw Error(`Cache: ${t} recently failed, backing off`);let i=h.get(t);i||(i=e(),h.set(t,i));try{let e=await i;return g.set(t,{data:e,created:Date.now()}),_.delete(t),e}catch(e){throw _.set(t,Date.now()),e}finally{h.delete(t)}}function y(){h.clear(),g.clear(),_.clear()}let b=`__frakSdkConfig`,ee=`frak-config-cache`,x=`frak-merchant-id`,S={key:ee},C=typeof window<`u`;function w(){return{isResolved:!1,merchantId:``}}let T=null;function te(){if(!C)return null;try{let e=localStorage.getItem(S.key);if(!e)return null;let t=JSON.parse(e);return t.config?.isResolved?(T=t,t):null}catch{return null}}function ne(){return(T??te())?.config}function re(){let e=T??te();return e?Date.now()-e.timestamp<3e4:!1}function ie(e){if(!(!C||!e.isResolved))try{let t={config:e,timestamp:Date.now()};localStorage.setItem(S.key,JSON.stringify(t)),T=t}catch{}}function ae(){if(C){T=null;try{localStorage.removeItem(S.key)}catch{}}}function oe(){C&&(window[b]||(window[b]=ne()??w()))}oe();function E(){return C?window[b]??w():w()}function se(e){C&&window.dispatchEvent(new CustomEvent(`frak:config`,{detail:e}))}function ce(e){return e??(C?window.location.hostname:``)}async function le(e,t,n){try{let r=u(t),i=n?`&lang=${encodeURIComponent(n)}`:``,a=await fetch(`${r}/user/merchant/resolve?domain=${encodeURIComponent(e)}${i}`);if(!a.ok)return;let o=await a.json();if(C)try{sessionStorage.setItem(x,o.merchantId)}catch{}return o}catch{return}}let D={getConfig:E,get isResolved(){return E().isResolved},get isCacheFresh(){return re()},setCacheScope(e,t){S.key=`${ee}:${`${e}:${t??``}`}`,T=null},setConfig(e){if(C&&(window[b]=e),ie(e),se(e),C&&e.merchantId)try{sessionStorage.setItem(x,e.merchantId)}catch{}},reset(){let e=ne()??w();C&&(window[b]=e),se(e)},clearCache(){if(ae(),y(),C)try{sessionStorage.removeItem(x)}catch{}},resolve(e,t,n){let r=ce(e);return r?v(async()=>{let e=await le(r,t,n);if(!e)throw Error(`Config resolution returned empty`);return e},{cacheKey:`sdkConfig:${r}:${n??``}`,cacheTime:1/0}).catch(()=>void 0):Promise.resolve(void 0)},getMerchantId(){let e=E();if(e.isResolved&&e.merchantId)return e.merchantId;if(C)try{return sessionStorage.getItem(x)??void 0}catch{}},async resolveMerchantId(e,t){return D.getMerchantId()||(await D.resolve(e,t))?.merchantId}};async function ue(e){if(typeof window>`u`)return;let t=p();if(!t)return;let n=await D.resolveMerchantId();if(!n)return;let r=`frak-identity-ensured-${n}`;if(!window.sessionStorage.getItem(r))try{let i=u();(await fetch(`${i}/user/identity/ensure`,{method:`POST`,headers:{Accept:`application/json`,"Content-Type":`application/json`,"x-wallet-sdk-auth":e,"x-frak-client-id":t},body:JSON.stringify({merchantId:n})})).ok&&window.sessionStorage.setItem(r,`1`)}catch{}}async function de(e,t){return v(()=>e.request({method:`frak_getMerchantInformation`}),{cacheKey:`frak_getMerchantInformation`,cacheTime:t?.cacheTime})}async function fe(e,t){return v(()=>e.request({method:`frak_getMergeToken`}),{cacheKey:`frak_getMergeToken`,cacheTime:t?.cacheTime})}async function pe(e,t){return v(()=>e.request({method:`frak_getUserReferralStatus`}),{cacheKey:`frak_getUserReferralStatus`,cacheTime:t?.cacheTime})}let me={parseError:-32700,invalidRequest:-32600,methodNotFound:-32601,invalidParams:-32602,internalError:-32603,serverError:-32e3,clientNotConnected:-32001,configError:-32002,corruptedResponse:-32003,clientAborted:-32004,walletNotConnected:-32005,serverErrorForInteractionDelegation:-32006,userRejected:-32007};var O=class extends Error{code;data;constructor(e,t,n){super(t),this.code=e,this.data=n}toJSON(){return{code:this.code,message:this.message,data:this.data}}},k=class{_promise;_resolve;_reject;constructor(){this._promise=new Promise((e,t)=>{this._resolve=e,this._reject=t})}get promise(){return this._promise}resolve=e=>{this._resolve?.(e)};reject=e=>{this._reject?.(e)}};function he(e){let{emittingTransport:t,listeningTransport:n,targetOrigin:r,middleware:i=[],lifecycleHandlers:a}=e,o=new Map;function s(e){return typeof e!=`object`||!e?!1:`clientLifecycle`in e||`iframeLifecycle`in e}function c(e){return typeof e!=`object`||!e?!1:`id`in e&&`topic`in e&&`data`in e}async function l(e){try{`clientLifecycle`in e&&a?.clientLifecycle?await a.clientLifecycle(e,{origin:r,source:null}):`iframeLifecycle`in e&&a?.iframeLifecycle&&await a.iframeLifecycle(e,{origin:r,source:null})}catch{}}async function u(e){let t={origin:r,source:null};for(let n of i)n.onRequest&&await n.onRequest(e,t);return e}async function d(e,t){let n={origin:r,source:null},a=t;for(let t of i)t.onResponse&&(a=await t.onResponse(e,a,n));return a}async function f(e){try{if(new URL(e.origin).origin.toLowerCase()!==new URL(r).origin.toLowerCase())return}catch{return}if(s(e.data)){await l(e.data);return}if(!c(e.data))return;let t;try{let n=e.data.data,r=n instanceof Uint8Array||ArrayBuffer.isView(n)?{result:n}:n;t=await d(e.data,r)}catch{return}let n=o.get(e.data.id);n&&n(t)}async function p(e){let n=e;try{n=await u(e)}catch(e){throw e}t.postMessage(n,r)}function m(e){t.postMessage(e,r)}function h(){return`${Date.now()}-${Math.random().toString(36).substring(2,9)}`}n.addEventListener(`message`,f);function g(e){let t=h(),n=new k;return o.set(t,e=>{e.error?n.reject(new O(e.error.code,e.error.message,e.error.data)):n.resolve(e.result),o.delete(t)}),p({id:t,topic:e.method,data:{method:e.method,params:e.params}}).catch(e=>{o.delete(t),n.reject(e)}),n.promise}function _(e,t){let n=h();return o.set(n,e=>{e.error?o.delete(n):t(e.result)}),p({id:n,topic:e.method,data:{method:e.method,params:e.params}}).catch(e=>{o.delete(n)}),()=>{o.delete(n)}}function v(){n.removeEventListener(`message`,f),o.clear()}return{request:g,listen:_,sendLifecycle:m,cleanup:v}}function ge(e){return new TextEncoder().encode(JSON.stringify(e))}function _e(e){try{return JSON.parse(new TextDecoder().decode(e))}catch{return null}}function A(e){return btoa(Array.from(e,e=>String.fromCharCode(e)).join(``)).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}function j(e){let t=e.length%4;return Uint8Array.from(atob(e.replace(/-/g,`+`).replace(/_/g,`/`).padEnd(e.length+(t===0?0:4-t),`=`)),e=>e.charCodeAt(0))}function M(e){return A(ge(e))}function N(e,t,n,r,i,a){let o=M(ve({redirectUrl:t.redirectUrl,directExit:t.directExit,lang:t.lang,merchantId:n,metadata:{name:r,css:a,logoUrl:t.metadata?.logoUrl,homepageLink:t.metadata?.homepageLink},clientId:i})),s=new URL(e);return s.pathname=`/sso`,s.searchParams.set(`p`,o),s.toString()}function ve(e){return{r:e.redirectUrl,cId:e.clientId,d:e.directExit,l:e.lang,m:e.merchantId,md:{n:e.metadata?.name,css:e.metadata?.css,l:e.metadata?.logoUrl,h:e.metadata?.homepageLink}}}let P=`menubar=no,status=no,scrollbars=no,fullscreen=no,width=500, height=800`,F=`frak-sso`;async function ye(e,t){let{metadata:n,customizations:r,walletUrl:i}=e.config,a={...t,directExit:t.directExit??!t.redirectUrl};if(a.openInSameWindow??!!a.redirectUrl)return await e.request({method:`frak_openSso`,params:[a,n.name,r?.css]});let o=a.ssoPopupUrl??N(i??`https://wallet.frak.id`,a,await D.resolveMerchantId()??``,n.name,p(),r?.css),s=window.open(o,F,P);if(!s)throw Error(`Popup was blocked. Please allow popups for this site.`);return s.focus(),await e.request({method:`frak_openSso`,params:[a,n.name,r?.css]})??{}}async function be(e,t){let{metadata:n,customizations:r}=e.config;return await e.request({method:`frak_prepareSso`,params:[t,n.name,r?.css]})}let xe=/^0x[a-fA-F0-9]{40}$/;function I(e){return typeof e==`string`&&xe.test(e)}function L(e,t){return e.toLowerCase()===t.toLowerCase()}function Se(e){let t=new Uint8Array(20);for(let n=0;n<20;n++){let r=Number.parseInt(e.substring(2+n*2,4+n*2),16);if(Number.isNaN(r))throw Error(`Invalid address: ${e}`);t[n]=r}return t}let Ce=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,`0`));function we(e){let t=`0x`;for(let n=0;n<20;n++)t+=Ce[e[n]];return t}function Te(e){return`r`in e&&!(`v`in e)}function R(e){return`v`in e&&e.v===2}let Ee=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function De(e){return typeof e==`string`&&Ee.test(e)}function Oe(e){let t=e.replace(/-/g,``),n=new Uint8Array(16);for(let e=0;e<16;e++)n[e]=Number.parseInt(t.substring(e*2,e*2+2),16);return n}function ke(e){let t=``;for(let n=0;n<16;n++)t+=e[n].toString(16).padStart(2,`0`);return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20,32)}`}function Ae(e){if(!De(e.m)||!Number.isInteger(e.t)||e.t<0||e.t>4294967295)return null;let t=typeof e.c==`string`&&e.c.length>0,n=typeof e.w==`string`&&I(e.w);if(!t&&!n||t&&!De(e.c))return null;let r=new Uint8Array(21+(t?16:0)+(n?20:0)),i=new DataView(r.buffer,r.byteOffset,r.byteLength),a=0;return r[a++]=2|(t?16:0)|(n?32:0),r.set(Oe(e.m),a),a+=16,i.setUint32(a,e.t,!1),a+=4,t&&(r.set(Oe(e.c),a),a+=16),n&&(r.set(Se(e.w),a),a+=20),r}function je(e){if(e.length<21)return null;let t=e[0];if((t&15)!=2||t&192)return null;let n=(t&16)!=0,r=(t&32)!=0;if(!n&&!r)return null;let i=21+(n?16:0)+(r?20:0);if(e.length!==i)return null;let a=1,o=ke(e.subarray(a,a+16));a+=16;let s=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint32(a,!1);a+=4;let c={v:2,m:o,t:s};if(n&&(c.c=ke(e.subarray(a,a+16)),a+=16),r){let t=we(e.subarray(a,a+20));if(!I(t))return null;c.w=t,a+=20}return c}let z=`fCtx`;function B(e){if(e)try{if(R(e)){let t=Ae(e);return t?A(t):void 0}return A(Se(e.r))}catch{}}function Me(e){if(!(!e||e.length===0))try{let t=j(e);if(t.length!==20)return je(t)||void 0;let n=we(t);if(I(n))return{r:n}}catch{}}function Ne({url:e}){if(!e)return null;let t=new URL(e).searchParams.get(z);return t?Me(t):null}function Pe(e){return{utm_source:e.utmSource??`frak`,utm_medium:e.utmMedium??void 0,utm_campaign:e.utmCampaign??void 0,utm_content:e.utmContent,utm_term:e.utmTerm,via:e.via??void 0,ref:e.ref??void 0}}function Fe(e,t){let n=Pe(t??{});for(let[t,r]of Object.entries(n))r===void 0||r===``||e.searchParams.has(t)||e.searchParams.set(t,r)}function Ie({url:e,context:t,attribution:n}){if(!e)return null;let r=B(t);if(!r)return null;let i=new URL(e);return i.searchParams.set(z,r),Fe(i,n),i.toString()}function Le(e){let t=new URL(e);return t.searchParams.delete(z),t.toString()}function Re({url:e,context:t}){if(!window.location?.href||typeof window>`u`)return;let n=e??window.location.href,r;r=t===null?Le(n):Ie({url:n,context:t}),r&&window.history.replaceState(null,``,r.toString())}let V={compress:B,decompress:Me,parse:Ne,update:Ie,remove:Le,replaceUrl:Re};function ze({perCall:e,defaults:t,productUtmContent:n}){if(e===null)return;let r=e!==void 0,i=t!==void 0&&Object.keys(t).length>0;if(!r&&!i&&!(n!==void 0&&n!==``))return;let a={...t,...e??{}},o=n??e?.utmContent;return o!==void 0&&o!==``?a.utmContent=o:delete a.utmContent,a}function H(e,t,n){if(e)try{e.openPanel?.track(t,n)}catch{}}let U=`nexus-wallet-backup`,W=`frakwallet://`;function Be(){let e=navigator.userAgent;return/Android/i.test(e)&&/Chrome\/\d+/i.test(e)}let Ve=W.replace(`://`,``);function He(e){return`intent://${e.slice(13)}#Intent;scheme=${Ve};end`}function Ue(e,t){let n=t?.timeout??2500,r=!1,i=()=>{document.hidden&&(r=!0)};document.addEventListener(`visibilitychange`,i);let a=Be()&&We(e)?He(e):e;window.location.href=a,setTimeout(()=>{document.removeEventListener(`visibilitychange`,i),r||t?.onFallback?.()},n)}function We(e){return e.startsWith(W)}function Ge(){if(typeof navigator>`u`)return!1;let e=navigator.userAgent;return!!(/iPhone|iPad|iPod/i.test(e)||/Macintosh/i.test(e)&&navigator.maxTouchPoints>1)}let G=Ge();function Ke(){return typeof navigator>`u`?!1:G?!0:/Android|webOS|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function qe(){if(typeof navigator>`u`)return!1;let e=navigator.userAgent.toLowerCase();return e.includes(`instagram`)||e.includes(`fban`)||e.includes(`fbav`)||e.includes(`facebook`)}let Je=qe();function Ye(e){G&&e.startsWith(`https://`)?window.location.href=`x-safari-https://${e.slice(8)}`:G&&e.startsWith(`http://`)?window.location.href=`x-safari-http://${e.slice(7)}`:window.location.href=`https://backend.frak.id/common/social?u=${encodeURIComponent(e)}`}function Xe(e){return _e(j(e))}let K={eur:`fr-FR`,usd:`en-US`,gbp:`en-GB`};function q(e){return e&&e in K?e:`eur`}function Ze(e){return e?K[e]??K.eur:K.eur}function Qe(e,t){let n=Ze(t),r=q(t);return e.toLocaleString(n,{style:`currency`,currency:r,minimumFractionDigits:0,maximumFractionDigits:2})}function $e(e){return e?`${e}Amount`:`eurAmount`}let J={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`);r.id=J.id,r.name=J.name,r.allow=J.allow,r.style.zIndex=J.style.zIndex.toString(),tt({iframe:r,isVisible:!1});let i=t?.walletUrl??e??`https://wallet.frak.id`,a=p();return rt(i),rt(u(i)),r.src=`${i}/listener?clientId=${encodeURIComponent(a)}`,new Promise(e=>{r.addEventListener(`load`,()=>e(r)),document.body.appendChild(r)})}function tt({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 nt(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{return null}}function rt(e){if(!(typeof document>`u`))try{let t=new URL(e).origin,n=`link[rel="preconnect"][data-frak-preconnect="${t}"]`;if(document.head.querySelector(n))return;let r=document.createElement(`link`);r.rel=`preconnect`,r.href=t,r.crossOrigin=``,r.dataset.frakPreconnect=t,document.head.appendChild(r)}catch{}}async function Y(e,t){try{await e.request({method:`frak_sendInteraction`,params:[t,{clientId:p()}]})}catch{}}function it(e,t,n){return R(t)?(H(e,`user_referred_started`,{referrerClientId:t.c,referrerWallet:t.w,walletStatus:n?.key}),Y(e,{type:`arrival`,referrerClientId:t.c,referrerMerchantId:t.m,referrerWallet:t.w,referralTimestamp:t.t}),!0):Te(t)?(H(e,`user_referred_started`,{referrer:t.r,walletStatus:n?.key}),Y(e,{type:`arrival`,referrerWallet:t.r}),!0):!1}function at(e,t){let n=p();return!n&&!t?null:{v:2,m:e,t:Math.floor(Date.now()/1e3),...n?{c:n}:{},...t?{w:t}:{}}}function ot(e,t){return R(e)?e.w&&t?.wallet?L(e.w,t.wallet):e.c?p()===e.c:!1:Te(e)&&t?.wallet?L(e.r,t.wallet):!1}function st(e,{walletStatus:t,frakContext:n,options:r}){if(!n)return`no-referrer`;if(ot(n,t))return`self-referral`;if(!it(e,n,t))return`no-referrer`;let i=R(n)?n.m:r?.merchantId,a=r?.alwaysAppendUrl&&i?at(i,t?.wallet):null;return V.replaceUrl({url:window.location?.href,context:a}),H(e,`user_referred_completed`,{status:`success`}),`success`}async function ct(e,{options:t}={}){let n=V.parse({url:window.location.href}),r=await ft(e);try{return st(e,{walletStatus:r,frakContext:n,options:t})}catch{}}let lt=`frak:referral-success`;async function ut(e){try{await ct(e)===`success`&&window.dispatchEvent(new Event(lt))}catch{}}async function dt(e){if(typeof window>`u`)return;let t=window.sessionStorage.getItem(`frak-wallet-interaction-token`),n=p();if(!t&&!n)return;let r=e.merchantId??await D.resolveMerchantId();if(!r)return;let i={Accept:`application/json`,"Content-Type":`application/json`};t&&(i[`x-wallet-sdk-auth`]=t),n&&(i[`x-frak-client-id`]=n);let a=u();await fetch(`${a}/user/track/purchase`,{method:`POST`,headers:i,body:JSON.stringify({customerId:e.customerId,orderId:e.orderId,token:e.token,merchantId:r})})}function ft(e,t){if(!t)return e.request({method:`frak_listenToWalletStatus`}).then(t=>(pt(e,t),t));let n=new k,r=!1;return e.listenerRequest({method:`frak_listenToWalletStatus`},i=>{pt(e,i),t(i),r||=(n.resolve(i),!0)}),n.promise}function pt(e,t){typeof window>`u`||(e.openPanel?.setGlobalProperties({wallet:t.wallet??null}),t.interactionToken?(window.sessionStorage.setItem(`frak-wallet-interaction-token`,t.interactionToken),ue(t.interactionToken)):window.sessionStorage.removeItem(`frak-wallet-interaction-token`))}function mt(e,{metadata:t,login:n}){return X(e,{steps:{login:n??{}},metadata:t})}function X(e,t){function n(n){return X(e,{...t,steps:{...t.steps,sendTransaction:n}})}function r(n){return X(e,{...t,steps:{...t.steps,final:{...n,action:{key:`reward`}}}})}function i(n,r){return X(e,{...t,steps:{...t.steps,final:{...r,action:{key:`sharing`,options:n}}}})}async function o(n,r){return n&&(t.metadata=n(t.metadata??{})),await a(e,t,r)}return{params:t,sendTx:n,reward:r,sharing:i,display:o}}async function ht(e,{tx:t,metadata:n}){return(await a(e,{metadata:n,steps:{login:{},sendTransaction:{tx:t}}})).sendTransaction}function gt(e=96){let t=Math.ceil(e/2),n=``;if(typeof crypto<`u`&&crypto.getRandomValues){let e=new Uint8Array(t);crypto.getRandomValues(e);for(let t=0;t<e.length;t++)n+=e[t].toString(16).padStart(2,`0`)}else for(let e=0;e<t;e++)n+=(Math.random()*256|0).toString(16).padStart(2,`0`);return n.substring(0,e)}async function _t(e,{siwe:t,metadata:n}){let r=e.config?.domain??window.location.host,i=t?.statement??`I confirm that I want to use my Frak wallet on: ${e.config.metadata.name}`;return(await a(e,{metadata:n,steps:{login:{},siweAuthenticate:{siwe:{...t,statement:i,nonce:t?.nonce??gt(),uri:t?.uri??`https://${r}`,version:t?.version??`1`,domain:r}}}})).siweAuthenticate}var vt=class{constructor(e){this.baseUrl=e.baseUrl,this.headers={"Content-Type":`application/json`,...e.defaultHeaders},this.maxRetries=e.maxRetries??3,this.initialRetryDelay=e.initialRetryDelay??500}async resolveHeaders(){let e={};for(let[t,n]of Object.entries(this.headers)){let r=await n;r!==null&&(e[t]=r)}return e}addHeader(e,t){this.headers[e]=t}async post(e,t,n,r){try{let r=await fetch(e,{method:`POST`,headers:await this.resolveHeaders(),body:t?JSON.stringify(t??{}):void 0,keepalive:!0,...n});if(r.status===401)return null;if(r.status!==200&&r.status!==202)throw Error(`HTTP error! status: ${r.status}`);let i=await r.text();return i?JSON.parse(i):null}catch{if(r<this.maxRetries){let i=this.initialRetryDelay*2**r;return await new Promise(e=>setTimeout(e,i)),this.post(e,t,n,r+1)}return null}}async fetch(e,t,n={}){let r=`${this.baseUrl}${e}`;return this.post(r,t,n,0)}},yt=class{constructor(e){this.groups=[],this.queue=[],this.options=e;let t={"openpanel-client-id":e.clientId};e.clientSecret&&(t[`openpanel-client-secret`]=e.clientSecret),t[`openpanel-sdk-name`]=e.sdk||`node`,t[`openpanel-sdk-version`]=e.sdkVersion||`1.3.1`,this.api=new vt({baseUrl:e.apiUrl||`https://api.openpanel.dev`,defaultHeaders:t})}init(){}ready(){this.options.disabled=!1,this.options.waitForProfile=!1,this.flush()}shouldQueue(e){return!!(this.options.disabled||this.options.waitForProfile&&!this.profileId||e.type===`replay`&&!this.sessionId)}addQueue(e){e.type===`track`&&(e.payload.properties={...e.payload.properties??{},__timestamp:new Date().toISOString()}),this.queue.push(e)}async send(e){if(this.options.filter&&!this.options.filter(e))return Promise.resolve();if(this.shouldQueue(e))return this.addQueue(e),Promise.resolve();let t=await this.api.fetch(`/track`,e,{keepalive:e.type!==`replay`});this.deviceId=t?.deviceId;let n=!!this.sessionId;return this.sessionId=t?.sessionId,!n&&this.sessionId&&this.flush(),t}setGlobalProperties(e){this.global={...this.global,...e}}track(e,t){this.log(`track event`,e,t);let{groups:n,profileId:r,...i}=t??{},a=[...new Set([...this.groups,...n??[]])];return this.send({type:`track`,payload:{name:e,profileId:r??this.profileId,groups:a.length>0?a:void 0,properties:{...this.global??{},...i}}})}identify(e){if(this.log(`identify user`,e),e.profileId&&(this.profileId=e.profileId,this.flush()),e.profileId&&Object.keys(e).length>1)return this.send({type:`identify`,payload:{...e,properties:{...this.global,...e.properties}}})}upsertGroup(e){return this.log(`upsert group`,e),this.send({type:`group`,payload:e})}setGroup(e){return this.log(`set group`,e),this.groups.includes(e)||(this.groups=[...this.groups,e]),this.send({type:`assign_group`,payload:{groupIds:[e],profileId:this.profileId}})}setGroups(e){return this.log(`set groups`,e),this.groups=[...new Set([...this.groups,...e])],this.send({type:`assign_group`,payload:{groupIds:e,profileId:this.profileId}})}alias(e){}increment(e){return this.send({type:`increment`,payload:e})}decrement(e){return this.send({type:`decrement`,payload:e})}revenue(e,t){let n=t?.deviceId;return delete t?.deviceId,this.track(`revenue`,{...t??{},...n?{__deviceId:n}:{},__revenue:e})}getDeviceId(){return this.deviceId??``}getSessionId(){return this.sessionId??``}fetchDeviceId(){return Promise.resolve(this.deviceId??``)}clear(){this.profileId=void 0,this.groups=[],this.deviceId=void 0,this.sessionId=void 0}buildFlushPayload(e){if(e.type===`replay`)return e.payload;if(e.type===`track`){let t=`groups`in e.payload?e.payload.groups??[]:[],n=[...new Set([...this.groups,...t])];return{...e.payload,profileId:e.payload.profileId??this.profileId,groups:n.length>0?n:void 0}}return e.type===`identify`||e.type===`increment`||e.type===`decrement`||e.type===`assign_group`?{...e.payload,profileId:e.payload.profileId??this.profileId}:e.payload}flush(){let e=[];for(let t of this.queue){if(this.shouldQueue(t)){e.push(t);continue}let n=this.buildFlushPayload(t);this.send({...t,payload:n})}this.queue=e}log(...e){this.options.debug}};function bt(){return()=>{}}var xt=n((()=>{})),St=r({startReplayRecorder:()=>Ct,stopReplayRecorder:()=>wt});function Ct(e,t){if(typeof document>`u`||typeof window>`u`)return;Z&&Z();let n=e.maxEventsPerChunk??200,r=e.flushIntervalMs??1e4,i=e.maxPayloadBytes??1048576,a=[],o=0,s=null;function c(e){if(a.length===0)return;let n=JSON.stringify(a);if(new TextEncoder().encode(n).length>i){if(a.length>1){let t=Math.floor(a.length/2),n=a.slice(0,t),r=a.slice(t),i=e&&n.some(e=>e.type===2);a=n,c(i),a=r,c(!1);return}a=[];return}let r=a[0].timestamp,s=a[a.length-1].timestamp;try{t({chunk_index:o,events_count:a.length,is_full_snapshot:e,started_at:new Date(r).toISOString(),ended_at:new Date(s).toISOString(),payload:n}),o+=1,a=[]}catch(e){throw e}}function l(e){let t=e||a.some(e=>e.type===2);a.length>=n?c(t):e&&a.length>0&&c(!0)}let u=e.maskAllText!==!1,d=e.unmaskTextSelector,f=bt({emit(e,t){a.push(e),l(!!t)},checkoutEveryNms:r,maskAllInputs:e.maskAllInputs??!0,maskTextSelector:u?`*`:`[data-openpanel-replay-mask]`,maskTextFn:u&&d?(e,t)=>t?.closest(d)?e:e.replace(/\S/g,`*`):void 0,blockSelector:e.blockSelector??`[data-openpanel-replay-block]`,blockClass:e.blockClass,ignoreSelector:e.ignoreSelector});s=setInterval(()=>{a.length>0&&c(a.some(e=>e.type===2))},r);function p(){document.visibilityState===`hidden`&&a.length>0&&c(a.some(e=>e.type===2))}function m(){a.length>0&&c(a.some(e=>e.type===2))}document.addEventListener(`visibilitychange`,p),window.addEventListener(`pagehide`,m),Z=()=>{a.length>0&&c(a.some(e=>e.type===2)),s&&=(clearInterval(s),null),document.removeEventListener(`visibilitychange`,p),window.removeEventListener(`pagehide`,m),f?.(),Z=null}}function wt(){Z&&Z()}var Z,Tt=n((()=>{xt(),Z=null})),Et=typeof document<`u`?document.currentScript:null;function Dt(e){return e.replace(/([-_][a-z])/gi,e=>e.toUpperCase().replace(`-`,``).replace(`_`,``))}var Ot=class extends yt{constructor(e){if(super({sdk:`web`,sdkVersion:`1.4.1`,...e}),this.options=e,this.lastPath=``,this.pendingRevenues=[],!this.isServer()){try{let e=sessionStorage.getItem(`openpanel-pending-revenues`);if(e){let t=JSON.parse(e);Array.isArray(t)&&(this.pendingRevenues=t)}}catch{this.pendingRevenues=[]}if(this.setGlobalProperties({__referrer:document.referrer}),this.options.trackScreenViews&&(this.trackScreenViews(),setTimeout(()=>this.screenView(),0)),this.options.trackOutgoingLinks&&this.trackOutgoingLinks(),this.options.trackAttributes&&this.trackAttributes(),this.options.sessionReplay?.enabled){let e=this.options.sessionReplay.sampleRate??1;Math.random()<e&&this.loadReplayModule().then(e=>{e&&e.startReplayRecorder(this.options.sessionReplay,e=>{this.send({type:`replay`,payload:{...e}})})})}}}async loadReplayModule(){try{if(typeof __OPENPANEL_REPLAY_URL__<`u`){let e=Et,t=this.options.sessionReplay?.scriptUrl||e?.src?.replace(`.js`,`-replay.js`)||`https://openpanel.dev/op1-replay.js`;return window.__openpanel_replay?window.__openpanel_replay:new Promise(e=>{let n=document.createElement(`script`);n.src=t,n.onload=()=>{e(window.__openpanel_replay??null)},n.onerror=()=>{e(null)},document.head.appendChild(n)})}return await Promise.resolve().then(()=>(Tt(),St))}catch{return null}}debounce(e,t){clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(e,t)}isServer(){return typeof document>`u`}trackOutgoingLinks(){this.isServer()||document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`a`);if(n&&t){let e=n.getAttribute(`href`);if(e?.startsWith(`http`))try{let r=new URL(e),i=window.location.hostname;r.hostname!==i&&super.track(`link_out`,{href:e,text:n.innerText||n.getAttribute(`title`)||t.getAttribute(`alt`)||t.getAttribute(`title`)})}catch{}}})}trackScreenViews(){if(this.isServer())return;let e=history.pushState;history.pushState=function(...t){let n=e.apply(this,t);return window.dispatchEvent(new Event(`pushstate`)),window.dispatchEvent(new Event(`locationchange`)),n};let t=history.replaceState;history.replaceState=function(...e){let n=t.apply(this,e);return window.dispatchEvent(new Event(`replacestate`)),window.dispatchEvent(new Event(`locationchange`)),n},window.addEventListener(`popstate`,()=>{window.dispatchEvent(new Event(`locationchange`))});let n=()=>this.debounce(()=>this.screenView(),50);this.options.trackHashChanges?window.addEventListener(`hashchange`,n):window.addEventListener(`locationchange`,n)}trackAttributes(){this.isServer()||document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`button`),r=t.closest(`a`),i=n?.getAttribute(`data-track`)?n:r?.getAttribute(`data-track`)?r:null;if(i){let e={};for(let t of i.attributes)t.name.startsWith(`data-`)&&t.name!==`data-track`&&(e[Dt(t.name.replace(/^data-/,``))]=t.value);let t=i.getAttribute(`data-track`);t&&super.track(t,e)}})}track(e,t){return super.track(e,{...t,__path:this.lastPath})}screenView(e,t){if(this.isServer())return;let n,r;typeof e==`string`?(n=e,r=t):(n=window.location.href,r=e),this.lastPath!==n&&(this.lastPath=n,super.track(`screen_view`,{...r??{},__path:n,__title:document.title}))}async flushRevenue(){let e=this.pendingRevenues.map(e=>super.revenue(e.amount,e.properties));await Promise.all(e),this.clearRevenue()}clearRevenue(){if(this.pendingRevenues=[],!this.isServer())try{sessionStorage.removeItem(`openpanel-pending-revenues`)}catch{}}pendingRevenue(e,t){if(this.pendingRevenues.push({amount:e,properties:t}),!this.isServer())try{sessionStorage.setItem(`openpanel-pending-revenues`,JSON.stringify(this.pendingRevenues))}catch{}}};function kt(e,t){if(typeof window>`u`)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}})}).catch(e=>{}),n.searchParams.delete(`sso`),window.history.replaceState({},``,n.toString()))}let At=(()=>{if(typeof navigator>`u`)return!1;let e=navigator.userAgent;if(!(/iPhone|iPad|iPod/i.test(e)||/Macintosh/i.test(e)&&navigator.maxTouchPoints>1))return!1;let t=e.toLowerCase();return t.includes(`instagram`)||t.includes(`fban`)||t.includes(`fbav`)||t.includes(`facebook`)})();function jt(e){e?localStorage.setItem(U,e):localStorage.removeItem(U)}function Q(e,t){try{let n=new URL(e);if(!n.searchParams.has(`u`))return e;let r=Pt(window.location.href,t);return n.searchParams.delete(`u`),n.searchParams.append(`u`,r),n.toString()}catch{return e}}function Mt(e){let t=new URL(window.location.href);e&&t.searchParams.set(`fmt`,e);let n=t.protocol===`http:`?`x-safari-http`:`x-safari-https`;window.location.href=`${n}://${t.host}${t.pathname}${t.search}${t.hash}`}function Nt(e){return e.includes(`/common/social`)}function Pt(e,t){if(!t)return e;try{let n=new URL(e);return n.searchParams.set(`fmt`,t),n.toString()}catch{return`${e}${e.includes(`?`)?`&`:`?`}fmt=${encodeURIComponent(t)}`}}function Ft(e,t,n,r,i){if(i){let e=Q(t,r);window.open(e,`_blank`);return}if(We(t)){let i=Q(t,r);Ue(i,{onFallback:()=>{e.contentWindow?.postMessage({clientLifecycle:`deep-link-failed`,data:{originalUrl:i}},n)}})}else if(At&&Nt(t))Mt(r);else{let e=Q(t,r);window.location.href=e}}function It({iframe:e,targetOrigin:t}){let n=new k;return{handleEvent:r=>{if(!(`iframeLifecycle`in r))return;let{iframeLifecycle:i,data:a}=r;switch(i){case`connected`:n.resolve(!0);break;case`do-backup`:jt(a.backup);break;case`remove-backup`:localStorage.removeItem(U);break;case`show`:case`hide`:tt({iframe:e,isVisible:i===`show`});break;case`redirect`:Ft(e,a.baseRedirectUrl,t,a.mergeToken,a.openInNewTab);break}},isConnected:n.promise}}function $({config:e,iframe:t}){let n=e?.walletUrl??`https://wallet.frak.id`,r=typeof navigator<`u`?navigator.language?.split(`-`)[0]:void 0,i=e.metadata.lang??(r===`en`||r===`fr`?r:void 0),a=e.domain??(typeof window<`u`?window.location.hostname:``);D.setCacheScope(a,i),D.reset();let o=D.isCacheFresh?void 0:D.resolve(e.domain,e.walletUrl,i),s=It({iframe:t,targetOrigin:n}),c=new k,l=Date.now();if(!t.contentWindow)throw new O(me.configError,`The iframe does not have a content window`);let u=he({emittingTransport:t.contentWindow,listeningTransport:window,targetOrigin:n,middleware:[{async onRequest(e,t){if(!await s.isConnected)throw new O(me.clientNotConnected,`The iframe provider isn't connected yet`);return await c.promise,t}}],lifecycleHandlers:{iframeLifecycle:(e,t)=>{s.handleEvent(e)}}}),d=Lt(u,s),f=async()=>{d(),u.cleanup(),t.remove(),y(),D.clearCache(),D.reset()},m;{m=new Ot({apiUrl:`https://op-api.gcp.frak.id`,clientId:`f305d11d-b93b-487c-80d4-92deb7903e98`,trackScreenViews:!0,trackOutgoingLinks:!0,trackAttributes:!1,filter:({type:e,payload:t})=>(e!==`track`||!t?.properties||`sdkVersion`in t.properties||(t.properties={...t.properties,sdkVersion:`1.1.3`,userAnonymousClientId:p()}),!0)}),m.setGlobalProperties({sdkVersion:`1.1.3`,userAnonymousClientId:p()}),m.init(),m.track(`sdk_initialized`,{sdkVersion:`1.1.3`});let e=!1,t=setTimeout(()=>{e||(e=!0,m?.track(`sdk_iframe_handshake_failed`,{reason:`timeout`}))},3e4);s.isConnected.then(()=>{e||(e=!0,clearTimeout(t),m?.track(`sdk_iframe_connected`,{handshake_duration_ms:Date.now()-l}))}).catch(()=>{e||(e=!0,clearTimeout(t),m?.track(`sdk_iframe_handshake_failed`,{reason:`unknown`}))})}let h=Rt({config:e,rpcClient:u,lifecycleManager:s,configPromise:o,contextSent:c,openPanel:m}).then(()=>{}).catch(e=>{throw c.reject(e),e});return{config:e,waitForConnection:s.isConnected,waitForSetup:h,request:u.request,listenerRequest:u.listen,destroy:f,openPanel:m}}function Lt(e,t){let n,r,i=()=>e.sendLifecycle({clientLifecycle:`heartbeat`});async function a(){i(),n=setInterval(i,250),r=setTimeout(()=>{o()},3e4),await t.isConnected,o()}function o(){n&&clearInterval(n),r&&clearTimeout(r)}return a(),o}async function Rt({config:e,rpcClient:t,lifecycleManager:n,configPromise:r,contextSent:i,openPanel:a}){await n.isConnected,kt(t,n.isConnected);let o=new URL(window.location.href),s=o.searchParams.get(`fmt`)??void 0;s&&(o.searchParams.delete(`fmt`),window.history.replaceState({},``,o.toString()));let c=t=>{let n=t?.merchantId??e.metadata.merchantId??``,r=t?.domain??``,i=t?.allowedDomains??[],a=t?.sdkConfig,o=a?.attribution||e.attribution?{...e.attribution,...a?.attribution}:void 0;D.setConfig(a?{isResolved:!0,merchantId:n,domain:r,allowedDomains:i,hasRawSdkConfig:!0,name:a.name??e.metadata.name,logoUrl:a.logoUrl??e.metadata.logoUrl,homepageLink:a.homepageLink??e.metadata.homepageLink,lang:a.lang??e.metadata.lang,currency:a.currency??e.metadata.currency,hidden:a.hidden,css:a.css,translations:a.translations,placements:a.placements,components:a.components,attribution:o}:{isResolved:!0,merchantId:n,domain:r,allowedDomains:i,name:e.metadata.name,logoUrl:e.metadata.logoUrl,homepageLink:e.metadata.homepageLink,lang:e.metadata.lang,currency:e.metadata.currency,attribution:o})},l=!1,u=e=>{let n=l?void 0:s;l=!0;let r=e.hasRawSdkConfig?{name:e.name,logoUrl:e.logoUrl,homepageLink:e.homepageLink,lang:e.lang,currency:e.currency,hidden:e.hidden,css:e.css,translations:e.translations,placements:e.placements,attribution:e.attribution}:e.attribution?{attribution:e.attribution}:void 0,i=p();if(a){let t=a.global??{};a.setGlobalProperties({...t,merchantId:e.merchantId,domain:e.domain??``})}t.sendLifecycle({clientLifecycle:`resolved-config`,data:{merchantId:e.merchantId,domain:e.domain??``,allowedDomains:e.allowedDomains??[],sourceUrl:window.location.href,...i&&{sdkAnonymousId:i},...n&&{pendingMergeToken:n},...r&&{sdkConfig:r}}})};D.isResolved&&(u(D.getConfig()),i.resolve()),r&&(c(await r),u(D.getConfig()),i.resolve());async function d(){let n=e.customizations?.css;n&&t.sendLifecycle({clientLifecycle:`modal-css`,data:{cssLink:n}})}async function f(){let n=e.customizations?.i18n;n&&t.sendLifecycle({clientLifecycle:`modal-i18n`,data:{i18n:n}})}async function m(){if(typeof window>`u`)return;let e=window.localStorage.getItem(U);e&&t.sendLifecycle({clientLifecycle:`restore-backup`,data:{backup:e}})}(await Promise.allSettled([d(),f(),m()])).some(e=>e.status===`rejected`)&&a?.track(`sdk_iframe_handshake_failed`,{reason:`asset_push`})}async function zt({config:e}){let t=Bt(e),n=await et({config:t});if(!n)return;let r=$({config:t,iframe:n});if(await r.waitForSetup,await r.waitForConnection)return r}function Bt(e){let t=q(e.metadata?.currency);return{...e,metadata:{...e.metadata,currency:t}}}return e.DEEP_LINK_SCHEME=W,e.FrakContextManager=V,e.REFERRAL_SUCCESS_EVENT=lt,e.base64urlDecode=j,e.base64urlEncode=A,e.baseIframeProps=J,e.clearAllCache=y,e.compressJsonToB64=M,e.createIFrameFrakClient=$,e.decompressJsonFromB64=Xe,e.displayEmbeddedWallet=i,e.displayModal=a,e.displaySharingPage=o,e.ensureIdentity=ue,e.findIframeInOpener=nt,e.formatAmount=Qe,e.generateSsoUrl=N,e.getBackendUrl=u,e.getClientId=p,e.getCurrencyAmountKey=$e,e.getMerchantInformation=de,e.getMergeToken=fe,e.getSupportedCurrency=q,e.getUserReferralStatus=pe,e.isIOS=G,e.isInAppBrowser=Je,e.isMobile=Ke,e.mergeAttribution=ze,e.modalBuilder=mt,e.openSso=ye,e.prepareSso=be,e.processReferral=st,e.redirectToExternalBrowser=Ye,e.referralInteraction=ct,e.sdkConfigStore=D,e.sendInteraction=Y,e.sendTransaction=ht,e.setupClient=zt,e.setupReferral=ut,e.siweAuthenticate=_t,e.ssoPopupFeatures=P,e.ssoPopupName=F,e.trackEvent=H,e.trackPurchaseStatus=dt,e.triggerDeepLinkWithFallback=Ue,e.watchWalletStatus=ft,e.withCache=v,e})({});
1
+ var FrakSDK=(function(e){Object.defineProperty(e,Symbol.toStringTag,{value:`Module`});var t=Object.defineProperty,n=(e,t)=>()=>(e&&(t=e(e=0)),t),r=(e,n)=>{let r={};for(var i in e)t(r,i,{get:e[i],enumerable:!0});return n||t(r,Symbol.toStringTag,{value:`Module`}),r};async function i(e,t,n){return await e.request({method:`frak_displayEmbeddedWallet`,params:n?[t,e.config.metadata,n]:[t,e.config.metadata]})}async function a(e,{steps:t,metadata:n},r){return await e.request({method:`frak_displayModal`,params:r?[t,n,e.config.metadata,r]:[t,n,e.config.metadata]})}async function o(e,t,n){return await e.request({method:`frak_displaySharingPage`,params:n?[t,e.config.metadata,n]:[t,e.config.metadata]})}let s=`https://backend.frak.id`;function c(e){return e.includes(`localhost:3000`)||e.includes(`localhost:3010`)}function l(e){return c(e)?`https://localhost:3030`:e.includes(`wallet-dev.frak.id`)||e.includes(`wallet.gcp-dev.frak.id`)?`https://backend.gcp-dev.frak.id`:s}function u(e){if(e)return l(e);if(typeof window<`u`){let e=window.FrakSetup?.client?.config?.walletUrl;if(e)return l(e)}return s}let d=`frak-client-id`;function f(){return typeof crypto<`u`&&crypto.randomUUID?crypto.randomUUID():`xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx`.replace(/[xy]/g,e=>{let t=Math.random()*16|0;return(e===`x`?t:t&3|8).toString(16)})}function p(){if(typeof window>`u`||!window.localStorage)return console.warn(`[Frak SDK] No Window / localStorage available to save the clientId`),f();let e=localStorage.getItem(d);return e||(e=f(),localStorage.setItem(d,e)),e}var m=class extends Map{maxSize;constructor(e){super(),this.maxSize=e}get(e){let t=super.get(e);return super.has(e)&&(super.delete(e),super.set(e,t)),t}set(e,t){if(super.has(e)&&super.delete(e),super.set(e,t),this.maxSize&&this.size>this.maxSize){let e=super.keys().next().value;e!==void 0&&super.delete(e)}return this}};let h;function ee(){return h||={promiseCache:new m(1024),responseCache:new m(1024),failureCache:new m(1024)},h}async function g(e,{cacheKey:t,cacheTime:n=3e4}){let{promiseCache:r,responseCache:i,failureCache:a}=ee();if(n>0){let e=i.get(t);if(e&&Date.now()-e.created<n)return e.data}let o=a.get(t);if(o&&Date.now()-o<1e3)throw Error(`Cache: ${t} recently failed, backing off`);let s=r.get(t);s||(s=e(),r.set(t,s));try{let e=await s;return i.set(t,{data:e,created:Date.now()}),a.delete(t),e}catch(e){throw a.set(t,Date.now()),e}finally{r.delete(t)}}function _(){h&&(h.promiseCache.clear(),h.responseCache.clear(),h.failureCache.clear())}let v=`__frakSdkConfig`,y=`frak-config-cache`,b=`frak-merchant-id`,x={key:y},S=typeof window<`u`;function C(){return{isResolved:!1,merchantId:``}}let w=null;function te(){if(!S)return null;try{let e=localStorage.getItem(x.key);if(!e)return null;let t=JSON.parse(e);return t.config?.isResolved?(w=t,t):null}catch{return null}}function ne(){return(w??te())?.config}function re(){let e=w??te();return e?Date.now()-e.timestamp<3e4:!1}function ie(e){if(!(!S||!e.isResolved))try{let t={config:e,timestamp:Date.now()};localStorage.setItem(x.key,JSON.stringify(t)),w=t}catch{}}function ae(){if(S){w=null;try{localStorage.removeItem(x.key)}catch{}}}function oe(){S&&(window[v]||(window[v]=ne()??C()))}function T(){return S?(oe(),window[v]??C()):C()}function E(e){S&&window.dispatchEvent(new CustomEvent(`frak:config`,{detail:e}))}function se(e){return e??(S?window.location.hostname:``)}async function ce(e,t,n){try{let r=u(t),i=n?`&lang=${encodeURIComponent(n)}`:``,a=await fetch(`${r}/user/merchant/resolve?domain=${encodeURIComponent(e)}${i}`);if(!a.ok){console.warn(`[Frak SDK] Merchant lookup failed for domain ${e}: ${a.status}`);return}let o=await a.json();if(S)try{sessionStorage.setItem(b,o.merchantId)}catch{}return o}catch(e){console.warn(`[Frak SDK] Failed to fetch merchant config:`,e);return}}let D={getConfig:T,get isResolved(){return T().isResolved},get isCacheFresh(){return re()},setCacheScope(e,t){x.key=`${y}:${`${e}:${t??``}`}`,w=null},setConfig(e){if(S&&(window[v]=e),ie(e),E(e),S&&e.merchantId)try{sessionStorage.setItem(b,e.merchantId)}catch{}},reset(){let e=ne()??C();S&&(window[v]=e),E(e)},clearCache(){if(ae(),_(),S)try{sessionStorage.removeItem(b)}catch{}},resolve(e,t,n){let r=se(e);return r?g(async()=>{let e=await ce(r,t,n);if(!e)throw Error(`Config resolution returned empty`);return e},{cacheKey:`sdkConfig:${r}:${n??``}`,cacheTime:1/0}).catch(()=>void 0):Promise.resolve(void 0)},getMerchantId(){let e=T();if(e.isResolved&&e.merchantId)return e.merchantId;if(S)try{return sessionStorage.getItem(b)??void 0}catch{}},async resolveMerchantId(e,t){return D.getMerchantId()||(await D.resolve(e,t))?.merchantId}};async function le(e){if(typeof window>`u`)return;let t=p();if(!t)return;let n=await D.resolveMerchantId();if(!n)return;let r=`frak-identity-ensured-${n}`;if(!window.sessionStorage.getItem(r))try{let i=u();(await fetch(`${i}/user/identity/ensure`,{method:`POST`,headers:{Accept:`application/json`,"Content-Type":`application/json`,"x-wallet-sdk-auth":e,"x-frak-client-id":t},body:JSON.stringify({merchantId:n})})).ok&&window.sessionStorage.setItem(r,`1`)}catch{}}async function ue(e,t){return g(()=>e.request({method:`frak_getMerchantInformation`}),{cacheKey:`frak_getMerchantInformation`,cacheTime:t?.cacheTime})}async function de(e,t){return g(()=>e.request({method:`frak_getMergeToken`}),{cacheKey:`frak_getMergeToken`,cacheTime:t?.cacheTime})}async function fe(e,t){return g(()=>e.request({method:`frak_getUserReferralStatus`}),{cacheKey:`frak_getUserReferralStatus`,cacheTime:t?.cacheTime})}let pe={parseError:-32700,invalidRequest:-32600,methodNotFound:-32601,invalidParams:-32602,internalError:-32603,serverError:-32e3,clientNotConnected:-32001,configError:-32002,corruptedResponse:-32003,clientAborted:-32004,walletNotConnected:-32005,serverErrorForInteractionDelegation:-32006,userRejected:-32007};var O=class extends Error{code;data;constructor(e,t,n){super(t),this.code=e,this.data=n}toJSON(){return{code:this.code,message:this.message,data:this.data}}},k=class{_promise;_resolve;_reject;constructor(){this._promise=new Promise((e,t)=>{this._resolve=e,this._reject=t})}get promise(){return this._promise}resolve=e=>{this._resolve?.(e)};reject=e=>{this._reject?.(e)}};function me(e){let{emittingTransport:t,listeningTransport:n,targetOrigin:r,middleware:i=[],lifecycleHandlers:a}=e,o=new Map;function s(e){return typeof e!=`object`||!e?!1:`clientLifecycle`in e||`iframeLifecycle`in e}function c(e){return typeof e!=`object`||!e?!1:`id`in e&&`topic`in e&&`data`in e}async function l(e){try{`clientLifecycle`in e&&a?.clientLifecycle?await a.clientLifecycle(e,{origin:r,source:null}):`iframeLifecycle`in e&&a?.iframeLifecycle&&await a.iframeLifecycle(e,{origin:r,source:null})}catch(e){console.error(`[RPC Client] Lifecycle handler error:`,e)}}async function u(e){let t={origin:r,source:null};for(let n of i)n.onRequest&&await n.onRequest(e,t);return e}async function d(e,t){let n={origin:r,source:null},a=t;for(let t of i)t.onResponse&&(a=await t.onResponse(e,a,n));return a}async function f(e){try{let t=new URL(e.origin).origin.toLowerCase(),n=new URL(r).origin.toLowerCase();if(t!==n){console.log(`Not expected origin`,t,n);return}}catch(e){console.error(`[RPC Client] Invalid origin`,e);return}if(s(e.data)){await l(e.data);return}if(!c(e.data))return;let t;try{let n=e.data.data,r=n instanceof Uint8Array||ArrayBuffer.isView(n)?{result:n}:n;t=await d(e.data,r)}catch(e){console.error(`[RPC Client] Middleware error on response:`,e);return}let n=o.get(e.data.id);n&&n(t)}async function p(e){let n=e;try{n=await u(e)}catch(e){throw console.error(`[RPC Client] Middleware error on request:`,e),e}t.postMessage(n,r)}function m(e){t.postMessage(e,r)}function h(){return`${Date.now()}-${Math.random().toString(36).substring(2,9)}`}n.addEventListener(`message`,f);function ee(e){let t=h(),n=new k;return o.set(t,e=>{e.error?n.reject(new O(e.error.code,e.error.message,e.error.data)):n.resolve(e.result),o.delete(t)}),p({id:t,topic:e.method,data:{method:e.method,params:e.params}}).catch(e=>{o.delete(t),n.reject(e)}),n.promise}function g(e,t){let n=h();return o.set(n,e=>{e.error?(console.error(`[RPC Client] Listener error:`,e.error),o.delete(n)):t(e.result)}),p({id:n,topic:e.method,data:{method:e.method,params:e.params}}).catch(e=>{console.error(`[RPC Client] Failed to send listener request:`,e),o.delete(n)}),()=>{o.delete(n)}}function _(){n.removeEventListener(`message`,f),o.clear()}return{request:ee,listen:g,sendLifecycle:m,cleanup:_}}function he(e){return new TextEncoder().encode(JSON.stringify(e))}function ge(e){try{return JSON.parse(new TextDecoder().decode(e))}catch{return null}}function A(e){return btoa(Array.from(e,e=>String.fromCharCode(e)).join(``)).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}function j(e){let t=e.length%4;return Uint8Array.from(atob(e.replace(/-/g,`+`).replace(/_/g,`/`).padEnd(e.length+(t===0?0:4-t),`=`)),e=>e.charCodeAt(0))}function _e(e){return A(he(e))}function ve(e,t,n,r,i,a){let o=_e(ye({redirectUrl:t.redirectUrl,directExit:t.directExit,lang:t.lang,merchantId:n,metadata:{name:r,css:a,logoUrl:t.metadata?.logoUrl,homepageLink:t.metadata?.homepageLink},clientId:i})),s=new URL(e);return s.pathname=`/sso`,s.searchParams.set(`p`,o),s.toString()}function ye(e){return{r:e.redirectUrl,cId:e.clientId,d:e.directExit,l:e.lang,m:e.merchantId,md:{n:e.metadata?.name,css:e.metadata?.css,l:e.metadata?.logoUrl,h:e.metadata?.homepageLink}}}let be=`menubar=no,status=no,scrollbars=no,fullscreen=no,width=500, height=800`,xe=`frak-sso`;async function Se(e,t){let{metadata:n,customizations:r,walletUrl:i}=e.config,a={...t,directExit:t.directExit??!t.redirectUrl};if(a.openInSameWindow??!!a.redirectUrl)return await e.request({method:`frak_openSso`,params:[a,n.name,r?.css]});let o=a.ssoPopupUrl??ve(i??`https://wallet.frak.id`,a,await D.resolveMerchantId()??``,n.name,p(),r?.css),s=window.open(o,xe,be);if(!s)throw Error(`Popup was blocked. Please allow popups for this site.`);return s.focus(),await e.request({method:`frak_openSso`,params:[a,n.name,r?.css]})??{}}async function Ce(e,t){let{metadata:n,customizations:r}=e.config;return await e.request({method:`frak_prepareSso`,params:[t,n.name,r?.css]})}let we=/^0x[a-fA-F0-9]{40}$/;function M(e){return typeof e==`string`&&we.test(e)}function Te(e,t){return e.toLowerCase()===t.toLowerCase()}function Ee(e){let t=new Uint8Array(20);for(let n=0;n<20;n++){let r=Number.parseInt(e.substring(2+n*2,4+n*2),16);if(Number.isNaN(r))throw Error(`Invalid address: ${e}`);t[n]=r}return t}let De=Array.from({length:256},(e,t)=>t.toString(16).padStart(2,`0`));function Oe(e){let t=`0x`;for(let n=0;n<20;n++)t+=De[e[n]];return t}function ke(e){return`r`in e&&!(`v`in e)}function N(e){return`v`in e&&e.v===2}function Ae(e,t){let n=e.get(t);if(n!==null)return n;let r=t.toLowerCase();for(let[t,n]of e)if(t.toLowerCase()===r)return n;return null}function P(e,t){let n=t.toLowerCase(),r=[...e.keys()].filter(e=>e.toLowerCase()===n);for(let t of r)e.delete(t)}let je=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;function F(e){return typeof e==`string`&&je.test(e)}function I(e){let t=e.replace(/-/g,``),n=new Uint8Array(16);for(let e=0;e<16;e++)n[e]=Number.parseInt(t.substring(e*2,e*2+2),16);return n}function L(e){let t=``;for(let n=0;n<16;n++)t+=e[n].toString(16).padStart(2,`0`);return`${t.slice(0,8)}-${t.slice(8,12)}-${t.slice(12,16)}-${t.slice(16,20)}-${t.slice(20,32)}`}function Me(e){if(!F(e.m)||!Number.isInteger(e.t)||e.t<0||e.t>4294967295)return null;let t=typeof e.c==`string`&&e.c.length>0,n=typeof e.w==`string`&&M(e.w);if(!t&&!n||t&&!F(e.c))return null;let r=new Uint8Array(21+(t?16:0)+(n?20:0)),i=new DataView(r.buffer,r.byteOffset,r.byteLength),a=0;return r[a++]=2|(t?16:0)|(n?32:0),r.set(I(e.m),a),a+=16,i.setUint32(a,e.t,!1),a+=4,t&&(r.set(I(e.c),a),a+=16),n&&(r.set(Ee(e.w),a),a+=20),r}function Ne(e){if(e.length<21)return null;let t=e[0];if((t&15)!=2||t&192)return null;let n=(t&16)!=0,r=(t&32)!=0;if(!n&&!r)return null;let i=21+(n?16:0)+(r?20:0);if(e.length!==i)return null;let a=1,o=L(e.subarray(a,a+16));a+=16;let s=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint32(a,!1);a+=4;let c={v:2,m:o,t:s};if(n&&(c.c=L(e.subarray(a,a+16)),a+=16),r){let t=Oe(e.subarray(a,a+20));if(!M(t))return null;c.w=t,a+=20}return c}let R=`fCtx`;function z(e){if(e)try{if(N(e)){let t=Me(e);return t?A(t):void 0}return A(Ee(e.r))}catch(t){console.error(`Error compressing Frak context`,{e:t,context:e})}}function B(e){if(!(!e||e.length===0))try{let t=j(e);if(t.length!==20)return Ne(t)||void 0;let n=Oe(t);if(M(n))return{r:n}}catch(t){console.error(`Error decompressing Frak context`,{e:t,context:e})}}function Pe({url:e}){if(!e)return null;let t=Ae(new URL(e).searchParams,R);return t?B(t):null}function Fe(e){return{utm_source:e.utmSource??`frak`,utm_medium:e.utmMedium??void 0,utm_campaign:e.utmCampaign??void 0,utm_content:e.utmContent,utm_term:e.utmTerm,via:e.via??void 0,ref:e.ref??void 0}}function Ie(e,t){let n=Fe(t??{});for(let[t,r]of Object.entries(n))r===void 0||r===``||e.searchParams.has(t)||e.searchParams.set(t,r)}function V({url:e,context:t,attribution:n}){if(!e)return null;let r=z(t);if(!r)return null;let i=new URL(e);return P(i.searchParams,R),i.searchParams.set(R,r),Ie(i,n),i.toString()}function Le(e){let t=new URL(e);return P(t.searchParams,R),t.toString()}function Re({url:e,context:t}){if(!window.location?.href||typeof window>`u`){console.error(`No window found, can't update context`);return}let n=e??window.location.href,r;r=t===null?Le(n):V({url:n,context:t}),r&&window.history.replaceState(null,``,r.toString())}let H={compress:z,decompress:B,parse:Pe,update:V,remove:Le,replaceUrl:Re};function ze({perCall:e,defaults:t,productUtmContent:n}){if(e===null)return;let r=e!==void 0,i=t!==void 0&&Object.keys(t).length>0;if(!r&&!i&&!(n!==void 0&&n!==``))return;let a={...t,...e??{}},o=n??e?.utmContent;return o!==void 0&&o!==``?a.utmContent=o:delete a.utmContent,a}function U(e,t,n){if(!e){console.debug(`[Frak] No client provided, skipping event tracking`);return}try{e.openPanel?.track(t,n)}catch(e){console.debug(`[Frak] Failed to track event:`,t,e)}}let W=`nexus-wallet-backup`,G=`frakwallet://`;function Be(){let e=navigator.userAgent;return/Android/i.test(e)&&/Chrome\/\d+/i.test(e)}let Ve=G.replace(`://`,``);function He(e){return`intent://${e.slice(13)}#Intent;scheme=${Ve};end`}function Ue(e,t){let n=t?.timeout??2500,r=!1,i=()=>{document.hidden&&(r=!0)};document.addEventListener(`visibilitychange`,i);let a=Be()&&We(e)?He(e):e;window.location.href=a,setTimeout(()=>{document.removeEventListener(`visibilitychange`,i),r||t?.onFallback?.()},n)}function We(e){return e.startsWith(G)}function Ge(){if(typeof navigator>`u`)return!1;let e=navigator.userAgent;return!!(/iPhone|iPad|iPod/i.test(e)||/Macintosh/i.test(e)&&navigator.maxTouchPoints>1)}let K=Ge();function Ke(){return typeof navigator>`u`?!1:K?!0:/Android|webOS|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)}function qe(){if(typeof navigator>`u`)return!1;let e=navigator.userAgent.toLowerCase();return e.includes(`instagram`)||e.includes(`fban`)||e.includes(`fbav`)||e.includes(`facebook`)}let Je=qe();function Ye(e){K&&e.startsWith(`https://`)?window.location.href=`x-safari-https://${e.slice(8)}`:K&&e.startsWith(`http://`)?window.location.href=`x-safari-http://${e.slice(7)}`:window.location.href=`https://backend.frak.id/common/social?u=${encodeURIComponent(e)}`}function Xe(e){return ge(j(e))}let q={eur:`fr-FR`,usd:`en-US`,gbp:`en-GB`};function J(e){return e&&e in q?e:`eur`}function Ze(e){return e?q[e]??q.eur:q.eur}function Qe(e,t){let n=Ze(t),r=J(t);return e.toLocaleString(n,{style:`currency`,currency:r,minimumFractionDigits:0,maximumFractionDigits:2})}function $e(e){return e?`${e}Amount`:`eurAmount`}let Y={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`);r.id=Y.id,r.name=Y.name,r.allow=Y.allow,r.style.zIndex=Y.style.zIndex.toString(),nt({iframe:r,isVisible:!1});let i=t?.walletUrl??e??`https://wallet.frak.id`,a=p();return it(i),it(u(i)),r.src=tt({walletUrl:i,clientId:a,preload:t?.preload}),new Promise(e=>{r.addEventListener(`load`,()=>e(r)),document.body.appendChild(r)})}function tt({walletUrl:e,clientId:t,preload:n}){let r=`${e}/listener?clientId=${encodeURIComponent(t)}`;return!n||n.length===0?r:`${r}#preload=${n.join(`,`)}`}function nt({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 rt(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 it(e){if(!(typeof document>`u`))try{let t=new URL(e).origin,n=`link[rel="preconnect"][data-frak-preconnect="${t}"]`;if(document.head.querySelector(n))return;let r=document.createElement(`link`);r.rel=`preconnect`,r.href=t,r.crossOrigin=``,r.dataset.frakPreconnect=t,document.head.appendChild(r)}catch{}}async function X(e,t){try{await e.request({method:`frak_sendInteraction`,params:[t,{clientId:p()}]})}catch{console.warn(`[Frak SDK] Failed to send interaction:`,t.type)}}function at(e,t,n){return N(t)?(U(e,`user_referred_started`,{referrer_client_id:t.c,referrer_wallet:t.w,wallet_status:n?.key}),X(e,{type:`arrival`,referrerClientId:t.c,referrerMerchantId:t.m,referrerWallet:t.w,referralTimestamp:t.t}),!0):ke(t)?(U(e,`user_referred_started`,{referrer:t.r,wallet_status:n?.key}),X(e,{type:`arrival`,referrerWallet:t.r}),!0):!1}function ot(e,t){let n=p();return!n&&!t?null:{v:2,m:e,t:Math.floor(Date.now()/1e3),...n?{c:n}:{},...t?{w:t}:{}}}function st(e,t){return N(e)?e.w&&t?.wallet?Te(e.w,t.wallet):e.c?p()===e.c:!1:ke(e)&&t?.wallet?Te(e.r,t.wallet):!1}function ct(e,{walletStatus:t,frakContext:n,options:r}){if(!n)return`no-referrer`;if(st(n,t))return`self-referral`;if(!at(e,n,t))return`no-referrer`;let i=N(n)?n.m:r?.merchantId,a=r?.alwaysAppendUrl&&i?ot(i,t?.wallet):null;return H.replaceUrl({url:window.location?.href,context:a}),U(e,`user_referred_completed`,{status:`success`}),`success`}async function lt(e,{options:t}={}){let n=H.parse({url:window.location.href}),r=await pt(e);try{return ct(e,{walletStatus:r,frakContext:n,options:t})}catch(e){console.warn(`Error processing referral`,{error:e})}}let ut=`frak:referral-success`;async function dt(e){try{await lt(e)===`success`&&window.dispatchEvent(new Event(ut))}catch(e){console.warn(`[Frak] Referral setup failed`,e)}}async function ft(e){if(typeof window>`u`){console.warn(`[Frak] No window found, can't track purchase`);return}let t=window.sessionStorage.getItem(`frak-wallet-interaction-token`),n=p();if(!t&&!n){console.warn(`[Frak] No identity found, skipping purchase check`);return}let r=e.merchantId??await D.resolveMerchantId();if(!r){console.warn(`[Frak] No merchant id found, skipping purchase check`);return}let i={Accept:`application/json`,"Content-Type":`application/json`};t&&(i[`x-wallet-sdk-auth`]=t),n&&(i[`x-frak-client-id`]=n);let a=u();await fetch(`${a}/user/track/purchase`,{method:`POST`,headers:i,body:JSON.stringify({customerId:e.customerId,orderId:e.orderId,token:e.token,merchantId:r})})}function pt(e,t){if(!t)return e.request({method:`frak_listenToWalletStatus`}).then(t=>(mt(e,t),t));let n=new k,r=!1;return e.listenerRequest({method:`frak_listenToWalletStatus`},i=>{mt(e,i),t(i),r||=(n.resolve(i),!0)}),n.promise}function mt(e,t){typeof window>`u`||(e.openPanel?.setGlobalProperties({wallet:t.wallet??null}),t.interactionToken?(window.sessionStorage.setItem(`frak-wallet-interaction-token`,t.interactionToken),le(t.interactionToken)):window.sessionStorage.removeItem(`frak-wallet-interaction-token`))}function ht(e,{metadata:t,login:n}){return Z(e,{steps:{login:n??{}},metadata:t})}function Z(e,t){function n(n){return Z(e,{...t,steps:{...t.steps,sendTransaction:n}})}function r(n){return Z(e,{...t,steps:{...t.steps,final:{...n,action:{key:`reward`}}}})}function i(n,r){return Z(e,{...t,steps:{...t.steps,final:{...r,action:{key:`sharing`,options:n}}}})}async function o(n,r){return n&&(t.metadata=n(t.metadata??{})),await a(e,t,r)}return{params:t,sendTx:n,reward:r,sharing:i,display:o}}async function gt(e,{tx:t,metadata:n}){return(await a(e,{metadata:n,steps:{login:{},sendTransaction:{tx:t}}})).sendTransaction}function _t(e=96){let t=Math.ceil(e/2),n=``;if(typeof crypto<`u`&&crypto.getRandomValues){let e=new Uint8Array(t);crypto.getRandomValues(e);for(let t=0;t<e.length;t++)n+=e[t].toString(16).padStart(2,`0`)}else for(let e=0;e<t;e++)n+=(Math.random()*256|0).toString(16).padStart(2,`0`);return n.substring(0,e)}async function vt(e,{siwe:t,metadata:n}){let r=e.config?.domain??window.location.host,i=t?.statement??`I confirm that I want to use my Frak wallet on: ${e.config.metadata.name}`;return(await a(e,{metadata:n,steps:{login:{},siweAuthenticate:{siwe:{...t,statement:i,nonce:t?.nonce??_t(),uri:t?.uri??`https://${r}`,version:t?.version??`1`,domain:r}}}})).siweAuthenticate}var yt=class{constructor(e){this.baseUrl=e.baseUrl,this.headers={"Content-Type":`application/json`,...e.defaultHeaders},this.maxRetries=e.maxRetries??3,this.initialRetryDelay=e.initialRetryDelay??500}async resolveHeaders(){let e={};for(let[t,n]of Object.entries(this.headers)){let r=await n;r!==null&&(e[t]=r)}return e}addHeader(e,t){this.headers[e]=t}async post(e,t,n,r){try{let r=await fetch(e,{method:`POST`,headers:await this.resolveHeaders(),body:t?JSON.stringify(t??{}):void 0,keepalive:!0,...n});if(r.status===401)return null;if(r.status!==200&&r.status!==202)throw Error(`HTTP error! status: ${r.status}`);let i=await r.text();return i?JSON.parse(i):null}catch(i){if(r<this.maxRetries){let i=this.initialRetryDelay*2**r;return await new Promise(e=>setTimeout(e,i)),this.post(e,t,n,r+1)}return console.error(`Max retries reached:`,i),null}}async fetch(e,t,n={}){let r=`${this.baseUrl}${e}`;return this.post(r,t,n,0)}},bt=class{constructor(e){this.groups=[],this.queue=[],this.options=e;let t={"openpanel-client-id":e.clientId};e.clientSecret&&(t[`openpanel-client-secret`]=e.clientSecret),t[`openpanel-sdk-name`]=e.sdk||`node`,t[`openpanel-sdk-version`]=e.sdkVersion||`1.3.1`,this.api=new yt({baseUrl:e.apiUrl||`https://api.openpanel.dev`,defaultHeaders:t})}init(){}ready(){this.options.disabled=!1,this.options.waitForProfile=!1,this.flush()}shouldQueue(e){return!!(this.options.disabled||this.options.waitForProfile&&!this.profileId||e.type===`replay`&&!this.sessionId)}addQueue(e){e.type===`track`&&(e.payload.properties={...e.payload.properties??{},__timestamp:new Date().toISOString()}),this.queue.push(e)}async send(e){if(this.options.filter&&!this.options.filter(e))return Promise.resolve();if(this.shouldQueue(e))return this.addQueue(e),Promise.resolve();let t=await this.api.fetch(`/track`,e,{keepalive:e.type!==`replay`});this.deviceId=t?.deviceId;let n=!!this.sessionId;return this.sessionId=t?.sessionId,!n&&this.sessionId&&this.flush(),t}setGlobalProperties(e){this.global={...this.global,...e}}track(e,t){this.log(`track event`,e,t);let{groups:n,profileId:r,...i}=t??{},a=[...new Set([...this.groups,...n??[]])];return this.send({type:`track`,payload:{name:e,profileId:r??this.profileId,groups:a.length>0?a:void 0,properties:{...this.global??{},...i}}})}identify(e){if(this.log(`identify user`,e),e.profileId&&(this.profileId=e.profileId,this.flush()),e.profileId&&Object.keys(e).length>1)return this.send({type:`identify`,payload:{...e,properties:{...this.global,...e.properties}}})}upsertGroup(e){return this.log(`upsert group`,e),this.send({type:`group`,payload:e})}setGroup(e){return this.log(`set group`,e),this.groups.includes(e)||(this.groups=[...this.groups,e]),this.send({type:`assign_group`,payload:{groupIds:[e],profileId:this.profileId}})}setGroups(e){return this.log(`set groups`,e),this.groups=[...new Set([...this.groups,...e])],this.send({type:`assign_group`,payload:{groupIds:e,profileId:this.profileId}})}alias(e){}increment(e){return this.send({type:`increment`,payload:e})}decrement(e){return this.send({type:`decrement`,payload:e})}revenue(e,t){let n=t?.deviceId;return delete t?.deviceId,this.track(`revenue`,{...t??{},...n?{__deviceId:n}:{},__revenue:e})}getDeviceId(){return this.deviceId??``}getSessionId(){return this.sessionId??``}fetchDeviceId(){return Promise.resolve(this.deviceId??``)}clear(){this.profileId=void 0,this.groups=[],this.deviceId=void 0,this.sessionId=void 0}buildFlushPayload(e){if(e.type===`replay`)return e.payload;if(e.type===`track`){let t=`groups`in e.payload?e.payload.groups??[]:[],n=[...new Set([...this.groups,...t])];return{...e.payload,profileId:e.payload.profileId??this.profileId,groups:n.length>0?n:void 0}}return e.type===`identify`||e.type===`increment`||e.type===`decrement`||e.type===`assign_group`?{...e.payload,profileId:e.payload.profileId??this.profileId}:e.payload}flush(){let e=[];for(let t of this.queue){if(this.shouldQueue(t)){e.push(t);continue}let n=this.buildFlushPayload(t);this.send({...t,payload:n})}this.queue=e}log(...e){this.options.debug&&console.log(`[OpenPanel.dev]`,...e)}};function xt(){return()=>{}}var St=n((()=>{})),Ct=r({startReplayRecorder:()=>wt,stopReplayRecorder:()=>Tt});function wt(e,t){if(typeof document>`u`||typeof window>`u`)return;Q&&Q();let n=e.maxEventsPerChunk??200,r=e.flushIntervalMs??1e4,i=e.maxPayloadBytes??1048576,a=[],o=0,s=null;function c(e){if(a.length===0)return;let n=JSON.stringify(a);if(new TextEncoder().encode(n).length>i){if(a.length>1){let t=Math.floor(a.length/2),n=a.slice(0,t),r=a.slice(t),i=e&&n.some(e=>e.type===2);a=n,c(i),a=r,c(!1);return}a=[];return}let r=a[0].timestamp,s=a[a.length-1].timestamp;try{t({chunk_index:o,events_count:a.length,is_full_snapshot:e,started_at:new Date(r).toISOString(),ended_at:new Date(s).toISOString(),payload:n}),o+=1,a=[]}catch(e){throw console.error(`[ReplayRecorder] sendChunk failed`,e),e}}function l(e){let t=e||a.some(e=>e.type===2);a.length>=n?c(t):e&&a.length>0&&c(!0)}let u=e.maskAllText!==!1,d=e.unmaskTextSelector,f=xt({emit(e,t){a.push(e),l(!!t)},checkoutEveryNms:r,maskAllInputs:e.maskAllInputs??!0,maskTextSelector:u?`*`:`[data-openpanel-replay-mask]`,maskTextFn:u&&d?(e,t)=>t?.closest(d)?e:e.replace(/\S/g,`*`):void 0,blockSelector:e.blockSelector??`[data-openpanel-replay-block]`,blockClass:e.blockClass,ignoreSelector:e.ignoreSelector});s=setInterval(()=>{a.length>0&&c(a.some(e=>e.type===2))},r);function p(){document.visibilityState===`hidden`&&a.length>0&&c(a.some(e=>e.type===2))}function m(){a.length>0&&c(a.some(e=>e.type===2))}document.addEventListener(`visibilitychange`,p),window.addEventListener(`pagehide`,m),Q=()=>{a.length>0&&c(a.some(e=>e.type===2)),s&&=(clearInterval(s),null),document.removeEventListener(`visibilitychange`,p),window.removeEventListener(`pagehide`,m),f?.(),Q=null}}function Tt(){Q&&Q()}var Q,Et=n((()=>{St(),Q=null})),Dt=typeof document<`u`?document.currentScript:null;function Ot(e){return e.replace(/([-_][a-z])/gi,e=>e.toUpperCase().replace(`-`,``).replace(`_`,``))}var kt=class extends bt{constructor(e){if(super({sdk:`web`,sdkVersion:`1.4.1`,...e}),this.options=e,this.lastPath=``,this.pendingRevenues=[],!this.isServer()){try{let e=sessionStorage.getItem(`openpanel-pending-revenues`);if(e){let t=JSON.parse(e);Array.isArray(t)&&(this.pendingRevenues=t)}}catch{this.pendingRevenues=[]}if(this.setGlobalProperties({__referrer:document.referrer}),this.options.trackScreenViews&&(this.trackScreenViews(),setTimeout(()=>this.screenView(),0)),this.options.trackOutgoingLinks&&this.trackOutgoingLinks(),this.options.trackAttributes&&this.trackAttributes(),this.options.sessionReplay?.enabled){let e=this.options.sessionReplay.sampleRate??1;Math.random()<e&&this.loadReplayModule().then(e=>{e&&e.startReplayRecorder(this.options.sessionReplay,e=>{this.send({type:`replay`,payload:{...e}})})})}}}async loadReplayModule(){try{if(typeof __OPENPANEL_REPLAY_URL__<`u`){let e=Dt,t=this.options.sessionReplay?.scriptUrl||e?.src?.replace(`.js`,`-replay.js`)||`https://openpanel.dev/op1-replay.js`;return window.__openpanel_replay?window.__openpanel_replay:new Promise(e=>{let n=document.createElement(`script`);n.src=t,n.onload=()=>{e(window.__openpanel_replay??null)},n.onerror=()=>{console.warn(`[OpenPanel] Failed to load replay script from`,t),e(null)},document.head.appendChild(n)})}return await Promise.resolve().then(()=>(Et(),Ct))}catch(e){return console.warn(`[OpenPanel] Failed to load replay module`,e),null}}debounce(e,t){clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(e,t)}isServer(){return typeof document>`u`}trackOutgoingLinks(){this.isServer()||document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`a`);if(n&&t){let e=n.getAttribute(`href`);if(e?.startsWith(`http`))try{let r=new URL(e),i=window.location.hostname;r.hostname!==i&&super.track(`link_out`,{href:e,text:n.innerText||n.getAttribute(`title`)||t.getAttribute(`alt`)||t.getAttribute(`title`)})}catch{}}})}trackScreenViews(){if(this.isServer())return;let e=history.pushState;history.pushState=function(...t){let n=e.apply(this,t);return window.dispatchEvent(new Event(`pushstate`)),window.dispatchEvent(new Event(`locationchange`)),n};let t=history.replaceState;history.replaceState=function(...e){let n=t.apply(this,e);return window.dispatchEvent(new Event(`replacestate`)),window.dispatchEvent(new Event(`locationchange`)),n},window.addEventListener(`popstate`,()=>{window.dispatchEvent(new Event(`locationchange`))});let n=()=>this.debounce(()=>this.screenView(),50);this.options.trackHashChanges?window.addEventListener(`hashchange`,n):window.addEventListener(`locationchange`,n)}trackAttributes(){this.isServer()||document.addEventListener(`click`,e=>{let t=e.target,n=t.closest(`button`),r=t.closest(`a`),i=n?.getAttribute(`data-track`)?n:r?.getAttribute(`data-track`)?r:null;if(i){let e={};for(let t of i.attributes)t.name.startsWith(`data-`)&&t.name!==`data-track`&&(e[Ot(t.name.replace(/^data-/,``))]=t.value);let t=i.getAttribute(`data-track`);t&&super.track(t,e)}})}track(e,t){return super.track(e,{...t,__path:this.lastPath})}screenView(e,t){if(this.isServer())return;let n,r;typeof e==`string`?(n=e,r=t):(n=window.location.href,r=e),this.lastPath!==n&&(this.lastPath=n,super.track(`screen_view`,{...r??{},__path:n,__title:document.title}))}async flushRevenue(){let e=this.pendingRevenues.map(e=>super.revenue(e.amount,e.properties));await Promise.all(e),this.clearRevenue()}clearRevenue(){if(this.pendingRevenues=[],!this.isServer())try{sessionStorage.removeItem(`openpanel-pending-revenues`)}catch{}}pendingRevenue(e,t){if(this.pendingRevenues.push({amount:e,properties:t}),!this.isServer())try{sessionStorage.setItem(`openpanel-pending-revenues`,JSON.stringify(this.pendingRevenues))}catch{}}};function At(e,t){if(typeof window>`u`)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`))}let jt=K&&Je;function Mt(e){e?localStorage.setItem(W,e):localStorage.removeItem(W)}function $(e,t){try{let n=new URL(e);if(!n.searchParams.has(`u`))return e;let r=Ft(window.location.href,t);return n.searchParams.delete(`u`),n.searchParams.append(`u`,r),n.toString()}catch{return e}}function Nt(e){let t=new URL(window.location.href);e&&t.searchParams.set(`fmt`,e);let n=t.protocol===`http:`?`x-safari-http`:`x-safari-https`;window.location.href=`${n}://${t.host}${t.pathname}${t.search}${t.hash}`}function Pt(e){return e.includes(`/common/social`)}function Ft(e,t){if(!t)return e;try{let n=new URL(e);return n.searchParams.set(`fmt`,t),n.toString()}catch{return`${e}${e.includes(`?`)?`&`:`?`}fmt=${encodeURIComponent(t)}`}}function It(e,t,n,r,i){if(i){let e=$(t,r);window.open(e,`_blank`);return}if(We(t)){let i=$(t,r);Ue(i,{onFallback:()=>{e.contentWindow?.postMessage({clientLifecycle:`deep-link-failed`,data:{originalUrl:i}},n)}})}else if(jt&&Pt(t))Nt(r);else{let e=$(t,r);window.location.href=e}}function Lt({iframe:e,targetOrigin:t}){let n=new k;return{handleEvent:r=>{if(!(`iframeLifecycle`in r))return;let{iframeLifecycle:i,data:a}=r;switch(i){case`connected`:n.resolve(!0);break;case`do-backup`:Mt(a.backup);break;case`remove-backup`:localStorage.removeItem(W);break;case`show`:case`hide`:nt({iframe:e,isVisible:i===`show`});break;case`redirect`:It(e,a.baseRedirectUrl,t,a.mergeToken,a.openInNewTab);break}},isConnected:n.promise}}function Rt({config:e,iframe:t}){let n=e?.walletUrl??`https://wallet.frak.id`,r=typeof navigator<`u`?navigator.language?.split(`-`)[0]:void 0,i=e.metadata.lang??(r===`en`||r===`fr`?r:void 0),a=e.domain??(typeof window<`u`?window.location.hostname:``);D.setCacheScope(a,i),D.reset();let o=D.isCacheFresh?void 0:D.resolve(e.domain,e.walletUrl,i),s=Lt({iframe:t,targetOrigin:n}),c=new k,l=Date.now();if(!t.contentWindow)throw new O(pe.configError,`The iframe does not have a content window`);let u=me({emittingTransport:t.contentWindow,listeningTransport:window,targetOrigin:n,middleware:[{async onRequest(e,t){if(!await s.isConnected)throw new O(pe.clientNotConnected,`The iframe provider isn't connected yet`);return await c.promise,t}}],lifecycleHandlers:{iframeLifecycle:(e,t)=>{s.handleEvent(e)}}}),d=zt(u,s),f=async()=>{d(),u.cleanup(),t.remove(),_(),D.clearCache(),D.reset()},m;{console.log(`[Frak SDK] Initializing OpenPanel`),m=new kt({apiUrl:`https://op-api.gcp.frak.id`,clientId:`6eacc8d7-49ac-4936-95e9-81ef29449570`,trackScreenViews:!0,trackOutgoingLinks:!0,trackAttributes:!1,filter:({type:e,payload:t})=>(e!==`track`||!t?.properties||`sdk_version`in t.properties||(t.properties={...t.properties,sdk_version:`1.1.5`,user_anonymous_client_id:p()}),!0)}),m.setGlobalProperties({sdk_version:`1.1.5`,user_anonymous_client_id:p()}),m.init(),m.track(`sdk_initialized`,{sdk_version:`1.1.5`});let e=!1,t=setTimeout(()=>{e||(e=!0,m?.track(`sdk_iframe_handshake_failed`,{reason:`timeout`}))},3e4);s.isConnected.then(()=>{e||(e=!0,clearTimeout(t),m?.track(`sdk_iframe_connected`,{handshake_duration_ms:Date.now()-l}))}).catch(()=>{e||(e=!0,clearTimeout(t),m?.track(`sdk_iframe_handshake_failed`,{reason:`unknown`}))})}let h=Bt({config:e,rpcClient:u,lifecycleManager:s,configPromise:o,contextSent:c,openPanel:m}).then(()=>{}).catch(e=>{throw c.reject(e),e});return{config:e,waitForConnection:s.isConnected,waitForSetup:h,request:u.request,listenerRequest:u.listen,destroy:f,openPanel:m}}function zt(e,t){let n,r,i=()=>e.sendLifecycle({clientLifecycle:`heartbeat`});async function a(){i(),n=setInterval(i,250),r=setTimeout(()=>{o(),console.log(`Heartbeat timeout: connection failed`)},3e4),await t.isConnected,o()}function o(){n&&clearInterval(n),r&&clearTimeout(r)}return a(),o}async function Bt({config:e,rpcClient:t,lifecycleManager:n,configPromise:r,contextSent:i,openPanel:a}){await n.isConnected,At(t,n.isConnected);let o=new URL(window.location.href),s=o.searchParams.get(`fmt`)??void 0;s&&(o.searchParams.delete(`fmt`),window.history.replaceState({},``,o.toString()));let c=t=>{let n=t?.merchantId??e.metadata.merchantId??``,r=t?.domain??``,i=t?.allowedDomains??[],a=t?.sdkConfig,o=a?.attribution||e.attribution?{...e.attribution,...a?.attribution}:void 0;D.setConfig(a?{isResolved:!0,merchantId:n,domain:r,allowedDomains:i,hasRawSdkConfig:!0,name:a.name??e.metadata.name,logoUrl:a.logoUrl??e.metadata.logoUrl,homepageLink:a.homepageLink??e.metadata.homepageLink,lang:a.lang??e.metadata.lang,currency:a.currency??e.metadata.currency,hidden:a.hidden,css:a.css,translations:a.translations,placements:a.placements,components:a.components,attribution:o}:{isResolved:!0,merchantId:n,domain:r,allowedDomains:i,name:e.metadata.name,logoUrl:e.metadata.logoUrl,homepageLink:e.metadata.homepageLink,lang:e.metadata.lang,currency:e.metadata.currency,attribution:o})},l=!1,u=e=>{let n=l?void 0:s;l=!0;let r=e.hasRawSdkConfig?{name:e.name,logoUrl:e.logoUrl,homepageLink:e.homepageLink,lang:e.lang,currency:e.currency,hidden:e.hidden,css:e.css,translations:e.translations,placements:e.placements,attribution:e.attribution}:e.attribution?{attribution:e.attribution}:void 0,i=p();if(a){let t=a.global??{};a.setGlobalProperties({...t,merchant_id:e.merchantId,domain:e.domain??``})}t.sendLifecycle({clientLifecycle:`resolved-config`,data:{merchantId:e.merchantId,domain:e.domain??``,allowedDomains:e.allowedDomains??[],sourceUrl:window.location.href,...i&&{sdkAnonymousId:i},...n&&{pendingMergeToken:n},...r&&{sdkConfig:r}}})};D.isResolved&&(u(D.getConfig()),i.resolve()),r&&(c(await r),u(D.getConfig()),i.resolve());async function d(){let n=e.customizations?.css;n&&t.sendLifecycle({clientLifecycle:`modal-css`,data:{cssLink:n}})}async function f(){let n=e.customizations?.i18n;n&&t.sendLifecycle({clientLifecycle:`modal-i18n`,data:{i18n:n}})}async function m(){if(typeof window>`u`)return;let e=window.localStorage.getItem(W);e&&t.sendLifecycle({clientLifecycle:`restore-backup`,data:{backup:e}})}(await Promise.allSettled([d(),f(),m()])).some(e=>e.status===`rejected`)&&a?.track(`sdk_iframe_handshake_failed`,{reason:`asset_push`})}async function Vt({config:e}){let t=Ht(e),n=await et({config:t});if(!n){console.error(`Failed to create iframe`);return}let r=Rt({config:t,iframe:n});if(await r.waitForSetup,!await r.waitForConnection){console.error(`Failed to connect to client`);return}return r}function Ht(e){let t=J(e.metadata?.currency);return{...e,metadata:{...e.metadata,currency:t}}}return e.DEEP_LINK_SCHEME=G,e.FrakContextManager=H,e.REFERRAL_SUCCESS_EVENT=ut,e.base64urlDecode=j,e.base64urlEncode=A,e.baseIframeProps=Y,e.clearAllCache=_,e.compressJsonToB64=_e,e.createIFrameFrakClient=Rt,e.decompressJsonFromB64=Xe,e.deleteQueryParamCaseInsensitive=P,e.displayEmbeddedWallet=i,e.displayModal=a,e.displaySharingPage=o,e.ensureIdentity=le,e.findIframeInOpener=rt,e.formatAmount=Qe,e.generateSsoUrl=ve,e.getBackendUrl=u,e.getClientId=p,e.getCurrencyAmountKey=$e,e.getMerchantInformation=ue,e.getMergeToken=de,e.getQueryParamCaseInsensitive=Ae,e.getSupportedCurrency=J,e.getUserReferralStatus=fe,e.isIOS=K,e.isInAppBrowser=Je,e.isMobile=Ke,e.mergeAttribution=ze,e.modalBuilder=ht,e.openSso=Se,e.prepareSso=Ce,e.processReferral=ct,e.redirectToExternalBrowser=Ye,e.referralInteraction=lt,e.sdkConfigStore=D,e.sendInteraction=X,e.sendTransaction=gt,e.setupClient=Vt,e.setupReferral=dt,e.siweAuthenticate=vt,e.ssoPopupFeatures=be,e.ssoPopupName=xe,e.trackEvent=U,e.trackPurchaseStatus=ft,e.triggerDeepLinkWithFallback=Ue,e.watchWalletStatus=pt,e.withCache=g,e})({});
@@ -0,0 +1,2 @@
1
+ const e=require(`./frakContext-CeVlWFcX.cjs`);let t=require(`@frak-labs/frame-connector`);async function n(e,t,n){return await e.request({method:`frak_displayEmbeddedWallet`,params:n?[t,e.config.metadata,n]:[t,e.config.metadata]})}async function r(e,{steps:t,metadata:n},r){return await e.request({method:`frak_displayModal`,params:r?[t,n,e.config.metadata,r]:[t,n,e.config.metadata]})}async function i(e,t,n){return await e.request({method:`frak_displaySharingPage`,params:n?[t,e.config.metadata,n]:[t,e.config.metadata]})}async function a(t){if(typeof window>`u`)return;let n=e.y();if(!n)return;let r=await e.h.resolveMerchantId();if(!r)return;let i=`frak-identity-ensured-${r}`;if(!window.sessionStorage.getItem(i))try{let a=e.g();(await fetch(`${a}/user/identity/ensure`,{method:`POST`,headers:{Accept:`application/json`,"Content-Type":`application/json`,"x-wallet-sdk-auth":t,"x-frak-client-id":n},body:JSON.stringify({merchantId:r})})).ok&&window.sessionStorage.setItem(i,`1`)}catch{}}async function o(t,n){return e.v(()=>t.request({method:`frak_getMerchantInformation`}),{cacheKey:`frak_getMerchantInformation`,cacheTime:n?.cacheTime})}async function s(t,n){return e.v(()=>t.request({method:`frak_getMergeToken`}),{cacheKey:`frak_getMergeToken`,cacheTime:n?.cacheTime})}async function c(t,n){return e.v(()=>t.request({method:`frak_getUserReferralStatus`}),{cacheKey:`frak_getUserReferralStatus`,cacheTime:n?.cacheTime})}async function l(e,t){let{metadata:n,customizations:r}=e.config;return await e.request({method:`frak_prepareSso`,params:[t,n.name,r?.css]})}async function u(t,n){try{await t.request({method:`frak_sendInteraction`,params:[n,{clientId:e.y()}]})}catch{console.warn(`[Frak SDK] Failed to send interaction:`,n.type)}}function d(t,n,r){return e.r(n)?(e.s(t,`user_referred_started`,{referrer_client_id:n.c,referrer_wallet:n.w,wallet_status:r?.key}),u(t,{type:`arrival`,referrerClientId:n.c,referrerMerchantId:n.m,referrerWallet:n.w,referralTimestamp:n.t}),!0):e.n(n)?(e.s(t,`user_referred_started`,{referrer:n.r,wallet_status:r?.key}),u(t,{type:`arrival`,referrerWallet:n.r}),!0):!1}function f(t,n){let r=e.y();return!r&&!n?null:{v:2,m:t,t:Math.floor(Date.now()/1e3),...r?{c:r}:{},...n?{w:n}:{}}}function p(t,n){return e.r(t)?t.w&&n?.wallet?e.i(t.w,n.wallet):t.c?e.y()===t.c:!1:e.n(t)&&n?.wallet?e.i(t.r,n.wallet):!1}function m(t,{walletStatus:n,frakContext:r,options:i}){if(!r)return`no-referrer`;if(p(r,n))return`self-referral`;if(!d(t,r,n))return`no-referrer`;let a=e.r(r)?r.m:i?.merchantId,o=i?.alwaysAppendUrl&&a?f(a,n?.wallet):null;return e.t.replaceUrl({url:window.location?.href,context:o}),e.s(t,`user_referred_completed`,{status:`success`}),`success`}async function h(t,{options:n}={}){let r=e.t.parse({url:window.location.href}),i=await y(t);try{return m(t,{walletStatus:i,frakContext:r,options:n})}catch(e){console.warn(`Error processing referral`,{error:e})}}const g=`frak:referral-success`;async function _(e){try{await h(e)===`success`&&window.dispatchEvent(new Event(g))}catch(e){console.warn(`[Frak] Referral setup failed`,e)}}async function v(t){if(typeof window>`u`){console.warn(`[Frak] No window found, can't track purchase`);return}let n=window.sessionStorage.getItem(`frak-wallet-interaction-token`),r=e.y();if(!n&&!r){console.warn(`[Frak] No identity found, skipping purchase check`);return}let i=t.merchantId??await e.h.resolveMerchantId();if(!i){console.warn(`[Frak] No merchant id found, skipping purchase check`);return}let a={Accept:`application/json`,"Content-Type":`application/json`};n&&(a[`x-wallet-sdk-auth`]=n),r&&(a[`x-frak-client-id`]=r);let o=e.g();await fetch(`${o}/user/track/purchase`,{method:`POST`,headers:a,body:JSON.stringify({customerId:t.customerId,orderId:t.orderId,token:t.token,merchantId:i})})}function y(e,n){if(!n)return e.request({method:`frak_listenToWalletStatus`}).then(t=>(b(e,t),t));let r=new t.Deferred,i=!1;return e.listenerRequest({method:`frak_listenToWalletStatus`},t=>{b(e,t),n(t),i||=(r.resolve(t),!0)}),r.promise}function b(e,t){typeof window>`u`||(e.openPanel?.setGlobalProperties({wallet:t.wallet??null}),t.interactionToken?(window.sessionStorage.setItem(`frak-wallet-interaction-token`,t.interactionToken),a(t.interactionToken)):window.sessionStorage.removeItem(`frak-wallet-interaction-token`))}function x(e,{metadata:t,login:n}){return S(e,{steps:{login:n??{}},metadata:t})}function S(e,t){function n(n){return S(e,{...t,steps:{...t.steps,sendTransaction:n}})}function i(n){return S(e,{...t,steps:{...t.steps,final:{...n,action:{key:`reward`}}}})}function a(n,r){return S(e,{...t,steps:{...t.steps,final:{...r,action:{key:`sharing`,options:n}}}})}async function o(n,i){return n&&(t.metadata=n(t.metadata??{})),await r(e,t,i)}return{params:t,sendTx:n,reward:i,sharing:a,display:o}}async function C(e,{tx:t,metadata:n}){return(await r(e,{metadata:n,steps:{login:{},sendTransaction:{tx:t}}})).sendTransaction}function w(e=96){let t=Math.ceil(e/2),n=``;if(typeof crypto<`u`&&crypto.getRandomValues){let e=new Uint8Array(t);crypto.getRandomValues(e);for(let t=0;t<e.length;t++)n+=e[t].toString(16).padStart(2,`0`)}else for(let e=0;e<t;e++)n+=(Math.random()*256|0).toString(16).padStart(2,`0`);return n.substring(0,e)}async function T(e,{siwe:t,metadata:n}){let i=e.config?.domain??window.location.host,a=t?.statement??`I confirm that I want to use my Frak wallet on: ${e.config.metadata.name}`;return(await r(e,{metadata:n,steps:{login:{},siweAuthenticate:{siwe:{...t,statement:a,nonce:t?.nonce??w(),uri:t?.uri??`https://${i}`,version:t?.version??`1`,domain:i}}}})).siweAuthenticate}Object.defineProperty(exports,`_`,{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,`a`,{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,`c`,{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,`d`,{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,`f`,{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,`g`,{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,`h`,{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,`i`,{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,`l`,{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,`m`,{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,`n`,{enumerable:!0,get:function(){return C}}),Object.defineProperty(exports,`o`,{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,`p`,{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,`r`,{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,`s`,{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,`u`,{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,`v`,{enumerable:!0,get:function(){return n}});
2
+ //# sourceMappingURL=actions-DrZ_PIs1.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions-DrZ_PIs1.cjs","names":["getClientId","sdkConfigStore","getBackendUrl","withCache","withCache","withCache","getClientId","isV2Context","isV1Context","getClientId","areAddressesEqual","FrakContextManager","getClientId","sdkConfigStore","getBackendUrl","Deferred"],"sources":["../src/actions/displayEmbeddedWallet.ts","../src/actions/displayModal.ts","../src/actions/displaySharingPage.ts","../src/actions/ensureIdentity.ts","../src/actions/getMerchantInformation.ts","../src/actions/getMergeToken.ts","../src/actions/getUserReferralStatus.ts","../src/actions/prepareSso.ts","../src/actions/sendInteraction.ts","../src/actions/referral/processReferral.ts","../src/actions/referral/referralInteraction.ts","../src/actions/referral/setupReferral.ts","../src/actions/trackPurchaseStatus.ts","../src/actions/watchWalletStatus.ts","../src/actions/wrapper/modalBuilder.ts","../src/actions/wrapper/sendTransaction.ts","../src/actions/wrapper/siweAuthenticate.ts"],"sourcesContent":["import type {\n DisplayEmbeddedWalletParamsType,\n DisplayEmbeddedWalletResultType,\n FrakClient,\n} from \"../types\";\n\n/**\n * Function used to display the Frak embedded wallet popup\n * @param client - The current Frak Client\n * @param params - The parameter used to customise the embedded wallet\n * @param placement - Optional placement ID to associate with this display request\n * @returns The embedded wallet display result\n */\nexport async function displayEmbeddedWallet(\n client: FrakClient,\n params: DisplayEmbeddedWalletParamsType,\n placement?: string\n): Promise<DisplayEmbeddedWalletResultType> {\n return await client.request({\n method: \"frak_displayEmbeddedWallet\",\n params: placement\n ? [params, client.config.metadata, placement]\n : [params, client.config.metadata],\n });\n}\n","import type {\n DisplayModalParamsType,\n FrakClient,\n ModalRpcStepsResultType,\n ModalStepTypes,\n} from \"../types\";\n\n/**\n * Function used to display a modal\n * @param client - The current Frak Client\n * @param args\n * @param args.steps - The different steps of the modal\n * @param args.metadata - The metadata for the modal (customization, etc)\n * @param placement - Optional placement ID to associate with this modal display\n * @returns The result of each modal steps\n *\n * @description This function will display a modal to the user with the provided steps and metadata.\n *\n * @remarks\n * - The UI of the displayed modal can be configured with the `customCss` property in the `customizations.css` field of the top-level config.\n * - The `login` step will be automatically skipped if the user is already logged in. It's safe to include this step in all cases to ensure proper user state.\n * - Steps are automatically reordered in the following sequence:\n * 1. `login` (if needed)\n * 2. All other steps in the order specified\n * 3. `success` (if included, always last)\n *\n * @example\n * Simple sharing modal with steps:\n * 1. Login (Skipped if already logged in)\n * 2. Display a success message with sharing link option\n *\n * ```ts\n * const results = await displayModal(frakConfig, {\n * steps: {\n * // Simple login with no SSO, nor customization\n * login: { allowSso: false },\n * // Success message\n * final: {\n * action: { key: \"reward\" },\n * // Skip this step, it will be only displayed in the stepper within the modal\n * autoSkip: true,\n * },\n * },\n * });\n *\n * console.log(\"Login step - wallet\", results.login.wallet);\n * ```\n *\n * @example\n * A full modal example, with a few customization options, with the steps:\n * 1. Login (Skipped if already logged in)\n * 2. Authenticate via SIWE\n * 3. Send a transaction\n * 4. Display a success message with sharing link options\n *\n * ```ts\n * const results = await displayModal(frakConfig, {\n * steps: {\n * // Login step\n * login: {\n * allowSso: true,\n * ssoMetadata: {\n * logoUrl: \"https://my-app.com/logo.png\",\n * homepageLink: \"https://my-app.com\",\n * },\n * },\n * // Siwe authentication\n * siweAuthenticate: {\n * siwe: {\n * domain: \"my-app.com\",\n * uri: \"https://my-app.com/\",\n * nonce: generateSiweNonce(),\n * version: \"1\",\n * },\n * },\n * // Send batched transaction\n * sendTransaction: {\n * tx: [\n * { to: \"0xdeadbeef\", data: \"0xdeadbeef\" },\n * { to: \"0xdeadbeef\", data: \"0xdeadbeef\" },\n * ],\n * },\n * // Success message with sharing options\n * final: {\n * action: {\n * key: \"sharing\",\n * options: {\n * popupTitle: \"Share the app\",\n * text: \"Discover my super app website\",\n * link: \"https://my-app.com\",\n * },\n * },\n * dismissedMetadata: {\n * title: \"Dismiss\",\n * description: \"You won't be rewarded for this sharing action\",\n * },\n * },\n * },\n * metadata: {\n * // Header of desktop modals\n * header: {\n * title: \"My-App\",\n * icon: \"https://my-app.com/logo.png\",\n * },\n * // Context that will be present in every modal steps\n * context: \"My-app overkill flow\",\n * },\n * });\n * ```\n */\nexport async function displayModal<\n T extends ModalStepTypes[] = ModalStepTypes[],\n>(\n client: FrakClient,\n { steps, metadata }: DisplayModalParamsType<T>,\n placement?: string\n): Promise<ModalRpcStepsResultType<T>> {\n return (await client.request({\n method: \"frak_displayModal\",\n params: placement\n ? [steps, metadata, client.config.metadata, placement]\n : [steps, metadata, client.config.metadata],\n })) as ModalRpcStepsResultType<T>;\n}\n","import type {\n DisplaySharingPageParamsType,\n DisplaySharingPageResultType,\n FrakClient,\n} from \"../types\";\n\n/**\n * Function used to display a sharing page\n * @param client - The current Frak Client\n * @param params - The parameters to customize the sharing page (products, link override, metadata)\n * @param placement - Optional placement ID to associate with this display request\n * @returns The result indicating the user's action (shared, copied, or dismissed)\n *\n * @description This function will display a full-page sharing UI to the user,\n * showing product info, estimated rewards, sharing steps, FAQ, and share/copy buttons.\n * The sharing link is generated from the user's wallet context + merchant info.\n *\n * @remarks\n * - The promise resolves on the first user action (share or copy) but the page stays visible\n * - The user can continue to share/copy multiple times after the initial resolution\n * - Dismissing the page after a share/copy action is a no-op (promise already resolved)\n * - If the user dismisses without any action, the promise resolves with `{ action: \"dismissed\" }`\n *\n * @example\n * ```ts\n * const result = await displaySharingPage(frakClient, {\n * products: [\n * {\n * title: \"Babies camel cuir velours bout carré\",\n * imageUrl: \"https://example.com/product.jpg\",\n * },\n * ],\n * });\n *\n * console.log(\"User action:\", result.action); // \"shared\" | \"copied\" | \"dismissed\"\n * ```\n */\nexport async function displaySharingPage(\n client: FrakClient,\n params: DisplaySharingPageParamsType,\n placement?: string\n): Promise<DisplaySharingPageResultType> {\n return await client.request({\n method: \"frak_displaySharingPage\",\n params: placement\n ? [params, client.config.metadata, placement]\n : [params, client.config.metadata],\n });\n}\n","import { getBackendUrl } from \"../config/backendUrl\";\nimport { getClientId } from \"../config/clientId\";\nimport { sdkConfigStore } from \"../config/sdkConfigStore\";\n\nconst ENSURE_STORAGE_PREFIX = \"frak-identity-ensured-\";\n\n/**\n * Ensure the current wallet ↔ clientId link exists on the backend.\n *\n * Called automatically by {@link watchWalletStatus} when a connected wallet\n * status is received. Acts as a failsafe: if the primary merge (SSO, pairing,\n * login/register) missed or silently failed, this ensures the link is\n * eventually established.\n *\n * The call is:\n * - **Idempotent** — if already linked, backend returns immediately\n * - **Deduplicated** — only fires once per browser session per merchant\n * - **Fire-and-forget** — errors are logged but never thrown\n *\n * @param interactionToken - The SDK JWT from wallet status (x-wallet-sdk-auth)\n *\n * @example\n * ```ts\n * // Usually called automatically via watchWalletStatus side effect.\n * // Can also be called manually if needed:\n * await ensureIdentity(\"eyJhbGciOi...\");\n * ```\n */\nexport async function ensureIdentity(interactionToken: string): Promise<void> {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const clientId = getClientId();\n if (!clientId) {\n return;\n }\n\n const merchantId = await sdkConfigStore.resolveMerchantId();\n if (!merchantId) {\n return;\n }\n\n const storageKey = `${ENSURE_STORAGE_PREFIX}${merchantId}`;\n if (window.sessionStorage.getItem(storageKey)) {\n return;\n }\n\n try {\n const backendUrl = getBackendUrl();\n const response = await fetch(`${backendUrl}/user/identity/ensure`, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n \"x-wallet-sdk-auth\": interactionToken,\n \"x-frak-client-id\": clientId,\n },\n body: JSON.stringify({ merchantId }),\n });\n\n if (response.ok) {\n window.sessionStorage.setItem(storageKey, \"1\");\n }\n } catch {\n // Fire-and-forget — retry on next session\n }\n}\n","import type { FrakClient, GetMerchantInformationReturnType } from \"../types\";\nimport { withCache } from \"../utils/cache\";\n\n/**\n * Fetch the current merchant information (name, rewards, tiers) from the wallet iframe.\n *\n * Results are cached in memory for 30 seconds by default. Concurrent calls\n * while a request is in-flight are deduplicated automatically.\n *\n * @param client - The current Frak Client\n * @param options - Optional cache configuration\n * @param options.cacheTime - Time in ms to cache the result. Default: 30_000 (30s). Set to 0 to disable.\n * @returns The merchant information including available reward tiers\n *\n * @see {@link @frak-labs/core-sdk!index.GetMerchantInformationReturnType | `GetMerchantInformationReturnType`} for the return type shape\n */\nexport async function getMerchantInformation(\n client: FrakClient,\n options?: { cacheTime?: number }\n): Promise<GetMerchantInformationReturnType> {\n return withCache(\n () =>\n client.request({\n method: \"frak_getMerchantInformation\",\n }),\n {\n cacheKey: \"frak_getMerchantInformation\",\n cacheTime: options?.cacheTime,\n }\n );\n}\n","import type { FrakClient } from \"../types\";\nimport { withCache } from \"../utils/cache\";\n\n/**\n * Fetch a merge token for the current anonymous identity.\n *\n * Used by in-app browser redirect flows to preserve identity\n * when switching from a WebView to the system browser.\n * The token is appended as `?fmt=` to the redirect URL.\n *\n * Results are cached in memory for 30 seconds by default. Concurrent calls\n * while a request is in-flight are deduplicated automatically.\n *\n * @param client - The current Frak Client\n * @param options - Optional cache configuration\n * @param options.cacheTime - Time in ms to cache the result. Default: 30_000 (30s). Set to 0 to disable.\n * @returns The merge token string, or null if unavailable\n */\nexport async function getMergeToken(\n client: FrakClient,\n options?: { cacheTime?: number }\n): Promise<string | null> {\n return withCache(\n () =>\n client.request({\n method: \"frak_getMergeToken\",\n }),\n {\n cacheKey: \"frak_getMergeToken\",\n cacheTime: options?.cacheTime,\n }\n );\n}\n","import type { FrakClient, UserReferralStatusType } from \"../types\";\nimport { withCache } from \"../utils/cache\";\n\n/**\n * Fetch the current user's referral status on the current merchant.\n *\n * The listener resolves the user's identity (via clientId or wallet session)\n * and checks whether a referral link exists where the user is the referee.\n *\n * Results are cached in memory for 30 seconds by default. Concurrent calls\n * while a request is in-flight are deduplicated automatically.\n *\n * Returns `null` when the user's identity cannot be resolved.\n *\n * @param client - The current Frak Client\n * @param options - Optional cache configuration\n * @param options.cacheTime - Time in ms to cache the result. Default: 30_000 (30s). Set to 0 to disable.\n * @returns The user's referral status, or `null` if identity cannot be resolved\n *\n * @example\n * ```ts\n * const status = await getUserReferralStatus(client);\n * if (status?.isReferred) {\n * console.log(\"User was referred to this merchant\");\n * }\n * ```\n */\nexport async function getUserReferralStatus(\n client: FrakClient,\n options?: { cacheTime?: number }\n): Promise<UserReferralStatusType | null> {\n return withCache(\n () =>\n client.request({\n method: \"frak_getUserReferralStatus\",\n }),\n {\n cacheKey: \"frak_getUserReferralStatus\",\n cacheTime: options?.cacheTime,\n }\n );\n}\n","import type {\n FrakClient,\n PrepareSsoParamsType,\n PrepareSsoReturnType,\n} from \"../types\";\n\n/**\n * Generate SSO URL without opening popup\n *\n * This is a **synchronous**, client-side function that generates the SSO URL\n * without any RPC calls to the wallet iframe. Use this when you need:\n * - Custom URL modifications before opening popup\n * - Pre-generation for advanced popup strategies\n * - URL inspection/logging before SSO flow\n *\n * @param client - The current Frak Client\n * @param args - The SSO parameters\n * @returns Object containing the generated ssoUrl\n *\n * @example\n * ```ts\n * // Generate URL for inspection\n * const { ssoUrl } = prepareSso(client, {\n * metadata: { logoUrl: \"...\" },\n * directExit: true\n * });\n * console.log(\"Opening SSO:\", ssoUrl);\n *\n * // Add custom params\n * const customUrl = `${ssoUrl}&tracking=abc123`;\n * await openSso(client, { metadata, ssoPopupUrl: customUrl });\n * ```\n *\n * @remarks\n * For most use cases, just use `openSso()` which handles URL generation automatically.\n * Only use `prepareSso()` when you need explicit control over the URL.\n */\nexport async function prepareSso(\n client: FrakClient,\n args: PrepareSsoParamsType\n): Promise<PrepareSsoReturnType> {\n const { metadata, customizations } = client.config;\n\n return await client.request({\n method: \"frak_prepareSso\",\n params: [args, metadata.name, customizations?.css],\n });\n}\n","import { getClientId } from \"../config/clientId\";\nimport type { FrakClient } from \"../types\";\nimport type { SendInteractionParamsType } from \"../types/rpc/interaction\";\n\n/**\n * Send an interaction to the backend via the listener RPC.\n * Fire-and-forget: errors are caught and logged, not thrown.\n *\n * @param client - The Frak client instance\n * @param params - The interaction parameters\n *\n * @description Sends a user interaction event through the wallet iframe RPC. Supports three interaction types: arrival tracking, sharing events, and custom interactions.\n *\n * @example\n * Track a user arrival with referral attribution:\n * ```ts\n * await sendInteraction(client, {\n * type: \"arrival\",\n * referrerWallet: \"0x1234...abcd\",\n * landingUrl: window.location.href,\n * utmSource: \"twitter\",\n * utmMedium: \"social\",\n * utmCampaign: \"launch-2026\",\n * });\n * ```\n *\n * @example\n * Track a sharing event:\n * ```ts\n * await sendInteraction(client, { type: \"sharing\" });\n * ```\n *\n * @example\n * Send a custom interaction:\n * ```ts\n * await sendInteraction(client, {\n * type: \"custom\",\n * customType: \"newsletter_signup\",\n * data: { email: \"user@example.com\" },\n * });\n * ```\n */\nexport async function sendInteraction(\n client: FrakClient,\n params: SendInteractionParamsType\n): Promise<void> {\n try {\n await client.request({\n method: \"frak_sendInteraction\",\n params: [params, { clientId: getClientId() }],\n });\n } catch {\n // Silent failure - fire-and-forget\n console.warn(\"[Frak SDK] Failed to send interaction:\", params.type);\n }\n}\n","import { getClientId } from \"../../config/clientId\";\nimport { FrakContextManager } from \"../../context\";\nimport { areAddressesEqual } from \"../../context/address\";\nimport type {\n FrakClient,\n FrakContext,\n FrakContextV2,\n WalletStatusReturnType,\n} from \"../../types\";\nimport { isV1Context, isV2Context } from \"../../types\";\nimport { trackEvent } from \"../../utils\";\nimport { sendInteraction } from \"../sendInteraction\";\n\n/**\n * Options for the referral auto-interaction process.\n */\nexport type ProcessReferralOptions = {\n /**\n * If true, always replace the URL with the current user's referral context\n * so the next visitor gets referred by this user.\n * @defaultValue false\n */\n alwaysAppendUrl?: boolean;\n /**\n * Merchant ID for building the current user's referral context.\n * Required when `alwaysAppendUrl` is true and the incoming context is V1.\n * For V2 contexts, the merchantId is already embedded in the context.\n */\n merchantId?: string;\n};\n\n/**\n * The different states of the referral process.\n * @inline\n */\ntype ReferralState =\n | \"idle\"\n | \"processing\"\n | \"success\"\n | \"no-referrer\"\n | \"self-referral\";\n\n/**\n * Track an arrival event if the context version is recognized.\n * Sends both tracking analytics and the arrival interaction RPC.\n *\n * @returns true if the context was valid and tracked, false otherwise\n */\nfunction trackArrivalIfValid(\n client: FrakClient,\n frakContext: FrakContext,\n walletStatus?: WalletStatusReturnType\n): boolean {\n if (isV2Context(frakContext)) {\n trackEvent(client, \"user_referred_started\", {\n referrer_client_id: frakContext.c,\n referrer_wallet: frakContext.w,\n wallet_status: walletStatus?.key,\n });\n sendInteraction(client, {\n type: \"arrival\",\n referrerClientId: frakContext.c,\n referrerMerchantId: frakContext.m,\n referrerWallet: frakContext.w,\n referralTimestamp: frakContext.t,\n });\n return true;\n }\n\n if (isV1Context(frakContext)) {\n trackEvent(client, \"user_referred_started\", {\n referrer: frakContext.r,\n wallet_status: walletStatus?.key,\n });\n sendInteraction(client, {\n type: \"arrival\",\n referrerWallet: frakContext.r,\n });\n return true;\n }\n\n return false;\n}\n\n/**\n * Build a V2 context representing the current user for URL replacement.\n *\n * Emits both `c` (anonymous clientId) and `w` (wallet) when available — wallet\n * is the preferred identity signal and takes attribution precedence downstream.\n * Returns null when neither identifier is available.\n */\nfunction buildCurrentUserContext(\n merchantId: string,\n wallet?: WalletStatusReturnType[\"wallet\"]\n): FrakContextV2 | null {\n const clientId = getClientId();\n if (!clientId && !wallet) return null;\n return {\n v: 2,\n m: merchantId,\n t: Math.floor(Date.now() / 1000),\n ...(clientId ? { c: clientId } : {}),\n ...(wallet ? { w: wallet } : {}),\n };\n}\n\n/**\n * Client-side self-referral preflight check.\n * Prevents unnecessary backend round-trips for obvious self-referrals.\n */\nfunction isSelfReferral(\n frakContext: FrakContext,\n walletStatus?: WalletStatusReturnType\n): boolean {\n if (isV2Context(frakContext)) {\n // Wallet match takes precedence — it's the strongest signal we have.\n if (frakContext.w && walletStatus?.wallet) {\n return areAddressesEqual(frakContext.w, walletStatus.wallet);\n }\n if (frakContext.c) {\n return getClientId() === frakContext.c;\n }\n return false;\n }\n if (isV1Context(frakContext) && walletStatus?.wallet) {\n return areAddressesEqual(frakContext.r, walletStatus.wallet);\n }\n return false;\n}\n\n/**\n * Handle the full referral interaction flow:\n *\n * 1. Check if the user has been referred (if not, early exit)\n * 2. Preflight self-referral check (if yes, early exit)\n * 3. Track the arrival event\n * 4. Replace the current URL with the user's own referral context\n * 5. Return the resulting referral state\n *\n * @param client - The current Frak Client\n * @param args\n * @param args.walletStatus - The current user wallet status\n * @param args.frakContext - The referral context parsed from the URL\n * @param args.options - Options for URL replacement and merchant context\n * @returns The referral state\n *\n * @see {@link @frak-labs/core-sdk!ModalStepTypes} for modal step types\n */\nexport function processReferral(\n client: FrakClient,\n {\n walletStatus,\n frakContext,\n options,\n }: {\n walletStatus?: WalletStatusReturnType;\n frakContext?: FrakContext | null;\n options?: ProcessReferralOptions;\n }\n): ReferralState {\n if (!frakContext) {\n return \"no-referrer\";\n }\n\n if (isSelfReferral(frakContext, walletStatus)) {\n return \"self-referral\";\n }\n\n if (!trackArrivalIfValid(client, frakContext, walletStatus)) {\n return \"no-referrer\";\n }\n\n // V2 context embeds merchantId; V1 falls back to options\n const contextMerchantId = isV2Context(frakContext)\n ? frakContext.m\n : options?.merchantId;\n\n const replaceContext =\n options?.alwaysAppendUrl && contextMerchantId\n ? buildCurrentUserContext(contextMerchantId, walletStatus?.wallet)\n : null;\n\n FrakContextManager.replaceUrl({\n url: window.location?.href,\n context: replaceContext,\n });\n\n trackEvent(client, \"user_referred_completed\", {\n status: \"success\",\n });\n\n return \"success\";\n}\n","import { FrakContextManager } from \"../../context\";\nimport type { FrakClient } from \"../../types\";\nimport { watchWalletStatus } from \"../index\";\nimport {\n type ProcessReferralOptions,\n processReferral,\n} from \"./processReferral\";\n\n/**\n * Function used to handle referral interactions\n * @param client - The current Frak Client\n * @param args\n * @param args.options - Some options for the referral interaction\n *\n * @returns A promise with the resulting referral state, or undefined in case of an error\n *\n * @description This function will automatically handle the referral interaction process\n *\n * @see {@link processReferral} for more details on the automatic referral handling process\n */\nexport async function referralInteraction(\n client: FrakClient,\n {\n options,\n }: {\n options?: ProcessReferralOptions;\n } = {}\n) {\n // Get the current frak context\n const frakContext = FrakContextManager.parse({\n url: window.location.href,\n });\n\n // Get the current wallet status\n const currentWalletStatus = await watchWalletStatus(client);\n\n try {\n return processReferral(client, {\n walletStatus: currentWalletStatus,\n frakContext,\n options,\n });\n } catch (error) {\n console.warn(\"Error processing referral\", { error });\n }\n return;\n}\n","import type { FrakClient } from \"../../types\";\nimport { referralInteraction } from \"./referralInteraction\";\n\n/**\n * Custom event name dispatched on successful referral processing.\n *\n * Fired once per page load when a valid referral context is found in the URL\n * and successfully tracked. Consumers (e.g. `<frak-banner>`) listen for this\n * to display a referral success message.\n */\nexport const REFERRAL_SUCCESS_EVENT = \"frak:referral-success\";\n\n/**\n * Process referral context and emit a DOM event on success.\n *\n * - Calls {@link referralInteraction} to detect and track any referral in the URL\n * - On `\"success\"`, dispatches a bare {@link REFERRAL_SUCCESS_EVENT} on `window`\n * - Silently swallows errors (fire-and-forget during SDK init)\n *\n * @param client - The initialized Frak client\n */\nexport async function setupReferral(client: FrakClient): Promise<void> {\n try {\n const state = await referralInteraction(client);\n\n if (state === \"success\") {\n window.dispatchEvent(new Event(REFERRAL_SUCCESS_EVENT));\n }\n } catch (error) {\n console.warn(\"[Frak] Referral setup failed\", error);\n }\n}\n","import { getBackendUrl } from \"../config/backendUrl\";\nimport { getClientId } from \"../config/clientId\";\nimport { sdkConfigStore } from \"../config/sdkConfigStore\";\n\n/**\n * Function used to track the status of a purchase\n * when a purchase is tracked, the `purchaseCompleted` interactions will be automatically send for the user when we receive the purchase confirmation via webhook.\n *\n * @param args.customerId - The customer id that made the purchase (on your side)\n * @param args.orderId - The order id of the purchase (on your side)\n * @param args.token - The token of the purchase\n * @param args.merchantId - Optional explicit merchant id to use for the tracking request\n *\n * @description This function will send a request to the backend to listen for the purchase status.\n *\n * @example\n * async function trackPurchase(checkout) {\n * const payload = {\n * customerId: checkout.order.customer.id,\n * orderId: checkout.order.id,\n * token: checkout.token,\n * merchantId: \"your-merchant-id\",\n * };\n *\n * await trackPurchaseStatus(payload);\n * }\n *\n * @remarks\n * - Merchant id is resolved in this order: explicit `args.merchantId`, then `sdkConfigStore.resolveMerchantId()` (config store → sessionStorage → backend fetch).\n * - This function supports anonymous users and will use the `x-frak-client-id` header when available.\n * - At least one identity source must exist (`frak-wallet-interaction-token` or `x-frak-client-id`), otherwise the tracking request is skipped.\n * - This function will print a warning if used in a non-browser environment or if no identity / merchant id can be resolved.\n */\nexport async function trackPurchaseStatus(args: {\n customerId: string | number;\n orderId: string | number;\n token: string;\n merchantId?: string;\n}) {\n if (typeof window === \"undefined\") {\n console.warn(\"[Frak] No window found, can't track purchase\");\n return;\n }\n\n const interactionToken = window.sessionStorage.getItem(\n \"frak-wallet-interaction-token\"\n );\n\n const clientId = getClientId();\n if (!interactionToken && !clientId) {\n console.warn(\"[Frak] No identity found, skipping purchase check\");\n return;\n }\n\n const merchantId =\n args.merchantId ?? (await sdkConfigStore.resolveMerchantId());\n\n if (!merchantId) {\n console.warn(\"[Frak] No merchant id found, skipping purchase check\");\n return;\n }\n\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n };\n\n if (interactionToken) {\n headers[\"x-wallet-sdk-auth\"] = interactionToken;\n }\n\n if (clientId) {\n headers[\"x-frak-client-id\"] = clientId;\n }\n\n // Submit the listening request\n const backendUrl = getBackendUrl();\n await fetch(`${backendUrl}/user/track/purchase`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n customerId: args.customerId,\n orderId: args.orderId,\n token: args.token,\n merchantId,\n }),\n });\n}\n","import { Deferred } from \"@frak-labs/frame-connector\";\nimport type { FrakClient } from \"../types/client\";\nimport type { WalletStatusReturnType } from \"../types/rpc/walletStatus\";\nimport { ensureIdentity } from \"./ensureIdentity\";\n\n/**\n * Function used to watch the current frak wallet status\n * @param client - The current Frak Client\n * @param callback - The callback that will receive any wallet status change\n * @returns A promise resolving with the initial wallet status\n *\n * @description This function will return the current wallet status, and will listen to any change in the wallet status.\n *\n * @example\n * await watchWalletStatus(frakConfig, (status: WalletStatusReturnType) => {\n * if (status.key === \"connected\") {\n * console.log(\"Wallet connected:\", status.wallet);\n * } else {\n * console.log(\"Wallet not connected\");\n * }\n * });\n */\nexport function watchWalletStatus(\n client: FrakClient,\n callback?: (status: WalletStatusReturnType) => void\n): Promise<WalletStatusReturnType> {\n // If no callback is provided, just do a request with deferred result\n if (!callback) {\n return client\n .request({ method: \"frak_listenToWalletStatus\" })\n .then((result) => {\n // Handle side effects of this request\n walletStatusSideEffect(client, result);\n\n // Return the result\n return result;\n });\n }\n\n // Otherwise, listen to the wallet status and return the first one received\n const firstResult = new Deferred<WalletStatusReturnType>();\n let hasResolved = false;\n\n // Start the listening request, and return the first result\n client.listenerRequest(\n {\n method: \"frak_listenToWalletStatus\",\n },\n (status) => {\n // Handle side effects of this request\n walletStatusSideEffect(client, status);\n\n // Transmit the status to the callback\n callback(status);\n\n // If the promise hasn't resolved yet, resolve it\n if (!hasResolved) {\n firstResult.resolve(status);\n hasResolved = true;\n }\n }\n );\n\n return firstResult.promise;\n}\n\n/**\n * Helper to save a potential interaction token\n * @param interactionToken\n */\nfunction walletStatusSideEffect(\n client: FrakClient,\n status: WalletStatusReturnType\n) {\n if (typeof window === \"undefined\") {\n return;\n }\n\n // Update the global properties\n client.openPanel?.setGlobalProperties({\n wallet: status.wallet ?? null,\n });\n\n if (status.interactionToken) {\n window.sessionStorage.setItem(\n \"frak-wallet-interaction-token\",\n status.interactionToken\n );\n ensureIdentity(status.interactionToken);\n } else {\n window.sessionStorage.removeItem(\"frak-wallet-interaction-token\");\n }\n}\n","import type {\n DisplayModalParamsType,\n FinalActionType,\n FinalModalStepType,\n FrakClient,\n LoginModalStepType,\n ModalRpcMetadata,\n ModalRpcStepsResultType,\n ModalStepTypes,\n SendTransactionModalStepType,\n} from \"../../types\";\nimport { displayModal } from \"../displayModal\";\n\n/**\n * Represent the type of the modal step builder\n */\nexport type ModalStepBuilder<\n Steps extends ModalStepTypes[] = ModalStepTypes[],\n> = {\n /**\n * The current modal params\n */\n params: DisplayModalParamsType<Steps>;\n /**\n * Add a send transaction step to the modal\n */\n sendTx: (\n options: SendTransactionModalStepType[\"params\"]\n ) => ModalStepBuilder<[...Steps, SendTransactionModalStepType]>;\n /**\n * Add a final step of type reward to the modal\n */\n reward: (\n options?: Omit<FinalModalStepType[\"params\"], \"action\">\n ) => ModalStepBuilder<[...Steps, FinalModalStepType]>;\n /**\n * Add a final step of type sharing to the modal\n */\n sharing: (\n sharingOptions?: Extract<\n FinalActionType,\n { key: \"sharing\" }\n >[\"options\"],\n options?: Omit<FinalModalStepType[\"params\"], \"action\">\n ) => ModalStepBuilder<[...Steps, FinalModalStepType]>;\n /**\n * Display the modal\n * @param metadataOverride - Function returning optional metadata to override the current modal metadata\n * @param placement - Optional placement ID to associate with this modal display\n */\n display: (\n metadataOverride?: (\n current?: ModalRpcMetadata\n ) => ModalRpcMetadata | undefined,\n placement?: string\n ) => Promise<ModalRpcStepsResultType<Steps>>;\n};\n\n/**\n * Represent the output type of the modal builder\n */\nexport type ModalBuilder = ModalStepBuilder<[LoginModalStepType]>;\n\n/**\n * Helper to craft Frak modal, and share a base initial config\n * @param client - The current Frak Client\n * @param args\n * @param args.metadata - Common modal metadata (customisation, language etc)\n * @param args.login - Login step parameters\n *\n * @description This function will create a modal builder with the provided metadata and login parameters.\n *\n * @example\n * Here is an example of how to use the `modalBuilder` to create and display a sharing modal:\n *\n * ```js\n * // Create the modal builder\n * const modalBuilder = window.FrakSDK.modalBuilder(frakClient, baseModalConfig);\n *\n * // Configure the information to be shared via the sharing link\n * const sharingConfig = {\n * popupTitle: \"Share this with your friends\",\n * text: \"Discover our product!\",\n * link: window.location.href,\n * };\n *\n * // Display the sharing modal\n * function modalShare() {\n * modalBuilder.sharing(sharingConfig).display();\n * }\n * ```\n *\n * @see {@link ModalStepTypes} for more info about each modal step types and their parameters\n * @see {@link ModalRpcMetadata} for more info about the metadata that can be passed to the modal\n * @see {@link ModalRpcStepsResultType} for more info about the result of each modal steps\n * @see {@link displayModal} for more info about how the modal is displayed\n */\nexport function modalBuilder(\n client: FrakClient,\n {\n metadata,\n login,\n }: {\n metadata?: ModalRpcMetadata;\n login?: LoginModalStepType[\"params\"];\n }\n): ModalBuilder {\n // Build the initial modal params\n const baseParams: DisplayModalParamsType<[LoginModalStepType]> = {\n steps: {\n login: login ?? {},\n },\n metadata,\n };\n\n // Return the step builder\n return modalStepsBuilder(client, baseParams);\n}\n\n/**\n * Modal step builder, allowing to add new steps to the modal, and to build and display it\n */\nfunction modalStepsBuilder<CurrentSteps extends ModalStepTypes[]>(\n client: FrakClient,\n params: DisplayModalParamsType<CurrentSteps>\n): ModalStepBuilder<CurrentSteps> {\n // Function add the send tx step\n function sendTx(options: SendTransactionModalStepType[\"params\"]) {\n return modalStepsBuilder<\n [...CurrentSteps, SendTransactionModalStepType]\n >(client, {\n ...params,\n steps: {\n ...params.steps,\n sendTransaction: options,\n },\n } as DisplayModalParamsType<\n [...CurrentSteps, SendTransactionModalStepType]\n >);\n }\n\n // Function to add a reward step at the end\n function reward(options?: Omit<FinalModalStepType[\"params\"], \"action\">) {\n return modalStepsBuilder<[...CurrentSteps, FinalModalStepType]>(\n client,\n {\n ...params,\n steps: {\n ...params.steps,\n final: {\n ...options,\n action: { key: \"reward\" },\n },\n },\n } as DisplayModalParamsType<[...CurrentSteps, FinalModalStepType]>\n );\n }\n\n // Function to add sharing step at the end\n function sharing(\n sharingOptions?: Extract<\n FinalActionType,\n { key: \"sharing\" }\n >[\"options\"],\n options?: Omit<FinalModalStepType[\"params\"], \"action\">\n ) {\n return modalStepsBuilder<[...CurrentSteps, FinalModalStepType]>(\n client,\n {\n ...params,\n steps: {\n ...params.steps,\n final: {\n ...options,\n action: { key: \"sharing\", options: sharingOptions },\n },\n },\n } as DisplayModalParamsType<[...CurrentSteps, FinalModalStepType]>\n );\n }\n\n async function display(\n metadataOverride?: (\n current?: ModalRpcMetadata\n ) => ModalRpcMetadata | undefined,\n placement?: string\n ) {\n if (metadataOverride) {\n params.metadata = metadataOverride(params.metadata ?? {});\n }\n return await displayModal(client, params, placement);\n }\n\n return {\n params,\n sendTx,\n reward,\n sharing,\n display,\n };\n}\n","import type {\n FrakClient,\n ModalRpcMetadata,\n SendTransactionModalStepType,\n SendTransactionReturnType,\n} from \"../../types\";\nimport { displayModal } from \"../displayModal\";\n\n/**\n * Parameters to directly show a modal used to send a transaction\n * @inline\n */\nexport type SendTransactionParams = {\n /**\n * The transaction to be sent (either a single tx or multiple ones)\n */\n tx: SendTransactionModalStepType[\"params\"][\"tx\"];\n /**\n * Custom metadata to be passed to the modal\n */\n metadata?: ModalRpcMetadata;\n};\n\n/**\n * Function used to send a user transaction, simple wrapper around the displayModal function to ease the send transaction process\n * @param client - The current Frak Client\n * @param args - The parameters\n * @returns The hash of the transaction that was sent in a promise\n *\n * @description This function will display a modal to the user with the provided transaction and metadata.\n *\n * @example\n * const { hash } = await sendTransaction(frakConfig, {\n * tx: {\n * to: \"0xdeadbeef\",\n * value: toHex(100n),\n * },\n * metadata: {\n * header: {\n * title: \"Sending eth\",\n * },\n * context: \"Send 100wei to 0xdeadbeef\",\n * },\n * });\n * console.log(\"Transaction hash:\", hash);\n */\nexport async function sendTransaction(\n client: FrakClient,\n { tx, metadata }: SendTransactionParams\n): Promise<SendTransactionReturnType> {\n // Trigger a modal with login options\n const result = await displayModal(client, {\n metadata,\n steps: {\n login: {},\n sendTransaction: { tx },\n },\n });\n\n // Return the tx result only\n return result.sendTransaction;\n}\n","import type {\n FrakClient,\n ModalRpcMetadata,\n SiweAuthenticateReturnType,\n SiweAuthenticationParams,\n} from \"../../types\";\nimport { displayModal } from \"../displayModal\";\n\n/**\n * Generate a random EIP-4361-compatible nonce.\n *\n * Matches viem/siwe's `generateSiweNonce` shape (96 alphanumeric chars) but\n * inlined here to avoid pulling viem's runtime utilities into the bundle.\n * Uses `crypto.getRandomValues` when available (browsers, modern Node) and\n * falls back to `Math.random` for the rare environment without WebCrypto.\n */\nfunction generateSiweNonce(length = 96): string {\n const byteCount = Math.ceil(length / 2);\n let hex = \"\";\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n const bytes = new Uint8Array(byteCount);\n crypto.getRandomValues(bytes);\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i].toString(16).padStart(2, \"0\");\n }\n } else {\n for (let i = 0; i < byteCount; i++) {\n hex += ((Math.random() * 256) | 0).toString(16).padStart(2, \"0\");\n }\n }\n return hex.substring(0, length);\n}\n\n/**\n * Parameter used to directly show a modal used to authenticate with SIWE\n * @inline\n */\nexport type SiweAuthenticateModalParams = {\n /**\n * Partial SIWE params, since we can rebuild them from the SDK if they are empty\n *\n * If no parameters provider, some fields will be recomputed from the current configuration and environment.\n * - `statement` will be set to a default value\n * - `nonce` will be generated\n * - `uri` will be set to the current domain\n * - `version` will be set to \"1\"\n * - `domain` will be set to the current window domain\n *\n * @default {}\n */\n siwe?: Partial<SiweAuthenticationParams>;\n /**\n * Custom metadata to be passed to the modal\n */\n metadata?: ModalRpcMetadata;\n};\n\n/**\n * Function used to launch a siwe authentication\n * @param client - The current Frak Client\n * @param args - The parameters\n * @returns The SIWE authentication result (message + signature) in a promise\n *\n * @description This function will display a modal to the user with the provided SIWE parameters and metadata.\n *\n * @example\n * import { siweAuthenticate } from \"@frak-labs/core-sdk/actions\";\n * import { parseSiweMessage } from \"viem/siwe\";\n *\n * const { signature, message } = await siweAuthenticate(frakConfig, {\n * siwe: {\n * statement: \"Sign in to My App\",\n * domain: \"my-app.com\",\n * expirationTimeTimestamp: Date.now() + 1000 * 60 * 5,\n * },\n * metadata: {\n * header: {\n * title: \"Sign in\",\n * },\n * context: \"Sign in to My App\",\n * },\n * });\n * console.log(\"Parsed final message:\", parseSiweMessage(message));\n * console.log(\"Siwe signature:\", signature);\n */\nexport async function siweAuthenticate(\n client: FrakClient,\n { siwe, metadata }: SiweAuthenticateModalParams\n): Promise<SiweAuthenticateReturnType> {\n const effectiveDomain = client.config?.domain ?? window.location.host;\n const realStatement =\n siwe?.statement ??\n `I confirm that I want to use my Frak wallet on: ${client.config.metadata.name}`;\n\n // Fill up the siwe request params\n const builtSiwe: SiweAuthenticationParams = {\n ...siwe,\n statement: realStatement,\n nonce: siwe?.nonce ?? generateSiweNonce(),\n uri: siwe?.uri ?? `https://${effectiveDomain}`,\n version: siwe?.version ?? \"1\",\n domain: effectiveDomain,\n };\n\n // Trigger a modal with login options\n const result = await displayModal(client, {\n metadata,\n steps: {\n login: {},\n siweAuthenticate: {\n siwe: builtSiwe,\n },\n },\n });\n\n // Return the SIWE result only\n return result.siweAuthenticate;\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{g as e,h as t,i as n,n as r,r as i,s as a,t as o,v as s,y as c}from"./frakContext-Bgidv-Se.js";import{Deferred as l}from"@frak-labs/frame-connector";async function u(e,t,n){return await e.request({method:`frak_displayEmbeddedWallet`,params:n?[t,e.config.metadata,n]:[t,e.config.metadata]})}async function d(e,{steps:t,metadata:n},r){return await e.request({method:`frak_displayModal`,params:r?[t,n,e.config.metadata,r]:[t,n,e.config.metadata]})}async function f(e,t,n){return await e.request({method:`frak_displaySharingPage`,params:n?[t,e.config.metadata,n]:[t,e.config.metadata]})}async function p(n){if(typeof window>`u`)return;let r=c();if(!r)return;let i=await t.resolveMerchantId();if(!i)return;let a=`frak-identity-ensured-${i}`;if(!window.sessionStorage.getItem(a))try{let t=e();(await fetch(`${t}/user/identity/ensure`,{method:`POST`,headers:{Accept:`application/json`,"Content-Type":`application/json`,"x-wallet-sdk-auth":n,"x-frak-client-id":r},body:JSON.stringify({merchantId:i})})).ok&&window.sessionStorage.setItem(a,`1`)}catch{}}async function m(e,t){return s(()=>e.request({method:`frak_getMerchantInformation`}),{cacheKey:`frak_getMerchantInformation`,cacheTime:t?.cacheTime})}async function h(e,t){return s(()=>e.request({method:`frak_getMergeToken`}),{cacheKey:`frak_getMergeToken`,cacheTime:t?.cacheTime})}async function g(e,t){return s(()=>e.request({method:`frak_getUserReferralStatus`}),{cacheKey:`frak_getUserReferralStatus`,cacheTime:t?.cacheTime})}async function _(e,t){let{metadata:n,customizations:r}=e.config;return await e.request({method:`frak_prepareSso`,params:[t,n.name,r?.css]})}async function v(e,t){try{await e.request({method:`frak_sendInteraction`,params:[t,{clientId:c()}]})}catch{console.warn(`[Frak SDK] Failed to send interaction:`,t.type)}}function y(e,t,n){return i(t)?(a(e,`user_referred_started`,{referrer_client_id:t.c,referrer_wallet:t.w,wallet_status:n?.key}),v(e,{type:`arrival`,referrerClientId:t.c,referrerMerchantId:t.m,referrerWallet:t.w,referralTimestamp:t.t}),!0):r(t)?(a(e,`user_referred_started`,{referrer:t.r,wallet_status:n?.key}),v(e,{type:`arrival`,referrerWallet:t.r}),!0):!1}function b(e,t){let n=c();return!n&&!t?null:{v:2,m:e,t:Math.floor(Date.now()/1e3),...n?{c:n}:{},...t?{w:t}:{}}}function x(e,t){return i(e)?e.w&&t?.wallet?n(e.w,t.wallet):e.c?c()===e.c:!1:r(e)&&t?.wallet?n(e.r,t.wallet):!1}function S(e,{walletStatus:t,frakContext:n,options:r}){if(!n)return`no-referrer`;if(x(n,t))return`self-referral`;if(!y(e,n,t))return`no-referrer`;let s=i(n)?n.m:r?.merchantId,c=r?.alwaysAppendUrl&&s?b(s,t?.wallet):null;return o.replaceUrl({url:window.location?.href,context:c}),a(e,`user_referred_completed`,{status:`success`}),`success`}async function C(e,{options:t}={}){let n=o.parse({url:window.location.href}),r=await D(e);try{return S(e,{walletStatus:r,frakContext:n,options:t})}catch(e){console.warn(`Error processing referral`,{error:e})}}const w=`frak:referral-success`;async function T(e){try{await C(e)===`success`&&window.dispatchEvent(new Event(w))}catch(e){console.warn(`[Frak] Referral setup failed`,e)}}async function E(n){if(typeof window>`u`){console.warn(`[Frak] No window found, can't track purchase`);return}let r=window.sessionStorage.getItem(`frak-wallet-interaction-token`),i=c();if(!r&&!i){console.warn(`[Frak] No identity found, skipping purchase check`);return}let a=n.merchantId??await t.resolveMerchantId();if(!a){console.warn(`[Frak] No merchant id found, skipping purchase check`);return}let o={Accept:`application/json`,"Content-Type":`application/json`};r&&(o[`x-wallet-sdk-auth`]=r),i&&(o[`x-frak-client-id`]=i);let s=e();await fetch(`${s}/user/track/purchase`,{method:`POST`,headers:o,body:JSON.stringify({customerId:n.customerId,orderId:n.orderId,token:n.token,merchantId:a})})}function D(e,t){if(!t)return e.request({method:`frak_listenToWalletStatus`}).then(t=>(O(e,t),t));let n=new l,r=!1;return e.listenerRequest({method:`frak_listenToWalletStatus`},i=>{O(e,i),t(i),r||=(n.resolve(i),!0)}),n.promise}function O(e,t){typeof window>`u`||(e.openPanel?.setGlobalProperties({wallet:t.wallet??null}),t.interactionToken?(window.sessionStorage.setItem(`frak-wallet-interaction-token`,t.interactionToken),p(t.interactionToken)):window.sessionStorage.removeItem(`frak-wallet-interaction-token`))}function k(e,{metadata:t,login:n}){return A(e,{steps:{login:n??{}},metadata:t})}function A(e,t){function n(n){return A(e,{...t,steps:{...t.steps,sendTransaction:n}})}function r(n){return A(e,{...t,steps:{...t.steps,final:{...n,action:{key:`reward`}}}})}function i(n,r){return A(e,{...t,steps:{...t.steps,final:{...r,action:{key:`sharing`,options:n}}}})}async function a(n,r){return n&&(t.metadata=n(t.metadata??{})),await d(e,t,r)}return{params:t,sendTx:n,reward:r,sharing:i,display:a}}async function j(e,{tx:t,metadata:n}){return(await d(e,{metadata:n,steps:{login:{},sendTransaction:{tx:t}}})).sendTransaction}function M(e=96){let t=Math.ceil(e/2),n=``;if(typeof crypto<`u`&&crypto.getRandomValues){let e=new Uint8Array(t);crypto.getRandomValues(e);for(let t=0;t<e.length;t++)n+=e[t].toString(16).padStart(2,`0`)}else for(let e=0;e<t;e++)n+=(Math.random()*256|0).toString(16).padStart(2,`0`);return n.substring(0,e)}async function N(e,{siwe:t,metadata:n}){let r=e.config?.domain??window.location.host,i=t?.statement??`I confirm that I want to use my Frak wallet on: ${e.config.metadata.name}`;return(await d(e,{metadata:n,steps:{login:{},siweAuthenticate:{siwe:{...t,statement:i,nonce:t?.nonce??M(),uri:t?.uri??`https://${r}`,version:t?.version??`1`,domain:r}}}})).siweAuthenticate}export{d as _,E as a,C as c,_ as d,g as f,f as g,p as h,D as i,S as l,m,j as n,w as o,h as p,k as r,T as s,N as t,v as u,u as v};
2
+ //# sourceMappingURL=actions-HG5M8wX7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"actions-HG5M8wX7.js","names":[],"sources":["../src/actions/displayEmbeddedWallet.ts","../src/actions/displayModal.ts","../src/actions/displaySharingPage.ts","../src/actions/ensureIdentity.ts","../src/actions/getMerchantInformation.ts","../src/actions/getMergeToken.ts","../src/actions/getUserReferralStatus.ts","../src/actions/prepareSso.ts","../src/actions/sendInteraction.ts","../src/actions/referral/processReferral.ts","../src/actions/referral/referralInteraction.ts","../src/actions/referral/setupReferral.ts","../src/actions/trackPurchaseStatus.ts","../src/actions/watchWalletStatus.ts","../src/actions/wrapper/modalBuilder.ts","../src/actions/wrapper/sendTransaction.ts","../src/actions/wrapper/siweAuthenticate.ts"],"sourcesContent":["import type {\n DisplayEmbeddedWalletParamsType,\n DisplayEmbeddedWalletResultType,\n FrakClient,\n} from \"../types\";\n\n/**\n * Function used to display the Frak embedded wallet popup\n * @param client - The current Frak Client\n * @param params - The parameter used to customise the embedded wallet\n * @param placement - Optional placement ID to associate with this display request\n * @returns The embedded wallet display result\n */\nexport async function displayEmbeddedWallet(\n client: FrakClient,\n params: DisplayEmbeddedWalletParamsType,\n placement?: string\n): Promise<DisplayEmbeddedWalletResultType> {\n return await client.request({\n method: \"frak_displayEmbeddedWallet\",\n params: placement\n ? [params, client.config.metadata, placement]\n : [params, client.config.metadata],\n });\n}\n","import type {\n DisplayModalParamsType,\n FrakClient,\n ModalRpcStepsResultType,\n ModalStepTypes,\n} from \"../types\";\n\n/**\n * Function used to display a modal\n * @param client - The current Frak Client\n * @param args\n * @param args.steps - The different steps of the modal\n * @param args.metadata - The metadata for the modal (customization, etc)\n * @param placement - Optional placement ID to associate with this modal display\n * @returns The result of each modal steps\n *\n * @description This function will display a modal to the user with the provided steps and metadata.\n *\n * @remarks\n * - The UI of the displayed modal can be configured with the `customCss` property in the `customizations.css` field of the top-level config.\n * - The `login` step will be automatically skipped if the user is already logged in. It's safe to include this step in all cases to ensure proper user state.\n * - Steps are automatically reordered in the following sequence:\n * 1. `login` (if needed)\n * 2. All other steps in the order specified\n * 3. `success` (if included, always last)\n *\n * @example\n * Simple sharing modal with steps:\n * 1. Login (Skipped if already logged in)\n * 2. Display a success message with sharing link option\n *\n * ```ts\n * const results = await displayModal(frakConfig, {\n * steps: {\n * // Simple login with no SSO, nor customization\n * login: { allowSso: false },\n * // Success message\n * final: {\n * action: { key: \"reward\" },\n * // Skip this step, it will be only displayed in the stepper within the modal\n * autoSkip: true,\n * },\n * },\n * });\n *\n * console.log(\"Login step - wallet\", results.login.wallet);\n * ```\n *\n * @example\n * A full modal example, with a few customization options, with the steps:\n * 1. Login (Skipped if already logged in)\n * 2. Authenticate via SIWE\n * 3. Send a transaction\n * 4. Display a success message with sharing link options\n *\n * ```ts\n * const results = await displayModal(frakConfig, {\n * steps: {\n * // Login step\n * login: {\n * allowSso: true,\n * ssoMetadata: {\n * logoUrl: \"https://my-app.com/logo.png\",\n * homepageLink: \"https://my-app.com\",\n * },\n * },\n * // Siwe authentication\n * siweAuthenticate: {\n * siwe: {\n * domain: \"my-app.com\",\n * uri: \"https://my-app.com/\",\n * nonce: generateSiweNonce(),\n * version: \"1\",\n * },\n * },\n * // Send batched transaction\n * sendTransaction: {\n * tx: [\n * { to: \"0xdeadbeef\", data: \"0xdeadbeef\" },\n * { to: \"0xdeadbeef\", data: \"0xdeadbeef\" },\n * ],\n * },\n * // Success message with sharing options\n * final: {\n * action: {\n * key: \"sharing\",\n * options: {\n * popupTitle: \"Share the app\",\n * text: \"Discover my super app website\",\n * link: \"https://my-app.com\",\n * },\n * },\n * dismissedMetadata: {\n * title: \"Dismiss\",\n * description: \"You won't be rewarded for this sharing action\",\n * },\n * },\n * },\n * metadata: {\n * // Header of desktop modals\n * header: {\n * title: \"My-App\",\n * icon: \"https://my-app.com/logo.png\",\n * },\n * // Context that will be present in every modal steps\n * context: \"My-app overkill flow\",\n * },\n * });\n * ```\n */\nexport async function displayModal<\n T extends ModalStepTypes[] = ModalStepTypes[],\n>(\n client: FrakClient,\n { steps, metadata }: DisplayModalParamsType<T>,\n placement?: string\n): Promise<ModalRpcStepsResultType<T>> {\n return (await client.request({\n method: \"frak_displayModal\",\n params: placement\n ? [steps, metadata, client.config.metadata, placement]\n : [steps, metadata, client.config.metadata],\n })) as ModalRpcStepsResultType<T>;\n}\n","import type {\n DisplaySharingPageParamsType,\n DisplaySharingPageResultType,\n FrakClient,\n} from \"../types\";\n\n/**\n * Function used to display a sharing page\n * @param client - The current Frak Client\n * @param params - The parameters to customize the sharing page (products, link override, metadata)\n * @param placement - Optional placement ID to associate with this display request\n * @returns The result indicating the user's action (shared, copied, or dismissed)\n *\n * @description This function will display a full-page sharing UI to the user,\n * showing product info, estimated rewards, sharing steps, FAQ, and share/copy buttons.\n * The sharing link is generated from the user's wallet context + merchant info.\n *\n * @remarks\n * - The promise resolves on the first user action (share or copy) but the page stays visible\n * - The user can continue to share/copy multiple times after the initial resolution\n * - Dismissing the page after a share/copy action is a no-op (promise already resolved)\n * - If the user dismisses without any action, the promise resolves with `{ action: \"dismissed\" }`\n *\n * @example\n * ```ts\n * const result = await displaySharingPage(frakClient, {\n * products: [\n * {\n * title: \"Babies camel cuir velours bout carré\",\n * imageUrl: \"https://example.com/product.jpg\",\n * },\n * ],\n * });\n *\n * console.log(\"User action:\", result.action); // \"shared\" | \"copied\" | \"dismissed\"\n * ```\n */\nexport async function displaySharingPage(\n client: FrakClient,\n params: DisplaySharingPageParamsType,\n placement?: string\n): Promise<DisplaySharingPageResultType> {\n return await client.request({\n method: \"frak_displaySharingPage\",\n params: placement\n ? [params, client.config.metadata, placement]\n : [params, client.config.metadata],\n });\n}\n","import { getBackendUrl } from \"../config/backendUrl\";\nimport { getClientId } from \"../config/clientId\";\nimport { sdkConfigStore } from \"../config/sdkConfigStore\";\n\nconst ENSURE_STORAGE_PREFIX = \"frak-identity-ensured-\";\n\n/**\n * Ensure the current wallet ↔ clientId link exists on the backend.\n *\n * Called automatically by {@link watchWalletStatus} when a connected wallet\n * status is received. Acts as a failsafe: if the primary merge (SSO, pairing,\n * login/register) missed or silently failed, this ensures the link is\n * eventually established.\n *\n * The call is:\n * - **Idempotent** — if already linked, backend returns immediately\n * - **Deduplicated** — only fires once per browser session per merchant\n * - **Fire-and-forget** — errors are logged but never thrown\n *\n * @param interactionToken - The SDK JWT from wallet status (x-wallet-sdk-auth)\n *\n * @example\n * ```ts\n * // Usually called automatically via watchWalletStatus side effect.\n * // Can also be called manually if needed:\n * await ensureIdentity(\"eyJhbGciOi...\");\n * ```\n */\nexport async function ensureIdentity(interactionToken: string): Promise<void> {\n if (typeof window === \"undefined\") {\n return;\n }\n\n const clientId = getClientId();\n if (!clientId) {\n return;\n }\n\n const merchantId = await sdkConfigStore.resolveMerchantId();\n if (!merchantId) {\n return;\n }\n\n const storageKey = `${ENSURE_STORAGE_PREFIX}${merchantId}`;\n if (window.sessionStorage.getItem(storageKey)) {\n return;\n }\n\n try {\n const backendUrl = getBackendUrl();\n const response = await fetch(`${backendUrl}/user/identity/ensure`, {\n method: \"POST\",\n headers: {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n \"x-wallet-sdk-auth\": interactionToken,\n \"x-frak-client-id\": clientId,\n },\n body: JSON.stringify({ merchantId }),\n });\n\n if (response.ok) {\n window.sessionStorage.setItem(storageKey, \"1\");\n }\n } catch {\n // Fire-and-forget — retry on next session\n }\n}\n","import type { FrakClient, GetMerchantInformationReturnType } from \"../types\";\nimport { withCache } from \"../utils/cache\";\n\n/**\n * Fetch the current merchant information (name, rewards, tiers) from the wallet iframe.\n *\n * Results are cached in memory for 30 seconds by default. Concurrent calls\n * while a request is in-flight are deduplicated automatically.\n *\n * @param client - The current Frak Client\n * @param options - Optional cache configuration\n * @param options.cacheTime - Time in ms to cache the result. Default: 30_000 (30s). Set to 0 to disable.\n * @returns The merchant information including available reward tiers\n *\n * @see {@link @frak-labs/core-sdk!index.GetMerchantInformationReturnType | `GetMerchantInformationReturnType`} for the return type shape\n */\nexport async function getMerchantInformation(\n client: FrakClient,\n options?: { cacheTime?: number }\n): Promise<GetMerchantInformationReturnType> {\n return withCache(\n () =>\n client.request({\n method: \"frak_getMerchantInformation\",\n }),\n {\n cacheKey: \"frak_getMerchantInformation\",\n cacheTime: options?.cacheTime,\n }\n );\n}\n","import type { FrakClient } from \"../types\";\nimport { withCache } from \"../utils/cache\";\n\n/**\n * Fetch a merge token for the current anonymous identity.\n *\n * Used by in-app browser redirect flows to preserve identity\n * when switching from a WebView to the system browser.\n * The token is appended as `?fmt=` to the redirect URL.\n *\n * Results are cached in memory for 30 seconds by default. Concurrent calls\n * while a request is in-flight are deduplicated automatically.\n *\n * @param client - The current Frak Client\n * @param options - Optional cache configuration\n * @param options.cacheTime - Time in ms to cache the result. Default: 30_000 (30s). Set to 0 to disable.\n * @returns The merge token string, or null if unavailable\n */\nexport async function getMergeToken(\n client: FrakClient,\n options?: { cacheTime?: number }\n): Promise<string | null> {\n return withCache(\n () =>\n client.request({\n method: \"frak_getMergeToken\",\n }),\n {\n cacheKey: \"frak_getMergeToken\",\n cacheTime: options?.cacheTime,\n }\n );\n}\n","import type { FrakClient, UserReferralStatusType } from \"../types\";\nimport { withCache } from \"../utils/cache\";\n\n/**\n * Fetch the current user's referral status on the current merchant.\n *\n * The listener resolves the user's identity (via clientId or wallet session)\n * and checks whether a referral link exists where the user is the referee.\n *\n * Results are cached in memory for 30 seconds by default. Concurrent calls\n * while a request is in-flight are deduplicated automatically.\n *\n * Returns `null` when the user's identity cannot be resolved.\n *\n * @param client - The current Frak Client\n * @param options - Optional cache configuration\n * @param options.cacheTime - Time in ms to cache the result. Default: 30_000 (30s). Set to 0 to disable.\n * @returns The user's referral status, or `null` if identity cannot be resolved\n *\n * @example\n * ```ts\n * const status = await getUserReferralStatus(client);\n * if (status?.isReferred) {\n * console.log(\"User was referred to this merchant\");\n * }\n * ```\n */\nexport async function getUserReferralStatus(\n client: FrakClient,\n options?: { cacheTime?: number }\n): Promise<UserReferralStatusType | null> {\n return withCache(\n () =>\n client.request({\n method: \"frak_getUserReferralStatus\",\n }),\n {\n cacheKey: \"frak_getUserReferralStatus\",\n cacheTime: options?.cacheTime,\n }\n );\n}\n","import type {\n FrakClient,\n PrepareSsoParamsType,\n PrepareSsoReturnType,\n} from \"../types\";\n\n/**\n * Generate SSO URL without opening popup\n *\n * This is a **synchronous**, client-side function that generates the SSO URL\n * without any RPC calls to the wallet iframe. Use this when you need:\n * - Custom URL modifications before opening popup\n * - Pre-generation for advanced popup strategies\n * - URL inspection/logging before SSO flow\n *\n * @param client - The current Frak Client\n * @param args - The SSO parameters\n * @returns Object containing the generated ssoUrl\n *\n * @example\n * ```ts\n * // Generate URL for inspection\n * const { ssoUrl } = prepareSso(client, {\n * metadata: { logoUrl: \"...\" },\n * directExit: true\n * });\n * console.log(\"Opening SSO:\", ssoUrl);\n *\n * // Add custom params\n * const customUrl = `${ssoUrl}&tracking=abc123`;\n * await openSso(client, { metadata, ssoPopupUrl: customUrl });\n * ```\n *\n * @remarks\n * For most use cases, just use `openSso()` which handles URL generation automatically.\n * Only use `prepareSso()` when you need explicit control over the URL.\n */\nexport async function prepareSso(\n client: FrakClient,\n args: PrepareSsoParamsType\n): Promise<PrepareSsoReturnType> {\n const { metadata, customizations } = client.config;\n\n return await client.request({\n method: \"frak_prepareSso\",\n params: [args, metadata.name, customizations?.css],\n });\n}\n","import { getClientId } from \"../config/clientId\";\nimport type { FrakClient } from \"../types\";\nimport type { SendInteractionParamsType } from \"../types/rpc/interaction\";\n\n/**\n * Send an interaction to the backend via the listener RPC.\n * Fire-and-forget: errors are caught and logged, not thrown.\n *\n * @param client - The Frak client instance\n * @param params - The interaction parameters\n *\n * @description Sends a user interaction event through the wallet iframe RPC. Supports three interaction types: arrival tracking, sharing events, and custom interactions.\n *\n * @example\n * Track a user arrival with referral attribution:\n * ```ts\n * await sendInteraction(client, {\n * type: \"arrival\",\n * referrerWallet: \"0x1234...abcd\",\n * landingUrl: window.location.href,\n * utmSource: \"twitter\",\n * utmMedium: \"social\",\n * utmCampaign: \"launch-2026\",\n * });\n * ```\n *\n * @example\n * Track a sharing event:\n * ```ts\n * await sendInteraction(client, { type: \"sharing\" });\n * ```\n *\n * @example\n * Send a custom interaction:\n * ```ts\n * await sendInteraction(client, {\n * type: \"custom\",\n * customType: \"newsletter_signup\",\n * data: { email: \"user@example.com\" },\n * });\n * ```\n */\nexport async function sendInteraction(\n client: FrakClient,\n params: SendInteractionParamsType\n): Promise<void> {\n try {\n await client.request({\n method: \"frak_sendInteraction\",\n params: [params, { clientId: getClientId() }],\n });\n } catch {\n // Silent failure - fire-and-forget\n console.warn(\"[Frak SDK] Failed to send interaction:\", params.type);\n }\n}\n","import { getClientId } from \"../../config/clientId\";\nimport { FrakContextManager } from \"../../context\";\nimport { areAddressesEqual } from \"../../context/address\";\nimport type {\n FrakClient,\n FrakContext,\n FrakContextV2,\n WalletStatusReturnType,\n} from \"../../types\";\nimport { isV1Context, isV2Context } from \"../../types\";\nimport { trackEvent } from \"../../utils\";\nimport { sendInteraction } from \"../sendInteraction\";\n\n/**\n * Options for the referral auto-interaction process.\n */\nexport type ProcessReferralOptions = {\n /**\n * If true, always replace the URL with the current user's referral context\n * so the next visitor gets referred by this user.\n * @defaultValue false\n */\n alwaysAppendUrl?: boolean;\n /**\n * Merchant ID for building the current user's referral context.\n * Required when `alwaysAppendUrl` is true and the incoming context is V1.\n * For V2 contexts, the merchantId is already embedded in the context.\n */\n merchantId?: string;\n};\n\n/**\n * The different states of the referral process.\n * @inline\n */\ntype ReferralState =\n | \"idle\"\n | \"processing\"\n | \"success\"\n | \"no-referrer\"\n | \"self-referral\";\n\n/**\n * Track an arrival event if the context version is recognized.\n * Sends both tracking analytics and the arrival interaction RPC.\n *\n * @returns true if the context was valid and tracked, false otherwise\n */\nfunction trackArrivalIfValid(\n client: FrakClient,\n frakContext: FrakContext,\n walletStatus?: WalletStatusReturnType\n): boolean {\n if (isV2Context(frakContext)) {\n trackEvent(client, \"user_referred_started\", {\n referrer_client_id: frakContext.c,\n referrer_wallet: frakContext.w,\n wallet_status: walletStatus?.key,\n });\n sendInteraction(client, {\n type: \"arrival\",\n referrerClientId: frakContext.c,\n referrerMerchantId: frakContext.m,\n referrerWallet: frakContext.w,\n referralTimestamp: frakContext.t,\n });\n return true;\n }\n\n if (isV1Context(frakContext)) {\n trackEvent(client, \"user_referred_started\", {\n referrer: frakContext.r,\n wallet_status: walletStatus?.key,\n });\n sendInteraction(client, {\n type: \"arrival\",\n referrerWallet: frakContext.r,\n });\n return true;\n }\n\n return false;\n}\n\n/**\n * Build a V2 context representing the current user for URL replacement.\n *\n * Emits both `c` (anonymous clientId) and `w` (wallet) when available — wallet\n * is the preferred identity signal and takes attribution precedence downstream.\n * Returns null when neither identifier is available.\n */\nfunction buildCurrentUserContext(\n merchantId: string,\n wallet?: WalletStatusReturnType[\"wallet\"]\n): FrakContextV2 | null {\n const clientId = getClientId();\n if (!clientId && !wallet) return null;\n return {\n v: 2,\n m: merchantId,\n t: Math.floor(Date.now() / 1000),\n ...(clientId ? { c: clientId } : {}),\n ...(wallet ? { w: wallet } : {}),\n };\n}\n\n/**\n * Client-side self-referral preflight check.\n * Prevents unnecessary backend round-trips for obvious self-referrals.\n */\nfunction isSelfReferral(\n frakContext: FrakContext,\n walletStatus?: WalletStatusReturnType\n): boolean {\n if (isV2Context(frakContext)) {\n // Wallet match takes precedence — it's the strongest signal we have.\n if (frakContext.w && walletStatus?.wallet) {\n return areAddressesEqual(frakContext.w, walletStatus.wallet);\n }\n if (frakContext.c) {\n return getClientId() === frakContext.c;\n }\n return false;\n }\n if (isV1Context(frakContext) && walletStatus?.wallet) {\n return areAddressesEqual(frakContext.r, walletStatus.wallet);\n }\n return false;\n}\n\n/**\n * Handle the full referral interaction flow:\n *\n * 1. Check if the user has been referred (if not, early exit)\n * 2. Preflight self-referral check (if yes, early exit)\n * 3. Track the arrival event\n * 4. Replace the current URL with the user's own referral context\n * 5. Return the resulting referral state\n *\n * @param client - The current Frak Client\n * @param args\n * @param args.walletStatus - The current user wallet status\n * @param args.frakContext - The referral context parsed from the URL\n * @param args.options - Options for URL replacement and merchant context\n * @returns The referral state\n *\n * @see {@link @frak-labs/core-sdk!ModalStepTypes} for modal step types\n */\nexport function processReferral(\n client: FrakClient,\n {\n walletStatus,\n frakContext,\n options,\n }: {\n walletStatus?: WalletStatusReturnType;\n frakContext?: FrakContext | null;\n options?: ProcessReferralOptions;\n }\n): ReferralState {\n if (!frakContext) {\n return \"no-referrer\";\n }\n\n if (isSelfReferral(frakContext, walletStatus)) {\n return \"self-referral\";\n }\n\n if (!trackArrivalIfValid(client, frakContext, walletStatus)) {\n return \"no-referrer\";\n }\n\n // V2 context embeds merchantId; V1 falls back to options\n const contextMerchantId = isV2Context(frakContext)\n ? frakContext.m\n : options?.merchantId;\n\n const replaceContext =\n options?.alwaysAppendUrl && contextMerchantId\n ? buildCurrentUserContext(contextMerchantId, walletStatus?.wallet)\n : null;\n\n FrakContextManager.replaceUrl({\n url: window.location?.href,\n context: replaceContext,\n });\n\n trackEvent(client, \"user_referred_completed\", {\n status: \"success\",\n });\n\n return \"success\";\n}\n","import { FrakContextManager } from \"../../context\";\nimport type { FrakClient } from \"../../types\";\nimport { watchWalletStatus } from \"../index\";\nimport {\n type ProcessReferralOptions,\n processReferral,\n} from \"./processReferral\";\n\n/**\n * Function used to handle referral interactions\n * @param client - The current Frak Client\n * @param args\n * @param args.options - Some options for the referral interaction\n *\n * @returns A promise with the resulting referral state, or undefined in case of an error\n *\n * @description This function will automatically handle the referral interaction process\n *\n * @see {@link processReferral} for more details on the automatic referral handling process\n */\nexport async function referralInteraction(\n client: FrakClient,\n {\n options,\n }: {\n options?: ProcessReferralOptions;\n } = {}\n) {\n // Get the current frak context\n const frakContext = FrakContextManager.parse({\n url: window.location.href,\n });\n\n // Get the current wallet status\n const currentWalletStatus = await watchWalletStatus(client);\n\n try {\n return processReferral(client, {\n walletStatus: currentWalletStatus,\n frakContext,\n options,\n });\n } catch (error) {\n console.warn(\"Error processing referral\", { error });\n }\n return;\n}\n","import type { FrakClient } from \"../../types\";\nimport { referralInteraction } from \"./referralInteraction\";\n\n/**\n * Custom event name dispatched on successful referral processing.\n *\n * Fired once per page load when a valid referral context is found in the URL\n * and successfully tracked. Consumers (e.g. `<frak-banner>`) listen for this\n * to display a referral success message.\n */\nexport const REFERRAL_SUCCESS_EVENT = \"frak:referral-success\";\n\n/**\n * Process referral context and emit a DOM event on success.\n *\n * - Calls {@link referralInteraction} to detect and track any referral in the URL\n * - On `\"success\"`, dispatches a bare {@link REFERRAL_SUCCESS_EVENT} on `window`\n * - Silently swallows errors (fire-and-forget during SDK init)\n *\n * @param client - The initialized Frak client\n */\nexport async function setupReferral(client: FrakClient): Promise<void> {\n try {\n const state = await referralInteraction(client);\n\n if (state === \"success\") {\n window.dispatchEvent(new Event(REFERRAL_SUCCESS_EVENT));\n }\n } catch (error) {\n console.warn(\"[Frak] Referral setup failed\", error);\n }\n}\n","import { getBackendUrl } from \"../config/backendUrl\";\nimport { getClientId } from \"../config/clientId\";\nimport { sdkConfigStore } from \"../config/sdkConfigStore\";\n\n/**\n * Function used to track the status of a purchase\n * when a purchase is tracked, the `purchaseCompleted` interactions will be automatically send for the user when we receive the purchase confirmation via webhook.\n *\n * @param args.customerId - The customer id that made the purchase (on your side)\n * @param args.orderId - The order id of the purchase (on your side)\n * @param args.token - The token of the purchase\n * @param args.merchantId - Optional explicit merchant id to use for the tracking request\n *\n * @description This function will send a request to the backend to listen for the purchase status.\n *\n * @example\n * async function trackPurchase(checkout) {\n * const payload = {\n * customerId: checkout.order.customer.id,\n * orderId: checkout.order.id,\n * token: checkout.token,\n * merchantId: \"your-merchant-id\",\n * };\n *\n * await trackPurchaseStatus(payload);\n * }\n *\n * @remarks\n * - Merchant id is resolved in this order: explicit `args.merchantId`, then `sdkConfigStore.resolveMerchantId()` (config store → sessionStorage → backend fetch).\n * - This function supports anonymous users and will use the `x-frak-client-id` header when available.\n * - At least one identity source must exist (`frak-wallet-interaction-token` or `x-frak-client-id`), otherwise the tracking request is skipped.\n * - This function will print a warning if used in a non-browser environment or if no identity / merchant id can be resolved.\n */\nexport async function trackPurchaseStatus(args: {\n customerId: string | number;\n orderId: string | number;\n token: string;\n merchantId?: string;\n}) {\n if (typeof window === \"undefined\") {\n console.warn(\"[Frak] No window found, can't track purchase\");\n return;\n }\n\n const interactionToken = window.sessionStorage.getItem(\n \"frak-wallet-interaction-token\"\n );\n\n const clientId = getClientId();\n if (!interactionToken && !clientId) {\n console.warn(\"[Frak] No identity found, skipping purchase check\");\n return;\n }\n\n const merchantId =\n args.merchantId ?? (await sdkConfigStore.resolveMerchantId());\n\n if (!merchantId) {\n console.warn(\"[Frak] No merchant id found, skipping purchase check\");\n return;\n }\n\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n \"Content-Type\": \"application/json\",\n };\n\n if (interactionToken) {\n headers[\"x-wallet-sdk-auth\"] = interactionToken;\n }\n\n if (clientId) {\n headers[\"x-frak-client-id\"] = clientId;\n }\n\n // Submit the listening request\n const backendUrl = getBackendUrl();\n await fetch(`${backendUrl}/user/track/purchase`, {\n method: \"POST\",\n headers,\n body: JSON.stringify({\n customerId: args.customerId,\n orderId: args.orderId,\n token: args.token,\n merchantId,\n }),\n });\n}\n","import { Deferred } from \"@frak-labs/frame-connector\";\nimport type { FrakClient } from \"../types/client\";\nimport type { WalletStatusReturnType } from \"../types/rpc/walletStatus\";\nimport { ensureIdentity } from \"./ensureIdentity\";\n\n/**\n * Function used to watch the current frak wallet status\n * @param client - The current Frak Client\n * @param callback - The callback that will receive any wallet status change\n * @returns A promise resolving with the initial wallet status\n *\n * @description This function will return the current wallet status, and will listen to any change in the wallet status.\n *\n * @example\n * await watchWalletStatus(frakConfig, (status: WalletStatusReturnType) => {\n * if (status.key === \"connected\") {\n * console.log(\"Wallet connected:\", status.wallet);\n * } else {\n * console.log(\"Wallet not connected\");\n * }\n * });\n */\nexport function watchWalletStatus(\n client: FrakClient,\n callback?: (status: WalletStatusReturnType) => void\n): Promise<WalletStatusReturnType> {\n // If no callback is provided, just do a request with deferred result\n if (!callback) {\n return client\n .request({ method: \"frak_listenToWalletStatus\" })\n .then((result) => {\n // Handle side effects of this request\n walletStatusSideEffect(client, result);\n\n // Return the result\n return result;\n });\n }\n\n // Otherwise, listen to the wallet status and return the first one received\n const firstResult = new Deferred<WalletStatusReturnType>();\n let hasResolved = false;\n\n // Start the listening request, and return the first result\n client.listenerRequest(\n {\n method: \"frak_listenToWalletStatus\",\n },\n (status) => {\n // Handle side effects of this request\n walletStatusSideEffect(client, status);\n\n // Transmit the status to the callback\n callback(status);\n\n // If the promise hasn't resolved yet, resolve it\n if (!hasResolved) {\n firstResult.resolve(status);\n hasResolved = true;\n }\n }\n );\n\n return firstResult.promise;\n}\n\n/**\n * Helper to save a potential interaction token\n * @param interactionToken\n */\nfunction walletStatusSideEffect(\n client: FrakClient,\n status: WalletStatusReturnType\n) {\n if (typeof window === \"undefined\") {\n return;\n }\n\n // Update the global properties\n client.openPanel?.setGlobalProperties({\n wallet: status.wallet ?? null,\n });\n\n if (status.interactionToken) {\n window.sessionStorage.setItem(\n \"frak-wallet-interaction-token\",\n status.interactionToken\n );\n ensureIdentity(status.interactionToken);\n } else {\n window.sessionStorage.removeItem(\"frak-wallet-interaction-token\");\n }\n}\n","import type {\n DisplayModalParamsType,\n FinalActionType,\n FinalModalStepType,\n FrakClient,\n LoginModalStepType,\n ModalRpcMetadata,\n ModalRpcStepsResultType,\n ModalStepTypes,\n SendTransactionModalStepType,\n} from \"../../types\";\nimport { displayModal } from \"../displayModal\";\n\n/**\n * Represent the type of the modal step builder\n */\nexport type ModalStepBuilder<\n Steps extends ModalStepTypes[] = ModalStepTypes[],\n> = {\n /**\n * The current modal params\n */\n params: DisplayModalParamsType<Steps>;\n /**\n * Add a send transaction step to the modal\n */\n sendTx: (\n options: SendTransactionModalStepType[\"params\"]\n ) => ModalStepBuilder<[...Steps, SendTransactionModalStepType]>;\n /**\n * Add a final step of type reward to the modal\n */\n reward: (\n options?: Omit<FinalModalStepType[\"params\"], \"action\">\n ) => ModalStepBuilder<[...Steps, FinalModalStepType]>;\n /**\n * Add a final step of type sharing to the modal\n */\n sharing: (\n sharingOptions?: Extract<\n FinalActionType,\n { key: \"sharing\" }\n >[\"options\"],\n options?: Omit<FinalModalStepType[\"params\"], \"action\">\n ) => ModalStepBuilder<[...Steps, FinalModalStepType]>;\n /**\n * Display the modal\n * @param metadataOverride - Function returning optional metadata to override the current modal metadata\n * @param placement - Optional placement ID to associate with this modal display\n */\n display: (\n metadataOverride?: (\n current?: ModalRpcMetadata\n ) => ModalRpcMetadata | undefined,\n placement?: string\n ) => Promise<ModalRpcStepsResultType<Steps>>;\n};\n\n/**\n * Represent the output type of the modal builder\n */\nexport type ModalBuilder = ModalStepBuilder<[LoginModalStepType]>;\n\n/**\n * Helper to craft Frak modal, and share a base initial config\n * @param client - The current Frak Client\n * @param args\n * @param args.metadata - Common modal metadata (customisation, language etc)\n * @param args.login - Login step parameters\n *\n * @description This function will create a modal builder with the provided metadata and login parameters.\n *\n * @example\n * Here is an example of how to use the `modalBuilder` to create and display a sharing modal:\n *\n * ```js\n * // Create the modal builder\n * const modalBuilder = window.FrakSDK.modalBuilder(frakClient, baseModalConfig);\n *\n * // Configure the information to be shared via the sharing link\n * const sharingConfig = {\n * popupTitle: \"Share this with your friends\",\n * text: \"Discover our product!\",\n * link: window.location.href,\n * };\n *\n * // Display the sharing modal\n * function modalShare() {\n * modalBuilder.sharing(sharingConfig).display();\n * }\n * ```\n *\n * @see {@link ModalStepTypes} for more info about each modal step types and their parameters\n * @see {@link ModalRpcMetadata} for more info about the metadata that can be passed to the modal\n * @see {@link ModalRpcStepsResultType} for more info about the result of each modal steps\n * @see {@link displayModal} for more info about how the modal is displayed\n */\nexport function modalBuilder(\n client: FrakClient,\n {\n metadata,\n login,\n }: {\n metadata?: ModalRpcMetadata;\n login?: LoginModalStepType[\"params\"];\n }\n): ModalBuilder {\n // Build the initial modal params\n const baseParams: DisplayModalParamsType<[LoginModalStepType]> = {\n steps: {\n login: login ?? {},\n },\n metadata,\n };\n\n // Return the step builder\n return modalStepsBuilder(client, baseParams);\n}\n\n/**\n * Modal step builder, allowing to add new steps to the modal, and to build and display it\n */\nfunction modalStepsBuilder<CurrentSteps extends ModalStepTypes[]>(\n client: FrakClient,\n params: DisplayModalParamsType<CurrentSteps>\n): ModalStepBuilder<CurrentSteps> {\n // Function add the send tx step\n function sendTx(options: SendTransactionModalStepType[\"params\"]) {\n return modalStepsBuilder<\n [...CurrentSteps, SendTransactionModalStepType]\n >(client, {\n ...params,\n steps: {\n ...params.steps,\n sendTransaction: options,\n },\n } as DisplayModalParamsType<\n [...CurrentSteps, SendTransactionModalStepType]\n >);\n }\n\n // Function to add a reward step at the end\n function reward(options?: Omit<FinalModalStepType[\"params\"], \"action\">) {\n return modalStepsBuilder<[...CurrentSteps, FinalModalStepType]>(\n client,\n {\n ...params,\n steps: {\n ...params.steps,\n final: {\n ...options,\n action: { key: \"reward\" },\n },\n },\n } as DisplayModalParamsType<[...CurrentSteps, FinalModalStepType]>\n );\n }\n\n // Function to add sharing step at the end\n function sharing(\n sharingOptions?: Extract<\n FinalActionType,\n { key: \"sharing\" }\n >[\"options\"],\n options?: Omit<FinalModalStepType[\"params\"], \"action\">\n ) {\n return modalStepsBuilder<[...CurrentSteps, FinalModalStepType]>(\n client,\n {\n ...params,\n steps: {\n ...params.steps,\n final: {\n ...options,\n action: { key: \"sharing\", options: sharingOptions },\n },\n },\n } as DisplayModalParamsType<[...CurrentSteps, FinalModalStepType]>\n );\n }\n\n async function display(\n metadataOverride?: (\n current?: ModalRpcMetadata\n ) => ModalRpcMetadata | undefined,\n placement?: string\n ) {\n if (metadataOverride) {\n params.metadata = metadataOverride(params.metadata ?? {});\n }\n return await displayModal(client, params, placement);\n }\n\n return {\n params,\n sendTx,\n reward,\n sharing,\n display,\n };\n}\n","import type {\n FrakClient,\n ModalRpcMetadata,\n SendTransactionModalStepType,\n SendTransactionReturnType,\n} from \"../../types\";\nimport { displayModal } from \"../displayModal\";\n\n/**\n * Parameters to directly show a modal used to send a transaction\n * @inline\n */\nexport type SendTransactionParams = {\n /**\n * The transaction to be sent (either a single tx or multiple ones)\n */\n tx: SendTransactionModalStepType[\"params\"][\"tx\"];\n /**\n * Custom metadata to be passed to the modal\n */\n metadata?: ModalRpcMetadata;\n};\n\n/**\n * Function used to send a user transaction, simple wrapper around the displayModal function to ease the send transaction process\n * @param client - The current Frak Client\n * @param args - The parameters\n * @returns The hash of the transaction that was sent in a promise\n *\n * @description This function will display a modal to the user with the provided transaction and metadata.\n *\n * @example\n * const { hash } = await sendTransaction(frakConfig, {\n * tx: {\n * to: \"0xdeadbeef\",\n * value: toHex(100n),\n * },\n * metadata: {\n * header: {\n * title: \"Sending eth\",\n * },\n * context: \"Send 100wei to 0xdeadbeef\",\n * },\n * });\n * console.log(\"Transaction hash:\", hash);\n */\nexport async function sendTransaction(\n client: FrakClient,\n { tx, metadata }: SendTransactionParams\n): Promise<SendTransactionReturnType> {\n // Trigger a modal with login options\n const result = await displayModal(client, {\n metadata,\n steps: {\n login: {},\n sendTransaction: { tx },\n },\n });\n\n // Return the tx result only\n return result.sendTransaction;\n}\n","import type {\n FrakClient,\n ModalRpcMetadata,\n SiweAuthenticateReturnType,\n SiweAuthenticationParams,\n} from \"../../types\";\nimport { displayModal } from \"../displayModal\";\n\n/**\n * Generate a random EIP-4361-compatible nonce.\n *\n * Matches viem/siwe's `generateSiweNonce` shape (96 alphanumeric chars) but\n * inlined here to avoid pulling viem's runtime utilities into the bundle.\n * Uses `crypto.getRandomValues` when available (browsers, modern Node) and\n * falls back to `Math.random` for the rare environment without WebCrypto.\n */\nfunction generateSiweNonce(length = 96): string {\n const byteCount = Math.ceil(length / 2);\n let hex = \"\";\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n const bytes = new Uint8Array(byteCount);\n crypto.getRandomValues(bytes);\n for (let i = 0; i < bytes.length; i++) {\n hex += bytes[i].toString(16).padStart(2, \"0\");\n }\n } else {\n for (let i = 0; i < byteCount; i++) {\n hex += ((Math.random() * 256) | 0).toString(16).padStart(2, \"0\");\n }\n }\n return hex.substring(0, length);\n}\n\n/**\n * Parameter used to directly show a modal used to authenticate with SIWE\n * @inline\n */\nexport type SiweAuthenticateModalParams = {\n /**\n * Partial SIWE params, since we can rebuild them from the SDK if they are empty\n *\n * If no parameters provider, some fields will be recomputed from the current configuration and environment.\n * - `statement` will be set to a default value\n * - `nonce` will be generated\n * - `uri` will be set to the current domain\n * - `version` will be set to \"1\"\n * - `domain` will be set to the current window domain\n *\n * @default {}\n */\n siwe?: Partial<SiweAuthenticationParams>;\n /**\n * Custom metadata to be passed to the modal\n */\n metadata?: ModalRpcMetadata;\n};\n\n/**\n * Function used to launch a siwe authentication\n * @param client - The current Frak Client\n * @param args - The parameters\n * @returns The SIWE authentication result (message + signature) in a promise\n *\n * @description This function will display a modal to the user with the provided SIWE parameters and metadata.\n *\n * @example\n * import { siweAuthenticate } from \"@frak-labs/core-sdk/actions\";\n * import { parseSiweMessage } from \"viem/siwe\";\n *\n * const { signature, message } = await siweAuthenticate(frakConfig, {\n * siwe: {\n * statement: \"Sign in to My App\",\n * domain: \"my-app.com\",\n * expirationTimeTimestamp: Date.now() + 1000 * 60 * 5,\n * },\n * metadata: {\n * header: {\n * title: \"Sign in\",\n * },\n * context: \"Sign in to My App\",\n * },\n * });\n * console.log(\"Parsed final message:\", parseSiweMessage(message));\n * console.log(\"Siwe signature:\", signature);\n */\nexport async function siweAuthenticate(\n client: FrakClient,\n { siwe, metadata }: SiweAuthenticateModalParams\n): Promise<SiweAuthenticateReturnType> {\n const effectiveDomain = client.config?.domain ?? window.location.host;\n const realStatement =\n siwe?.statement ??\n `I confirm that I want to use my Frak wallet on: ${client.config.metadata.name}`;\n\n // Fill up the siwe request params\n const builtSiwe: SiweAuthenticationParams = {\n ...siwe,\n statement: realStatement,\n nonce: siwe?.nonce ?? generateSiweNonce(),\n uri: siwe?.uri ?? `https://${effectiveDomain}`,\n version: siwe?.version ?? \"1\",\n domain: effectiveDomain,\n };\n\n // Trigger a modal with login options\n const result = await displayModal(client, {\n metadata,\n steps: {\n login: {},\n siweAuthenticate: {\n siwe: builtSiwe,\n },\n },\n });\n\n // Return the SIWE result only\n return result.siweAuthenticate;\n}\n"],"mappings":"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"}
package/dist/actions.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./frakContext-Cfp7sSid.cjs`),t=require(`./actions-gmdNZvNh.cjs`);exports.REFERRAL_SUCCESS_EVENT=t.o,exports.displayEmbeddedWallet=t.v,exports.displayModal=t._,exports.displaySharingPage=t.g,exports.ensureIdentity=t.h,exports.getMerchantInformation=t.m,exports.getMergeToken=t.p,exports.getUserReferralStatus=t.f,exports.modalBuilder=t.r,exports.openSso=e.o,exports.prepareSso=t.d,exports.processReferral=t.l,exports.referralInteraction=t.c,exports.sendInteraction=t.u,exports.sendTransaction=t.n,exports.setupReferral=t.s,exports.siweAuthenticate=t.t,exports.trackPurchaseStatus=t.a,exports.watchWalletStatus=t.i;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./frakContext-CeVlWFcX.cjs`),t=require(`./actions-DrZ_PIs1.cjs`);exports.REFERRAL_SUCCESS_EVENT=t.o,exports.displayEmbeddedWallet=t.v,exports.displayModal=t._,exports.displaySharingPage=t.g,exports.ensureIdentity=t.h,exports.getMerchantInformation=t.m,exports.getMergeToken=t.p,exports.getUserReferralStatus=t.f,exports.modalBuilder=t.r,exports.openSso=e.c,exports.prepareSso=t.d,exports.processReferral=t.l,exports.referralInteraction=t.c,exports.sendInteraction=t.u,exports.sendTransaction=t.n,exports.setupReferral=t.s,exports.siweAuthenticate=t.t,exports.trackPurchaseStatus=t.a,exports.watchWalletStatus=t.i;
@@ -1,3 +1,3 @@
1
- import { t as openSso } from "./openSso-BErs7_Bg.cjs";
2
- import { C as displayEmbeddedWallet, S as displayModal, _ as getUserReferralStatus, a as ModalBuilder, b as ensureIdentity, c as watchWalletStatus, d as REFERRAL_SUCCESS_EVENT, f as setupReferral, g as prepareSso, h as processReferral, i as sendTransaction, l as trackPurchaseStatus, m as ProcessReferralOptions, n as siweAuthenticate, o as ModalStepBuilder, p as referralInteraction, r as SendTransactionParams, s as modalBuilder, t as SiweAuthenticateModalParams, u as sendInteraction, v as getMergeToken, x as displaySharingPage, y as getMerchantInformation } from "./index-DR4n-QOe.cjs";
3
- export { ModalBuilder, ModalStepBuilder, ProcessReferralOptions, REFERRAL_SUCCESS_EVENT, SendTransactionParams, SiweAuthenticateModalParams, displayEmbeddedWallet, displayModal, displaySharingPage, ensureIdentity, getMerchantInformation, getMergeToken, getUserReferralStatus, modalBuilder, openSso, prepareSso, processReferral, referralInteraction, sendInteraction, sendTransaction, setupReferral, siweAuthenticate, trackPurchaseStatus, watchWalletStatus };
1
+ import { t as openSso } from "./openSso-B0igO6Iu.cjs";
2
+ import { C as displayEmbeddedWallet, S as displayModal, _ as getUserReferralStatus, a as ModalBuilder, b as ensureIdentity, c as watchWalletStatus, d as REFERRAL_SUCCESS_EVENT, f as setupReferral, g as prepareSso, h as processReferral, i as sendTransaction, l as trackPurchaseStatus, m as ProcessReferralOptions, n as siweAuthenticate, o as ModalStepBuilder, p as referralInteraction, r as SendTransactionParams, s as modalBuilder, t as SiweAuthenticateModalParams, u as sendInteraction, v as getMergeToken, x as displaySharingPage, y as getMerchantInformation } from "./index-C1A3I4x1.cjs";
3
+ export { type ModalBuilder, type ModalStepBuilder, type ProcessReferralOptions, REFERRAL_SUCCESS_EVENT, type SendTransactionParams, type SiweAuthenticateModalParams, displayEmbeddedWallet, displayModal, displaySharingPage, ensureIdentity, getMerchantInformation, getMergeToken, getUserReferralStatus, modalBuilder, openSso, prepareSso, processReferral, referralInteraction, sendInteraction, sendTransaction, setupReferral, siweAuthenticate, trackPurchaseStatus, watchWalletStatus };
package/dist/actions.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import { t as openSso } from "./openSso-DRLH4D9a.js";
2
- import { C as displayEmbeddedWallet, S as displayModal, _ as getUserReferralStatus, a as ModalBuilder, b as ensureIdentity, c as watchWalletStatus, d as REFERRAL_SUCCESS_EVENT, f as setupReferral, g as prepareSso, h as processReferral, i as sendTransaction, l as trackPurchaseStatus, m as ProcessReferralOptions, n as siweAuthenticate, o as ModalStepBuilder, p as referralInteraction, r as SendTransactionParams, s as modalBuilder, t as SiweAuthenticateModalParams, u as sendInteraction, v as getMergeToken, x as displaySharingPage, y as getMerchantInformation } from "./index-lcImYQyL.js";
3
- export { ModalBuilder, ModalStepBuilder, ProcessReferralOptions, REFERRAL_SUCCESS_EVENT, SendTransactionParams, SiweAuthenticateModalParams, displayEmbeddedWallet, displayModal, displaySharingPage, ensureIdentity, getMerchantInformation, getMergeToken, getUserReferralStatus, modalBuilder, openSso, prepareSso, processReferral, referralInteraction, sendInteraction, sendTransaction, setupReferral, siweAuthenticate, trackPurchaseStatus, watchWalletStatus };
1
+ import { t as openSso } from "./openSso-BWeD0Fb2.js";
2
+ import { C as displayEmbeddedWallet, S as displayModal, _ as getUserReferralStatus, a as ModalBuilder, b as ensureIdentity, c as watchWalletStatus, d as REFERRAL_SUCCESS_EVENT, f as setupReferral, g as prepareSso, h as processReferral, i as sendTransaction, l as trackPurchaseStatus, m as ProcessReferralOptions, n as siweAuthenticate, o as ModalStepBuilder, p as referralInteraction, r as SendTransactionParams, s as modalBuilder, t as SiweAuthenticateModalParams, u as sendInteraction, v as getMergeToken, x as displaySharingPage, y as getMerchantInformation } from "./index-BJMazhpm.js";
3
+ export { type ModalBuilder, type ModalStepBuilder, type ProcessReferralOptions, REFERRAL_SUCCESS_EVENT, type SendTransactionParams, type SiweAuthenticateModalParams, displayEmbeddedWallet, displayModal, displaySharingPage, ensureIdentity, getMerchantInformation, getMergeToken, getUserReferralStatus, modalBuilder, openSso, prepareSso, processReferral, referralInteraction, sendInteraction, sendTransaction, setupReferral, siweAuthenticate, trackPurchaseStatus, watchWalletStatus };
package/dist/actions.js CHANGED
@@ -1 +1 @@
1
- import{o as e}from"./frakContext-UEOk9Bk4.js";import{_ as t,a as n,c as r,d as i,f as a,g as o,h as s,i as c,l,m as u,n as d,o as f,p,r as m,s as h,t as g,u as _,v}from"./actions-D5rNeJC0.js";export{f as REFERRAL_SUCCESS_EVENT,v as displayEmbeddedWallet,t as displayModal,o as displaySharingPage,s as ensureIdentity,u as getMerchantInformation,p as getMergeToken,a as getUserReferralStatus,m as modalBuilder,e as openSso,i as prepareSso,l as processReferral,r as referralInteraction,_ as sendInteraction,d as sendTransaction,h as setupReferral,g as siweAuthenticate,n as trackPurchaseStatus,c as watchWalletStatus};
1
+ import{c as e}from"./frakContext-Bgidv-Se.js";import{_ as t,a as n,c as r,d as i,f as a,g as o,h as s,i as c,l,m as u,n as d,o as f,p,r as m,s as h,t as g,u as _,v}from"./actions-HG5M8wX7.js";export{f as REFERRAL_SUCCESS_EVENT,v as displayEmbeddedWallet,t as displayModal,o as displaySharingPage,s as ensureIdentity,u as getMerchantInformation,p as getMergeToken,a as getUserReferralStatus,m as modalBuilder,e as openSso,i as prepareSso,l as processReferral,r as referralInteraction,_ as sendInteraction,d as sendTransaction,h as setupReferral,g as siweAuthenticate,n as trackPurchaseStatus,c as watchWalletStatus};
package/dist/bundle.cjs CHANGED
@@ -1 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./frakContext-Cfp7sSid.cjs`),t=require(`./src-C9inMs4I.cjs`),n=require(`./actions-gmdNZvNh.cjs`);exports.DEEP_LINK_SCHEME=t.h,exports.FrakContextManager=e.t,exports.REFERRAL_SUCCESS_EVENT=n.o,exports.base64urlDecode=e.d,exports.base64urlEncode=e.f,exports.baseIframeProps=t.f,exports.clearAllCache=e.h,exports.compressJsonToB64=e.u,exports.createIFrameFrakClient=t.d,exports.decompressJsonFromB64=t.o,exports.displayEmbeddedWallet=n.v,exports.displayModal=n._,exports.displaySharingPage=n.g,exports.ensureIdentity=n.h,exports.findIframeInOpener=t.p,exports.formatAmount=t.i,exports.generateSsoUrl=e.l,exports.getBackendUrl=e.m,exports.getClientId=e._,exports.getCurrencyAmountKey=t.r,exports.getMerchantInformation=n.m,exports.getMergeToken=n.p,exports.getSupportedCurrency=t.a,exports.getUserReferralStatus=n.f,exports.isIOS=t.s,exports.isInAppBrowser=t.c,exports.isMobile=t.l,exports.mergeAttribution=t.t,exports.modalBuilder=n.r,exports.openSso=e.o,exports.prepareSso=n.d,exports.processReferral=n.l,exports.redirectToExternalBrowser=t.u,exports.referralInteraction=n.c,exports.sdkConfigStore=e.p,exports.sendInteraction=n.u,exports.sendTransaction=n.n,exports.setupClient=t.n,exports.setupReferral=n.s,exports.siweAuthenticate=n.t,exports.ssoPopupFeatures=e.s,exports.ssoPopupName=e.c,exports.trackEvent=e.a,exports.trackPurchaseStatus=n.a,exports.triggerDeepLinkWithFallback=t.m,exports.watchWalletStatus=n.i,exports.withCache=e.g;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./frakContext-CeVlWFcX.cjs`),t=require(`./src-CCJgTN1H.cjs`),n=require(`./actions-DrZ_PIs1.cjs`);exports.DEEP_LINK_SCHEME=t.h,exports.FrakContextManager=e.t,exports.REFERRAL_SUCCESS_EVENT=n.o,exports.base64urlDecode=e.p,exports.base64urlEncode=e.m,exports.baseIframeProps=t.c,exports.clearAllCache=e._,exports.compressJsonToB64=e.f,exports.createIFrameFrakClient=t.s,exports.decompressJsonFromB64=t.o,exports.deleteQueryParamCaseInsensitive=e.a,exports.displayEmbeddedWallet=n.v,exports.displayModal=n._,exports.displaySharingPage=n.g,exports.ensureIdentity=n.h,exports.findIframeInOpener=t.l,exports.formatAmount=t.i,exports.generateSsoUrl=e.d,exports.getBackendUrl=e.g,exports.getClientId=e.y,exports.getCurrencyAmountKey=t.r,exports.getMerchantInformation=n.m,exports.getMergeToken=n.p,exports.getQueryParamCaseInsensitive=e.o,exports.getSupportedCurrency=t.a,exports.getUserReferralStatus=n.f,exports.isIOS=t.u,exports.isInAppBrowser=t.d,exports.isMobile=t.f,exports.mergeAttribution=t.t,exports.modalBuilder=n.r,exports.openSso=e.c,exports.prepareSso=n.d,exports.processReferral=n.l,exports.redirectToExternalBrowser=t.p,exports.referralInteraction=n.c,exports.sdkConfigStore=e.h,exports.sendInteraction=n.u,exports.sendTransaction=n.n,exports.setupClient=t.n,exports.setupReferral=n.s,exports.siweAuthenticate=n.t,exports.ssoPopupFeatures=e.l,exports.ssoPopupName=e.u,exports.trackEvent=e.s,exports.trackPurchaseStatus=n.a,exports.triggerDeepLinkWithFallback=t.m,exports.watchWalletStatus=n.i,exports.withCache=e.v;
package/dist/bundle.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { $ as SdkResolvedConfig, A as ModalRpcStepsResultType, B as OpenSsoReturnType, C as LoggedInEmbeddedView, D as DisplayModalParamsType, E as SharingPageProduct, F as SiweAuthenticateModalStepType, G as FinalModalStepType, H as PrepareSsoReturnType, I as SiweAuthenticateReturnType, J as IFrameLifecycleEvent, K as ModalStepMetadata, L as SiweAuthenticationParams, M as SendTransactionModalStepType, N as SendTransactionReturnType, O as ModalRpcMetadata, P as SendTransactionTxType, Q as ResolvedSdkConfig, R as LoginModalStepType, S as EmbeddedViewActionSharing, T as DisplaySharingPageResultType, U as SsoMetadata, V as PrepareSsoParamsType, W as FinalActionType, X as MerchantConfigResponse, Y as ClientLifecycleEvent, Z as ResolvedPlacement, _ as SendInteractionParamsType, a as FrakContextV1, at as LocalizedI18nConfig, b as LoggedOutEmbeddedView, c as FrakLifecycleEvent, ct as TrackArrivalParams, d as WalletStatusReturnType, et as Currency, f as UserReferralStatusType, g as TokenAmountType, h as RewardTier, i as FrakContext, it as ListenerPreloadOption, j as ModalStepTypes, k as ModalRpcStepsInput, l as IFrameTransport, lt as TrackArrivalResult, m as GetMerchantInformationReturnType, n as ssoPopupFeatures, nt as I18nConfig, o as FrakContextV2, ot as AttributionDefaults, p as EstimatedReward, q as InteractionTypeKey, r as ssoPopupName, rt as Language, s as FrakClient, st as AttributionParams, t as openSso, tt as FrakWalletSdkConfig, u as IFrameRpcSchema, ut as UtmParams, v as DisplayEmbeddedWalletParamsType, w as DisplaySharingPageParamsType, x as EmbeddedViewActionReferred, y as DisplayEmbeddedWalletResultType, z as OpenSsoParamsType } from "./openSso-BErs7_Bg.cjs";
2
- import { A as getClientId, C as SdkEventMap, D as FrakContextManager, E as mergeAttribution, F as HashProtectedData, I as KeyProvider, M as setupClient, N as createIFrameFrakClient, O as DEEP_LINK_SCHEME, P as CompressedData, S as trackEvent, T as MergeAttributionInput, _ as isInAppBrowser, a as baseIframeProps, b as DeepLinkFallbackOptions, c as getCurrencyAmountKey, d as compressJsonToB64, f as base64urlDecode, g as isIOS, h as withCache, i as generateSsoUrl, j as getBackendUrl, k as sdkConfigStore, l as formatAmount, m as clearAllCache, n as CompressedSsoData, o as findIframeInOpener, p as base64urlEncode, r as FullSsoParams, s as getSupportedCurrency, t as AppSpecificSsoMetadata, u as decompressJsonFromB64, v as isMobile, w as SdkHandshakeFailureReason, x as triggerDeepLinkWithFallback, y as redirectToExternalBrowser } from "./index-C5pP_9We.cjs";
3
- import { C as displayEmbeddedWallet, S as displayModal, _ as getUserReferralStatus, a as ModalBuilder, b as ensureIdentity, c as watchWalletStatus, d as REFERRAL_SUCCESS_EVENT, f as setupReferral, g as prepareSso, h as processReferral, i as sendTransaction, l as trackPurchaseStatus, m as ProcessReferralOptions, n as siweAuthenticate, o as ModalStepBuilder, p as referralInteraction, r as SendTransactionParams, s as modalBuilder, t as SiweAuthenticateModalParams, u as sendInteraction, v as getMergeToken, x as displaySharingPage, y as getMerchantInformation } from "./index-DR4n-QOe.cjs";
4
- export { AppSpecificSsoMetadata, AttributionDefaults, AttributionParams, ClientLifecycleEvent, CompressedData, CompressedSsoData, Currency, DEEP_LINK_SCHEME, DeepLinkFallbackOptions, DisplayEmbeddedWalletParamsType, DisplayEmbeddedWalletResultType, DisplayModalParamsType, DisplaySharingPageParamsType, DisplaySharingPageResultType, EmbeddedViewActionReferred, EmbeddedViewActionSharing, EstimatedReward, FinalActionType, FinalModalStepType, FrakClient, FrakContext, FrakContextManager, FrakContextV1, FrakContextV2, FrakLifecycleEvent, FrakWalletSdkConfig, FullSsoParams, GetMerchantInformationReturnType, HashProtectedData, I18nConfig, IFrameLifecycleEvent, IFrameRpcSchema, IFrameTransport, InteractionTypeKey, KeyProvider, Language, ListenerPreloadOption, LocalizedI18nConfig, LoggedInEmbeddedView, LoggedOutEmbeddedView, LoginModalStepType, MerchantConfigResponse, MergeAttributionInput, ModalBuilder, ModalRpcMetadata, ModalRpcStepsInput, ModalRpcStepsResultType, ModalStepBuilder, ModalStepMetadata, ModalStepTypes, OpenSsoParamsType, OpenSsoReturnType, PrepareSsoParamsType, PrepareSsoReturnType, ProcessReferralOptions, REFERRAL_SUCCESS_EVENT, ResolvedPlacement, ResolvedSdkConfig, RewardTier, SdkEventMap, SdkHandshakeFailureReason, SdkResolvedConfig, SendInteractionParamsType, SendTransactionModalStepType, SendTransactionParams, SendTransactionReturnType, SendTransactionTxType, SharingPageProduct, SiweAuthenticateModalParams, SiweAuthenticateModalStepType, SiweAuthenticateReturnType, SiweAuthenticationParams, SsoMetadata, TokenAmountType, TrackArrivalParams, TrackArrivalResult, UserReferralStatusType, UtmParams, WalletStatusReturnType, base64urlDecode, base64urlEncode, baseIframeProps, clearAllCache, compressJsonToB64, createIFrameFrakClient, decompressJsonFromB64, displayEmbeddedWallet, displayModal, displaySharingPage, ensureIdentity, findIframeInOpener, formatAmount, generateSsoUrl, getBackendUrl, getClientId, getCurrencyAmountKey, getMerchantInformation, getMergeToken, getSupportedCurrency, getUserReferralStatus, isIOS, isInAppBrowser, isMobile, mergeAttribution, modalBuilder, openSso, prepareSso, processReferral, redirectToExternalBrowser, referralInteraction, sdkConfigStore, sendInteraction, sendTransaction, setupClient, setupReferral, siweAuthenticate, ssoPopupFeatures, ssoPopupName, trackEvent, trackPurchaseStatus, triggerDeepLinkWithFallback, watchWalletStatus, withCache };
1
+ import { $ as SdkResolvedConfig, A as ModalRpcStepsResultType, B as OpenSsoReturnType, C as LoggedInEmbeddedView, D as DisplayModalParamsType, E as SharingPageProduct, F as SiweAuthenticateModalStepType, G as FinalModalStepType, H as PrepareSsoReturnType, I as SiweAuthenticateReturnType, J as IFrameLifecycleEvent, K as ModalStepMetadata, L as SiweAuthenticationParams, M as SendTransactionModalStepType, N as SendTransactionReturnType, O as ModalRpcMetadata, P as SendTransactionTxType, Q as ResolvedSdkConfig, R as LoginModalStepType, S as EmbeddedViewActionSharing, T as DisplaySharingPageResultType, U as SsoMetadata, V as PrepareSsoParamsType, W as FinalActionType, X as MerchantConfigResponse, Y as ClientLifecycleEvent, Z as ResolvedPlacement, _ as SendInteractionParamsType, a as FrakContextV1, at as LocalizedI18nConfig, b as LoggedOutEmbeddedView, c as FrakLifecycleEvent, ct as TrackArrivalParams, d as WalletStatusReturnType, et as Currency, f as UserReferralStatusType, g as TokenAmountType, h as RewardTier, i as FrakContext, it as ListenerPreloadOption, j as ModalStepTypes, k as ModalRpcStepsInput, l as IFrameTransport, lt as TrackArrivalResult, m as GetMerchantInformationReturnType, n as ssoPopupFeatures, nt as I18nConfig, o as FrakContextV2, ot as AttributionDefaults, p as EstimatedReward, q as InteractionTypeKey, r as ssoPopupName, rt as Language, s as FrakClient, st as AttributionParams, t as openSso, tt as FrakWalletSdkConfig, u as IFrameRpcSchema, ut as UtmParams, v as DisplayEmbeddedWalletParamsType, w as DisplaySharingPageParamsType, x as EmbeddedViewActionReferred, y as DisplayEmbeddedWalletResultType, z as OpenSsoParamsType } from "./openSso-B0igO6Iu.cjs";
2
+ import { A as DEEP_LINK_SCHEME, C as triggerDeepLinkWithFallback, D as MergeAttributionInput, E as SdkHandshakeFailureReason, F as createIFrameFrakClient, I as CompressedData, L as HashProtectedData, M as getClientId, N as getBackendUrl, O as mergeAttribution, P as setupClient, R as KeyProvider, S as DeepLinkFallbackOptions, T as SdkEventMap, _ as withCache, a as FullSsoParams, b as isMobile, c as findIframeInOpener, d as formatAmount, f as decompressJsonFromB64, g as clearAllCache, h as base64urlEncode, i as CompressedSsoData, j as sdkConfigStore, k as FrakContextManager, l as getSupportedCurrency, m as base64urlDecode, n as getQueryParamCaseInsensitive, o as generateSsoUrl, p as compressJsonToB64, r as AppSpecificSsoMetadata, s as baseIframeProps, t as deleteQueryParamCaseInsensitive, u as getCurrencyAmountKey, v as isIOS, w as trackEvent, x as redirectToExternalBrowser, y as isInAppBrowser } from "./index-k1lfbVkl.cjs";
3
+ import { C as displayEmbeddedWallet, S as displayModal, _ as getUserReferralStatus, a as ModalBuilder, b as ensureIdentity, c as watchWalletStatus, d as REFERRAL_SUCCESS_EVENT, f as setupReferral, g as prepareSso, h as processReferral, i as sendTransaction, l as trackPurchaseStatus, m as ProcessReferralOptions, n as siweAuthenticate, o as ModalStepBuilder, p as referralInteraction, r as SendTransactionParams, s as modalBuilder, t as SiweAuthenticateModalParams, u as sendInteraction, v as getMergeToken, x as displaySharingPage, y as getMerchantInformation } from "./index-C1A3I4x1.cjs";
4
+ export { type AppSpecificSsoMetadata, type AttributionDefaults, type AttributionParams, type ClientLifecycleEvent, type CompressedData, type CompressedSsoData, type Currency, DEEP_LINK_SCHEME, type DeepLinkFallbackOptions, type DisplayEmbeddedWalletParamsType, type DisplayEmbeddedWalletResultType, type DisplayModalParamsType, type DisplaySharingPageParamsType, type DisplaySharingPageResultType, type EmbeddedViewActionReferred, type EmbeddedViewActionSharing, type EstimatedReward, type FinalActionType, type FinalModalStepType, type FrakClient, type FrakContext, FrakContextManager, type FrakContextV1, type FrakContextV2, type FrakLifecycleEvent, type FrakWalletSdkConfig, type FullSsoParams, type GetMerchantInformationReturnType, type HashProtectedData, type I18nConfig, type IFrameLifecycleEvent, type IFrameRpcSchema, type IFrameTransport, type InteractionTypeKey, type KeyProvider, type Language, type ListenerPreloadOption, type LocalizedI18nConfig, type LoggedInEmbeddedView, type LoggedOutEmbeddedView, type LoginModalStepType, type MerchantConfigResponse, type MergeAttributionInput, type ModalBuilder, type ModalRpcMetadata, type ModalRpcStepsInput, type ModalRpcStepsResultType, type ModalStepBuilder, type ModalStepMetadata, type ModalStepTypes, type OpenSsoParamsType, type OpenSsoReturnType, type PrepareSsoParamsType, type PrepareSsoReturnType, type ProcessReferralOptions, REFERRAL_SUCCESS_EVENT, type ResolvedPlacement, type ResolvedSdkConfig, type RewardTier, type SdkEventMap, type SdkHandshakeFailureReason, type SdkResolvedConfig, type SendInteractionParamsType, type SendTransactionModalStepType, type SendTransactionParams, type SendTransactionReturnType, type SendTransactionTxType, type SharingPageProduct, type SiweAuthenticateModalParams, type SiweAuthenticateModalStepType, type SiweAuthenticateReturnType, type SiweAuthenticationParams, type SsoMetadata, type TokenAmountType, type TrackArrivalParams, type TrackArrivalResult, type UserReferralStatusType, type UtmParams, type WalletStatusReturnType, base64urlDecode, base64urlEncode, baseIframeProps, clearAllCache, compressJsonToB64, createIFrameFrakClient, decompressJsonFromB64, deleteQueryParamCaseInsensitive, displayEmbeddedWallet, displayModal, displaySharingPage, ensureIdentity, findIframeInOpener, formatAmount, generateSsoUrl, getBackendUrl, getClientId, getCurrencyAmountKey, getMerchantInformation, getMergeToken, getQueryParamCaseInsensitive, getSupportedCurrency, getUserReferralStatus, isIOS, isInAppBrowser, isMobile, mergeAttribution, modalBuilder, openSso, prepareSso, processReferral, redirectToExternalBrowser, referralInteraction, sdkConfigStore, sendInteraction, sendTransaction, setupClient, setupReferral, siweAuthenticate, ssoPopupFeatures, ssoPopupName, trackEvent, trackPurchaseStatus, triggerDeepLinkWithFallback, watchWalletStatus, withCache };