EticaHub Whitepaper
Version 1.5 — Research Markets Edition
Abstract
EticaHub is a community-built application layer on the Etica blockchain. It introduces ETX (ticker ETX, name EticaHub, supply 100,000,000, fixed), a hub-and-spoke decentralized exchange where every pair shares ETX as its reserve asset, a research subscription and tipping layer that reads Etica's native proposal contract, and a pre-designed (but not yet deployed) proposal-gated token launchpad that, when activated, will require every new token to open both a token/ETX and a token/ETI pool — structurally funnelling demand to both assets.
Since the v1 genesis launch, EticaHub has shipped several additional surfaces — all of them non-custodial, non-dilutive to the fixed ETX supply, and built on the same hub-and-spoke invariant: a UniswapX-style Trading Stack (limit, stop, DCA, bounded grid, Infinity Bot), an ERC-4626 liquid staking vault (stETX), the EticaStableSwap V3 pool — a rate-aware Curve-style AMM (Phase 0) for stETX↔ETX with a 10-year-locked treasury seed and a live admin-fee adapter that flows back into the harvester, an on-chain Treasury Harvester that redistributes treasury LP-fee accruals via a deterministic 10/10/40/40 split with a permanent Protocol-Owned-Liquidity (POL) burn, an ETXFarms non-emissive LP-staking surface, a skinny on-chain explorer with Sourcify-backed contract verification, a public market-data API, a community buy bot that posts DEX swaps to Telegram, EticaLabs — an AI-native molecular intelligence workstation with a continuously-running autopilot research loop — and EticaResearchMarkets (§15), a permissionless launchpad for science-funding ERC-20s where every market trades against the shared 5M-ETX-seeded singleton on an internal constant-product curve with an 80/10/0/10 fee split, no withdrawable LP, a permanent floor-pull property, and auto-Sourcify verification of every minted token. All hosted on free-tier infrastructure. The Phase 3 cross-chain bridge stack — twelve audited-pattern contracts implementing an optimistic-veto design on Hyperlane rails, a 10M ETX insurance backstop, three custom ISMs, a free GitHub-Actions watcher, and the /bridge UI — is contract-complete in the repo and pending the live deploy of Hyperlane on Etica (Phase H). A frontend-only good-faith jurisdictional gate on /stake and /farms mirrors the same posture adopted by Uniswap and Aave; the underlying contracts remain permissionless.
This document describes what EticaHub is, what it is not, how the v1 mainnet launch works, what has shipped since, and what remains explicitly deferred to later phases.
1. Independence from the Etica Protocol Core Team
EticaHub is not affiliated with, endorsed by, controlled by, or otherwise operated by the Etica Protocol core team.
The relationship is purely that of any third-party application interacting with a public blockchain:
- EticaHub is a community-built, independent project.
- EticaHub consumes Etica's public smart contracts (ETI, EGAZ, proposal contracts) in the same way any other dapp could — by reading public state and posting transactions. There is no special access, shared multisig, shared treasury, shared roadmap, or shared branding.
- ETX is EticaHub's own asset, not an Etica Protocol asset. It is a separate ERC-20 deployed by the EticaHub team for EticaHub's own governance and fee economics.
- EticaHub's treasury, upgrade authority, and all operational decisions are independent.
- Nothing in this paper, in the EticaHub UI, or in EticaHub's contracts should be interpreted as a statement, commitment, or plan of the Etica Protocol core team.
If you are evaluating EticaHub, evaluate it on its own merits as a community-built dapp. Do not assume any guarantees inherited from the Etica Protocol itself.
2. Design Goals
- Make ETI more useful. Etica's native asset is ETI. We build tools (a DEX, a research hub, a bridge, and eventually a launchpad) whose cash flows and demand vectors grow ETI's utility as a byproduct.
- Introduce a reward / coordination token (ETX) without diluting ETI. ETX is a separate asset for EticaHub-specific cash flow capture: swap fees, pool-creation fees, and (later) launchpad fees. It does not replace, fork, or compete with ETI.
- Hub-and-spoke liquidity. Rather than fragment liquidity across arbitrary pairs, the DEX enforces that every pair shares a common reserve (ETX). This turns ETX into the unit of DEX-wide convertibility.
- Fair launch, no presale, no allocation. ETX is seeded entirely via on-chain AMM pools opened by the EticaHub treasury with its own capital. There is no private round, public round, airdrop, team allocation, advisor allocation, vesting cliff, or unlock schedule for ETX supply.
- No new emissions, ever. Every redistribution surface (stETX yield, Harvester, farms, buybacks) must be funded from existing DEX cash flows — LP fees, swap protocol fees, subscription revenue — and never by minting more ETX.
- Defer complexity with safety margins. Features that materially touch user funds (launchpad, bridge) are contract-complete but deliberately not activated until there is organic depth and demand. Features that touch only the treasury's own capital (Harvester, POL burns, stETX yield) ship earlier because the blast radius is internal.
3. ETX Token
Canonical identity:
| Property | Value |
|---|---|
| Name | EticaHub |
| Symbol | ETX |
| Decimals | 18 |
| Max supply | 100,000,000 (hard cap) |
| Mint function | none (supply is minted once at deploy) |
| EIP-2612 permit | yes |
| Pausable / Upgradeable | no |
| Blacklists / Freezes | no |
| Source | packages/contracts/src/etx/ETXToken.sol, open-source under MIT |
ETX is a standard ERC-20 with EIP-2612 permit support. There is no privileged mint authority, no proxy, no pause switch, no blacklist. Once deployed, the contract cannot be modified, and no additional ETX can ever be created.
Initial distribution (at genesis):
| Allocation | Amount | % of supply |
|---|---|---|
EticaHub treasury wallet (0xB2B4bC9d02970A55efF64C2D84c622c87967C19D) | 100,000,000 ETX | 100% |
From that wallet, a small fraction is immediately used to seed the two launch pools on EticaSwap (see §5). The remainder stays in treasury.
There is no presale, no IDO, no private round, no airdrop, and no public sale of ETX. The only way to acquire ETX post-launch is to swap for it on EticaSwap against ETI or EGAZ.
4. EticaSwap: Hub-and-Spoke DEX
EticaSwap is a Uniswap V2–style automated market maker adapted to enforce a single structural invariant: every pair must include ETX on one side. Users who want to trade, e.g., ETI ↔ EGAZ route through the ETX hub in two hops.
4.1 Contracts
| Contract | Purpose |
|---|---|
EticaSwapFactory | Deploys pair contracts via CREATE2. Enforces ETX hub rule. Holds the optional feeTo treasury and the trustedCreators allow-list (§16). |
EticaSwapPair | Constant-product pair (x·y=k), 0.30% swap fee, optional 0.05% protocol fee to treasury. |
EticaSwapRouter | User-facing router. Multi-hop swaps, add/remove liquidity, native-EGAZ wrapping via WEGAZ. |
WEGAZ | Canonical wrapped-EGAZ ERC-20, deposited/withdrawn at 1:1. Enables EGAZ to participate in ERC-20 pairs. |
4.2 Fees
| Fee | Rate | Who collects |
|---|---|---|
| Swap fee (LP) | 0.25% | LP providers of the pair |
| Swap fee (protocol) | 0.05% | EticaHub treasury (if feeTo is set) |
| Pool creation fee | 10,000 ETX per new pair | EticaHub treasury |
The pool-creation fee is charged in ETX, paid by the caller at the moment a new pair is created, and routed to feeTo (the treasury). Key properties:
- The fee is skipped when
feeTo == 0x0, so the factory can bootstrap before the treasury wallet is wired. This was used during launch day: the first two pools (ETI/ETX, EGAZ/ETX) were seeded free, then treasury wiring activated the fee for all subsequent pools. - Addresses in the
trustedCreatorsallow-list are exempt from the fee. This exists so the future launchpad (§16) does not double-charge its creators, since the launchpad already collects its own 250 ETX + 250 ETI fee per launch. - The fee is adjustable by the
feeToSettergovernance key viasetPairCreationFee(uint256). It may be raised, lowered, or set to zero. - The router transparently forwards the fee on first-time pair creation: users simply approve a slightly larger ETX budget to the router, no extra transaction is required.
4.3 Hub-and-spoke rationale
A typical AMM allows any token pair, which fragments liquidity across N² potential pairs for N assets. EticaSwap instead forces every asset to share a common quote (ETX). For N assets, this creates exactly N pools and guarantees every asset is reachable from every other asset through the ETX hub. The resulting ETX pool is, by construction, the DEX's deepest and most consequential market, aligning ETX with overall DEX health.
5. Launch Parameters (v1 Mainnet — Executed)
5.1 Economic parameters
| Parameter | Value | Notes |
|---|---|---|
| ETX supply | 100,000,000 | Fixed, ERC-20, MIT-licensed |
| ETX opening FDV (target) | ~$1,000 | Derived from pool math below |
| ETX opening price | $0.00001 / ETX | 77.75 ETI × $0.0372 / 289,230 ETX ≈ $2.89 / 289,230 ≈ $10⁻⁵ |
| ETI reference price | $0.0372 USDT | NonKYC exchange, reference only |
| EGAZ reference price | $0.0038 USDT | NonKYC exchange, reference only |
5.2 Initial liquidity (treasury-provided)
| Pool | Pair side | ETX side | Approx USD/side |
|---|---|---|---|
| ETI / ETX | 77.75 ETI | 289,230 ETX | $2.89 |
| EGAZ / ETX | 761 EGAZ | 289,230 ETX | $2.89 |
| Total ETX in LP at launch | — | 578,460 ETX (~0.58% of supply) | — |
| Total ETX in treasury post-seed | — | 99,421,540 ETX | — |
5.3 What "fair launch" means here
- No private sale. Zero ETX sold to anyone before mainnet.
- No public sale / presale / IDO / IEO. Zero ETX sold to anyone during launch.
- No airdrop. Zero ETX distributed for free.
- No team/advisor allocation. 100% of supply is in a single treasury wallet at genesis.
- No vesting schedule. No cliff, no unlock events, no emissions. The full 100M supply exists from block 0; there are no future "unlocks."
- The only way to acquire ETX post-launch is to swap for it on EticaSwap against ETI or EGAZ, at whatever price the AMM quotes at the moment of the trade.
This structure is chosen deliberately to minimize the set of plausible securities-law narratives around ETX. ETX is launched openly, at a small FDV, and the team acquires no special allocation.
5.4 Vercel-hosted UI
The full EticaHub frontend lives at https://eticahub.com, hosted on Vercel out of apps/web. The v1 genesis was executed via three operator-only deploy pages:
/deploy/etx— one-click MetaMask deploy ofETXToken. Minted 100M to the connected treasury wallet./deploy/swap— three-click deploy ofWEGAZ,EticaSwapFactory(etx),EticaSwapRouter(factory, wegaz)./seed/pools— four-step MetaMask flow (approve ETI, approve ETX, addLiquidity ETI/ETX, addLiquidityEGAZ ETX) that opened both launch pools.
Deploy pages are gated behind NEXT_PUBLIC_OPERATOR_UI=true and are not part of the public navigation. They are kept in the repo so that the full launch path is reproducible from source. Deployment artifacts (bytecode + ABI) are committed to the repo.
The public pages — /swap, /pool, /trade, /stake, /bridge, /research, /explorer, /status, /whitepaper — run against live mainnet contracts addressed from packages/shared/src/addresses.ts (canonical) and mirrored in Appendix A.
6. Research Hub
Etica's native proposal contract (EticaCoreProposals) tracks medical-research proposals and their authors on-chain. EticaHub exposes these proposals through a reader UI at /research/proposals (shipped with Phase 2), and adds two auxiliary primitives:
- Tipping. Visitors can tip a proposal author directly, in ETI or EGAZ, through a hosted contract that forwards to the author address recorded on-chain.
- Subscription. A
ResearchSubscriptioncontract sells monthly subscriptions in ETI that grant access to gated content via a simpleisActive(subscriber)view. Subscriptions are paid upfront, extensible, and non-transferable.
The Research Hub is live today, independent of the DEX, and does not require ETX to function. It is the first concrete revenue surface for EticaHub's treasury (subscription payments flow to treasury as ETI).
7. Trading Stack (Live)
EticaSwap's Market tab handles immediate one-shot swaps against the AMM. Everything beyond that — limit orders, stop-losses, dollar-cost averaging, grid bots, and Infinity Bot — lives in the Trading Stack, exposed at /trade/[token]. The stack is non-custodial, modelled on UniswapX, and uses contracts audited independently of anything EticaHub wrote.
7.1 Components
| Component | Audited by | Role | Status |
|---|---|---|---|
| Permit2 | OpenZeppelin, Trail of Bits, ABDK | One-time per-token approval. Signature-based allowances with per-user nonces and per-sig deadlines. | Deployed at 0x165F71f549415f44883e370Df12169Dd99570eE5 |
UniswapX DutchOrderReactor | Uniswap Labs audit set | Settles pre-signed Dutch orders. Pulls input via Permit2, swaps through the EticaSwap Router, pushes output to the maker. | Deployed at 0xE2fc7EAcEB0146560bfcf46CC5B167df60E970B8 |
EticaProtocolFeeController | — (~115-line contract, active at 10 BPS) | ETX-denominated protocol fee on UniswapX fills. Currently set to 10 BPS (0.10%); hard-capped at 100 BPS (1%) on-chain. | Deployed at 0xB9a4FbfC4cA598Be18e09bb9C0Cf19e4a1A4350a |
OrderRegistry | — (append-only log, no fund-handling) | On-chain append-only log of posted order envelopes + batch ids. Canonical data source for /trade/orders and keepers when the off-chain book is offline. | Deployed at 0xA6f3e48Cf31DcE3a8d36659f5bC6a61785c404a9 |
| Order book API + reference keeper | open source, apps/orderbook + apps/keeper | Stores signed orders (off-chain), serves them to fillers, and runs one reference filler. Anyone else can run a filler. | Live |
Full design and the case against each alternative (on-chain order book, custodial bot, etc.) lives in docs/TRADING.md.
7.2 Order types
| Mode | Semantics | Signatures per wallet popup |
|---|---|---|
| Market | AMM swap via the Router | 0 (regular on-chain tx) |
| Limit | Dutch order with decayStart == decayEnd == limit | 1 |
| Stop | Client-side scheduler submits a pre-signed order when the threshold hits | 1 |
| DCA | N scheduled buys | N (one popup, multicall EIP-712) |
| Grid (bounded) | N buys + N sells, linearly spaced inside [low, high] | 2N |
| Infinite grid ("Infinity Bot") | N buys below + M sells above a reference, geometrically spaced with percent-step | N + M |
7.3 Why the Infinity Bot exists
A bounded grid is brittle for a chain whose price can drift meaningfully over months. Once price walks past the user's high or low, the grid is dead until the user comes back and re-signs. The Infinity Bot replaces that fragility with geometric (percent-based) spacing around a reference price — R · (1 ± p)^k. The level structure is scale-invariant, the level count per side is tunable independently, and when price walks past the outermost signed level the user signs one more batch re-centred on the new price instead of re-authoring the whole strategy.
Guardrails baked into the builder:
- ≤ 50 levels per batch. Wallet UX degrades past ~30 signatures in one popup; 50 is a practical hard cap.
- Step < 50%. Geometric progressions with
p ≥ 50%collapse to zero or diverge within a handful of levels. - 7-day batch validity. Same expiry window as the bounded grid.
- Shared
gridBatchId. Every level of one batch carries one batch id so the orders dashboard and any future cancel-whole-batch flow can address them as a unit.
The full Infinity Bot spec — including the math, the risk table, the deliberate non-goals, and the re-sign policy — lives in docs/INFINITY_BOT.md.
7.4 Non-custodial guarantees
The guarantees EticaHub makes about every order type in the Trading Stack — Market, Limit, Stop, DCA, Grid, Infinity — are identical to those of the core DEX:
- EticaHub never holds user tokens or signing keys.
- Every fill is atomic: Permit2 pulls exactly the signed input, the Reactor swaps it, and the output lands in the user's wallet in the same transaction. There is no intermediate custody.
- Users can hard-cancel any signed order by submitting a Permit2 nonce increment on-chain from
/trade/orders. - If EticaHub's order book goes offline, every signed order remains valid until its own deadline; users can submit directly to the Reactor or run their own keeper from
apps/keeper. The on-chainOrderRegistryat0xA6f3e48Cf31DcE3a8d36659f5bC6a61785c404a9serves as the canonical backup data source.
7.5 Protocol fee posture
EticaHub charges two structurally distinct fees, on two different trade surfaces. They do not stack on the same trade.
| Surface | Fee | Destination | Mechanism |
|---|---|---|---|
AMM direct swap (/swap, /pool, router calls) | 0.30% to LPs + 0.05% protocol | LPs + treasury feeTo | Uniswap V2-style x·y=k fee math, hardcoded in EticaSwapPair |
UniswapX intent fills (/trade, keeper flows) | 0.10% (10 BPS) in ETX | Treasury | EticaProtocolFeeController — added to the resolved order as an explicit ETX fee output before the filler callback runs |
A trade sent to /swap pays the AMM fee. A trade sent to /trade pays the UniswapX fee. Both fee streams are denominated in economically sensible units: LP fees settle in the pair's native tokens (so LPs keep the mix they signed up for), and the UniswapX protocol fee settles in ETX (every pool is ETX-paired, so one leg of every trade is already ETX — no extra swap hop is needed to collect the fee).
The EticaProtocolFeeController owner (treasury wallet, rotating to the community multisig on the same schedule as feeToSetter in §4) can raise or lower the fee within a hard on-chain cap of 100 BPS (1%). It cannot exceed that cap under any circumstance. There is no owner path that can drain already-collected fees — the controller only decides what future fees are, not where existing balances go.
7.6 Keeper workflow
A reference keeper (apps/keeper) runs as a GitHub Actions cron (.github/workflows/keeper.yml) in dry-run mode by default. It reads open orders from the order book API (or the on-chain OrderRegistry as a fallback), simulates each fill locally against the live router, and — in "live" mode, which is not enabled by default — submits the winning fill transaction. The keeper is unprivileged: anyone can run a competing keeper, and the reactor accepts fills from any filler. The reference implementation exists so the system has a baseline liveness guarantee independent of any specific operator.
8. Liquid Staking (stETX) — Live
StakedETX is a minimal ERC-4626 vault for ETX deposits. It accepts ETX, issues stETX shares at a variable exchange rate, and redistributes a share of the treasury's LP-fee accruals to depositors — without minting any new ETX.
8.1 Design
| Aspect | Decision |
|---|---|
| Asset | ETX (0xa5A1Bc6307b0b87989B8456D4b35F88a68650044) |
| Share token | stETX (0x75d81d03a98CD9195593b8963aF17E13fAa70334) |
| Standard | ERC-4626 |
| Mint function | none (shares are minted against deposits at the current exchange rate) |
| Owner role | none — the contract has no Ownable inheritance; the reward-injection path is permissionless |
| Upgradeability | none (contract is final implementation) |
| Withdrawal lockup | none (fully liquid; redeem at will) |
| Source | packages/contracts/src/etx/StakedETX.sol |
8.2 Yield mechanics
stETX is a pure redistribution vault, not an emitter. The flow is:
- Treasury LP positions (ETI/ETX, EGAZ/ETX) accrue swap fees continuously as 0.30% of every trade.
- The off-chain keeper ("Harvester", §9) periodically collects a tranche of those accrued fees, converts them to ETX on the DEX, and calls
StakedETX.distributeRewards(amount)with the stETX share of the harvest. - The vault's
totalAssets()increases byamount, raising the exchange ratestETX → ETX. Every existing stETX holder's balance, denominated in ETX, grows pro-rata.
There is no emissions contract, no inflation schedule, no minting, and no new ETX supply. If LP fees stall, stETX yield stalls. If LP fees grow, stETX yield grows. The APY is a function of observed harvested yield over the trailing 7 days, rendered on /stake.
8.3 UI (/stake)
The /stake page provides:
- Deposit / Withdraw. Standard ERC-4626 flow. Withdrawals are instant and full-liquid.
- 7-day trailing APY. Computed from the exchange-rate trajectory (not advertised forward yield).
- Exchange-rate chart. The stETX/ETX ratio over time, visualizing accrual.
- Vault stats.
totalAssets,totalSupply, number of depositors.
8.4 Non-custodial guarantees
- There is no owner key. The vault has no
Ownableinheritance, no admin role, no pause function, no upgradeability. The only state-changing external entry points are the ERC-4626 deposit/withdraw paths anddistributeRewards. distributeRewardsis fully permissionless: any wallet may call it. Calling it with zero amount reverts withZeroAmount(); a nonzero call requires the caller to have approved the vault for the full amount and transfers that ETX into the vault in the same transaction — shares are never minted, only the exchange rate ticks up.- Withdrawals are not rate-limited, not paused, not subject to any cooldown.
8.5 Treasury commitment (stETX + LP)
The EticaHub treasury is the single largest committer of capital to the protocol. As of v1.2, the on-chain footprint across stETX and LP positions is approximately:
| Position | Treasury holding | ETX-equivalent exposure |
|---|---|---|
| stETX shares (liquid) | ~11.0M stETX | ~11.0M ETX at NAV |
EticaStableSwap LP — locked 10y in LiquidityTimelock10y (§10.2) | 100% of seed | ~30M ETX (15M ETX + 15M stETX) |
| EticaSwap V2 — stETX/ETX LP | ~85.8% of pool | ~7.8M ETX + ~6.95M stETX |
| EticaSwap V2 — EGAZ/ETX LP | ~52.3% of pool | ~0.47M ETX side |
| EticaSwap V2 — ETI/ETX LP | ~7.2% of pool | ~0.13M ETX side |
These figures are read live from chain and will drift block-to-block as fees accrue, public LPs come and go, and the harvester redistributes; the structure is what is fixed, not the exact numbers. Concrete implications:
- Real floor on TVL. The
/stakepage does not open with an empty vault, and the V2 + stableswap pools do not open with empty books. APY math, exchange-rate history, and routing depth all have a meaningful denominator from the first block. - Skin-in-the-game signal. The treasury is the largest stETX holder, the dominant LP on every ETX-paired pool, and the only LP on the stableswap. Every design decision about these venues applies to the treasury first — there is no separate "team pool" on better terms.
- No special privileges. Treasury stETX shares and treasury LP tokens are identical to any other holder's. Treasury cannot front-run distributions, cannot block withdrawals, cannot mint extra shares, and cannot pull anyone else's liquidity. The
distributeRewardspath is permissionless and capped by the fees the harvester actually collected. - Dilutive to treasury by design. As outside stakers deposit and outside LPs join, treasury's proportional claim on the 10% harvest bucket and on swap fees falls. This is the intended direction: the seed exists to bootstrap credibility, not to lock in a permanent treasury revenue line. The 40% treasury bucket and the 40% POL burn (see §9) are unaffected by participation rate.
- Stableswap LP is locked, the rest is liquid. Only the treasury's stableswap LP shares are locked (10 years, principal only — fees stream out continuously via
StableSwapHarvesterAdapter; see §10.2). The stETX position and the V2 LP positions are fully liquid under ERC-4626 / ERC-20. Any intent to unwind would be fully visible on-chain asRedeem/Burnevents. Public LPs are unaffected by any of these treasury decisions.
9. Treasury Harvester & POL Flywheel
TreasuryHarvester is an on-chain delegation contract that formalizes how the treasury's own LP-fee accruals are redistributed. It exists so the keeper that performs the redistribution can run as a thin, inexpensive EOA with narrowly scoped authority, rather than as the treasury wallet itself.
9.1 Why a delegation contract
Before the Harvester, redistributing LP fees required the treasury EOA to sign a sequence of removeLiquidity → swap → transfer → distributeRewards transactions. That forced the treasury key to be online whenever a harvest was due, which is both operationally fragile and a key-compromise hazard.
The Harvester inverts this: the treasury one-time-approves the Harvester for ETX + both LP tokens, after which harvest() is permissionless — any wallet can call it, gated only by a 1-day cooldown and a small caller-tip incentive (PR #109). The original keeper-EOA design has been retired. The contract still cannot touch treasury ETX for anything except the 10/10/40/40 split encoded in it.
9.2 10/10/40/40 split
Every successful harvest() call partitions the freshly-collected fee tranche (in ETX-equivalent) into four destinations:
| Bucket | Share | Destination |
|---|---|---|
| stETX yield | 10% | Forwarded to StakedETX.distributeRewards on the live 0x75d8…0334 vault. |
| Farms / LP incentives | 10% | Forwarded to live ETXFarms (0xEBAf…c6aD), three-pool weighted emissions (60/25/15). |
| Treasury operations | 40% | Retained in treasury for audits, infra, community grants, reserves |
| POL burn | 40% | Paired with ETI/EGAZ and added to the ETI/ETX and EGAZ/ETX pools as LP, then the resulting LP tokens are sent to the burn sink — permanently locked liquidity |
9.3 The POL burn is the flywheel
The 40% POL burn is the mechanism that makes every swap structurally accretive to pool depth forever. The fees leave the treasury, buy LP tokens, and burn them — depth stays in the pool and can never be withdrawn. Three consequences:
- Slippage curves improve monotonically. Each harvest deepens the ETI/ETX and EGAZ/ETX pools, reducing slippage for every future trade.
- Depth is independent of any operator. Because the LP tokens are burned, not held, no future EticaHub key rotation, key loss, or governance action can ever remove the burned depth.
- Volume begets depth begets volume. Higher depth supports larger trades, larger trades generate more fees, more fees feed more harvests, more harvests burn more POL. The loop is self-reinforcing and requires no emissions to sustain.
9.4 Status
The Harvester is deployed, wired, and live on Etica mainnet at 0x5d8B1138559fADc3Bb90e8317eB16922eAa076f5. The keeper role was retired in favour of a permissionless v2 (PR #109) — any wallet may now call harvest(), gated only by a 1-day cooldown and a small caller-tip incentive. The daily GitHub Actions workflow (.github/workflows/harvest-live.yml) calls it on a 24h cadence; if it is ever down, anyone can poke the contract directly. There is also a manual "Harvest now" button on /admin/harvester for the treasury operator.
A second fee feed was added in §10 (Phase 0 — EticaStableSwap): the stableswap pool's admin-fee slice flows through StableSwapHarvesterAdapter, which redeems the stETX leg into ETX via the vault and forwards a pure ETX lump into TreasuryHarvester.harvestExternal(amount). Same 10/10/40/40 split applies. The two feeds (V2 LP-burn and stableswap admin-fee) compose seamlessly because both terminate in the same harvester.
9.5 Cron + manual fallback
harvest() runs on three independent triggers, in priority order: (i) the daily GitHub Actions workflow harvest-live.yml, which calls a small EGAZ-funded EOA to invoke harvest() once the cooldown elapses; (ii) any third party wallet, who pays gas and pockets the small caller-tip; (iii) a manual "Harvest now" button on /admin/harvester that the treasury operator can fire ad-hoc. None of the callers hold ETX/ETI/LP tokens — harvest() is bounded by the on-chain 10/10/40/40 split, so a compromised cron key can only burn gas, not steal funds.
9.6 ETXFarms — the farms-bucket consumer
The 10% "farms" slice of every harvest cycle is consumed by the ETXFarms contract (packages/contracts/src/etx/ETXFarms.sol, 25 unit tests in test/etx/ETXFarms.t.sol, all green). ETXFarms is an accumulator-style LP staking contract — the MasterChef pattern, but without emissions. It only distributes ETX that the Harvester actively pushes in.
Architecture — pull-based, no vesting. The Harvester calls farms.distributeRewards(amount) at the end of each cycle (permissionless entry point, symmetric with StakedETX.distributeRewards). Rewards are written directly into the per-pool accRewardPerShare accumulator with no drip/vesting window. Stakers see rewards spike on harvest days and flat between them. This is deliberate: it matches the cadence the Harvester actually emits at, and avoids the timing-attack surface that linear-drip models like Synthetix's StakingRewards carry (jump in before a big notify, jump out after).
Pool set at launch. Two pools, both seeded with the treasury's genesis LPs:
| pid | LP token | Default weight |
|---|---|---|
| 0 | EticaSwap ETI/ETX | 5000 |
| 1 | EticaSwap EGAZ/ETX | 5000 |
Weights are allocPoint values (sum = 10,000 by convention). The owner can addPool(lp, allocPoint) to register new pools, or setAllocPoint(pid, newAllocPoint) to retune weights. The sum of weights is capped so no pool can starve the others permanently.
Reward split math. Every distributeRewards(amount) call loops over pools: poolShare = amount * pool.allocPoint / totalAllocPoint. If a pool has zero staked LP at the moment of distribution, its share is routed to the fallback recipient (treasury, by default) rather than sitting idle forever. If a pool has stakers, pool.accRewardPerShare += poolShare * 1e18 / pool.totalStaked, the standard MasterChef formula, so a late joiner cannot claim a pro-rata share of rewards distributed before their deposit.
User surface — no lockup, no penalty.
deposit(pid, amount)— auto-harvests any pending rewards into the user's ETX balance, then creditsamountLP to their stake.withdraw(pid, amount)— same auto-harvest, then returnsamountLP.harvest(pid)— claim pending rewards without touching the LP position.emergencyWithdraw(pid)— panic exit that returns all staked LP and forfeits pending rewards. Exists so a user can always get their LP back even if reward-accounting is somehow stuck.- No deposit fee, no withdrawal fee, no cooldown. Matches the rest of the stack's "non-custodial by default" posture.
No emissions, ever. ETXFarms holds no mint authority on ETX (ETX is a fixed-supply ERC-20 with no minter). It can only distribute ETX that was transferred into the contract and then accounted for via distributeRewards. The total supply cap at 100M ETX is unaffected by farms going live — farms redistribute existing protocol fees, they do not create new supply.
Owner scope. The contract owner can register new pools, retune weights, and set the fallback recipient. The owner cannot steal staked LP (rescueToken is explicitly guarded against rescuing any registered LP token or the reward token ETX). The owner cannot pause withdrawals. The owner cannot change reward semantics retroactively. Owner will be rotated to the same multisig that holds feeToSetter and TreasuryHarvester.owner as part of the near-term multisig migration (§20).
Audit posture. Forge unit tests cover: metadata and shape, owner-only gates, deposit/withdraw mechanics, accumulator math for the solo-staker and two-staker-pro-rata cases, multi-harvest sequencing, late-joiner protection, empty-pool fallback routing, emergency withdrawal, rescue guards, and permissionless distributeRewards parity. No external audit has been commissioned for v1.1 — same posture as stETX and the Harvester. External review will be scoped once the broader v1.1 surface stabilizes.
Deployment. Operators deploy via /deploy/farms (browser-based, signs from the connected wallet). Post-deploy: paste the address into packages/shared/src/addresses.ts → DEPLOYMENTS[61803].etxFarms, call addPool(ETI/ETX LP, 5000) and addPool(EGAZ/ETX LP, 5000), then call TreasuryHarvester.setFarms(etxFarms) to route the 10% farms bucket. /farms will light up the moment the address is non-zero.
10. EticaStableSwap (Phase 0 — the V3 pool)
Naming note: EticaSwap V1 was the original Etica-side AMM; EticaSwap V2 is the hub-and-spoke constant-product DEX described in §4 (still the venue for ETI/ETX, EGAZ/ETX, etc.); EticaStableSwap is the protocol's V3 pool — a separate, rate-aware Curve-style AMM dedicated to correlated assets (today stETX↔ETX, Phase 1 adds wETI/ETX). Where this paper says "V3 pool," it means EticaStableSwap.
EticaStableSwap is a rate-aware, Curve-style AMM purpose-built for stETX↔ETX. It exists because a constant-product V2 pool quotes the wrong price the moment stETX's NAV drifts above 1.0 ETX, and a naïve Curve pool would drift out of range as the vault accrues yield. EticaStableSwap reads stETX.convertToAssets(1e18) directly on every swap so the curve auto-tracks NAV forever — no manual rebalancing, no LP rotation, no stale parameters.
It also closes a strategic gap: stETX↔ETX is the canonical exit highway for the protocol's liquid-staking surface (§8). Routing it through the deepest, lowest-slippage venue keeps stETX's peg credible.
10.1 Architecture
Three contracts working together:
| Contract | Role |
|---|---|
EticaStableSwap | Rate-aware Curve-style pool. Holds reserveEtx + reserveStEtx. Live-NAV-quotes via stETX.convertToAssets. Anyone can add or remove liquidity. |
LiquidityTimelock10y | Holds only the treasury seed's LP shares for 10 years. Public LPs are unaffected — the lock is on the treasury, not the pool. |
StableSwapHarvesterAdapter | Permissionless. Skims the pool's accumulated admin fees, redeems the stETX leg into ETX via the vault, forwards the pure ETX lump into TreasuryHarvester.harvestExternal(). |
The AMM contract is final, ownerless from a fund-custody perspective (the only owner-gated functions are parameter knobs: rampA, setSwapFee, setAdminFee, setAdminFeeRecipient), and source-public under MIT (packages/contracts/src/stableswap/EticaStableSwap.sol).
10.2 Treasury seed: 30M ETX, locked 10 years
The pool is seeded with 15,000,000 ETX + 15,000,000 stETX (~30M ETX-equivalent at NAV) drawn from the treasury. The seed is irrevocable: the resulting LP shares are minted directly to LiquidityTimelock10y, which has no early-unlock path. The unlock timestamp is 2036-05-01 08:17:29 UTC.
Key asymmetry: the lock is on the treasury, not on public LPs. Anyone can deposit on /pool and withdraw any time. The treasury chose to immobilize its own seed for 10 years; nobody else has to. This is the inverse of a typical "team unlock" schedule — the protocol's primary liquidity is the most locked, not the least.
The seed is also not counted in circulating supply for market-cap purposes (§19 / /api/v1/tokens): the locked-LP wrapper + treasury holdings are subtracted, in line with CoinGecko/CMC convention.
10.3 Fees and flywheel
Every swap pays a 4 bps fee (0.04%, Curve-standard for stable pairs). Of that fee, 50% is retained in the pool (grows LP share value for everyone, including the locked treasury seed) and 50% is the admin slice (streams permissionlessly to StableSwapHarvesterAdapter).
┌───────── EticaStableSwap (stETX/ETX, A=200, 4 bps fee) ─────────┐
│ │
│ 50% of fee → grows LP value (incl. 10y-locked treasury shares) │
│ 50% of fee → admin accumulator │
│ │ │
└───────────────────────│──────────────────────────────────────────┘
▼
StableSwapHarvesterAdapter (permissionless claim)
│
▼ redeem stETX → ETX via vault (1:1 NAV)
TreasuryHarvester.harvestExternal(etxAmount)
│
▼ 10/10/40/40 split (§9)
stETX vault │ ETXFarms │ POL burn │ treasury
The locked LP shares and the admin fees are two separate value streams: locking the principal does not lock the fees. The treasury can claim the admin slice continuously while the seed itself stays immobilized. Public LPs are not entitled to admin fees — they earn from the LP-retained 50% (and from stETX NAV drift on the stETX-leg side of the pool).
10.4 Why a separate AMM
| EticaSwap V2 | EticaStableSwap | |
|---|---|---|
| Curve | constant product (x · y = k) | Curve-style invariant + rate adjustment |
| Fee tier | 0.30% | 0.04% |
| stETX support | possible but mis-priced | native (getRate in every quote) |
| Slippage at NAV | ~tens of bps for $1k+ trades | sub-bp for $50k+ trades |
| Treasury position | LP tokens harvested via burn-route | LP tokens locked 10y; fees streamed via adapter |
| Public LP lock | none | none |
The two AMMs cohabit on /swap: stETX↔ETX direct routes through the stableswap; everything else goes through V2. The router checks getDy() on the stableswap when applicable and falls back to V2 if the stableswap is not deployed or the requested pair is not supported.
10.5 Public LPs (/pool)
/pool shows two cards: the V2 add/remove-liquidity flow (existing) and a public stableswap card (new). Public LPs deposit ETX + stETX, receive LP shares directly to their wallet, and can withdraw at any time via removeLiquidity (pro-rata, both legs) or removeLiquidityOneCoin (single-asset, with curve-derived slippage). No emissions on this pool — public LPs earn from fees and stETX NAV drift only. (Phase 1 will introduce farm emissions on the wETI/ETX pool where volume justifies them.)
10.6 Status surface
/status exposes live stableswap data via /api/v1/tvl (TVL = reserveEtx + reserveStEtx · getRate / 1e18) and /api/v1/liquidity-flow (counts AddLiquidity/RemoveLiquidity/RemoveLiquidityOne events as a separate per-pool entry alongside the V2 Mint/Burn flow). The 30M ETX seed appears in both endpoints. /admin/stableswap is the operator panel for permissionless claimAdminFees/harvest and owner-gated rampA/setSwapFee/setAdminFee/setAdminFeeRecipient/lockedWithdraw (only fires after 2036).
11. EticaHub Explorer
A skinny on-chain explorer lives at /explorer, powered by the same JSON-RPC node the rest of the site uses plus a lightweight JSONL indexer (see §11.3). It exists so that a user clicking a tx hash from /swap, /trade, or the Telegram buy bot (§13) lands on a first-party page under the EticaHub domain rather than an off-site explorer.
11.1 Pages
| Route | Purpose |
|---|---|
/explorer | Latest blocks and transactions |
/explorer/block/[n] | Block detail: header, tx list, gas used |
/explorer/tx/[hash] | Tx detail: decoded calldata, decoded event logs, status, gas |
/explorer/address/[addr] | Address detail: balance, token balances, recent txs, ERC-20 transfers |
/explorer/token/[addr] | ERC-20 token page: metadata, holders, transfers, price, OHLCV |
/explorer/gas | Live gas tracker: rolling fee stats over recent blocks |
/explorer/verify/[addr] | Contract verification submission |
11.2 Sourcify-backed verification
Contract source verification uses Sourcify as the canonical source of truth. Users (or operators) submit a compilation artifact + sources at /explorer/verify/[addr]; the explorer pushes them to Sourcify, which publishes a verified metadata record. The explorer then reads back the verified ABI + sources to decode calldata and events on the tx and contract pages. There is no EticaHub-owned verification registry — we rely on Sourcify so verifications are portable to any other explorer that reads from Sourcify. See docs/SOURCIFY_CHAIN_ADD.md for how chain 61803 was added.
11.3 On-chain + JSONL indexer
The explorer reads from two data sources, in order of preference:
- Gzipped JSONL shards produced by a GitHub Actions cron at
.github/workflows/explorer-indexer.yml. The indexer walksSwapand ERC-20Transferlogs in block-range batches, writes them to size-capped JSONL shards (apps/indexer/data/*.jsonl.gz), and commits the shards back to the repo. This makes address + token pages fast for historical data without hammering the RPC. - Live RPC fallback. If a shard is missing or malformed, the reader falls back to
eth_getLogson the live RPC. The fallback is silent to the user and intentionally conservative (narrow block ranges, bounded retries) so a bad shard never breaks a page.
12. Public Market Data API
/api/v1/* is a small public read-only HTTP API that exposes the same data the UI uses, in a format aggregators (CoinGecko, CMC, DEX Screener, GeckoTerminal) can ingest directly. No auth, JSON only, CORS-enabled.
| Endpoint | Returns |
|---|---|
/api/v1/pools | List of EticaSwap pools with reserves, 24h volume, TVL |
/api/v1/pairs | Same, canonical-form pair ids |
/api/v1/pairs/{address} | Pool detail (reserves, reserves-USD, last-price, fee tier) |
/api/v1/pairs/{address}/volume | 24h rolling volume |
/api/v1/pairs/{address}/candles | OHLCV candles (1m, 5m, 1h, 1d) |
/api/v1/tokens | List of tokens with latest prices |
/api/v1/tokens/{address} | Token detail (price, market cap, supply, FDV) |
/api/v1/health | RPC health + indexer freshness |
Submission briefs for the major aggregators are in docs/aggregators/ — one markdown file per listing process (CoinGecko, CMC, DEX Screener, GeckoTerminal) with the exact payload each service expects.
13. Community Buy Bot
A Vercel-cron-hosted Telegram bot posts every swap on every ETX pair to the EticaHub community group. It is a downstream consumer of the same RPC + indexer layer as the explorer; it does not touch user funds and has no privileged access.
13.1 Architecture
The bot lives as a single Next.js route (apps/web/src/app/api/cron/buybot/route.ts) invoked by Vercel's cron scheduler at 1-minute cadence. Each invocation:
- Reads the last-scanned block cursor from Vercel KV.
- Calls
eth_getLogsfor everySwapevent on every ETX pair betweenlastScannedBlock + 1andlatest. - Snapshots each pool's post-swap reserves + relevant token metadata (name, symbol, supply).
- Pulls USD anchors from NonKYC's public API (ETI/USDT, EGAZ/USDT spot).
- Derives ETX/USD from the first pool in the window that pairs ETX with ETI or EGAZ.
- For each swap, renders a message with the side bought, amounts in and out, ETX + USD prices, market caps of both tokens, and links to the
/explorer/tx/[hash]and/explorer/block/[n]pages. - POSTs to
api.telegram.org/bot<token>/sendMessage. - Writes the new block cursor.
13.2 Safety rails
- Per-swap dedup. Every posted swap is claimed in KV by
(txHash, logIndex)with a 24-hour TTL. A pre-check skips any swap that was already claimed, even if the block cursor rewinds. The claim is written after a successful Telegram send, never before, so a failed send never locks a swap out of retries. Transient KV failures (read or write) are swallowed; the worst case is one duplicate post once KV recovers. - Min-USD floor. Swaps below a configurable USD notional are skipped to avoid spam on dust trades.
- No private keys. The bot holds no funds, signs no transactions, has no on-chain authority.
- Failure mode: silent. A missing env var, a dead RPC, a Telegram rate-limit, or an indexer stall all degrade to "no messages posted this minute". The cron simply re-runs on the next tick and catches up.
13.3 Why Vercel cron instead of a long-lived WebSocket
A WebSocket listener is the canonical architecture for a buy bot and is ~30s faster, but it requires always-on hosting (Fly, a VPS, etc.) and its own monitoring. Vercel cron is $0, redeploys on every git push alongside the rest of the site, and logs every invocation in the Vercel dashboard. The ~60s lag is acceptable for a community ticker.
14. EticaLabs — AI Molecular Intelligence Workstation
EticaLabs (/labs) is a community-built molecular-design surface that turns a plain-English research goal into a folded 3D structure, an AI structural analysis, and a continuously-running research loop. It is built entirely on free infrastructure (Groq free tier, NVIDIA NIM free tier, Upstash Redis free tier, GitHub Actions free tier, Vercel free tier) and ships zero new emissions, zero treasury cost, and zero gated content — every surface is fully public.
14.1 The pipeline
prompt
│
▼
Groq llama-3.1-8b-instant ─── plan (hypothesis, approach,
│ success criteria, risks,
│ 3 candidate sequences,
│ references)
▼
Engine cascade ─── ESMFold (HF) → ESMFold (NVIDIA) → Chai-1 → Boltz
│ (Auto picks first available; user can pin one)
▼
PDB ─── 3Dmol.js (browser WebGL) → user view, mutate, export, share
│
▼
Groq analysis ─── secondary structure, residue patterns,
predicted function, stability
Each step is its own free API call. No paid services. No long-running infra.
14.2 Research planning layer
Before any fold runs, /api/labs/plan fetches PubMed (NCBI E-utilities, free, no auth) and RCSB PDB (free public search) for the top-5 most relevant papers and solved structures. Both are passed into Groq's planning prompt so each candidate sequence cites prior work by [N] index and explicitly differentiates itself from cited references rather than inventing in a vacuum. The /labs UI surfaces both as a clickable Related research panel.
14.3 Engine roster
| Engine | Provider | Free-tier limit | Status |
|---|---|---|---|
| ESMFold (Hugging Face) | HF inference router | unlimited (when serving) | Deprovisioned upstream; cascade falls through automatically |
| ESMFold (NVIDIA NIM) | build.nvidia.com | 1,000 calls/month | Live, default cascade target |
| Chai-1 | Replicate | trial credits | Lights up when REPLICATE_API_TOKEN is set |
| Boltz-1 | Replicate | trial credits | Lights up when REPLICATE_API_TOKEN is set |
The fold endpoint reports an engine trace on every call (which engines were tried, their status, their duration) so users can see exactly where the cascade landed.
14.4 EticaLabs Autopilot — public research feed
/labs exposes a "Run continuously on EticaLabs" submit panel alongside the direct-fold and create-plan buttons. Submissions land in a Redis-backed queue (labs:queue:pending list, labs:feed sorted set, labs:job:<id> blobs with 30-day TTL). A GitHub Actions cron — .github/workflows/labs-autopilot.yml, every 10 minutes, free tier — wakes the worker, pops the oldest pending job, runs plan → fold → analyse → mutate for N iterations (1-5, user-selected), and writes results back to Redis. The worker endpoints (POST /api/labs/queue/pop, POST /api/labs/queue/[id]/update) are gated by a shared-secret bearer token (LABS_AUTOPILOT_TOKEN, constant-time compared).
| Surface | Behavior |
|---|---|
/labs/feed | Public list of every submitted run with status (pending / running / done / error), prompt preview, relative timestamps, and the pending-queue depth. |
/labs/feed/[id] | Full run view: plan + references, every candidate as its own card with sequence, rationale, AI analysis, score, inline 3Dmol viewer, and per-candidate Download PDB. Event timeline (queued → started → planned → folded → analysed → mutated → iteration_done → completed). Auto-polls every 5s while pending/running, stops on terminal states. Share button copies a deep-linkable URL. |
Submissions are fully open — no auth, no payment, no whitelist. Per-IP rate limit (5 submissions/hour) and a 400-character prompt cap keep abuse bounded. Content safety is delegated to Groq's existing safety prompt at planning time; jobs whose plans fail safety simply error out and are visible as such on the public feed.
14.5 Why "run continuously" is the point
The direct-fold UX (/labs → "Generate molecule") gives the user one folded structure per click. The autopilot loop turns the same prompt into N rounds of plan → fold → analyse → mutate, each iteration seeded from the previous round's top scorer. Mutations are score-blended (Groq structural fit 60% / pLDDT confidence 40%) with iteration early-stop when no further improvement is found. The result is a small ranked log of what the agent tried, persisted publicly for 30 days, so the lab feels alive — users coming back to /labs/feed see real work product, not a stale demo.
14.6 Cost profile
Per autopilot run (3 iterations, 3 candidates per iteration):
| Service | Calls | Free-tier headroom |
|---|---|---|
| Groq (planning + analysis + mutation) | ~12 | Groq free tier: 30 RPM, 14,400 RPD |
| NVIDIA NIM (ESMFold) | ~9 | 1,000 calls/month |
| Upstash Redis (queue + storage) | ~30 | 10,000 commands/day |
| GitHub Actions (worker cron) | 1 job, ~60s | 2,000 minutes/month |
Steady-state capacity at zero cost is roughly ~10-15 user submissions per day before any free tier saturates — plenty of headroom for community-driven exploration, and the limits scale linearly with paid tiers if demand ever justifies it.
14.7 Non-custodial / non-financial posture
EticaLabs touches no user funds and creates no on-chain transactions. It is a pure research surface — Groq calls, ESMFold calls, public reads from PubMed/RCSB, and a Redis-backed queue. Nothing in EticaLabs interacts with ETX, stETX, the DEX, the harvester, or any treasury surface. It exists because EticaHub is community-built and the community wanted a research workstation; it stays free because the architecture is built on free tiers from day one.
15. EticaResearchMarkets — Permanent Floor Pull via Locked POL
EticaResearchMarkets is a permissionless, singleton-based launchpad for ERC-20 tokens that fund scientific research. Each token represents a research project; supporters buy in to fund the work; the price is discovered automatically on an internal constant-product bonding curve against ETX; the researcher receives a share of trading fees; and a permanent, non-withdrawable share of every trade compounds the curve's ETX-backed floor forever. This section describes the contract design, the fee split, the graduation flow, the sunset flow, the auto-Sourcify property, and how the launchpad slots into the rest of EticaHub without altering any existing surface.
15.1 Why a separate launchpad for research
The deferred launchpad described in §16 (ProposalTokenFactory) is a curated surface — only the proposer of an Etica Protocol research proposal can launch a token, the supply is split across token/ETX and token/ETI pools, and there is a 250 ETX + 250 ETI launch fee. That model is appropriate for established proposals with author identity and on-chain provenance, but it is not appropriate for the long tail of small, exploratory, or independent research efforts. EticaResearchMarkets is the complement to that design: permissionless launch, evidence-required at deploy time, singleton liquidity, no LP positions for anyone to extract, and a fee split engineered so the curve's floor only rises.
The two coexist. ProposalTokenFactory (§16) remains the on-chain author-attested launch path when it activates. EticaResearchMarkets is the open path that lives alongside it.
15.2 Architecture — one singleton, many markets
There are exactly two contracts in the launchpad: EticaResearchMarkets (the singleton) and ResearchToken (the per-launch ERC-20 template). All liquidity, all accounting, and all routing live in the singleton. There are no per-token pools, no LP tokens, and no external AMM positions to manage.
| Component | Role |
|---|---|
EticaResearchMarkets | Singleton. Holds all ETX reserves. Mints/burns each ResearchToken against an internal accounting reserve. Routes every trade. Holds the shared treasury seed (5M ETX, see §15.6) as the free-pool backstop. Emits Launched, Bought, Sold, Graduated, Sunset. |
ResearchToken | Plain ERC20Permit. Constructor stores name, symbol, image, description, website, telegram, x, evidenceURI, market, researcher. No Ownable, no AccessControl, no pause, no transfer tax, no blacklist, no upgrade path, no delegatecall. mint and burn are restricted to the market (the singleton). |
Because ResearchToken is a fixed template with no varying logic — only the constructor strings differ across launches — its bytecode is deterministic across every launch. This is the property that makes auto-Sourcify verification (§15.5) feasible.
15.3 The bonding curve and per-token solvency
Each market keeps its own pair of virtual reserves: (etxReserve_i, tokenReserve_i) with k_i = etxReserve_i * tokenReserve_i. A buy adds ETX to etxReserve_i and mints the constant-product delta of ResearchToken_i to the buyer; a sell burns tokens from the seller and pays out the constant-product delta of ETX from etxReserve_i. The math is identical to a Uniswap V2 pair, but there is no LP token, there is no external pool contract, and every market's reserves are physically scoped to that market in the singleton's storage.
This gives per-token solvency: at any block, the ETX a market can pay out to its sellers is bounded above by the ETX that market has received from its buyers (plus the in-curve fee accrual described in §15.4). No market can drain another market. The shared 5M-ETX free pool is a discovery backstop (§15.6), not a cross-collateral source.
A market enforces three additional bounds at the curve layer:
- Per-tx 5% cap: no single trade can move more than 5% of the curve's ETX reserve in either direction.
- TWAP deviation guard: a single trade's executed price cannot deviate by more than a configured threshold from the curve's recent EMA. This makes the curve resistant to flash-loan-style instantaneous wicks.
- EOA-only first 100 blocks: the first 100 blocks after launch are restricted to
tx.origin == msg.sender, which blocks contract-funded sniping bots without preventing real users from interacting via wallets.
15.4 Fee split — C-with-lock, 80 / 10 / 0 / 10
Every trade pays a 1% fee in ETX. The fee is split at trade time:
| Slice | Destination | Property |
|---|---|---|
| 80% | Stays in the curve's etxReserve_i | Non-withdrawable by any actor, for any reason. This is the permanent floor pull. |
| 10% | Buys ETI on the existing ETI/ETX EticaSwap pool, pairs the resulting ETI back to ETX, and sends the resulting LP token to 0x000…dead | Permanent POL burn on ETI's market. Same mechanism the TreasuryHarvester (§9) uses. |
| 0% | Treasury | The launchpad takes no protocol-level cut. |
| 10% | Researcher (the address that called launch()) | Funds the work. |
The critical property is the 80% slice. There is no admin function on the singleton that can remove ETX from etxReserve_i. Sells pay out from this reserve, buys add to it, and the 80% fee slice compounds on top. The curve's floor — the ETX price a holder receives if they sell back to the curve — is therefore monotonically non-decreasing in the absence of net sell pressure, and structurally rising in the presence of any trading activity at all. This is what "permanent POL lock" means in a singleton architecture: there is no LP token to burn, because there is no LP token at all; the lock is enforced by the contract not having a withdrawal path.
The 10% ETI LP burn ties launchpad activity to ETI's market in the same way TreasuryHarvester (§9) ties DEX activity to ETI's market. Every research-market trade structurally deepens ETI's liquidity. There is no scenario where launchpad volume strengthens spoke tokens at ETI's expense.
15.5 Auto-Sourcify verification on every launch
Research tokens are funding instruments. Buyers are trusting that the token they hold has no hidden mint, pause, transfer tax, blacklist, or upgrade hook. The most reliable way to demonstrate that — short of a per-token audit — is to:
- Freeze
ResearchTokenbehind a single, audited template (done — see §15.2), and - Have an independent third party confirm that every on-chain token's bytecode is an exact match of that template.
EticaHub does (2) automatically. A canonical Sourcify standard-input.json for ResearchToken is committed at packages/contracts/sourcify-bundles/ResearchToken/. A stateless GitHub Actions cron at apps/research-markets-sourcify/ runs every 10 minutes: it reads Launched events from the singleton, asks the Sourcify server which tokens are already verified, and POSTs the canonical bundle for any token that isn't. The worker is fully idempotent — Sourcify itself is the deduplication source, so partial failures and retries are safe. Researchers do nothing.
Until chain 61803 is added to the public Sourcify server (argotorg/sourcify#2758), the cron logs the expected 400/422/501 response and exits clean, and the launchpad UI shows Chain pending Sourcify support. The existing manifest-based explorer at eticahub.com/explorer continues to show source for every verified contract via the same bundle. The Sourcify pipeline is strictly additive — a second, independent verification surface that activates the moment upstream support lands.
This is an explicit anti-MEV property. Unverified tokens can quietly include backdoor mint, transfer-block, or pause hooks that drain liquidity once price discovery starts. Bytecode-equivalence with the verified template makes that class of attack impossible to hide. Full design lives in docs/RESEARCH_MARKETS_SOURCIFY.md.
15.6 The 5M ETX seed and the free-pool backstop
The EticaHub treasury seeds the singleton with 5M ETX at deployment. This seed sits inside the singleton as a free pool — it is not collateral underneath any individual market, but it serves as a discovery backstop. New markets bootstrap pricing against the free pool; over time the per-market curves grow their own etxReserve_i from buyer ETX and from the 80% in-curve fee slice; if a market sunsets (§15.8), whatever ETX it represented is recycled back to the free pool.
The seed is not the upper bound on launchpad TVL — that bound is total ETX in circulation. As activity accumulates, the launchpad's total ETX (free pool plus all per-market reserves) can rise indefinitely, capped only by the 100M ETX fixed supply at the protocol level. There is no path by which the seed shrinks below the 5M deposited amount in steady state, because:
- The 80% in-curve fee slice compounds inside the per-market reserves, not the free pool, but none of it ever leaves the singleton.
- Sunset returns recycle dormant ETX to the free pool, not away from it.
- The only outflow from the singleton is sellers being paid the constant-product delta from their market's own reserve.
15.7 Graduation — UI only, no migration, no LP
When a market's etxReserve_i crosses 100,000 ETX, the singleton emits Graduated(token) and the launchpad UI tags the market as graduated. There is no contract migration. No LP gets created, no liquidity is moved, no token state changes. The curve remains the only venue for the token, and the singleton remains the only venue for routing.
What changes is purely user-surface:
- The graduated token is listed in
/swap's token picker. /trade/[address]resolves the graduated token's curve price via the singleton's quoter view and posts DutchOrder fills that the keeper executes against the curve. The same UniswapX-style trading-stack surfaces (Market, Limit, Stop, DCA, Grid) become available against the graduated token.- The launchpad detail page tags the token with a Graduated badge and adds a View in /swap link.
This design — UI-only graduation against a singleton bonding curve — preserves the per-token-solvency, no-LP-position, and floor-pull properties of the launchpad while extending the trading surface for tokens that have crossed the activity threshold. Mechanically, a graduated token is the same as a pre-graduation token; only the surfaces that show it differ.
15.8 Sunset — recycle to free pool, no token effects
If a market goes 30 days with no trades and has not graduated, the singleton emits Sunset(token) and the launchpad UI removes the market from the active list. The ResearchToken itself is unaffected — holders retain their balances, and the singleton's sell path remains open at the curve's posted price, so any holder can always exit back to ETX. What changes is that the dormant ETX in the market's etxReserve_i is reclassified as free-pool ETX for the purpose of internal accounting, available to backstop discovery on new launches.
No holder loses anything at sunset; the launchpad UI simply stops surfacing the market.
15.9 Metadata — image, socials, evidence — on-chain forever
Launch metadata is stored on the deployed ResearchToken as constructor immutables:
name,symbol— requiredimage— IPFS or HTTPS URI of the project image, requireddescription— requiredwebsite,telegram,x— optional social linksevidenceURI— required, must link to one of: PubMed DOI, arXiv preprint, RCSB PDB structure ID, EticaLabs Autopilot run, IPFS-pinned preprint, or ORCID-signed researcher attestation
Because this metadata is in the contract constructor (and therefore in the deployed bytecode + Sourcify-verified standard-input.json), it is retrievable forever from chain alone, with no dependence on EticaHub's frontend or any centralized indexer. The launchpad UI surfaces this metadata on /research-markets/[token]; aggregators and other dapps can read it directly from the contract.
Image upload in the launch wizard goes through a server-side Pinata proxy at /api/research-markets/upload-image (the API JWT is kept off the browser). If Pinata is not configured, the wizard falls back to a paste-URI input — a researcher can pin to any IPFS gateway of their choice.
15.10 What EticaResearchMarkets does not do
- It is not a 1:1 ETX wrapper. Tokens are priced on a constant-product curve, not redeemed at parity. A 1:1 wrapper would have no price discovery, no upside for early supporters, and no launchpad utility.
- It does not migrate to an external pool at graduation. Graduation is UI-only (§15.7).
- It does not retire or alter the
ProposalTokenFactorydesign (§16). The two launchpads coexist. - It does not give the protocol operator a withdrawal authority. There is no admin function that can pull ETX out of any curve or out of the free pool. The 5M ETX seed and every accrued ETX is locked behind the contract's deliberate absence of a withdrawal path.
- It does not pay the treasury. The 0% treasury slice is deliberate. The launchpad pays researchers and pays the ETI LP burn; treasury revenue from this surface would conflict with the floor-pull property and the no-protocol-cut posture for science funding.
15.11 Deployment status
EticaResearchMarketssingleton: deployed via the operator-only/deploy/research-marketsbrowser deployer, with the 80/10/0/10 fee split pre-filled (PR #203). Treasury transfers the 5M ETX seed post-deploy and updatespackages/shared/src/addresses.ts./research-markets(launchpad UI): live with tabbed views (Live / Pending graduation / Graduated / Sunset),/research-markets/launch(token launch wizard),/research-markets/[token](detail page with buy/sell card, provenance + Sourcify badge, permanent-floor-pull explainer)./swapand/tradewired to surface graduated tokens automatically (PR #202).- Auto-Sourcify cron + canonical bundle + status badge (PR #204).
- The 5M ETX seed is held by the treasury and transferred in the same operator session as the singleton deploy.
16. Launchpad (Design Preview, Deferred to v2)
A creator-gated token launchpad (ProposalTokenFactory) is designed, implemented, and unit-tested in the repo, but deliberately not deployed on mainnet as part of v1. It will be activated as v2, once the base DEX and ETX have established a reliable price and sufficient liquidity depth.
16.1 Why
A launchpad is most useful once (a) the ETX pool has real depth, (b) the ETI/ETX pool has real depth, and (c) the DEX has seen meaningful organic volume. Launching the launchpad simultaneously with ETX itself would create paper-thin pools for every proposal token and serve no one well. We ship base infrastructure first.
16.2 Design summary (for v2 reference)
| Aspect | Decision |
|---|---|
| Who can launch | Only the wallet address recorded as proposer on the corresponding Etica proposal |
| One token per proposal | Yes, enforced on-chain |
| Supply split (BPS) | 25% LP → token/ETX pool, 25% LP → token/ETI pool, 25% liquid to author, 25% vested to author over 90 days |
| Launch fee | 250 ETX + 250 ETI to treasury |
| Minimum author-provided LP | 100 ETX + 50 ETI (per side) |
| Vesting | 90-day linear, via ProposalTokenVesting |
| Pool-creation fee (factory) | Exempt (launchpad is in trustedCreators allow-list) |
16.3 Why dual-pairing (token/ETX + token/ETI)
An earlier single-hub design (ETX-only) was rejected by the community on the grounds that every launched token would concentrate demand onto ETX at ETI's expense. The dual-pairing requirement makes every launch an ETI demand sink: each launch must supply at least 50 ETI plus a 250 ETI fee, and a token/ETI pool is opened alongside the token/ETX pool. The launchpad is structurally accretive to both ETX and ETI, not a dilutive substitute for ETI.
16.4 v1 does not include
/deploy/launchpadpage (operator-only)/launch/tokenauthor-facing UI- Any mainnet deploy of
ProposalTokenFactory,ProposalToken, orProposalTokenVesting - Any
factory.setTrustedCreator(launchpad, true)call
All of the above are deferred. When activated, a separate announcement and documentation update will precede it.
17. Bridge (Phase 3 — Contract-Complete, Deploy Gated on Hyperlane-on-Etica)
The Phase 3 cross-chain bridge is contract-complete in the repo (PRs #157–#173, twelve contracts plus the supporting Hyperlane-on-Etica infrastructure-as-code bundle) and pending only the live deploy of Hyperlane on the Etica L1 (Phase H — community-funded validator + relayer on a small VPS, see docs/HYPERLANE_ON_ETICA.md). Once the Hyperlane mailbox is live on Etica, deploys follow docs/BRIDGE_DEPLOY_WALKTHROUGH.md.
The bridge supersedes the earlier multisig-validator design (PR #5) entirely. The new architecture replaces a trusted k-of-n validator set with an optimistic-veto model on Hyperlane's already-deployed validator/relayer rails: any honest party can submit a claim, the protocol operator (or any community member with a Merkle proof) has a 48-hour challenge window to veto a fraudulent claim before it mints, and a 10M ETX insurance fund underwrites the worst case.
17.1 Architecture
Messages move on Hyperlane (industry-standard interchain message protocol). Asset custody and minting live in EticaHub-authored contracts that consume Hyperlane as transport:
| Contract | Side | Role |
|---|---|---|
BridgeVault | Etica | Custodies deposited ETX. Emits Deposit events that Hyperlane relays. Authorizes withdrawals only on validated burn-receipts from the destination chain. |
BridgeMinter | Eth + BSC (one per chain) | Receives Hyperlane messages from the Etica vault, opens a claim, runs the 48h challenge window, then mints WrappedETX on success. Also accepts user-initiated burns to round-trip back to Etica. |
WrappedETX | Eth + BSC | Restricted-mint ERC-20Permit. Only BridgeMinter can mint or burn. Standard permit for gasless approvals on the destination side. |
BridgeInsuranceFund | Etica | 10M ETX backstop with timelocked withdrawals. Pays out on a validated successful veto or on operator-acknowledged shortfall. Funded from the FeeRouter's 20% insurance slice. |
FeeRouter | Etica | Splits bridge fees 20/80 between the insurance fund and the existing TreasuryHarvester (§9). Split changes are 24h-timelocked. |
OptimisticVetoModule | Eth + BSC | Operator veto authority wrapper. Holds the operator's veto key and rate-limits veto submissions so a compromised key can't grief liveness. |
FraudProverModule | Eth + BSC | Community Merkle-proof veto path. Anyone with a valid proof of the Etica state at the disputed block can independently veto a fraudulent claim. The operator is not the only line of defence. |
InsuranceTopUpReceiver | Etica | Closes the cross-chain audit trail when an Eth/BSC-side veto needs an Etica-side insurance payout. Records each notice; operator settles the ETX leg off-chain and calls markSettled. |
HeartbeatISM | Eth + BSC | Custom Hyperlane Interchain Security Module. Requires a recent operator heartbeat (≤4h) before any message validates. Auto-pauses the bridge if the operator goes dark. |
TVLCapISM | Eth + BSC | Caps the total per-chain wrapped supply against a configurable ceiling. Refuses messages that would breach the cap (defence against runaway minting). |
RateLimitISM | Eth + BSC | Per-day mint throughput cap with a 1h–7d timelock on cap changes. Bounds the worst-case loss from a successful exploit to one day's cap. |
IHyperlane interface | shared | Single source of truth for IMailbox + IMessageRecipient, byte-for-byte mirroring the Hyperlane V3 stdlib. |
17.2 Optimistic-veto flow
- Deposit. A user calls
BridgeVault.deposit(amount, destinationChain, recipient)on Etica. The vault locks the ETX, computes aclaimId, and dispatches a Hyperlane message to the destinationBridgeMinter. - Claim open. Hyperlane relays the message.
BridgeMinter.submitClaim()opens a claim with a 48-hourchallengeEndtimestamp. - Challenge window. During the 48h window, anyone can submit a veto via
OptimisticVetoModule.veto()(operator key) orFraudProverModule.veto()(community Merkle proof against Etica state at the deposit block). - Execute. After the window passes with no veto, anyone (including the recipient) calls
BridgeMinter.executeClaim()to mintWrappedETXto the recipient. Up to that moment, the funds remain locked on Etica and recoverable. - Round-trip. To return, the user burns
WrappedETXon Eth/BSC viaBridgeMinter.burn(). The minter dispatches a Hyperlane message back to Etica, the vault validates it, and the user (or any keeper) callsexecuteWithdraw()after the symmetric 48h window.
17.3 Bond, fees, and insurance
- Submitter bond: 25% of the claim notional, in ETX. Slashed on a successful veto (50% goes to the veto submitter, 25% goes to the insurance fund, 25% is burned). Returned on successful execution.
- Bridge fee: 0.1% of the claim notional, in ETX, routed through
FeeRouter(20% insurance, 80% harvester). - Per-day cap:
RateLimitISMdefaults to 1M ETX/chain/day, ramped from 100k → 1M → 10M over a 30/60/90-day post-launch schedule. - Insurance fund: seeded with 10M ETX from the treasury, top-able via
BridgeInsuranceFund.deposit()or via the FeeRouter's 20% slice. Per-veto payout cap = 5% of fund balance; per-day payout cap = 1% of fund balance. - Heartbeat cadence: operator signs an on-chain heartbeat every 15min (free GitHub Actions cron in
apps/bridge-watcher). After 4h of silence the bridge auto-pauses; after 90 days of continuous silence the heartbeat key can be rotated via the successor-key recovery path.
17.4 Watcher (free, runs on GitHub Actions)
apps/bridge-watcher/ ships three independent GitHub Actions workflows that together replace the paid "$20/mo VPS bot" most bridges run:
- Heartbeat (15min cadence) — signs the on-chain heartbeat on each remote chain.
- Monitor (5min cadence) — pulls fresh
ClaimSubmittedevents, runs sanity checks against the Etica RPC, posts to Telegram on any suspicious claim. Alert-only. Manual veto stays on the operator's hardware wallet — the bot never holds the veto key. - Auto-execute (30min cadence) — calls
executeClaim()on matured legitimate claims so recipients don't have to pay destination-chain gas.
All three workflows skip cleanly when bridge contract addresses are unset, so CI is green from day-zero through deploy day. Operational cost: $0/mo.
17.5 Custom ISMs
Hyperlane lets each recipient contract specify its own Interchain Security Module. The bridge stacks three custom ISMs in AGGREGATION mode on top of the standard MultisigISM:
HeartbeatISM— blocks message validation if the operator hasn't pinged in 4h.TVLCapISM— blocks message validation if executing the claim would exceed the per-chain wrapped supply cap.RateLimitISM— blocks message validation if today's running total + this claim would exceed the per-day cap.
All three are stateless to the relayer (they read on-chain state, sign nothing) and ship with timelocked parameter knobs so a compromised admin can't widen caps without warning.
17.6 /bridge UI
apps/web/src/app/bridge/page.tsx ships a read-only baseline today (status banner, address book, locked parameters, the "how a deposit moves" explainer) and the same components automatically light up with live TVL, pending claims, and heartbeat status the moment addresses populate in packages/shared/src/addresses.ts. The page is non-custodial — no signing flows are wired until the contracts are live, and even then every flow routes through the user's wallet (Permit2 on Etica, WrappedETX.permit on Eth/BSC).
17.7 Status
Contracts are deployment-ready. Operational dependencies for the live deploy:
- Hyperlane mailbox on Etica — requires Phase H (validator + relayer on a community-funded VPS). Plan in
docs/HYPERLANE_ON_ETICA.md. Estimated cost ~$5-10/mo recurring, ~$5-10 one-time gas. Funded from the harvester's 80% treasury slice once live. - Bond + insurance seed — 10M ETX from treasury to
BridgeInsuranceFundat deploy time. - Operator hardware wallet — owns
BridgeMinteron each remote chain, ownsOptimisticVetoModule. Multisig migration is a post-launch task. - Audit. Sherlock contest scoped after Phase H lands. Estimated 3–4 weeks of lead time.
18. Governance and Treasury
18.1 Treasury wallet
The EticaHub treasury is an EOA at 0xB2B4bC9d02970A55efF64C2D84c622c87967C19D. It holds:
- Essentially all of the ETX supply at genesis (minus the amount seeded into pools).
- LP tokens for the initial ETI/ETX and EGAZ/ETX pools (less whatever fraction has been moved through the future TreasuryHarvester POL-burn path, which permanently locks LP tokens to the burn sink).
- Any subscription revenue, swap protocol fees (after
feeTois set), and pool-creation fees. - Any undistributed portion of the 10% farm bucket from the Harvester (parked in treasury until
ETXFarmsis live).
18.2 Administrative keys
| Contract | Key | Capabilities |
|---|---|---|
EticaSwapFactory — feeToSetter | Treasury wallet | Can set feeTo, rotate feeToSetter, modify pairCreationFee, and flip trustedCreators entries |
EticaSwapFactory — feeTo | Treasury wallet | Receives the 0.05% protocol swap fee and the 10,000 ETX pool-creation fee |
DutchOrderReactor — owner | Treasury wallet | Can change the protocol fee controller; fee itself capped at 1% by the controller |
EticaProtocolFeeController — owner | Treasury wallet | Can flip the ETX-denominated protocol fee between 0 and 100 BPS |
StakedETX | no owner | Contract has no Ownable inheritance; distributeRewards is permissionless; cannot seize deposits, pause, or mint shares |
TreasuryHarvester — owner | Treasury wallet | Can emergency-sweep to treasury and tune the 10/10/40/40 split within contract-enforced caps. The keeper role was retired in v2 (PR #109); harvest() is now fully permissionless with a 1-day cooldown and a small caller-tip incentive. |
EticaStableSwap — owner | Treasury wallet | Parameter knobs only: rampA, setSwapFee, setAdminFee, setAdminFeeRecipient, lockedWithdraw (only fires post-2036 timelock unlock). Cannot mint shares, cannot seize LP, cannot redirect existing reserves. |
LiquidityTimelock10y — owner | Treasury wallet | Can withdraw the locked LP only after the 2036-05-01 unlock timestamp; the contract has no early-unlock path. |
StableSwapHarvesterAdapter | no owner | Permissionless harvest(). Anyone can poke it; output is fixed by the on-chain 50/50 admin-fee math. |
ETXFarms — owner | Treasury wallet | Can register new pools, retune weights, set fallback recipient. rescueToken is guarded against registered LP tokens and the reward token (ETX). Cannot pause withdrawals, cannot retroactively change reward semantics. |
BridgeVault — owner (post-deploy) | Hardware wallet → multisig | Configures BridgeMinter addresses per remote chain, sets the per-chain cap. Cannot bypass the 48h challenge window. |
BridgeMinter — owner (post-deploy) | Hardware wallet → multisig | Wires up ISMs, configures the FeeRouter and InsuranceFund addresses, and holds the operator veto authority via OptimisticVetoModule. Cannot mint outside the validated-claim path. |
BridgeInsuranceFund — owner (post-deploy) | Hardware wallet → multisig | Approves payouts within the on-chain 5%/1% per-veto/per-day caps. Cannot mint, cannot drain — only routes already-deposited funds. |
The feeToSetter key is intentionally low-ceremony at launch (EOA) to minimize operational risk during the first few weeks. It will be migrated to a multi-signature wallet as a follow-up, announced separately.
18.3 On-chain authority of ETX
ETX itself has no admin — no pause, no mint, no blacklist, no upgrade. Governance in the "change the token" sense is impossible because the contract has no mutable configuration. All governance discretion is exercised over the DEX and treasury, not over ETX.
19. Security
- Foundry test coverage: 500+ tests across swap, research, launchpad, UniswapX reactor wiring, stETX, TreasuryHarvester, ETXFarms, EticaStableSwap, and the full Phase 3 bridge stack (vault, minter, insurance fund, fee router, optimistic-veto, fraud-prover, custom ISMs, cross-chain top-up). All passing in CI; aggregated across
packages/contractsandpackages/trading-contracts. - Pinned dependencies: OpenZeppelin v5.1.0 (pinned specifically to avoid Cancun-only
mcopyon Etica's Paris-EVM). - No upgradeability / no proxies: Every contract is deployed at its final implementation. There is no upgrade path that could silently change logic.
- No admin mints: ETX supply is fixed at deploy. stETX shares can only be minted in exchange for ETX deposits.
- No custody paths:
StakedETXhas no owner at all —distributeRewardsis permissionless and can only increase the exchange rate. Harvester keeper can only perform the 10/10/40/40 redistribution. Reactor owner can only toggle a capped protocol fee. No key in the system can unilaterally drain user funds. - No external audits at launch. v1 ships without a third-party audit. Users should size their exposure accordingly. Audits are on the roadmap (§20) and will be announced once scoped.
20. Roadmap
Timeline is indicative, not committed.
Shipped
- v1 — ETX genesis: ETX deployed, EticaSwap deployed, ETI/ETX and EGAZ/ETX pools seeded, hub-and-spoke invariant active, pool-creation fee switch activated by setting
feeTo.eticahub.comroutes swaps through the new contracts. - v1 — Research Hub:
/research/proposalsreader, tipping, subscription contract. - v1.1 — Trading Stack: Permit2 + UniswapX DutchOrderReactor + EticaProtocolFeeController + OrderRegistry + off-chain order book + reference keeper. Market, Limit, Stop, DCA, bounded Grid, and Infinity Bot modes all live on
/trade/[token]. - v1.1 — Explorer:
/explorerwith blocks, txs, addresses, ERC-20 token pages, gas tracker, Sourcify-backed verification, JSONL indexer. - v1.1 — Market Data API:
/api/v1/*pools, pairs, candles, tokens, health endpoints. Aggregator submission briefs. - v1.1 — Staking (stETX): ERC-4626 liquid staking vault,
/stakeUI with deposit, withdraw, 7d APY, exchange-rate chart. - v1.1 — TreasuryHarvester: 10/10/40/40 split + POL burn. Permissionless v2 (PR #109) deployed and live at
0x5d8B…76f5; daily GitHub Actions cron + manual/admin/harvesterbutton; first live harvest executed. - v1.1 — Community Buy Bot: Vercel-cron Telegram posts for all ETX-pair swaps with KV-based dedup. Circulating-supply MC registry (PR #151) anchors ETX market cap to CoinGecko/CMC convention; redundant stETX MC line dropped.
- v1.1 — ETXFarms: non-emissive LP-staking contract live at
0xEBAf…c6aD;/farmsUI shipped, three-pool weighted emissions wired (60/25/15). - v1.1 — Mobile wallet UX: MetaMask deep-link + WalletConnect v2 connector.
- v1.1 — Addresses & docs: deployed addresses wired into
packages/shared/src/addresses.ts; launch parameters and harvester runbook frozen indocs/. - v1.2 — EticaLabs:
/labsAI molecular workstation with Groq plan → engine-cascade fold (HF ESMFold / NVIDIA NIM ESMFold / Chai-1 / Boltz) → Groq structural analysis → mutate + export + share. Research-aware planner pulls PubMed + RCSB PDB references. EticaLabs Autopilot —/labs/feedpublic research feed backed by a Redis queue + GitHub Actions worker on a 10-minute cron — runs plan → fold → analyse → mutate for N iterations on every public submission. Built entirely on free tiers. - v1.2 — EticaStableSwap (Phase 0): rate-aware AMM live at
0xbbf5…036E; 30M ETX-equivalent treasury seed locked 10y inLiquidityTimelock10y(0xFdf9…d739, unlocks 2036-05-01);StableSwapHarvesterAdapter(0x9Adc…Be76) bridges admin fees into the existing 10/10/40/40 flywheel;/swapauto-routes direct stETX↔ETX through the pool; public LP card on/pool; live/api/v1/tvland/api/v1/liquidity-flowcount the seed. - v1.3 — EticaResearchMarkets: singleton launchpad live (PR #199),
/deploy/research-marketsbrowser deployer (PR #200),/research-marketslaunchpad UI with tabbed Live / Pending / Graduated / Sunset views and per-market detail pages with buy/sell card + IPFS image upload (PR #201), graduated tokens wired into/swapand/trade/[address](PR #202), singleton upgraded to 80/10/0/10 fee split with permanent floor pull (PR #203), auto-Sourcify cron + canonical bundle + live status badge (PR #204). Treasury seeds the singleton with 5M ETX as the free-pool backstop. See §15.
Near-term
- Phase 1 — wETI/ETX rate-aware (or concentrated-liquidity) pool. Reuses the same AMM contract and harvester adapter pattern; this is the actual volume engine of the protocol. Once depth justifies it, ETXFarms emissions on the wETI/ETX pool are a candidate to attract public LPs.
- Multisig treasury migration:
feeToSetter,DutchOrderReactorowner,EticaProtocolFeeControllerowner,TreasuryHarvesterowner,EticaStableSwapowner,LiquidityTimelock10yowner, andStableSwapHarvesterAdapterowner all rotated from the launch EOA to a multi-sig. (StakedETXhas no owner — nothing to rotate.) - Aggregator listings: CoinGecko / CMC / DEX Screener / GeckoTerminal submissions reflecting the deeper Phase 0 TVL and the corrected circulating supply.
Mid-term
- Launchpad activation (v2):
ProposalTokenFactorydeployed to mainnet,factory.setTrustedCreator(launchpad, true)wired,/launch/tokenUI shipped. Dependent on ETX establishing meaningful depth and community signal. - Bridge activation (v3 — contract-complete, see §17): the twelve-contract optimistic-veto bridge stack is repo-complete and CI-green. The remaining work is operational, not architectural: Phase H (deploy Hyperlane on Etica — community-funded validator + relayer on a small VPS), then the bridge deploy walkthrough proper, then a Sherlock contest before the per-chain rate-limit ramp.
/bridgeUI is already shipped in read-only mode and lights up the moment addresses are wired. - External audits: Sherlock contest scoped for the bridge stack post-Phase-H. Earlier surfaces (stETX, harvester, farms, stableswap) audited next as TVL justifies it.
21. Risks
This section is non-exhaustive. ETX and EticaHub are experimental software and exposure should be sized accordingly.
-
Liquidity risk. The launch pools were intentionally small (~$6 total at NonKYC reference prices). Trades of even a few dollars move price substantially. Depth grows only as organic volume, LPs, and (future) POL-burn harvests arrive.
-
Smart-contract risk. v1 ships without a third-party audit. Every surface (DEX, Trading Stack, stETX, Harvester, ETXFarms, EticaStableSwap + Timelock + adapter) is tested but unaudited.
-
Regulatory risk. Despite the fair-launch structure (no sale, no allocation, no vesting, no promises), any token that has a market value is subject to interpretation by various regulators in various jurisdictions. ETX is not offered for sale anywhere; users who acquire it on EticaSwap do so at their own risk and on their own legal assessment. stETX is likewise not sold; it is minted 1:1 against deposited ETX. Two layered frontend access policies are applied as a good-faith gesture mirroring the posture adopted by Uniswap, Aave, and similar Western DeFi frontends:
- Comprehensively sanctioned jurisdictions (KP / SY / CU / IR). The entire EticaHub frontend is rewritten to a compliance notice for visitors whose IP geolocates to North Korea, Syria, Cuba, or Iran. Every path on the site (including
/swap,/pool,/trade,/bridge,/explorer,/whitepaper) is unavailable. - United States. The stETX-related surfaces are suppressed:
/stakeand/farmsrewrite to the compliance notice; on/swapstETX is removed from both pickers; on/poolthe stETX/ETX stableswap LP card is hidden, stETX is rejected as a custom ERC20 in the V2 pair selector, and any user-held LP position whose underlying tokens include stETX is filtered out of the positions list. There is no exit affordance — the gate is a single uniform suppression of stETX from the frontend rather than a "no new entry, free exit" posture.
The underlying smart contracts remain permissionless, open-source, and reachable on-chain regardless of jurisdiction; both layers are frontend access policies, not protocol-level restrictions. See
apps/web/src/lib/geoBlock.ts,apps/web/src/lib/geoBlockServer.ts, andapps/web/src/middleware.ts. - Comprehensively sanctioned jurisdictions (KP / SY / CU / IR). The entire EticaHub frontend is rewritten to a compliance notice for visitors whose IP geolocates to North Korea, Syria, Cuba, or Iran. Every path on the site (including
-
Operator risk. The keeper EOAs (Trading Stack reference keeper, future Harvester keeper) are hot and can be compromised. The system is designed so that a compromise of any keeper cannot drain user funds — the worst case is failed or delayed redistribution — but operational degradation is possible.
-
Oracle risk. USD prices in the UI and the buy bot are derived from NonKYC's public API for ETI/USDT and EGAZ/USDT. A NonKYC outage or a manipulated quote would surface as wrong USD labels, not as wrong on-chain math (which is always denominated in the asset itself).
-
Chain risk. The Etica blockchain itself is an independent L1 with its own validator set, its own client software, and its own operational history. EticaHub inherits all of Etica L1's risks (consensus, liveness, RPC availability, chain reorgs).
-
Team risk. EticaHub is a small community-built project. There is no institutional backer and no formal legal entity.
22. FAQ
Is ETX the same as ETI? No. ETI is Etica Protocol's native asset. ETX is EticaHub's own ERC-20, unrelated at the token level. They are connected only by the fact that EticaSwap trades them as the first-opened pool.
Is EticaHub officially endorsed by the Etica Protocol core team? No. See §1.
Can I buy ETX from the team? No. The team does not sell ETX. The only market is EticaSwap.
Why such a small FDV? Small FDV + low LP depth keeps the initial unit price small ($0.00001/ETX) and reflects that real distribution happens post-launch as volume arrives, not at genesis. We explicitly do not want to open at a large implied FDV with no capital behind it.
Does stETX mint new ETX? No. stETX is a pure redistribution vault. Every stETX yield dollar comes from LP fees the treasury already earned and redistributed. If fees stall, yield stalls. There is no emissions schedule and no new ETX can ever be created.
What is the POL burn? Every Harvester cycle permanently locks 40% of the harvested fee tranche (paired with ETI/EGAZ) as LP in the ETI/ETX and EGAZ/ETX pools, then sends the resulting LP tokens to the burn sink. The depth stays in the pool forever and can never be withdrawn. See §9.3.
When does the launchpad open? Not v1. See §16 and §20. No date committed.
When does the bridge open?
The twelve-contract bridge stack is feature-complete in the repo and CI-green. What remains is operational: deploy Hyperlane on Etica (Phase H — a small community-funded validator + relayer VPS), then the bridge deploy walkthrough, then a Sherlock contest before raising the per-chain rate-limit caps. See §17 and docs/BRIDGE_DEPLOY_WALKTHROUGH.md.
Why is stETX hidden if I'm in the US?
Frontend good-faith gesture. Same posture as Uniswap and Aave. For visitors geolocating to the United States the EticaHub website suppresses every stETX-related surface uniformly: /stake and /farms rewrite to a compliance notice, stETX is removed from /swap pickers, the stETX/ETX stableswap LP card is hidden on /pool, stETX is rejected as a custom ERC20 in the /pool pair selector, and stETX-containing positions are filtered out of the /pool positions list. The underlying smart contracts remain permissionless and reachable on-chain; this is a frontend access policy, not a protocol-level restriction. See §21 (Risks → Regulatory).
Why is the entire site unavailable in my region? If you are visiting from North Korea, Syria, Cuba, or Iran (the comprehensive-sanctions list) the EticaHub frontend is unavailable site-wide as a good-faith compliance measure. The underlying smart contracts remain permissionless on the Etica network; this is a frontend access policy, not a protocol-level restriction. See §21 (Risks → Regulatory).
Is the buy bot official? Is it custodial?
Yes, operated by EticaHub. Non-custodial: the bot reads on-chain Swap logs and posts messages. It holds no funds, signs no transactions, and has no privileged access. See §13.
How do I verify a contract?
Submit source + metadata at /explorer/verify/[addr]; we push to Sourcify. Once Sourcify acks, the explorer reads back the verified ABI + sources on every tx and contract page. See §11.2.
Where is the code? https://github.com/iamdexx/etica-hub — monorepo, MIT-licensed.
Appendix A — Canonical addresses
Etica mainnet (chain id 61803). Canonical source: packages/shared/src/addresses.ts.
| Contract | Address |
|---|---|
ETX (EticaHub) | 0xa5A1Bc6307b0b87989B8456D4b35F88a68650044 |
WEGAZ (Wrapped EGAZ) | 0x232fb2B87CAce92B2438054A7eB79B4081E3E11a |
| EticaSwapFactory | 0xfc8dE5A5087c8825AA54E2C57B3FFe0e23784bc3 |
| EticaSwapRouter | 0xaefbf3fB975657a4C71ea0Fb644B4afE5F555723 |
| ETI/ETX pool | derived from factory.getPair(ETI, ETX) after seeding |
| EGAZ/ETX pool | derived from factory.getPair(WEGAZ, ETX) after seeding |
| Permit2 | 0x165F71f549415f44883e370Df12169Dd99570eE5 |
UniswapX DutchOrderReactor | 0xE2fc7EAcEB0146560bfcf46CC5B167df60E970B8 |
EticaProtocolFeeController | 0xB9a4FbfC4cA598Be18e09bb9C0Cf19e4a1A4350a |
OrderRegistry | 0xA6f3e48Cf31DcE3a8d36659f5bC6a61785c404a9 |
StakedETX (stETX) | 0x75d81d03a98CD9195593b8963aF17E13fAa70334 |
TreasuryHarvester | 0x5d8B1138559fADc3Bb90e8317eB16922eAa076f5 (live, permissionless v2) |
ETXFarms | 0xEBAfdd24ABF8290f0B433E689631466ABD13c6aD |
EticaStableSwap (stETX/ETX) | 0xbbf5814C1EA0531Cb07541b80c547ee7878C036E |
LiquidityTimelock10y | 0xFdf919673570Cea9c513461604450D003716d739 (unlocks 2036-05-01) |
StableSwapHarvesterAdapter | 0x9Adc6298EFDcc1604CB95DaaB33331f866DDBe76 |
BridgeVault (Etica) | pending Phase H deploy |
BridgeInsuranceFund (Etica) | pending Phase H deploy |
FeeRouter (Etica) | pending Phase H deploy |
InsuranceTopUpReceiver (Etica) | pending Phase H deploy |
BridgeMinter (Ethereum mainnet) | pending Phase H deploy |
BridgeMinter (BNB Chain) | pending Phase H deploy |
WrappedETX (Ethereum mainnet) | pending Phase H deploy |
WrappedETX (BNB Chain) | pending Phase H deploy |
| Hyperlane mailbox (Etica) | pending Phase H deploy |
ResearchSubscription | pending deploy |
| ETI (Etica protocol, external) | 0x34c61EA91bAcdA647269d4e310A86b875c09946f |
| Treasury wallet | 0xB2B4bC9d02970A55efF64C2D84c622c87967C19D |
Appendix B — Chain parameters
| Parameter | Value |
|---|---|
| Network name | Etica Mainnet |
| RPC URL | https://rpc2.etica-stats.org |
| Chain ID | 61803 |
| Native gas token | EGAZ |
| Block explorer (EticaHub) | https://eticahub.com/explorer |
| Block explorer (Etica Protocol) | https://eticascan.org |
| Canonical ETI address | 0x34c61EA91bAcdA647269d4e310A86b875c09946f |
EticaHub is an independent, community-built project. This document describes EticaHub's own design and contracts. It does not speak for, commit, or represent the Etica Protocol core team in any capacity.