Skip to content

signTransaction (Local Account)

Signs a transaction with the Account's private key.

Signs a transaction with the Account's private key.

Usage

import { parseGwei } from 'viem'
import { privateKeyToAccount } from 'viem/accounts'
 
const account = privateKeyToAccount('0x...')
 
const signature = await account.signTransaction({
  chainId: 1,
  maxFeePerGas: parseGwei('20'),
  maxPriorityFeePerGas: parseGwei('3'),
  gas: 21000n,
  nonce: 69,
  to: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266'
})
Output: "0x02f850018203118080825208808080c080a04012522854168b27e5dc3d5839bab5e6b39e1a0ffd343901ce1622e3d64b48f1a04e00902ae0502c4728cbf12156290df99c3ed7de85b1dbfe20b5c36931733a33"

Custom serializer

viem has a built-in serializer for Legacy, EIP-2930 (0x01) and EIP-1559 (0x02) transaction types. If you would like to serialize on another transaction type that viem does not support internally, you can pass a custom serializer.

import { parseGwei } from 'viem'
import { privateKeyToAccount } from 'viem/accounts'
 
const account = privateKeyToAccount('0x...')
 
const signature = await account.signTransaction({
  maxFeePerGas: parseGwei('20'),
  maxPriorityFeePerGas: parseGwei('3'),
  gas: 21000n,
  nonce: 69,
  to: '0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266'
}, {
  serializer(transaction) { 
    const {
      chainId,
      nonce,
      // ...
    } = transaction
 
    return concatHex([
      '0x69',
      toRlp([
        toHex(chainId),
        nonce ? toHex(nonce) : '0x',
        // ...
      ]),
    ])
  }
})

Returns

Hex

The signed transaction.

Parameters

accessList (optional)

The access list.

const signature = await account.signTransaction({
  accessList: [ 
    {
      address: '0x1',
      storageKeys: ['0x1'],
    },
  ],
  chainId: 1,
})

authorizationList (optional)

  • Type: AuthorizationList

Signed EIP-7702 Authorization list.

const authorization = await account.experimental_signAuthorization({
  contractAddress: '0x...',
  chainId: 1,
  nonce: 1,
})
 
const signature = await account.signTransaction({
  authorizationList: [authorization], 
  chainId: 1,
})

blobs (optional)

  • Type: Hex[]

Blobs for Blob Transactions.

import * as kzg from 'c-kzg'
import { toBlobs, stringToHex } from 'viem'
import { mainnetTrustedSetupPath } from 'viem/node'
 
const kzg = setupKzg(cKzg, mainnetTrustedSetupPath) 
 
const hash = await account.signTransaction({
  blobs: toBlobs({ data: stringToHex('blobby blob!') }), 
  kzg,
  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8'
})

chainId (optional)

  • Type: number

The chain ID.

const signature = await account.signTransaction({
  chainId: 1, 
})

data (optional)

  • Type: 0x${string}

Transaction data.

const signature = await account.signTransaction({
  data: '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2'
})

gas (optional)

  • Type: bigint

The gas limit for the transaction.

const signature = await account.signTransaction({
  gas: 69420n, 
})

gasPrice (optional)

  • Type: bigint

The price (in wei) to pay per gas. Only applies to Legacy Transactions.

const signature = await account.signTransaction({
  gasPrice: parseGwei('20'), 
})

kzg (optional)

  • Type: KZG

KZG implementation for Blob Transactions.

See setupKzg for more information.

import * as kzg from 'c-kzg'
import { toBlobs, stringToHex } from 'viem'
import { mainnetTrustedSetupPath } from 'viem/node'
 
const kzg = setupKzg(cKzg, mainnetTrustedSetupPath) 
 
const signature = await account.signTransaction({
  blobs: toBlobs({ data: stringToHex('blobby blob!') }), 
  kzg, 
  to: '0x70997970c51812dc3a010c7d01b50e0d17dc79c8'
})

maxFeePerGas (optional)

  • Type: bigint

Total fee per gas (in wei), inclusive of maxPriorityFeePerGas. Only applies to EIP-1559 Transactions

const signature = await account.signTransaction({
  chainId: 1,
  maxFeePerGas: parseGwei('20'), 
})

maxPriorityFeePerGas (optional)

  • Type: bigint

Max priority fee per gas (in wei). Only applies to EIP-1559 Transactions

const signature = await account.signTransaction({
  chainId: 1,
  maxPriorityFeePerGas: parseGwei('3'), 
})

nonce (optional)

  • Type: number

Unique number identifying this transaction.

const signature = await account.signTransaction({
  nonce: 69
})

to (optional)

  • Type: Address

The transaction recipient.

const signature = await account.signTransaction({
  to: '0x...'
})

type (optional)

  • Type: "legacy" | "eip2930" | "eip1559"

The transaction type.

import { privateKeyToAccount } from 'viem/accounts'
const account = privateKeyToAccount('0x...')
// ---cut---
const signature = await account.signTransaction({
  type: 'eip1559'
})
## Errors were thrown in the sample, but not included in an error tag These errors were not marked as being expected: 2345. Expected: // @errors: 2345 Compiler Errors: index.ts [2345] 158 - Argument of type '{ type: "eip1559"; }' is not assignable to parameter of type 'OneOf<TransactionSerializable>'. Type '{ type: "eip1559"; }' is not assignable to type '{ type?: "eip1559" | undefined; data?: `0x${string}` | undefined; gas?: bigint | undefined; nonce?: number | undefined; to?: `0x${string}` | null | undefined; value?: bigint | undefined; r?: `0x${string}` | undefined; ... 13 more ...; authorizationList?: undefined; } | { ...; } | { ...; }'. Property 'chainId' is missing in type '{ type: "eip1559"; }' but required in type '{ type?: "eip1559" | undefined; data?: `0x${string}` | undefined; gas?: bigint | undefined; nonce?: number | undefined; to?: `0x${string}` | null | undefined; value?: bigint | undefined; r?: `0x${string}` | undefined; ... 13 more ...; authorizationList?: undefined; }'.

value (optional)

  • Type: bigint

Value in wei sent with this transaction.

const signature = await account.signTransaction({
  value: parseEther('1'), 
})