> ## Documentation Index
> Fetch the complete documentation index at: https://docs.panofx.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Taker proof

> One signature per wallet per day that proves the taker controls the address a quote names.

When the relay's `requireTakerProof` is true (it is, on the hosted relay), every `POST /v1/quotes` carries a
`takerProof`. It stops anyone from pulling quotes, and reserving resolver inventory, on behalf of a wallet
they do not hold.

## The message

```
panofx-taker|<chainId>|<taker>|<issuedAt>
```

* `chainId` is the chain the quote is for.
* `taker` is the address exactly as sent in the request.
* `issuedAt` is unix seconds. The proof is valid for 24 hours from then, and may be at most 60 seconds in the future.

## The signature

| Chain  | Scheme                                                                 | Encoding           |
| ------ | ---------------------------------------------------------------------- | ------------------ |
| EVM    | EIP-191 `personal_sign` over the UTF-8 text                            | `0x` hex, 65 bytes |
| Solana | ed25519 over the UTF-8 text, from Wallet Standard `solana:signMessage` | base58             |

## Sending it

```json theme={null}
{ "takerProof": { "issuedAt": 1757750400, "signature": "0x…" } }
```

Cache it per wallet and reuse it until it expires.

## Refusals

| Status | `error`                | Meaning                                                        |
| ------ | ---------------------- | -------------------------------------------------------------- |
| 401    | `taker_proof_required` | The relay requires a proof and none was sent                   |
| 401    | `taker_proof_expired`  | `issuedAt` is more than 24 hours old, or too far in the future |
| 401    | `taker_proof_invalid`  | The signature does not recover to `taker`                      |
