# Shielded transactions

Shielded transfers are encoded as native transactions with a special payload that targets the shielded pool contract.

## Transaction type

* Shielded transactions are represented as `TypedNativeTransaction::Shielded`.
* The payload (`data`) contains the encoded shielded proof and bundle inputs.

## Validation rules

The verifier enforces these constraints for shielded transactions:

* The transaction must be unsigned.
* The action must be `Call` to the shielded pool address.
* `value` must be zero (transfers happen inside the pool).
* `gas_price` must be zero (the proof includes a fee field).
* The payload must not be empty.

The RPC call request builder also enforces recipient, value, and payload checks before building a shielded transaction.

## Sender derivation

Shielded transactions are unsigned. The node derives a synthetic sender address from the transaction hash (`SignedTransaction::new_shielded`).

## Transaction pool behavior

* Shielded transactions are stored in a dedicated `shielded_pool` map (no nonce ordering).
* The packer selects shielded transactions after packing normal native and EVM transactions, respecting remaining gas and block size limits.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.mazze.io/privacy/transactions.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
