UNPKG

@privy-io/react-auth

Version:

React client for the Privy Auth API

3 lines (2 loc) 9.73 kB
"use strict";var e=require("react/jsx-runtime"),t=require("@heroicons/react/24/outline/CheckCircleIcon"),a=require("react"),n=require("@privy-io/js-sdk-core"),r=require("./Button-Bm_Ft0Dw.js"),s=require("./Layouts-dRL0OSpp.js"),o=require("./ModalHeader-DB7Tbjwz.js"),i=require("./ScreenHeader-CyURV6Ti.js"),l=require("./FundWalletMethodHeader-BKgYjMau.js"),u=require("./InjectedWalletIcon-UY3nMvZo.js"),c=require("./index-CRFXS9pP.js"),d=require("./Value-C-XtZyFa.js"),m=require("./Row-CxDF-VMy.js"),g=require("./context-DFq1obBO.js"),p=require("./internal-context-NWsAL807.js"),f=require("./get-is-unified-wallet-D4ouXJpi.js"),h=require("./useWallets-oPpMUdRR.js"),S=require("./useGetTokenPrice-BHq-guWz.js"),j=require("./analytics-C6C_4JmG.js"),I=require("@solana-program/system"),T=require("@solana/kit"),C=require("@solana-program/token"),x=require("./getFormattedUsdFromLamports-Mu2fqwL2.js"),F=require("./getUsdcMintAddress-REYZSOb9.js"),q=require("./useSolanaRpcClient-TQdbjNyx.js"),v=require("./getChainName-C4rO8-3n.js"),y=require("./prepareFundingModalData-Cnd6rhhJ.js");function w(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}require("styled-components"),require("./useActiveWallet-BOX8xCn9.js"),require("zustand"),require("react-device-detect"),require("./events-context-Di6--rDg.js"),require("viem"),require("viem/utils"),require("./getPublicClient-CGlodIp_.js"),require("./useWallets-BLFNjTwC.js"),require("@heroicons/react/24/outline/ArrowLeftIcon"),require("@heroicons/react/24/outline/ArrowRightIcon"),require("@heroicons/react/24/outline/QuestionMarkCircleIcon"),require("@heroicons/react/24/outline/XMarkIcon"),require("@heroicons/react/24/outline/WalletIcon"),require("./LoadingSkeleton-DoCrfGnl.js"),require("tinycolor2"),require("ofetch"),require("./usePrivy-CcfSRv1R.js"),require("eventemitter3"),require("@scure/base"),require("./use-sign-with-user-signer-BcAsQTGF.js"),require("./useGetSolPrice-C986iVoO.js");var L=/*#__PURE__*/w(t);function E({rows:t}){/*#__PURE__*/return e.jsx(m.Rows,{children:t.filter((e=>!!e)).map(((t,a)=>null!=t.value||t.isLoading?/*#__PURE__*/e.jsxs(m.Row,{children:[/*#__PURE__*/e.jsx(d.LabelSm,{children:t.label}),/*#__PURE__*/e.jsx(d.Value,{$isLoading:t.isLoading,children:t.value})]},a):null))})}function A(e){return BigInt(Math.floor(1e9*parseFloat(e)))}function P(e){return+U.format(parseFloat(e.toString())/1e9)}let U=Intl.NumberFormat(void 0,{maximumFractionDigits:8});async function k({tx:e,solanaClient:t,amount:a,asset:n,tokenPrice:r}){if(!e)return null;if("SOL"===n&&r){let n=A(a),s=x.getFormattedUsdFromLamports(n,r),o=await q.fetchTransactionEstimatedFees({solanaClient:t,tx:e});return{amountInUsd:s,feeInUsd:r?x.getFormattedUsdFromLamports(o,r):void 0,totalInUsd:x.getFormattedUsdFromLamports(n+o,r)}}if("USDC"===n&&r){let n="$"+a,s=await q.fetchTransactionEstimatedFees({solanaClient:t,tx:e}),o=function(e,t){let a=parseFloat(e.toString())/x.LAMPORTS_PER_SOL*t;return a<.01?0:a}(s,r);return{amountInUsd:n,feeInUsd:x.getFormattedUsdFromLamports(s,r),totalInUsd:"$"+(parseFloat(a)+o).toFixed(2)}}if("SOL"===n){let n=A(a),r=await q.fetchTransactionEstimatedFees({solanaClient:t,tx:e});return{amountInSol:a+" SOL",feeInSol:P(r)+" SOL",totalInSol:P(n+r)+" SOL"}}return{amountInUsdc:a+" USDC",feeInSol:P(await q.fetchTransactionEstimatedFees({solanaClient:t,tx:e}))+" SOL"}}const M={component:function(){let t=g.useAppConfig(),{closePrivyModal:d,createAnalyticsEvent:m}=p.usePrivyInternal(),{data:w,setModalData:P,navigate:U}=f.usePrivyModal(),{wallets:M}=h.useWallets(),[W,b]=a.useState("preparing"),[N,O]=a.useState(),[R,D]=a.useState(),[_,B]=a.useState();if(!w?.solanaFundingData)throw Error("Funding config is missing");if(!w.solanaFundingData.sourceWalletData)throw Error("Funding config is missing source wallet data");let{amount:$,asset:G,chain:H,sourceWalletData:V,destinationAddress:K,afterSuccessScreen:Q}=w.solanaFundingData,X=M.find((e=>e.address===V.address&&y.toSolanaWalletClientType(V.walletClientType)===y.toSolanaWalletClientType(e.standardWallet.name))),Y=q.useSolanaRpcClient()(H),{tokenPrice:z,isTokenPriceLoading:J}=S.useGetTokenPrice("solana");return a.useEffect((()=>{if("preparing"!==W||J||!X)return;let e="SOL"===G?A($):function(e){return BigInt(Math.floor(1e6*parseFloat(e)))}($);D({amount:("SOL"===G&&z?x.getFormattedUsdFromLamports(e,z):$)??$}),("SOL"===G?async function({solanaClient:e,source:t,destination:a,amountInLamports:n}){let{value:r}=await e.rpc.getLatestBlockhash().send(),s={address:t},o=T.pipe(T.createTransactionMessage({version:0}),(e=>T.setTransactionMessageFeePayerSigner(s,e)),(e=>T.setTransactionMessageLifetimeUsingBlockhash(r,e)),(e=>T.appendTransactionMessageInstruction(I.getTransferSolInstruction({amount:n,source:s,destination:a}),e)),(e=>T.compileTransaction(e)));return new Uint8Array(T.getTransactionEncoder().encode(o))}({solanaClient:Y,source:X.address,destination:K,amountInLamports:e}):async function({solanaClient:e,source:t,destination:a,amountInBaseUnits:n}){let r=F.getUsdcMintAddress(e.chain),{value:s}=await e.rpc.getLatestBlockhash().send(),o={address:t},[i]=await C.findAssociatedTokenPda({mint:r,owner:t,tokenProgram:x.TOKEN_PROGRAM_ID}),[l]=await C.findAssociatedTokenPda({mint:r,owner:a,tokenProgram:x.TOKEN_PROGRAM_ID}),[u,c]=await Promise.all([e.rpc.getAccountInfo(i,{commitment:"confirmed",encoding:"jsonParsed"}).send().catch((()=>null)),e.rpc.getAccountInfo(l,{commitment:"confirmed",encoding:"jsonParsed"}).send().catch((()=>null))]);if(!u?.value)throw Error(`Source token account does not exist for address: ${t}`);let d=C.getCreateAssociatedTokenIdempotentInstruction({payer:o,ata:l,owner:a,mint:r}),m=T.pipe(T.createTransactionMessage({version:0}),(e=>T.setTransactionMessageFeePayerSigner(o,e)),(e=>T.setTransactionMessageLifetimeUsingBlockhash(s,e)),(e=>c?.value?e:T.appendTransactionMessageInstruction(d,e)),(e=>T.appendTransactionMessageInstruction(C.getTransferInstruction({source:i,destination:l,authority:o,amount:n}),e)),(e=>T.compileTransaction(e)));return new Uint8Array(T.getTransactionEncoder().encode(m))}({solanaClient:Y,source:X.address,destination:K,amountInBaseUnits:e})).then(O).catch((e=>{b("error"),B(e)}))}),[W,$,G,H,X,K,J,z]),a.useEffect((()=>{"preparing"===W&&N&&k({tx:N,solanaClient:Y,amount:$,asset:G,tokenPrice:z}).then((e=>{b("loaded"),D({amount:e?.amountInUsd??e?.amountInUsdc??e?.amountInSol??$,fee:e?.feeInUsd??e?.feeInSol,total:e?.totalInUsd??e?.totalInSol})})).catch((e=>{b("error"),B(e)}))}),[N,$,G,W,z]),a.useEffect((()=>{"error"===W&&_&&(P({errorModalData:{error:_,previousScreen:"FundSolWalletWithExternalSolanaWallet"},solanaFundingData:w.solanaFundingData}),U("ErrorScreen",!1))}),[W,U]),a.useEffect((()=>{if("success"!==W)return;let e=setTimeout(Q?()=>U(Q):d,g.DEFAULT_SUCCESS_SCREEN_EXTRA_LONG_DURATION_MS);return()=>clearTimeout(e)}),[W]),"success"===W?/*#__PURE__*/e.jsxs(e.Fragment,{children:[/*#__PURE__*/e.jsx(l.t,{}),/*#__PURE__*/e.jsx(s.RefactorSpacerTop,{}),/*#__PURE__*/e.jsxs(s.CenteredItemWithGap,{children:[/*#__PURE__*/e.jsx(L.default,{color:"var(--privy-color-success)",width:"64px",height:"64px"}),/*#__PURE__*/e.jsx(i.CenteredScreenHeader,{title:"Success!",description:`You’ve successfully added ${$} ${G} to your ${t.name} wallet. It may take a minute before the funds are available to use.`})]}),/*#__PURE__*/e.jsx(s.RefactorSpacerBottom,{}),/*#__PURE__*/e.jsx(o.BlobbyFooter,{})]}):"preparing"===W||"loaded"===W||"sending"===W?/*#__PURE__*/e.jsxs(e.Fragment,{children:[/*#__PURE__*/e.jsx(l.t,{}),/*#__PURE__*/e.jsx(s.CenteredItem,{style:{marginTop:"16px"},children:/*#__PURE__*/e.jsx(u.InjectedWalletIcon,{icon:X?.standardWallet.icon,name:X?.standardWallet.name})}),/*#__PURE__*/e.jsx(i.CenteredScreenHeader,{style:{marginTop:"8px",marginBottom:"12px"},title:"sending"===W&&X?`Confirming with ${X.standardWallet.name}`:"Confirm transaction"}),/*#__PURE__*/e.jsx(E,{rows:[{label:"Source",value:n.formatWalletAddress(V.address)},{label:"Destination",value:n.formatWalletAddress(K)},{label:"Network",value:v.getChainName(H)},{label:"Amount",value:R?.amount,isLoading:"preparing"===W},{label:"Estimated fee",value:R?.fee,isLoading:"preparing"===W},{label:"Total",value:R?.total,isLoading:"preparing"===W}]}),/*#__PURE__*/e.jsx(r.PrimaryButton,{style:{marginTop:"1rem"},loading:"preparing"===W||"sending"===W,onClick:function(){"loaded"===W&&N&&X&&(b("sending"),async function({transaction:e,chain:t,sourceWallet:a,solanaClient:r}){let{hasFunds:s}=await q.simulateTransaction({solanaClient:r,tx:e});if(!s)throw new p.PrivyClientError(`Wallet ${n.formatWalletAddress(a.address)} does not have enough funds.`,void 0,p.PrivyErrorCode.INSUFFICIENT_BALANCE);let o=h.getAddressFromBuffer((await a.signAndSendTransaction({transaction:e,chain:t}).catch((e=>{throw new p.PrivyClientError("Transaction was rejected by the user",e,p.PrivyErrorCode.TRANSACTION_FAILURE)}))).signature);return await q.waitForSignatureConfirmation({rpcSubscriptions:r.rpcSubscriptions,signature:o,timeout:2e4}),o}({solanaClient:Y,transaction:N,chain:H,sourceWallet:X}).then((e=>{b("success"),m({eventName:j.ON_RAMP_COMPLETE_ANALYTICS_EVENT,payload:{provider:"external",status:"success",txHash:e,address:X.address,value:$,chainType:"solana",clusterName:H,token:G,destinationAddress:K,destinationValue:$,destinationChainType:"solana",destinationClusterName:H,destinationToken:G}})})).catch((e=>{b("error"),B(e)})))},children:"Confirm"}),/*#__PURE__*/e.jsx(o.BlobbyFooter,{})]}): /*#__PURE__*/e.jsxs(e.Fragment,{children:[/*#__PURE__*/e.jsx(l.t,{}),/*#__PURE__*/e.jsx(c.NeutralSpinner,{}),/*#__PURE__*/e.jsx("div",{style:{marginTop:"1rem"}}),/*#__PURE__*/e.jsx(o.BlobbyFooter,{})]})}};exports.FundSolWalletWithExternalSolanaWallet=M,exports.default=M;