UNPKG

@frak-labs/components

Version:

Frak Wallet components, helping any person to interact with the Frak wallet.

13 lines 17.7 kB
export const __webpack_ids__=["321"];export const __webpack_modules__={"./src/components/ButtonWallet/utils.ts":function(e,t,n){n.d(t,{G:()=>o});var r=n("../core/dist/actions.js");function o(){if(!window.FrakSetup?.client){console.error("Frak client not found");return}"vibrate"in navigator?navigator.vibrate(10):console.log("Vibration not supported"),(0,r.s9)(window.FrakSetup.client,window.FrakSetup?.modalWalletConfig??{})}},"./src/hooks/useClientReady.ts":function(e,t,n){n.d(t,{t:()=>a});var r=n("./src/utils/clientReady.ts"),o=n("../../node_modules/preact/hooks/dist/hooks.module.js");function a(){let[e,t]=(0,o.eJ)(!0),n=(0,o.I4)(()=>{t(!1)},[]);return(0,o.d4)(()=>((0,r.D)("add",n),()=>(0,r.D)("remove",n)),[n]),{isClientReady:!e}}},"./src/hooks/useReward.ts":function(e,t,n){n.d(t,{w:()=>s});var r=n("../core/dist/index.js"),o=n("../core/dist/actions.js");async function a({targetInteraction:e}){let t=window.FrakSetup?.client;if(!t){console.warn("Frak client not ready yet");return}let{maxReferrer:n,rewards:a}=await (0,o.pO)(t);if(!n)return;let i=(0,r.Up)(t.config.metadata?.currency),s=Math.ceil(n[i]);if(e){let t=a.filter(t=>t.interactionTypeKey===e).map(e=>e.referrer[i]).reduce((e,t)=>t>e?t:e,0);t>0&&(s=Math.ceil(t))}return(0,r.dN)(s,t.config.metadata?.currency)}var i=n("../../node_modules/preact/hooks/dist/hooks.module.js");function s(e,t){let[n,r]=(0,i.eJ)(void 0);return(0,i.d4)(()=>{e&&a({targetInteraction:t}).then(e=>{e&&r(e)})},[e,t]),{reward:n}}},"./src/utils/clientReady.ts":function(e,t,n){n.d(t,{D:()=>a,f:()=>o});let r="frakClientReady";function o(){let e=new CustomEvent(r);window.dispatchEvent(e)}function a(e,t){if(window.FrakSetup?.client&&"add"===e){t();return}("add"===e?window.addEventListener:window.removeEventListener)(r,t,!1)}},"./src/utils/registerWebComponent.ts":function(e,t,n){n.d(t,{A:()=>l});var r=n("../../node_modules/preact-custom-element/dist/preact-custom-element.esm.js"),o=n("../core/dist/index.js"),a=n("./src/components/ButtonWallet/utils.ts"),i=n("./src/utils/clientReady.ts"),s=n("./src/utils/setup.ts");async function c(){if(!(window.frakSetupInProgress?(console.log("[Frak SDK] Initialization already in progress"),!1):window.FrakSetup?.client?(console.log("[Frak SDK] Client already initialized"),!1):!!window.FrakSetup?.config||(console.error("[Frak SDK] Configuration not found. Please ensure window.FrakSetup.config is set."),!1)))return;if(console.log("[Frak SDK] Starting initialization"),window.frakSetupInProgress=!0,!window.FrakSetup.config){console.error("[Frak SDK] Configuration not found"),window.frakSetupInProgress=!1;return}let e=await (0,o.lD)({config:window.FrakSetup.config});if(!e){console.error("[Frak SDK] Failed to create client"),window.frakSetupInProgress=!1;return}window.FrakSetup.client=e,console.log("[Frak SDK] Client initialized successfully"),(0,i.f)(),(0,s.N3)(e),(0,s.zK)(e),window.frakSetupInProgress=!1,function(){let e=new URLSearchParams(window.location.search).get("frakAction");e&&"share"===e&&(console.log("[Frak SDK] Auto open query param found"),(0,a.G)())}()}function l(e,t,n=[],o={shadow:!1}){if("undefined"!=typeof window){var a;a=async function(){await c()},"complete"===document.readyState||"interactive"===document.readyState?setTimeout(a,1):document.addEventListener?document.addEventListener("DOMContentLoaded",a):document.attachEvent("onreadystatechange",()=>{"complete"===document.readyState&&a()}),customElements.get(t)||(0,r.Z)(e,t,n,o)}}},"./src/utils/setup.ts":function(e,t,n){n.d(t,{Gt:()=>i,N3:()=>o,zK:()=>a});var r=n("../core/dist/actions.js");function o(e){window.modalBuilderSteps=(0,r.jy)(e,window.FrakSetup?.modalConfig??{})}async function a(e){console.log("referral",await (0,r.KS)(e,{modalConfig:window.FrakSetup?.modalWalletConfig}))}function i(){if(!window.modalBuilderSteps)throw Error("modalBuilderSteps not found");return window.modalBuilderSteps}},"../core/dist/actions.js":function(e,t,n){n.d(t,{KS:()=>E,jy:()=>w,pO:()=>f,s9:()=>u});var r=n("../../node_modules/viem/_esm/utils/hash/keccak256.js"),o=n("../../node_modules/viem/_esm/utils/encoding/toHex.js"),a=n("../../node_modules/viem/_esm/utils/encoding/toBytes.js"),i=n("../../node_modules/viem/_esm/utils/data/concat.js"),s=n("../../node_modules/viem/_esm/utils/data/pad.js"),c=n("../../node_modules/viem/_esm/utils/address/isAddressEqual.js");async function l(e,{productId:t,interaction:n,validation:a}){let i=t??function({domain:e}){let t=e??window.location.host;return(0,r.w)((0,o.NC)(t))}(e.config);return await e.request({method:"frak_sendInteraction",params:[i,n,a]})}async function d(e,{steps:t,metadata:n}){return await e.request({method:"frak_displayModal",params:[t,n,e.config.metadata]})}async function u(e,t){return await e.request({method:"frak_displayEmbeddedWallet",params:[t,e.config.metadata]})}async function f(e){return await e.request({method:"frak_getProductInformation"})}function w(e,{metadata:t,login:n,openSession:r}){return function e(t,n){async function r(e){return e&&(n.metadata=e(n.metadata??{})),await d(t,n)}return{params:n,sendTx:function(r){return e(t,{...n,steps:{...n.steps,sendTransaction:r}})},reward:function(r){return e(t,{...n,steps:{...n.steps,final:{...r,action:{key:"reward"}}}})},sharing:function(r,o){return e(t,{...n,steps:{...n.steps,final:{...o,action:{key:"sharing",options:r}}}})},display:r}}(e,{steps:{login:n??{},openSession:r??{}},metadata:t})}let m="fCtx";function p({url:e}){if(!e)return null;let t=new URL(e).searchParams.get(m);return t?function(e){if(e&&0!==e.length)try{let t;let n=(t=e.length%4,Uint8Array.from(atob(e.replace(/-/g,"+").replace(/_/g,"/").padEnd(e.length+(0===t?0:4-t),"=")),e=>e.charCodeAt(0)));return{r:(0,o.ci)(n,{size:20})}}catch(t){console.error("Error decompressing Frak context",{e:t,context:e})}}(t):null}let g={parse:p,replaceUrl:function({url:e,context:t}){let n,r;if(!window.location?.href||"undefined"==typeof window){console.error("No window found, can't update context");return}let o=e??window.location.href;(n=null!==t?function({url:e,context:t}){if(!e)return null;let n=p({url:e}),r=n?{...n,...t}:t;if(!r.r)return null;let o=function(e){if(e?.r)try{var t;return t=(0,a.nr)(e.r),btoa(Array.from(t,e=>String.fromCharCode(e)).join("")).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}catch(t){console.error("Error compressing Frak context",{e:t,context:e})}}(r);if(!o)return null;let i=new URL(e);return i.searchParams.set(m,o),i.toString()}({url:o,context:t}):((r=new URL(o)).searchParams.delete(m),r.toString()))&&window.history.replaceState(null,"",n.toString())}},h={dapp:1,press:2,webshop:3,retail:4,referral:30,purchase:31};Object.entries(h).reduce((e,[t,n])=>(e[t]=BigInt(1)<<BigInt(n),e),{});let y={createLink:()=>({handlerTypeDenominator:(0,o.NC)(h.referral),interactionData:"0xb2c0f17c"}),referred({referrer:e}){let t=(0,i.SM)(["0x010cc3b9",(0,s.vk)(e,{size:32})]);return{handlerTypeDenominator:(0,o.NC)(h.referral),interactionData:t}}};class v extends Error{code;data;constructor(e,t,n){super(t),this.code=e,this.data=n}}let k={walletNotConnected:-32005,serverErrorForInteractionDelegation:-32006};async function S(e,{walletStatus:t,frakContext:n,modalConfig:r,productId:o,options:a}){let i=!1;async function s(){if(!i)return i=!0,C(e,{modalConfig:{...r,loggedIn:{action:{key:"referred"}}},walletStatus:t})}async function c(t){let n=y.referred({referrer:t});await l(e,{productId:o,interaction:n})}try{let{status:e,currentWallet:r}=await b({initialWalletStatus:t,getFreshWalletStatus:s,pushReferralInteraction:c,frakContext:n});return g.replaceUrl({url:window.location?.href,context:a?.alwaysAppendUrl?{r:r}:null}),e}catch(e){return console.log("Error processing referral",{error:e}),g.replaceUrl({url:window.location?.href,context:a?.alwaysAppendUrl?{r:t?.wallet}:null}),function(e){if(e instanceof v)switch(e.code){case k.walletNotConnected:return"no-wallet";case k.serverErrorForInteractionDelegation:return"no-session"}return"error"}(e)}}async function b({initialWalletStatus:e,getFreshWalletStatus:t,pushReferralInteraction:n,frakContext:r}){let o=e?.wallet;return r?.r?(o||(o=await t()),o&&(0,c.E)(r.r,o))?{status:"self-referral",currentWallet:o}:(e?.interactionSession||(o=await t()),await n(r.r),{status:"success",currentWallet:o}):{status:"no-referrer",currentWallet:o}}async function C(e,{modalConfig:t,walletStatus:n}){if(!n?.interactionSession){let n=await u(e,t??{});return n?.wallet??void 0}return n.wallet??void 0}async function E(e,{productId:t,modalConfig:n,options:r}={}){var o;let a=g.parse({url:window.location.href}),i=await e.request({method:"frak_listenToWalletStatus"}).then(e=>{var t;return t=e.interactionToken,"undefined"!=typeof window&&(t?window.sessionStorage.setItem("frak-wallet-interaction-token",t):window.sessionStorage.removeItem("frak.interaction-token")),e});try{return await S(e,{walletStatus:i,frakContext:a,modalConfig:n,productId:t,options:r})}catch(e){console.warn("Error processing referral",{error:e})}}},"../core/dist/index.js":function(e,t,n){n.d(t,{Up:()=>b,dN:()=>C,lD:()=>S,oC:()=>c,ss:()=>s,u:()=>a});var r=n("../../node_modules/@jsonjoy.com/json-pack/lib/cbor/index.js"),o=n("../../node_modules/viem/_esm/utils/hash/sha256.js");class a extends Error{code;data;constructor(e,t,n){super(t),this.code=e,this.data=n}}class i extends a{constructor(e){super(s.internalError,e)}}let s={parseError:-32700,invalidRequest:-32600,methodNotFound:-32601,invalidParams:-32602,internalError:-32603,serverError:-32e3,clientNotConnected:-32001,configError:-32002,corruptedResponse:-32003,clientAborted:-32004,walletNotConnected:-32005,serverErrorForInteractionDelegation:-32006};class c{config;iframe;isSetupDone=!1;lastResponse=null;lastRequest=null;constructor(e,t){this.config=e,this.iframe=t,this.lastRequest=null,this.lastResponse=null}setLastResponse(e){this.lastResponse={event:e.data,origin:e.origin,timestamp:Date.now()}}setLastRequest(e,t){this.lastRequest={event:e,target:t,timestamp:Date.now()}}updateSetupStatus(e){this.isSetupDone=e}base64Encode(e){try{return btoa(JSON.stringify(e))}catch(e){return console.warn("Failed to encode debug data",e),btoa("Failed to encode data")}}getIframeStatus(){return this.iframe?{loading:this.iframe.hasAttribute("loading"),url:this.iframe.src,readyState:this.iframe.contentDocument?.readyState?+("complete"===this.iframe.contentDocument.readyState):-1,contentWindow:!!this.iframe.contentWindow,isConnected:this.iframe.isConnected}:null}getNavigatorInfo(){return navigator?{userAgent:navigator.userAgent,language:navigator.language,onLine:navigator.onLine,screenWidth:window.screen.width,screenHeight:window.screen.height,pixelRatio:window.devicePixelRatio}:null}gatherDebugInfo(e){let t=this.getIframeStatus(),n=this.getNavigatorInfo(),r="Unknown";return e instanceof a?r=`FrakRpcError: ${e.code} '${e.message}'`:e instanceof Error?r=e.message:"string"==typeof e&&(r=e),{timestamp:new Date().toISOString(),encodedUrl:btoa(window.location.href),encodedConfig:this.config?this.base64Encode(this.config):"no-config",navigatorInfo:n?this.base64Encode(n):"no-navigator",iframeStatus:t?this.base64Encode(t):"not-iframe",lastRequest:this.lastRequest?this.base64Encode(this.lastRequest):"No Frak request logged",lastResponse:this.lastResponse?this.base64Encode(this.lastResponse):"No Frak response logged",clientStatus:this.isSetupDone?"setup":"not-setup",error:r}}static empty(){return new c}formatDebugInfo(e){let t=this.gatherDebugInfo(e);return` Debug Information: ----------------- Timestamp: ${t.timestamp} URL: ${t.encodedUrl} Config: ${t.encodedConfig} Navigator Info: ${t.navigatorInfo} IFrame Status: ${t.iframeStatus} Last Request: ${t.lastRequest} Last Response: ${t.lastResponse} Client Status: ${t.clientStatus} Error: ${t.error} `.trim()}}class l{_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)}}let d=new r.CborEncoder;function u(e){let t={...e,validationHash:f(e)};return d.encode(t)}function f(e){return(0,o.J)(d.encode(e))}let w=new r.CborDecoder;function m(e){if(!e.length)throw new a(s.corruptedResponse,"Missing compressed data");let t=function(e){try{return w.decode(e)}catch(t){return console.error("Invalid compressed data",{e:t,data:e}),null}}(e);if(!t)throw new a(s.corruptedResponse,"Invalid compressed data");if(!t?.validationHash)throw new a(s.corruptedResponse,"Missing validation hash");let{validationHash:n,...r}=t;if(f(r)!==t.validationHash)throw new a(s.corruptedResponse,"Invalid data validation hash");return t}let p="nexus-wallet-backup",g=2000001;function h({iframe:e,isVisible:t}){if(!t){e.style.width="0",e.style.height="0",e.style.border="0",e.style.position="fixed",e.style.top="-1000px",e.style.left="-1000px";return}e.style.position="fixed",e.style.top="0",e.style.left="0",e.style.width="100%",e.style.height="100%",e.style.pointerEvents="auto"}async function y({config:e,messageHandler:t,lifecycleManager:n}){async function r(){let n=e.customizations?.css;n&&t.sendEvent({clientLifecycle:"modal-css",data:{cssLink:n}})}async function o(){let n=e.customizations?.i18n;n&&t.sendEvent({clientLifecycle:"modal-i18n",data:{i18n:n}})}async function a(){if("undefined"==typeof window)return;let e=window.localStorage.getItem(p);e&&t.sendEvent({clientLifecycle:"restore-backup",data:{backup:e}})}await n.isConnected,await Promise.all([r(),o(),a()])}let v={eur:"fr-FR",usd:"en-US",gbp:"en-GB"};function k(e){return e&&e in v?e:"eur"}async function S({config:e}){let t;let n=(t=k(e.metadata?.currency),{...e,metadata:{...e.metadata,currency:t}}),r=await function({walletBaseUrl:e,config:t}){let n=document.querySelector("#frak-wallet");n&&n.remove();let r=document.createElement("iframe");return r.id="frak-wallet",r.name="frak-wallet",r.allow="publickey-credentials-get *; clipboard-write; web-share *",r.style.zIndex=g.toString(),h({iframe:r,isVisible:!1}),document.body.appendChild(r),new Promise(n=>{r?.addEventListener("load",()=>n(r)),r.src=`${t?.walletUrl??e??"https://wallet.frak.id"}/listener`})}({config:n});if(!r){console.error("Failed to create iframe");return}let o=function({config:e,iframe:t}){let n;let r=(n=new Map,{createChannel:e=>{let t=Math.random().toString(36).substring(7);return n.set(t,e),t},getRpcResolver:e=>n.get(e),removeChannel:e=>n.delete(e),destroy:()=>n.clear()}),o=function({iframe:e}){let t=new l;return{handleEvent:async n=>{switch(n.iframeLifecycle){case"connected":t.resolve(!0);break;case"do-backup":n.data.backup?localStorage.setItem(p,n.data.backup):localStorage.removeItem(p);break;case"remove-backup":localStorage.removeItem(p);break;case"show":case"hide":h({iframe:e,isVisible:"show"===n.iframeLifecycle});break;case"handshake":e.contentWindow?.postMessage({clientLifecycle:"handshake-response",data:{token:n.data.token,currentUrl:window.location.href}},"*")}},isConnected:t.promise}}({iframe:t}),d=new c(e,t),f=function({frakWalletUrl:e,iframe:t,channelManager:n,iframeLifecycleManager:r,debugInfo:o}){if("undefined"==typeof window)throw new a(s.configError,"iframe client should be used in the browser");if(!t.contentWindow)throw new a(s.configError,"The iframe does not have a product window");let i=t.contentWindow;async function c(t){if(!t.origin)return;try{if(new URL(t.origin).origin.toLowerCase()!==new URL(e).origin.toLowerCase())return}catch(e){console.log("Unable to check frak msg origin",e);return}if("object"!=typeof t.data)return;if(o.setLastResponse(t),"iframeLifecycle"in t.data){await r.handleEvent(t.data);return}if("clientLifecycle"in t.data){console.error("Client lifecycle event received on the client side, dismissing it");return}let a=t.data.id,i=n.getRpcResolver(a);i&&i(t.data)}return window.addEventListener("message",c),{sendEvent:function(t){i.postMessage(t,{targetOrigin:e}),o.setLastRequest(t,e)},cleanup:function(){window.removeEventListener("message",c)}}}({frakWalletUrl:e?.walletUrl??"https://wallet.frak.id",iframe:t,channelManager:r,iframeLifecycleManager:o,debugInfo:d}),w=async e=>{if(!await o.isConnected)throw new a(s.clientNotConnected,"The iframe provider isn't connected yet");let t=new l,n=r.createChannel(e=>{let o=m(e.data);o.error?t.reject(new a(o.error.code,o.error.message,o.error?.data)):t.resolve(o.result),r.removeChannel(n)}),i=u(e);return f.sendEvent({id:n,topic:e.method,data:i}),t.promise},g=async(e,t)=>{if(!await o.isConnected)throw new a(s.clientNotConnected,"The iframe provider isn't connected yet");let n=r.createChannel(e=>{let n=m(e.data);if(n.result)t(n.result);else throw new i("No valid result in the response")}),c=u(e);f.sendEvent({id:n,topic:e.method,data:c})},v=function(e,t){let n,r;let o=()=>e.sendEvent({clientLifecycle:"heartbeat"});function a(){n&&clearInterval(n),r&&clearTimeout(r)}return async function(){o(),n=setInterval(o,100),r=setTimeout(()=>{a(),console.log("Heartbeat timeout: connection failed")},3e4),await t.isConnected,a()}(),a}(f,o),k=async()=>{v(),r.destroy(),f.cleanup(),t.remove()},S=y({config:e,messageHandler:f,lifecycleManager:o}).then(()=>d.updateSetupStatus(!0));return{config:e,debugInfo:d,waitForConnection:o.isConnected,waitForSetup:S,request:w,listenerRequest:g,destroy:k}}({config:n,iframe:r});if(await o.waitForSetup,!await o.waitForConnection){console.error("Failed to connect to client");return}return o}function b(e){return e?`${e}Amount`:"eurAmount"}function C(e,t){let n=t?v[t]??v.eur:v.eur,r=k(t);return e.toLocaleString(n,{style:"currency",currency:r,minimumFractionDigits:0,maximumFractionDigits:2})}Object.entries({dapp:1,press:2,webshop:3,retail:4,referral:30,purchase:31}).reduce((e,[t,n])=>(e[t]=BigInt(1)<<BigInt(n),e),{})}};