Docs
Bonding-curve markets for GitHub repos, live on Robinhood Chain.
What stars.trade is
Every GitHub repo can have a market. Each market has its own bonding curve. You buy a star, the price of the next star goes up. You sell a star, the price of the next star goes down.
Stars are a signal, not a share. They do not confer ownership of the repo, voting rights, or a claim on future revenue outside of the fee split described below. They are a way to put money behind the code you think matters.
If a maintainer claims the repo, they capture 5% of every trade on it, forever. Until then, that 5% sits with the vault and is paid out on claim.
How a market works
Each repo has a single contract: a RepoCurve. Curves are spawned from the StarFactory. The factory does one thing: it hashes gh:owner/name, deploys a RepoCurve for it, and registers it.
Anyone can spawn a curve for any repo. The first spawn costs gas. After that the curve is live and anyone can trade it.
All value stays inside the curve contract as raw ETH. There is no LP token, no external AMM, no oracle. Price is a pure function of supply.
Stars are non-transferable
Balances are tracked inside RepoCurve and cannot be transferred to another wallet. You can only mint (buy) or burn (sell) against the curve.
This is deliberate. Non-transferability keeps stars tied to intent. If you want out, you sell. There is no secondary market to game, no wrapped version to fractionalize, no OTC.
Stars have no ERC20 interface. Nothing calls transfer. Nothing calls approve. Wallets will not show them like tokens. The portfolio page reads balances directly from each curve.
The pricing curve
Price of the star at supply n:
price(n) = n² / 1000 (in ETH-wei terms)
Cost of buying k stars from supply n is the sum of squares from n to n + k - 1. The contract computes this in closed form using the standard sum-of-squares identity.
The very first star (buying 1 from supply 0) costs zero. Whoever mints star #1 pays only gas. From there the curve rises quadratically.
Sample prices, before fees:
| Star # | Marginal price |
|---|---|
| 1 | 0.000000 ETH |
| 10 | 0.000081 ETH |
| 50 | 0.002401 ETH |
| 100 | 0.009801 ETH |
| 250 | 0.062001 ETH |
| 500 | 0.249001 ETH |
Marginal price is what star number N costs. The total cost of a purchase is the sum of the marginal prices for the range you are buying.
Fees
Every buy and every sell is taxed 10% on the ETH leg. The split is fixed:
- 5% to the maintainer of the repo, if the repo has been claimed. If unclaimed, that 5% accrues in the curve and is paid to the maintainer on claim.
- 5% to the protocol fee vault, an immutable contract at a fixed address.
On a buy: you pay cost × 1.10. You receive the stars.
On a sell: you receive proceeds × 0.90. The stars are burned.
Fees are settled in the same transaction as the trade. No pending balances, no claim step for the vault, no epoch.
Buying a star
- Open a repo page.
- Enter the quantity you want to buy.
- Click
BUY. Your wallet asks you to sign a call tobuyStars(uint256)with the ETH cost attached. - The site adds a small cushion to the quoted price so tiny drift between quote and mine does not underpay. Any excess is refunded by the contract.
- The tx mines. Your balance goes up. The next star costs more.
Slippage is deterministic on this contract because there is no external liquidity. The only reason a buy would cost more than the quote is another buy landing in the same block, which is why the cushion exists.
Selling a star
- Open a repo page you hold stars in.
- Switch to
SELL, enter a quantity up to your held balance. - Click
SELL. Your wallet signs a call tosellStars(uint256). - Stars are burned. You receive
proceeds × 0.90as ETH in the same transaction.
You cannot sell stars you do not hold. You cannot sell fractional stars.
Claiming a repo
Any GitHub repo maintainer can claim their curve and start capturing 5% of every trade on it. The claim proves you control the GitHub account with push access to the repo.
- On the site, open Claim.
- Paste
owner/nameand connect the wallet that should receive fees. - Copy the signed-message text the site generates. It includes the repo name, the wallet, and the stars.trade domain.
- Post that text as a public gist under your GitHub account. Any filename, any description.
- Paste the gist URL back into the site. The relay signer verifies the gist, checks that its author has push access to the repo, and signs an ECDSA voucher.
- Submit the voucher on-chain via
StarFactory.claim(owner, name, wallet, signature). That call sets the maintainer address on the curve.
From that block on, 5% of every trade routes to the wallet you claimed with. Any unclaimed fees that accrued before the claim are paid out in the same transaction.
Only the relay signer can produce valid vouchers. It cannot mint stars, cannot pull ETH, cannot change fees. It can only sign claim vouchers for repos it has verified. If the signer key is rotated, existing claims are unaffected.
The relay signer
The relay is a small Node server. It takes a gist URL and a repo, verifies the gist against the GitHub API, and returns a signed voucher matching the on-chain claimDigest. The signature is over:
keccak256(abi.encode(owner, name, maintainer, factory, chainId))
Then wrapped in the standard Ethereum signed-message prefix so MessageHashUtils.toEthSignedMessageHash on the contract matches.
Verification rules, first match wins:
- The repo is user-owned and the gist author is that user.
- The gist author has
admin,maintain, orwritepermission on the repo. - Fallback: the gist author appears in the top 30 contributors to the repo.
If none match, the relay returns a 403 and no voucher is issued.
Contracts
All contracts are on Robinhood Chain. All are verified on Etherscan.
| Name | Address |
|---|---|
| StarFactory | 0xd45FB65F528A12B1B5997C89c7731CC42fADE083 |
| FeeVault | 0x3C23645EDEA8534f54F6feC76E000cE04A198926 |
The factory is the only contract that can deploy new curves. The fee vault is immutable and holds protocol ETH.
Live markets
Ten curves seeded at launch. Anyone can spawn another for any repo.
| Repo | Curve |
|---|---|
| openai/gpt-oss | 0xE9404EE7…c9Ec31F |
| ollama/ollama | 0xF7ecD44d…9c05Cd5 |
| ggml-org/llama.cpp | 0xd913F69c…465EB400 |
| vllm-project/vllm | 0x631e022C…5CDF0d3 |
| huggingface/transformers | 0x47C34127…536e2f4 |
| unslothai/unsloth | 0x25efdb5E…68791cD |
| comfyanonymous/ComfyUI | 0xcdfe3ff2…18aFB93 |
| crewAIInc/crewAI | 0x8f630631…360252 |
| browser-use/browser-use | 0x4D4DC38e…f71C4 |
| microsoft/DeepSpeed | 0xcd1c1097…3020501 |
To spawn a curve for any other repo, type owner/name in the header search on the markets page. If no curve exists, the search dropdown offers to spawn one.
Risks
These are the things to know before you send a transaction. There is no fine print past this.
- Curves are not audited. The code is small and posted on Etherscan. Read it before you fund a position you cannot afford to lose.
- Stars are non-transferable. The only exit is a sell against the same curve. If you cannot sell, you cannot get out.
- First-mover risk is real. The first buyer pays gas and gets a star for zero, but every star after that pays a rising cost. Selling into a thin curve gives back proceeds calculated at that lower supply.
- The maintainer of a claimed repo can change wallets by transferring ownership on the curve. That is by design. If they compromise their GitHub account and someone else claims first, that person captures the fee stream. Once claimed, the curve cannot be re-claimed.
- The relay signer is a single point of trust for claims only. A compromised signer key means a bad actor can claim unclaimed repos. It does not let them touch trader funds, mint stars, or drain the fee vault. Recovery is redeployment of the factory with a new signer.
- GitHub API is upstream. If the API is rate-limited or down, the relay may fail to verify. Retry.