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 livesHydropad 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 thisHydropad 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.