boost the casts that deserve the floor.
$KEYNOTE is the curation token for Lectern Pro. Pros spend a weekly allocation to amplify casts in Lectern's Pro-exclusive feed. Engagement on boosted casts pays the caster (70%) and engagers (30%) via on-chain Merkle settlement. Cast metadata is never touched — escrow events on Base are the source of truth.
six steps. zero metadata pollution.
Pro members spend KEYNOTE to boost casts. Engagement on those casts gets recorded by Hub. A weekly settler computes a Merkle distribution. Caster and engagers withdraw. The cast itself is never modified — foreign Farcaster clients see nothing.
100 billion · 90% vaulted · 36 months.
Maximum scarcity at launch — only 10B circulating. The 90B vault drips ~83M per day, 100% to the Pro allocation pool (distributed weekly via Sablier MerkleInstant campaigns). Predictable curation runway for 36 months. Per-Pro allocation scales with Pro count: at 100 Pros, ~6M KEYNOTE per Pro per week; at 1000 Pros, ~580K per Pro per week.
the macOS app and CLI this token plugs into.
Lectern is a sovereign Farcaster client for macOS — custody, recovery, and signers stay on your machine. KEYNOTE doesn't make sense in isolation; the token enables Pro features inside Lectern. This section shows what's built today (operator beta) and what v0.2.0 — the KEYNOTE-launching release — adds when it ships publicly ~60 days after token launch.

$KEYNOTE Console · wallet balance · pool allocation · pro claims · boost history
lectern macOS — pre-shipping
ships at v0.2.0 launch (T+60d)Both v0.1.x (Lectern foundation) and v0.2.0 (the KEYNOTE-integrated release) ship publicly for the first time ~60 days after token launch. The gap window is the audience-acquisition period — see §9 launch sequencing. The screenshots below are from the operator beta running today.
built today (operator beta)
macOS app + cli · 20+ subcommands- ·Sovereign Farcaster client — custody, recovery, signers stay on the device
- ·Feed, threads, long casts, profile management
- ·Farcaster + XMTP DCs, mini app SDK host, snap protocol
- ·Snap Maker — templates for profile cards, polls, AMAs, tip jars
- ·Declarative config (plan / apply / import / export)
- ·Two-factor auth (TouchID + TOTP), encrypted backup + restore

Feed + Account Inspector — three-column layout, native macOS chrome
v0.1.x foundation · operator beta

Snap Maker — Pro feature; template gallery + live preview
v0.1.x foundation · operator beta

Settings depth — Profile / DCs / Notifications / Snap Maker / Subscription / Developer
v0.1.x foundation · operator beta
v0.2.0 KEYNOTE additions — in active development
ships T+60d at v0.2.0 public launch- ·Curated feed — Pro-exclusive, ranked by boosted KEYNOTE per cast
- ·Boost UI — per-cast amplification with KEYNOTE
- ·Staking panel — tier 25M/50M/100M for 15/25/40% Pro discount
- ·Weekly Pro allocation claim — Sablier MerkleInstant proof flow
- ·3-path Pro payment — USDC (default) / stake-to-discount / KEYNOTE-paid (5% off)
- ·Staker yield claim — pro-rata by stake × time, weekly Sablier MerkleInstant
usdc primary. staking is the keynote utility.
Lectern Pro is USDC-priced by default. The KEYNOTE utility for Pros is staking: lock 25M / 50M / 100M for 15 / 25 / 40% off, no lockup, unstake anytime.
USDC sub
6.9 USDC/mo · 79 USDC/yr · no token activity required
Stake to discount
No lockup · small LP-fee-derived yield · unstake anytime
a third path — paying Pro directly in KEYNOTE for a 5% discount — exists in the contracts for users who'd rather liquidate KEYNOTE against their sub than hold it. it is materially worse than staking for nearly everyone and is intentionally not promoted. mechanics live in /keynote.md for completeness.
day-1 pro bonus — first 4 weeks of v0.2.0
~2B KEYNOTE poolThe KEYNOTE accumulating during the 60-day pre-v0.2.0 gap (~6B) splits 70/30 at v0.2.0 ship — 70% to founder on a 12-month OZ VestingWallet cliff, 30% (~2B) to first-4-week Pros across 4 weekly Sablier MerkleInstant campaigns. Each week, that week's new Pros share that week's slice equally — subscribe day-1 of v0.2.0 (when Pro purchase opens) = biggest slice + paid soonest.
~720MKEYNOTE shared by that week's new Pros
~540MKEYNOTE shared by that week's new Pros
~360MKEYNOTE shared by that week's new Pros
~180MKEYNOTE shared by that week's new Pros
per-epoch Sablier MerkleInstant · 12-week claim window per campaign · pool size is estimated, actual depends on accumulated vault drip + LP-fee buyback over the 60-day gap
every flow has its own wallet. empty is empty.
Single-purpose wallets, no co-mingled accounting. LP fees split 80% USDC (Treasury distributions) / 20% KEYNOTE buyback. USDC fans into 4 wallets (40/30/15/15) via a 0xSplits PushSplit. KEYNOTE buyback fans 85% to the Pro allocation pool / 15% to the staker yield pool via a second PushSplit. All balances on-chain, all multisigs 2-of-3.
$10K/day is a modest assumption — most Clanker tokens cycle 10–100× that in their first month. Numbers scale linearly: 10× the volume, 10× every box above. The whole architecture is volume-honest; fragile pools mean fragile ops, healthy pools mean self-funding.
USDC wallets · LP fees + Pro subs
Hosting, RPC, gas reserves, audit, app store, legal
Farcaster sponsored casts via @lectern, dogfooding boosts through the app, contests, partner integrations.
Opportunistic / emergency / unplanned audit findings
Operator compensation
60-day cliff, contract-enforced by OZ VestingWallet (start = tokenLaunchTimestamp + 60d, duration = 1s, beneficiary = founder cold). USDC accrues from day 1; release blocked until cliff end. Post-cliff: founder calls release(USDC) to pull accumulated + ongoing balance. Battle-tested OZ contract, no human signer required for cliff.
KEYNOTE wallets · vault + buyback + renewals
Hold boosted KEYNOTE per cast; admin posts weekly Merkle root for engagement settlement (70% caster / 30% engagers); recipients claim with 12-week claim window
Hold 25M/50M/100M KEYNOTE stakes for Pro USDC discount tiers; expose `tierOf`, `discountBpsOf`, `isProEligible` view ABI consumed by LicenseGate
Weekly Pro curation allocation to active Pros
Weekly pro-rata yield to stakers by stake × min(stake_days, 730)
Split buyback 85/15 between Pro allocation pool and Staker yield pool
Split incoming KEYNOTE per runway-tied burn schedule into BurnAddress / EngagementTokens / FounderTokens
Token-denominated contests, bounties, partnerships
Operator long-term alignment
Deflationary supply pressure
merkle root per epoch. like-bots downweighted by design.
Epoch = 7 days (Mon 00:00 UTC). At close + 24h grace, the settler reads Hub engagement on boosted casts, applies signal weights × tenure multipliers, excludes self-boost + multi-account farming via custody overlap, and posts a single Merkle root. Per-FID cap of 5% prevents any single FID from sweeping a cast.
engagement signal weights
weighted to make replies dominate; likes deliberately downweighted
>40 chars or with embeds — hardest to bot
Effort + amplification
Social cost
Cheapest to bot, deliberately downweighted
tenure multipliers
one cast. eight steps. real numbers.
Abstract architecture only matters if you can trace one full cycle and the math comes out clean. This is that trace: from Alice's weekly allocation landing to Bob's claim hitting his wallet, with the per-FID cap kicking in mid-stream. If you can't follow this, you can't believe the design works.
Alice gets her weekly KEYNOTE allocation
Lectern has 100 Pros. This week's Pro allocation campaign received ~580M KEYNOTE from the vault drip + LP-fee buyback top-up. Alice claims her share via Merkle proof from the Sablier MerkleInstant campaign:
580,000,000 ÷ 100 = 5,800,000 KEYNOTE
Bob posts a cast Alice wants to amplify
Bob (@bob) writes a thoughtful technical breakdown of XMTP sealed-sender. Alice thinks more people should see it. She opens the cast in Lectern, hits boost, allocates 1,000,000 KEYNOTE (~17% of her weekly budget).
LecternBoostEscrow.boost(castHash, 1_000_000e18)
32 people engage with the cast on Hub
Boosted casts surface in Lectern's curated feed all week. Engagement happens via normal Hub messages — replies, quotes, recasts, likes — no special clients required. The settler will read these directly from Hub on Monday.
3 replies · 4 quotes · 8 recasts · 17 likes = 32 engager FIDs
Settler weights every engagement
Each engagement gets a weight: signal × tenure-multiplier. Self-engagement and multi-account FIDs (custody/verified-addr overlap with Alice) are zeroed out. Sum across all engagers gives the denominator for pro-rata distribution.
total weight = 50.25
Split the boost: 70% caster, 30% engagers
Bob (the caster) gets his fixed share off the top. The remaining 300K KEYNOTE is the engager pool, distributed pro-rata by weight before the per-FID cap applies.
700K → Bob · 300K → engager pool
Per-FID cap: max 5% of the cast pool per FID
Top engagers' pro-rata shares exceed 5% (= 15,000 KEYNOTE) of the engager pool — they get capped at 15K. Cap surplus returns to escrow (rolls into the next epoch's settlement pool). This is the anti-whale / anti-engagement-farm primitive doing its job.
7 engagers capped → ~59K KEYNOTE returns to escrow
| FID | signal | weight | pro-rata | earned |
|---|---|---|---|---|
| @carol | substantive reply | ×6 | 35,820 | 15,000[capped] |
| @dave | substantive reply | ×4 | 23,880 | 15,000[capped] |
| @eve | substantive reply | ×4 | 23,880 | 15,000[capped] |
| @frank | quote | ×4.5 | 26,866 | 15,000[capped] |
| @grace | quote | ×3 | 17,910 | 15,000[capped] |
| @hank | quote | ×3 | 17,910 | 15,000[capped] |
| @ivy | quote | ×3 | 17,910 | 15,000[capped] |
| @jack | recast | ×2.25 | 13,433 | 13,433 |
| @kate | recast | ×2.25 | 13,433 | 13,433 |
| + 6 recasters | recast | ×1.5 | 8,955 | 53,730 |
| + 3 tenured likers | like | ×0.75 | 4,478 | 13,434 |
| + 14 likers | like | ×0.5 | 2,985 | 41,790 |
| caster | — | — | — | 700,000 |
| returned to escrow (cap surplus) | ~59,180 | |||
Merkle root posted; everyone claims
Settler submits one Merkle root to LecternBoostEscrow.settleEpoch(epochId, root). Lectern publishes proofs at lctrn.app/api/claims/{epochId}. Recipients call claim(epochId, addr, amount, proof) to withdraw. Claims roll over 12 epochs before expiring back to the escrow pool.
Bob withdraws 700K · Carol withdraws 15K · 14 likers each withdraw 2,985 · ...
What Alice's 1M KEYNOTE actually accomplished
Bob earned 700K KEYNOTE for one cast — a real on-chain tip-like signal that a person used their curation budget on his contribution. 32 engagers split 240K KEYNOTE (after caps) — concrete reward for discovering and amplifying the cast. 59K KEYNOTEreturned to escrow, available for next week's settlement pool. Token value-in-USDC is whatever the pool quotes; the design works the same at any price.
burn aggressively when healthy. preserve every cent when fragile.
KEYNOTE received via Pro renewals splits dynamically based on Lectern's runway. Less than 6 months → 0% burn. Greater than 24 months → 50%. The intuition: when ops are funded, deflationary signal helps holders. When fragile, every cent stays in the economy.
drag to set runway
15 monthspermanent supply reduction
contests · bounties · partnerships
24mo vest · operator alignment
full schedule
| runway | burn | engagement | founder |
|---|---|---|---|
| < 6 | 0% | 60% | 40% |
| 6 – 12 | 15% | 55% | 30% |
| 12 – 24 | 35% | 40% | 25% |
| > 24 | 50% | 30% | 20% |
every contract that holds value or governs flow.
The full mainnet footprint, grouped by role. Two custom contracts (Boost Escrow + Staking Vault); four vetted primitives (Uniswap V4 pool, two 0xSplits PushSplits, two OZ VestingWallets, three Safes). Every address is verified on Basescan; the macOS app wires into specific surfaces noted on each row. Pre-launch Safe provisioning + the Sepolia dogfood ledger have moved to /keynote/sepolia.
Token + venue
The asset itself + the pool that gives it a price. Both deployed via Liquid Protocol on 2026-05-24.
$KEYNOTE (ERC-20)
0xC085C7232aA4eC067238082eb74C83c1952e8826 ↗100B fixed supply on Base mainnet via Liquid Protocol. 90B vaulted (36-month linear vest, 7-day cliff), 10B paired against USDC for the initial pool.
macOS wiring: Read in Lectern macOS via `KeynoteBalanceClient.swift` (balance display in the KEYNOTE settings panel). Written by users when they Boost a cast (`approve` + `boost(castHash, amount)` against the escrow below) or stake for the Pro discount.
KEYNOTE / USDC pool (Uniswap V4)
0x63d2DfEa64b3433F4071A98665bcd7Ca14d93496 ↗Single concentrated-liquidity position locked at deploy. LP fees flow as 80% USDC to Treasury PushSplit + 20% KEYNOTE to the buyback PushSplit below.
macOS wiring: Lectern does not interact with the pool directly. Reads through GeckoTerminal for the price/FDV display (live above); writes happen via standard router calls when users swap externally.
Pro economy (the macOS wiring)
The two custom contracts Lectern Pro members touch directly — boost a cast, stake for the discount. Both audited internally; sepolia-dogfooded end-to-end before mainnet.
LecternBoostEscrow
0x0C086E5760FC33d67963D6C211c2e05679d58ACf ↗Holds KEYNOTE staked to amplify a cast in the Pro Curated Feed. Weekly Merkle settlement returns engagement rewards to casters (70%) + engagers (30%). 12-week claim window; admin can reclaim unclaimed amounts after.
macOS wiring: `BoostModal.swift` calls `boost(castHash, amount)` after a `approve()`. `BoostIndexerClient.swift` reads cumulative totals from `lctrn.app/api/keynote/boosts/<hash>` for the boost-overlay on every cast row in the Curated Feed.
LecternStakingVault
0x9EF229c675F44A00F801Db9df4611E35D9600002 ↗Tiered KEYNOTE stake for the Pro USDC discount. 25M / 50M / 100M → 15% / 25% / 40% off. No lockup — unstake anytime, lose the discount immediately.
macOS wiring: `StakingClient.swift` calls `stake()` + `unstake()` from the KEYNOTE settings panel. `LicenseGate.swift` reads `isProEligible(addr)` for the Pro dual-source path (paid OR staked ≥ 25M = Pro access).
Treasury & revenue routing
Vetted 0xSplits PushSplits route every cent of LP fees + Pro USDC payments. Owner of both is the OperationsTreasury Safe — the multisig can rotate recipients for runway-tier transitions, but cannot extract funds in flight.
OperationsTreasury Safe
0x2975C387B5DCF959eB3Ecdb1f6a3f12a1D318781 ↗2-of-3 multisig that owns the PushSplits + holds operational USDC. 40% of every USDC payment flows here.
macOS wiring: Read by `KEYNOTERunwayClient.swift` for the runway-tier display (balance feeds the formula at `lctrn.app/api/keynote/runway`). No write surface from Lectern.
USDC PushSplit (40/30/15/15)
0x812faBe73ed973540865385334bA4107E95EDa60 ↗Receives all USDC inflow (LP fees + Pro USDC payments). Routes 40% Ops / 30% Engagement / 15% Reserve / 15% FounderPay VestingWallet. Owner = OperationsTreasury Safe (2-of-3), which can rotate recipients but cannot extract funds in flight.
macOS wiring: Receiver address for `wallet.sendToken` from the Lectern Pro upgrade flow when USDC is the payment method. No custom contract — vetted 0xSplits PushSplitFactoryV2.2.
KEYNOTE Buyback PushSplit (85/15)
0x53Ee4a31456B0132B033d538C94b6c2933E14AeF ↗Receives the 20% KEYNOTE side of LP fees. Routes 85% to ProAllocation pool (weekly Merkle airdrops to Pros) + 15% to StakerYield pool (LP-fee-derived yield for stakers).
macOS wiring: No direct macOS write. The off-chain `lctrn-pro-allocator` bot reads accumulated KEYNOTE here weekly + publishes Merkle roots via Sablier MerkleInstant for Pro claims.
ProAllocation pool
0xB1C5843301de789152FdF9aA343A0a05772AC7D6 ↗85% of the KEYNOTE buyback lands here, plus the Liquid vault drip. The weekly Pro curation airdrop is funded from this pool.
macOS wiring: Read-only on the macOS side via `lctrn.app/api/keynote/pool-stats`. The `lctrn-pro-allocator` bot signs weekly Merkle campaigns from here.
StakerYield pool
0x65010cF01FBCDF1B9D467d35DBBBEB72003F72Da ↗15% of the KEYNOTE buyback lands here — LP-fee-derived yield distributed pro-rata to stakers by stake × min(stake_days, 730).
macOS wiring: Read-only via `lctrn.app/api/keynote/pool-stats`. Weekly staker-yield Merkle campaigns are signed from here.
Founder vesting (contract-enforced cliffs)
OZ VestingWallets with `duration = 0` for pure-cliff semantics. The founder cold wallet is the beneficiary; release() reverts before the cliff regardless of caller. Belt-and-suspenders on top of the multisig-held founder Safes that route to these.
FounderPay VestingWallet
0x9762C3cb431534C307beF93050d49bda2c0A2155 ↗60-day cliff for USDC payroll. Receives the 15% Founder Payroll slice from the USDC PushSplit. release(USDC) reverts until 2026-07-23 00:00 UTC; full balance vested instantly thereafter.
macOS wiring: No app surface — fully autonomous. After cliff, anyone can call release() to push vested USDC to founder.cold.
FounderTokens VestingWallet
0xb5765CB14c28Aa8538EEc268F3634397f4e57aCD ↗365-day cliff for the founder KEYNOTE allocation (gap-pool 70% + ongoing runway-tied %). release(KEYNOTE) reverts until 2027-05-24 00:00 UTC.
macOS wiring: No app surface. Token allocations land here whenever they vest; founder.cold collects after cliff.
price, FDV, pool, volume — fetched fresh.
Pulled server-side from GeckoTerminal at request time, revalidated every 60s. KEYNOTE / USDC is the only pool. Volume sits at $0 over 24h as the pre-launch grind window plays out — Pro renewals + Boost flows don't reach the pair until v0.2.0 ships and KEYNOTE buyback starts pulling from LP fees.
Price
$2.516e-7
USD · spot from primary pool
FDV
$25.16K
100B supply × price
24h Volume
No trades yet
pre-launch window
Pool Liquidity
$2.43K
KEYNOTE / USDC
Live tier source: GeckoTerminal · as of · fetched server-side at render.
the v1 → v2 redeploy, on the record.
There are two KEYNOTE contracts on Base. The first lived for 24 hours on Clanker; the canonical one lives on Liquid. We're calling out the redeploy publicly now because indexers still see both — and because the reasoning is part of Lectern's brand position.
The first KEYNOTE went live via Clanker on 2026-05-23 and was superseded by the v2 on Liquid 24 hours later. We never publicly announced the v1; the redeploy happened quietly while liquidity was small + dispersion across holders was a handful of wallets we coordinated with directly. Calling it out now because discovery surfaces (block explorers, indexers) still index the v1 address and we want the reasoning on the record.
Clanker is a healthy contribution to Farcaster legacy — a launchpad tuned for that ecosystem, with LP-fee mechanics that fund Farcaster legacy operations and creator rewards through Neynar's infrastructure. We're sympathetic to teams iterating in public on hard problems, and Clanker has shipped a lot.
But Lectern's entire pitch is sovereignty + protocol-agnosticism — your keys in your Keychain, no app-layer intermediary deciding what you see. In practice today the macOS client reads + writes via Quilibrium's Hypersnap (the one Snapchain-spec hub we've found reliable for post-2024 FIDs); other hubs are wired in the multi-hub submitter but are no-ops in production until they catch up to the live FID space. That's honest about the current state — and the point is that Lectern can switch the default the moment another hub becomes viable, with no token-level lock-in.
That stance gets harder to make credibly when the token underwriting it routes a slice of its economics to one specific app-layer roadmap. Liquid Protocol's launchpad lets us keep the LP-fee routing entirely within our ownTreasury splits (40 / 30 / 15 / 15 USDC; 85 / 15 KEYNOTE buyback) so the upside of the token funds Lectern + its users directly, with no tether to a third party's direction.
Same supply (100B), same vault terms (90B / 36mo / 7d cliff), same on-chain mechanics. The only thing that changed is who collects the LP fees + where they flow.
if a tracker still shows the v1 address: ask them to update to 0xC085C7232aA4eC067238082eb74C83c1952e8826. v1 has no liquidity + no Lectern integration and will not be supported in the macOS app.
token launches before the product ships.
$KEYNOTE went live on Base mainnet 2026-05-24 (block 46416178). The 60-day gap between token launch and v0.2.0 release is the audience-acquisition window — EngagementBudget funds boosted Farcaster casts via @lectern and paid placements through Farcaster-native services; weekly public Treasury reports build trust; the Pro allocation pool accumulates from T+7d (Liquid platform-min vault cliff) through T+60d. At v0.2.0 ship, the accumulated KEYNOTE pool disburses 70% to founder (OZ VestingWallet, 12-month cliff) and 30% to first-4-week Pros via 4 weekly Sablier MerkleInstant campaigns at 40 / 30 / 20 / 10 %. Operator is on a 60-day no-USDC-pay cliff enforced by OZ VestingWallet.
Spec lock
Design finalized; 2 custom contracts written + internally reviewed; 4 vetted primitives identified + verified on-chain
Token launch
Liquid Protocol deploys $KEYNOTE. All contracts live. Vault unlock + LP-fee buyback begin accumulating. v0.2.0 NOT yet shipped.
60-day gap window
Audience-bootstrap period. EngagementBudget funds Farcaster sponsored casts via @lectern + dogfood boosts. Weekly public Treasury reports. Founder no-USDC-pay cliff (contract-enforced).
v0.2.0 ships
macOS app launches with curated feed + boost + staking + KEYNOTE Settings. Gap pool disburses (70% founder vest / 30% first-30d Pros). First boost epoch begins.
Stabilization
Settlement signal tuning, runway-tied burn first adjustment, community comms cadence
60d vault drip + 60d LP-fee buyback at modest volume
founder vest (12mo) / first-30d v0.2.0 Pros (decay-weighted)
contract-enforced · 15% USDC auto-reroutes to EngagementBudget
the rules we hold ourselves to.
Specification commitments. Engineering rigor before mainnet. Risks that could derail launch — flagged with mitigations, not hidden in a footnote.
implementation guarantees
engineering rigor before mainnet. these are gates, not aspirations.
95% minimum unit-test coverage
Every contract ships with Foundry tests reaching 95% line coverage minimum. Measured by forge coverage. Numbers surfaced on this page, per contract.
Adversarial testing on every contract
Foundry fuzz tests on every external function (millions of inputs per run). Foundry invariant tests on state machines. Echidna property-based testing for state-machine adversarial sequences. Slither static analysis on every commit.
Verified bytecode on Basescan
Every deployed contract verified on Basescan + Basescan-Sepolia at the moment of deployment. Solidity source publicly readable at the contract page. No GitHub repo or fork-friendly packaging — contracts are app infrastructure, not a library.
Public Sepolia exposure before mainnet
Full contract suite deployed to Base Sepolia weeks before mainnet. Anyone can inspect bytecode, fuzz, or report findings. Sample boost → settle → claim transactions seeded for traceability. Test KEYNOTE faucet available.
48-hour timelock on critical operations
Treasury withdrawals, burn-tier changes, and any contract upgrades pass through an OpenZeppelin TimelockController with a 48-hour delay. Detection window for fat-finger or compromise scenarios is non-zero.
External audit when economic value warrants
Audit (Macro / Spearbit / Cantina / Sherlock) commissioned when TVL crosses ~$500k or six months post-launch — whichever first. Audit is roadmap, not launch gate. Internal rigor above is the launch gate.
Token + product designed in lockstep
The 36-month vesting cycle, weekly settlement cadence, and v0.2.0 product surfaces were specified together. No "token first, product later" mismatch — the curated feed is the reason the token exists.
protocol commitments
rules baked into the contracts and the operating cadence
Founder USDC pay
60-day cliff, contract-enforced by OZ VestingWallet. USDC accrues from day 1 (the 15% USDC PushSplit slot routes in continuously); release blocked until cliff end. Post-cliff: founder.cold calls release(USDC) at will.
Founder KEYNOTE
Runway-tied % (20–40%) of KEYNOTE-from-renewals + 70% of the gap-accumulation pool. 12-month cliff contract-enforced by OZ VestingWallet. Same accrual-then-cliff mechanism as Founder USDC pay.
No pre-mint, no insider airdrop
All operator KEYNOTE flows through public, on-chain mechanisms tied to launch milestones or runway.
Multisig everything mutable
All discretionary wallets are Safe 2-of-3 (team + ops + arms-length advisor). Founder cliffs use immutable OZ VestingWallet; per-epoch distribution uses immutable Sablier MerkleInstant — no per-recipient discretion on either.
No promised yield
Staking yield is LP-fee-derived (volume-tied), never inflationary.
No protocol redemption rights
KEYNOTE ↔ USDC only via the Uniswap pool at market.
Public ledger of every multisig outflow
Every multisig spend includes a memo and posts a one-liner. Transparency, not honor system.
Vetted infrastructure for financial paths
OZ VestingWallet (founder cliffs), Sablier MerkleInstant (per-epoch distribution), 0xSplits (revenue routing), and Safe (multisigs) carry billions in TVL collectively. Lectern's custom Solidity is restricted to the two contracts that genuinely require custom logic.
operational security · solo team
lectern is a one-person team. “multisig” with one signer is theater. here's how we get to real security anyway, phased by tvl.
self-multisig + timelock
2-of-3 Gnosis Safe with all 3 keys held by the operator on different hardware wallets in different physical locations. OZ TimelockController fronts every critical operation with a 48h delay. OpenZeppelin Defender Sentinels monitor for queued tx and alert in real time.
- ·Protects against single-device theft, phishing capturing one key, lost device, fat-finger transactions
- ·Doesn't protect against full operator compromise — that requires phase 2
add trusted advisor signer
Replace the third key in the 2-of-3 Safe with a key held by a trusted advisor, co-founder, or long-term collaborator. Day-to-day operations stay solo; the advisor only signs critical operations after reviewing the queued tx. Massive jump in compromise resistance.
- ·Step up in security signaling for users with real funds at stake
audit + optional custody
External audit becomes economically rational. Optionally, replace one Safe key with a custody service (Sygnum, Coinbase Custody, Anchorage) as a catastrophic-loss backstop. Adds custodial element but provides off-site recovery posture.
- ·This is when "multisig" stops being theater and starts being institutional-grade
what could go wrong
flagged with mitigations · not hidden in a footnote
Pre-v0.2.0 launch = "where's the product" optics
Weekly Treasury reports; public balance dashboard; visible EngagementBudget spend on boosted Farcaster casts via @lectern + paid placements through Farcaster-native services; clear v0.2.0 roadmap.
KEYNOTE price collapse from thin float
Reduced buyback pressure (0.16% vs 0.64% of swap) means less natural floor. Vault drip + Pro USDC + LP-fee USDC fund ops independently of token price.
Treasury USDC inflow depends on pool volume
Pro USDC sub remains as revenue floor. Monitor 30d volume; intervene if <$1k/day for 60d.
Sybil farms exceed per-FID cap
Aggressive tenure multiplier; FID registration cost (~$1.50) raises bar; per-FID cap of 5% per cast.
Settlement bot is centralization point
Accept centralization in v1; document v2 open-market path with bonded operators.
First-epoch settlement-bot bug pays wrong addresses
Testnet dogfood + manual review of first 3 mainnet epoch roots before automation. Same manual review applies to the 4 weekly gap-pool campaigns.
Vetted primitive vulnerability (OZ / Sablier / 0xSplits / Safe)
Trade-off accepted explicitly. All four primitives carry years of production use across many integrations and hold significant TVL collectively. Risk surface is shared infra, not Lectern-authored.
PushSplit distribute() requires call (not auto)
Distributor-reward incentive draws bots/MEV to call distribute() within minutes. Cron fallback documented for splits sitting undistributed >24h.
$keynote launches summer 2026.
Specification is locked. Contract suite implementation is underway with a 95% test-coverage gate before mainnet. Lectern v0.2.0 ships 60 days after token launch. The 36-month vesting cycle and the curated-feed product are designed in lockstep — not bolted together.
Read more
/keynote.md — full LLM-readable design spec·/llms.txt — site index for AI agents