Contracts
Deployed addresses, what each contract does, the EIP-712 authorizations and exactly what the owner can and cannot change.
Deployed addresses
Robinhood Chain mainnet, chain id 4663. The gitpad contracts are verified on Sourcify with an exact match.
| Contract | Address |
|---|---|
GitpadFactory |
0x61ba171254Fc00BbA977D0B94e3eA627DE9F5B91 |
RepoVault implementation |
0xa3B9Fc70b9Cb2b26B1df28bBd7DEebe3b76df9c9 |
| Verifier (signing key, not a contract) | 0x003a7239ec479d1CcBEFB323315535ab449243Ac |
| Treasury | 0xe568F9e89F77D88399817Ec4046fa21Fc675E269 |
| Flap Portal (third party) | 0x26605f322f7fF986f381bB9A6e3f5DAb0bEaEb09 |
Each market's token and vault addresses are listed on its market page and returned by GitpadFactory.marketAt(i).
GitpadFactory
Creates markets and holds the fixed launch terms.
launch(params, signature)creates the repository's vault (an EIP-1167 clone deployed with CREATE2, salt = the repository id), creates the Flap Tax Token V3 with the vault as tax beneficiary, makes the first buy, sends every bought token to the launcher, refunds unspent ETH and records the market.- Enforces one market per repository:
tokenOf(repoId)must be empty. - Views:
marketCount(),marketAt(i),marketsSlice(offset, limit),tokenOf(repoId),repoOf(token),predictVault(repoId).
Fixed terms, as constants:
| Constant | Value |
|---|---|
buyTaxBps / sellTaxBps |
200 / 200 (2%) |
taxDuration |
3650 days |
antiFarmerDuration |
1 day |
dexThresh |
FOUR_FIFTHS |
migratorType |
Uniswap V2 |
quoteToken |
native ETH |
mktBps |
10000 (all tax to the beneficiary) |
tokenVersion |
Tax Token V3 |
builderBps |
6000 |
platformBps |
4000 |
discovererShareOfPlatformBps |
5000 |
discoveryWindow |
30 days |
RepoVault
One clone per repository, the Flap tax beneficiary of its market. Flap pushes ETH to it with a plain call, so receive() is empty and accounting runs on balance changes.
| Function | Who can call | What it does |
|---|---|---|
harvest() |
Anyone | Asks the token's tax processor to dispatch pending tax (errors are ignored), then splits new income. |
claimBuilder(to, deadline, signature) |
Anyone holding a valid signature | Harvests, splits, pays everything owed to builders to to, increments builderNonce. |
claimDiscoverer() |
Anyone | Harvests, splits, pays the discoverer balance to the launcher. |
sweepPlatform() |
Anyone | Harvests, splits, pays the platform balance to the factory's current treasury. |
pending() |
View | Builder, platform and discoverer amounts after a sync now. |
discoveryEndsAt() |
View | End of the 30-day discovery window. |
The split terms are copied into each vault when it is created and no function changes them afterwards.
EIP-712 authorizations
Both types are signed by the verifier under the factory's domain:
EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)
name = "gitpad", version = "1", chainId = 4663, verifyingContract = GitpadFactory
Launch(uint64 repoId,bytes32 nameHash,bytes32 symbolHash,bytes32 metaHash,address launcher,uint256 deadline)
BuilderClaim(address vault,uint64 repoId,address to,uint256 nonce,uint256 deadline)
nameHash,symbolHashandmetaHasharekeccak256of the exact UTF-8 strings passed tolaunch.launcheris the address that sends the launch transaction.nonceis the vault's currentbuilderNonce(). It increments on every successful claim.- The factory's current verifier is checked at launch time and at claim time.
- Signatures must be 65 bytes with
vin {27, 28} and a lows. - The web app sets launch authorizations to expire after 20 minutes and claim authorizations after 15 minutes.
- Helpers:
launchDigest(...),hashLaunch(...),builderClaimDigest(vault, repoId, to, nonce, deadline),domainSeparator().
Owner powers
The factory has an owner, transferable in two steps (transferOwnership, then acceptOwnership by the new owner). The owner can call exactly four other functions:
| Function | Effect |
|---|---|
setVerifier(address) |
Replaces the key that authorizes launches and builder claims, for all vaults, immediately. |
setTreasury(address) |
Changes where every vault's sweepPlatform pays the platform share. The Flap commission receiver of existing markets stays the treasury that was set at their launch; only later launches use the new one. |
setPaused(bool) |
Pauses or resumes new launches only. Trading, harvesting and every claim keep working. |
setMinBuy(uint256) |
Changes the minimum first buy for new launches. |
The owner cannot:
- Move ETH out of any vault directly. Vaults have no owner function.
- Change the 60/40 split, the discoverer share or the 30-day window of any vault.
- Change the tax rate, tax duration or beneficiary of any token. They are fixed in Flap at launch.
- Change the launcher recorded in a vault, or where
claimDiscovererpays. - Pause trading, which happens on Flap.
- Create a second market for a repository id.
Flap
Tokens, the bonding curve, graduation and tax collection are Flap's contracts, not gitpad's. gitpad's contracts call Flap's Portal newTokenV6 to create tokens, and the web app calls swapExactInput and quoteExactInput to trade.
Source
The contracts live in contracts/ in the gitpad repository. ABIs are exported in contracts/abi/. See Self-hosting to build and test them.
Found something wrong? Edit this page on GitHub.

