# $KEYNOTE — Lectern curation-economy token

> Curation token for Lectern Pro on Base. Pros receive a weekly KEYNOTE allocation they spend to *boost* casts in Lectern's Pro-exclusive curated feed. Engagement on boosted casts pays the caster (70%) and engagers (30%) via off-chain Merkle settlement posted to LecternBoostEscrow. Cast metadata is never modified — escrow contract events are the source of truth. Foreign Farcaster clients see nothing (Pro-exclusive moat).
>
> **Spec:** v2 (2026-05-22). Architecture refinement 2026-05-22: replaced 3 hand-rolled distributors with vetted primitives (Sablier + 0xSplits). 6 custom contracts → 2. Same economics, smaller audit surface. Token launches summer 2026. Lectern v0.2.0 ships 60 days after.

---

## Token + supply

| Lever | Setting |
|---|---|
| Launch tool | Liquid Protocol |
| Chain | Base (8453) |
| Symbol | $KEYNOTE |
| Total supply | 100B (factory hardcoded) |
| Paired token | USDC `0x833589fcd6edb6e08f4c7c32d4f71b54bda02913` |
| Fee tier | 1% static (`LiquidHookStaticFeeV2`) |
| Initial market cap | 10 ETH (~$25,000 at ETH ≈ $2.5k) |
| Initial price | ~$0.00000025 |
| Vault % | 90% (max allowed by Liquid) |
| Lockup | 7 days (Liquid platform minimum) |
| Vesting | 36 months linear |
| Initial circulating | 10B (post-LP) |
| Daily unlock | ~83M KEYNOTE |
| Weekly unlock | ~580M KEYNOTE |

---

## LP fee distribution (per 1% LP fee on a swap)

- 0.20% → Liquid protocol (fixed)
- 0.80% → creator share, split:
  - **0.64% of swap → USDC route** (`FeePreference.Paired`) — routed via 0xSplits PushSplit to the 4 USDC wallets
  - **0.16% of swap → KEYNOTE buyback** (`FeePreference.Liquid`, auto-swapped via `LiquidLpLockerFeeConversion`) — split:
    - 85% → Pro allocation pool (batched into weekly Sablier MerkleInstant campaigns)
    - 15% → Staker yield pool (batched into weekly Sablier MerkleInstant campaigns)

Net buy pressure on the pool: ~0.16% of swap volume. Reduced from earlier 0.64% draft to prioritize Treasury USDC operating revenue over speculative buyback flywheel.

---

## Vault unlock flow

100% of Liquid vault unlock routes to the weekly Sablier MerkleInstant Pro-allocation campaigns. Treasury operating ops are funded from USDC streams only; vault tokens are not consumed for ops.

**Per-Pro allocation:**
- ~580M KEYNOTE/week into the Pro allocation pool from vault
- 100 Pros = ~5.8M KEYNOTE/Pro/week
- 1000 Pros = ~580K KEYNOTE/Pro/week
- USDC-equivalent value depends on pool quote; the design works the same at any token price

---

## USDC wallets (fed from LP fees 80% slice + 100% of Pro USDC subs via 0xSplits PushSplit)

### OperationsTreasury — 40%
- **Purpose:** Hosting, RPC, gas reserves, audit, app store, legal
- **Kind:** Safe 2-of-3 multisig


### EngagementBudget — 30%
- **Purpose:** Farcaster sponsored casts via @lectern, dogfooding boosts through the app, contests, partner integrations.
- **Kind:** Safe 2-of-3 multisig


### Reserve — 15%
- **Purpose:** Opportunistic / emergency / unplanned audit findings
- **Kind:** Safe 2-of-3 multisig (memo required on spend)


### FounderPay — 15%
- **Purpose:** Operator compensation
- **Kind:** OZ VestingWallet
- **Note:** 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 / contracts

### LecternBoostEscrow
- **Source:** Boost deposits from any KEYNOTE holder
- **Purpose:** Hold boosted KEYNOTE per cast; admin posts weekly Merkle root for engagement settlement (70% caster / 30% engagers); recipients claim with 12-week claim window
- **Kind:** Custom contract (153 LOC, internal review, Solidity 0.8.28)

### LecternStakingVault
- **Source:** User stakes
- **Purpose:** Hold 25M/50M/100M KEYNOTE stakes for Pro USDC discount tiers; expose `tierOf`, `discountBpsOf`, `isProEligible` view ABI consumed by LicenseGate
- **Kind:** Custom contract (96 LOC, internal review, Solidity 0.8.28)

### Pro allocation pool
- **Source:** Vault unlock (100%) + 85% of LP-fee KEYNOTE buyback
- **Purpose:** Weekly Pro curation allocation to active Pros
- **Kind:** Sablier MerkleInstant — new campaign per epoch (12-week claim window, admin clawback on expiry)

### Staker yield pool
- **Source:** 15% of LP-fee KEYNOTE buyback
- **Purpose:** Weekly pro-rata yield to stakers by stake × min(stake_days, 730)
- **Kind:** Sablier MerkleInstant — new campaign per epoch

### LP-fee KEYNOTE buyback router
- **Source:** Liquid `FeePreference.Liquid` slice (20% of creator share, auto-swapped USDC → KEYNOTE)
- **Purpose:** Split buyback 85/15 between Pro allocation pool and Staker yield pool
- **Kind:** 0xSplits PushSplit (fixed, no rotation)

### KEYNOTE-from-renewals router
- **Source:** KEYNOTE-paid Pro renewals (the 5%-discount fallback path)
- **Purpose:** Split incoming KEYNOTE per runway-tied burn schedule into BurnAddress / EngagementTokens / FounderTokens
- **Kind:** 0xSplits PushSplit per runway tier (4 immutable splits; app config selects active). KEYNOTE → USDC pricing handled off-chain by PaymentVerifier (GeckoTerminal + Dexscreener + Alchemy median).

### EngagementTokens
- **Source:** Variable % from KEYNOTE-paid Pro renewals (runway-tied)
- **Purpose:** Token-denominated contests, bounties, partnerships
- **Kind:** Safe 2-of-3 multisig

### FounderTokens
- **Source:** Variable % from KEYNOTE-paid Pro renewals + 70% of gap-accumulation pool
- **Purpose:** Operator long-term alignment
- **Kind:** OZ VestingWallet — 12-month cliff (start = tokenLaunchTimestamp + 365d, duration = 1s, beneficiary = founder cold). Same template as FounderPay USDC.

### BurnAddress
- **Source:** Variable % from KEYNOTE-paid Pro renewals (runway-tied)
- **Purpose:** Deflationary supply pressure
- **Kind:** 0x000…dEaD — no code; functional burn (supply trackers subtract the dead-address balance)

---

## Boost mechanism (no cast modification)

The cast Message is **never touched**. Boosting works entirely off-Hub:

1. Booster (any KEYNOTE holder — Pro or not) calls `LecternBoostEscrow.boost(castHash, amount)` on Base.
2. Escrow emits `CastBoosted(castHash, booster, amount)`.
3. Lectern macOS indexer watches Base for these events, builds cache.
4. Curated feed ranks boosted casts by mode (`mostBoosted` / `rising` / `trending`).
5. Foreign Farcaster clients see nothing. Pro-exclusive moat is structural.

The escrow stores `castHash` on deposit. The cast doesn't need a back-reference. Engagement attribution comes from Hub messages being EdDSA-signed by their authors — already unforgeable FID proof.

---

## Pro discount paths

### USDC sub (default, no discount)
- **Tag:** default
- **Revenue impact:** None
- **Token impact:** None

### Stake to discount — 15% off (max tier)
- **Tag:** primary KEYNOTE utility
- **Revenue impact:** Discount only (no payment loss)
- **Token impact:** KEYNOTE locked in StakingVault
- Stake 25M KEYNOTE → **15% off**
- Stake 50M KEYNOTE → **25% off**
- Stake 100M KEYNOTE → **40% off**

### Pay in KEYNOTE — 5% off
- **Tag:** demoted fallback
- **Revenue impact:** 100% USDC lost + 5% additional + runway-tied burn
- **Token impact:** Net buy + variable burn

---

## Engagement settlement (weekly Merkle)

- **Epoch:** 7 days (Monday 00:00 → +7d)
- **Grace period:** 24h after epoch close before Merkle root submitted
- **Per-cast split:** 70% caster / 30% engagers (signal × tenure weighted)
- **Per-FID cap:** max 5% of any single cast's engager pool
- **Claim window:** 12 weeks per epoch (LecternBoostEscrow `CLAIM_WINDOW`; unclaimed amounts return to admin via `reclaimEpoch`)

### Signal weights
- **Substantive reply: ×4** — >40 chars or with embeds — hardest to bot
- **Quote cast: ×3** — Effort + amplification
- **Recast: ×1.5** — Social cost
- **Like: ×0.5** — Cheapest to bot, deliberately downweighted

### Tenure multipliers
- **High Lectern-attributed cast count: ×1.5**
- **0 Lectern-attributed casts: ×0.25** — Anti-fresh-FID-farm

### Sybil defenses (settlement-side, zero-out not contract-enforced)
- Self-engagement: booster's FID engaging own boost
- Multi-account: any FID whose custody addr or primary verified addr overlaps with booster's (via `IdRegistry.idOf` + `verificationsByFid`)

---

## Runway-tied burn schedule (KEYNOTE-from-renewals)

KEYNOTE-paid Pro renewals route through a 0xSplits PushSplit per runway tier. Splits are immutable; tier transitions deploy a new split and update the app's published Pro-payment address.

| Runway (months) | Burn % | EngagementTokens | FounderTokens |
|---|---|---|---|
| < 6 | 0% | 60% | 40% |
| 6 – 12 | 15% | 55% | 30% |
| 12 – 24 | 35% | 40% | 25% |
| > 24 | 50% | 30% | 20% |

**Runway formula** (transparent, on-chain-verifiable):
```
runway_months = (OperationsTreasury + Reserve + 6mo_avg_USDC_inflow × 6) / 6mo_avg_burn_rate
```

OperationsTreasury Safe publishes monthly runway calc + resulting burn-tier setting via public memo. Tier transitions trigger a fresh PushSplit deploy + app config update.

---

## Gap-accumulation disposition

During the 60-day gap (token live, v0.2.0 not yet shipped):
- Vault accumulates: ~5B KEYNOTE
- LP-fee buyback (at modest pool volume): ~1.9B KEYNOTE
- **~7B KEYNOTE total pool**

At v0.2.0 ship, the pool disburses via a single Sablier MerkleInstant campaign:
- **70% → FounderTokens** (Sablier 12mo vest) — launch bonus for the 60-day grind
- **30% → first-28-day v0.2.0 Pros** (4 weekly Sablier MerkleInstant campaigns, 40 / 30 / 20 / 10 % across weeks 1–4 of v0.2.0. Each 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. The day-1 here is the v0.2.0 ship date (T+60d), NOT token-launch day.)

No "existing Pros loyalty bonus" — there are no existing users at token launch.

---

## Launch sequencing

Token launches **before** v0.2.0 ships.

### Spec lock (T - 14w)
Design finalized; 2 custom contracts written + internally reviewed; 4 vetted primitives identified + verified on-chain

### Token launch (T = 0)
Liquid Protocol deploys $KEYNOTE. All contracts live. Vault unlock + LP-fee buyback begin accumulating. v0.2.0 NOT yet shipped.

### 60-day gap window (T + 0 → T + 60d)
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 (T + 60d (minimum))
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 (T + 60d → T + 90d)
Settlement signal tuning, runway-tied burn first adjustment, community comms cadence

---

## Honest economics

- **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.

---

## Risk inventory

### Pre-v0.2.0 launch = "where's the product" optics — High
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 — Medium
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 — Medium
Pro USDC sub remains as revenue floor. Monitor 30d volume; intervene if <$1k/day for 60d.

### Sybil farms exceed per-FID cap — Medium
Aggressive tenure multiplier; FID registration cost (~$1.50) raises bar; per-FID cap of 5% per cast.

### Settlement bot is centralization point — Medium
Accept centralization in v1; document v2 open-market path with bonded operators.

### First-epoch settlement-bot bug pays wrong addresses — High
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) — Low
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) — Low
Distributor-reward incentive draws bots/MEV to call distribute() within minutes. Cron fallback documented for splits sitting undistributed >24h.

---

## Contracts

### Custom (Solidity 0.8.28, internal review)

- **LecternBoostEscrow** — boost(castHash, amount) → admin settleEpoch(epochId, root, total) → claim with Merkle proof (12-week window) → admin reclaim of unclaimed after window. Per-cast running totals back the curated-feed ranking. (153 LOC, 31 tests)
- **LecternStakingVault** — stake / unstake. tierOf / discountBpsOf / isProEligible view ABI for LicenseGate.swift dual-source Pro check. (96 LOC, 14 tests)

### Vetted primitives (verified on-chain via `cast code` 2026-05-22)

- **OZ VestingWallet** (OZ 5.x) — Founder cliff enforcement — deploy per-instance for FounderPay USDC (60d cliff) + FounderTokens KEYNOTE (12mo cliff). beneficiary = founder cold; start = tokenLaunchTimestamp + cliff; duration = 1s.
  - Base mainnet: `deploy per-instance from `@openzeppelin/contracts/finance/VestingWallet.sol``
  - Base Sepolia: `deploy per-instance (same source)`
- **SablierFactoryMerkleInstant** (airdrops-v3.0) — Per-epoch Merkle distribution — weekly Pro allocation + weekly staker yield campaigns. Native 12-week expiration, admin clawback on expiry.
  - Base mainnet: `0xD5a361519F6c417Cc4bCfcC15501191C816705a6`
  - Base Sepolia: `0x863b326Ef7Ce2B82d881931bE577Ba04dd4D58BE`
- **PushSplitFactoryV2.2** (v2.2) — Revenue routing — USDC 40/30/15/15 split, LP-fee KEYNOTE 85/15 split, KEYNOTE-from-renewals per-runway-tier splits
  - Base mainnet: `0x8E8eB0cC6AE34A38B67D5Cf91ACa38f60bc3Ecf4`
  - Base Sepolia: `0x8E8eB0cC6AE34A38B67D5Cf91ACa38f60bc3Ecf4`
- **SplitsWarehouse** (v2) — Failed-send fallback for PushSplit distributions
  - Base mainnet: `0x8fb66F38cF86A3d5e8768f8F1754A24A6c661Fb8`
  - Base Sepolia: `0x8fb66F38cF86A3d5e8768f8F1754A24A6c661Fb8`

### Multisigs (Safe 2-of-3)

- **OperationsTreasury / EngagementBudget / Reserve** — USDC discretionary wallets
- **EngagementTokens** — KEYNOTE discretionary wallet

### Other

- **$KEYNOTE** — ERC-20 + Liquid Protocol mechanics, deployed via liquid-sdk
- **BurnAddress** — `0x000000000000000000000000000000000000dEaD`

---

## Off-chain services

- **lctrn-boost-indexer** — Watches Base `CastBoosted` events; serves boost cache
- **lctrn-pro-allocator** — Daily cron; determines Pros for epoch; deploys weekly Sablier MerkleInstant campaign
- **lctrn-stake-yield-bot** — Weekly cron; snapshots stakers; deploys weekly staker-yield Sablier MerkleInstant campaign
- **lctrn-settlement-bot** — Weekly cron; reads Hub engagement; posts Merkle root to LecternBoostEscrow
- **lctrn-claim-api** — Serves Merkle proofs for both LecternBoostEscrow claims and Sablier MerkleInstant campaign claims
- **lctrn-runway-publisher** — Monthly cron; computes runway; if tier transition triggered, deploys new PushSplit and publishes new Pro-payment address
- **lctrn-treasury-dashboard** — Public Treasury balance feed (the trust-building cadence)
- **lctrn-split-distributor** — Optional cron; calls PushSplit `distribute()` for any active split sitting undistributed >24h (fallback for the distributor-reward market)

---

## Live testnet deployment — Base Sepolia

**Status:** live

Architecture v2 deployed + full dogfood ledger green on Base Sepolia 2026-05-23. 27 broadcasts across 5 flows exercise both custom contracts AND all 3 vetted primitives. Adversarial revert paths covered by the test suite.

For the live ledger (every tx + what moved + what it proved), see [/keynote/sepolia](/keynote/sepolia).

### Custom contracts

- **LecternBoostEscrow** 0x04bfb92807545ce623a2a42d2ce726f12805adb7 — boost(castHash, amount) → admin settleEpoch(epochId, root, total) → claim with Merkle proof (12-week window) → admin reclaim of unclaimed after window. Per-cast running totals back the curated-feed ranking. (31 tests, 153 LOC)
- **LecternStakingVault** 0x0ac9b70d2740159dbda05d7a2ebf03cb6dd91795 — stake / unstake. tierOf / discountBpsOf / isProEligible view ABI for LicenseGate.swift dual-source Pro check. (14 tests, 96 LOC)

### Vetted primitives (constant, same addresses as production)

- **OZ VestingWallet** `deploy per-instance (same source)` — Founder cliff enforcement — deploy per-instance for FounderPay USDC (60d cliff) + FounderTokens KEYNOTE (12mo cliff). beneficiary = founder cold; start = tokenLaunchTimestamp + cliff; duration = 1s.
- **SablierFactoryMerkleInstant** `0x863b326Ef7Ce2B82d881931bE577Ba04dd4D58BE` — Per-epoch Merkle distribution — weekly Pro allocation + weekly staker yield campaigns. Native 12-week expiration, admin clawback on expiry.
- **PushSplitFactoryV2.2** `0x8E8eB0cC6AE34A38B67D5Cf91ACa38f60bc3Ecf4` — Revenue routing — USDC 40/30/15/15 split, LP-fee KEYNOTE 85/15 split, KEYNOTE-from-renewals per-runway-tier splits
- **SplitsWarehouse** `0x8fb66F38cF86A3d5e8768f8F1754A24A6c661Fb8` — Failed-send fallback for PushSplit distributions

### Mock tokens (testnet only, public mint())

- **KEYNOTE (mock)** 0x20e3d5abce6a1d2c2715fbfc8932edd63fd16613 — Test ERC-20 with public mint() — anyone can grab tokens for testnet experimentation. NOT the production token.
- **USDC (mock)** 0xdbfb7f8d30fdcdee51e5bdb4d6ff6a135f28ee2e — Test ERC-20 with public mint() — 6 decimals, mirrors Base mainnet USDC. NOT the production stablecoin.

### Coverage

- 52 forge tests passing
- 100% line coverage
- 100% branch coverage
- 100% function coverage
- Invariant tests: 16,384+ random call sequences per run

### Internal security review

Internal uncertified review — target: 80% common-vector coverage. Formal external audit deferred until $500k TVL.

Common attack vectors reviewed:

- Reentrancy
- Arithmetic overflow / underflow
- Access control / privilege escalation
- Front-running / MEV
- Denial of service / griefing
- Initialization correctness
- Logic and state-transition bugs
- Storage layout / collision
- Token integration assumptions
- Approval and allowance handling
- External call safety
- Boundary input validation

---

## Redeploy workflow

If any custom contract is redeployed for ANY reason, the ledger resets to step 1. We do not ship partial coverage. Sepolia ledger reflects the most recent contiguous run only.

1. **Custom contracts deploy** — Mock USDC + Mock KEYNOTE + LecternBoostEscrow + LecternStakingVault addresses
2. **Dogfood 1 — StakingVault** — Tier 0→1→2→3 transitions + adversarial revert paths
3. **Dogfood 2 — BoostEscrow** — boost → settle → claim + adversarial revert paths
4. **Dogfood 3 — Sablier LockupLinear** — Founder stream with 1h cliff + cancel + post-cliff withdraw
5. **Dogfood 4 — Sablier MerkleInstant** — Per-epoch Merkle campaign creation + claim + hasExpired check
6. **Dogfood 5 — 0xSplits PushSplit** — Split creation + USDC + KEYNOTE distribute
7. **Ledger refresh** — Updated /keynote/sepolia content with every tx hash + what-moved + what-proved

If step 1 re-runs (deploy addresses change), steps 2–7 all re-run. The previous ledger entries are archived at /keynote/sepolia/archive/<date> but the live ledger only ever reflects one contiguous run.

Live state of this workflow: [/keynote/sepolia](/keynote/sepolia).

---

## Locked decisions

- **Initial market cap:** 10 ETH (~$25k); $KEYNOTE/USDC pair on Base
- **Vault:** 90% / 36mo linear / 7-day Liquid platform-min cliff → 100% flows to per-epoch Sablier MerkleInstant campaigns for Pros
- **LP fee split:** 80% USDC → 0xSplits PushSplit (4 USDC wallets) / 20% KEYNOTE buyback → 85% Pro allocation + 15% staker yield
- **USDC split:** 40% Operations / 30% Engagement / 15% Reserve / 15% FounderPay OZ VestingWallet
- **Pro discount paths:** USDC default → Stake (25M/50M/100M for 15/25/40% off) → KEYNOTE-paid 5% (demoted)
- **Staking yield:** 15% of the 20% LP-fee buyback (= 3% of total LP fees), pro-rata by stake×min(stake_days, 730), weekly Sablier MerkleInstant campaign, no lockup
- **Runway-tied burn:** 0% / 15% / 35% / 50% (per <6 / 6–12 / 12–24 / >24 month tiers); routed via 0xSplits PushSplit per tier
- **Gap-accumulation split:** 70% Founder (OZ VestingWallet, 12-month cliff) / 30% first-4-week v0.2.0 Pros across 4 weekly MerkleInstant campaigns at 40 / 30 / 20 / 10 %. Within each week, new Pros split that week's slice equally — early subscribers get bigger slice + paid sooner.
- **Launch sequence:** Token launches BEFORE v0.2.0 download is available
- **Custom contract surface:** 2 contracts, ~249 LOC (LecternBoostEscrow + LecternStakingVault). Everything else: Sablier (per-epoch Merkle distribution) + 0xSplits (revenue routing) + Safe (multisigs) + OZ VestingWallet (founder cliffs).
- **LecternBoostEscrow `minBoostAmount`:** 1000 KEYNOTE on mainnet (= ~$0.00025 at launch FDV). Anti-dust floor; admin-adjustable post-launch via `setMinBoostAmount`.
- **Founder cliff start timing:** Both FounderPay (60d) and FounderTokens (12mo) VestingWallets use `start = tokenLaunchTimestamp + cliff`. Funds accrue from day 1; releases unlocked at cliff end.

---

## Open decisions

1. Audit firm — Macro / Spearbit / Cantina / Sherlock; budget $5–10k for 2 custom contracts (revised down from $15–30k for 6). No formal audit until $500k TVL.
2. Settlement bot operator — Lectern team only (v1) vs. open settlement market (v2 path)
3. Per-cast engager-pool cap — 5% (suggested) vs. higher
4. Tenure multiplier curve — slow ramp (0.25× → 1.5× over 50 casts) vs. faster
5. Like signal weight — 0.5× (suggested) vs. 0.2× (more aggressive)
6. Lectern-attributed signer — fully optional vs. required for tenure-multiplier eligibility
7. Boost minimum — set a floor (e.g. 1000 KEYNOTE) to prevent dust-boost spam
8. Tier-weighted yield multiplier — pure pro-rata vs. 1.0× / 1.25× / 1.5× tier multipliers
9. Multisig advisor selection — who is the arms-length 3rd key
10. Whether to extend the FounderPay VestingWallet duration beyond 1 second (currently set so cliff-end = full unlock; alternative: a smoothing period after cliff)
11. Founder cold-key custody — hardware wallet (Ledger/Trezor) vs Safe-with-single-owner-and-timelock

---

*Cinematic version: [lctrn.app/keynote](/keynote). Live Sepolia ledger: [/keynote/sepolia](/keynote/sepolia). Site index for AI agents: [/llms.txt](/llms.txt).*
