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