Verification Ledger
This page is the ledger behind every other page on this site. Each number, address, endpoint, and parameter published on docs.vessel.wtf appears below with the source it was read from and the date it was read. If a claim is not in this ledger, it is not verified, and the page that needs it says so.
Every page footer links here. That is deliberate. A yield protocol asking for deposits owes its readers the provenance of its own documentation.
Method
Facts on this site come from two layers, checked against each other.
- MONSKILLS first. MONSKILLS v0.7.2 (skills.devnads.com), installed
locally on 2026-08-29, is the first authority for Monad facts: gas
semantics, chain endpoints, canonical addresses, execution model, tooling
support. Skill tags used on this site:
monskills/gas,monskills/addresses,monskills/concepts,monskills/indexer,monskills/tooling-and-infra. - Primary sources second. Every MONSKILLS fact that carries risk was
cross-checked against the primary source the same day:
docs.monad.xyz,docs.perpl.xyz,docs.kuru.io, themonad-crypto/protocolsregistry,docs.pendle.finance, viem and ethereum-lists chain definitions, and the projects' own repositories. Where the layers disagree, the primary source wins and the disagreement is recorded in the Conflicts section below — it is not silently resolved.
Every page on this site carries verified_by and verified_at frontmatter.
The footer renders both. verified_by lists only the source tags actually
used on that page.
Anything that could not be verified renders the amber chip — like this UNVERIFIED — PENDING GATE-0 — or is written out as a gap in plain prose. Nothing on this site is estimated, and no missing fact is omitted silently. The full register of open gaps is the Gaps section below.
THE LEDGER
Every load-bearing claim
All rows verified 2026-08-29 unless a row says otherwise.
Monad network
| Claim | Value | Source | Verified |
|---|---|---|---|
| Chain ID, mainnet | 143 (0x8F) | docs.monad.xyz + viem + ethereum-lists, all agree | 2026-08-29 |
| Chain ID, testnet | 10143 (0x279F) | docs.monad.xyz + viem + ethereum-lists, all agree | 2026-08-29 |
| RPC, mainnet | https://rpc.monad.xyz (primary; QuickNode, 25 rps, batch 100); also rpc1 (Alchemy), rpc2 (Goldsky), rpc3 (Ankr), rpc-mainnet.monadinfra.com | docs.monad.xyz, monskills/addresses | 2026-08-29 |
| RPC, testnet | https://testnet-rpc.monad.xyz (primary; 50 rps, batch 100, archive; 25 rps for eth_call/eth_estimateGas); also rpc.ankr.com/monad_testnet, rpc-testnet.monadinfra.com | docs.monad.xyz, monskills/addresses | 2026-08-29 |
| WSS, mainnet | WSS variants exist for all five mainnet RPC hosts | docs.monad.xyz | 2026-08-29 |
| WSS, testnet | testnet-rpc.monad.xyz, rpc-testnet.monadinfra.com | docs.monad.xyz | 2026-08-29 |
| Explorers, mainnet | monadvision.com (BlockVision), monadscan.com (Etherscan) | docs.monad.xyz (see Conflict 2) | 2026-08-29 |
| Explorers, testnet | testnet.monadvision.com, testnet.monadscan.com | docs.monad.xyz (see Conflict 2) | 2026-08-29 |
| Block time | 300ms | docs.monad.xyz (see Conflict 1) | 2026-08-29 |
| Finality | 300ms speculative, 600ms full | docs.monad.xyz (see Conflict 1) | 2026-08-29 |
Gas
| Claim | Value | Source | Verified |
|---|---|---|---|
| Gas is charged on the gas limit | Verbatim below this table | docs.monad.xyz gas-pricing.md, monskills/gas | 2026-08-29 |
| Block gas limit | 200M | docs.monad.xyz gas-pricing.md, monskills/gas (values match) | 2026-08-29 |
| Per-transaction gas limit | 30M | docs.monad.xyz gas-pricing.md, monskills/gas | 2026-08-29 |
| Minimum base fee | 100 MON-gwei | docs.monad.xyz gas-pricing.md, monskills/gas | 2026-08-29 |
| Cold access repriced up | cold account access 10,100 gas (Ethereum 2,600); cold storage access 8,100 (Ethereum 2,100); warm access 100, unchanged. Affects BALANCE, EXTCODE*, CALL*, SELFDESTRUCT, SLOAD, SSTORE | monskills/gas | 2026-08-29 |
| Precompiles repriced up | ecRecover 6,000 (2×); ecAdd 300 (2×); ecMul 30,000 (5×); ecPairing 225,000 (5×); blake2f 2×; point evaluation 200,000 (4×) | monskills/gas | 2026-08-29 |
The gas-charging rule, verbatim from the primary source:
"In Monad, the gas charged for a transaction is the gas limit set in the transaction, rather than the gas used in the course of execution."
—
docs.monad.xyz/developer-essentials/gas-pricing.md
Contract verification procedure
| Claim | Value | Source | Verified |
|---|---|---|---|
| Verification guide | docs.monad.xyz/guides/verify-smart-contract (Foundry and Hardhat sub-guides) | docs.monad.xyz | 2026-08-29 |
| Sourcify verifier (MonadVision), no API key | https://sourcify-api-monad.blockvision.org/ | docs.monad.xyz | 2026-08-29 |
| Monadscan path | --verifier etherscan --etherscan-api-key ...; Hardhat uses the Etherscan V2 API with chainid=143 (or 10143) | docs.monad.xyz | 2026-08-29 |
| foundry.toml requirements | metadata = true, metadata_hash = "none", use_literal_content = true; template at monad-developers/foundry-monad | docs.monad.xyz | 2026-08-29 |
The Foundry command, verbatim from the guide (use chain 10143 for testnet):
forge verify-contract <addr> <name> --chain 143 --verifier sourcify \
--verifier-url https://sourcify-api-monad.blockvision.org/
Caveat from the guide: verify commands can print errors even when verification succeeded — confirm on the explorer.
Oracles
| Claim | Value | Source | Verified |
|---|---|---|---|
| Supported on both networks | Chainlink, Chronicle, Pyth, Redstone, Stork, Supra, Switchboard — listed as "supported", the docs' own word; this ledger does not upgrade it to "live" | docs.monad.xyz/tooling-and-infra/oracles | 2026-08-29 |
| Gelato VRF | Testnet table only; absent from the mainnet table, unexplained | docs.monad.xyz/tooling-and-infra/oracles | 2026-08-29 |
Which oracle Vessel itself reads is an open gap — see Gaps below.
Perpl
| Claim | Value | Source | Verified |
|---|---|---|---|
| Status | Live on Monad mainnet ("Mainnet (the default, live trading)"), plus testnet | docs.perpl.xyz | 2026-08-29 |
| Exchange contract, mainnet | 0x34B6552d57a35a1D042CcAe1951BD1C370112a6F — also the sole address in the registry's mainnet perpl.jsonc | docs.perpl.xyz, monad-crypto/protocols | 2026-08-29 |
| Exchange contract, testnet | 0x1964C32f0bE608E7D29302AFF5E61268E72080cc | docs.perpl.xyz | 2026-08-29 |
| REST base, mainnet | https://app.perpl.xyz/api (WS wss://app.perpl.xyz) | docs.perpl.xyz | 2026-08-29 |
| REST base, testnet | https://testnet.perpl.xyz/api | docs.perpl.xyz | 2026-08-29 |
| Public context endpoint | GET /api/v1/pub/context returns Context { chain, instances, tokens, markets }, no auth | docs.perpl.xyz | 2026-08-29 |
| Rate-limit model | Trading and market data are separate servers with separate limits. Trading WS /ws/v1/trading: 120 req/min mainnet (60 testnet), 4 connections per wallet address — the cap is keyed on the owning wallet, not the individual key. Market-data WS /ws/v1/market-data: 10 req/min, 16 subscriptions per connection | github/PerplFoundation api-docs (see Conflict 3) | 2026-08-29 |
| Fee field semantics | f is total fees paid, gross (protocol + builder); bfa is the builder portion, omitted when zero — never sum f + bfa. tbf is lifetime builder fees, already included in tf — sibling field, never sum tbf + tf. Fee tier ft (uint8, indexes MarketConfig maker/taker fees) arrives on account update mt 21; earned from rolling 14-day volume, resolved on-chain at fill time — re-read on every update, never cache. mt 24 is OrdersUpdate, mt 25 is FillsUpdate; frames carry arrays | github/PerplFoundation api-docs | 2026-08-29 |
| delegated-account | "A smart contract that holds an account on the Perpl Exchange with separated owner/operator roles" — BeaconProxy DelegatedAccount; operator restricted by a function-selector allowlist (execOrder, execOrders, ...); withdrawCollateral is owner-only and permanently blocked for the operator. Mainnet Factory 0xc535276e3e446e4f28d95ed27ccd5c32e4c8907a. BUSL-1.1 | github/PerplFoundation | 2026-08-29 |
| Brand kit | Official, PNG-only, Notion page linked from the perpl.xyz footer | docs.perpl.xyz | 2026-08-29 |
One attribution guard: the phrase "programmable smart account with whitelist-only DeFi delegation" describes a different PerplFoundation repo (invairiant), not delegated-account. This site does not use it for either.
Kuru
| Claim | Value | Source | Verified |
|---|---|---|---|
| Status | Live on mainnet and testnet — docs publish addresses for both; the registry's kuru.jsonc has live: true on both | docs.kuru.io, monad-crypto/protocols | 2026-08-29 |
| Core addresses, mainnet | KuruFlowEntrypoint 0xb3e6778480b2E488385E8205eA05E20060B813cb; Router (market factory) 0xd651346d7c789536ebf06dc72aE3C8502cd695CC; MarginAccount 0x2A68ba1833cDf93fa9Da1EEbd7F46242aD8E90c5; markets MON-USDC 0x065C9d28E428A0db40191a54d33d5b7c71a9C394, MON-AUSD 0x131a2e70a5b31a517a74b8c567149bc294470da9 | docs.kuru.io (label caveat: Conflict 5) | 2026-08-29 |
| Core addresses, testnet | Router 0x7EFbE105Ca7415dE98F96622173458ac1c054630; MarginAccount 0xd029C2D98ff85D8F64799017fE00a59B1159CE02; market MON-USDC 0xa241896A7Dbe8a550D2E5fF7A914bB1989ceD2D9 | docs.kuru.io | 2026-08-29 |
| OrderBook entry points | Verbatim signatures published at docs.kuru.io, e.g. addBuyOrder(uint32 _price, uint96 _size, bool _postOnly), placeAndExecuteMarketBuy(uint96 _quoteSize, uint96 _minOut, bool _isMargin, bool _isFOK) external payable, batchCancelOrders(uint40[] _orderIds) | docs.kuru.io | 2026-08-29 |
| Brand kit | None published — this site renders a text wordmark only | docs.kuru.io | 2026-08-29 |
PuddleSwap
| Claim | Value | Source | Verified |
|---|---|---|---|
| Exists | Live landing page and app; "Forked from Uniswap V2, deployed on Monad Testnet"; contracts stated stock/unmodified V2 by its own README | puddleswap.org | 2026-08-29 |
| Networks | Testnet only. No mainnet deployment exists; this site publishes no PuddleSwap mainnet address | puddleswap.org | 2026-08-29 |
Testnet addresses (chain 10143) | UniswapV2Router02 0x430c23895c8D44883526e3E0B09327dAD8766660; UniswapV2Factory 0xd498f5beBD0C9f1FE0135a0Cf942dA67Ee6e8A9B; WMON 0x97B3070F9Da6C002343862b35E68Bd8e22608943; USDC 0x534b2f3A21130d7a60830c2Df862319e593943A3 — consistent across its README, llms.txt, and address config | puddleswap.org (single-party) | 2026-08-29 |
| Single-party caveat | These addresses are project-published only. No third-party registry vouches for them, and the deployed bytecode has not been independently checked against stock V2. PuddleSwap describes itself as unaudited, testnet-only software | puddleswap.org | 2026-08-29 |
| Registry presence | Absent from monad-crypto/protocols — full tree checked | monad-crypto/protocols | 2026-08-29 |
Pendle
| Claim | Value | Source | Verified |
|---|---|---|---|
| Status | Pendle core contracts are deployed on Monad mainnet — the Deployments page lists Monad (143); router bytecode confirmed live via rpc.monad.xyz this session. No Vessel or Hull market exists on it | docs.pendle.finance, on-chain check | 2026-08-29 |
| Core addresses, mainnet | Router 0x888888888889758F76e7103c6CbF23ABbF58F946; syFactory 0x466CeD3b33045Ea986B2f306C8D0aA8067961CF8 (143-core.json, pendle-core-v2-public) | docs.pendle.finance | 2026-08-29 |
| Standard | SY (Standardized Yield) is the Pendle-authored wrapping standard; the formal spec is ERC-5115 (Draft) | eips.ethereum.org, docs.pendle.finance | 2026-08-29 |
| Listing rules | Most non-ERC-4626 assets need a custom SY contract; the underlying must be a fully transferable ERC-20 with no locking or vesting and up-only yield; "All custom SY contracts must be audited." SY deployment and market creation are permissionless; a market takes an expiry timestamp | docs.pendle.finance | 2026-08-29 |
Ecosystem registry and brand assets
| Claim | Value | Source | Verified |
|---|---|---|---|
| monad-crypto/protocols | Per-protocol address registry: 177 mainnet files, 17 testnet files. kuru on both networks; perpl, pendle, uniswap mainnet only; puddleswap absent | github.com/monad-crypto/protocols | 2026-08-29 |
| Monad brand assets | Official kit at monad.xyz/brand-and-media-kit — SVGs downloadable; primary color #6E54FF; fonts Britti Sans, Inter, Roboto Mono. Logomark self-hosted on this site at /logos/monad.svg | monad.xyz/brand-and-media-kit | 2026-08-29 |
Vessel
Hull's rate is a contract parameter, not a yield forecast. Every row below is a design parameter from the litepaper, restated here exactly as published.
| Claim | Value | Source | Verified |
|---|---|---|---|
| Hull rate formula | r_H = clamp(EWMA_30d(net funding APR) × (1 − h), 0, r_cap) — a contract parameter | vessel.wtf/litepaper | 2026-08-29 |
Haircut h | 40% | vessel.wtf/litepaper | 2026-08-29 |
Rate cap r_cap | 15% APR (a parameter ceiling, not a projection) | vessel.wtf/litepaper | 2026-08-29 |
| Subordination floor | B / (H + B) ≥ θ_min = 20%, enforced at all times; constrains new Hull issuance and Ballast withdrawals | vessel.wtf/litepaper | 2026-08-29 |
| Reserve target | 2% of TVL, funded from the protocol-fee split | vessel.wtf/litepaper | 2026-08-29 |
| Ballast cooldown | 48 hours, plus the subordination floor | vessel.wtf/litepaper | 2026-08-29 |
| Protocol fee | 10% of max(G, 0); half to Reserve until target, rest to treasury | vessel.wtf/litepaper | 2026-08-29 |
| Conservation invariant | ΔNAV_Hull + ΔNAV_Ballast + ΔReserve + fees = G every epoch; enforced in code and fuzzed | vessel.wtf/litepaper | 2026-08-29 |
| Leverage | λ ≤ 2 at launch; spot λ/(1+λ), short margin 1/(1+λ), hedged notional λ/(1+λ) | vessel.wtf/litepaper | 2026-08-29 |
| Delta band | Net delta within 1% of gross notional; rebalance on band breach or a 4-hour timer | vessel.wtf/litepaper | 2026-08-29 |
| Liquidation safety | Short-leg liquidation price sits ≥ 40% above mark; a buffer breach triggers automatic de-risking, never added leverage | vessel.wtf/litepaper | 2026-08-29 |
| Idle buffer | 10% idle USDC held unhedged | vessel.wtf/litepaper | 2026-08-29 |
| Hedge venue today | SimVenue SIMVENUE — SIMULATED — a simulated venue with an owner-settable funding rate, behind the IVenue interface; Perpl integration is next | vessel-team-brief | 2026-08-29 |
| Public repository | github.com/Lemma-Development-Labs/vessel contains only a README and LICENSE as of 2026-08-29 — no contracts, no addresses, no ABIs. Every contract-level artifact is therefore unverified and rendered as design-stage | vessel-repo | 2026-08-29 |
| testnet.vessel.wtf | DNS does not resolve as of 2026-08-29. Not live; not linked as a working URL anywhere on this site. The testnet app is reached from vessel.wtf | vessel-repo session check, user-confirmed | 2026-08-29 |
Conflicts
Five source conflicts were recorded during the 2026-08-29 verification sweep. None is resolved silently; each resolution is stated with its reason.
- Block time and finality. Current
docs.monad.xyzsays 300ms blocks, 300ms speculative / 600ms full finality. MONSKILLS v0.7.2 and the Vessel litepaper itself still say 400ms / 800ms. Resolution:docs.monad.xyzwins; the other two are stale. This site never ships 400ms/800ms as current, and notes where relevant that the litepaper predates the current network figures. - Testnet explorer.
docs.monad.xyzliststestnet.monadvision.comandtestnet.monadscan.com; viem and ethereum-lists still listtestnet.monadexplorer.com, which currentdocs.monad.xyzdoes not reference. Resolution: ship thedocs.monad.xyzset. - Perpl WebSocket rate limits. The api-docs README describes separate
trading and market-data servers with wallet-keyed connection caps;
docs.perpl.xyzwebsocket.md says roughly 50 messages/sec per connection and roughly 5 connections per IP, combined. Both are official. Resolution: this site states the api-docs model and notes the discrepancy wherever limits appear. - Perpl testnet collateral token. Two official sources (api-docs and
docs.perpl.xyz) disagree on the address. Resolution: unresolved; this site publishes neither address. - Kuru router labels.
0x0d3a1BE29E9dEd63c7a5678b31e847D68F71FFa2is labelled "KuruFlowRouter" by the docs but "KuruFlowRouterV2" by the registry, whose plain KuruFlowRouter is0x465D06d4521ae9Ce724E0c182Daad5D8a2Ff7040. Resolution: any page listing either address cites which source supplied the label.
Gaps
The unverified register. Each item below is something this site wanted to publish and could not verify on 2026-08-29. None is estimated; each renders the amber chip or a plain-prose gap wherever it would otherwise appear.
- Vessel contract addresses, ABIs, and event signatures UNVERIFIED — PENDING GATE-0 — the public repository holds only a README and LICENSE; nothing deployed is publicly attributable to Vessel yet.
- Indexer endpoint UNVERIFIED — PENDING GATE-0 — no Envio GraphQL API URL exists
to publish. The pipeline itself is documented (
monskills/indexer), and it requires a deployed, explorer-verified contract before import — which is blocked on the gap above. - Perpl builder-code value UNVERIFIED — PENDING GATE-0 — the litepaper names execution rebates via a Perpl builder code; the code itself is unpublished.
- Security contact UNVERIFIED — PENDING GATE-0 — no published disclosure address or policy.
- Oracle wiring UNVERIFIED — PENDING GATE-0 — which of the supported providers Vessel reads, and which feed IDs, is not published.
- Vessel–Kuru route status UNVERIFIED — PENDING GATE-0 — the spot-leg integration is stated as in development; no deployed route is publicly verifiable.
- Formal whitepaper UNVERIFIED — PENDING GATE-0 — the litepaper is the only published specification.
- Testnet app URL UNVERIFIED — PENDING GATE-0 — testnet.vessel.wtf does not resolve; until it does, the app is reached from vessel.wtf and no standalone testnet URL is published.
Re-verification
This ledger is not a one-time artifact.
- A full verification sweep runs before any demo. Nothing above is presented live without a same-day re-check of the rows it depends on.
- Integration tier claims are re-derived from deployed state, not from prior
pages: code presence via
cast code <addr> --rpc-url <rpc>, endpoints by calling them, addresses against the registries named above. - Every row carries its verification date. When a row is re-verified, the date changes; when a source changes, the row changes and the conflict — if one appears — is recorded here, not smoothed over.
If you find a row this ledger gets wrong, that is a finding this protocol wants.