UNPKG

@useelven/core

Version:

Core React hooks for MultiversX DApps

3 lines (2 loc) 33 kB
'use client'; import{useState as Ue,useRef as Dt}from"react";import{useEffect as Y}from"react";import{proxy as ue}from"valtio";var tt=(a=>(a.ledger="ledger",a.walletconnect="walletconnect",a.wallet="wallet",a.extension="extension",a.xalias="xalias",a.hub="hub",a.none="",a))(tt||{}),nt=(o=>(o.testnet="testnet",o.devnet="devnet",o.mainnet="mainnet",o.notDefined="",o))(nt||{}),ot=(n=>(n.account="useElven_dapp__account",n.loginInfo="useElven_dapp__loginInfo",n))(ot||{}),rt=(t=>(t.hasWebWalletGuardianSign="hasWebWalletGuardianSign",t))(rt||{}),it=(o=>(o.FungibleESDT="FungibleESDT",o.MetaESDT="MetaESDT",o.NonFungibleESDT="NonFungibleESDT",o.SemiFungibleESDT="SemiFungibleESDT",o))(it||{});import me from"lodash.clonedeep";var be={addressIndex:0,address:"",nonce:0,balance:"",activeGuardianAddress:""},fe=ue(be),h=(e,t)=>{fe[e]=t},at=()=>{let e=me(be);Object.keys(e).forEach(t=>{h(t,e[t])})},we={loginMethod:"",expires:0,loginToken:"",signature:"",accessToken:""},X=ue(we),k=(e,t)=>{X[e]=t},st=()=>{let e=me(we);Object.keys(e).forEach(t=>{X[t]=e[t]})},ct={pending:!0,error:"",loggedIn:!1},Te=ue(ct),f=(e,t)=>{Te[e]=t},lt=()=>{let e=me(we);Object.keys(e).forEach(t=>{f(t,e[t])})},K=()=>{at(),st(),lt()};import{useEffect as dt,useRef as pt}from"react";var Q=(e,t)=>{let n=pt(!1);dt(()=>{n.current?e(t):n.current=!0},t)};import{snapshot as gt}from"valtio";import{useProxy as ut}from"valtio/utils";var mt=typeof window>"u",B=mt?e=>gt(e):ut;var E=()=>{let{addressIndex:e,address:t,balance:n,nonce:r,activeGuardianAddress:o}=B(fe);return{addressIndex:e,address:t,balance:n,nonce:r,activeGuardianAddress:o}};var G=()=>{let{loginMethod:e,expires:t,loginToken:n,signature:r,accessToken:o}=B(X);return{loginMethod:e,expires:t,loginToken:n,signature:r,accessToken:o}};var P=e=>{if(typeof window<"u"){let t=new URL(window.location.href);return new URLSearchParams(t.search).get(e)}return""};var Pe=(e,t)=>{let n=E(),r=G();Y(()=>{P("accessToken")&&localStorage.setItem("useElven_dapp__loginInfo",JSON.stringify({loginMethod:"hub"}))},[]),Y(()=>{let o=localStorage.getItem("useElven_dapp__account"),i=o?JSON.parse(o):null;if(!i?.address){f("pending",!1);return}h("address",i.address),h("nonce",i.nonce),h("balance",i.balance),h("addressIndex",i.addressIndex),h("activeGuardianAddress",i.activeGuardianAddress),e(!0)},[]),Y(()=>{let o=localStorage.getItem("useElven_dapp__loginInfo");if(o){let i=JSON.parse(o);k("loginMethod",i.loginMethod),k("expires",i.expires),k("loginToken",i.loginToken),k("signature",i.signature),k("accessToken",i.accessToken),t(!0)}},[]),Y(()=>{function o(i){if(i.key==="useElven_dapp__account"){let s=localStorage.getItem("useElven_dapp__account");if(s){let a=JSON.parse(s);h("nonce",a.nonce),h("balance",a.balance)}}}return window.addEventListener("storage",o),()=>{window.removeEventListener("storage",o)}},[]),Q(()=>{localStorage.setItem("useElven_dapp__account",JSON.stringify(n))},[n.address,n.nonce,n.balance,n.addressIndex,n.activeGuardianAddress]),Q(()=>{localStorage.setItem("useElven_dapp__loginInfo",JSON.stringify(r))},[r.loginMethod,r.expires,r.loginToken,r.signature,r.accessToken])};import{useEffect as kt}from"react";import{ApiNetworkProvider as ht}from"@multiversx/sdk-core";import{proxy as ft}from"valtio";import Yn from"lodash.clonedeep";var _="/dapp/init",Se={devnet:{chainType:"devnet",shortId:"D",name:"Devnet",egldLabel:"xEGLD",egldDenomination:"18",decimals:"4",gasPerDataByte:"1500",walletConnectDeepLink:"https://maiar.page.link/?apn=com.elrond.maiar.wallet&isi=1519405832&ibi=com.elrond.maiar.wallet&link=https://xportal.com/",walletConnectV2RelayAddresses:["wss://relay.walletconnect.com"],walletConnectV2ProjectId:"",xAliasAddress:"https://devnet.xalias.com",walletAddress:"https://devnet-wallet.multiversx.com",apiAddress:"https://devnet-api.multiversx.com",explorerAddress:"https://devnet-explorer.multiversx.com",IPFSGateway:"https://devnet-media.multiversx.com/nfts/asset/",apiTimeout:"4000",txWatcherTimeout:"90000",txWatcherPatience:"0"},testnet:{chainType:"testnet",shortId:"T",name:"Testnet",egldLabel:"xEGLD",egldDenomination:"18",decimals:"4",gasPerDataByte:"1500",walletConnectDeepLink:"https://maiar.page.link/?apn=com.elrond.maiar.wallet&isi=1519405832&ibi=com.elrond.maiar.wallet&link=https://xportal.com/",walletConnectV2RelayAddresses:["wss://relay.walletconnect.com"],walletConnectV2ProjectId:"",xAliasAddress:"https://testnet.xalias.com",walletAddress:"https://testnet-wallet.multiversx.com",apiAddress:"https://testnet-api.multiversx.com",explorerAddress:"https://testnet-explorer.multiversx.com",IPFSGateway:"https://testnet-media.multiversx.com/nfts/asset/",apiTimeout:"4000",txWatcherTimeout:"90000",txWatcherPatience:"0"},mainnet:{chainType:"mainnet",shortId:"1",name:"Mainnet",egldLabel:"EGLD",egldDenomination:"18",decimals:"4",gasPerDataByte:"1500",walletConnectDeepLink:"https://maiar.page.link/?apn=com.elrond.maiar.wallet&isi=1519405832&ibi=com.elrond.maiar.wallet&link=https://xportal.com/",walletConnectV2RelayAddresses:["wss://relay.walletconnect.com"],walletConnectV2ProjectId:"",xAliasAddress:"https://xalias.com",walletAddress:"https://wallet.multiversx.com",apiAddress:"https://api.multiversx.com",explorerAddress:"https://explorer.multiversx.com",IPFSGateway:"https://media.multiversx.com/nfts/asset/",apiTimeout:"4000",txWatcherTimeout:"90000",txWatcherPatience:"0"}};var he=Se.devnet,j=ft(he),ke=(e,t)=>{j[e]=t},Ie=e=>{let t={...e};Object.keys(he).forEach(n=>{t[n]?ke(n,t[n]):t.chainType?ke(n,Se[t.chainType][n]):ke(n,he[n])})};var D=()=>{let{chainType:e,shortId:t,name:n,egldLabel:r,egldDenomination:o,decimals:i,gasPerDataByte:s,walletConnectDeepLink:a,xAliasAddress:m,walletAddress:w,apiAddress:p,explorerAddress:d,apiTimeout:l,txWatcherTimeout:g,txWatcherPatience:T,IPFSGateway:S,walletConnectV2RelayAddresses:c,walletConnectV2ProjectId:u}=B(j);return{chainType:e,shortId:t,name:n,egldLabel:r,egldDenomination:o,decimals:i,gasPerDataByte:s,walletConnectDeepLink:a,xAliasAddress:m,walletAddress:w,apiAddress:p,explorerAddress:d,apiTimeout:l,txWatcherTimeout:g,txWatcherPatience:T,IPFSGateway:S,walletConnectV2RelayAddresses:c,walletConnectV2ProjectId:u}};import{proxy as wt,ref as Tt}from"valtio";var St={dappProvider:null,apiNetworkProvider:null},Z=wt(St);function L(e,t){Z[e]=Tt(t)}var ee=()=>{Z.dappProvider=null};var Le=e=>{let t=D();kt(()=>{(async()=>{let r=e?.current;if(!r){let o=t.apiAddress;if(o)r=new ht(o,{timeout:Number(t.apiTimeout)}),e.current=r,L("apiNetworkProvider",r);else throw Error("There is no public api configured! Check configuration.")}})()},[])};import{useRef as bt}from"react";import{WalletProvider as Ee}from"@multiversx/sdk-web-wallet-provider";import{WalletConnectV2Provider as Pt}from"@multiversx/sdk-wallet-connect-provider";import{ExtensionProvider as It}from"@multiversx/sdk-extension-provider";import{HWProvider as Lt}from"@multiversx/sdk-hw-provider";function te(e){return e.length?e[Math.floor(Math.random()*e.length)]:null}import{Address as xt,Account as At}from"@multiversx/sdk-core";var z=e=>{typeof window<"u"&&e!=null&&setTimeout(()=>{window.location.pathname.includes(e)||(window.location.href=e)},200)};var x=e=>typeof e=="string"?e.toUpperCase():e instanceof Error?e.message:`Error: ${JSON.stringify(e)}`;var N=e=>{let t=window?.location?.href;return e&&window?`${window.location.origin}${e}`:t};var ne=async(e,t,n)=>{let r=t?.getAddress();if(e&&r){let o=new xt(r),i=new At(o);try{let s=await e.getAccount(o),a=await e.getGuardianData(o);i.update(s),h("address",i.address.bech32()),h("activeGuardianAddress",a.guarded&&a.activeGuardian?.address.bech32()?a.activeGuardian.address.bech32():"")}catch(s){let a=x(s);console.warn(`Something went wrong trying to synchronize the user account: ${a}`)}}k("loginMethod","walletconnect"),n&&z(N(n))};var W=()=>new Date().setHours(new Date().getHours()+24),oe=e=>Date.now()>e;import{Address as De,Account as Oe}from"@multiversx/sdk-core";var U=()=>{let{pending:e,error:t,loggedIn:n}=B(Te);return{pending:e,error:t,loggedIn:n}};var O=()=>{let{dappProvider:e,apiNetworkProvider:t}=B(Z);return{dappProvider:e,apiNetworkProvider:t}};var $=()=>{let{pending:e,loggedIn:t,error:n}=U(),r=O();return{logout:async i=>{let s=i?.dappProvider||r.dappProvider;if(!s)K(),f("loggedIn",!1);else try{f("pending",!0),await s.logout(),i?.callbackUrl&&z(N(i?.callbackUrl)),f("loggedIn",!1)}catch(a){let m=x(a);console.error("error logging out",m),f("error",m)}finally{f("pending",!1),K(),ee()}},pending:e,loggedIn:t,error:n}};import{NativeAuthClient as vt}from"@multiversx/sdk-native-auth-client";var F=()=>new vt({apiUrl:j?.apiAddress||"",origin:typeof window<"u"&&typeof window.location<"u"?window.location.origin:"",expirySeconds:60*60*2});function yt(e){try{let t=atob(e),n=btoa(t),r=Buffer.from(e,"base64").toString(),o=Buffer.from(r).toString("base64");if(e===n&&e===o||t===r)return!0}catch{return!1}return!1}function J(e){return yt(e)?atob(e):e}var Ne=e=>{if(!e||Object.prototype.toString.call(e)!=="[object String]")return null;let t=e.split(".");if(t.length!==4)return null;try{let[n,r,o,i]=t,s=JSON.parse(J(i)),a=J(n);return{ttl:Number(o),extraInfo:s,origin:a,blockHash:r}}catch(n){return console.error(`Error trying to decode ${e}:`,n),null}};var Ce=e=>{if(!e||Object.prototype.toString.call(e)!=="[object String]")return null;let t=e.split(".");if(t.length!==3)return console.error("Invalid nativeAuthToken"),null;try{let[n,r,o]=t,i=J(n),s=J(r),a=Ne(s);if(!a)return{address:i,body:s,signature:o,blockHash:"",origin:"",ttl:0};let m={...a,address:i,body:s,signature:o};return a.extraInfo?.timestamp||delete m.extraInfo,m}catch{return null}};import{WebviewProvider as Nt}from"@multiversx/sdk-webview-provider";var Re=(e,t,n)=>{let r=bt(void 0),{logout:o}=$(),i=E(),s=G(),a=D();Q(()=>{(async()=>{let w=s.loginMethod,p=s.loginToken,d=s.expires,l=r?.current;if(d&&oe(d)){K(),ee(),localStorage.removeItem("useElven_dapp__account"),localStorage.removeItem("useElven_dapp__loginInfo");return}if(!l)switch(w){case"extension":{l=It.getInstance();try{await l.init(),l.isInitialized()?(l.setAddress(i.address),L("dappProvider",l)):(console.warn("Something went wrong trying to sync with the extension! Try to connect again."),await o())}catch(g){let T=x(g);console.warn("Can't initialize the Dapp Provider! ",T)}break}case"walletconnect":{if(!a.shortId||!a.chainType){console.warn("Please configure chainType in useSyncNetwork hook!");return}if(!a.walletConnectV2ProjectId){console.warn("Please configure walletConnectV2ProjectId in useSyncNetwork hook!");return}let g={onClientLogin:()=>ne(n?.current,r?.current),onClientLogout:()=>o({dappProvider:r?.current}),onClientEvent:S=>{console.info("wc2 session event: ",S)}},T=te(a.walletConnectV2RelayAddresses);if(!T){console.warn("Can't read the relay address. Try to provide one in useSyncNetwok hook!");return}l=new Pt(g,a.shortId,T,a.walletConnectV2ProjectId),r.current=l;try{await l.init(),l.isInitialized()?L("dappProvider",l):(console.warn("Something went wrong trying to sync with the xPortal app!"),await o())}catch{console.warn("Can't initialize the Dapp Provider!")}break}case"wallet":{let g=P("address")||i?.address,T=P("signature");if(T&&k("signature",T),g){l=new Ee(`${a.walletAddress}${_}`),L("dappProvider",l);let S=new De(g),c=new Oe(S);h("address",c.address.bech32())}if(T&&g&&p){let c=F().getToken(g,p,T);k("accessToken",c),r.current=l}break}case"xalias":{let g=P("address")||i?.address,T=P("signature");if(T&&k("signature",T),g){l=new Ee(`${a.xAliasAddress}${_}`),L("dappProvider",l);let S=new De(g),c=new Oe(S);h("address",c.address.bech32())}if(T&&g&&p){let c=F().getToken(g,p,T);k("accessToken",c),r.current=l}break}case"ledger":{l=new Lt,r.current=l,L("dappProvider",l);try{await l.init(),l.isInitialized()?(l.setAddressIndex(i.addressIndex),L("dappProvider",l)):(console.warn("Something went wrong trying to sync with the Ledger!"),await o())}catch{console.warn("Can't initialize the Dapp Provider!")}break}case"hub":{let g=P("accessToken");if(g){let T=Ce(g);if(!T){localStorage.removeItem("useElven_dapp__loginInfo");return}let{signature:S,address:c,body:u}=T;k("loginToken",u),k("accessToken",g),k("signature",S),k("loginMethod","hub"),k("expires",W()),h("address",c),l=new Nt,L("dappProvider",l)}break}}})()},[e,t])};import{Address as Ct,Account as Et}from"@multiversx/sdk-core";var Me=e=>{let t=E(),n=G();Q(()=>{(async()=>{let o=t.address,i=n.expires,s=e.current;if(!(i&&oe(i))&&o&&s){f("pending",!0);let m=new Ct(o),w=new Et(m);try{let p=await s.getAccount(m),d=await s.getGuardianData(m);w.update(p),h("address",o),h("nonce",w.nonce.valueOf()),h("balance",w.balance.toString()),h("activeGuardianAddress",d.guarded&&d.activeGuardian?.address.bech32()?d.activeGuardian.address.bech32():""),f("loggedIn",!!o)}catch(p){let d=x(p);console.warn(`Something went wrong trying to synchronize the user account: ${d}`)}finally{f("pending",!1)}}})()},[t?.address])};var Mr=e=>{Ie(e);let[t,n]=Ue(!1),[r,o]=Ue(!1),i=Dt(void 0);Pe(n,o),Le(i),Re(t,r,i),Me(i)};import{useState as re}from"react";import{Address as Ve,Transaction as Xt}from"@multiversx/sdk-core";import{useEffect as Vt}from"react";import{WALLET_PROVIDER_CALLBACK_PARAM as _t,WALLET_PROVIDER_CALLBACK_PARAM_TX_SIGNED as Ht}from"@multiversx/sdk-web-wallet-provider";import{Transaction as zt}from"@multiversx/sdk-core";import{WalletProvider as Qt}from"@multiversx/sdk-web-wallet-provider";import{Account as We,Address as Ot,TransactionWatcher as Rt,TransactionOptions as Mt,TransactionVersion as Ut}from"@multiversx/sdk-core";import{ExtensionProvider as Wt}from"@multiversx/sdk-extension-provider";import{WalletConnectV2Provider as Ft}from"@multiversx/sdk-wallet-connect-provider";import{HWProvider as Fe}from"@multiversx/sdk-hw-provider";import{WalletProvider as Be}from"@multiversx/sdk-web-wallet-provider";import{WebviewProvider as Bt}from"@multiversx/sdk-webview-provider";var xe=e=>{let t=e.getSender(),n=e.getNonce().valueOf();new We(t).incrementNonce(),h("nonce",n+1)},Gt=(e,t,n)=>{if(n){let o={guarded:!0,...t instanceof Fe?{hashSign:!0}:{}};e.setVersion(Ut.withTxOptions()),e.setOptions(Mt.withOptions(o)),e.setGuardian(Ot.fromBech32(n))}return e},Ae=async(e,t,n,r,o,i,s)=>{if(t(e),r){let m=await new Rt(r,{...i?{timeoutMilliseconds:parseInt(i)}:{},...s?{patienceMilliseconds:parseInt(s)}:{}}).awaitCompleted(e);t(e),n(m),o?.({transaction:e,pending:!1,txResult:m});let w=e.getSender(),p=new We(w),d=await r.getAccount(w);p.update(d),h("address",p.address.bech32()),h("balance",p.balance.toString())}},jt=(e,t,n)=>!(!n||!t||e.isGuardedTransaction()),Ge=(e,t)=>{let n=N(t);if(!e)return n;let r=new URL(n);return r.searchParams.set("ongoingTx",e),r.toString()},$t=async(e,t,n,r)=>{let o=new Be(`${t}${_}`),i=Ge(r,n),s=new URL(i);s.searchParams.set("hasWebWalletGuardianSign","true"),await o.guardTransactions([e],{callbackUrl:encodeURIComponent(s.toString())})},je=async(e,t,n,r,o,i,s,a,m,w,p,d,l,g,T)=>{let S=Gt(t,e,p);try{if(e instanceof Be&&await e.signTransaction(t,{callbackUrl:encodeURIComponent(Ge(l,m))}),e instanceof Wt&&(S=await e.signTransaction(t)),e instanceof Ft&&(S=await e.signTransaction(t)),e instanceof Bt&&(S=await e.signTransaction(t)),e instanceof Fe&&(S=await e.signTransaction(t)),n.loginMethod!=="wallet"&&n.loginMethod!=="xalias"){if(jt(S,p,d)){await $t(S,d,m,l);return}xe(S),await r.sendTransaction(S),await Ae(S,o,i,r,w,g,T)}}catch(c){let u=x(c);s(u),w?.({error:u})}finally{a(!1),w?.({pending:!1})}};var $e=({setPending:e,setTransaction:t,setTxResult:n,cb:r,setError:o,ongoingTxId:i})=>{let s=E(),a=O(),m=G(),w=D(),p=s.nonce;Vt(()=>{let d=P(_t),l=P("hasWebWalletGuardianSign");if((P("ongoingTx")||void 0)!==i)return;let T=async()=>{if(a.dappProvider&&a.apiNetworkProvider){let S;if("getTransactionsFromWalletUrl"in a.dappProvider){if(S=a.dappProvider.getTransactionsFromWalletUrl()?.[0],!S)return;m.loginMethod==="wallet"&&(S.data=Buffer.from(S.data).toString("base64"))}else if(s.activeGuardianAddress&&m.loginMethod!=="wallet"&&m.loginMethod!=="xalias"&&l)S=new Qt(`${w.walletAddress}${_}`).getTransactionsFromWalletUrl()?.[0];else return;if(!S)return;e(!0),r?.({pending:!0});let c=zt.fromPlainObject(S);try{xe(c),await a.apiNetworkProvider.sendTransaction(c),t(c),await Ae(c,t,n,a.apiNetworkProvider,r)}catch(u){let y=x(u);o(y),r?.({error:y})}finally{e(!1),r?.({pending:!1}),h("nonce",p+1),window.history.replaceState(null,"",window.location.pathname)}}};d===Ht&&a.apiNetworkProvider&&a.dappProvider&&T()},[a.apiNetworkProvider,a.dappProvider])};function ie({id:e,callbackUrl:t,cb:n}={id:void 0,callbackUrl:void 0,cb:void 0}){let[r,o]=re(!1),[i,s]=re(""),[a,m]=re(null),[w,p]=re(null),d=E(),l=G(),g=O(),T=D(),S=d.nonce;return $e({setPending:o,setTransaction:m,setTxResult:p,setError:s,cb:n,ongoingTxId:e}),{pending:r,triggerTx:async({address:u,data:y,gasLimit:v,value:I,tx:A})=>{if(m(null),p(null),s(""),!A&&!v){s("You need to provide the gas limit in the triggerTx function!");return}if(g.dappProvider&&g.apiNetworkProvider&&S!==void 0&&d.address){o(!0),n?.({pending:!0});let C=new Ve(d.address),R=d.activeGuardianAddress,b=A||new Xt({nonce:S,receiver:new Ve(u),gasLimit:(v?.valueOf()||0)+(d.activeGuardianAddress?5e4:0),chainID:T.shortId||"D",data:y,value:I||0,sender:C});je(g.dappProvider,b,l,g.apiNetworkProvider,m,p,s,o,t,n,R,T.walletAddress,e,T.txWatcherTimeout,T.txWatcherPatience)}else s("There is something wrong with the network synchronization. Check if you are logged in.")},transaction:a,txResult:w,error:i}}import{WalletProvider as Jt}from"@multiversx/sdk-web-wallet-provider";var H=async()=>{let e=F(),t=X.loginToken;if(!t)try{f("pending",!0),t=await e.initialize({timestamp:`${Math.floor(Date.now()/1e3)}`})}catch(n){f("error",x(n))}finally{f("pending",!1)}return k("loginToken",t),t};import{useEffect as Kt}from"react";var ae=(e,t)=>{let{logout:n}=$(),{loggedIn:r,pending:o,error:i}=U(),s=D();return Kt(()=>{let m=P("address"),w=P("signature");m&&w&&r&&window.history.replaceState(null,"",window.location.pathname)},[r]),{login:async()=>{f("pending",!0);let m=await H(),w=new Jt(`${s[e==="xalias"?"xAliasAddress":"walletAddress"]}${_}`),p={callbackUrl:N(t?.callbackUrl),token:m};try{k("loginMethod",e==="xalias"?"xalias":"wallet"),await w.login(p),k("expires",W()),k("loginToken",m)}catch(d){let l=x(d);f("error",`Error logging in ${l}`),k("loginMethod","")}finally{f("pending",!1)}},loggedIn:r,pending:o,error:i,logout:n,setLoggingInState:f}};var _e=e=>ae("webwallet",e);import{Address as qt,Account as Yt}from"@multiversx/sdk-core";import{ExtensionProvider as Zt}from"@multiversx/sdk-extension-provider";var He=e=>{let{logout:t}=$(),{loggedIn:n,pending:r,error:o}=U(),i=O();return{login:async()=>{let a=await H(),m=Zt.getInstance();try{if(!m.isInitialized()&&!await m.init()){let u="Something went wrong trying to redirect to wallet login..";console.warn(u),f("error",`Error logging in ${u}`);return}k("loginMethod","extension");let w={callbackUrl:N(e?.callbackUrl),token:a},p;try{p=await m.login(w),f("pending",!0)}catch(c){let u=x(c);console.warn(u),f("error",`Error logging in ${u}`);return}L("dappProvider",m);let{signature:d,address:l}=p,g=new qt(l),T=new Yt(g);if(i.apiNetworkProvider&&l)try{let c=await i.apiNetworkProvider.getAccount(g),u=await i.apiNetworkProvider.getGuardianData(g);T.update(c),h("activeGuardianAddress",u.guarded&&u.activeGuardian?.address.bech32()?u.activeGuardian.address.bech32():""),h("address",T.address.bech32()),h("nonce",T.nonce.valueOf()),h("balance",T.balance.toString())}catch(c){let u=x(c);console.warn(u),f("error",`Error logging in ${u}`);return}k("loginToken",a),k("expires",W()),f("loggedIn",!!l);let S=F();if(d&&S){k("signature",d);let c=S.getToken(l,a,d);k("accessToken",c)}e?.callbackUrl&&z(N(e?.callbackUrl))}catch(w){let p=x(w);f("error",`Error logging in ${p}`)}finally{f("pending",!1)}},loggedIn:n,pending:r,error:o,logout:t,setLoggingInState:f}};import{useState as ze,useRef as en}from"react";import{Account as tn,Address as nn}from"@multiversx/sdk-core";import{WalletConnectV2Provider as se,OptionalOperation as ce}from"@multiversx/sdk-wallet-connect-provider";var Qe=e=>{let{logout:t}=$(),{loggedIn:n,pending:r,error:o}=U(),[i,s]=ze(""),[a,m]=ze(),w=O(),p=D(),d=en(w.dappProvider),l=()=>{t({callbackUrl:N(e?.callbackUrl),dappProvider:d?.current})};return{login:async()=>{let c=await H(),u=te(p.walletConnectV2RelayAddresses);if(!u||!w.apiNetworkProvider){let A="Something wen't wrong with the initialization (ApiNetworkProvider or Wallet Connect Relay address), plese try to refresh the page!";console.warn(A),f("error",`Error logging in ${A}`);return}if(!p.shortId||!p.chainType){let A="Please configure chainType in useSyncNetwork hook!";console.warn(A),f("error",`Error logging in ${A}`);return}if(!p.walletConnectV2ProjectId){let A="Please configure walletConnectV2ProjectId in useSyncNetwork hook!";console.warn(A),f("error",`Error logging in ${A}`);return}let y={onClientLogin:async()=>{if(d.current instanceof se){let A=d.current.getAddress(),C=d.current.getSignature(),R=new tn(new nn(A));h("address",A),h("balance",R.balance.toString()),h("nonce",R.nonce.valueOf()),f("loggedIn",!!A);let b=F();if(C&&b){k("signature",C);let M=b.getToken(A,c,C);k("accessToken",M)}k("loginToken",c),L("dappProvider",d.current),ne(w.apiNetworkProvider,d.current,e?.callbackUrl)}},onClientLogout:l,onClientEvent:A=>{console.info("wc2 session event: ",A)}},v=(A,C)=>{if(!A||!!!C)return;let b=`${C}&token=${c}`;s(b)},I=new se(y,p.shortId,u,p.walletConnectV2ProjectId);try{d.current=I,await I.init();let{uri:A,approval:C}=await I.connect({methods:[ce.CANCEL_ACTION,ce.SIGN_NATIVE_AUTH_TOKEN]});A&&(k("loginMethod","walletconnect"),v(u,A),m(I.pairings),await I.login({token:c,approval:C}),f("pending",!0),k("expires",W()))}catch(A){let C=x(A);f("error",`Error logging in ${C}`)}finally{f("pending",!1)}},walletConnectUri:i,walletConnectPairings:a,walletConnectPairingLogin:async c=>{let u=d.current;if(u instanceof se){f("pending",!0);try{let{approval:y}=await u.connect({topic:c,methods:[ce.CANCEL_ACTION,ce.SIGN_NATIVE_AUTH_TOKEN]});k("loginMethod","walletconnect");let v=await H();await u.login({token:v,approval:y}),k("expires",W())}catch(y){let v=x(y);f("error",`Error logging in ${v}`)}finally{f("pending",!1)}}},walletConnectRemovePairing:async c=>{let u=d.current;if(u instanceof se&&c)try{await u.logout({topic:c})}catch(y){let v=x(y);f("error",`Something went wrong trying to remove the existing pairing: ${v}`)}finally{let y=a?.filter(v=>v.topic!==c);m(y)}},loggedIn:n,pending:r,error:o,logout:t,setLoggingInState:f}};import{Address as on,Account as rn}from"@multiversx/sdk-core";import{HWProvider as q}from"@multiversx/sdk-hw-provider";var Xe=e=>{let{logout:t}=$(),{loggedIn:n,pending:r,error:o}=U(),i=O();return{login:async(m=0,w=0,p=10)=>{let d=w*p+m,l=await H(),g=i.apiNetworkProvider,T=i.dappProvider;if(!T||!(T instanceof q))try{let c=new q;await c.init(),L("dappProvider",c)}catch(c){let u=x(c);console.warn(u),f("error",`Error logging in ${u}`);return}k("loginMethod","ledger"),k("loginToken",l),h("addressIndex",d);let S;try{if(T instanceof q){let c=await T.tokenLogin({token:Buffer.from(`${l}{}`),addressIndex:d});c.address&&(S=c.address);let u=F();if(c.signature&&u){let y=c.signature.toString("hex");k("signature",y);let v=u.getToken(c.address,l,y);k("accessToken",v)}}if(f("pending",!0),S&&(h("address",S),f("loggedIn",!!S),g)){let c=new on(S),u=new rn(c),y=await g.getAccount(c),v=await g.getGuardianData(c);u.update(y),h("activeGuardianAddress",v.guarded&&v.activeGuardian?.address.bech32()?v.activeGuardian.address.bech32():""),h("nonce",u.nonce.valueOf()),h("balance",u.balance.toString())}k("expires",W()),e?.callbackUrl&&z(N(e?.callbackUrl))}catch(c){let u=x(c);f("error",`Error logging in ${u}`)}finally{f("pending",!1)}},loggedIn:n,pending:r,getHWAccounts:async(m=0,w=10)=>{try{let p=i.dappProvider instanceof q?i.dappProvider:new q;return p.isInitialized()||await p.init(),L("dappProvider",p),await p.getAccounts(m,w)}catch(p){let d=x(p);return console.warn(d),f("error",`Error logging in ${d}`),[]}},error:o,logout:t,setLoggingInState:f}};var Je=e=>ae("xalias",e);var Ja=e=>{let t=U(),{login:n}=_e(e),{login:r}=Je(e),{login:o,walletConnectUri:i,walletConnectPairingLogin:s,walletConnectPairings:a,walletConnectRemovePairing:m}=Qe(e),{login:w}=He(e),{login:p,getHWAccounts:d}=Xe(e);return{walletConnectUri:i,walletConnectPairingLogin:s,walletConnectPairings:a,walletConnectRemovePairing:m,getHWAccounts:d,login:async(g,T,S,c)=>(g==="extension"&&await w(),g==="wallet"&&await n(),g==="xalias"&&await r(),g==="walletconnect"&&await o(),g==="ledger"&&await p(T,S,c),null),isLoggedIn:t.loggedIn,isLoggingIn:t.pending,error:t.error,setLoggingInState:f}};import{useState as an}from"react";import{TokenTransfer as de,Address as pe,SmartContractTransactionsFactory as sn,TransactionsFactoryConfig as cn,TransferTransactionsFactory as ln,Token as ge}from"@multiversx/sdk-core";var V={async get(e,t){let n=t?.baseEndpoint||j.apiAddress;if(typeof fetch<"u"){let r={method:"GET",headers:{"Content-Type":"application/json",Accept:"application/json"}},o=await fetch(n+e,Object.assign(r,t||{})),i=await o.json();if(!o.ok){let s=i?.error||o.status;return Promise.reject(s)}return i}},async post(e,t,n){if(typeof fetch<"u"){let r={method:"POST",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(t||{})},o=n?.baseEndpoint||j.apiAddress,i=await fetch(o+e,Object.assign(r,n||{})),s=await i.json();if(!i.ok){let a=s?.error||i.status;return Promise.reject(a)}return s}},async put(e,t,n){if(typeof fetch<"u"){let r={method:"PUT",headers:{"Content-Type":"application/json",Accept:"application/json"},body:JSON.stringify(t||{})},o=n?.baseEndpoint||j.apiAddress,i=await fetch(o+e,Object.assign(r,n||{})),s=await i.json();if(!i.ok){let a=s?.error||i.status;return Promise.reject(a)}return s}},async delete(e,t){if(typeof fetch<"u"){let n={method:"DELETE",headers:{"Content-Type":"application/json",Accept:"application/json"}},r=t?.baseEndpoint||j.apiAddress,o=await fetch(r+e,Object.assign(n,t||{})),i=await o.json();if(!o.ok){let s=i?.error||o.status;return Promise.reject(s)}return i}}};import le from"bignumber.js";le.config({ROUNDING_MODE:le.ROUND_FLOOR});var ve=({amount:e,decimals:t})=>{if(t<0)throw new Error("Decimal places shouldn't be negative number!");return BigInt(new le(e).shiftedBy(t).toFixed())},es=({amount:e,decimals:t,rounding:n=t})=>{if(t<0)throw new Error("Decimal places shouldn't be negative number!");return new le(e).shiftedBy(-t).decimalPlaces(n).toFixed()};var ps=({id:e,callbackUrl:t,cb:n}={id:void 0,callbackUrl:void 0,cb:void 0})=>{let[r,o]=an(),{address:i,nonce:s}=E(),{shortId:a}=D(),{triggerTx:m,pending:w,transaction:p,txResult:d,error:l}=ie({id:e,callbackUrl:t,cb:n});return{transfer:async function({tokens:T,receiver:S,gasLimit:c,endpointName:u,endpointArgs:y}){let v=[];try{for(let b of T){if(b.type==="FungibleESDT"){let M=await V.get(`/tokens/${b.tokenId.trim()}`);v.push(new de({token:new ge({identifier:b.tokenId.trim()}),amount:ve({amount:b.amount,decimals:M.decimals})}))}if(["NonFungibleESDT","MetaESDT","SemiFungibleESDT"].includes(b.type)){let M=await V.get(`/nfts/${b.tokenId.trim()}`);b.type==="NonFungibleESDT"&&v.push(new de({token:new ge({identifier:M.collection,nonce:M.nonce}),amount:1n})),b.type==="SemiFungibleESDT"&&v.push(new de({token:new ge({identifier:M.collection,nonce:M.nonce}),amount:BigInt(b.amount)})),b.type==="MetaESDT"&&v.push(new de({token:new ge({identifier:M.collection,nonce:M.nonce}),amount:ve({amount:b.amount,decimals:M.decimals})}))}}}catch(b){o(`Something went wrong: ${b}`);return}let I=new cn({chainID:a||"D"}),A=new sn({config:I}),C=new ln({config:I}),R;u?R=A.createTransactionForExecute({sender:pe.fromBech32(i),contract:pe.fromBech32(S),gasLimit:BigInt(c),tokenTransfers:v,function:u,...y?{arguments:y}:{}}):R=C.createTransactionForESDTTokenTransfer({sender:pe.fromBech32(i),receiver:pe.fromBech32(S),tokenTransfers:v}),R.nonce=BigInt(s),m({tx:R})},pending:w,transaction:p,txResult:d,error:r||l}};import{useEffect as dn,useState as ye}from"react";import{Address as Ke,Message as qe}from"@multiversx/sdk-core";import{WalletProvider as pn}from"@multiversx/sdk-web-wallet-provider";var xs=()=>{let e=O(),{address:t}=E(),[n,r]=ye(),[o,i]=ye(),[s,a]=ye();return dn(()=>{let w=!P("walletProviderStatus"),p=P("status")==="signed",d=P("message"),l=P("signature");w&&p&&d&&l&&(a(l),window.history.replaceState(null,"",window.location.pathname))},[e.apiNetworkProvider,e.dappProvider]),{signMessage:async({message:w,options:p})=>{if(!e.dappProvider){r("Error: Message signing failed: There is no active session!");return}if(!e.apiNetworkProvider){r("Error: Message signing failed: There is no active network provider!");return}try{if(i(!0),e.dappProvider instanceof pn){let d=g=>encodeURIComponent(g).replace(/[!'()*]/g,T=>`%${T.charCodeAt(0).toString(16).toUpperCase()}`),l=N(p?.callbackUrl);await e.dappProvider.signMessage(new qe({data:Buffer.from(w),address:new Ke(t)}),{callbackUrl:encodeURIComponent(`${l}${l.includes("?")?"&":"?"}message=${d(w)}`)})}else{let d=await e.dappProvider.signMessage(new qe({data:Buffer.from(w),address:new Ke(t)}));d?.signature&&a(Buffer.from(d.signature).toString("hex"))}}catch(d){let l=x(d);r(l)}finally{i(!1)}},pending:o,signature:s,error:n}};import{Address as gn,SmartContractTransactionsFactory as un,TransactionsFactoryConfig as mn,Code as Ye}from"@multiversx/sdk-core";var Cs=({id:e,callbackUrl:t,cb:n}={id:void 0,callbackUrl:void 0,cb:void 0})=>{let{address:r,nonce:o}=E(),{shortId:i}=D(),{triggerTx:s,pending:a,transaction:m,txResult:w,error:p}=ie({id:e,callbackUrl:t,cb:n}),d=async function({source:g,gasLimit:T=1e7,initArguments:S=[],isUpgradeable:c=!0,isReadable:u=!1,isPayable:y=!1,isPayableBySmartContract:v=!1}){try{let I;if(Buffer.isBuffer(g))I=Ye.fromBuffer(g).valueOf();else{let M=await(await fetch(g)).arrayBuffer();I=Ye.fromBuffer(Buffer.from(M)).valueOf()}let A=new mn({chainID:i||"D"}),R=new un({config:A}).createTransactionForDeploy({sender:new gn(r),bytecode:I,isUpgradeable:c,isReadable:u,isPayable:y,isPayableBySmartContract:v,arguments:S,gasLimit:BigInt(T)});R.setNonce(o),s({tx:R})}catch(I){throw new Error(x(I))}},l=w?.logs.events?.find(g=>g.identifier==="SCDeploy")?.address?.bech32();return{deploy:d,pending:a,transaction:m,txResult:w,scAddress:l,error:p}};import fn from"swr";import{ResultsParser as wn,SmartContract as Tn,Address as Sn,AbiRegistry as kn}from"@multiversx/sdk-core";import{ContractQueryResponse as hn}from"@multiversx/sdk-core";import xn from"swr/mutation";var An=(o=>(o.NUMBER="number",o.STRING="string",o.BOOLEAN="boolean",o.COMPLEX="complex",o))(An||{}),Ze=async({url:e,payload:t})=>await V.post(e,t||{});function Gs({type:e,payload:t,options:n,autoInit:r=!0,abiJSON:o}){let i="";switch(e){case"number":i="/vm-values/int";break;case"string":i="/vm-values/string";break;case"boolean":i="/vm-values/int";break;case"complex":i="/vm-values/query";break}let{data:s,error:a,mutate:m,isValidating:w,isLoading:p}=fn(r?{url:i,payload:t}:null,Ze,{revalidateIfStale:!0,revalidateOnFocus:!1,revalidateOnReconnect:!0,...n}),{data:d,error:l,trigger:g,isMutating:T}=xn({url:i,payload:t},Ze,{populateCache:!0,revalidate:!0});return{data:(c=>{if(c!=null){if(e==="complex"&&!o)throw new Error("Please provide the ABI JSON contents if you want to use the COMPLEX queries in useScQuery! Check README.md for more info.");if(e==="complex"&&o&&c?.returnData&&t?.scAddress&&t?.funcName){let u=new wn,y=kn.create(o),I=new Tn({address:new Sn(t.scAddress),abi:y}).getEndpoint(t.funcName),A=hn.fromHttpResponse(c);return u.parseQueryResponse(A,I)}return e==="boolean"?!!Number(c):e==="number"?Number(c):c}})(s?.data?.data||d?.data?.data),isLoading:p,isValidating:w||T,error:a||l,fetch:r?m:g}}import vn from"swr";import yn from"swr/mutation";async function et({url:e,type:t,payload:n,baseEndpoint:r}){return t==="post"?await V.post(e,n||{},{baseEndpoint:r}):t==="put"?await V.put(e,n||{},{baseEndpoint:r}):t==="delete"?await V.delete(e,{baseEndpoint:r}):await V.get(e,{baseEndpoint:r})}function Qs({url:e,type:t,payload:n,options:r,autoInit:o=!0,baseEndpoint:i}){let{data:s,error:a,mutate:m,isValidating:w,isLoading:p}=vn(o?{url:e,payload:n,type:t,baseEndpoint:i}:null,et,{revalidateIfStale:!0,revalidateOnFocus:!1,revalidateOnReconnect:!0,...r}),{data:d,error:l,trigger:g,isMutating:T}=yn({url:e,payload:n,type:t},et,{populateCache:!0,revalidate:!0});return{data:s||d,isLoading:p,isValidating:w||T,error:a||l,fetch:o?m:g}}export{it as ESDTType,nt as EnvironmentsEnum,ot as LocalstorageKeys,tt as LoginMethodsEnum,An as SCQueryType,rt as WebWalletUrlParamsEnum,es as formatAmount,ve as parseAmount,E as useAccount,Qs as useApiCall,D as useConfig,He as useExtensionLogin,Xe as useLedgerLogin,U as useLoggingIn,Ja as useLogin,G as useLoginInfo,$ as useLogout,Qe as useMobileAppLogin,O as useNetwork,Mr as useNetworkSync,Cs as useScDeploy,Gs as useScQuery,xs as useSignMessage,ps as useTokenTransfer,ie as useTransaction,_e as useWebWalletLogin,Je as useXaliasLogin};