# Class BSV::Wallet::Wire::Reader <a id="class-BSV-Wallet-Wire-Reader"></a>

**Inherits:** `Object`

Reader reads sequentially from a binary string.

## Public Instance Methods
### `initialize(data)` <a id="method-i-initialize"></a> <a id="initialize-instance_method"></a>
- **@param** `data` [String] binary data
- **@return** [Reader] a new instance of Reader

### `next_negative_one?()` <a id="method-i-next_negative_one-3F"></a> <a id="next_negative_one?-instance_method"></a>
Whether the next varint is the NegativeOne sentinel (0xFFFF…). Peeks at the
next byte without consuming it.
- **@return** [Boolean]

### `peek_byte()` <a id="method-i-peek_byte"></a> <a id="peek_byte-instance_method"></a>
Look at the next byte without consuming it.
- **@raise** [ArgumentError]
- **@return** [Integer]

### `read_base64_int()` <a id="method-i-read_base64_int"></a> <a id="read_base64_int-instance_method"></a>
Read a binary value and return it Base64-encoded.
- **@return** [String] Base64-encoded string

### `read_byte()` <a id="method-i-read_byte"></a> <a id="read_byte-instance_method"></a>
Read a single byte.
- **@raise** [ArgumentError]
- **@return** [Integer]

### `read_bytes(n)` <a id="method-i-read_bytes"></a> <a id="read_bytes-instance_method"></a>
Read `n` raw bytes.
- **@raise** [ArgumentError]
- **@return** [String] binary string

### `read_int_bytes()` <a id="method-i-read_int_bytes"></a> <a id="read_int_bytes-instance_method"></a>
Read a varint-length-prefixed byte array (ReadIntBytes in Go).
- **@return** [String] binary string

### `read_optional_bool()` <a id="method-i-read_optional_bool"></a> <a id="read_optional_bool-instance_method"></a>
Read an optional boolean byte (Go/BRC-103 convention). 0xFF → nil, 0x00 →
false, 0x01 → true
- **@return** [Boolean, nil]

### `read_optional_bytes_with_flag(fixed_size: = nil)` <a id="method-i-read_optional_bytes_with_flag"></a> <a id="read_optional_bytes_with_flag-instance_method"></a>
Read optional bytes with a 1-byte flag prefix (Go BytesOptionWithFlag). 0x00 →
nil; 0x01 → read varint_len + bytes (or fixed_size bytes).
- **@param** `fixed_size` [Integer, nil] if set, read exactly this many bytes (no varint)
- **@return** [String, nil] binary string or nil

### `read_optional_string()` <a id="method-i-read_optional_string"></a> <a id="read_optional_string-instance_method"></a>
Read an optional string: NegativeOne sentinel → nil; else varint len + bytes.
- **@return** [String, nil]

### `read_optional_uint32()` <a id="method-i-read_optional_uint32"></a> <a id="read_optional_uint32-instance_method"></a>
Read an optional uint32: NegativeOne sentinel → nil; else varint → Integer.
- **@return** [Integer, nil]

### `read_outpoint()` <a id="method-i-read_outpoint"></a> <a id="read_outpoint-instance_method"></a>
Read an outpoint: 32-byte display-order txid + varint vout.
- **@return** [Hash] { txid_hex: String, vout: Integer }

### `read_privileged_params()` <a id="method-i-read_privileged_params"></a> <a id="read_privileged_params-instance_method"></a>
Read privileged params (Go decodePrivilegedParams).
- **@return** [Array(Boolean|nil, String|nil)]

### `read_remaining()` <a id="method-i-read_remaining"></a> <a id="read_remaining-instance_method"></a>
Read all remaining bytes.
- **@return** [String] binary string

### `read_satoshis()` <a id="method-i-read_satoshis"></a> <a id="read_satoshis-instance_method"></a>
Read 8-byte little-endian uint64 satoshi amount.
- **@return** [Integer]

### `read_str_with_varint_len()` <a id="method-i-read_str_with_varint_len"></a> <a id="read_str_with_varint_len-instance_method"></a>
Read a varint-prefixed UTF-8 string.
- **@raise** [ArgumentError] if the bytes are not valid UTF-8
- **@return** [String]

### `read_string()` <a id="method-i-read_string"></a> <a id="read_string-instance_method"></a>
Read a varint-len string (always present, 0-length = empty string). Matches Go
ReadString which returns "" for length 0 or NegativeOne.
- **@return** [String]

### `read_string_map()` <a id="method-i-read_string_map"></a> <a id="read_string_map-instance_method"></a>
Read a string map: varint count + key/value pairs (each varint-len-prefixed).
- **@return** [Hash<String,String>]

### `read_string_slice()` <a id="method-i-read_string_slice"></a> <a id="read_string_slice-instance_method"></a>
Read an array of strings encoded as varint count + each optional string.
NegativeOne sentinel count → nil.
- **@return** [Array<String>, nil]

### `read_txid_slice()` <a id="method-i-read_txid_slice"></a> <a id="read_txid_slice-instance_method"></a>
Read a txid slice: NegativeOne → nil; else varint count + 32 bytes per txid.
Go stores txids in wire order (`txID`) — returned as hex without reversal.
- **@return** [Array<String>, nil]

### `read_varint()` <a id="method-i-read_varint"></a> <a id="read_varint-instance_method"></a>
Read a Bitcoin varint.
- **@return** [Integer]

### `remaining()` <a id="method-i-remaining"></a> <a id="remaining-instance_method"></a>
Remaining bytes.
