# Hash Brokers — briefing for humans and AIs

Feed this file to an assistant if you want it to explain the project. The same material is also on `/docs`. Download this file from the Briefing section.

- Site docs: `/docs` · download `HASHBROKERS.md` from the Briefing section.
- OpenSea: https://opensea.io/collection/hashbrokers
- X: https://x.com/Hashbrokers_rh
- Chain: Robinhood Chain, chain id **4663**
- RPC: `https://rpc.mainnet.chain.robinhood.com`
- Explorer: https://robinhoodchain.blockscout.com
- Sourcify (verified source): https://repo.sourcify.dev
- This is **tokenized NVDA / on-chain NVDA exposure**. It is not Nvidia equity at a broker.

## What it is

Hash Brokers is a 4444 ERC-721C “Broker Desk” collection. You do not buy a desk off a list. You hash a proof bound to your wallet, pay the live mint price, and the contract mints the NFT.

Desks can later claim tokenized NVDA after the owner funds a pool and opens a split. Mint itself never calls Uniswap.

## Live contracts (talk to these, not the implementations)

Robinhood Blockscout has not imported the viaIR implementations yet. Read verified source on Sourcify.

| Name | Address | Role | Sourcify |
| --- | --- | --- | --- |
| HashBrokersNFT (proxy) | `0xF712108D5cD998D4996f4956289802A77Af35F12` | Desks, PoW mint, ETH intake | [impl](https://repo.sourcify.dev/4663/0xD9d1C4D0370ebbd90772466B6d926ea7C1A8C37F) |
| HashBrokersLayerRenderer | `0x767E3B0828677c999b899AC9e6Cea53Da713A266` | On-chain pixel art | [impl](https://repo.sourcify.dev/4663/0x3494d944831d15A89CE7ffD6948012a6888463Ec) |
| NvdaBuyModule (proxy) | `0x5533d49F215A400a828208f7540bBeE64E5B68c7` | NVDA pool, fund, split, claim | [impl](https://repo.sourcify.dev/4663/0x452f7dAb290290ED5CF0C32a1806FFcC2699d8B7) |
| UniswapV3SwapAdapter | `0x1CD33144e1e93993964997e9748AAe8263dD2454` | Optional WETH → USDG → NVDA hop | [impl](https://repo.sourcify.dev/4663/0x8E6Af1eFA42A8945B3C71f33630A865863EB8Be3) |
| $HASHBROKER | `0x8AEcA3aAAC3c9DcBA0eF3fb61CFc5cF1b0D7dd40` | Protocol ERC-20, not wired into mint | [source](https://repo.sourcify.dev/4663/0x8AEcA3aAAC3c9DcBA0eF3fb61CFc5cF1b0D7dd40) |
| HashBrokersAccount | `0x804C7dC0C6447733e451194509E96e32a3CCD3bf` | ERC-6551 vault implementation | [source](https://repo.sourcify.dev/4663/0x804C7dC0C6447733e451194509E96e32a3CCD3bf) |

Robinhood / Uniswap pieces:

| Name | Address |
| --- | --- |
| Tokenized NVDA | `0xd0601CE157Db5bdC3162BbaC2a2C8aF5320D9EEC` |
| WETH | `0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73` |
| USDG (6 decimals) | `0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168` |
| SwapRouter02 | `0xCaf681a66D020601342297493863E78C959E5cb2` |
| Uniswap V3 factory | `0x1f7d7550B1b028f7571E69A784071F0205FD2EfA` |
| Deepest USDG/NVDA 0.05% pool | `0xd4EB21209C4D6093f80B5b84f5C45cc093EA14a3` |
| ERC-6551 registry | `0x000000006551c19487814612e58FE06813775758` |

Owner: `0x119189C5AD58AEb34bfc503bD7cC349b77Bbd342`

## Mining

```
digest = keccak256(abi.encodePacked(miner, nonce, prev, anchor))
valid if uint256(digest) <= currentTarget
```

- The miner address is packed into the preimage. A hit for wallet A cannot be minted by wallet B.
- `prev` advances on every successful mint.
- `anchor = keccak256(chainid, contract, epoch)` and the epoch is about one hour.
- Expected hashes ≈ `2^256 / (target + 1)`. Genesis is a hard target (`type(uint256).max >> 22`), millions of keccak trials on average. Long tails happen.
- Frontend hashes in the browser on `/mine`, then the same wallet calls `mine(nonce)` and pays `mintPrice()`.
- External / GPU hashers use the mine API, then mint from that same wallet.

Mine API: https://hashbrokers-mine-api.cats-cb1.workers.dev

- `GET /v1/work` live job
- `POST /v1/verify` check a proof
- `GET /v1/spec` 116-byte packed keccak layout
- `GET /v1/booth` cached floor + NVDA tape (so the site does not make every visitor hammer the public RPC)

Rate limit: 100 requests / 10 seconds / IP.

## Price ladder — how many hours until the next step

`mintPrice()` is not a constant.

Schedule:

`0.0005 ETH` → `0.0008 ETH` → `0.0009 ETH` → `0.001 ETH` → `0.0012 ETH`

- A step happens every **3,600 of the contract’s `block.number`**.
- On Robinhood that `block.number` is the **parent / Ethereum clock (~12 seconds)**, not the L2 height on Blockscout (tens of millions).
- 3,600 × 12s ≈ **12 hours per tier**.
- After the fourth step it stays at 0.0012 ETH unless the owner overrides.
- `setMintPrice(0)` hands control back to the schedule.
- The booth reads `floorStats()` / `mintPrice()` live. A screenshot of the price goes stale.

If someone subtracts the explorer L2 block from `nextPriceBlock` (~25.9M) they will think the step is due “in 0 blocks.” That is wrong. Use the site ticker or `GET /v1/booth` (`etaSeconds`, `evmBlock`, `nextPriceBlock`).

## Mint and NVDA

`mine` does **not** swap. It does not call Uniswap. It does not try/catch a buy.

- 100% of the mint ETH stays on the NFT contract until the owner withdraws.
- A dry NVDA pool or a failed swap **cannot revert a mint**.
- Tokenized NVDA is funded later (`fundNvda` on the buy module), then `splitAll()` opens a distribution epoch.
- Equal share per desk that already exists. A desk minted after an epoch is closed out of that older epoch.
- Reserved NVDA cannot be owner-withdrawn. Dust from integer division stays unreserved.
- Holder claims from **My Desks**:
  - `claimAllDistributions(tokenId)` → epochs into the desk’s ERC-6551 vault
  - `claimAndWithdraw(tokenId, to)` → claim then send vault NVDA to a wallet
  - `claimNvda(tokenId, to, amount)` → pull from the vault after epochs are claimed
- The same epoch cannot be claimed twice. Unclaimed epochs travel with the NFT on sale.

`$HASHBROKER` is a separate ERC-20 (cap 1,000,000,000). It is not required to mint or to claim NVDA.

## NVDA tape on the site

`/stats` (nav: NVDA) shows:

1. **Our buys** — Uniswap USDG→NVDA fills whose recipient is the Hash Brokers adapter or buy module, plus `NvdaFunded` / leftover `NvdaBought`, each with a Blockscout tx.
2. **Market tape** — recent fills on the public 0.05% USDG/NVDA pool.
3. Live mint price, next-step ETA, pooled / reserved NVDA.

Pool token0 = USDG (6 decimals), token1 = NVDA (18). A buy of NVDA has `amount1 < 0`.

## Art and vaults

Each desk image is on-chain (layer renderer). Names and traits (desk, lamp, wall) come from the contract, not a metadata server. Tokens 1–4000 get generated DNA after layers/DNA are seeded; 4001–4444 have no generated DNA.

Every desk has an ERC-6551 token-bound account. Claimed NVDA sits there and moves with the NFT until withdrawn.

## Admin notes (not for the public mint path)

- Owner can `adminMint` up to 50 total, no PoW, no ETH, no NVDA buy.
- Owner withdraws ETH, may swap off-chain, then `fundNvda` and `splitAll`.
- Art must be seeded (`SeedLayers` then `SeedDna`) before `tokenURI` works for generated desks.

## Language to keep

- Say **tokenized NVDA** / on-chain NVDA exposure.
- Do not say the desk owns Nvidia stock at a broker.
- Do not advertise the mint as a 3–10 second laptop hash.
- `/docs` is the live write-up. This file is the downloadable copy for an AI.
