Why a JPEG is hard to sell
A share of a company is fungible: any share is any other share, so a price exists continuously and you can leave whenever you want. An artwork is the opposite. Each one is unique, which is the entire point aesthetically and a genuine problem financially.
The consequence shows up all over this gallery. Photography that we think is excellent has not traded in a month. Autoglyphs sits at a 69 ETH floor with no sales at all. Neither of those is a judgment on the work. It is what happens when every piece needs its own buyer, found one at a time.
The floor price papers over it. A floor is one number describing a set of objects that are not interchangeable, and it is only real for whoever is willing to sell today.
Four years of trying
We spent a long time on this problem from the collector’s side: give each NFT explicit backing, pair it with liquidity, and let the backing set a price nobody has to negotiate. The instinct was right and we never got it to hold together at scale.
So it is worth being honest that the two protocols below are doing a version of what we wanted to build, and doing it in public with real money.
TokenWorks

A development studio whose own line for itself is “a playground for onchain financialized ideas”. Two of their protocols are the reason NFTs have been discussed again in the last few weeks.
PunkStrategy · $PNKSTR
A token that buys the art, September 2025
A Uniswap v4 hook takes a fee on every trade of the token. The majority of that fee accumulates as ETH until the treasury can afford the cheapest CryptoPunk on the market, at which point the contract buys it automatically and relists it above cost. Profit from a sale buys back and burns the token.
The contract is renounced, so the loop runs without anyone steering it. What makes it interesting is not the token; it is that trading volume, which is normally pure noise, has been wired directly into buying and holding a specific body of work.
The honest cost is that the machine trades badly, in public, on a schedule. It never quotes two sides: it is a forced buyer whose treasury fills where everyone can watch, and the moment the threshold is crossed it must take whatever the cheapest Punk happens to be. It structurally buys what sellers most want to leave, at a moment the whole market saw coming, and pays the front-runner's spread for the privilege.
When Punks rise, the loop realises a profit, burns tokens and looks clever. That is beta dressed up as execution. In exactly those conditions, holding a Punk directly would have done better. Most of what the fee takes from the token's own trading volume ends up as income for Punk sellers and the people who front-run the treasury.
It was launched as an experimental art project, which is a more honest framing than most things wearing that phrase.
Fake World Assets · FWA
Backing per NFT, made into a market
This is the one that rhymes with what we tried to build. A depositor puts up an NFT and a quantity of ETH behind it, which the docs compare to one side of a Uniswap V2 pair. That backing does two jobs at once: it sets how likely the piece is to be drawn, and it funds an irrevocable standing bid, a promise from the depositor to buy the work back.
A purchaser pays a price derived from the pool and receives a randomly selected position, with Chainlink VRF supplying the randomness. They then choose: keep the work, keep it and relist it with their own backing, or sell it straight back into the standing bid.
The effect is a floor that is actually funded. Not a number on a chart, but ETH committed in advance by someone who has agreed to honour it.
It is also, of the two, the one that is a business. A spin pays a fee, so there is revenue; PunkStrategy has only a balance sheet and hope. A house selling variance needs traffic rather than alpha, and traffic is the easier thing to have. Revenue has a recipient, and the last section of this page is the one where we finally went and looked at who.
The rake deserves reading closely. Sell the work back and you receive 85 percent of its backing (the default), and the fifteen you left behind is the protocol's to keep unless it chooses to share it. Keep the work and the depositor gets their backing returned minus a cut, while the premium you paid is pooled across every position rather than handed to the person whose piece you took. From either chair there is a band in the middle where nobody at the table wins. That band is the business.
For its first fifteen days a token emission paid both chairs to sit down anyway; the schedule was fifteen days by design. What the pool looks like without it is the honest test, and that test is running now.
The cost is that you do not choose what you get. It solves illiquidity by making the asset fungible enough to price, which is a real trade and not everyone will want it.
Where the incentives point
There is a wrinkle in that design worth writing down, and credit to @Rhynotic for putting it plainly first. Everything in FWA is denominated in ETH. Your share of the fees is your share of the pool's ETH, and the more ETH behind a piece, the less likely it is ever to be drawn.
Follow that to its end and the artwork stops mattering. The winning strategy is the cheapest eligible NFT you can find, used as a ticket, with as much ETH behind it as you can afford: yield on a work that will statistically never leave your position. The pool already leans that way: the heaviest backing tends to sit behind the cheapest work. A protocol built to fund a floor for art becomes, at the margin, an ETH deposit account wearing a gacha costume.
The damage is not only to fairness. What stays winnable is whatever nobody minds losing, so the prize pool drifts toward lemons and the spins get worse. A casino where the liquidity providers choose which prizes can be won is a casino that eats its own traffic: the decay in demand is built in, not merely cyclical.
The fix people are circling is to make the work itself do something: cap how much backing a piece can carry, or scale what the backing earns by what the piece is worth, so that earning more requires better work, or more of it. That would push demand outward into many collections instead of concentrating ETH behind the cheapest one. The hard part is the word worth. Someone has to say what a piece is worth, a floor on a thin collection can be walked upward by anyone motivated, and the honest version ends with the protocol keeping a curated list of collections and what each may carry.
That ending is not a prediction. FWA's allowlist is curated by its owner today: the docs describe a permissionless way in (burn enough of a certain NFT and a collection adds itself), but it launched switched off, the required burn set to zero. The protocol already keeps a curated list. It has just not said out loud that the list is the product.
Which is the detail we found most interesting, and we left it sitting there too admiringly. A protocol that points yield at a curated list is paying for taste, and that is a job a gallery recognizes. It is also a job with a paymaster. The address that decides which collections may be listed is the same address that has received the largest share of the fees, by a wide margin. Curation and the rake sit in one hand.
The exploit, and what it says about them
On 3 July 2026 someone took a CryptoPunk out of the pool for roughly $66,000 of ETH. Chainlink's randomness was not broken. The attacker changed the protocol's state in the window between the randomness being requested and the callback landing, so the selection resolved onto Punk #5450, the most valuable piece in the pool.
The response is the part worth noting. They put the protocol into withdraw-only so depositors could get their assets out, covered the owner's loss in full, and then rebuilt rather than patched.
The fix in the relaunched contract is a staging queue: a new deposit does not enter the selection tree immediately, but matures after a delay, and a callback can only be honoured inside a shorter window. The two are bound together in the setters, so any listing added after a request is provably invisible to that request's callback. The bug class is closed by arithmetic rather than by vigilance.
Their migration test goes further: it proves the core contract can be redeployed after a bug without touching the token, the hook or the Uniswap pool: the old one drains, the remainder moves across, the market continues. They designed for being wrong again.
Who paid for it
There is a third contract, and it is the one we find most instructive. It is called FundingWorks, its verified source describes itself as “a better way to fund creators”, and we originally wrote that it is how the studio pays for itself. No venture round, no treasury sale, no token allocated to insiders. Every sentence in this section is accurate and we stand behind the arithmetic. It is also the smaller half of the answer, and the section after it is the correction.
In February 2026 they opened a five-day mint at 1 ETH. 299 people paid. Nobody set that number: the contract has no supply cap, so 299 is simply how many turned up before the window shut. What each of them received is a soulbound token, non-transferable by design, carrying no promise of a return.
The ETH does not arrive as a lump. Twenty percent is released when the mint closes, half held as ETH and half spent buying PNKSTR on the open market. The remaining 0.8 ETH per token streams to the studio continuously across exactly one year. There is no lever to pull it forward.
A supporter who stops believing burns their token and takes back whatever has not vested yet. That is the whole of the accountability structure: no board seat, no information rights, no liquidation preference. The recourse is to leave, and leaving costs the studio precisely the runway it has not yet earned.
A burned slot does not disappear. It reopens at the original 1 ETH, and whoever fills it pays the elapsed portion to the studio immediately, on top of a fresh twenty percent. Only the remainder returns to streaming. Each slot is indexed to the calendar and not to the person holding it, so a supporter leaving does not cost the studio money. It brings the money forward.
The books, read on 1 August 2026
Mainnet, 42 percent through the vesting year. These figures move; the identity below does not.
290 tokens live. 62 supporters have burned, 53 slots have been refilled, 9 sit open. The studio has drawn 177.23 ETH. Had nobody left, the same date would have paid it 160.67 ETH, so the churn has advanced about sixteen and a half ETH of its own funding.
And the part that makes it checkable: the contract held 134.162298325722983315 ETH. Multiply the 290 live tokens by the ETH still unvested behind each one and you get 134.162298325722983315 ETH. The same figure to the wei. The contract holds what its supporters could still walk away with, and not one wei more. No audit is needed to establish that; two eth_calls are.
What the code does not cover is the part being celebrated most. The 1.7 ETH per holder paid out of FWA fees lives nowhere in this contract: it is discretionary, revocable, and no supporter could enforce it. We called it a gift and let the word stand as praise. It is the correct word and it is not praise. The enforceable promises here are the stream and the exit; the rest is at the owner's pleasure, and the ledger below shows what else that pleasure paid for.
Two other honest notes. Soulbound is a setting, not a property: the owner can enable transfers at any time. And ten percent of the raise was spent buying PNKSTR, so a slice of the studio's funding is denominated in the studio's own other project.
Where the fees actually go
Everything above this line was published before we asked the obvious question. A protocol that keeps fifteen percent of every settlement pays that fifteen percent to somebody. We wrote nine hundred words on a 299 ETH supporter round and not one on the rake, which is the larger number by a distance.
We had the address the entire time. It sits in our own source as splitter, and the dashboard we built to read this protocol never called it. What we read instead was accruedOwnerFees on the pool, which shows well under one ETH and looks like almost nothing. It is almost nothing. It is swept continuously, so it measures the drip and not the reservoir. Reading it and stopping there is how a fifteen percent rake vanishes from a page about a fifteen percent rake.
The fee ledger, read on 4 August 2026
Splitter 0x1C17…3Bfe, cumulative transfers on mainnet. These figures move; the shape has not.
1,736.40 ETH has moved out of the pool and into the splitter across 545 transfers, every one of them from the core contract. 1,237.32 ETH has gone out again, to 129 recipients. 499.08 ETH is still sitting there. The three reconcile to the wei, which is the only reason we are willing to publish them.
Of the 1,237.32 distributed, 859.90 ETH went to one address in five transactions: sixty-nine and a half percent of everything paid out. 0x019817ad…e8cb is not an inference drawn from the flow. It is what owner() returns on the pool, on the splitter, on the collection whitelist, and on FundingWorks. A second address took 95.54 ETH and has never itself sent a transaction.
The remaining 198.8 ETH is spread across 114 addresses at a median of 1.9 each. That is the gift, and it is real: the 1.7 ETH per supporter, visible on chain, paid as described. It is also sixteen percent of what was distributed.
Set that beside the section above. The supporter round raised 299 ETH. The fee stream is 1,736 ETH, roughly five and a half times larger, and it is the one nobody had to sign up for.
What the chain will not tell you: whose keys those are, what the 499 ETH still in the splitter is earmarked for, or whether any of this was described differently in public. Those are questions about people and promises, and we are not in a position to answer them. A ledger is only a ledger. This one is reproducible from two eth_calls and a transfer scan, and it is now on the Pulse dashboard so it stays current rather than frozen at the date above.
The buyback, one day later
We published the ledger above on 4 August. At 00:17 UTC the next morning, TokenWorks deployed a contract that spends 327 ETH buying the FWA token, and started it twenty-five minutes later. The announcement describes that figure as thirty percent of retroactive fees, with the tokens going to TokenWorks as a team reserve.
It is a well-built contract and it does what it says. It is also the clearest possible illustration of the point we make against ourselves at the bottom of this page, so it belongs here rather than in a new one.
FWABuyback, read on 5 August 2026
0xabc98d86…a6bf, verified source on mainnet. Figures are the contract's own events.
The 327 ETH arrives as the value of a single start() call, which refuses to run unless the whole amount is present. There is no window in which the program is announced and the money is not yet there. The pot then splits into 327 slices of exactly one ETH, released no faster than one every two hours, which puts 27 days and 4 hours between the first and the last. Anyone may trigger a slice. Whoever does keeps 0.005 ETH, and the remaining 0.995 is swapped for FWA on the Uniswap v4 pool.
Slice one was taken in the same block the schedule opened, by a twenty-three byte contract that was watching for it. It spent 0.995 ETH and received 217,202.009 FWA. At that price the full 327 ETH is around seven percent of the token supply, and the token is worth roughly 4,580 ETH in total.
The swap carries no price protection: MIN_SQRT_PRICE + 1, the widest limit the pool will accept, and no minimum output. The token contract was built with a protocol floor for exactly this, described in its own comments as bounding appreciation to about ten percent per buy. That floor now reads 4295128740, which is MIN_SQRT_PRICE + 1. It has been switched off. Both paths are now unprotected market buys, on a cadence published in advance, into a pool whose hook permits selling at all times.
Every token bought goes to owner(), read at the moment of each swap rather than fixed at deployment, so ownership moving would move the rest of the program with it. Here owner() returns 0x019817ad…e8cb. So does owner() on the token, and feeAddress on the hook, which takes one percent of every buy. It is the address in the ledger above, the one that received 859.90 ETH.
What the chain will not tell you: whether the 327 ETH is the 327 ETH. It arrives from that address rather than from the splitter, so the line between the fee stream and this pot is an accounting claim, not a traced transfer. Everything after start() is fully public, and will be 327 times over.
The figures above are the day it opened. It runs for 27 more, so they are on the Pulse dashboard as well, where they stay current.
Two contracts called buyback
The token has a buyback() of its own, and it does something else entirely. That one burns what it buys and routes the rest to depositors and purchasers. The new contract sends one hundred percent to the team. Same word, opposite destination, and only one of them reduces supply.
This contradicts nothing. The announcement says team reserve, and the contract sends it to the team. It is worth writing down anyway, because buyback is a word most people hear as a burn.
What we would take from it
The schedule is the good idea. A pot, a fixed slice, a fixed interval, and a log that says whether the thing happened. Commitments with a shape are rare, and this one will produce 327 receipts.
Three things we would change. The recipient should be immutable, because where the asset ends up is the part everyone else is trusting. Walking away should take published notice with the offer still live, rather than one owner-only call that can empty the pot mid-schedule. And the clock should count from the start rather than from the last fill, which is what makes 27 days a floor here instead of a date.
The swap we would drop. There is no pool for a curated collection, no way to buy one ETH of floor in a single transaction, and an unprotected market buy on an announced cadence is an invitation. Turn it around and it gets simpler: a contract that does not buy but offers, releasing one escrowed bid every few hours that any holder of a named work can take at a price fixed before the first fill. The seller is the caller. Nothing to keep running, nobody to pay for running it, and nothing for a bot to get in front of.
Worth stating plainly
This is a page about mechanism design, not a recommendation. We do not hold a position in either protocol, nothing here is financial advice, and the design of both means depositors and holders can lose money. FWA’s own documentation says so directly.
In July 2026 an attacker front-ran the Chainlink callback that decides which NFT gets selected in FWA and walked away with a CryptoPunk. TokenWorks committed to covering the loss. That is roughly the best possible response to an exploit, and it is still a reminder that these are young contracts holding valuable objects.
One note on our own method, because it is the more useful lesson. FundingWorks reconciled beautifully: 290 live tokens, the balance matching the unvested remainder to the wei. So we wrote at length about it. The fee splitter needed one more query and we never ran it. The pot that is easy to audit is not the pot that matters, and an audit that stops where the arithmetic gets satisfying is a press release with citations.
Why a gallery cares
We are not going to add a liquidity pool to this site. But whether the best work in this medium can be owned by people who are not already wealthy, and sold by them without waiting a year for a buyer, decides what gets made next.
The interesting thing about both of these is that they treat the artwork as the thing to accumulate rather than the thing to extract from. That is closer to how a collection is built than to how a market usually behaves.
The funding contract is the piece we expect to still be thinking about in a year. Our own pool design stopped at a legal gate: a paid entry, a chance element and a prize is a lottery in most frameworks, and no amount of good intent moves that. FundingWorks has neither a chance element nor a promised return, which is a large part of why it was available to them. What it describes is patronage with an exit, and a patron has never had one of those.