Docs
How the lab works, how a docking test is paid, how the score is computed, what the contract checks, the docking methods, reviews, levels, the AI analysis, what is and is not claimed, the API and a glossary.
How it works
Ponchem is a computer-aided drug design lab that keeps its record on Robinhood Chain. The library holds about one hundred cancer targets and about one hundred bioactive plant compounds. Each target is an experimental structure from the RCSB Protein Data Bank. Its binding pocket is defined at build time from the reference ligand in the crystal: a box padded by 2 A on each side, at least 6 A of half size, and every receptor heavy atom within reach of that box. The pocket bytes and the box are hashed and the hash is registered on chain.
Each ligand is a heavy atom topology derived from its chemical component or PubChem record: atoms, bonds, ideal bond lengths, 1-3 distances and rotatable bonds. Hydrogens are not represented. That topology is registered on chain too.
When you dock, a seeded stochastic pose search runs in a Web Worker in your browser. It moves, turns and twists the ligand inside the box and keeps the best poses. The search follows a docking method: a preset such as Quick, Standard or Deep, or your own JSON. The same seed and method give the same pose on any machine. The final pose is always evaluated by the integer scorer, the same function the contract runs. The browser step prepares a pose; the chain step is the docking test.
A docking test sends the pose to the contract with its payment, 100 $PONCHEM or 0.0001 ETH, paid to the lab treasury. The contract checks the geometry, recomputes the score and emits an event with the whole pose and the method. From then on the site shows the chain's number, and every test has its own report page at /run?id=N where anyone can review it.
Payment
Every docking test costs 100 $PONCHEM or 0.0001 ETH, plus gas. The payer chooses in the lab. Both go to the lab treasury, not to a prize pool. The contract takes the ETH with the transaction, or pulls the $PONCHEM from the connected wallet after an approval.
While $PONCHEM is not launched the token option is off: the lab shows it as after the $PONCHEM launch and only the ETH option works. The owner can change the two prices and switch either option on or off; the lab always reads the current values from the contract.
Prize pools are funded by sponsors only. Anyone can fund a target's pool, and at the end of a seven day epoch anyone can settle: the wallet with the best score recorded on that target during the epoch receives the pool minus the lab fee. With no test in the epoch the pool rolls over.
The prices are read from the contract and shown in the lab before you pay.
Scoring explained
The score is an empirical estimate of binding free energy in kcal/mol. It sums five terms over every ligand atom and receptor atom pair within 8 A, using the surface distance d, which is the centre distance minus both atom radii.
- gauss 1: a narrow bell around d = 0, rewards close contact.
- gauss 2: a wide bell around d = 3 A, rewards being near the surface.
- repulsion: d squared when d is negative, punishes overlap.
- hydrophobic: 1 when two hydrophobic atoms touch, fading to 0 at 1.5 A.
- hydrogen bond: 1 when a donor and an acceptor are close, fading to 0 at d = 0.
The weights are the ones Trott and Olson fitted on about 1,300 PDBbind complexes (AutoDock Vina, J Comput Chem 2010). The sum is divided by 1 + 0.0585 times the number of rotatable bonds, which costs flexible molecules a little. Ponchem's engine is an independent implementation of this family of functions, which we call Vina-style. It shares the functional form and the published weights. It is not the AutoDock Vina program, and it makes no claim to reproduce its numbers on any given complex.
| gauss 1 | -0.0356 |
| gauss 2 | -0.00516 |
| repulsion | 0.840 |
| hydrophobic | -0.0351 |
| hydrogen bond | -0.587 |
Weights in kcal/mol per unit term. Divided by 1 + 0.0585 x rotatable bonds.
On chain everything is fixed point: coordinates in hundredths of an angstrom, distances from an integer square root table, the bell terms from lookup tables, energies in micro kcal/mol and reported in milli kcal/mol. The JavaScript scorer and the Python reference are bit exact copies of the contract's arithmetic, proven by a shared test vector file.
Potency: pKd = -dG / (RT ln 10) at 298.15 K, and Kd = 10 to the power of -pKd. Ligand efficiency is -dG divided by the heavy atom count. All three are derived from the same estimate and carry its uncertainty.
Score bands
The colour of a dG number on the site follows four display bands: strong at or below -9 kcal/mol, moderate between -9 and -6, weak above -6, no binding at zero or positive. Display bands only. The chain records the exact value in milli kcal/mol.
Atom types
Sixteen heavy atom types in the X-Score and Vina tradition. A carbon next to a heteroatom is polar carbon, otherwise hydrophobic carbon. A nitrogen is a donor when it carries hydrogen and an acceptor when it has an available lone pair. Every oxygen accepts, and a hydroxyl oxygen donates too. Halogens are hydrophobic. Metal ions in the pocket are donors.
What the chain checks
A pose is a list of heavy atom positions in hundredths of an angstrom, relative to the box centre. The contract accepts it only if:
- it has exactly the ligand's heavy atoms in topology order;
- every bonded pair is at its ideal distance within the tolerance in the engine spec;
- every 1-3 pair is at its ideal distance within tolerance;
- every pair separated by three or more bonds is at least the clash floor apart;
- every atom is inside the target's box.
A pose can only score well by fitting the pocket, because the receptor atoms it is scored against are the registered pocket bytes. Mirror images are not distinguished by these checks; that is a known limit and is stated here. The contract then recomputes the score with the integer function and stores the run with the pose in the event.
Tolerance for bonded and 1-3 pairs is 0.06 A plus two percent of the ideal distance. The clash floor is 2.20 A for every pair three or more bonds apart. The box is the reference ligand's bounding box padded by 2 A on every side, with a half size of at least 6 A.
Every test report page re-runs the same integer function in your browser on the pose stored in the event and shows Chain and browser agree, or the two numbers when they differ.
Docking methods
The scoring function is fixed: it is the test. The search that prepares a pose is configurable through a method, a JSON object the engine validates against the schema below. Unknown keys are rejected with the key named; values outside their bounds are rejected with the bound named. Every missing field takes its default, and a run echoes the resolved method, so a pose is reproducible from the method plus the seed. The lab records the compact JSON with the test, and the test page shows it with a Use this method link.
| Field | Values | Default | What it does |
|---|---|---|---|
| name | text | Standard | The label shown in the lab and on the test page. |
| version | 1 | 1 | The schema version. |
| budget | { ms: 5000 to 120000 } or { steps: N } | { ms: 30000 } | How long the search runs, in milliseconds or in steps. Steps is the reproducible form. |
| chains | 1 to 32 | from the budget | Restarts: independent Monte Carlo chains that share the budget. |
| temperature | 0.1 to 5 | 1.2 | Metropolis kT in kcal/mol. Higher accepts more uphill moves. |
| moves.translate | 0.05 to 5 | 1.0 | Largest translation per move, in angstrom. |
| moves.rotate | 1 to 180 | 20 | Largest rigid rotation per move, in degrees. |
| moves.torsion | 1 to 180 | 60 | Largest torsion turn per move, in degrees. |
| local.steps | 0 to 300 | 30 | Local optimisation steps after each move. |
| placement | box or center | box | Where a chain starts: anywhere in the box, or near its centre. |
| flexible | true or false | true | False keeps the ligand rigid, torsions frozen at the ideal conformer. |
| candidates | 1 to 16 | 4 | Poses kept for the integer polish at the end. |
| lattice | true or false | true | Integer lattice moves in the polish, on the chain's own scorer. |
| seed | 0 to 4294967295 | filled by the lab | The seed of every random choice. Same seed, same pose. |
Presets
Seven presets ship with the engine. Each is a complete method; pick one in the lab, then edit the JSON if you want.
| Preset | What changes |
|---|---|
| Quick | About 10 seconds of search. |
| Standard | About 30 seconds. The defaults above. |
| Deep | About 90 seconds. |
| Rigid ligand | Torsions frozen at the ideal conformer. |
| Wide search | More chains, larger moves, shorter local optimisation. |
| Fine local | Fewer chains, small moves, long local optimisation. |
| Reproducible | A step budget instead of milliseconds, so a run replays exactly anywhere. |
{ "name": "Standard", "version": 1,
"budget": { "ms": 30000 },
"chains": 8, "temperature": 1.2,
"moves": { "translate": 1.0, "rotate": 20, "torsion": 60 },
"local": { "steps": 30 },
"placement": "box", "flexible": true,
"candidates": 4, "lattice": true,
"seed": 7 }
Reviews
Every docking test has a report page, and any wallet other than its author can review it there: one to five stars and a note of at most 280 characters, plain text, stored on chain with the reviewer's address. A review costs gas only. A second review by the same wallet on the same test replaces the first. The test page shows the average, the count and the list, newest first; the leaderboard lists the most reviewed tests; the dashboard lists the reviews you received and wrote.
Notes are shown exactly as written, as text. Nothing in a note runs on this site.
Levels and badges
XP is computed in your browser from chain data, so anyone can recompute it. The rules:
| XP | For |
|---|---|
| 10 | per docking test |
| 5 | per distinct target tested (the first time) |
| 15 | per test that becomes the best on its target when it is recorded |
| 3 | per review written |
| 5 | per review received with 4 or 5 stars |
| 25 | per epoch won |
| 5 | per target sponsored (the first time) |
| Level | From |
|---|---|
| Observer | 0 |
| Assistant | 50 |
| Researcher | 150 |
| Senior Researcher | 400 |
| Principal Investigator | 900 |
| Lab Head | 2000 |
Badges
- First test
- One docking test recorded.
- Ten tests
- Ten docking tests recorded.
- Fifty tests
- Fifty docking tests recorded.
- Ten targets
- Tests on ten distinct targets.
- Strong binder
- A test at or below -9 kcal/mol.
- Best on a target
- A test that holds the best score on its target.
- Epoch winner
- An epoch settled in your favour.
- Sponsor
- A prize pool funded.
- Reviewer
- Five reviews written.
- Well reviewed
- An own test with three or more reviews averaging 4 or better.
AI analysis
Every test report page offers an analysis by a language model: Claude Fable 5.1, GPT, Kimi or Jev AI, whichever keys are configured on the server. A provider without a key shows as not connected and cannot be picked. Nothing is ever shown in place of a real answer.
What is sent to the model: the target and its PDB id, the ligand, the chain's score and the derived numbers, the five terms and the geometry proof, the method, the target's other tests and the epoch best. The model is asked to interpret the score in plain words, name the limits of a rigid receptor Vina-style estimate, suggest computational and wet-lab next steps, and label any literature it recalls as unverified. The text is the model's and is not verified by anyone. Keys never reach the browser: the request goes to this site's server, which holds the keys and talks to the provider. Ten analyses per minute per server instance.
The author of a test may attach an analysis on chain (up to 2048 bytes; a later one replaces it). An attached analysis is shown to everyone on the test page, with its provider and model, and its first 500 characters go into the X post and the Markdown report. An analysis that is not attached is shown only to the person who generated it, in that session.
Post on X
The test page and the dashboard offer Post on X: a link to X's post composer with a prepared text and the test's URL. The text names the test number, the ligand, the target and its PDB id, the binding free energy and the pKd, and says the test was scored on Robinhood Chain. When an analysis is attached, its first 500 characters follow, labelled with the model. Nothing is posted until you press Post in X. No emoji, no dashes, no address.
What is and is not claimed
Claimed: the structures are real experimental entries from the RCSB Protein Data Bank; the pose search runs in your browser; the score is an integer Vina-style estimate the contract recomputes; the record is on Robinhood Chain and this site rebuilds from it; the sponsored prize pools pay the best score of each epoch; reviews and attached analyses are on chain as written.
Not claimed: that a strong score means a compound is active in cells, animals or people; that any compound here treats or cures a cancer; any wet-lab, clinical or regulatory result; that the engine reproduces AutoDock Vina; that a score is more than a lead for further study. AI modeling here means computer-aided drug design with a learned empirical scoring function. No model on this site claims to have found a drug.
Wallet and network
Ponchem runs on Robinhood Chain, chain id 4663, gas paid in ETH. Connect with any injected wallet. If the wallet is on another network the site asks it to switch, and if the wallet does not know the chain, add it with these parameters: name Robinhood Chain, chain id 4663, currency ETH, RPC https://rpc.mainnet.chain.robinhood.com, explorer https://robinhoodchain.blockscout.com. A docking test costs 100 $PONCHEM or 0.0001 ETH plus gas, shown in the lab before you pay. Reviewing a test costs gas only. Claiming a prize and sponsoring a pool cost gas only, plus the amount you send.
- Network name
- Robinhood Chain
- Chain id
- 4663
- Currency
- ETH
- RPC
- https://rpc.mainnet.chain.robinhood.com
- Explorer
- https://robinhoodchain.blockscout.com
The test prices, the lab fee and the epoch length are read from the contract and shown in the lab and on every target page.
API
The site exposes read-only JSON endpoints under /api for the runs index and the report, and a same-origin JSON-RPC proxy for chain reads. Endpoints and fields are listed below. The catalog files under /data are static and may be fetched directly.
GET /api/status
The lab status as JSON: live, epoch, epochStart, epochEnd, epochLength, runFee (wei), runPrice ($PONCHEM base units), feeBps, token, runCount, targetCount, ligandCount, poolTotal (wei).
GET /api/runs?target=&ligand=&wallet=&limit=&offset=
The runs index rebuilt from chain events, newest first, cached for about ten seconds. JSON with runs, total and head. Each run carries id, wallet, targetId, ligandId, scoreMilli, epoch, time, block, tx and the pose.
GET /api/analyze POST /api/analyze
GET lists the analysis providers with connected true or false, never a key. POST with { runId, provider } returns { provider, model, text, generatedAt }: the model's real answer for that test, cached per test and provider, ten per minute per instance.
GET /api/report.md
The cancer research report as Markdown, the same data as the report page.
POST /api/rpc
A JSON-RPC proxy to Robinhood Chain for read methods only (eth_call, eth_getLogs, eth_blockNumber and the like). Batches of up to five calls. Write methods are refused; wallets send their own transactions.
GET /data/catalog/targets.json GET /data/catalog/ligands.json
The curated catalogs: every target with its PDB id, method, resolution, chain, reference ligand, cancer groups and DOI; every ligand with its plant, class, formula, weight, heavy atoms, rotatable bonds and provenance.
GET /data/registry.json GET /data/pockets/<PDB>.bin GET /data/topologies/<KEY>.bin GET /data/ligands/<KEY>.sdf
The registry with chain ids, pocket and topology hashes, plus the bytes exactly as registered on chain and the heavy atom SDF of each ligand in topology order.
curl -s https://ponchem.ai/api/status
curl -s "https://ponchem.ai/api/runs?limit=5"
curl -s https://ponchem.ai/api/report.md
curl -s https://ponchem.ai/api/rpc -H "content-type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"eth_blockNumber","params":[]}'
Glossary
- Binding free energy (dG)
- The energy change when a ligand binds a receptor, in kcal/mol. Negative means binding is favourable. More negative means stronger.
- Gibbs energy
- The thermodynamic quantity dG stands for. At constant temperature and pressure, a process is favourable when its Gibbs energy change is negative.
- Kd
- Dissociation constant. The concentration at which half the receptor sites are occupied. Smaller means tighter binding. Estimated here from dG = RT ln Kd at 298.15 K.
- pKd
- Minus the base ten logarithm of Kd in molar units. Bigger means tighter. A pKd of 6 is one micromolar; 9 is one nanomolar.
- Ligand efficiency
- Binding free energy per heavy atom, as a positive number. It favours small molecules that bind well for their size.
- Pose
- One placement of the ligand: the position of every heavy atom in the pocket.
- The receptor atoms around the reference ligand's box, taken from the crystal structure. Registered on chain as bytes with a hash.
- Box
- The region the ligand may occupy, centred on the reference ligand and padded. Every atom of a recorded pose must be inside it.
- Heavy atom
- Any atom that is not hydrogen. The engine only represents heavy atoms.
- Rotatable bond
- A single bond the search can twist. More of them means more flexibility and a small penalty in the score.
- Epoch
- A seven day window per target, counted from a genesis timestamp. The best score recorded in the window wins its pool when someone settles.
- Docking test
- The chain step: a pose found in the browser is submitted, the contract proves its geometry, scores it and records it. Costs 100 $PONCHEM or 0.0001 ETH, paid to the lab treasury.
- Method
- The JSON that configures the pose search: budget, chains, temperature, move sizes, local steps, placement, flexibility, candidates, lattice polish and seed. Recorded with the test.
- Prize pool
- The ETH sponsors have put on one target. Paid to the best wallet of the epoch minus the lab fee, or rolled over if no test was recorded.
- Test price
- What a docking test costs: 100 $PONCHEM or 0.0001 ETH, paid to the lab treasury, plus gas.
- Review
- One to five stars and a note of at most 280 characters, written on chain by a wallet other than the test's author. A second review replaces the first.
- XP
- Points computed in the browser from chain data by the rules under Levels and badges. They set a wallet's level.
- Lab fee
- The share of a settled prize kept by the lab treasury, set in basis points.
- Vina-style
- Of the AutoDock Vina family of empirical scoring functions: the same five terms and published weights, in an independent implementation.
- Seed
- The number that fixes the random choices of a search. Same seed, same pose.
- Reference ligand
- The compound that was in the crystal structure. It defines the box and appears as a blue ghost in the viewer.