> ## Documentation Index
> Fetch the complete documentation index at: https://voltaire.tevm.sh/llms.txt
> Use this file to discover all available pages before exploring further.

# Transaction.hasAccessList

> Check if transaction has access list

<Card title="Try it Live" icon="play" href="https://playground.tevm.sh?example=primitives/transaction.ts">
  Run Transaction examples in the interactive playground
</Card>

# hasAccessList

Check if transaction has an access list.

<Tabs />

## Transaction Types with Access Lists

| Type            | Has Access List | Notes                                           |
| --------------- | --------------- | ----------------------------------------------- |
| Legacy (0x00)   | No              | Pre-EIP-2930                                    |
| EIP-2930 (0x01) | Yes             | Introduced access lists                         |
| EIP-1559 (0x02) | Yes             | Inherits from EIP-2930                          |
| EIP-4844 (0x03) | Yes             | Blob transactions include access lists          |
| EIP-7702 (0x04) | Yes             | Authorization transactions include access lists |

## Usage Patterns

### Conditional Access List Processing

```typescript theme={null}
import { hasAccessList, getAccessList } from 'tevm/Transaction'

function processTransaction(tx: Transaction.Any) {
  if (hasAccessList(tx)) {
    const accessList = getAccessList(tx)
    prewarmStorage(accessList)
  }

  executeTransaction(tx)
}
```

### Type-Safe Access List Access

```typescript theme={null}
import { hasAccessList } from 'tevm/Transaction'

function analyzeAccessList(tx: Transaction.Any) {
  if (!hasAccessList(tx)) {
    return { addresses: 0, storageKeys: 0 }
  }

  // Safe to access accessList
  const list = getAccessList(tx)
  return {
    addresses: list.length,
    storageKeys: list.reduce(
      (sum, item) => sum + item.storageKeys.length,
      0
    )
  }
}
```

### Transaction Classification

```typescript theme={null}
import { hasAccessList } from 'tevm/Transaction'

function classifyTransaction(tx: Transaction.Any): string {
  if (!hasAccessList(tx)) {
    return 'legacy'
  }

  switch (tx.type) {
    case Transaction.Type.EIP2930:
      return 'eip2930-access-list'
    case Transaction.Type.EIP1559:
      return 'eip1559-dynamic-fee'
    case Transaction.Type.EIP4844:
      return 'eip4844-blob'
    case Transaction.Type.EIP7702:
      return 'eip7702-authorization'
    default:
      return 'unknown'
  }
}
```

### Gas Cost Analysis

```typescript theme={null}
import { hasAccessList, getAccessList } from 'tevm/Transaction'

function calculateAccessListGasCost(tx: Transaction.Any): bigint {
  if (!hasAccessList(tx)) {
    return 0n
  }

  const accessList = getAccessList(tx)
  let cost = 0n

  for (const item of accessList) {
    cost += 2400n  // Per address
    cost += BigInt(item.storageKeys.length) * 1900n  // Per storage key
  }

  return cost
}
```

### Filtering Transactions

```typescript theme={null}
import { hasAccessList } from 'tevm/Transaction'

function filterTransactionsWithAccessLists(
  transactions: Transaction.Any[]
): Transaction.Any[] {
  return transactions.filter(hasAccessList)
}

// Get only legacy transactions
function filterLegacyTransactions(
  transactions: Transaction.Any[]
): Transaction.Legacy[] {
  return transactions.filter(
    (tx): tx is Transaction.Legacy => !hasAccessList(tx)
  )
}
```

## Type Guard Pattern

The `hasAccessList` function works well as a type guard:

```typescript theme={null}
import { hasAccessList, getAccessList } from 'tevm/Transaction'

function processWithAccessList(tx: Transaction.Any) {
  // Type guard narrows tx type
  if (hasAccessList(tx)) {
    // TypeScript knows tx has accessList field
    const list = tx.accessList
    // or use helper
    const accessList = getAccessList(tx)
  }
}
```

## See Also

* [getAccessList](/primitives/transaction/get-access-list) - Extract access list from transaction
* [AccessList](/primitives/accesslist) - Access list primitive and utilities
* [getGasPrice](/primitives/transaction/get-gas-price) - Get effective gas price
* [detectType](/primitives/transaction/detect-type) - Detect transaction type from bytes

## References

* [EIP-2930: Optional access lists](https://eips.ethereum.org/EIPS/eip-2930)
* [EIP-2929: Gas cost increases for state access opcodes](https://eips.ethereum.org/EIPS/eip-2929)
* [EIP-1559: Fee market change](https://eips.ethereum.org/EIPS/eip-1559)
