> ## 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.

# PUSH17 (0x70)

> Push 17-byte immediate value onto stack

<Warning>
  **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.
</Warning>

## Overview

**Opcode:** `0x70`
**Introduced:** Frontier (EVM genesis)

PUSH17 pushes a 17-byte immediate value from the bytecode onto the stack. The 17 bytes immediately following the opcode are read and zero-padded to 256 bits.

## Specification

**Stack Input:**

```
[]
```

**Stack Output:**

```
value (uint256, 17 bytes from bytecode)
```

**Gas Cost:** 3 (GasFastestStep)

**Bytecode:** 1 byte opcode + 17 bytes immediate data

**Operation:**

```
value = read_bytes(pc + 1, 17)  // Big-endian
stack.push(value)
pc += 18
```

## Behavior

PUSH17 reads 17 bytes from bytecode starting at position `pc + 1`, interprets them as a big-endian unsigned integer, and pushes the result onto the stack.

Key characteristics:

* Reads exactly 17 bytes following opcode
* Big-endian byte order (most significant byte first)
* Zero-padded to 256 bits if less than 32 bytes
* InvalidOpcode if insufficient bytecode remaining
* PC advances by 18 (opcode + data)

## Examples

### Basic Usage

```typescript theme={null}
import { handler_0x70_PUSH17 } from '@tevm/voltaire/evm/stack/handlers';
import { createFrame } from '@tevm/voltaire/evm/Frame';

// Bytecode with PUSH17
const bytecode = new Uint8Array([
  0x70,  // PUSH17
  0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11   // 17 bytes: 0102030405060708090a0b0c0d0e0f1011
]);

const frame = createFrame({
  bytecode,
  pc: 0,
  stack: [],
  gasRemaining: 1000n
});

const err = handler_0x70_PUSH17(frame);

console.log(frame.stack); // [0x0102030405060708090a0b0c0d0e0f1011000000000000000000000000000000n]
console.log(frame.pc); // 18
console.log(frame.gasRemaining); // 997n (3 gas consumed)
```

### Solidity Compilation

```solidity theme={null}
contract Example {
    // 17-byte constant
    uint136 constant VALUE = 8.711228593176025e+40;
    // PUSH17 0xffffffffffffffffffffffffffffffffff
}
```

### Assembly Usage

```solidity theme={null}
assembly {
    // Push 17-byte value
    push17 0xffffffffffffffffffffffffffffffffff
    
    // Example: 17-byte constant
}
```

## Gas Cost

**Cost:** 3 gas (GasFastestStep)

All PUSH1-32 instructions cost the same despite different data sizes. Bytecode size impact:

* PUSH17: 18 bytes (1 opcode + 17 data)
* PUSH32: 33 bytes (1 opcode + 32 data)

**Comparison:**

| Opcode | Gas | Bytes | Use Case                  |
| ------ | --- | ----- | ------------------------- |
| PUSH0  | 2   | 1     | Zero constant (Shanghai+) |
| PUSH1  | 3   | 2     | Small numbers (0-255)     |

## Common Usage

### 17-Byte Constants

```solidity theme={null}
assembly {
    // 17-byte literal
    push17 0xababababababababababababababababab
}
```

### Big-Endian Encoding

```typescript theme={null}
// Bytecode: PUSH17 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10 11
// Reads as: 0x0102030405060708090a0b0c0d0e0f1011

// Most significant byte first
// Byte 0: 0x01 (highest significance)
// Byte 16: 0x11 (lowest significance)
```

## Implementation

<Tabs>
  <Tab title="TypeScript">
    ```typescript theme={null}
    /**
     * Read immediate data from bytecode for PUSH operations
     */
    function readImmediate(bytecode: Uint8Array, pc: number, size: number): bigint | null {
      if (pc + 1 + size > bytecode.length) {
        return null;
      }

      let result = 0n;
      for (let i = 0; i < size; i++) {
        result = (result << 8n) | BigInt(bytecode[pc + 1 + i]);
      }
      return result;
    }

    /**
     * PUSH17 opcode (0x70) - Push 17 bytes onto stack
     *
     * Stack: [] => [value]
     * Gas: 3 (GasFastestStep)
     */
    export function handler_0x70_PUSH17(frame: FrameType): EvmError | null {
      const gasErr = consumeGas(frame, FastestStep);
      if (gasErr) return gasErr;

      const value = readImmediate(frame.bytecode, frame.pc, 17);
      if (value === null) {
        return { type: "InvalidOpcode" };
      }

      const pushErr = pushStack(frame, value);
      if (pushErr) return pushErr;

      frame.pc += 18;
      return null;
    }
    ```
  </Tab>
</Tabs>

## Edge Cases

### Insufficient Bytecode

```typescript theme={null}
// Bytecode ends before 17 bytes read
const bytecode = new Uint8Array([0x70, 0x01]); // Only 1 byte instead of 17
const frame = createFrame({ bytecode, pc: 0 });

const err = handler_0x70_PUSH17(frame);
console.log(err); // { type: "InvalidOpcode" }
```

### Stack Overflow

```typescript theme={null}
// Stack at maximum capacity
const frame = createFrame({
  stack: new Array(1024).fill(0n),
  bytecode: new Uint8Array([0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
});

const err = handler_0x70_PUSH17(frame);
console.log(err); // { type: "StackOverflow" }
```

### Out of Gas

```typescript theme={null}
// Insufficient gas
const frame = createFrame({
  gasRemaining: 2n,  // Need 3 gas
  bytecode: new Uint8Array([0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff])
});

const err = handler_0x70_PUSH17(frame);
console.log(err); // { type: "OutOfGas" }
```

### Maximum Value

```typescript theme={null}
// All bytes 0xFF
const bytecode = new Uint8Array([0x70, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]);
const frame = createFrame({ bytecode, pc: 0 });

handler_0x70_PUSH17(frame);
console.log(frame.stack[0]); // 0xffffffffffffffffffffffffffffffffff000000000000000000000000000000n
```

## References

* [Yellow Paper](https://ethereum.github.io/yellowpaper/paper.pdf) - Section 9.4.1 (PUSH)
* [EVM Codes - PUSH17](https://www.evm.codes/#70?fork=cancun)
* [Solidity Assembly - push17](https://docs.soliditylang.org/en/latest/yul.html#evm-opcodes)
