@privy-io/expo
Version:
Expo client for the Privy Auth API
1 lines • 73.1 kB
JavaScript
import{a as P,b as N,d as l,e as ut,f as mt,g as ye}from"./chunk-QTVIWU3N.js";import{useEffect as Rr}from"react";import{create as Ir}from"zustand";var pt=Ir(()=>({status:"disconnected"})),fe=()=>pt.getState().onNeedsRecovery,Or=e=>{Rr(()=>{pt.setState({onNeedsRecovery:e==null?void 0:e.onNeedsRecovery})},[e==null?void 0:e.onNeedsRecovery])};import{digest as Mr,randomUUID as Fr}from"expo-crypto";import Tr from"@privy-io/js-sdk-core";var yt={name:"@privy-io/expo",version:"0.66.2",description:"Expo client for the Privy Auth API",keywords:["authentication","authorization","identity","privacy","privy","user data","react-native","expo","web3"],homepage:"https://docs.privy.io",bugs:{url:"https://privy.io/slack"},license:"Apache-2.0",author:"privy.io",exports:{".":{require:"./dist/index.js",import:"./dist/esm/index.js",types:"./dist/index.d.ts"},"./passkey":{require:"./dist/passkey.js",import:"./dist/esm/passkey.js",types:"./dist/passkey.d.ts"},"./smart-wallets":{require:"./dist/smart-wallets.js",import:"./dist/esm/smart-wallets.js",types:"./dist/smart-wallets.d.ts"},"./extended-chains":{require:"./dist/extended-chains.js",import:"./dist/esm/extended-chains.js",types:"./dist/extended-chains.d.ts"},"./ui":{require:"./dist/ui.js",import:"./dist/esm/ui.js",types:"./dist/ui.d.ts"},"./connectors":{require:"./dist/connectors.js",import:"./dist/esm/connectors.js",types:"./dist/connectors.d.ts"}},main:"./dist/esm/index.js",source:"./src/index.ts",types:"./dist/index.d.ts",files:["dist/**/*","LICENSE","README.md"],scripts:{build:"tsup --clean --minify","check-types":"tsc --noEmit",clean:"rm -rf dist .turbo *.tsbuildinfo","clean:reset":"rm -rf dist .turbo node_modules *.tsbuildinfo",dev:"tsup --watch",format:"oxlint src --fix","generate-types":"tsup --dts-only",lint:"oxlint src",test:"jest"},browserslist:["defaults","node >= 18","not op_mini all"],dependencies:{"@privy-io/api-types":"0.12.0","@privy-io/js-sdk-core":"workspace:*","@privy-io/routes":"workspace:*","@scure/base":"^1.2.4","react-fast-compare":"^3.2.2",tweetnacl:"^1.0.3",zustand:"^5.0.4"},devDependencies:{oxlint:"catalog:package-new","oxlint-tsgolint":"catalog:package-new","@privy-io/eslint-plugin-privy-rules":"workspace:*","@privy-io/tsconfig":"workspace:*","@simplewebauthn/types":"9.0.1","@solana/web3.js":"^1.98.0","@svgr/core":"^8.1.0","@svgr/plugin-jsx":"^8.1.0","@svgr/plugin-svgo":"^8.1.0","@testing-library/react-native":"^13.1.0","@tsconfig/node16-strictest-esm":"^1.0.3","@types/jest":"^29.1.2","@types/react":"catalog:",buffer:"^5.4.3","expo-apple-authentication":"55.0.13","expo-application":"55.0.14","expo-clipboard":"55.0.13","expo-crypto":"55.0.14","expo-linking":"55.0.14","expo-secure-store":"55.0.13","expo-web-browser":"55.0.14",jest:"^29.7.0","jest-expo":"55.0.16","lucide-react-native":"^0.474.0",react:"catalog:","react-native":"0.83.6","react-native-webview":"13.16.0","react-test-renderer":"19.2.0",tsup:"^6.2.3",typescript:"~6.0.2"},peerDependencies:{"@privy-io/expo-native-extensions":"workspace:*","expo-apple-authentication":"*","expo-application":"*","expo-clipboard":"*","expo-crypto":"*","expo-linking":"*","expo-secure-store":"*","expo-web-browser":"*",permissionless:"^0.2.47",react:"*","react-native":"*","react-native-passkeys":"^0.4.0","react-native-qrcode-styled":"0.3.3","react-native-safe-area-context":"*","react-native-svg":"*","react-native-webview":"*",viem:"2.48.11"},peerDependenciesMeta:{permissionless:{optional:!0},viem:{optional:!0},"react-native-svg":{optional:!0},"expo-apple-authentication":{optional:!0},"expo-clipboard":{optional:!0},"expo-linking":{optional:!0},"expo-secure-store":{optional:!0},"expo-web-browser":{optional:!0},"react-native-qrcode-styled":{optional:!0},"react-native-safe-area-context":{optional:!0}},publishConfig:{access:"public"}};var ft=({appId:e,clientId:t,storage:r=ye,supportedChains:n,baseUrl:i,logLevel:o,logger:a})=>new Tr({appId:e,clientId:t,supportedChains:n,storage:mt(r),sdkVersion:`expo:${yt.version}`,nativeAppIdentifier:ut(),crypto:{digest:Mr,randomUUID:Fr},baseUrl:i,logLevel:o,logger:a});import{useCallback as it,useContext as Li}from"react";import{PrivyClientError as Mi}from"@privy-io/js-sdk-core";import Z,{useState as L,useMemo as Ui,createContext as Ai,useCallback as Ue,useRef as le,useEffect as br,useContext as Ri}from"react";import{AppState as Sr,View as Ii}from"react-native";import{PrivyClientError as Er}from"@privy-io/js-sdk-core";import Nr from"react-fast-compare";import{create as Dr}from"zustand";var ge=Dr(()=>{}),gt=e=>ge.setState(t=>Nr(t,e)?t:e),W=ge.getState;import Vr from"react";import{useCallback as zr,useEffect as Gr,useRef as Hr}from"react";import{AppState as Br}from"react-native";import qr from"react-native-webview";import*as F from"expo-secure-store";function ht(e){return typeof e!="object"||e===null||!("event"in e&&typeof e.event=="string")||!("id"in e&&typeof e.id=="string")||!("data"in e&&typeof e.data=="object")||e.data===null?!1:e.event.startsWith("app:secure-storage:")}function wt(e){return l(this,null,function*(){switch(e.event){case"app:secure-storage:get":{let{key:t}=e.data,r=yield F.getItemAsync(Oe(t),{keychainAccessible:F.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY}).catch(n=>(console.warn("Failed to get the value from secure store",n),null));return{event:e.event,id:e.id,data:{value:r}}}case"app:secure-storage:remove":{let{key:t}=e.data,r=yield F.deleteItemAsync(Oe(t),{keychainAccessible:F.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY}).then(()=>!0).catch(n=>(console.warn("Failed to remove the value from secure store",n),!1));return{event:e.event,id:e.id,data:{success:r}}}case"app:secure-storage:set":{let{key:t,value:r}=e.data,n=yield F.setItemAsync(Oe(t),r,{keychainAccessible:F.AFTER_FIRST_UNLOCK_THIS_DEVICE_ONLY}).then(()=>!0).catch(i=>(console.warn("Failed to write the value to secure store",i),!1));return{event:e.event,id:e.id,data:{success:n}}}}})}var Oe=e=>e.replaceAll(":","-");import jr from"react-fast-compare";import{createStore as Kr,useStore as Le}from"zustand";var j=Kr()(()=>({user:null,proxyStatus:"loading"}));function b(){return j.getState().user}var Xi=j.subscribe.bind(j);function Me(e){j.setState(({user:t})=>jr(t,e)?{}:{user:e})}var Fe=e=>j.setState({proxyStatus:e});function U(){return Le(j,e=>e.user)}function Zi(){return Le(j,e=>!!e.user)}function K(){return Le(j,e=>e.proxyStatus!=="loading")}var Jr={shouldUseAppBackedStorage:!0},vt=({client:e,isClientReady:t})=>{let r=Hr(null);Gr(()=>{let i=Br.addEventListener("change",o=>l(void 0,null,function*(){o==="active"&&((yield e.embeddedWallet.ping(500))||(Fe("reloading"),e.embeddedWallet.reload()))}));return()=>i.remove()},[e]);let n=zr(i=>l(void 0,null,function*(){var s;let{data:o}=i.nativeEvent,a=JSON.parse(o);if(ht(a)){let d=yield wt(a);(s=r.current)==null||s.postMessage(JSON.stringify(d));return}e.embeddedWallet.onMessage(a)}),[e]);return t?Vr.createElement(qr,{style:{flex:1},ref:i=>{i&&(e.setMessagePoster(i),r.current=i)},cacheEnabled:!1,cacheMode:"LOAD_NO_CACHE",injectedJavaScriptObject:Jr,source:{uri:e.embeddedWallet.getURL()},webviewDebuggingEnabled:e.logger.level==="DEBUG",onLoad:()=>Fe("loaded"),onError:console.error,onMessage:n}):null};import{useCallback as Te,useEffect as _t,useMemo as Ne}from"react";import{errorIndicatesRecoveryIsNeeded as Yr,getAllUserEmbeddedSolanaWallets as Qr,getEntropyDetailsFromUser as Ct,PrivyClientError as re}from"@privy-io/js-sdk-core";import{getAllUserEmbeddedSolanaWallets as he,getEntropyDetailsFromAccount as bt,getUserEmbeddedEthereumWallet as $r,PrivyClientError as H}from"@privy-io/js-sdk-core";function St(o){return l(this,arguments,function*({client:e,setSolanaWallet:t,createSolanaWalletCallbacks:r,setSolanaRecoveryFlowState:n,opts:i}){var a,s,d;t({status:"creating"});try{let{user:c}=yield e.user.get(),u=he(c),m=u[0],p=(a=$r(c))!=null?a:void 0;if(i!=null&&i.recoveryMethod&&i.recoveryMethod!=="privy")throw new H({code:"embedded_wallet_creation_error",error:"Unsupported recovery method for solana wallet."});if(!(i!=null&&i.createAdditional)&&m)throw new H({code:"embedded_wallet_creation_error",error:"Solana wallet already exists for this user. Set `createAdditional` to `true` to create another wallet"});let w,g;if(m){let y=p!=null?p:m,{entropyId:h,entropyIdVerifier:S}=bt(y),_=Math.max(...u.map(x=>x.wallet_index),0)+1,C=yield e.embeddedWallet.add({chainType:"solana",entropyId:h,entropyIdVerifier:S,hdWalletIndex:_}),k=he(C.user).find(x=>x.wallet_index===_);if(!k)throw new H({error:"Embedded wallet account not created",code:"embedded_wallet_creation_error"});w=yield e.embeddedWallet.getSolanaProvider(k,h,S),g=C.user}else{let y=yield e.embeddedWallet.createSolana({ethereumAccount:p}),h=he(y.user).find(k=>k.wallet_index===0);if(!h)throw new H({error:"Embedded wallet account not created",code:"embedded_wallet_creation_error"});let S=p!=null?p:h,{entropyId:_,entropyIdVerifier:C}=bt(S);w=yield e.embeddedWallet.getSolanaProvider(h,_,C),g=y.user}let v=he(g)[0];if(!v)throw new H({code:"embedded_wallet_creation_error",error:"Unknown error creating solana wallet"});return(d=(s=r.current)==null?void 0:s.onSuccess)==null||d.call(s,w),t({status:"connected",publicKey:v.public_key}),n({status:"initial"}),w}catch(c){let u=c instanceof Error?c.message:"Error creating embedded wallet";throw t({status:"error",error:u}),n({status:"initial"}),new H({code:"embedded_wallet_creation_error",error:u})}})}import{PrivyClientError as z}from"@privy-io/js-sdk-core";function we(u){return l(this,arguments,function*({client:e,account:t,setWallet:r,recoverWalletCallbacks:n,recoveryMethod:i,setRecoveryFlowState:o,password:a,recoveryKey:s,recoveryToken:d,recoverySecretOverride:c}){var m,p,w,g;if(!t)throw new z({code:"embedded_wallet_does_not_exist",error:"Embedded wallet does not exist"});switch(i){case"user-passcode":if(!a)throw new z({code:"embedded_wallet_recovery_error",error:"password is required for user-passcode recovery method"});break;case"google-drive":if(!d)throw new z({code:"embedded_wallet_recovery_error",error:"Recovery token is required for google-drive recovery method"});break;case"icloud":if(!c)throw new z({code:"embedded_wallet_recovery_error",error:"Record name is required for icloud recovery method"});break;case"recovery-encryption-key":if(!s)throw new z({code:"embedded_wallet_recovery_error",error:"recoveryKey is required for recovery-encryption-key recovery method"});break}r({status:"connecting",account:t});try{let v=yield e.embeddedWallet.getProvider(t,a,d,c,s);return r({status:"connected",provider:v,account:t}),o({status:"initial"}),(p=(m=n.current)==null?void 0:m.onSuccess)==null||p.call(m,v),v}catch(v){r({status:"needs-recovery",account:t}),o({status:"initial"});let y=new z({code:"embedded_wallet_recovery_error",error:v instanceof Error?v.message:"Error recovering embedded wallet"});throw(g=(w=n.current)==null?void 0:w.onError)==null||g.call(w,y),y}})}function Et(s){return l(this,arguments,function*({client:e,account:t,entropyId:r,entropyIdVerifier:n,setSolanaWallet:i,recoverSolanaWalletCallbacks:o,setSolanaRecoveryFlowState:a}){var d,c,u,m;i({status:"connecting"});try{let p=yield e.embeddedWallet.getSolanaProvider(t,r,n);return i({status:"connected",publicKey:p._publicKey}),a({status:"initial"}),(c=(d=o.current)==null?void 0:d.onSuccess)==null||c.call(d,p),p}catch(p){i({status:"needs-recovery"}),a({status:"initial"});let w=new z({code:"embedded_wallet_recovery_error",error:p instanceof Error?p.message:"Error recovering embedded wallet"});throw(m=(u=o.current)==null?void 0:u.onError)==null||m.call(u,w),w}})}var kt=({client:e,solanaWallet:t,setSolanaWallet:r,setSolanaRecoveryFlowState:n,createSolanaWalletCallbacks:i,recoverSolanaWalletCallbacks:o})=>{let a=U(),s=Ne(()=>Qr(a),[a]),d=K(),c=Ne(()=>s.length===0?null:Ct(a),[a,s]),u=Ne(()=>{let g=s.map(S=>{let _=Ct(a,S);return _?{account:S,entropy:_}:null});if(g.some(S=>S===null))return[];let v=void 0,y=void 0,h=void 0;return g.filter(S=>S!==null).map(({account:S,entropy:{entropyId:_,entropyIdVerifier:C}})=>({address:S.address,publicKey:S.address,walletIndex:S.wallet_index,getProvider:()=>e.embeddedWallet.getSolanaProvider(S,_,C,v,y,h,k=>l(void 0,null,function*(){var x;yield(x=fe())==null?void 0:x(k)}))}))},[s,a,e]),m=Te(g=>l(void 0,null,function*(){return yield St({client:e,setSolanaWallet:r,createSolanaWalletCallbacks:i,setSolanaRecoveryFlowState:n,opts:g})}),[e,i]),p=Te(()=>l(void 0,null,function*(){if(!c)throw new re({code:"embedded_wallet_does_not_exist",error:"Embedded wallet does not exist"});let{entropyId:g,entropyIdVerifier:v}=c;return Et({client:e,account:s[0],entropyId:g,entropyIdVerifier:v,setSolanaWallet:r,recoverSolanaWalletCallbacks:o,setSolanaRecoveryFlowState:n})}),[e,c,s,o,n,r]),w=Te(()=>l(void 0,null,function*(){if(!c)throw r({status:"not-created"}),new re({code:"embedded_wallet_does_not_exist",error:"Embedded wallet does not exist"});r(g=>g.status==="connected"?{status:"reconnecting"}:{status:"connecting"});try{let{entropyId:g,entropyIdVerifier:v}=c,y=yield e.embeddedWallet.getSolanaProvider(s[0],g,v);return r({status:"connected",publicKey:s[0].public_key}),y}catch(g){throw Yr(g)?(r({status:"needs-recovery"}),new re({code:"embedded_wallet_needs_recovery",error:"Embedded wallet not loaded on device"})):g instanceof Error?(r({status:"error",error:g.message}),new re({code:"unknown_embedded_wallet_error",error:g.message})):(r({status:"error",error:"Error loading embedded wallet"}),new re({code:"unknown_embedded_wallet_error",error:"Error loading embedded wallet"}))}}),[s,e,c,r]);return _t(()=>{if(!a&&t.status!=="disconnected")return r({status:"disconnected"});d&&w().catch(()=>{})},[d,a]),_t(()=>{t.status==="error"&&t.error.includes("User must be logged in")&&w()},[t.status]),{create:m,recover:p,getProvider:w,wallets:u}};import{useCallback as ie,useEffect as At,useMemo as so}from"react";import{getUserEmbeddedEthereumWallet as co,getUserEmbeddedSolanaWallet as Rt,isUnifiedWallet as lo,throwIfInvalidRecoveryUpgradePath as uo}from"@privy-io/js-sdk-core";import{errorIndicatesRecoveryIsNeeded as mo,PrivyClientError as A}from"@privy-io/js-sdk-core";import{getUserEmbeddedEthereumWallet as Xr}from"@privy-io/js-sdk-core";import{PrivyClientError as B}from"@privy-io/js-sdk-core";function ve(m){return l(this,arguments,function*({client:e,setWallet:t,createWalletCallbacks:r,recoveryMethod:n,setRecoveryFlowState:i,password:o,recoveryKey:a,recoveryToken:s,recoverySecretOverride:d,iCloudRecordNameOverride:c,solanaAccount:u}){var w,g;switch(n){case"user-passcode":if(!o)throw new B({code:"embedded_wallet_recovery_error",error:"password is required for user-passcode recovery method"});break;case"recovery-encryption-key":if(!a)throw new B({code:"embedded_wallet_recovery_error",error:"key is required for recovery-encryption-key recovery method"});break;case"google-drive":if(!s)throw new B({code:"embedded_wallet_recovery_error",error:"Recovery token is required for google-drive recovery method"});break;case"icloud":if(!d||!c)throw new B({code:"embedded_wallet_recovery_error",error:"iCloud recovery failed due to inability to store credentials"});break}t({status:"creating",account:null});let p=n==="icloud"?"icloud-native":n;try{let{user:v}=yield e.embeddedWallet.create({password:o,recoveryMethod:p,recoveryKey:a,recoveryToken:s,recoverySecretOverride:d,iCloudRecordNameOverride:c,solanaAccount:u}),y=Xr(v);if(!y)throw new B({error:"Embedded wallet account not created",code:"embedded_wallet_creation_error"});let h=yield e.embeddedWallet.getProvider(y);return(g=(w=r.current)==null?void 0:w.onSuccess)==null||g.call(w,h),t({status:"connected",provider:h,account:y}),i({status:"initial"}),h}catch(v){let y=v instanceof Error?v.message:"Error creating embedded wallet";throw t({status:"error",error:y,account:null}),i({status:"initial"}),new B({code:"embedded_wallet_creation_error",error:y})}})}import{Platform as Wt}from"react-native";import{PrivyClientError as D}from"@privy-io/js-sdk-core";function xt(){return l(this,null,function*(){try{return yield import("@privy-io/expo-native-extensions")}catch(e){throw new Error("@privy-io/expo-native-extensions not found. Ensure that you're explicitly including as a dependency, and running an Expo development build")}})}function oe(n){return l(this,arguments,function*({user:e,appId:t,client:r}){var s;if(Wt.OS==="android")throw new D({code:"embedded_wallet_recovery_error",error:"iCloud recovery is not supported on Android"});let i=yield xt(),o=yield r.recovery.icloudAuth.getICloudConfiguration("expo-ios");if(!(o==null?void 0:o.container_identifier))throw new D({code:"embedded_wallet_recovery_error",error:"An iCloud Container ID must be specified in the Privy Dashboard."});try{let{recoverySecret:d,iCloudRecordName:c}=yield i.writeRecoverySecretToICloud({containerId:o.container_identifier,appId:t,userId:e.id});return{recoverySecret:d,iCloudRecordName:c}}catch(d){if(d instanceof Error){let c=(s=d.message.split("Caused by: ")[1])!=null?s:"Error writing to iCloud";throw new D({code:"embedded_wallet_recovery_error",error:c})}throw new D({code:"embedded_wallet_recovery_error",error:"Error writing to iCloud"})}})}function be(n){return l(this,arguments,function*({walletAddress:e,client:t,chainType:r}){var c;if(Wt.OS==="android")throw new D({code:"embedded_wallet_recovery_error",error:"iCloud recovery is not supported on Android"});let i=yield xt(),a=(yield t.recovery.getRecoveryKeyMaterial(e,r)).icloud_record_name;if(!a)throw new D({code:"embedded_wallet_recovery_error",error:"iCloud recovery not properly backed up."});let s=yield t.recovery.icloudAuth.getICloudConfiguration("expo-ios"),d=s==null?void 0:s.container_identifier;if(!d)throw new D({code:"embedded_wallet_recovery_error",error:"An iCloud Container ID must be specified in the Privy Dashboard."});try{let{recoverySecret:u}=yield i.readRecoverySecretFromICloud({containerId:d,recordName:a});return{recoverySecret:u}}catch(u){if(u instanceof Error){let m=(c=u.message.split("Caused by: ")[1])!=null?c:"Error writing to iCloud";throw new D({code:"embedded_wallet_recovery_error",error:m})}throw new D({code:"embedded_wallet_recovery_error",error:"Error writing to iCloud"})}})}import*as G from"expo-linking";import*as Pt from"expo-web-browser";import{Platform as Ut}from"react-native";import{PrivyClientError as J}from"@privy-io/js-sdk-core";import Ia from"react-fast-compare";import{PrivyApiError as Zr,PrivyClientError as eo}from"@privy-io/js-sdk-core";function E(e){return e instanceof Error||e instanceof Zr||e instanceof eo?e:typeof e=="string"?new Error(e):new Error("Unknown error")}var q=e=>new Promise(t=>setTimeout(t,e));import{useEffect as to,useRef as ro}from"react";import{AppState as De}from"react-native";function Se(){let e=ro(De.currentState);to(()=>De.addEventListener("change",n=>{e.current=n}).remove,[]);function t(){return De.currentState}return{appState:e,getCurrentAppState:t}}function ne(i){return l(this,arguments,function*({provider:e,redirectUri:t,client:r,onError:n}){try{let o;switch(e){case"google-drive":{let{url:c}=yield r.recovery.auth.generateURL(G.createURL(t||"/"));o=c;break}default:throw new J({error:"OAuth invalid provider",code:"embedded_wallet_recovery_error"})}let a=yield Pt.openAuthSessionAsync(o);if(Ut.OS==="android")return;if(a.type!=="success")throw new J({error:"Recovery OAuth session failed",code:"embedded_wallet_recovery_error"});let{queryParams:s}=G.parse(a.url),d;switch(e){case"google-drive":{let{privy_oauth_state:c,privy_oauth_code:u}=s;if(!u||!c)throw new J({error:"Recovery OAuth invalid credentials",code:"embedded_wallet_recovery_error"});d=yield Ee({oAuthCode:u,oAuthState:c,client:r});break}default:throw new J({error:"Recovery OAuth invalid provider",code:"embedded_wallet_recovery_error"})}return d}catch(o){throw n==null||n(E(o)),o}})}function Ee(n){return l(this,arguments,function*({oAuthCode:e,oAuthState:t,client:r}){let{access_token:i}=yield r.recovery.auth.authorize(e,t);if(!i)throw new J({error:"OAuth invalid credentials",code:"login_with_oauth_returned_with_invalid_credentials"});return i})}var oo=2*60*1e3;function no(e){let t;return new Promise((r,n)=>{t=G.addEventListener("url",o=>l(this,[o],function*({url:i}){if(!i)return;let{queryParams:a}=G.parse(i),{privy_oauth_state:s,privy_oauth_code:d}=a!=null?a:{};if(typeof d!="string"||typeof s!="string")return;let c=yield Ee({client:e,oAuthCode:d,oAuthState:s});r(c)})),setTimeout(()=>{n(new J({code:"embedded_wallet_set_recovery_error",error:"Failed to complete Google Drive recovery flow"}))},oo)}).finally(()=>{t==null||t.remove()})}function _e(e){return l(this,null,function*(){let t;Ut.OS==="android"&&(t=no(e));let r=yield ne({provider:"google-drive",client:e});return r!=null?r:yield t})}import{getUserEmbeddedWallet as io,PrivyClientError as ao}from"@privy-io/js-sdk-core";function Ce(o){return l(this,arguments,function*({client:e,recoveryInput:t,setWalletRecoveryCallbacks:r,setRecoveryFlowState:n,setWallet:i}){var a,s,d,c;try{let{provider:u,user:m}=yield e.embeddedWallet.setRecovery(t),p=u,w=io(m);return i({status:"connected",provider:p,account:w}),(s=(a=r.current)==null?void 0:a.onSuccess)==null||s.call(a,p),n({status:"initial"}),p}catch(u){let m=new ao({code:"embedded_wallet_set_recovery_error",error:u instanceof Error?u.message:"Error setting password on embedded wallet"});throw(c=(d=r.current)==null?void 0:d.onError)==null||c.call(d,m),n({status:"initial"}),m}})}function It(e){return e===void 0?{recoveryMethod:"privy"}:typeof e=="string"?{recoveryMethod:"user-passcode",password:e}:e.recoveryMethod==="user-passcode"?{recoveryMethod:"user-passcode",password:e.password}:e.recoveryMethod==="recovery-encryption-key"?{recoveryMethod:"recovery-encryption-key",recoveryKey:e.recoveryKey}:{recoveryMethod:e.recoveryMethod}}var Ot=({client:e,appId:t,wallet:r,setWallet:n,setRecoveryFlowState:i,createWalletCallbacks:o,recoverWalletCallbacks:a,setWalletRecoveryCallbacks:s})=>{let d=U(),c=so(()=>co(d),[d]),u=K(),m=ie(y=>l(void 0,null,function*(){var ue,me;if(c)throw new A({error:"This user already has an embedded wallet",code:"embedded_wallet_already_exists"});let{user:h}=yield e.user.get(),{password:S,recoveryMethod:_,recoveryKey:C}=It(y),k,x,M;if(_==="google-drive"&&(k=yield ne({provider:_,client:e,onError:(ue=o.current)==null?void 0:ue.onError}),i({status:"creating-wallet"}),!k))return null;if(_==="icloud"){if(!h)throw new A({code:"embedded_wallet_recovery_error",error:"User must be loaded before creating a wallet with iCloud."});let{recoverySecret:Ae,iCloudRecordName:te}=yield oe({user:h,appId:t,client:e});x=Ae,M=te}return yield ve({client:e,setWallet:n,createWalletCallbacks:o,recoveryMethod:_,recoveryKey:C,setRecoveryFlowState:i,password:S,recoverySecretOverride:x,iCloudRecordNameOverride:M,solanaAccount:(me=Rt(h))!=null?me:void 0})}),[e,c,d]),p=ie(y=>l(void 0,null,function*(){var _;if(r.status!=="connected")throw new A({code:"attempted_to_set_password_before_connected",error:"Embedded wallet must be connected before setting password"});if(!c)throw new A({code:"embedded_wallet_does_not_exist",error:"Embedded wallet does not exist"});if(Rt(d))throw new A({code:"embedded_wallet_set_recovery_error",error:"Cannot set user-controlled recovery for a user with an embedded Solana wallet."});if(lo(c))throw new A({code:"unsupported_wallet_type",error:"Embedded wallet recovery is only supported for on-device execution and this app uses TEE execution. Learn more https://docs.privy.io/recipes/tee-wallet-migration-guide"});uo({currentRecoveryMethod:c.recovery_method,upgradeToRecoveryMethod:y.recoveryMethod});let h,S;switch(y.recoveryMethod){case"privy":S=N(P({},y),{wallet:c});break;case"user-passcode":S=N(P({},y),{wallet:c,password:y.password});break;case"google-drive":if(h=yield ne({provider:y.recoveryMethod,client:e,onError:(_=s.current)==null?void 0:_.onError}),i({status:"upgrading-recovery"}),!h)return null;S={recoveryMethod:"google-drive",wallet:c,recoveryAccessToken:h};break;case"icloud":if(!d)throw new A({code:"embedded_wallet_recovery_error",error:"User must be loaded before backing up to iCloud."});let{recoverySecret:C,iCloudRecordName:k}=yield oe({user:d,appId:t,client:e});S={recoveryMethod:"icloud-native",recoverySecretOverride:C,iCloudRecordNameOverride:k,wallet:c};break;default:throw new A({code:"embedded_wallet_recovery_error",error:"Unrecognized recovery method"})}return Ce({client:e,recoveryInput:S,setWalletRecoveryCallbacks:s,setRecoveryFlowState:i,setWallet:n})}),[e,c,r.status,d]),w=ie(y=>l(void 0,null,function*(){return p({recoveryMethod:"user-passcode",password:y})}),[e,c,r.status]),g=ie(y=>l(void 0,null,function*(){var x;if(!c)throw new A({code:"embedded_wallet_does_not_exist",error:"Embedded wallet does not exist"});let{password:h,recoveryMethod:S,recoveryKey:_}=It(y),C,k;if(S==="google-drive"&&(C=yield ne({provider:S,client:e,onError:(x=a.current)==null?void 0:x.onError}),i({status:"recovering"}),!C))return null;if(S==="icloud"){if(!d)throw new A({code:"embedded_wallet_recovery_error",error:"User must be loaded before recovering via iCloud."});let{recoverySecret:M}=yield be({client:e,walletAddress:c.address});k=M}return we({client:e,account:c,setWallet:n,recoverWalletCallbacks:a,recoveryMethod:S,setRecoveryFlowState:i,recoveryKey:_,password:h,recoveryToken:C,recoverySecretOverride:k})}),[e,c]),v=ie(()=>l(void 0,null,function*(){if(!c)throw n({status:"not-created",account:null}),new A({code:"embedded_wallet_does_not_exist",error:"Embedded wallet does not exist"});n(y=>y.status==="connected"?{status:"reconnecting",account:c}:{status:"connecting",account:c});try{let y=yield e.embeddedWallet.getProvider(c);return n({status:"connected",provider:y,account:c}),y}catch(y){throw mo(y)?(n({status:"needs-recovery",account:c}),new A({code:"embedded_wallet_needs_recovery",error:"Embedded wallet not loaded on device"})):y instanceof Error?(n({status:"error",error:y.message,account:c}),new A({code:"unknown_embedded_wallet_error",error:y.message})):(n({status:"error",error:"Error loading embedded wallet",account:c}),new A({code:"unknown_embedded_wallet_error",error:"Error loading embedded wallet"}))}}),[e,c]);return At(()=>{if(!d&&r.status!=="disconnected")return n({status:"disconnected",account:null});u&&v().catch(()=>{})},[u,d,c]),At(()=>{r.status==="error"&&r.error.includes("User must be logged in")&&v()},[r.status]),{create:m,recover:g,setPassword:w,setRecovery:p,getProvider:v}};import{useEffect as po,useState as yo}from"react";import{PrivyClientError as Lt}from"@privy-io/js-sdk-core";var Mt=({client:e,isReady:t})=>{let r=U(),n=ge(a=>a==null?void 0:a.customAuth),[i,o]=yo({status:"initial"});return po(()=>{(()=>l(void 0,null,function*(){if(!(n!=null&&n.enabled)){o({status:"not-enabled"});return}o({status:"loading"});let{getCustomAccessToken:s,isLoading:d}=n;if(!(!t||d))try{let c=yield s();if(!c&&r){yield e.auth.logout(),o({status:"done"});return}if(!c){o({status:"done"});return}if(r){o({status:"done"});return}let u=W();if(!(yield e.auth.customProvider.syncWithToken(c,{embedded:u==null?void 0:u.embedded}))){yield e.auth.logout(),o({status:"error",error:new Lt({error:"Failed to sync with custom auth provider",code:"third_party_auth_error"})});return}o({status:"done"})}catch(c){if(console.log("Error syncing with custom auth provider",c),o({status:"error",error:c}),r)throw yield e.auth.logout(),new Lt({error:"Third-party auth failed",code:"third_party_auth_error"})}}))()},[e,r,t,n==null?void 0:n.enabled,n==null?void 0:n.getCustomAccessToken,n==null?void 0:n.isLoading]),{customAuthState:i,customAuthStateIsSettled:i.status!=="loading"&&i.status!=="initial"}};import*as $ from"expo-linking";import{useCallback as fo,useEffect as go,useMemo as ho}from"react";import{Platform as wo}from"react-native";import{getUserEmbeddedSolanaWallet as vo,getUserEmbeddedWallet as bo}from"@privy-io/js-sdk-core";var Ft=({client:e,createWalletCallbacks:t,recoverWalletCallbacks:r,setWalletRecoveryCallbacks:n,recoveryFlowState:i,oAuthState:o,setRecoveryFlowState:a,setWallet:s,appStateVisible:d})=>{let c=$.useURL(),u=U(),m=ho(()=>bo(u),[u]),p=K(),w=fo(g=>{var y,h,S,_;let v=E(g);i.status==="creating-wallet"?(h=(y=t.current).onError)==null||h.call(y,E(v)):(_=(S=r.current).onError)==null||_.call(S,E(v)),a({status:"initial"})},[i]);return go(()=>{function g(){return l(this,null,function*(){var S;if(!c&&i.status!=="initial"&&d&&w(new Error("Recovery OAuth session failed")),!c||i.status==="initial"||o.status!=="initial"||!d||!p)return;let{queryParams:v}=$.parse(c),{privy_oauth_state:y,privy_oauth_code:h}=v;if(!(!h||!y)){yield $.openURL(c.split("?")[0]);try{let _=yield Ee({oAuthCode:h,oAuthState:y,client:e});if(i.status==="creating-wallet"){let C=(S=vo(u))!=null?S:void 0;yield ve({client:e,setWallet:s,createWalletCallbacks:t,recoveryMethod:"google-drive",setRecoveryFlowState:a,recoveryToken:_,solanaAccount:C})}else if(i.status==="upgrading-recovery"){if(!m)throw new Error("Embedded wallet not found");yield Ce({client:e,recoveryInput:{recoveryMethod:"google-drive",wallet:m,recoveryAccessToken:_},setWalletRecoveryCallbacks:n,setRecoveryFlowState:a,setWallet:s})}else yield we({client:e,account:m,setWallet:s,recoverWalletCallbacks:r,recoveryMethod:"google-drive",setRecoveryFlowState:a,recoveryToken:_})}catch(_){w(_)}}})}wo.OS==="android"&&g()},[c,i.status,d,p])};import{useEffect as So}from"react";var Tt=({client:e,isUserInitialized:t,setIsUserInitialized:r,setError:n})=>{So(()=>{t||(()=>l(void 0,null,function*(){try{yield e.initialize()}catch(o){n(o instanceof Error?o:new Error(String(o)))}try{yield e.user.get()}catch(o){}finally{r(!0)}}))()},[e,t,n,r])};import{useEffect as xi,useRef as Pi}from"react";import{useCallback as je,useContext as Eo}from"react";import{PrivyClientError as _o}from"@privy-io/js-sdk-core";var Ns=e=>{let{client:t,setSiweState:r,siweState:n}=Eo(f),i=je(s=>{var c;let d=E(s);return r({status:"error",error:d}),(c=e==null?void 0:e.onError)==null||c.call(e,d),d},[e==null?void 0:e.onError]),o=je(u=>l(void 0,[u],function*({wallet:s,from:{domain:d,uri:c}}){var m;try{r({status:"generating-message"});let p=yield t.auth.siwe.init(s,d,c);return r({status:"awaiting-signature"}),(m=e==null?void 0:e.onGenerateMessage)==null||m.call(e,p.message),p.message}catch(p){throw i(p)}}),[t,i,e==null?void 0:e.onGenerateMessage]);return{loginWithSiwe:je(u=>l(void 0,[u],function*({signature:s,messageOverride:d,disableSignup:c}){var m;try{if(b())throw new _o({code:"attempted_login_with_siwe_while_already_logged_in",error:"Already logged in, use `useLinkWithSiwe` if you are trying to link a wallet to an existing account"});r({status:"submitting-signature"});let w=W(),g=yield t.auth.siwe.loginWithSiwe(s,void 0,d,c?"no-signup":"login-or-sign-up",{embedded:w==null?void 0:w.embedded});return r({status:"done"}),(m=e==null?void 0:e.onSuccess)==null||m.call(e,g.user,g.is_new_user),g.user}catch(p){throw i(p)}}),[t,i,e==null?void 0:e.onSuccess]),generateSiweMessage:o,state:n}};import{useCallback as Nt}from"react";import{createSiwsMessage as ko,PrivyClientError as Wo}from"@privy-io/js-sdk-core";import{useContext as Co}from"react";var O=()=>{let{client:e}=Co(f);return e};var $s=()=>{let e=O(),t=Nt(a=>l(void 0,[a],function*({wallet:{address:n},from:{domain:i,uri:o}}){try{let{nonce:s}=yield e.auth.siws.fetchNonce({address:n});return{message:ko({address:n,domain:i,uri:o,nonce:s})}}catch(s){throw E(s)}}),[e]),r=Nt(s=>l(void 0,[s],function*({signature:n,message:i,wallet:{walletClientType:o,connectorType:a}={}}){try{if(!b())throw new Wo({code:"attempted_link_siws_before_logged_in",error:"Must be logged in to link a wallet, Use `useLoginWithSiws` to login with a wallet"});let{user:c}=yield e.auth.siws.link({signature:n,message:i,walletClientType:o,connectorType:a});return c}catch(d){throw E(d)}}),[e]);return{generateMessage:t,link:r}};import{useCallback as Dt}from"react";import{createSiwsMessage as xo,PrivyClientError as Po}from"@privy-io/js-sdk-core";var nc=()=>{let e=O(),t=Dt(a=>l(void 0,[a],function*({wallet:{address:n},from:{domain:i,uri:o}}){try{let{nonce:s}=yield e.auth.siws.fetchNonce({address:n});return{message:xo({address:n,domain:i,uri:o,nonce:s})}}catch(s){throw E(s)}}),[e]),r=Dt(d=>l(void 0,[d],function*({signature:n,message:i,wallet:{walletClientType:o,connectorType:a}={},disableSignup:s}){try{if(b())throw new Po({code:"attempted_login_with_siws_while_already_logged_in",error:"Already logged in, use `useLinkWithSiws` if you are trying to link a wallet to an existing account"});let u=W();return(yield e.auth.siws.login({signature:n,message:i,walletClientType:o,connectorType:a,mode:s?"no-signup":"login-or-sign-up",opts:{embedded:u==null?void 0:u.embedded}})).user}catch(c){throw E(c)}}),[e]);return{generateMessage:t,login:r}};import{useCallback as jt,useContext as Uo}from"react";import{PrivyClientError as Ao}from"@privy-io/js-sdk-core";var mc=e=>{let{client:t}=Uo(f),r=jt(i=>{var a;let o=E(i);return(a=e==null?void 0:e.onError)==null||a.call(e,o),o},[e==null?void 0:e.onError]);return{unlinkWallet:jt(o=>l(void 0,[o],function*({address:i}){var a;try{if(!b())throw new Ao({code:"attempted_unlink_siwe_before_logged_in",error:"Must be logged in to unlink a wallet, Use `useLoginWithSiwe` to login with a wallet"});let{user:d}=yield t.auth.siwe.unlinkWallet(i);return(a=e==null?void 0:e.onSuccess)==null||a.call(e,d),d}catch(s){throw r(s)}}),[t,r,e==null?void 0:e.onSuccess])}};import{useCallback as Ke,useContext as Ro,useState as Io}from"react";import{PrivyClientError as Kt}from"@privy-io/js-sdk-core";var bc=e=>{let[t,r]=Io(""),{client:n,otpState:i,setOtpState:o}=Ro(f),a=Ke(c=>{var m;let u=E(c);return o({status:"error",error:u}),(m=e==null?void 0:e.onError)==null||m.call(e,u),u},[e,o]),s=Ke(u=>l(void 0,[u],function*({email:c}){var m;r(c);try{o({status:"sending-code"});let p=yield n.auth.email.sendCode(c);return o({status:"awaiting-code-input"}),(m=e==null?void 0:e.onSendCodeSuccess)==null||m.call(e,{email:c}),p}catch(p){throw a(p)}}),[n,a,e,o]),d=Ke(m=>l(void 0,[m],function*({code:c,email:u}){var p;try{if(!b())throw new Kt({code:"attempted_link_email_before_logged_in",error:"Must be logged in to link an email, Use `useLoginWithEmail` to login with email"});let g=u||t;if(!g)throw new Kt({code:"attempted_submit_otp_before_sending",error:"Must `sendCode` with a valid email before calling `linkWithCode`"});o({status:"submitting-code"});let{user:v}=yield n.auth.email.linkWithCode(g,c);return o({status:"done"}),(p=e==null?void 0:e.onLinkSuccess)==null||p.call(e,v),v}catch(w){throw a(w)}}),[t,o,n,e,a]);return{sendCode:s,linkWithCode:d,state:i}};import{useCallback as Vt,useContext as Oo}from"react";var Wc=e=>{let{client:t}=Oo(f),r=Vt(i=>{var a;let o=E(i);return(a=e==null?void 0:e.onError)==null||a.call(e,o),o},[e==null?void 0:e.onError]);return{unlinkEmail:Vt(o=>l(void 0,[o],function*({email:i}){var a;try{let{user:s}=yield t.auth.email.unlink(i);return(a=e==null?void 0:e.onSuccess)==null||a.call(e,s),s}catch(s){throw r(s)}}),[t,e==null?void 0:e.onSuccess,r])}};import{useCallback as Ve,useContext as Lo,useState as Mo}from"react";import{PrivyClientError as zt}from"@privy-io/js-sdk-core";var Mc=e=>{let[t,r]=Mo(""),{client:n,otpState:i,setOtpState:o}=Lo(f),a=Ve(c=>{var m;let u=E(c);return o({status:"error",error:u}),(m=e==null?void 0:e.onError)==null||m.call(e,u),u},[e,o]),s=Ve(u=>l(void 0,[u],function*({email:c}){var m;r(c);try{o({status:"sending-code"});let p=yield n.auth.email.sendCode(c);return o({status:"awaiting-code-input"}),(m=e==null?void 0:e.onSendCodeSuccess)==null||m.call(e,{email:c}),p}catch(p){throw a(p)}}),[n,a,e,o]),d=Ve(p=>l(void 0,[p],function*({code:c,email:u,disableSignup:m}){var w;try{if(b())throw new zt({code:"attempted_login_with_email_while_already_logged_in",error:"Already logged in, use `useLinkWithEmail` if you are trying to link an email to an existing account"});let v=u||t;if(!v)throw new zt({code:"attempted_submit_otp_before_sending",error:"Must `sendCode` with a valid email before calling `loginWithCode`"});o({status:"submitting-code"});let y=W(),h=yield n.auth.email.loginWithCode(v,c,m?"no-signup":"login-or-sign-up",{embedded:y==null?void 0:y.embedded});return o({status:"done"}),(w=e==null?void 0:e.onLoginSuccess)==null||w.call(e,h.user,h.is_new_user),h==null?void 0:h.user}catch(g){throw a(g)}}),[t,o,n,e,a]);return{sendCode:s,loginWithCode:d,state:i}};import{useCallback as ze,useContext as Fo,useState as To}from"react";import{PrivyClientError as Gt}from"@privy-io/js-sdk-core";var zc=e=>{let[t,r]=To(""),{client:n,otpState:i,setOtpState:o}=Fo(f),a=ze(c=>{var m;let u=E(c);return o({status:"error",error:u}),(m=e==null?void 0:e.onError)==null||m.call(e,u),u},[e,o]),s=ze(u=>l(void 0,[u],function*({phone:c}){var m;r(c);try{o({status:"sending-code"});let p=yield n.auth.phone.sendCode(c);return o({status:"awaiting-code-input"}),(m=e==null?void 0:e.onSendCodeSuccess)==null||m.call(e,{phone:c}),p}catch(p){throw a(p)}}),[n,a,e,o]),d=ze(m=>l(void 0,[m],function*({code:c,phone:u}){var p;try{if(!b())throw new Gt({code:"attempted_link_sms_before_logged_in",error:"Must be logged in to link a phone number, Use `useLoginWithSMS` to login with a phone number"});if(!(u||t))throw new Gt({code:"attempted_submit_otp_before_sending",error:"Must `sendCode` with a valid phone number before calling `linkWithCode`"});o({status:"submitting-code"});let{user:v}=yield n.auth.phone.linkWithCode(u||t,c);return o({status:"done"}),(p=e==null?void 0:e.onLinkSuccess)==null||p.call(e,v),v}catch(w){throw a(w)}}),[t,o,n,e,a]);return{sendCode:s,linkWithCode:d,state:i}};import{useCallback as Ge,useContext as No,useState as Do}from"react";import{PrivyClientError as Ht}from"@privy-io/js-sdk-core";var Xc=e=>{let[t,r]=Do(""),{client:n,otpState:i,setOtpState:o}=No(f),a=Ge(c=>{var m;let u=E(c);return o({status:"error",error:u}),(m=e==null?void 0:e.onError)==null||m.call(e,u),u},[e,o]),s=Ge(u=>l(void 0,[u],function*({phone:c}){var m;r(c);try{o({status:"sending-code"});let p=yield n.auth.phone.sendCode(c);return o({status:"awaiting-code-input"}),(m=e==null?void 0:e.onSendCodeSuccess)==null||m.call(e,{phone:c}),p}catch(p){throw a(p)}}),[n,a,e,o]),d=Ge(p=>l(void 0,[p],function*({code:c,phone:u,disableSignup:m}){var w;try{if(b())throw new Ht({code:"attempted_login_with_sms_while_already_logged_in",error:"Already logged in, use `useLinkWithSMS` if you are trying to link a phone number to an existing account"});if(!(u||t))throw new Ht({code:"attempted_submit_otp_before_sending",error:"Must `sendCode` with a valid phone number before calling `loginWithCode`"});o({status:"submitting-code"});let y=W(),h=yield n.auth.phone.loginWithCode(u||t,c,m?"no-signup":"login-or-sign-up",{embedded:y==null?void 0:y.embedded});return o({status:"done"}),(w=e==null?void 0:e.onLoginSuccess)==null||w.call(e,h.user,h.is_new_user),h==null?void 0:h.user}catch(g){throw a(g)}}),[t,o,n,e,a]);return{sendCode:s,loginWithCode:d,state:i}};import*as ke from"expo-linking";import{useCallback as He,useContext as jo,useRef as Ko}from"react";import{PrivyClientError as ae}from"@privy-io/js-sdk-core";var ad=e=>{let{appState:t,getCurrentAppState:r}=Se(),{client:n,farcasterState:i,setFarcasterState:o}=jo(f),a=Ko(!1),s=He(u=>{var p;let m=E(u);return o({status:"error",error:m}),(p=e==null?void 0:e.onError)==null||p.call(e,m),m},[e==null?void 0:e.onError,o]),d=He(()=>{a.current=!0},[]);return{linkWithFarcaster:He((w,...g)=>l(void 0,[w,...g],function*({relyingParty:u,redirectUrl:m},p={pollAttempts:10,pollIntervalMs:1e3}){var v;try{let y=b();if(a.current=!1,!y)throw new ae({code:"attempted_link_farcaster_before_logged_in",error:"Must be logged in to link a Farcaster account."});o({status:"generating-uri"});let{connect_uri:h,channel_token:S}=yield n.auth.farcaster.initializeAuth({relyingParty:u,redirectUrl:ke.createURL(m!=null?m:"/")});if(!h)throw new ae({code:"failed_to_generate_farcaster_uri",error:"Failed to generate farcaster uri"});if(!S)throw new ae({code:"failed_to_generate_farcaster_channel_token",error:"Failed to generate farcaster channel token"});yield ke.openURL(h),o({status:"polling-status"});let _=0;for(;_<p.pollAttempts;){if(a.current)throw new ae({code:"farcaster_polling_canceled",error:"Farcaster polling canceled"});if(t.current!=="active"&&r()!=="active"){yield q(p.pollIntervalMs);continue}let C=yield n.auth.farcaster.getFarcasterStatus({channel_token:S});if(C.state==="completed"){o({status:"submitting-token"});let{user:k}=yield n.auth.farcaster.link(P({channel_token:S},C));return o({status:"done"}),(v=e==null?void 0:e.onSuccess)==null||v.call(e,k),k}_++,yield q(p.pollIntervalMs)}throw new ae({code:"farcaster_polling_timeout",error:"Farcasting polling timed out"})}catch(y){throw s(y)}}),[n,e==null?void 0:e.onSuccess,s,o]),state:i,cancel:d}};import{useCallback as Bt,useContext as Vo}from"react";var md=e=>{let{client:t}=Vo(f),r=Bt(i=>{var a;let o=E(i);return(a=e==null?void 0:e.onError)==null||a.call(e,o),o},[e==null?void 0:e.onError]);return{unlinkFarcaster:Bt(o=>l(void 0,[o],function*({fid:i}){var a;try{let{user:s}=yield t.auth.farcaster.unlink({fid:i});return(a=e==null?void 0:e.onSuccess)==null||a.call(e,s),s}catch(s){throw r(s)}}),[t,e==null?void 0:e.onSuccess,r])}};import*as We from"expo-linking";import{useCallback as Je,useContext as zo,useRef as Go}from"react";import{PrivyClientError as se}from"@privy-io/js-sdk-core";var Sd=e=>{let{appState:t,getCurrentAppState:r}=Se(),{client:n,farcasterState:i,setFarcasterState:o}=zo(f),a=Go(!1),s=Je(u=>{var p;let m=E(u);return o({status:"error",error:m}),(p=e==null?void 0:e.onError)==null||p.call(e,m),m},[e==null?void 0:e.onError,o]),d=Je(()=>{a.current=!0},[]);return{loginWithFarcaster:Je((g,...v)=>l(void 0,[g,...v],function*({relyingParty:u,redirectUrl:m,disableSignup:p},w={pollAttempts:10,pollIntervalMs:1e3}){var y;try{if(a.current=!1,b())throw new se({code:"attempted_login_with_farcaster_while_already_logged_in",error:"Already logged in, use `useLinkWithFarcaster` if you are trying to link farcaster to an existing account"});o({status:"generating-uri"});let{connect_uri:S,channel_token:_}=yield n.auth.farcaster.initializeAuth({relyingParty:u,redirectUrl:We.createURL(m!=null?m:"/")});if(!S)throw new se({code:"failed_to_generate_farcaster_uri",error:"Failed to generate farcaster uri"});if(!_)throw new se({code:"failed_to_generate_farcaster_channel_token",error:"Failed to generate farcaster channel token"});yield We.openURL(S),o({status:"polling-status"});let C=0;for(;C<w.pollAttempts;){if(a.current)throw new se({code:"farcaster_polling_canceled",error:"Farcaster polling canceled"});if(t.current!=="active"&&r()!=="active"){yield q(w.pollIntervalMs);continue}let k=yield n.auth.farcaster.getFarcasterStatus({channel_token:_});if(k.state==="completed"){o({status:"submitting-token"});let x=W(),M=yield n.auth.farcaster.authenticate(P({channel_token:_,mode:p?"no-signup":"login-or-sign-up"},k),{embedded:x==null?void 0:x.embedded});return o({status:"done"}),(y=e==null?void 0:e.onSuccess)==null||y.call(e,M.user,M.is_new_user),M.user}C++,yield q(w.pollIntervalMs)}throw new se({code:"farcaster_polling_timeout",error:"Farcasting polling timed out"})}catch(h){throw s(h)}}),[n,s,e==null?void 0:e.onSuccess,o,t]),state:i,cancel:d}};import{useCallback as qt,useContext as Ho}from"react";import{create as Bo}from"zustand";import{PrivyClientError as qo}from"@privy-io/js-sdk-core";var $e=Bo(()=>({status:"initial"})),V=e=>$e.setState(e,!0),Jo=$e.getState,Rd=()=>{let{client:e}=Ho(f),t=$e(),r=qt(()=>l(void 0,null,function*(){try{V({status:"fetching-nonce"});let i=yield e.auth.farcasterV2.initializeAuth();return V({status:"awaiting-signature"}),i}catch(i){let o=E(i);throw V({status:"initial",error:o}),o}}),[e]),n=qt(i=>l(void 0,null,function*(){let o=Jo().status;try{if(b()){let c=new qo({code:"attempted_login_with_farcaster_while_already_logged_in",error:"Already logged in, use a link helper if you are trying to link farcaster to an existing account"});throw V({status:o,error:c}),c}V({status:"submitting-signature"});let s=W(),d=yield e.auth.farcasterV2.authenticate(i,{embedded:s==null?void 0:s.embedded});return V({status:"done"}),setTimeout(()=>V({status:"initial"}),1500),{user:d.user}}catch(a){let s=E(a);throw V({status:o,error:s}),s}}),[e]);return{init:r,login:n,state:t}};import{useContext as $o,useMemo as Yo}from"react";import{delegatedActions as Jt}from"@privy-io/js-sdk-core";var Td=()=>{let{client:e}=$o(f);return Yo(()=>({delegateWallet:Jt.delegateWallet(e),revokeWallets:Jt.revokeWallets(e)}),[e])};import{useContext as Zo,useMemo as en}from"react";import{addSessionSigners as tn,removeSessionSigners as rn}from"@privy-io/js-sdk-core";import{isEmbeddedWalletAccount as Qo}from"@privy-io/js-sdk-core";function Xo(e,t){return e.linked_accounts.filter(Qo).find(r=>r.address===t)}function Y(e){let t=b();if(!t)throw new Error("User must be authenticated to perform this operation");let r=Xo(t,e);if(!r)throw new Error(`No wallet found with address ${e}`);return r}var Bd=()=>{let{client:e}=Zo(f);return en(()=>({addSessionSigners:({address:t,signers:r})=>tn({client:e,wallet:Y(t),signers:r.map(n=>({signer_id:n.signerId,override_policy_ids:n.policyIds}))}),removeSessionSigners:({address:t})=>rn({client:e,wallet:Y(t)})}),[e])};import{useContext as on,useMemo as nn}from"react";import{addSessionSigners as an,removeSessionSigners as sn}from"@privy-io/js-sdk-core";var Xd=()=>{let{client:e}=on(f);return nn(()=>({addSigners:({address:t,signers:r})=>an({client:e,wallet:Y(t),signers:r.map(n=>({signer_id:n.signerId,override_policy_ids:n.policyIds}))}),removeSigners:({address:t})=>sn({client:e,wallet:Y(t)})}),[e])};import{useContext as cn,useMemo as dn}from"react";import{PrivyClientError as Yt}from"@privy-io/js-sdk-core";var nl=()=>{let{client:e}=cn(f);return dn(()=>({sendCode(n){return l(this,arguments,function*({newEmailAddress:r}){$t(),yield e.auth.email.sendCode(r)})},updateEmail(i){return l(this,arguments,function*({newEmailAddress:r,code:n}){let{address:o}=$t(),{user:a}=yield e.auth.email.updateEmail({oldEmailAddress:o,newEmailAddress:r,code:n});return a})}}),[e])};function $t(){let t=ln().linked_accounts.find(r=>r.type==="email");if(!t)throw new Yt({code:"attempted_update_email_without_a_linked_email",error:"Must have a linked email account already to update an email address. Use `useLinkEmail` to link an email account."});return t}function ln(){let e=b();if(!e)throw new Yt({code:"attempted_update_before_logged_in",error:"Must be logged in to update a user profile."});return e}import{useContext as un,useMemo as mn}from"react";import{PrivyClientError as Xt}from"@privy-io/js-sdk-core";var ul=()=>{let{client:e}=un(f);return mn(()=>({sendCode(n){return l(this,arguments,function*({newPhoneNumber:r}){Qt(),yield e.auth.phone.sendCode(r)})},updatePhone(i){return l(this,arguments,function*({newPhoneNumber:r,code:n}){let{phoneNumber:o}=Qt(),{user:a}=yield e.auth.phone.updatePhone({oldPhoneNumber:o,newPhoneNumber:r,code:n});return a})}}),[e])};function Qt(){let t=pn().linked_accounts.find(r=>r.type==="phone");if(!t)throw new Xt({code:"attempted_update_phone_without_a_linked_phone",error:"Must have a linked phone account already to update a phone number. Use `useLinkSMS` to link a phone number."});return t}function pn(){let e=b();if(!e)throw new Xt({code:"attempted_update_before_logged_in",error:"Must be logged in to update a user profile."});return e}import*as tr from"expo-linking";import{useCallback as fn,useContext as gn,useMemo as hn}from"react";import{crossApp as wn,PrivyClientError as vn}from"@privy-io/js-sdk-core";import*as er from"expo-linking";import*as ce from"expo-web-browser";import{PrivyClientError as Zt}from"@privy-io/js-sdk-core";var T=(e,t)=>l(void 0,null,function*(){let r=yield ce.openAuthSessionAsync(e,t,{createTask:!1});if(r.type!=="success")throw r.type===ce.WebBrowserResultType.CANCEL||r.type===ce.WebBrowserResultType.DISMISS?new Zt({error:"OAuth session was cancelled",code:"oauth_session_failed"}):new Zt({error:"OAuth session failed",code:"oauth_session_failed"});return yn(r.url)});function yn(e){let{queryParams:t}=er.parse(e);return t}var El=()=>{let{client:e}=gn(f),t=hn(()=>wn.loginWithCrossAppAuth({client:e,openAuthSession:T}),[e]);return{loginWithCrossApp:fn(o=>l(void 0,[o],function*({appId:n,redirectUri:i}){if(b())throw new vn({code:"attempted_login_with_cross_app_while_already_logged_in",error:"Already logged in, use `linkCrossAppAccount` if you are trying to link a cross app account to an existing account"});let{user:s}=yield t({providerAppId:n,redirectUrl:tr.createURL(i||"/")});return{user:s}}),[t])}};import*as rr from"expo-linking";import{useCallback as bn,useContext as Sn,useMemo as En}from"react";import{crossApp as _n,PrivyClientError as Cn}from"@privy-io/js-sdk-core";var Al=()=>{let{client:e}=Sn(f),t=En(()=>_n.linkWithCrossAppAuth({client:e,openAuthSession:T}),[e]);return{linkWithCrossApp:bn(o=>l(void 0,[o],function*({appId:n,redirectUri:i}){if(!b())throw new Cn({code:"attempted_link_cross_app_before_logged_in",error:"Must be logged in to link a cross app account, Use `loginWithCrossAppAccount` to login with cross app"});return{user:yield t({providerAppId:n,redirectUrl:rr.createURL(i||"/")})}}),[t])}};import*as nr from"expo-linking";import{useContext as kn,useMemo as or}from"react";import{crossApp as Wn}from"@privy-io/js-sdk-core";var Nl=()=>{let{client:e}=kn(f),t=or(()=>Wn.wallet.signMessage({client:e,openAuthSession:T}),[e]);return or(()=>({signMessage:({address:r,message:n,redirectUri:i="/"})=>t({user:b(),address:r,message:n,redirectUrl:nr.createURL(i)})}),[t])};import*as ar from"expo-linking";import{useContext as xn,useMemo as ir}from"react";import{crossApp as Pn}from"@privy-io/js-sdk-core";var Hl=()=>{let{client:e}=xn(f),t=ir(()=>Pn.wallet.signTypedData({client:e,openAuthSession:T}),[e]);return ir(()=>({signTypedData:({address:r,typedData:n,redirectUri:i="/"})=>t({user:b(),address:r,typedData:n,redirectUrl:ar.createURL(i)})}),[t])};import*as cr from"expo-linking";import{useContext as Un,useMemo as sr}from"react";import{crossApp as An}from"@privy-io/js-sdk-core";va