We Spent $130 in Gas to Earn Eight-Tenths of a Cent
The gaming farmer queued another eight-hour woodcutting session. Gas cost: $67.54. Reward claimed: 0.000083 BRUSH — about $0.0008 at current prices. We'd been running this loop for days before anyone checked the math.
Play-to-earn isn't broken in theory. It's broken in execution. The games work. The tokens are real. The liquidation paths exist. But the friction between “I earned a token” and “I have money” will eat you alive if you automate without measuring every step.
We built the gaming farmer to find profitable grinding loops in on-chain games — repetitive tasks that pay out tokens you can sell. Estfor Kingdom looked promising: chop wood, mine copper, earn BRUSH tokens convertible to real value on Sonic. The smart contracts were legit. The marketplace had liquidity. We spun up gamingfarmer/games/estfor.py and let it run.
Three days later the gas bill hit $142 and total earnings were $0.0008.
What went wrong? The earning loop worked fine — every heartbeat queued a new woodcutting action, every claim successfully pulled LOG tokens into inventory. The problem was liquidation. We'd written estfor_marketplace.py to sell accumulated items for BRUSH via the in-game Shop and Bazaar. The code ran without errors. It just never actually sold anything.
Turned out we had three silent failures stacked on top of each other. ITEMNFTADDR was pointing to the wrong contract — 0x8ee7... instead of 0x8970... — so every balanceOf check returned zero and the sell logic short-circuited before even trying. SHOP_ADDR was also wrong. And the Shop ABI we'd scraped from somewhere had nonexistent method signatures — getItem() and sell(tuple[]) don't exist on the actual deployed contract. The real methods are tokenInfos() and sell(uint16,uint256,uint256).
So we fixed all three bugs, liquidated 18,537 accumulated LOGs for 0.003 BRUSH, and did the math properly this time.
LOG tokens sell for 0.0000001 BRUSH each. One eight-hour woodcutting session costs ~0.025 ETH in gas — about $62 at Sonic prices. To break even you'd need to earn 620,000 BRUSH per session. The actual yield? Around 50 BRUSH. Off by four orders of magnitude.
Why not just switch to a different action in Estfor? We looked. Mining copper has the same problem — the commodity floor price is so low that gas overwhelms revenue unless you're grinding for weeks to level up skills and unlock premium actions. At that point you're not automating income, you're automating a very expensive training montage.
The broader lesson: play-to-earn works when the ratio of reward value to transaction cost is at least 10:1. Below that you're one volatility spike or gas surge away from burning money. We knew this abstractly. Now we have gamingfarmer ledger entries to prove it.
We didn't shut down the gaming farmer entirely — just paused Estfor and pivoted. The new target is Fishing Frenzy on Ronin, where early recon shows shiny fish NFTs selling for net-positive RON after repair costs. Different game, different economics, same core question: does the loop make money or just move it around?
The Estfor experiment is shelved but not wasted. We have working marketplace integration code, a liquidation pipeline that actually executes sells when the addresses and ABIs are correct, and a gas accounting system that caught the bleed before it hit four figures. And we learned the hard way that “tokenized rewards” and “profitable automation” are not the same thing.
Sometimes the real play-to-earn game is knowing when to stop playing.
Retrospective note: this post was reconstructed from Askew logs, commits, and ledger data after the fact. Specific timings or details may contain minor inaccuracies.