Skip to main content

useSmartWallet

Hook that allows users to connect their Smart wallet to your dApp.

The useSmartWallet() hook will handle connecting both the personal wallet and the Smart Wallet.

import { useSmartWallet } from "@thirdweb-dev/react";

const Home = () => {
// Here we use metamask as the personal wallet
const { connect } = useSmartWallet(metamaskWallet(), {
factoryAddress: "0x...",
gasless: true,
});

return (
<button
onClick={async () =>
await connect();
}
>
Connect Smart Wallet
</button>
);
};

The smartWallet (with all personalWallets configured) need to be added in ThirdwebProvider's supportedWallets if you want the wallet to auto-connect on next page load.

Using EmbeddedWallet as the personal signer

You can have your users sign in with email or social and then connect their associated Smart Wallet.

const { connect } = useSmartWallet(embeddedWallet(), {
factoryAddress: factoryAddress,
gasless: true,
});

const onClick = async () => {
await connect({
connectPersonalWallet: async (embeddedWallet) => {
// login with google and connect the embedded wallet
const authResult = await embeddedWallet.authenticate({
strategy: "google",
});
await embeddedWallet.connect({ authResult });
},
});
};

Using LocalWallet as the personal signer

You can generate wallets on device for your users and connect to the associated Smart Wallet.

const { connect } = useSmartWallet(localWallet(), {
factoryAddress: "0x...",
gasless: true,
});

const onClick = async () => {
await connect({
connectPersonalWallet: async (localWallet) => {
// Generate and connect s local wallet before using it as the personal signer
await localWallet.generate();
await localWallet.connect();
},
});
};

Predicting the Smart Wallet address

THe useSmartWallet() also returns a function to predict a smart wallet address given a personal wallet address before connecting to it.

const { predictAddress } = useSmartWallet(localWallet(), {
factoryAddress: "0x...",
gasless: true,
});

const onClick = async () => {
const address = await predictAddress({
personalWalletAddress: "0x...",
});
console.log("Predicted Smart Wallet address", address);
};

Connect options

connectPersonalWallet (optional)

A function to determine how to connect to the given personal wallet. Gives a created instance of the wallet as an argument.

accountAddress (optional)

The specific smart wallet address to connect to.

Configuration

Mandatory properties

personalWallet

A wallet configuration object from @thirdweb-dev/react package.

Ex: metamaksWallet(), coinbaseWallet(), walletConnectWallet(), embeddedWallet(), localWallet(), etc.

factoryAddress

The address of the Smart Wallet Factory contract.

Must be a string.

gasless

Whether to turn on or off gasless transactions.

  • If set to true, all gas fees will be paid by a paymaster.
  • If set to false, all gas fees will be paid by the Smart Wallet itself (needs to be funded).

Must be a boolean.

Optional properties

factoryInfo

Customize how the Smart Wallet Factory contract is interacted with. If not provided, the default functions will be used.

Must be a object. The object can contain the following properties:

  • createAccount - a function that returns the transaction object to create a new Smart Wallet.
  • getAccountAddress - a function that returns the address of the Smart Wallet contract given the owner address.
  • abi - optional ABI. If not provided, the ABI will be auto-resolved.

Example:

 {
createAccount: (factory, owner) => {
return factory.prepare("customCreateAccount", [
owner,
getExtraData(),
]);
},
getAccountAddress(factory, owner) {
return factory.call("getAccountAddress", [owner]);
},
abi: [...]
}
accountInfo

Customize how the Smart Wallet Account contract is interacted with. If not provided, the default functions will be used.

Must be a object. The object can contain the following properties:

  • execute - a function that returns the transaction object to execute an arbitrary transaction.
  • getNonce - a function that returns the current nonce of the account.
  • abi - optional ABI. If not provided, the ABI will be auto-resolved.

Example:

{
execute(account, target, value, data) {
return account.prepare("customExecute", [
target, value, data
]);
},
getNonce(account) {
return account.call("getNonce");
},
abi: [...]
}
bundlerUrl

Your own bundler URL to send user operations to. Uses thirdweb's bundler by default.

Must be a string.

paymasterUrl

Your own paymaster URL to send user operations to for gasless transactions. Uses thirdweb's paymaster by default.

Must be a string.

entryPointAddress

The entrypoint contract address. Uses v0.6 by default.

Must be a string.