---
eip: 7912
title: Pragmatic stack manipulation tools
description: Add additional SWAP and DUP operations for deeper stack access
author: lightclient (@lightclient)
discussions-to: https://ethereum-magicians.org/t/eip-7912-pragmatic-expansion-of-stack-manipulation-tools/23826
status: Stagnant
type: Standards Track
category: Core
created: 2025-03-25
---

## Abstract

Add `SWAP17`-`SWAP24`, `DUP17` - `DUP24`, `SWAPN`, `DUPN`, and `EXCHANGE`
instructions. The arbitrary depth operations must be preceded by `PUSH1`
instructions defining operands.

## Motivation

Due to the nature of some compilers, deeper stack access is a desirable VM
feature. Previous attempts either required code versioning, like the EVM Object
Format (EOF), or caused the behavior of some deployed contracts to change, due
to the interpretation of new immediates.

This is a pragmatic approach to introducing the desired functionality. It reuses
instruction semantics that have been historically agreed on, instead of new,
complex encodings and containers.

## Specification

Let `top - N` be the `N`th most recently pushed value on the stack, and `top -
0` be the most recent.

If any of the following instructions reference a stack element beyond the
current length of the stack, causing a stack underflow, abort with an
exceptional halt.

### Constant `SWAPXX` and `DUPXX`

Add the following new instructions:

- `SWAP17`, `SWAP18`, ..., `SWAP24`: `0xb0`, `0xb1`, ..., `0xb7`.
- `DUP17`, `DUP18`, ..., `DUP24`: `0xb8`, `0xba`, ..., `0xbf`.

Let `SWAPXX` and `DUPXX` refer to the static instructions defined above. `XX` is
defined as the stack element they are referencing.

The operation `SWAPXX` swaps the top element with the `top-XX` element. The
operation `DUPXX` duplicates the `top-XX` element and pushes the copy to the top
of the stack.

### `SWAPN` and `DUPN`

Add the following new instructions:

- `SWAPN`: `0xc0`.
- `DUPN`: `0xc1`.

Both operations take a single argument from the stack, `N`. This argument must
be provided by a `PUSH1` operation immediately preceding the `SWAPN` and `DUPN`
instructions. Failure to follow this calling convention will result in an
out-of-gas error. If `N` is zero, fail with out-of-gas error.

`SWAPN` pops `N` from the stack and swaps the new top stack element with the
`top-N` stack element.

`DUPN` pops `N` from the stack and push on a copy of the `top-N-1` stack element.

### `EXCHANGE`

Add the following new instruction:

- `EXCHANGE`: `0xc2`.

The `EXCHANGE` instruction takes a single argument from the stack `X` and
deconstructs it into two operands, `N` and `M`. `N` is `X >> 4` and `M` is `X &
0x0F`. The argument `X` must be provided by a `PUSH2` operation immediately
preceding the `EXCHANGE` instruction. Failure to follow this calling convention
will result in an out-of-gas error. If either `N` or `M` are zero, fail with
out-of-gas error.

`EXCHANGE` pops `X` from the stack and will swap the stack element at index
`N-1` with the stack element at `M-1`.

### Gas costs

All operations cost `3` gas. Preceding push operations are charged separately
according to the gas schedule.

## Rationale

### Constant and Dynamic `SWAP`s and `DUP`s

The main trade off between using the constant `SWAPXX` or `DUPXX` instructions
versus the dynamic `SWAPN` or `DUPN` instructions is that the dynamic
instructions require an additional two bytes in the form of a preceding `PUSH1`
operation, whereas the constant versions require no additional bytes.

### One indexed `EXCHANGE`

Since `SWAP1` and `DUP1` operate on the top of the stack, it seems fitting that
`EXCHANGE(1, 2)` operate on the `top` and `top-1`.

## Backwards Compatibility

No backward compatibility issues found.

## Test Cases

TODO

## Security Considerations

When verifying the preceding `PUSH` operations, client implementers must ensure
that the preceding bytes are not part of a longer segment of push data (e.g.
`0x6301026001b0` should error). This can be done efficiently by checking if
`pc-2` is a valid jump destination. If it is, then the `PUSH` instruction will
have been executed as expected.

## Copyright

Copyright and related rights waived via [CC0](../LICENSE.md).
