Writing

From the lab

Technical posts, protocol updates, and occasional opinions on the state of web3 infrastructure. We write about what we are building, the decisions we made while building it, and sometimes the ones we got wrong.

Why we built CoreLend instead of forking Compound

Most lending protocol forks carry the complexity of the original without inheriting its security track record. Compound v2 couples pool logic, interest accrual, and governance in ways that make each piece harder to reason about in isolation. Here is what we did differently and why we think the tradeoff was correct.

Multicall batching in the Sullend SDK

Reading 40 on-chain values in one RPC call instead of 40. For a dashboard reading pool states across a protocol, the difference between 40 sequential eth_call requests and one Multicall3 call is the difference between a slow UI and a fast one. How we implemented automatic batching and why we made it transparent to callers.

On-chain governance that doesn't get gamed

A walkthrough of the voting mechanism in Govern — quorum calculation, delegation, and why we chose snapshot-at-proposal over snapshot-at-vote. The flash loan voting attack is a real threat in snapshot-at-vote systems. We explain why the alternative design eliminates it structurally rather than by access control.

Isolated lending pools: how bad debt stays contained

In a monolithic lending protocol, a single under-collateralized position that cannot be liquidated creates socialized bad debt across all depositors. Isolated pools bound the blast radius. We walk through the mechanics of how CoreLend isolates risk at the pool level and what that means for depositors operating across multiple pools.

Pluggable oracles: why OracleRouter exists

Hardcoding a price oracle into a lending protocol is a decision that looks fine until the oracle is deprecated, moves to a new contract address, or the chain you're on doesn't support it at all. OracleRouter is our answer to that coupling. A deep dive into its design, the adapter pattern we use, and how you add a custom oracle source without touching the core protocol.

Why documentation lives in the same PR as the code

Documentation written after the fact is documentation written for nobody. By the time the writer sits down, context has faded, the author has moved on, and the details that matter most — the edge cases, the failure modes, the reasoning behind an unusual decision — are gone. Our policy and why it has held up in practice.