This page is a placeholder. All examples on this page are currently AI-generated and are not correct. This documentation will be completed in the future with accurate, tested examples.
Overview
Opcode: 0x9C
Introduced: Frontier (EVM genesis)
SWAP13 exchanges the top stack item with the 14th item from the top. Only these two positions change - all other items remain in place.
Specification
Stack Input:
[..., valueN, item12, ..., item1, top]
Stack Output:
[..., top, item12, ..., item1, valueN]
Gas Cost: 3 (GasFastestStep)
Operation:
temp = stack[top]
stack[top] = stack[top - 14]
stack[top - 14] = temp
Behavior
SWAP13 exchanges positions of the top item and the item at position 14 from top. Requires stack depth ≥ 14.
Key characteristics:
- Requires stack depth ≥ 14
- Only two items change positions
- Middle items (items 1-13) unchanged
- StackUnderflow if depth < 14
- Stack depth unchanged
Examples
Basic Usage
import { handler_0x9C_SWAP13 } from '@tevm/voltaire/evm/stack/handlers';
import { createFrame } from '@tevm/voltaire/evm/Frame';
// Swap top with 14th item
const frame = createFrame({
stack: [1400n, 1300n, 1200n, 1100n, 1000n, 900n, 800n, 700n, 600n, 500n, 400n, 300n, 200n, 100n],
gasRemaining: 1000n
});
const err = handler_0x9C_SWAP13(frame);
console.log(frame.stack); // [100n, 1300n, 1200n, 1100n, 1000n, 900n, 800n, 700n, 600n, 500n, 400n, 300n, 200n, 1400n] - positions 0 and 13 swapped
console.log(frame.gasRemaining); // 997n (3 gas consumed)
Solidity Compilation
contract Example {
function deepSwap() public pure {
assembly {
push1 0x01
push1 0x02
push1 0x03
push1 0x04
push1 0x05
push1 0x06
push1 0x07
push1 0x08
push1 0x09
push1 0x0a
push1 0x0b
push1 0x0c
push1 0x0d
push1 0x0e
// Stack: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
swap13
// Stack: [14, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 1]
}
}
}
Assembly Usage
assembly {
push1 0xa
push1 0xb
push1 0xc
push1 0xd
push1 0xe
push1 0xf
push1 0xg
push1 0xh
push1 0xi
push1 0xj
push1 0xk
push1 0xl
push1 0xm
push1 0xn
// Stack: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n']
swap13
// Stack: ['n', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'a'] - 'a' and 'n' swapped
}
Gas Cost
Cost: 3 gas (GasFastestStep)
All SWAP1-16 operations cost the same despite different stack depths accessed.
Comparison:
| Operation | Gas | Note |
|---|
| SWAP13 | 3 | Swap with 14th item |
| DUP1-16 | 3 | Same cost tier |
| POP | 2 | Cheaper |
Common Usage
Deep Stack Manipulation
function complex() public pure {
assembly {
let v0 := 0
let v1 := 1
let v2 := 2
let v3 := 3
let v4 := 4
let v5 := 5
let v6 := 6
let v7 := 7
let v8 := 8
let v9 := 9
let v10 := 10
let v11 := 11
let v12 := 12
let v13 := 13
// Need v0 at top
swap13
// v0 now at top
}
}```
### Efficient Reordering
```solidity
// Reorder for function call
assembly {
// Have: [value, to, token]
// Need: [token, to, value]
swap2 // [token, to, value]
// Call transfer(token, to, value)
call(gas(), target, 0, 0, 100, 0, 0)
}
Storage Optimization
assembly {
let slot := 0
let value := 42
// Stack: [slot, value]
// SSTORE needs (slot, value) but we have them reversed
// No swap needed in this case, but if we did:
swap1
// Stack: [value, slot]
sstore
}
Stack Depth Requirements
Minimum Depth
// SWAP13 requires 14 items
assembly {
push1 0x01
push1 0x02
push1 0x03
push1 0x04
push1 0x05
push1 0x06
push1 0x07
push1 0x08
push1 0x09
push1 0x0a
push1 0x0b
push1 0x0c
push1 0x0d
// Only 13 items - SWAP13 will fail!
swap13 // StackUnderflow
}
Safe Usage
assembly {
push1 0x01
push1 0x02
push1 0x03
push1 0x04
push1 0x05
push1 0x06
push1 0x07
push1 0x08
push1 0x09
push1 0x0a
push1 0x0b
push1 0x0c
push1 0x0d
push1 0x0e
// Exactly 14 items - safe
swap13 // Success
}
Implementation
/**
* SWAP13 opcode (0x9C) - Swap top with 14th item
*
* Stack: [..., valueN, ..., top] => [..., top, ..., valueN]
* Gas: 3 (GasFastestStep)
*/
export function handler_0x9C_SWAP13(frame: FrameType): EvmError | null {
const gasErr = consumeGas(frame, FastestStep);
if (gasErr) return gasErr;
if (frame.stack.length <= 13) {
return { type: "StackUnderflow" };
}
const topIdx = frame.stack.length - 1;
const swapIdx = frame.stack.length - 14;
const temp = frame.stack[topIdx];
frame.stack[topIdx] = frame.stack[swapIdx];
frame.stack[swapIdx] = temp;
frame.pc += 1;
return null;
}
Edge Cases
Stack Underflow
// Insufficient stack depth
const frame = createFrame({
stack: [100n, 100n, 100n, 100n, 100n, 100n, 100n, 100n, 100n, 100n, 100n, 100n, 100n] // Only 13 items, need 14
});
const err = handler_0x9C_SWAP13(frame);
console.log(err); // { type: "StackUnderflow" }
Out of Gas
// Insufficient gas
const frame = createFrame({
stack: [100n, 100n, 100n, 100n, 100n, 100n, 100n, 100n, 100n, 100n, 100n, 100n, 100n, 100n],
gasRemaining: 2n // Need 3
});
const err = handler_0x9C_SWAP13(frame);
console.log(err); // { type: "OutOfGas" }
Identity Swap
// Swap same values
const frame = createFrame({
stack: new Array(14).fill(42n)
});
handler_0x9C_SWAP13(frame);
console.log(frame.stack); // All still 42n
Maximum Values
// Swap with max uint256
const MAX = (1n << 256n) - 1n;
const frame = createFrame({
stack: [0n, 0n, 0n, 0n, 0n, 0n, 0n, 0n, 0n, 0n, 0n, 0n, 0n, MAX, 1n]
});
handler_0x9C_SWAP13(frame);
console.log(frame.stack[0]); // 1n (was at top)
console.log(frame.stack[13]); // MAX (was at bottom)
References