Post Fiat

Post Fiat

Private OTC Swaps: Illustrated Primer

A click-through visual primer for the shielding, private swap, certification, private egress, redemption, and transparent control steps behind the Private OTC Swaps post.

This primer is the visual companion to Private OTC Swaps. It walks through the user-visible flow one step at a time: counted cash, shielded ingress, private swap, PFTL certification, private egress, public redemption, and the transparent control path.

Click through the swap

Seven panels, from counted cash to a private NAVCoin swap and back to a public exit.

Public accounting

Start with cash the chain can count.

The input is USDC, but Post Fiat does not treat every dollar-shaped token as the same asset. In the demo, USDC is bridged into PFTL as pfUSDC, a canonical stablecoin representation that can be counted by the NAV and settlement logic.

PublicSource, amount, bridge receipt.
Why it mattersThe NAV system sees reserve-quality cash, not a vague wallet balance.
USDCEthereum, Arbitrum, Base, or another source venue.
bridge attestation
pfUSDC on PFTLA chain-native receipt the swap circuit can consume.
<section class="private-otc-slide">
  <div>
    <p class="private-otc-kicker">Shielded ingress</p>
    <h3>Turn public pfUSDC into an Orchard note.</h3>
    <p>The wallet creates a private note commitment. The chain can verify that value entered the shielded pool, while the note opening and ownership stay wallet-side.</p>
    <div class="private-otc-facts">
      <div class="private-otc-fact"><strong>Public</strong>A valid shielded action and commitment.</div>
      <div class="private-otc-fact"><strong>Private</strong>Note opening, owner keys, and wallet path.</div>
    </div>
  </div>
  <div class="private-otc-panel">
    <div class="private-otc-flow">
      <div class="private-otc-node"><strong>pfUSDC balance</strong><span>Visible before shielding.</span></div>
      <div class="private-otc-arrow">commit</div>
      <div class="private-otc-node private"><strong>pfUSDC Orchard note</strong><span>Private spendable input for the swap.</span></div>
    </div>
  </div>
</section>

<section class="private-otc-slide">
  <div>
    <p class="private-otc-kicker">Private exchange</p>
    <h3>Swap pfUSDC into a651 inside the circuit.</h3>
    <p>The Asset-Orchard proof consumes a pfUSDC note and emits an a651 note. It enforces the permitted asset exchange and conservation rules without publishing the user's note details.</p>
    <div class="private-otc-facts">
      <div class="private-otc-fact"><strong>Input</strong>Private pfUSDC note.</div>
      <div class="private-otc-fact"><strong>Output</strong>Private a651 NAVCoin note.</div>
    </div>
  </div>
  <div class="private-otc-panel">
    <div class="private-otc-flow">
      <div class="private-otc-node private"><strong>pfUSDC note</strong><span>Spent once; its nullifier prevents reuse.</span></div>
      <div class="private-otc-arrow">zk proof</div>
      <div class="private-otc-node private"><strong>a651 note</strong><span>NAVCoin output remains private until egress.</span></div>
    </div>
  </div>
</section>

<section class="private-otc-slide">
  <div>
    <p class="private-otc-kicker">PFTL finality</p>
    <h3>Validators certify the batch.</h3>
    <p>PFTL validators verify the proof, execute the state transition, and sign a block certificate. In the latest shielded execution, the swap certified with five validator votes at height 437.</p>
    <div class="private-otc-facts">
      <div class="private-otc-fact"><strong>Public</strong>Batch id, height, certificate, proof validity.</div>
      <div class="private-otc-fact"><strong>Measured</strong>Proof creation 6.06s; transport/certification 4.90s after prewarm.</div>
    </div>
  </div>
  <div class="private-otc-panel">
    <div class="private-otc-flow">
      <div class="private-otc-node"><strong>Proposer</strong><span>Builds the shielded batch.</span></div>
      <div class="private-otc-arrow">verify and vote</div>
      <div class="private-otc-node"><strong>Certificate</strong><span>Consensus accepts the state transition.</span></div>
    </div>
  </div>
</section>

<section class="private-otc-slide">
  <div>
    <p class="private-otc-kicker">Private egress</p>
    <h3>Exit the private note without revealing its opening.</h3>
    <p>When the user needs a public asset again, private egress proves the right to exit the a651 note and creates public exit fields. The egress is public; the internal note opening is not.</p>
    <div class="private-otc-facts">
      <div class="private-otc-fact"><strong>Public</strong>Exit artifact and verification result.</div>
      <div class="private-otc-fact"><strong>Private</strong>How the wallet owned and routed the note.</div>
    </div>
  </div>
  <div class="private-otc-panel">
    <div class="private-otc-flow">
      <div class="private-otc-node private"><strong>a651 Orchard note</strong><span>Private asset ownership.</span></div>
      <div class="private-otc-arrow">private egress proof</div>
      <div class="private-otc-node"><strong>Public a651 exit</strong><span>Visible handoff for redemption.</span></div>
    </div>
  </div>
</section>

<section class="private-otc-slide">
  <div>
    <p class="private-otc-kicker">Public exit</p>
    <h3>Redeem and withdraw on the visible rail.</h3>
    <p>After egress, the user is back in the public NAV and bridge-out world. The demo uses the public a651 exit to create the redemption path and settle the withdrawal.</p>
    <div class="private-otc-facts">
      <div class="private-otc-fact"><strong>Public</strong>Redemption artifact, withdrawal, final balances.</div>
      <div class="private-otc-fact"><strong>Boundary</strong>Privacy protects the shielded path, not the final public claim.</div>
    </div>
  </div>
  <div class="private-otc-panel">
    <div class="private-otc-flow">
      <div class="private-otc-node"><strong>Public a651</strong><span>Exit artifact from the shielded pool.</span></div>
      <div class="private-otc-arrow">redeem and withdraw</div>
      <div class="private-otc-node"><strong>USDC claim</strong><span>Public settlement leg.</span></div>
    </div>
  </div>
</section>

<section class="private-otc-slide">
  <div>
    <p class="private-otc-kicker">Transparent control</p>
    <h3>Run the same NAV mechanics without Orchard.</h3>
    <p>The transparent demo is the control path: a651 trustline, primary mint, NAV money-in, NAV exit, and summary, all on PFTL without shielded notes. It proves the accounting path works before privacy is layered on.</p>
    <div class="private-otc-facts">
      <div class="private-otc-fact"><strong>Useful for</strong>Debugging, audit traces, and repeatable operator demos.</div>
      <div class="private-otc-fact"><strong>Not private</strong>It intentionally exposes the state transitions.</div>
    </div>
  </div>
  <div class="private-otc-panel">
    <div class="private-otc-flow">
      <div class="private-otc-node"><strong>Public pfUSDC</strong><span>Transparent input.</span></div>
      <div class="private-otc-arrow">primary mint and NAV exit</div>
      <div class="private-otc-node"><strong>Public summary</strong><span>Receipts, timing, and balances are visible.</span></div>
    </div>
  </div>
</section>

Return to Private OTC Swaps.