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

# ZKVerifier in mint

> Groth16 verifikacija in zasebna izdaja RWA žetonov.

## Namen

`ZKVerifier` omogoča **zasebno izdajo**: stranka dokaže, da pozna 12 besed (in s tem zasebni ključ), vezane na registrirano sredstvo, **ne da bi ključ razkrila**. Uporablja Groth16 (snarkjs) s Poseidon hash funkcijo (circomlib).

## Tok izdaje

<Steps>
  <Step title="Registracija (UORS)">
    Overovitelj pokliče `registerCommitment(commitment)`. Commitment je `Poseidon2([pk, nonce])`.
  </Step>

  <Step title="Izpeljava ključa (stranka)">
    Iz 12 besed: `pk = wordsToPrivateKey(words)`.
  </Step>

  <Step title="Iskanje nonce">
    `findMatchingNonce(pk)` preišče oracle zapise in najde `nonce`, pri katerem se izračunani commitment ujema z registriranim.
  </Step>

  <Step title="ZK dokaz">
    `snarkjs.groth16.fullProve(...)` ustvari dokaz za vhode: `privateKey`, `assetValue`, `entropyNonce`, `assetCommitment`, `minValue`.
  </Step>

  <Step title="Mint">
    `verifyAndMint(proof, ..., amount)` preveri dokaz in izda RWA žetone. Commitment se označi kot uporabljen (`commitmentUsed`).
  </Step>
</Steps>

## Enkratna uporaba

Vsak commitment je **enkraten** — po uspešnem mintu `commitmentUsed` prepreči ponovno uporabo iste kode.

<Warning>
  `findMatchingNonce` preišče vse oracle zapise (en RPC klic na zapis), zato je lahko počasen. Za hitrejši mint se splača shraniti `nonce`/indeks skupaj s kodo.
</Warning>

## Znane rešitve

| Problem                          | Rešitev                                                                                                              |
| -------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
| `quoteBuy` vrača `0x` / revert   | Izračunaj client-side: `amtWei * priceRaw / 1e18`                                                                    |
| 6-decimalna cena za 18-dec token | Kontrakt vedno pričakuje ceno v `1e6` formatu                                                                        |
| Mint "obstane"                   | Commitment ni registriran ali nonce ni iz oracle zapisa — naredi čist potek (generiraj → registriraj → mintaj takoj) |
