SHRIVE docs, for developers
This source targets the NU6.3 Ironwood pool and a signature claim that keeps the saved code private. The ZEC API is hard closed. Do not send payment. Rust compilation, live Ironwood receipt, reserve and claim integration, host validation and independent review remain UNVERIFIED. See the Zcash advisory.
SHRIVE has no keeper. Pons buys use api/mint-auth.js and the existing signed authorization flow. Ironwood ZEC uses a separate invoice API and UFVK-only watcher. The browser creates the code before payment, the watcher confirms the Ironwood note, and the EVM signer reserves its hash. You later sign and claim to any nonzero EVM recipient on Robinhood Chain 4663.
POST { "txHash": "0x..." } to api/mint-auth.js. It refuses at the first failure, in this order, each with its own status code:
| Step | Status | Message |
|---|---|---|
| Method and JSON shape | 405 / 400 | POST only / Send a JSON object |
| txHash shape | 400 | txHash must be 0x and 64 hex characters |
| Config present | 503 | minting not connected |
| Per-IP budget | 503 / 429 | busy, try again shortly / too many authorisations from this address, wait a few minutes |
| Receipt reachable | 502 | chain not reachable |
| Transaction exists | 404 | transaction not found |
| Transaction succeeded | 400 | that transaction failed |
| Two confirmations | 409 | buy is too new, try again in a moment |
| Collection readable, not paused, right chain | 502 / 503 | collection not readable / minting is paused / wrong chain |
| A qualifying pool-to-buyer transfer | 400 | buy under the minimum / no buy from the pool in that transaction |
| Not already used | 409 | that buy already has its piece |
| Domain and digest match the contract | 502 | collection domain mismatch |
| Success | 200 | buyer, buyRef, amountIn, deadline, signature, collection |
Nothing is cleaned up on the caller's behalf. A malformed field is refused, never guessed at. This table applies only to Pons buys. Ironwood ZEC invoices and watcher reservations use separate routes and checks.
Six authorisations per client per ten minutes, counted by the first of x-vercel-forwarded-for, x-forwarded-for or x-real-ip. The store is bounded: expired windows are dropped first, and when every slot is held by a live caller a new caller is told the service is busy rather than evicting someone else's window.
Anyone holding SIGNER_KEY can authorise a mint for any address. That is the honest shape of this design: the chain proves the buy, but a server attests to it. The contract can rotate the signer (setSigner) and can be paused, and the owner is a two-step transfer that cannot be renounced, so a leaked key is recoverable. It is still a key and belongs only in the private operator API environment. The separate watcher holds only a Zcash UFVK and an internal API token.
You bring your claim code to Get my pieces, choose the wallet you want the piece in, and submit. That submission is yours: your wallet signs it and your wallet pays the small Robinhood network fee. The watcher scans Zcash for Ironwood payments and keeps a durable checkpoint. It does not mint on your behalf. The EVM signer must have funds for reserve gas.