Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/tempo-wallet-rpc-actions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"viem": patch
---

Added wallet `connect`, available as `client.connect` on Wallet Clients and as `connect` from `viem/actions`.

Added Tempo wallet actions under `tempoActions()` and `Actions.wallet`: `sendTransactionSync`, `writeContractSync`, `sendCallsSync`, `authorizeAccessKey`, and `revokeAccessKey`. Tempo chains also support typed `authorizeAccessKey` capabilities for `client.connect`.
165 changes: 165 additions & 0 deletions site/pages/docs/actions/wallet/connect.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
---
description: Requests to connect account(s) with optional capabilities.
---

# connect

Requests to connect account(s) with optional [capabilities](#capabilities).

`connect` uses [`wallet_connect`](https://github.com/ethereum/ERCs/blob/abd1c9f4eda2d6ad06ade0e3af314637a27d1ee7/ERCS/erc-7846.md). If the wallet does not support `wallet_connect` and no capabilities are requested, Viem falls back to [`eth_requestAccounts`](https://eips.ethereum.org/EIPS/eip-1102).

## Usage

:::code-group

```ts [example.ts]
import 'viem/window'
import { createWalletClient, custom } from 'viem'
import { mainnet } from 'viem/chains'

const walletClient = createWalletClient({
chain: mainnet,
transport: custom(window.ethereum!),
})

const { accounts } = await walletClient.connect()
```

```ts [standalone.ts]
import 'viem/window'
import { createWalletClient, custom } from 'viem'
import { connect } from 'viem/actions'
import { mainnet } from 'viem/chains'

const walletClient = createWalletClient({
chain: mainnet,
transport: custom(window.ethereum!),
})

const { accounts } = await connect(walletClient)
```

:::

## Returns

`ConnectReturnType`

Connected accounts and any returned capabilities.

```ts
type ConnectReturnType = {
accounts: readonly {
address: Address
capabilities?: Record<string, unknown> | undefined
}[]
}
```

## Parameters

### capabilities (optional)

- **Type:** `Record<string, unknown>`

Key-value pairs of [capabilities](#capabilities).

```ts
const { accounts } = await walletClient.connect({
capabilities: {
unstable_signInWithEthereum: {
chainId: 1,
nonce: 'abcd1234',
},
},
})
```

### chain (optional)

- **Type:** `Chain`
- **Default:** `client.chain`

Chain to connect on. Chains can use this to format `wallet_connect` request fields and capabilities.

```ts
const { accounts } = await walletClient.connect({
chain: mainnet,
})
```

## Capabilities

### `unstable_addSubAccount`

Adds a Sub Account to the connected Account. [See more](https://github.com/ethereum/ERCs/blob/4d3d641ee3c84750baf461b8dd71d27c424417a9/ERCS/erc-7895.md).

```ts
const { accounts } = await walletClient.connect({
capabilities: {
unstable_addSubAccount: {
account: {
keys: [
{
key: '0xFBA3912Ca04dd458c843e2EE08967fC04f3579c2',
type: 'address',
},
],
type: 'create',
},
},
},
})
```

### `unstable_signInWithEthereum`

Authenticate offchain using Sign-In with Ethereum. [See more](https://github.com/ethereum/ERCs/blob/abd1c9f4eda2d6ad06ade0e3af314637a27d1ee7/ERCS/erc-7846.md#signinwithethereum).

```ts
const { accounts } = await walletClient.connect({
capabilities: {
unstable_signInWithEthereum: {
chainId: 1,
nonce: 'abcd1234',
},
},
})
```

## Chain-specific Capabilities

Chains can add `wallet_connect` capability formatters through their chain definition. For example, Tempo chains format the `authorizeAccessKey` capability before sending the RPC request.

```ts
import 'viem/window'
import { createWalletClient, custom } from 'viem'
import { tempo } from 'viem/chains'
import type { Capabilities } from 'viem/tempo'

declare module 'viem' {
interface Register {
CapabilitiesSchema: Capabilities.Schema
}
}

const walletClient = createWalletClient({
chain: tempo,
transport: custom(window.ethereum!),
})

const { accounts } = await walletClient.connect({
capabilities: {
authorizeAccessKey: {
expiry: Math.floor(Date.now() / 1000) + 86_400,
keyType: 'p256',
},
method: 'login',
},
})
```

## JSON-RPC Methods

- [`wallet_connect`](https://github.com/ethereum/ERCs/blob/abd1c9f4eda2d6ad06ade0e3af314637a27d1ee7/ERCS/erc-7846.md)
- Falls back to [`eth_requestAccounts`](https://eips.ethereum.org/EIPS/eip-1102) when no capabilities are requested and the wallet does not support `wallet_connect`.
34 changes: 27 additions & 7 deletions site/pages/experimental/erc7846/client.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,36 @@
# Extending Client with ERC-7846 Actions [Setting up your Viem Client]

To use the experimental functionality of [ERC-7846](https://eips.ethereum.org/EIPS/eip-7846), you can extend your existing (or new) Viem Client with experimental [ERC-7846](https://eips.ethereum.org/EIPS/eip-7846) Actions.
`connect` is now available as a [Wallet Action](/docs/actions/wallet/connect) on Wallet Clients and as a standalone import from `viem/actions`.

Use the experimental [ERC-7846](https://eips.ethereum.org/EIPS/eip-7846) decorator for `disconnect` or for compatibility with the experimental entrypoint.

## connect

```ts
import 'viem/window'
import { createWalletClient, custom } from 'viem'
import { mainnet } from 'viem/chains'

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

const { accounts } = await client.connect()
```

## disconnect

```ts
import { createClient, http } from 'viem'
import 'viem/window'
import { createWalletClient, custom } from 'viem'
import { mainnet } from 'viem/chains'
import { erc7846Actions } from 'viem/experimental' // [!code focus]
import { erc7846Actions } from 'viem/experimental'

const client = createClient({
const client = createWalletClient({
chain: mainnet,
transport: http(),
}).extend(erc7846Actions()) // [!code focus]
transport: custom(window.ethereum!),
}).extend(erc7846Actions())

const hash = await client.connect()
await client.disconnect()
```
11 changes: 8 additions & 3 deletions site/pages/experimental/erc7846/connect.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,12 @@ description: Requests to connect Account(s).

Requests to connect Account(s) with optional [capabilities](#capabilities).

:::note

`connect` is now a [Wallet Action](/docs/actions/wallet/connect). This experimental export re-exports the same implementation for compatibility.

:::

## Usage

:::code-group
Expand All @@ -23,12 +29,11 @@ import 'viem/window'
// ---cut---
import { createWalletClient, custom } from 'viem'
import { mainnet } from 'viem/chains'
import { erc7846Actions } from 'viem/experimental'

export const walletClient = createWalletClient({
chain: mainnet,
transport: custom(window.ethereum!),
}).extend(erc7846Actions())
})
```

:::
Expand All @@ -41,7 +46,7 @@ List of connected accounts.
type ReturnType = {
accounts: readonly {
address: Address
capabilities: Record<string, unknown>
capabilities?: Record<string, unknown> | undefined
}[]
}
```
Expand Down
4 changes: 4 additions & 0 deletions site/vocs.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -461,6 +461,10 @@ export default defineConfig({
{
text: 'Account',
items: [
{
text: 'connect',
link: '/docs/actions/wallet/connect',
},
{
text: 'getAddresses',
link: '/docs/actions/wallet/getAddresses',
Expand Down
1 change: 1 addition & 0 deletions src/actions/index.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ test('exports actions', () => {
{
"addChain": [Function],
"call": [Function],
"connect": [Function],
"createAccessList": [Function],
"createBlockFilter": [Function],
"createContractEventFilter": [Function],
Expand Down
6 changes: 6 additions & 0 deletions src/actions/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -479,6 +479,12 @@ export {
type AddChainParameters,
addChain,
} from './wallet/addChain.js'
export {
type ConnectErrorType,
type ConnectParameters,
type ConnectReturnType,
connect,
} from './wallet/connect.js'
export {
type DeployContractErrorType,
type DeployContractParameters,
Expand Down
Loading
Loading