# Module BSV::KVStore::Interpreter <a id="module-BSV-KVStore-Interpreter"></a>

Historian interpreter for KVStore PushDrop tokens.

Decodes a PushDrop locking script from the specified output, validates it has
the expected field count (5 old format / 6 new format), and filters by
<code>ctx[:key]</code> and <code>ctx[:protocol_id]</code>.

Returns the value as a UTF-8 string, or `nil` for any non-match or error.
Never raises.

Field layout (old format — 5 fields):
    [0] protocolID (JSON-encoded array)
    [1] key
    [2] value
    [3] controller
    [4] signature

Field layout (new format — 6 fields):
    [0] protocolID (JSON-encoded array)
    [1] key
    [2] value
    [3] controller
    [4] tags
    [5] signature

## Constants
### `CONTROLLER` <a id="constant-CONTROLLER"></a> <a id="CONTROLLER-constant"></a>
Not documented.

### `KEY` <a id="constant-KEY"></a> <a id="KEY-constant"></a>
Not documented.

### `KV_PROTOCOL_FIELDS_NEW` <a id="constant-KV_PROTOCOL_FIELDS_NEW"></a> <a id="KV_PROTOCOL_FIELDS_NEW-constant"></a>
Not documented.

### `KV_PROTOCOL_FIELDS_OLD` <a id="constant-KV_PROTOCOL_FIELDS_OLD"></a> <a id="KV_PROTOCOL_FIELDS_OLD-constant"></a>
Not documented.

### `PROTOCOL_ID` <a id="constant-PROTOCOL_ID"></a> <a id="PROTOCOL_ID-constant"></a>
Not documented.

### `SIGNATURE_NEW` <a id="constant-SIGNATURE_NEW"></a> <a id="SIGNATURE_NEW-constant"></a>
Not documented.

### `SIGNATURE_OLD` <a id="constant-SIGNATURE_OLD"></a> <a id="SIGNATURE_OLD-constant"></a>
Not documented.

### `TAGS_NEW` <a id="constant-TAGS_NEW"></a> <a id="TAGS_NEW-constant"></a>
Not documented.

### `VALUE` <a id="constant-VALUE"></a> <a id="VALUE-constant"></a>
Not documented.

## Public Class Methods
### `call(tx, output_index, ctx)` <a id="method-c-call"></a> <a id="call-class_method"></a>
Decode the KVStore token at `output_index` in `tx`.

Implements the Historian interpreter contract: +interpreter.call(tx,
output_index, ctx)+ → String or nil.
- **@param** `tx` [Transaction::Tx, nil] the transaction to inspect
- **@param** `output_index` [Integer] index into +tx.outputs+
- **@param** `ctx` [Hash, nil] must contain +:key+ (String) and +:protocol_id+ (Array)
- **@return** [String, nil] the decoded UTF-8 value, or nil on any mismatch/error
