hydropad / docs

Docs

How it works

Hydropad is one contract and a static front end. There is no server, no database and no admin key. What follows is what the code does.

The launcher

Hydropad.sol holds every pairing. launch() deploys a HydropadToken, a plain ERC-20 that also stores the ticker of its water source, mints the whole supply to the launcher, and opens a curve for it. The launcher has no owner, no pause, no mint and no upgrade path.

The curve

Each pairing is a constant product k = ethReserve · tokenReserve. The ETH side starts at a virtual 1.2 ETH that nobody deposited and nobody can withdraw; it only sets the opening price. A buy of v, after the fee, moves the reserves:

  • tokensOut = tokenReserve − k / (ethReserve + v)
  • ethOut = ethReserve − k / (tokenReserve + amountIn) on the way back
  • price at any moment is ethReserve / tokenReserve

So the first buyer pays the opening price and every later buyer pays more, and a seller is paid out of the real ETH the curve has taken in, never out of the virtual reserve, which is why a sell reverts rather than dipping into someone else's position.

Slippage

buy() and sell() both take a minimum out. The site quotes with quoteBuy / quoteSell and sends the trade with 3% of room, so a transaction that lands after a big move reverts instead of filling at a price you did not see.

The vault

3% of every trade, buy and sell, accrues to that pairing's vault. Only the address that launched it can call claimVault, and it can only take that vault: fees, never reserves. Nothing else in the contract moves ETH to anyone but the trader.

Graduation

When a pairing's raised amount passes 4.2 ETH it is marked graduated and the event is emitted. It is a milestone, not a switch: the curve keeps working exactly the same afterwards. Nothing is locked, migrated or handed to a pool. The contract does not promise what it cannot do.

The water register

The 32 sources, their venues, assays, units, spot figures and fill levels ship with the build as reference data. They label a pairing, and the ticker goes on chain with the token, but they do not price it: a token's price is its curve and nothing else. Wiring a real hydrological feed to a price would need an oracle, and the contract deliberately has none.

Running it

The contract is in contracts/Hydropad.sol; npm test compiles it and runs the suite against an in-process EVM. The front end is static files: no build step, no framework, ethers.js from a CDN.

Networks

where the contract lives

Hydropad runs on Robinhood Chain, the Arbitrum Orbit layer 2 that settles to Ethereum and pays gas in ETH. On it, coins are launched through Pons V2, the launchpad already deployed there, at 0xA5aAb3F0c6EeadF30Ef1D3Eb997108E976351feB: the supply mints into a constant-product curve and graduates into a Uniswap V4 pool whose liquidity is locked for good. Nothing has to be deployed first, by anyone. Pons' token has no field of ours, so the pairing is written into its description, which is a public string on chain that any explorer will show you. Everywhere else — the testnet, the chain inside this page — Hydropad's own launcher is what runs, and the pairing goes in source().

Robinhood Chain

Chain ID
4663
RPC
https://rpc.mainnet.chain.robinhood.com
Explorer
robinhoodchain.blockscout.com
Gas
ETH

Robinhood Testnet

Chain ID
46630
RPC
https://rpc.testnet.chain.robinhood.com/rpc
Explorer
explorer.testnet.chain.robinhood.com
Gas
test ETH

Both buttons send wallet_addEthereumChain and then wallet_switchEthereumChain; your wallet decides, this page only asks.

The check only reads: it asks the factory what it is, whether it would take a launch from your address, and on what terms. Nothing is signed and nothing is spent.

Running your own launcher

for whoever deploys this

Hydropad is not a service and there is no server behind it. The launcher is a contract, and on any chain it has not been deployed to there is simply nothing to read. Sending it is one transaction; whoever sends it owns nothing except the right to be the address this build talks to, because the contract has no owner and no admin function. You do not have to come here for it: the first launch on a network without one deploys the launcher as part of the flow.

Deploy it from the wallet you want it under, or point this build at a launcher that is already out there. Either choice is remembered per chain, in this browser only.

From a checkout, PRIVATE_KEY=0x… npm run deploy -- --network robinhood does the same thing without a browser: it checks the node really is the chain you named, shows the gas before it sends anything, reads the contract back off the chain afterwards, and with --write puts the address into the build so every visitor on that network reads the same launcher. The key is read from the environment and never written anywhere.

The address you deploy or enter is remembered per chain, in this browser, and you can hand it to someone by adding ?launcher=0x… to any link here. The source is contracts/Hydropad.sol and the suite that has to pass before it goes anywhere is contracts/test.js.