> **Can't find what you're looking for?** Use `search_docs` on the docs MCP server at `https://v3.viem.sh/api/mcp` to find what you need.

# Contract

## Overview

The **Contract** module creates type-safe contract instances: an object bound to an ABI, address, and [Client](/docs/clients), exposing the contract's functions and events as methods.

An instance groups its methods by intent, each derived from the ABI:

* [**`read`**](/docs/contract/instances/read): read-only functions (`pure` and `view`).
* [**`write`**](/docs/contract/instances/write), [**`simulate`**](/docs/contract/instances/simulate), [**`estimateGas`**](/docs/contract/instances/estimateGas): write functions.
* [**`getLogs`**](/docs/contract/instances/getLogs), [**`createEventFilter`**](/docs/contract/instances/createEventFilter), [**`watchEvent`**](/docs/contract/instances/watchEvent): events.

Each method calls the matching [Contract Action](/docs/actions/public/contract/read) with the `abi`,
`address`, and `functionName` or `eventName` already bound.

```ts twoslash
import { Client, Contract, http } from 'viem'
import { mainnet } from 'viem/chains'
import { Abis } from 'viem/utils'

const client = Client.create({ chain: mainnet, transport: http() })

const contract = Contract.from({
  abi: Abis.erc20,
  address: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
  client,
})

const balance = await contract.read.balanceOf([
  '0xA0Cf798816D4b9b9866b5330EEa46a18382f251e',
])
```

<Cards>
  <Card title="Contract Instances" description="Create an instance with Contract.from and call its typed methods." icon="lucide:file-code" to="/docs/contract/instances" />
</Cards>
