Metamask Integration with Wagmi: Waiting for Transactions to Complete
As developers, we’re constantly seeking ways to improve our experiences and enhance security. Two popular tools that have been making waves in the web3 space are Metamask and Wagmi. In this article, we’ll explore how to use Wagmi’s useWaitForTransaction
combination with Metamask running on a local Hardhat node.
What is Metamask?
Metamask is a popular wallet for Ethereum that allows users to manage their accounts, balance, and transactions. It provides an API for interacting with the blockchain, allowing developers to access various features like wallets, token management, and more.
Wagmi’s useWaitForTransaction
Wagmi is a library for managing web3 connections, providing a simple way to interact with wallets, oracles, and other services. Its useWaitForTransaction
hook allows you to wait for transactions to complete on a specific wallet instance before processing the result.
Setting up Metamask on Hardhat
To use Metamask on your local Hardhat node, follow these steps:
- Install Metamask as a dependency in your project:
npm install metamask
- Create a new file called
metamask.js
and add the following code to initialize Metamask:
import { createClient } from '@metamask/dApp';
const metamask = createClient({
address: '0x...YourMetamaskAddress...', // replace with your Metamask wallet address
network: 'mainnet', // choose your network (e.g., mainnet, devnet)
});
export default metamask;
Integrating useWaitForTransaction
with Wagmi
Now that you have initialized Metamask, let’s integrate it with Wagmi using useWaitForTransaction
. Add the following code to your metamask.js
file:
import { useWaitForTransaction } from 'wagmi';
const wagmi = useWaitForTransaction({
hook: 'useMetamask',
args: {
client: metamask,
},
});
export default wagmi;
What does it do?
The useWaitForTransaction
hook takes a hook
parameter, which specifies the library to wait for. In this case, we’re using useMetamask
, which is Wagmi’s native hook for interacting with Metamask.
We pass an args
object containing the client
instance from Metamask, which is obtained via the createClient()
method.
Waiting for Transactions on Metamask
When you call wagmi
, it will wait for transactions to complete on your local Hardhat node using Metamask. This means that when a transaction is initiated, wagmi
will:
- Wait for the transaction to be mined or validated.
- Once the transaction is confirmed (e.g., sent to a wallet),
wagmi
will extract the result and send it back to your application.
By using useWaitForTransaction
, you can decouple your application’s business logic from the underlying blockchain, making it easier to manage complex workflows and reduce errors.
Example Use Case
Here’s an example of how you might use wagmi
with Metamask to send a transaction:
import { wagmi } from './metamask';
const { chainId, accounts } = await wagmi.createTransaction({
type: 'eth_send_transaction',
data: {
// your transaction data here,
},
});
const result = await chainId.toBuffer();
In this example, wagmi
creates a new transaction using Metamask’s API and sends it to the Ethereum mainnet. The result
variable is then extracted from the transaction, which can be used by your application.
Conclusion
In this article, we’ve shown how to use Wagmi’s useWaitForTransaction
combination with Metamask running on a local Hardhat node. By decoupling your application’s business logic from the blockchain, you can build more complex and reliable applications that handle transactions in a straightforward manner.