UNPKG

@roochnetwork/rooch-sdk-kit

Version:
629 lines (585 loc) 20 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/hooks/index.ts var hooks_exports = {}; __export(hooks_exports, { createNetworkConfig: () => createNetworkConfig, useAddresses: () => useAddresses, useAutoConnectWallet: () => useAutoConnectWallet, useConnectWallet: () => useConnectWallet, useConnectionStatus: () => useConnectionStatus, useCreateSessionKey: () => useCreateSessionKey, useCurrentAddress: () => useCurrentAddress, useCurrentNetwork: () => useCurrentNetwork, useCurrentSession: () => useCurrentSession, useCurrentWallet: () => useCurrentWallet, useRemoveSession: () => useRemoveSession, useRoochClient: () => useRoochClient, useRoochClientQuery: () => useRoochClientQuery, useRoochContext: () => useRoochContext, useSession: () => useSession, useSessions: () => useSessions, useSignAndExecuteTransaction: () => useSignAndExecuteTransaction, useSwitchNetwork: () => useSwitchNetwork, useTransferCoin: () => useTransferCoin, useTransferObject: () => useTransferObject, useWalletChanged: () => useWalletChanged, useWallets: () => useWallets }); module.exports = __toCommonJS(hooks_exports); // src/hooks/client/useCurrentNetwork.ts function useCurrentNetwork() { return useRoochContext().network; } // src/hooks/client/useRoochContext.ts var import_react7 = require("react"); // src/provider/clientProvider.tsx var import_react6 = require("react"); var import_rooch_sdk2 = require("@roochnetwork/rooch-sdk"); // src/hooks/useSessionsStore.ts var import_react5 = require("react"); var import_zustand2 = require("zustand"); // src/provider/roochProvider.tsx var import_react2 = require("react"); // src/provider/globalProvider.tsx var import_react = require("react"); var import_jsx_runtime = require("react/jsx-runtime"); var GlobalContext = (0, import_react.createContext)(null); var useTriggerError = () => { const ctx = (0, import_react.useContext)(GlobalContext); if (!ctx) { throw new Error("useTriggerError must be used within a GlobalProvider"); } return ctx.triggerError; }; // src/provider/roochProvider.tsx var import_jsx_runtime2 = require("react/jsx-runtime"); var RoochContext = (0, import_react2.createContext)(null); // src/provider/walletProvider.tsx var import_react4 = require("react"); var import_rooch_sdk = require("@roochnetwork/rooch-sdk"); // src/wellet/wallets.ts var wallets = void 0; var registered = /* @__PURE__ */ new Set(); var listeners = {}; function getWallets() { if (wallets) return wallets; wallets = Object.freeze({ register, get, on }); return wallets; } function register(...wallets2) { wallets2.forEach((wallet) => registered.add(wallet)); listeners["register"]?.forEach((listener) => guard(() => listener(...wallets2))); return function unregister() { wallets2.forEach((wallet) => registered.delete(wallet)); listeners["unregister"]?.forEach((listener) => guard(() => listener(...wallets2))); }; } function get() { return [...registered]; } function on(event, listener) { listeners[event]?.push(listener) || (listeners[event] = [listener]); return function off() { listeners[event] = listeners[event]?.filter((existingListener) => listener !== existingListener); }; } function guard(callback) { try { callback(); } catch (error) { console.error(error); } } // src/wellet/util.ts function getRegisteredWallets(preferredWallets, walletFilter) { const walletsApi = getWallets(); const wallets2 = walletsApi.get(); const Wallets = wallets2.filter((wallet) => !walletFilter || walletFilter(wallet)); return [ // Preferred wallets, in order: ...preferredWallets.map((name) => Wallets.find((wallet) => wallet.getName() === name)), // Wallets in default order: ...Wallets.filter((wallet) => !preferredWallets.includes(wallet.getName())) ].filter((wallet) => wallet !== void 0); } // src/hooks/wallet/useWalletStore.ts var import_react3 = require("react"); var import_zustand = require("zustand"); function useWalletStore(selector) { const store = (0, import_react3.useContext)(WalletContext); if (!store) { throw new Error("Could not find WalletContext. Ensure that you have set up the WalletProvider."); } return (0, import_zustand.useStore)(store, selector); } // src/provider/walletProvider.tsx var import_jsx_runtime3 = require("react/jsx-runtime"); var WalletContext = (0, import_react4.createContext)(null); // src/hooks/useSessionsStore.ts function useSessionStore(selector) { const store = (0, import_react5.useContext)(RoochContext); if (!store) { throw new Error( "Could not find RoochSessionContext. Ensure that you have set up the RoochClientProvider." ); } return (0, import_zustand2.useStore)(store, selector); } // src/provider/clientProvider.tsx var import_jsx_runtime4 = require("react/jsx-runtime"); var ClientContext = (0, import_react6.createContext)(null); var DEFAULT_NETWORKS = { localnet: { url: (0, import_rooch_sdk2.getRoochNodeUrl)("localnet") } }; // src/hooks/client/useRoochContext.ts function useRoochContext() { const context = (0, import_react7.useContext)(ClientContext); if (!context) { throw new Error( "Could not find RoochClientContext. Ensure that you have set up the RoochClientProvider." ); } return context; } // src/hooks/client/useRoochClient.ts function useRoochClient() { return useRoochContext().client; } // src/hooks/client/useRoochClientQuery.ts var import_react_query = require("@tanstack/react-query"); function useRoochClientQuery(...args) { const [method, params, { queryKey = [], ...options } = {}] = args; const network = useCurrentNetwork(); const roochClient = useRoochClient(); return (0, import_react_query.useQuery)({ ...options, queryKey: [network, method, params, ...queryKey], queryFn: async () => { return await roochClient[method](params); } }); } // src/hooks/client/useSwitchNetwork.ts var import_react_query2 = require("@tanstack/react-query"); // src/constants/roochMutationKeys.ts function formMutationKeyFn(baseEntity) { return function mutationKeyFn(additionalKeys = []) { return [{ ...roochMutationKeys.all, baseEntity }, ...additionalKeys]; }; } var roochMutationKeys = { all: { baseScope: "rooch" }, addNetwork: formMutationKeyFn("add-network"), switchNetwork: formMutationKeyFn("switch-network"), removeNetwork: formMutationKeyFn("remove-network"), removeSession: formMutationKeyFn("remove-session"), transferObject: formMutationKeyFn("transfer-object"), transferCoin: formMutationKeyFn("transfer-coin"), signAndExecuteTransaction: formMutationKeyFn("sign-and-execute-transaction") }; // src/constants/walletMutationKeys.ts function formMutationKeyFn2(baseEntity) { return function mutationKeyFn(additionalKeys = []) { return [{ ...walletMutationKeys.all, baseEntity }, ...additionalKeys]; }; } var walletMutationKeys = { all: { baseScope: "wallet" }, connectWallet: formMutationKeyFn2("connect-wallet"), autoConnectWallet: formMutationKeyFn2("auto-connect-wallet"), switchAccount: formMutationKeyFn2("switch-account"), createSessionKey: formMutationKeyFn2("create-session-key") }; // src/hooks/client/useSwitchNetwork.ts function useSwitchNetwork({ mutationKey, ...mutationOptions } = {}) { const switchNetwork = useRoochContext().selectNetwork; return (0, import_react_query2.useMutation)({ mutationKey: roochMutationKeys.switchNetwork(mutationKey), mutationFn: async (args) => { switchNetwork(args); }, ...mutationOptions }); } // src/hooks/client/useTransferObject.ts var import_react_query3 = require("@tanstack/react-query"); function useTransferObject({ mutationKey, ...mutationOptions } = {}) { const client = useRoochClient(); return (0, import_react_query3.useMutation)({ mutationKey: roochMutationKeys.transferObject(mutationKey), mutationFn: async (args) => { const result = await client.transferObject(args); if (result.execution_info.status.type !== "executed") { Error("transfer failed" + result.execution_info.status.type); } }, ...mutationOptions }); } // src/hooks/client/useTransferCoin.ts var import_react_query4 = require("@tanstack/react-query"); // src/hooks/useCurrentSession.ts function useCurrentSession() { return useSessionStore((state) => state.currentSession); } // src/hooks/client/useTransferCoin.ts function useTransferCoin({ mutationKey, ...mutationOptions } = {}) { const client = useRoochClient(); const curSession = useCurrentSession(); return (0, import_react_query4.useMutation)({ mutationKey: roochMutationKeys.transferCoin(mutationKey), mutationFn: async (args) => { const signer = args.signer || curSession; if (signer === null) { throw Error(""); } const result = await client.transfer({ ...args, signer: args.signer || curSession }); if (result.execution_info.status.type !== "executed") { Error("transfer failed" + result.execution_info.status.type); } }, ...mutationOptions }); } // src/hooks/client/networks-config.ts function createNetworkConfig(networkConfig) { function useNetworkConfig() { const { config } = useRoochContext(); if (!config) { throw new Error("No network config found"); } return config; } function useNetworkVariables() { const { variables } = useNetworkConfig(); return variables ?? {}; } function useNetworkVariable(name) { const variables = useNetworkVariables(); return variables[name]; } return { networkConfig, useNetworkConfig, useNetworkVariables, useNetworkVariable }; } // src/hooks/client/useSignAndExecuteTransaction.ts var import_react_query5 = require("@tanstack/react-query"); function useSignAndExecuteTransaction({ mutationKey, ...mutationOptions } = {}) { const client = useRoochClient(); const session = useCurrentSession(); return (0, import_react_query5.useMutation)({ mutationKey: roochMutationKeys.signAndExecuteTransaction(mutationKey), mutationFn: async (args) => { if (!session) { throw Error("Create a session first"); } const result = await client.signAndExecuteTransaction({ transaction: args.transaction, signer: args.signer || session }); if (result.execution_info.status.type !== "executed" && result.execution_info.status) { Error("transfer failed" + result.execution_info.status.type); } return result; }, ...mutationOptions }); } // src/hooks/wallet/useAddresses.ts function useAddresses() { return useWalletStore((state) => state.addresses); } // src/hooks/wallet/useAutoConnectWallet.ts var import_react_query6 = require("@tanstack/react-query"); var import_react8 = require("react"); function useAutoConnectWallet() { const { mutateAsync: connectWallet } = useConnectWallet(); const autoConnectEnabled = useWalletStore((state) => state.autoConnectEnabled); const lastConnectedWalletName = useWalletStore((state) => state.lastConnectedWalletName); const lastConnectedAddress = useWalletStore((state) => state.lastConnectedAddress); const { isConnected } = useCurrentWallet(); const wallets2 = useWallets(); const [clientOnly, setClientOnly] = (0, import_react8.useState)(false); (0, import_react8.useLayoutEffect)(() => { setClientOnly(true); }, []); const { data, isError } = (0, import_react_query6.useQuery)({ queryKey: [ "@rooch/sdk-kit", "autoconnect", { isConnected, autoConnectEnabled, lastConnectedWalletName, lastConnectedAddress } ], queryFn: async () => { if (!autoConnectEnabled) { return "disabled"; } if (!lastConnectedWalletName || !lastConnectedAddress || isConnected) { return "attempted"; } let wallet = wallets2.find((wallet2) => wallet2.getName() === lastConnectedWalletName); if (wallet) { await connectWallet({ wallet }); } return "attempted"; }, enabled: autoConnectEnabled, persister: void 0, gcTime: 0, staleTime: 0, networkMode: "always", retry: (_) => { return false; }, retryOnMount: false, refetchInterval: 1e3, refetchIntervalInBackground: false, refetchOnMount: false, refetchOnReconnect: false, refetchOnWindowFocus: false }); if (!autoConnectEnabled) { return "disabled"; } if (!clientOnly) { return "idle"; } if (!lastConnectedWalletName) { return "attempted"; } return isError ? "attempted" : data ?? "idle"; } // src/hooks/wallet/useConnectWallet.ts var import_react_query7 = require("@tanstack/react-query"); // src/hooks/useSessions.ts function useSessions() { return useSessionStore( (state) => state.sessions.sort((a, b) => b.getCreateTime() - a.getCreateTime()) ); } // src/hooks/wallet/useConnectWallet.ts function useConnectWallet({ mutationKey, ...mutationOptions } = {}) { const sessions = useSessions(); const setCurrentSession = useSessionStore((state) => state.setCurrentSession); const setWalletConnected = useWalletStore((state) => state.setWalletConnected); const setWalletDisconnected = useWalletStore((state) => state.setWalletDisconnected); const setConnectionStatus = useWalletStore((state) => state.setConnectionStatus); const triggerError = useTriggerError(); return (0, import_react_query7.useMutation)({ mutationKey: walletMutationKeys.connectWallet(mutationKey), mutationFn: async ({ wallet }) => { try { setConnectionStatus("connecting"); const connectAddress = await wallet.connect(); const selectedAddress = connectAddress[0]; setWalletConnected(wallet, connectAddress, selectedAddress); const cur = sessions.find( (item) => item.getRoochAddress().toStr() === selectedAddress?.genRoochAddress().toStr() ); setCurrentSession(cur); return connectAddress; } catch (error) { setWalletDisconnected(); if ("code" in error && "message" in error) { triggerError(error); } throw error; } }, ...mutationOptions }); } // src/hooks/wallet/useCurrentAddress.ts function useCurrentAddress() { return useWalletStore((state) => state.currentAddress); } // src/hooks/wallet/useCurrentWallet.ts function useCurrentWallet() { const currentWallet = useWalletStore((state) => state.currentWallet); const connectionStatus = useWalletStore((state) => state.connectionStatus); switch (connectionStatus) { case "connecting": return { status: connectionStatus, wallet: currentWallet, isDisconnected: false, isConnecting: true, isConnected: false }; case "disconnected": return { status: connectionStatus, wallet: currentWallet, isDisconnected: true, isConnecting: false, isConnected: false }; case "connected": { return { status: connectionStatus, wallet: currentWallet, isDisconnected: false, isConnecting: false, isConnected: true }; } } } // src/hooks/wallet/useWallets.ts function useWallets() { return useWalletStore((state) => state.wallets); } // src/hooks/wallet/useWalletChanged.ts var import_react9 = require("react"); function useWalletChanged(preferredWallets, walletFilter) { const updateWallets = useWalletStore((state) => state.updateWallets); (0, import_react9.useEffect)(() => { const api = getWallets(); updateWallets(getRegisteredWallets(preferredWallets, walletFilter)); const unsubscribeFromRegister = api.on("register", () => { updateWallets(getRegisteredWallets(preferredWallets, walletFilter)); }); return () => { unsubscribeFromRegister(); }; }, [preferredWallets, updateWallets, walletFilter]); } // src/hooks/wallet/useConnectionStatus.ts function useConnectionStatus() { return useWalletStore((state) => state.connectionStatus); } // src/hooks/useSession.ts function useSession(scope) { return useSessionStore( (state) => state.sessions.find( (item) => scope.includes("::") ? item.getScopes().find((_scope) => _scope === scope) : item.getScopes().find((_scope) => _scope.startsWith(scope)) !== void 0 ) ); } // src/hooks/useRemoveSession.ts var import_react_query8 = require("@tanstack/react-query"); function useRemoveSession({ mutationKey, ...mutationOptions } = {}) { const sessionsKeys = useSessions(); const removeSession = useSessionStore((state) => state.removeSession); const setCurrentSession = useSessionStore((state) => state.setCurrentSession); const currentSession = useCurrentSession(); const client = useRoochClient(); return (0, import_react_query8.useMutation)({ mutationKey: roochMutationKeys.removeSession(mutationKey), mutationFn: async (args) => { try { if (!currentSession) { return; } const result = await client.removeSession({ authKey: args.authKey, signer: currentSession }); if (result) { let cacheSession = sessionsKeys.find( (item) => item.getAuthKey() === args.authKey ); if (cacheSession) { removeSession(cacheSession); if (cacheSession.getAuthKey() === currentSession?.getAuthKey()) { const substitute = sessionsKeys.filter((item) => item.getAuthKey() !== cacheSession.getAuthKey()).sort((a, b) => b.getCreateTime() - a.getCreateTime()).filter((item) => !item.isSessionExpired()); if (substitute.length > 0) { setCurrentSession(substitute[0]); } else { setCurrentSession(void 0); } } } } } catch (e) { throw e; } }, ...mutationOptions }); } // src/hooks/useCreateSession.ts var import_react_query9 = require("@tanstack/react-query"); // src/error/walletErrors.ts var WalletNotConnectedError = class extends Error { }; // src/hooks/useCreateSession.ts function useCreateSessionKey({ mutationKey, ...mutationOptions } = {}) { const client = useRoochClient(); const { wallet } = useCurrentWallet(); const setCurrentSession = useSessionStore((state) => state.setCurrentSession); const triggerError = useTriggerError(); return (0, import_react_query9.useMutation)({ mutationKey: walletMutationKeys.createSessionKey(mutationKey), mutationFn: async (args) => { const signer = args.signer || wallet; if (!signer) { throw new WalletNotConnectedError("No wallet is connected."); } try { const sessionAccount = await client.createSession({ signer, sessionArgs: args }); setCurrentSession(sessionAccount); return sessionAccount; } catch (error) { if ("code" in error && "message" in error) { triggerError(error); } throw error; } }, ...mutationOptions }); } //# sourceMappingURL=index.js.map