Joining
ETH in, coin bought on the pool, shares minted as a fraction of the ride. No oracle prices you: the pool does.
What happens on join
- The join fee (1% of the ETH sent; see Fees) is set aside.
- The rest is swapped for the coin on the ride's pool, ETH to token. What the ride received is measured on its own balance, not taken from the pool's word for it.
- If the pool ran out of liquidity and spent less than sent, the fee is recomputed on what was spent and the remainder is refunded in the same transaction.
- Shares are minted, and any ETH already owed to you by earlier sales is paid out.
How shares work
Shares are a fraction of the ride's tokens and nothing else. The first join mints one share per raw token unit; every later join is priced by what its ETH actually bought relative to what the ride already holds:
shares = tokensOut * totalShares / tokenBalance
This is why there is no oracle. A late rider's shares are worth exactly the tokens their ETH bought, and an early rider is never diluted by a join at a different price. ETH returned by the ride's own sales is distributed per share with an accumulator, the way staking contracts pay rewards, so it never has to be valued against the tokens; and it is settled on join so ETH returned before you joined is never yours.
When a join is refused
| Reason | What it means |
|---|---|
NotBoarding | The ride is exiting or closed. A ride only sells from there. |
Expired | The ride’s time is up. The next sync sells everything it holds. |
AuthorExiting | The author’s balance is down past the exit threshold (2% of what the ride mirrors, or under the 5% dust line). The ride has not synced yet, but it will only sell from here. |
Chase | The coin already costs more than the thesis allowed for: a late copy is a different trade. |
The app reads joinStatus(rideId) before it lets you type, and explains the refusal in one sentence.
The chase cap
When a ride opens, the contract records the pool's price before the opener's own buy: the thesis price. The opener also sets a chase cap, up to 200%. A join is refused when the pool price is more than (1 + cap) times the thesis price. The comparison is made in the pool's own sqrt price terms, so it is exact, and every ride page shows the cap as a price.
Slippage
join(rideId, minTokensOut) reverts with Slippage if the swap returns fewer tokens than the floor. The app simulates the very call it will send to get a quote, then passes a floor a configurable percentage below it (1% by default).