Skip to main content

viem

info

Viem is currently only available on Funki Sepolia testnet.

viem a TypeScript interface for Ethereum that provides low-level stateless primitives for interacting with Ethereum.

You can use viem to interact with smart contracts deployed on Funki.


Install

To install viem run the following command:

npm install --save viem

Setup

Before you can start using viem, you need to setup a Client with a desired Transport and Chain.

import { createPublicClient, http } from 'viem';
import { funki } from 'viem/chains';

const client = createPublicClient({
chain: funki,
transport: http(),
});
info

To use Funki, you must specify funki as the chain when creating a Client.

To use Funki Sepolia (testnet), replace funki with funkiSepolia.

Reading data from the blockchain

Once you have created a client, you can use it to read and access data from Funki using Public Actions

Public Actions are client methods that map one-to-one with a "public" Ethereum RPC method (eth_blockNumber, eth_getBalance, etc.)

For example, you can use the getBlockNumber client method to get the latest block:

const blockNumber = await client.getBlockNumber();

Writing data to the blockchain

In order to write data to Funki, you need to create a Wallet client (createWalletClient) and specify an Account to use.

import { createWalletClient, custom } from 'viem'
import { funki } from 'viem/chains'

const [account] = await window.ethereum.request({ method: 'eth_requestAccounts' })

const client = createWalletClient({
account,
chain: funki,
transport: custom(window.ethereum)
})

client.sendTransaction({ ... })
info

In addition to making a JSON-RPC request (eth_requestAccounts) to get an Account, viem provides various helper methods for creating an Account, including: privateKeyToAccount, mnemonicToAccount, and hdKeyToAccount.

To use Funki Sepolia (testnet), replace funki with funkiSepolia.

Interacting with smart contracts

You can use viem to interact with a smart contract on Funki by creating a Contract instance using getContract and passing it the contract ABI, contract address, and Public and/or Wallet Client:

import { getContract } from 'viem';
import { wagmiAbi } from './abi';
import { publicClient } from './client';

// 1. Create contract instance
const contract = getContract({
address: 'CONTRACT_ADDRESS',
abi: wagmiAbi,
publicClient,
});

// 2. Call contract methods, listen to events, etc.
const result = await contract.read.totalSupply();
info

CONTRACT_ADDRESS is the address of the deployed contract.