Skip to content
Permissionless Web

Mint

The desk lives at permissionless.money/mint. Live payment rails are Zcash (ZIP-321) and native THIOL. Do not start checkout until a Terp destination exists.

1. Destination wallet

Two ways to get a terp1… mint dest:

Keplr — enable Terp (morocco-1), connect. That bech32 is the dest. Keplr signs; no passkey, no smart-account authenticator.

This device + passkey — the page creates a short-lived key, you register a WebAuthn authenticator, then HashMerchant feegrants only MsgAddAuthenticator (plus 1 THIOL runway) after DREGG confirms payment. See Passkeys and Onboard.

Watch / ZIP-321 UI stays closed until that dest is connected.

2. Ask DREGG if Pay is open

Base: https://dregg-svg.permissionless.money.

  • GET /health — Pay only when checkout_ready === true.
  • GET /v1/prices — amounts and labels. ok here is not a Pay signal.
  • GET /v1/pay-targets?recipient=terp1… must be HTTP 200 before showing Pay.

Hide ZEC if zec_uri is null. Native unit is 100000000 uthiol (100 THIOL) per NFT unless prices say otherwise.

3. Pay, then mint

  • ZEC — ZIP-321 URI / QR. The house compact streamer watches the shielded payment. Memo carries a blinded Pedersen commitment (memo_hex prefix 6431), never terp1.
  • Native — Keplr (or the device signer) sends THIOL on Terp to the dest DREGG returns.

After paid: true for that commitment c, the page can call onboard POST /onboard/v1/passkey-grant with {address, c} if this is a passkey account.

Mint execute is on the collection contract, wrapped as update_extensionmint. Not a top-level {mint:…} on the minter.

Contracts (morocco-1)

PieceValue
Minterterp188jpppxtfpf0vvt5gypdj52hk2xuswwcn38auczzxv20fcxz3kss9fhlru (code 72)
Collection (Hopalong)terp1vp7smemrv846hpsyqrzlnqapmu3sv7hyygf4rrnw3ls26ezk864qupr5zt
New collectionsminter instantiates cw721_svg code 83