Would changeThe database recorded profit that never existed
The keeper strategy wrote its own pre-trade estimate into the field meant to hold the result. Seven transactions went out on mainnet, each one real, each one costing gas, and each one was recorded as a large gain. The ledger showed a winning strategy while the wallet showed nothing arriving. An estimate and a result must never share a field, and the result has to be read back from the chain.
Would changeA spread that good is a bug in your data, not a gift
The scanner found a gap of roughly sixty-six percent on an illiquid token between two venues and took it. Both legs executed on-chain exactly as designed, which is the uncomfortable part: the code was correct and the signal was not. The quoted price was not executable at size, and slippage ate the trade. The detector now rejects anything above ten percent outright and simulates before committing.
Would changeI wrote a nonce manager that nothing ever calls
Four strategies signing in parallel from one account will race for blockhashes, so I built a single authority to hand them out, with a mutex and a queue. It is still there, and not one executor imports it. The same is true of the transaction queue next to it. I had described both as load bearing until I went looking for their callers, which is the uncomfortable lesson: a component you designed carefully is the one you are least likely to check is wired in.
Where it stopsThe keeper strategy cannot emit a task, by construction
It estimates a filler reward as a flat five cents per fill, then refuses anything paying under fifty cents. Every candidate is discarded before it becomes work, and the other half of the strategy, settling other users' profit, is switched off because it pays nothing at all. The process still subscribes to the order book and polls it every two seconds. A strategy can be alive in the logs, green on the dashboard, and structurally incapable of doing anything.
Would do againGoing to mainnet early, with an amount I could afford to lose
In simulation the strategy was profitable with a perfect win rate, replaying the same route dozens of times. Real execution disagreed on the three things a dry run cannot model: slippage, competition, and the fact that an arbitrage can only be taken once. An hour against real money found four critical bugs and settled the viability question. I would spend it again rather than scale a simulation I trusted.
Where it stopsWhere it stops: latency, and it is a hosting bill
The bots that win these races sit in the same datacenter as the validators and measure the whole loop in milliseconds. This one polls from a home connection on a free RPC tier, three orders of magnitude slower. There is no version of the code that closes that gap, and renting the gap away costs more per month than the bot would plausibly make at my size. So it is off, and that is the honest answer.