stars.trade / docs

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
10.000000 ETH
100.000081 ETH
500.002401 ETH
1000.009801 ETH
2500.062001 ETH
5000.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

  1. Open a repo page.
  2. Enter the quantity you want to buy.
  3. Click BUY. Your wallet asks you to sign a call to buyStars(uint256) with the ETH cost attached.
  4. 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.
  5. 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

  1. Open a repo page you hold stars in.
  2. Switch to SELL, enter a quantity up to your held balance.
  3. Click SELL. Your wallet signs a call to sellStars(uint256).
  4. Stars are burned. You receive proceeds × 0.90 as 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.

  1. On the site, open Claim.
  2. Paste owner/name and connect the wallet that should receive fees.
  3. Copy the signed-message text the site generates. It includes the repo name, the wallet, and the stars.trade domain.
  4. Post that text as a public gist under your GitHub account. Any filename, any description.
  5. 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.
  6. 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:

  1. The repo is user-owned and the gist author is that user.
  2. The gist author has admin, maintain, or write permission on the repo.
  3. 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.

NameAddress
StarFactory0xd45FB65F528A12B1B5997C89c7731CC42fADE083
FeeVault0x3C23645EDEA8534f54F6feC76E000cE04A198926

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.

RepoCurve
openai/gpt-oss0xE9404EE7…c9Ec31F
ollama/ollama0xF7ecD44d…9c05Cd5
ggml-org/llama.cpp0xd913F69c…465EB400
vllm-project/vllm0x631e022C…5CDF0d3
huggingface/transformers0x47C34127…536e2f4
unslothai/unsloth0x25efdb5E…68791cD
comfyanonymous/ComfyUI0xcdfe3ff2…18aFB93
crewAIInc/crewAI0x8f630631…360252
browser-use/browser-use0x4D4DC38e…f71C4
microsoft/DeepSpeed0xcd1c1097…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.