@privy-io/react-auth
Version:
React client for the Privy Auth API
2 lines (1 loc) • 14.8 kB
JavaScript
import{getBase58Decoder as e,getTransactionDecoder as n,address as t,getTransactionEncoder as s}from"@solana/kit";import{useMemo as a,useEffect as i,useState as r}from"react";import{rpc as o,ConnectedStandardSolanaWallet as c}from"@privy-io/js-sdk-core";import{u as l,a as d,b as u,l as g}from"./internal-context-Z-fyxadS.mjs";import{a as h,h as p,b as f,n as w,k as A}from"./get-is-unified-wallet-Boa8DYrQ.mjs";import{u as y}from"./usePrivy-6nkpbErN.mjs";import{g as v,u as m}from"./useWallets-CR0z5IIt.mjs";import T from"eventemitter3";import{base58 as b}from"@scure/base";import{u as O}from"./context-WTldtXS8.mjs";import{u as S}from"./use-sign-with-user-signer-Do5Oi_rb.mjs";import{b as _,a as E,u as I}from"./useSolanaRpcClient-BUWOblv_.mjs";import{g as W}from"./use-export-wallet-CV4p7L0b.mjs";const j=["solana:mainnet","solana:devnet","solana:testnet"];function M(n){return e().decode(n)}function P(e,n){if(!Object.prototype.hasOwnProperty.call(e,n))throw TypeError("attempted to use private field on non-instance");return e}var C=0,F="__private_"+C+++"__implementation";function U(e,n){if(!Object.prototype.hasOwnProperty.call(e,n))throw TypeError("attempted to use private field on non-instance");return e}var D=0;function N(e){return"__private_"+D+++"_"+e}var B=/*#__PURE__*/N("_address"),x=/*#__PURE__*/N("_publicKey"),R=/*#__PURE__*/N("_chains"),L=/*#__PURE__*/N("_features"),V=/*#__PURE__*/N("_label"),Q=/*#__PURE__*/N("_icon");class G{get address(){return U(this,B)[B]}get publicKey(){return U(this,x)[x].slice()}get chains(){return U(this,R)[R].slice()}get features(){return U(this,L)[L].slice()}get label(){return U(this,V)[V]}get icon(){return U(this,Q)[Q]}constructor({address:e,publicKey:n,label:t,icon:s}){Object.defineProperty(this,B,{writable:!0,value:void 0}),Object.defineProperty(this,x,{writable:!0,value:void 0}),Object.defineProperty(this,R,{writable:!0,value:void 0}),Object.defineProperty(this,L,{writable:!0,value:void 0}),Object.defineProperty(this,V,{writable:!0,value:void 0}),Object.defineProperty(this,Q,{writable:!0,value:void 0}),U(this,B)[B]=e,U(this,x)[x]=n,U(this,R)[R]=j,U(this,V)[V]=t,U(this,Q)[Q]=s,U(this,L)[L]=["solana:signAndSendTransaction","solana:signTransaction","solana:signMessage"],new.target===G&&Object.freeze(this)}}function K(e,n){if(!Object.prototype.hasOwnProperty.call(e,n))throw TypeError("attempted to use private field on non-instance");return e}var k=0;function H(e){return"__private_"+k+++"_"+e}var J=/*#__PURE__*/H("_listeners"),Y=/*#__PURE__*/H("_version"),Z=/*#__PURE__*/H("_name"),z=/*#__PURE__*/H("_icon"),q=/*#__PURE__*/H("_injection"),X=/*#__PURE__*/H("_isPrivyWallet"),$=/*#__PURE__*/H("_accounts"),ee=/*#__PURE__*/H("_on"),ne=/*#__PURE__*/H("_emit"),te=/*#__PURE__*/H("_off"),se=/*#__PURE__*/H("_connected"),ae=/*#__PURE__*/H("_connect"),ie=/*#__PURE__*/H("_disconnect"),re=/*#__PURE__*/H("_signMessage"),oe=/*#__PURE__*/H("_signAndSendTransaction"),ce=/*#__PURE__*/H("_signTransaction");function le(e,...n){K(this,J)[J][e]?.forEach((e=>e.apply(null,n)))}function de(e,n){K(this,J)[J][e]=K(this,J)[J][e]?.filter((e=>n!==e))}function ue(e,a,i){let r=structuredClone(n().decode(e)),o=t(a);return o in r.signatures&&(r.signatures[o]=i),new Uint8Array(s().encode(r))}function ge(){let{isHeadlessSigning:e,walletProxy:n,initializeWalletProxy:t,recoverEmbeddedWallet:s,openModal:a,privy:i,client:r}=l(),{user:c}=y(),{setModalData:g}=h(),{signWithUserSigner:w}=S();return{signMessage:({message:l,address:h,options:A})=>new Promise((async(y,m)=>{let T=p(c,h);if("privy"!==T?.walletClientType)return void m(new d("Wallet is not a Privy wallet",void 0,u.EMBEDDED_WALLET_NOT_FOUND));let{entropyId:b,entropyIdVerifier:O}=v(c,T),S=f(T),E=_(l).toString("base64");if(E.length<1)return void m(new d("Message must be a non-empty string",void 0,u.INVALID_MESSAGE));let I=async()=>{let e;if(!c)throw Error("User must be authenticated before signing with a Privy wallet");let a=await r.getAccessToken();if(!a)throw Error("User must be authenticated to use their embedded wallet.");let l=n??await t(15e3);if(!l)throw Error("Failed to initialize embedded wallet proxy.");if(!await s({address:T.address}))throw Error("Unable to connect to wallet");if(S){let n=await o(i,w,{chain_type:"solana",method:"signMessage",params:{message:E,encoding:"base64"},wallet_id:T.id});if(!n.data||!("signature"in n.data))throw Error("Failed to sign message");e=n.data.signature}else{let{response:n}=await l.rpc({accessToken:a,entropyId:b,entropyIdVerifier:O,chainType:"solana",hdWalletIndex:T.walletIndex??0,requesterAppId:A?.uiOptions?.requesterAppId,request:{method:"signMessage",params:{message:E}}});e=n.data.signature}return e};if(e({showWalletUIs:A?.uiOptions?.showWalletUIs}))try{let e=await I(),n=new Uint8Array(_(e,"base64"));y({signature:n})}catch(e){m(e)}else g({signMessage:{method:"solana_signMessage",data:E,confirmAndSign:I,onSuccess:e=>{y({signature:new Uint8Array(_(e,"base64"))})},onFailure:e=>{m(e)},uiOptions:A?.uiOptions??{}},connectWallet:{recoveryMethod:T.recoveryMethod,connectingWalletAddress:T.address,entropyId:b,entropyIdVerifier:O,isUnifiedWallet:S,onCompleteNavigateTo:"SignRequestScreen",onFailure:e=>{m(new d("Failed to connect to wallet",e,u.UNKNOWN_CONNECT_WALLET_ERROR))}}}),a("EmbeddedWalletConnectingScreen")}))}}function he(){let{isHeadlessSigning:e,openModal:n}=l(),{setModalData:t}=h(),{signMessage:s}=ge(),{user:a}=y();return{signTransaction:async({transaction:i,options:r,chain:o="solana:mainnet",address:c})=>{async function l(e){let{signature:n}=await s({message:E(e),address:c,options:{...r,uiOptions:{...r?.uiOptions,showWalletUIs:!1}}});return{signedTransaction:ue(e,c,n)}}return e({showWalletUIs:r?.uiOptions?.showWalletUIs})?l(i):new Promise((async(e,s)=>{let g=p(a,c);if("privy"!==g?.walletClientType)return void s(new d("Wallet is not a Privy wallet",void 0,u.EMBEDDED_WALLET_NOT_FOUND));let{entropyId:h,entropyIdVerifier:w}=v(a,g),A=f(g);function y(e){return n=>{s(n instanceof d?n:new d("Failed to connect to wallet",n,e))}}let m={account:g,transaction:i,chain:o,signOnly:!0,uiOptions:r?.uiOptions||{},onConfirm:l,onSuccess:e,onFailure:y(u.TRANSACTION_FAILURE)};t({connectWallet:{recoveryMethod:g.recoveryMethod,connectingWalletAddress:g.address,entropyId:h,entropyIdVerifier:w,isUnifiedWallet:A,onCompleteNavigateTo:"StandardSignAndSendTransactionScreen",onFailure:y(u.UNKNOWN_CONNECT_WALLET_ERROR)},standardSignAndSendTransaction:m}),n("EmbeddedWalletConnectingScreen")}))}}}let pe=new class extends T{setImplementation(e){P(this,F)[F]=e}async signMessage(e){return P(this,F)[F].signMessage(e)}async signAndSendTransaction(e){return P(this,F)[F].signAndSendTransaction(e)}async signTransaction(e){return P(this,F)[F].signTransaction(e)}constructor(e){super(),Object.defineProperty(this,F,{writable:!0,value:void 0}),P(this,F)[F]=e}}({signTransaction:g("signTransaction was not injected"),signAndSendTransaction:g("signAndSendTransaction was not injected"),signMessage:g("signMessage was not injected")}),fe=new class{get version(){return K(this,Y)[Y]}get name(){return K(this,Z)[Z]}get icon(){return K(this,z)[z]}get chains(){return j.slice()}get features(){return{"standard:connect":{version:"1.0.0",connect:K(this,ae)[ae]},"standard:disconnect":{version:"1.0.0",disconnect:K(this,ie)[ie]},"standard:events":{version:"1.0.0",on:K(this,ee)[ee]},"solana:signAndSendTransaction":{version:"1.0.0",supportedTransactionVersions:["legacy",0],signAndSendTransaction:K(this,oe)[oe]},"solana:signTransaction":{version:"1.0.0",supportedTransactionVersions:["legacy",0],signTransaction:K(this,ce)[ce]},"solana:signMessage":{version:"1.0.0",signMessage:K(this,re)[re]},"privy:":{privy:{signMessage:K(this,q)[q].signMessage,signTransaction:K(this,q)[q].signTransaction,signAndSendTransaction:K(this,q)[q].signAndSendTransaction}}}}get accounts(){return K(this,$)[$].slice()}get isPrivyWallet(){return K(this,X)[X]}constructor({name:e,icon:n,version:t,injection:s,wallets:a}){Object.defineProperty(this,ne,{value:le}),Object.defineProperty(this,te,{value:de}),Object.defineProperty(this,J,{writable:!0,value:void 0}),Object.defineProperty(this,Y,{writable:!0,value:void 0}),Object.defineProperty(this,Z,{writable:!0,value:void 0}),Object.defineProperty(this,z,{writable:!0,value:void 0}),Object.defineProperty(this,q,{writable:!0,value:void 0}),Object.defineProperty(this,X,{writable:!0,value:void 0}),Object.defineProperty(this,$,{writable:!0,value:void 0}),Object.defineProperty(this,ee,{writable:!0,value:void 0}),Object.defineProperty(this,se,{writable:!0,value:void 0}),Object.defineProperty(this,ae,{writable:!0,value:void 0}),Object.defineProperty(this,ie,{writable:!0,value:void 0}),Object.defineProperty(this,re,{writable:!0,value:void 0}),Object.defineProperty(this,oe,{writable:!0,value:void 0}),Object.defineProperty(this,ce,{writable:!0,value:void 0}),K(this,J)[J]={},K(this,ee)[ee]=(e,n)=>(K(this,J)[J][e]?.push(n)||(K(this,J)[J][e]=[n]),()=>K(this,te)[te](e,n)),K(this,se)[se]=e=>{null!=e&&(K(this,$)[$]=e.map((({address:e})=>new G({address:e,publicKey:b.decode(e)})))),K(this,ne)[ne]("change",{accounts:this.accounts})},K(this,ae)[ae]=async()=>(K(this,ne)[ne]("change",{accounts:this.accounts}),{accounts:this.accounts}),K(this,ie)[ie]=async()=>{K(this,ne)[ne]("change",{accounts:this.accounts})},K(this,re)[re]=async(...e)=>{let n=[];for(let{account:t,...s}of e){let{signature:e}=await K(this,q)[q].signMessage({...s,address:t.address});n.push({signedMessage:s.message,signature:e})}return n},K(this,oe)[oe]=async(...e)=>{let n=[];for(let t of e){let{signature:e}=await K(this,q)[q].signAndSendTransaction({...t,transaction:t.transaction,address:t.account.address,chain:t.chain||"solana:mainnet",options:t.options});n.push({signature:e})}return n},K(this,ce)[ce]=async(...e)=>{let n=[];for(let{transaction:t,account:s,options:a,chain:i}of e){let{signedTransaction:e}=await K(this,q)[q].signTransaction({transaction:t,address:s.address,chain:i||"solana:mainnet",options:a});n.push({signedTransaction:e})}return n},K(this,Z)[Z]=e,K(this,z)[z]=n,K(this,Y)[Y]=t,K(this,q)[q]=s,K(this,$)[$]=[],K(this,X)[X]=!0,s.on("accountChanged",K(this,se)[se],this),K(this,se)[se](a)}}({name:"Privy",version:"1.0.0",icon:"data:image/png;base64,AAABAAEAFBQAAAAAIABlAQAAFgAAAIlQTkcNChoKAAAADUlIRFIAAAAUAAAAFAgGAAAAjYkdDQAAAAlwSFlzAAAOwwAADsMBx2+oZAAAAQVJREFUeJxiYMANZIC4E4ivAPFPIP4FxDeAuB+IlfDowwBMQFwJxF+B+D8O/AOI66Bq8QJGIF6ExyB0vAqImfEZmEeCYTDcgMswPiB+T4aB34FYApuBsWQYBsP52AycToGBK7EZuJECAw9jM3AVBQbuwWZgIwUGTsZmoDkFBnpiMxAEjpJh2FV8iVsbiD+TYBgoDVrgMgwGnID4HRGGgTKBGyHDYEAaiBdCSxh0g/5AU4Q8sYYhAzEgjoGmABBOgFo2eACowFABYn0oVgViAVINkQTiZUD8DIj/ATF6GILEXgLxCiCWIsZAbiAuBeKtQHwHiEHJ6C8UfwHie0C8E4jLoWpRAAAAAP//rcbhsQAAAAZJREFUAwBYFs3VKJ0cuQAAAABJRU5ErkJggg==",wallets:[],injection:pe});function we(){let{ready:e}=m(),{user:n}=y(),{signMessage:t}=ge(),{signTransaction:s}=he(),{signAndSendTransaction:r}=function(){let e=O(),{isHeadlessSigning:n,openModal:t,privy:s}=l(),{setModalData:a}=h(),{signTransaction:i}=he(),r=I(),{user:c}=y(),{signWithUserSigner:g}=S();return{signAndSendTransaction:async({transaction:l,address:h,chain:w="solana:mainnet",options:A})=>{let y=p(c,h);if("privy"!==y?.walletClientType)throw new d("Wallet is not a Privy wallet",void 0,u.EMBEDDED_WALLET_NOT_FOUND);let m=f(y);async function T(e){if(A?.sponsor)return await(async e=>{if(!m)throw new d("Sponsoring transactions is only supported for wallets on the TEE stack",u.INVALID_DATA);let n=await o(s,g,{chain_type:"solana",method:"signAndSendTransaction",sponsor:!0,params:{transaction:_(e).toString("base64"),encoding:"base64"},caip2:`solana:${(await r(w).rpc.getGenesisHash().send()).substring(0,32)}`,wallet_id:y.id});if(n.data&&"hash"in n.data)return{signature:b.decode(n.data.hash)};throw Error("Failed to sign and send transaction")})(e);let{signedTransaction:n}=await i({transaction:e,address:h,chain:w,options:{...A,uiOptions:{...A?.uiOptions,showWalletUIs:!1}}}),{signature:t}=await r(w).sendAndConfirmTransaction(n);return{signature:t}}return n({showWalletUIs:A?.uiOptions?.showWalletUIs})?T(l):new Promise((async(n,s)=>{let i,r,{entropyId:o,entropyIdVerifier:g}=v(c,y);function p(e){return n=>{s(n instanceof d?n:new d("Failed to connect to wallet",n,e))}}let f={account:y,transaction:l,chain:w,signOnly:!1,uiOptions:A?.uiOptions||{},onConfirm:T,onSuccess:n,onFailure:p(u.TRANSACTION_FAILURE),isSponsored:!!A?.sponsor},b={recoveryMethod:y.recoveryMethod,connectingWalletAddress:y.address,entropyId:o,entropyIdVerifier:g,isUnifiedWallet:m,onCompleteNavigateTo:"StandardSignAndSendTransactionScreen",onFailure:p(u.UNKNOWN_CONNECT_WALLET_ERROR)};e.fundingConfig&&(i=W({address:h,appConfig:e,methodScreen:"FundingMethodSelectionScreen",fundWalletConfig:{...A,asset:"native-currency",chain:w},externalSolanaFundingScreen:"FundSolWalletWithExternalSolanaWallet"}),r={amount:e.fundingConfig.defaultRecommendedAmount,asset:"SOL",chain:w,destinationAddress:h,afterSuccessScreen:"StandardSignAndSendTransactionScreen",sourceWalletData:void 0}),a({connectWallet:b,standardSignAndSendTransaction:f,funding:i,solanaFundingData:r}),t("EmbeddedWalletConnectingScreen")}))}}}(),c=a((()=>{let e=[...w(n).sort(((e,n)=>(e.walletIndex??0)-(n.walletIndex??0)))],t=A(n);return t.length?[...e,...t]:e}),[n]),g=a((()=>({signMessage:async({message:e,address:n,options:s})=>await t({message:e,address:n,options:s}),signTransaction:async({transaction:e,address:n,chain:t,options:a})=>await s({transaction:e,address:n,chain:t,options:a}),async signAndSendTransaction({transaction:e,address:n,chain:t,options:s}){let{signature:a}=await r({transaction:e,address:n,chain:t,options:s});return{signature:a}}})),[t,s,r]);return i((()=>{pe?.setImplementation(g)}),[g]),i((()=>{var n;!e||(n=fe.accounts).length===c.length&&n.every(((e,n)=>e.address===c[n]?.address))||pe?.emit("accountChanged",c)}),[e,c]),{ready:e,wallet:fe}}function Ae(){let{client:e}=l(),{ready:n,wallet:t}=we(),[s,a]=r([]),[o,c]=r([]);return i((()=>{let e=[t,...s.filter((e=>"solana"===e.chainType&&!!e.wallet.features)).map((e=>e.wallet))];c(e);let n=s.flatMap((n=>{let t=()=>c([...e]);return n.on("walletsUpdated",t),{connector:n,off:t}})),a=e.map((n=>n.features["standard:events"]?.on("change",(()=>{c([...e])}))));return()=>{a.forEach((e=>e?.())),n.forEach((({connector:e,off:n})=>e.off("walletsUpdated",n)))}}),[s]),i((()=>{a(e.connectors?.walletConnectors.filter((e=>"solana"===e.chainType))??[]);let n=()=>{a(e.connectors?.walletConnectors.filter((e=>"solana"===e.chainType))??[])};return e.connectors?.on("connectorInitialized",n),()=>{e.connectors?.off("connectorInitialized",n)}}),[n,e.connectors]),{ready:n,wallets:o}}function ye(){let{ready:e,wallets:n}=Ae();return{ready:e,wallets:a((()=>n.flatMap((e=>e.accounts.map((n=>new c({wallet:e,account:n})))))),[n])}}export{j as S,Ae as a,M as g,ye as u};