Five thousand seven hundred NFTs left a contract they were never meant to leave. Not sold by their owners. Not moved by their creators. Extracted — pulled out of escrow on Injective and pushed directly into public collection bids, where buyers, seeing only a price, paid for assets that were never the seller's to sell.

The arithmetic is what stays with me. Talis Protocol held more than 26,000 NFTs in custody. Roughly twenty-two percent of that vault walked out through a door that should have been sealed by an authorization check nobody had stress-tested across four years of live operation.
Twenty-two percent is not a rounding error. It is a verdict, delivered by an attacker on behalf of a design choice.
Talis is not a ghost, and that matters. Founded in 2021, it raised a $2.35 million private round that November and has run a marketplace and auction house inside the Cosmos and Injective ecosystem ever since. Twenty-six thousand escrowed NFTs is the footprint of a real venue — real collectors, real creators, real fee revenue, a real reputation built over four years of quiet operation.
What broke, per the project's own disclosure, was the market contract and the auction contract. Both named. Joined by a small 'and' that deserves more attention than the headline gave it. Listings and auctions were halted across Injective and other chains. A post-mortem was promised. A restitution plan was sketched — remaining NFTs returned to original holders, compensation offered to the bidders who paid for stolen goods in good faith. Users were warned that no one from the team would ever DM them asking to connect a wallet.
That last line is the most honest sentence in the whole disclosure. It tells you what happens in the forty-eight hours after a breach: the vultures arrive before the auditors do.
What kind of flaw lets thousands of NFTs leave escrow and be sold in the open?
Not oracle manipulation. Not a flash loan. The signature here is authorization. Someone who did not own those assets acquired the power to dispose of them, and then disposed of them at market speed. In an escrow market, that power is the entire product.
This is where the design deserves a hard look. In a signed-order model — Seaport being the reference implementation — the token never moves. It stays in your wallet, and a signature travels instead. In escrow, the token travels. The contract becomes the de facto owner of record for thousands of wallets at once, and the only thing standing between those wallets and a stranger is one validation routine. One bypass converts a marketplace into a shared vault with a single lock, and every depositor's safety becomes a function of the weakest check in code they never read.
Note what the team did next. They did not describe a parameter change or an admin-side pause-and-patch. They said a fixed contract was ready and awaiting pre-deployment review. Redeployment is an admission with a specific shape: the flaw lives in core logic — the place where the contract decides who may move what — and you cannot hotfix it from an admin key, because the admin key is often the thing that was bypassed.
The two contracts being named together points somewhere darker. A shared escrow or permission module, reused across both surfaces, is the most economical explanation for one exploit touching two deployments. That is not an incident. That is a pattern waiting for a calendar.
I have been in that room before. In late 2017, working as a cryptography researcher in Singapore, I sat with the Parity multisig library ahead of its 1.5 release and found a reentrancy path in the withdrawal logic — over $300 million in exposure sitting behind a bug that read like housekeeping. I disclosed it privately rather than exploiting it, and the patch came, delayed but secure. What I learned was not that audits work. It was that the vulnerability is rarely only in the code; it lives in the assumption that somebody else has already read it. Every escrowed vault is that assumption, made twenty-six thousand times over.
Now the part nobody has priced. The stolen tokens were moved through collection bids — batch offers against an entire collection rather than a single token. Collection bids are elegant liquidity machinery for sellers. They are also the fastest liquidation channel ever built for assets of uncertain provenance. The attacker needed no fence, no mixer, no OTC desk. They needed a feature.
And they got paid. That is where the real story starts.
Talis has promised to return the remaining NFTs to original holders and compensate the bidders who bought stolen tokens in good faith. Read that twice. Two parties hold a claim on the same asset: the dispossessed owner and the buyer who paid real money for a title the platform failed to protect. A custody failure is never settled by intent; it is settled by balance sheet. A project with a 2021 raise and no disclosed treasury has just written insurance on assets it never reserved against — underwriting it was never chartered to perform, at a scale its capital may not survive.
There is a second silence in the disclosure, and it is loud. Nobody said whether these contracts were audited. No Trail of Bits report, no OtterSec review, no bug bounty figure. In security disclosures, what goes unmentioned is usually what the team cannot say out loud.
Now let me argue against my own instinct.
The reflex is to demand an audit, a redeploy, a bounty program. All correct. All insufficient. We keep diagnosing application-layer failures as engineering failures when they are governance failures wearing engineering clothes. Injective's consensus never wavered. The chain told the truth the entire time. The failure happened precisely where we quietly reintroduced centralization — custody — and then called the product decentralized because the settlement layer underneath was.
Trustlessness is a property of a transaction, not of an institution. The 5,700 holders never evaluated Talis's security posture. They clicked a listing. Nobody chooses to trust a vault. They simply fail to notice they are standing inside one.
And a contract can be immutable and still be wrong. Immutability preserves mistakes with the same fidelity it preserves intent. Truth is the only immutable asset, and it rarely lives where the code does.
Give the team what they earned, though. Transaction-level accounting of every affected token, every original holder, every bid. A DM warning issued early. A halt that stopped the bleeding before it reached the rest of the vault. That is crisis response of a higher standard than most of this industry manages. But response quality is not design. A well-run evacuation does not excuse a building without fire exits.
What I would watch, in order: whether the post-mortem names a funding source for the compensation rather than a sentiment; whether the new contract ships with a public third-party audit before it takes a single deposit; whether the stolen tokens move toward bridges and mixers, which would sever any recovery path and quietly end the promise. And whether any other Cosmos marketplace reusing similar escrow logic publishes a self-audit — because when one module fails, its copies are already live elsewhere.
Watching a vault drain in public is a strange kind of education. The attackers were not cleverer than the designers. They simply read the fine print of a trust model the rest of us agreed not to examine. Governance is not a vote; it is a vigil — and the vigil was not kept over twenty-six thousand other people's assets.
So here is the question I would leave with every builder in this ecosystem, and I do mean every one: if your market holds what other people own, what exactly are you holding, and who answers when the door opens? Because we have now watched the same door open twice in a decade, and we keep rebuilding it from the same hinges.
We build bridges from the ashes of belief. But a bridge needs to hold weight, not just promise to.