UNPKG

@privy-io/react-auth

Version:

React client for the Privy Auth API

2 lines (1 loc) • 9.17 kB
import{isMobile as e,isAndroid as t}from"react-device-detect";import{a as r,b as a,u as n}from"./internal-context-Z-fyxadS.mjs";import{useCallback as o,useContext as i}from"react";import{u as l}from"./use-export-wallet-CV4p7L0b.mjs";import{d as s,c as d,g as c,a as p,k as u,f as y,u as m,P as E}from"./get-is-unified-wallet-Boa8DYrQ.mjs";import{a as w,u as h}from"./events-context-CI0iqAXA.mjs";import{create as f}from"@privy-io/js-sdk-core";import{g as v}from"./useWallets-CR0z5IIt.mjs";import{u as T,W}from"./context-WTldtXS8.mjs";function A(e){return{name:e.metadata?.shortName||e.name||"",universalLink:e.mobile.universal,deepLink:e.mobile.native}}function g(a,n){let o=A(n);if(e&&t&&o.universalLink)return M(o.universalLink,a);if(o.deepLink)return _(o.deepLink,a);if(o.universalLink)return M(o.universalLink,a);throw new r(`Unsupported wallet ${n.id}`)}function D(e,t){let r=A(t);if(r.universalLink)return M(r.universalLink,e)}let U="WALLETCONNECT_DEEPLINK_CHOICE";function I(){try{localStorage.removeItem(U)}catch{}}function x({href:e,name:t}){try{localStorage.setItem(U,JSON.stringify({href:e,name:t}))}catch{}}function S(){try{localStorage.removeItem(U)}catch{}}function k(e){return e.startsWith("http://")||e.startsWith("https://")}function _(e,t){if(k(e))return M(e,t);let r=e;return r.includes("://")||(r=e.replaceAll("/","").replaceAll(":",""),r=`${r}://`),r.endsWith("/")||(r=`${r}/`),{redirect:`${r}wc?uri=${encodeURIComponent(t)}`,href:r}}function M(e,t){if(!k(e))return _(e,t);let r=e;return r.endsWith("/")||(r=`${r}/`),{redirect:`${r}wc?uri=${encodeURIComponent(t)}`,href:r}}function b(e,t){window.open(e,t,"noreferrer noopener")}const L=({address:e,nonce:t})=>`${window.location.host} wants you to sign in with your Solana account:\n${e}\n\n${`You are proving you own ${e}.`}\n\nURI: ${window.location.origin}\nVersion: 1\nChain ID: mainnet\nNonce: ${t}\nIssued At: ${(new Date).toISOString()}\nResources:\n- https://privy.io`,C=Symbol("solana-funding-plugin"),R=Symbol("solana-ledger-plugin"),P=(e,{chainType:t,walletIndex:r}={})=>e?.linkedAccounts.filter((e=>!("wallet"!==e.type||"privy"!==e.walletClientType||void 0!==r&&e.walletIndex!==r||void 0!==t&&e.chainType!==t)))??[],N=async({user:e,accessToken:t,proxy:r,refreshSessionAndUser:a,privy:n,appConfig:o,recoverEmbeddedWallet:i,setUser:l,walletIndex:c,chainType:p,recoveryMethod:u,recoveryPassword:y,recoveryAccessToken:m,idempotencyKey:E})=>{if(0===c)if("user-controlled-server-wallets-only"===o.embeddedWallets.mode)await f(n,{request:{chain_type:p},headers:E?{"privy-idempotency-key":E}:void 0});else if("ethereum"===p){let a=s(e);a&&await i({address:a.address}),await r.create({accessToken:t,solanaAddress:a?.address,recoveryMethod:u,recoveryPassword:y,recoveryAccessToken:m})}else{if("solana"!==p)throw Error("Invalid input to create wallet");{let a=d(e);a&&await i({address:a.address}),await r.createSolana({accessToken:t,ethereumAddress:a?.address,recoveryMethod:u,recoveryPassword:y,recoveryAccessToken:m})}}else if("user-controlled-server-wallets-only"===o.embeddedWallets.mode)await f(n,{request:{chain_type:p}});else{let{entropyId:a,entropyIdVerifier:n}=v(e);await i(),await r.addWallet({accessToken:t,entropyId:a,entropyIdVerifier:n,chainType:p,hdWalletIndex:c})}let w=await a(),h=P(w,{chainType:p,walletIndex:c})[0];return l(w),{user:w,account:h}},O=e=>e.reduce(((e,t)=>!e||e.walletIndex<t.walletIndex?t:e),null);let K=async({accessToken:e,appConfig:t,privy:r,emitPrivyEvent:n,proxy:o,refreshSessionAndUser:i,recoverEmbeddedWallet:l,user:s,walletIndex:d,setModalData:p,openModal:u,chainType:y,setUser:m,idempotencyKey:E})=>{if(d<0)throw n("createWallet","onError",a.EMBEDDED_WALLET_CREATE_ERROR),Error(`A negative walletIndex (${d}) is invalid.`);let w=c(s);if(d>0&&!w)throw n("createWallet","onError",a.EMBEDDED_WALLET_NOT_FOUND),Error("Must have an existing embedded wallet to create an additional wallet.");if(t.embeddedWallets.requireUserOwnedRecoveryOnCreate&&"user-controlled-server-wallets-only"===t.embeddedWallets.mode)throw n("createWallet","onError",a.EMBEDDED_WALLET_CREATE_ERROR),Error("User owned recovery not yet supported for this app.");if(!w&&t.embeddedWallets.requireUserOwnedRecoveryOnCreate)return await $({emitPrivyEvent:n,setModalData:p,openModal:u,chainType:y});let h=P(s,{chainType:y,walletIndex:d})[0];if(h)return{user:s,account:h};if(0===d&&!o)return $({emitPrivyEvent:n,setModalData:p,openModal:u,chainType:y});if(!o)throw n("createWallet","onError",a.UNKNOWN_EMBEDDED_WALLET_ERROR),Error("Failed to connect to wallet proxy");return N({appConfig:t,walletIndex:d,chainType:y,user:s,accessToken:e,proxy:o,refreshSessionAndUser:i,privy:r,recoverEmbeddedWallet:l,setUser:m,idempotencyKey:E})},$=async({emitPrivyEvent:e,setModalData:t,openModal:r,chainType:n})=>new Promise(((o,i)=>{t({createWallet:{onSuccess:({user:t,account:r})=>{e("createWallet","onSuccess",{wallet:r}),o({user:t,account:r})},onFailure:t=>{e("createWallet","onError",a.UNKNOWN_EMBEDDED_WALLET_ERROR),i(t)},callAuthOnSuccessOnClose:!1,shouldCreateEth:"ethereum"===n,shouldCreateSol:"solana"===n}}),r("EmbeddedWalletOnAccountCreateScreen")}));const B=()=>{let e=T(),t=w(),{setModalData:r}=p(),{initializeWalletProxy:o,recoverEmbeddedWallet:i,setUser:l,openModal:s,refreshSessionAndUser:d,privy:c,client:u}=n();return{create:async({chainType:n,options:p,latestUser:y,idempotencyKey:m})=>{let E=y;if(E||(E=await d()),!E)throw t("createWallet","onError",a.MUST_BE_AUTHENTICATED),Error("User must be authenticated before creating a Privy wallet");return await(async({appConfig:e,getAccessToken:t,initializeWalletProxy:r,user:n,privy:o,emitPrivyEvent:i,recoverEmbeddedWallet:l,setModalData:s,openModal:d,setUser:c,options:p,timeoutDuration:u,refreshSessionAndUser:y,chainType:m,idempotencyKey:E})=>{let[w,h]=await Promise.all([r(u),t()]);if(!h||!n)throw i("createWallet","onError",a.MUST_BE_AUTHENTICATED),Error("User must be authenticated before creating a Privy wallet");if(!w&&e.customAuth?.enabled)throw i("createWallet","onError",a.UNKNOWN_EMBEDDED_WALLET_ERROR),Error("Failed to connect to wallet proxy");if(p&&"walletIndex"in p&&"number"==typeof p.walletIndex){if("user-controlled-server-wallets-only"===e.embeddedWallets.mode)throw i("createWallet","onError",a.INVALID_DATA),Error("Invalid input, use `createAdditional` instead of `walletIndex` to create additional wallets.");return K({accessToken:h,appConfig:e,privy:o,emitPrivyEvent:i,openModal:d,proxy:w,refreshSessionAndUser:y,recoverEmbeddedWallet:l,setModalData:s,user:n,walletIndex:p.walletIndex,chainType:m,setUser:c})}let f=p&&"createAdditional"in p&&p.createAdditional,v=P(n,{chainType:m});if(v[0]&&!f)throw i("createWallet","onError",a.EMBEDDED_WALLET_ALREADY_EXISTS),Error("User already has an embedded wallet.");return K({accessToken:h,appConfig:e,privy:o,emitPrivyEvent:i,openModal:d,proxy:w,recoverEmbeddedWallet:l,setModalData:s,user:n,walletIndex:(O(v)?.walletIndex??-1)+1,chainType:m,refreshSessionAndUser:y,setUser:c,idempotencyKey:E})})({appConfig:e,privy:c,getAccessToken:()=>u.getAccessToken(),refreshSessionAndUser:d,initializeWalletProxy:o,user:E,emitPrivyEvent:t,recoverEmbeddedWallet:i,setModalData:r,openModal:s,setUser:l,options:p,timeoutDuration:W,chainType:n,idempotencyKey:m})}}};function j(e){let{create:t}=B();return h("createWallet",e),{createWallet:async e=>{e&&"target"in e&&e&&(e=void 0);let{account:r}=await t({chainType:"ethereum",options:e});return r}}}const z=async({emitPrivyEvent:e,getAccessToken:t,initializeWalletProxy:n,refreshSessionAndUser:o,user:i,appConfig:l},{privateKey:s,chainType:d,additionalSigners:c})=>{if(!i)throw e("linkAccount","onError",a.MUST_BE_AUTHENTICATED,{linkMethod:"siwe"}),new r("User must be authenticated before linking an account.");let p="user-controlled-server-wallets-only"===l.embeddedWallets.mode?"tee":"on-device";if(c&&"on-device"===p)throw new r("Specifying additionalSigners is only supported for TEE execution and this app uses On-device execution. Learn more https://docs.privy.io/recipes/tee-wallet-migration-guide");let[m,E]=await Promise.all([t(),n(15e3)]);if(!E||!m)throw e("linkAccount","onError",a.MUST_BE_AUTHENTICATED,{linkMethod:"siwe"}),new r("User must be authenticated before linking an account.");let{address:w}=await E.importWallet({privateKey:s,accessToken:m,chainType:d,mode:p,additionalSigners:c}),h=await o(),f="solana"===d?u(h):y(h),v=f?.find((e=>e.address===w));if(!v)throw e("createWallet","onError",a.UNKNOWN_EMBEDDED_WALLET_ERROR),Error("Failed to import wallet");return e("createWallet","onSuccess",{wallet:v}),v},F=()=>{let{user:e}=m(),{client:t,refreshSessionAndUser:r,initializeWalletProxy:a}=n(),i=w(),l=T();return{importWallet:o((({privateKey:n,additionalSigners:o})=>z({getAccessToken:()=>t.getAccessToken(),user:e,initializeWalletProxy:a,refreshSessionAndUser:r,emitPrivyEvent:i,appConfig:l},{privateKey:n,chainType:"ethereum",additionalSigners:o})),[e,t,r,a,i,l])}},H=()=>{let{importWallet:e}=F(),{exportWallet:t}=l(),{createWallet:r}=j();return{...i(E),importWallet:e,createWallet:r,exportWallet:t}};export{C as S,D as a,g as b,N as c,I as d,R as e,B as f,j as g,F as h,z as i,b as o,L as p,S as r,x as s,H as u};