UNPKG

@mysten/dapp-kit

Version:

A collection of React hooks and components for interacting with the Sui blockchain and wallets.

246 lines (232 loc) 8.66 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/wallet/useSignAndExecuteTransaction.ts var useSignAndExecuteTransaction_exports = {}; __export(useSignAndExecuteTransaction_exports, { useSignAndExecuteTransaction: () => useSignAndExecuteTransaction }); module.exports = __toCommonJS(useSignAndExecuteTransaction_exports); var import_utils2 = require("@mysten/sui/utils"); var import_wallet_standard = require("@mysten/wallet-standard"); var import_react_query2 = require("@tanstack/react-query"); // src/constants/walletMutationKeys.ts var walletMutationKeys = { all: { baseScope: "wallet" }, connectWallet: formMutationKeyFn("connect-wallet"), autoconnectWallet: formMutationKeyFn("autoconnect-wallet"), disconnectWallet: formMutationKeyFn("disconnect-wallet"), signPersonalMessage: formMutationKeyFn("sign-personal-message"), signTransaction: formMutationKeyFn("sign-transaction"), signAndExecuteTransaction: formMutationKeyFn("sign-and-execute-transaction"), switchAccount: formMutationKeyFn("switch-account"), reportTransactionEffects: formMutationKeyFn("report-transaction-effects") }; function formMutationKeyFn(baseEntity) { return function mutationKeyFn(additionalKeys = []) { return [{ ...walletMutationKeys.all, baseEntity }, ...additionalKeys]; }; } // src/errors/walletErrors.ts var WalletNotConnectedError = class extends Error { }; var WalletNoAccountSelectedError = class extends Error { }; var WalletFeatureNotSupportedError = class extends Error { }; // src/hooks/useSuiClient.ts var import_react2 = require("react"); // src/components/SuiClientProvider.tsx var import_client = require("@mysten/sui/client"); var import_react = require("react"); var import_jsx_runtime = require("react/jsx-runtime"); var SuiClientContext = (0, import_react.createContext)(null); var DEFAULT_NETWORKS = { localnet: { url: (0, import_client.getFullnodeUrl)("localnet") } }; // src/hooks/useSuiClient.ts function useSuiClientContext() { const suiClient = (0, import_react2.useContext)(SuiClientContext); if (!suiClient) { throw new Error( "Could not find SuiClientContext. Ensure that you have set up the SuiClientProvider" ); } return suiClient; } // src/hooks/wallet/useWalletStore.ts var import_react4 = require("react"); var import_zustand = require("zustand"); // src/contexts/walletContext.ts var import_react3 = require("react"); var WalletContext = (0, import_react3.createContext)(null); // src/hooks/wallet/useWalletStore.ts function useWalletStore(selector) { const store = (0, import_react4.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/hooks/wallet/useCurrentAccount.ts function useCurrentAccount() { return useWalletStore((state) => state.currentAccount); } // src/hooks/wallet/useCurrentWallet.ts function useCurrentWallet() { const currentWallet = useWalletStore((state) => state.currentWallet); const connectionStatus = useWalletStore((state) => state.connectionStatus); const supportedIntents = useWalletStore((state) => state.supportedIntents); switch (connectionStatus) { case "connecting": return { connectionStatus, currentWallet: null, isDisconnected: false, isConnecting: true, isConnected: false, supportedIntents: [] }; case "disconnected": return { connectionStatus, currentWallet: null, isDisconnected: true, isConnecting: false, isConnected: false, supportedIntents: [] }; case "connected": { return { connectionStatus, currentWallet, isDisconnected: false, isConnecting: false, isConnected: true, supportedIntents }; } } } // src/hooks/wallet/useReportTransactionEffects.ts var import_utils = require("@mysten/sui/utils"); var import_react_query = require("@tanstack/react-query"); function useReportTransactionEffects({ mutationKey, ...mutationOptions } = {}) { const { currentWallet } = useCurrentWallet(); const currentAccount = useCurrentAccount(); return (0, import_react_query.useMutation)({ mutationKey: walletMutationKeys.reportTransactionEffects(mutationKey), mutationFn: async ({ effects, chain = currentWallet?.chains[0], account = currentAccount }) => { if (!currentWallet) { throw new WalletNotConnectedError("No wallet is connected."); } if (!account) { throw new WalletNoAccountSelectedError( "No wallet account is selected to report transaction effects for" ); } const reportTransactionEffectsFeature = currentWallet.features["sui:reportTransactionEffects"]; if (reportTransactionEffectsFeature) { return await reportTransactionEffectsFeature.reportTransactionEffects({ effects: Array.isArray(effects) ? (0, import_utils.toBase64)(new Uint8Array(effects)) : effects, account, chain: chain ?? currentWallet?.chains[0] }); } }, ...mutationOptions }); } // src/hooks/wallet/useSignAndExecuteTransaction.ts function useSignAndExecuteTransaction({ mutationKey, execute, ...mutationOptions } = {}) { const { currentWallet, supportedIntents } = useCurrentWallet(); const currentAccount = useCurrentAccount(); const { client, network } = useSuiClientContext(); const { mutate: reportTransactionEffects } = useReportTransactionEffects(); const executeTransaction = execute ?? (async ({ bytes, signature }) => { const { digest, rawEffects } = await client.executeTransactionBlock({ transactionBlock: bytes, signature, options: { showRawEffects: true } }); return { digest, rawEffects, effects: (0, import_utils2.toBase64)(new Uint8Array(rawEffects)), bytes, signature }; }); return (0, import_react_query2.useMutation)({ mutationKey: walletMutationKeys.signAndExecuteTransaction(mutationKey), mutationFn: async ({ transaction, ...signTransactionArgs }) => { if (!currentWallet) { throw new WalletNotConnectedError("No wallet is connected."); } const signerAccount = signTransactionArgs.account ?? currentAccount; if (!signerAccount) { throw new WalletNoAccountSelectedError( "No wallet account is selected to sign the transaction with." ); } if (!currentWallet.features["sui:signTransaction"] && !currentWallet.features["sui:signTransactionBlock"]) { throw new WalletFeatureNotSupportedError( "This wallet doesn't support the `signTransaction` feature." ); } const chain = signTransactionArgs.chain ?? `sui:${network}`; const { signature, bytes } = await (0, import_wallet_standard.signTransaction)(currentWallet, { ...signTransactionArgs, transaction: { async toJSON() { return typeof transaction === "string" ? transaction : await transaction.toJSON({ supportedIntents, client }); } }, account: signerAccount, chain }); const result = await executeTransaction({ bytes, signature }); let effects; if ("effects" in result && result.effects?.bcs) { effects = result.effects.bcs; } else if ("rawEffects" in result) { effects = (0, import_utils2.toBase64)(new Uint8Array(result.rawEffects)); } else { throw new Error("Could not parse effects from transaction result."); } reportTransactionEffects({ effects, account: signerAccount, chain }); return result; }, ...mutationOptions }); } //# sourceMappingURL=useSignAndExecuteTransaction.js.map