The Empty Calldata Problem: How Bull-Market Research Passes Every Check and Proves Nothing
Three weeks ago a fund manager forwarded me a due-diligence report. Nine sections. Technical architecture, token economics, market structure, ecosystem positioning, regulatory exposure, team and governance, risk matrix, narrative cycle, supply-chain transmission. Every heading present. Every field filled.
I asked for the raw export behind it. It was empty. Not redacted β empty. Zero information points extracted, zero project identifiers resolved, zero source timestamps captured.
The report had rendered anyway.
Nobody lied. That is the part that should frighten you. What landed in my inbox was not a fabrication. It was a null object: a structure that satisfies every interface it was asked to satisfy and carries no state at all.
I have spent nine years reading contracts for a living, and I have learned that the most expensive failures never announce themselves. They return true.
The Contract Between Two Stages
Every serious crypto research stack built since 2023 runs on the same two-stage skeleton. Stage one extracts: it pulls filings, subgraph queries, governance forum posts, funding announcements, bytecode diffs, and turns them into a flat list of discrete factual claims. Stage two analyzes: it takes that list, maps it against a dimensional template, and produces judgment.
The architecture is sound. The failure lives in the seam.
Between stage one and stage two there is an implicit contract β that the list handed forward is non-empty, attributed, and time-stamped. In production, that contract is rarely enforced. When extraction returns nothing, the analysis layer has exactly two choices: refuse to render, or render anyway. In the twelve research pipelines I have reviewed over the past eighteen months, eleven defaulted to render.
Why? Because the schema is the product. A dashboard that returns an error page looks broken. A dashboard that returns nine populated panels looks like infrastructure. The commercial incentive points hard at completeness, and completeness is the one property you can guarantee without any data at all.
A bull market pours accelerant on this. Allocators have mandates to deploy, timelines compress from weeks to hours, and the report stops being a decision input and becomes a compliance artifact β something to attach to a memo so the memo can move. In that environment, nobody wants the pipeline to fail closed. They want it to fill the boxes.
The Fallback Function Never Fails
Here is the same bug in Solidity, and it is not a coincidence that it looks identical.
contract Vault {
// No msg.data.length check, no function selector guard
fallback() external payable {
emit Deposited(msg.sender, msg.value);
}
}
Send this contract empty calldata with value attached and it succeeds. It emits an event. It updates state. Downstream indexers see a deposit and record it. The interface was satisfied; the intent was never checked. I spent three months in late 2017 auditing Geth's block header validation against the yellow paper, and the lesson that survived from that work is the one I still repeat to every team I advise: audit the intent, not just the syntax. A function that cannot fail is not a safe function. It is a function whose failure has been relocated somewhere you are not looking.
The naive analysis pipeline is the same contract:
DIMENSIONS = ["tech", "tokenomics", "market", "ecosystem",
"regulatory", "team", "risk", "narrative", "supply_chain"]
def analyze(payload): points = extract(payload) # returns [] return {d: score(d, points) for d in DIMENSIONS} # nine keys. all None-derived. no exception raised. ```
The repair is two lines, and it is the entire thesis of this article:
if len(points) < MIN_POINTS or not all(p.source for p in points):
raise InsufficientInput(len(points))
Fail closed, not open. In smart contracts we learned this the hard way and encoded it into every audit checklist on earth. In research tooling we have somehow forgotten it, in the exact market cycle where the volume of automated analysis has gone up by an order of magnitude.
Why N/A Is More Dangerous Than a Blank Page
A blank page is honest. It signals absence, and absence triggers a human response: you go find the data.
A nine-dimension report with "insufficient information" in every cell does something far worse. It signals process. It carries the visual grammar of diligence β headers, tables, a risk matrix with color coding β while containing zero informational mass. The null object pattern is a virtue in software engineering precisely because it lets you skip null checks. In research it is a liability because it lets you skip thinking.
I have watched a committee approve a seven-figure allocation off a deck whose technical section consisted of one sentence about "a modular architecture" and one link to a documentation site that returned a 404. The deck was schema-valid. Every automated check passed it. The checks were checking shape, not substance, and shape is free.
This is the information asymmetry of the current cycle. In 2020 you had to work to produce a bad analysis β you had to misunderstand something. Today you can produce a structurally flawless, entirely hollow analysis by doing nothing at all and letting the template do the talking. The cost of manufacturing the appearance of diligence has collapsed to near zero, while the cost of the allocation error it induces has not moved.
Three Times I Watched a Template Breathe
The most instructive case of my career is also the most misread. Terra's UST did not fail because of a bug. It failed because the rebalancing algorithm was fed an assumption β continuous marginal demand for LUNA β that did not exist in the world. The mechanism kept rendering a peg. It printed a dollar backed by a belief. For eighteen months that output passed every check anyone ran, because the check was "does it print a dollar." That is a null object at protocol scale, and it took forty billion dollars of market cap with it. I wrote five posts that spring, and the thing I kept coming back to was not the math. It was how confidently the math had answered a question nobody had data for.
Axie Infinity's Origin contracts taught me a smaller version of the same lesson in 2021. Five of us coordinated on a joint threat assessment around the $SLP claim path, where specific edge cases lacked a reentrancy guard. The happy path was immaculate. Every test passed. The vulnerability lived in a state the test suite never constructed β an input the system assumed would never arrive. We shipped the assessment collectively because credit was irrelevant next to the fact that a few hundred thousand players in Southeast Asia were about to be the ones holding the bag.
And Uniswap V2 in 2020 taught me that rounding is not a detail. I spent two weeks reverse-engineering the constant product formula's slippage mechanics and found a rounding behavior in the oracle calculation that bit low-liquidity pairs hardest β retail traders, disproportionately, and disproportionately in my own city. Two thousand people joined a webinar in Thai and English to hear why the numbers on their screen were slightly wrong. The protocol was correct by specification. The specification had an input it had not considered.
Three protocols. Three different mechanisms. One pattern: the system returned a confident answer to a question it had no data to answer, and every check downstream validated the format of that answer instead of its provenance.
The Attestation Chain Has the Same Shape
In 2024, when the ETF approvals landed, I pulled apart the custodial architecture of the major providers β the multisig arrangements, the MPC key generation ceremonies, the monthly attestation PDFs. The cryptography was largely competent. What interested me was the reporting layer. A monthly PDF asserting reserves is, structurally, a nine-dimension report with N/A in every cell unless you can trace it back to a signed key ceremony and a live address set.
Sometimes that trace existed and was excellent. Sometimes nobody had asked. The market cap of the product did not distinguish between those two cases.
That is what I mean when I say code is law, but trust is the currency. The code will execute either way. The question is whether anyone can verify what it executed on. In a bull market the verification layer is the first thing to be defunded, because verification produces no yield and no narrative β it only produces the occasional inconvenient refusal.
The Critique Is Aimed at the Wrong Failure
The standard objection to automated analysis is hallucination. I think that framing is a gift to the wrong people. Hallucination is loud. A model that invents a funding round gets caught by the next person who checks the wire. A model that invents a number gets caught by a fact-checker. Loud failures self-correct, eventually, because someone notices.
The dangerous failure is silent schema compliance. The model that writes "insufficient information β source unavailable" into nine boxes and returns exit code zero will never be caught, because there is nothing to catch. It is behaving correctly. It is behaving, in fact, more conservatively than the hallucinating model, which is exactly why it sails through review. Discipline has become indistinguishable from vacuity, and our review processes were built to reward the appearance of discipline.
There is a second, less comfortable point. Refusing to fabricate is economically punished. The analyst who returns an empty page is read as lazy; the analyst who returns a filled page is read as thorough, even when the filler is transparently filler. This is not a character flaw in any individual. It is what happens when you build a template that can be satisfied without information β you create structural demand for content that has none. The template did not merely permit the empty report. It manufactured the market for it.
What I Expect to See Next
I expect proof-of-input attestations to become a standard artifact, the way slippage warnings did after 2020. A report that commits to a hash of its raw source set, signed and timestamped, so the boundary between data and judgment becomes visible and auditable. The empty payload stops being invisible the moment it has to be hashed.
Until that exists, every nine-section deck you receive is asking you to trust a rendering layer you cannot see. So ask the only question that matters: what was the input?
If the answer is a blank field, you did not read a report. You read a template that learned to breathe.