UNPKG

@frak-labs/core-sdk

Version:

Core SDK of the Frak wallet, low level library to interact directly with the frak ecosystem.

1 lines 6.6 kB
import{Deferred as e,FrakRpcError as t,RpcErrorCodes as n}from"@frak-labs/frame-connector";import{bytesToHex as r,concatHex as a,hexToBytes as o,isAddressEqual as i,keccak256 as s,pad as l,toHex as c}from"viem";import{generateSiweNonce as u}from"viem/siwe";function f(t,n){if(!n)return t.request({method:"frak_listenToWalletStatus"}).then(e=>(d(t,e),e));let r=new e,a=!1;return t.listenerRequest({method:"frak_listenToWalletStatus"},e=>{d(t,e),n(e),a||(r.resolve(e),a=!0)}),r.promise}function d(e,t){"undefined"!=typeof window&&(e.openPanel?.setGlobalProperties({wallet:t.wallet??null}),t.interactionToken?window.sessionStorage.setItem("frak-wallet-interaction-token",t.interactionToken):window.sessionStorage.removeItem("frak-wallet-interaction-token"))}async function w(e,{productId:t,interaction:n,validation:r}){let a=t??function({domain:e}){return s(c((e??window.location.host).replace("www.","")))}(e.config);return await e.request({method:"frak_sendInteraction",params:[a,n,r]})}async function p(e,{steps:t,metadata:n}){return await e.request({method:"frak_displayModal",params:[t,n,e.config.metadata]})}async function m(e,t){return await e.request({method:"frak_displayEmbeddedWallet",params:[t,e.config.metadata]})}async function h(e,t){let{metadata:n,customizations:r}=e.config;return await e.request({method:"frak_sso",params:[t,n.name,r?.css]})??{}}async function g(e){return await e.request({method:"frak_getProductInformation"})}async function y(e){if("undefined"==typeof window)return void console.warn("[Frak] No window found, can't track purchase");let t=window.sessionStorage.getItem("frak-wallet-interaction-token");if(!t)return void console.warn("[Frak] No frak session found, skipping purchase check");await fetch("https://backend.frak.id/interactions/listenForPurchase",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","x-wallet-sdk-auth":t},body:JSON.stringify(e)})}async function k(e,{siwe:t,metadata:n}){let r=e.config?.domain??window.location.host,a=t?.statement??`I confirm that I want to use my Frak wallet on: ${e.config.metadata.name}`,o={...t,statement:a,nonce:t?.nonce??u(),uri:t?.uri??`https://${r}`,version:t?.version??"1",domain:r};return(await p(e,{metadata:n,steps:{login:{},siweAuthenticate:{siwe:o}}})).siweAuthenticate}async function S(e,{tx:t,metadata:n}){return(await p(e,{metadata:n,steps:{login:{},sendTransaction:{tx:t}}})).sendTransaction}function v(e,{metadata:t,login:n,openSession:r}){return function e(t,n){async function r(e){return e&&(n.metadata=e(n.metadata??{})),await p(t,n)}return{params:n,sendTx:function(r){return e(t,{...n,steps:{...n.steps,sendTransaction:r}})},reward:function(r){return e(t,{...n,steps:{...n.steps,final:{...r,action:{key:"reward"}}}})},sharing:function(r,a){return e(t,{...n,steps:{...n.steps,final:{...a,action:{key:"sharing",options:r}}}})},display:r}}(e,{steps:{login:n??{},openSession:r??{}},metadata:t})}let b="fCtx";function I({url:e}){if(!e)return null;let t=new URL(e).searchParams.get(b);return t?function(e){if(e&&0!==e.length)try{let t=function(e){let t=e.length%4;return Uint8Array.from(atob(e.replace(/-/g,"+").replace(/_/g,"/").padEnd(e.length+(0===t?0:4-t),"=")),e=>e.charCodeAt(0))}(e);return{r:r(t,{size:20})}}catch(t){console.error("Error decompressing Frak context",{e:t,context:e})}}(t):null}let T={parse:I,replaceUrl:function({url:e,context:t}){let n;if(!window.location?.href||"undefined"==typeof window)return void console.error("No window found, can't update context");let r=e??window.location.href;(n=null!==t?function({url:e,context:t}){if(!e)return null;let n=I({url:e}),r=n?{...n,...t}:t;if(!r.r)return null;let a=function(e){if(e?.r)try{var t;return t=o(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(!a)return null;let i=new URL(e);return i.searchParams.set(b,a),i.toString()}({url:r,context:t}):function(e){let t=new URL(e);return t.searchParams.delete(b),t.toString()}(r))&&window.history.replaceState(null,"",n.toString())}},P="0x010cc3b9",x="0xb2c0f17c",F={dapp:1,press:2,webshop:3,retail:4,referral:30,purchase:31};Object.entries(F).reduce((e,[t,n])=>(e[t]=BigInt(1)<<BigInt(n),e),{});let _={createLink:()=>({handlerTypeDenominator:c(F.referral),interactionData:x}),referred({referrer:e}){let t=a([P,l(e,{size:32})]);return{handlerTypeDenominator:c(F.referral),interactionData:t}}};async function A(e,{walletStatus:r,frakContext:a,modalConfig:o,productId:i,options:s}){let l=!1;async function c(){if(!l)return l=!0,E(e,{modalConfig:{...o,loggedIn:{action:{key:"referred"}}},walletStatus:r})}async function u(t){let n=_.referred({referrer:t});await Promise.allSettled([w(e,{productId:i,interaction:n}),function(e,t,n={}){if(!e)return void console.debug("[Frak] No client provided, skipping event tracking");try{e.openPanel?.track(t,n)}catch(e){console.debug("[Frak] Failed to track event:",t,e)}}(e,"user_referred",{properties:{referrer:t}})])}try{let{status:e,currentWallet:t}=await U({initialWalletStatus:r,getFreshWalletStatus:c,pushReferralInteraction:u,frakContext:a});return T.replaceUrl({url:window.location?.href,context:s?.alwaysAppendUrl?{r:t}:null}),e}catch(e){return console.log("Error processing referral",{error:e}),T.replaceUrl({url:window.location?.href,context:s?.alwaysAppendUrl?{r:r?.wallet}:null}),function(e){if(e instanceof t)switch(e.code){case n.walletNotConnected:return"no-wallet";case n.serverErrorForInteractionDelegation:return"no-session"}return"error"}(e)}}async function U({initialWalletStatus:e,getFreshWalletStatus:t,pushReferralInteraction:n,frakContext:r}){let a=e?.wallet;return r?.r?(a||(a=await t()),a&&i(r.r,a))?{status:"self-referral",currentWallet:a}:(e?.interactionSession||(a=await t()),await n(r.r),{status:"success",currentWallet:a}):{status:"no-referrer",currentWallet:a}}async function E(e,{modalConfig:t,walletStatus:n}){if(!n?.interactionSession){let n=await m(e,t??{});return n?.wallet??void 0}return n.wallet??void 0}async function q(e,{productId:t,modalConfig:n,options:r}={}){let a=T.parse({url:window.location.href}),o=await f(e);try{return await A(e,{walletStatus:o,frakContext:a,modalConfig:n,productId:t,options:r})}catch(e){console.warn("Error processing referral",{error:e})}}export{m as displayEmbeddedWallet,p as displayModal,g as getProductInformation,v as modalBuilder,h as openSso,A as processReferral,q as referralInteraction,w as sendInteraction,S as sendTransaction,k as siweAuthenticate,y as trackPurchaseStatus,f as watchWalletStatus};