<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Timothymycompc</title>
    <description>The latest articles on DEV Community by Timothymycompc (@timothymycompc).</description>
    <link>https://dev.to/timothymycompc</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4223354%2Ff4576e0f-141e-4187-8beb-71ea5aa07b5e.png</url>
      <title>DEV Community: Timothymycompc</title>
      <link>https://dev.to/timothymycompc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/timothymycompc"/>
    <language>en</language>
    <item>
      <title>I paper-tested an AI memecoin trading bot for 2 days. Here's what the safety checks caught, and what they didn't</title>
      <dc:creator>Timothymycompc</dc:creator>
      <pubDate>Tue, 03 Nov 2026 11:35:07 +0000</pubDate>
      <link>https://dev.to/timothymycompc/i-paper-tested-an-ai-memecoin-trading-bot-for-2-days-heres-what-the-safety-checks-caught-and-1oe2</link>
      <guid>https://dev.to/timothymycompc/i-paper-tested-an-ai-memecoin-trading-bot-for-2-days-heres-what-the-safety-checks-caught-and-1oe2</guid>
      <description>&lt;p&gt;On November 1 a post went around X claiming an AI agent had turned $280 into $3,412 overnight trading Solana memecoins. It came with the prompt that supposedly built it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Build me a fully autonomous Solana memecoin trading desk that prioritizes capital preservation.&lt;br&gt;
Six agents with hard handoffs: SCOUT, FILTER, ANALYST, EXECUTOR, RISK, LOGGER.&lt;br&gt;
Paper trade first. Run overnight. Recap in the morning.&lt;br&gt;
Do not skip any risk management rules. If a condition cannot be verified, reject the token rather than assume it is safe.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I couldn't verify the $3,412. So I built the desk from that prompt, word for word, and ran it on &lt;strong&gt;paper money with real prices&lt;/strong&gt;, out in the open. I call it the deskbot. This is what it does, and what two days of it taught me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nothing here is real money and nothing here is advice.&lt;/strong&gt; There is no live mode. The desk exists to find out whether this kind of bot survives contact with real memecoins.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;I build &lt;a href="https://solana-pulse-gateway-1021990235790.us-central1.run.app" rel="noopener noreferrer"&gt;Solana Pulse&lt;/a&gt;, a set of safety tools for people and AI agents: is this token a trap, is this transaction safe to sign, where did the money go. A safety check can't make a token safe. It looks for the known ways people get robbed. The honest way to find out what it misses is to put real decisions behind it and watch what happens.&lt;/p&gt;

&lt;p&gt;A trading bot is the hardest test there is. It checks hundreds of brand-new coins a day, it acts on the answer, and every miss shows up as a loss with a timestamp.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Cloud Scheduler wakes the desk once a minute on Google Cloud Run. Each agent hands off to the next and can only say yes or no:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;SCOUT&lt;/strong&gt; pulls new pools (Pump.fun, PumpSwap, Raydium, Meteora) and the pools trending in the last hour from GeckoTerminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FILTER&lt;/strong&gt; rejects anything that fails a hard rule: under $50k traded in the last hour, mint authority not revoked, under 95% of pool liquidity locked or burned (RugCheck), top 10 holders over 20%, a creator with a bad history, freeze authority on, or a simulated sale that fails. Anything it &lt;strong&gt;can't verify&lt;/strong&gt; is rejected, as the prompt says. Every coin also goes through Solana Pulse's &lt;code&gt;token_safety&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ANALYST&lt;/strong&gt; scores what's left from 0 to 1: pool age, liquidity, buy pressure, number of buyers, the 1-hour price move and turnover. Below 0.6 is out. The weights are a guess the paper run is there to measure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EXECUTOR&lt;/strong&gt; makes a paper buy at 8% of equity, with a swap fee and price impact taken off. One trade per coin: no averaging down, no re-entry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;RISK&lt;/strong&gt; runs first every minute: sell at -6%, and once a trade is up 12%, a trailing stop sells 6% below the peak.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LOGGER&lt;/strong&gt; writes every scan, rejection (with its reason), score, buy and sell to Postgres. Those rows are the source for every number below.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The live desk is public and read-only: &lt;strong&gt;&lt;a href="https://trade-desk-1021990235790.us-central1.run.app/desk" rel="noopener noreferrer"&gt;https://trade-desk-1021990235790.us-central1.run.app/desk&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Run 1: up 24%, then three rugs
&lt;/h2&gt;

&lt;p&gt;The first run started November 1 with $1,000. By the afternoon it was at &lt;strong&gt;$1,244&lt;/strong&gt;. By the evening it was at &lt;strong&gt;$761.76 (-23.8%)&lt;/strong&gt;: 8 trades, 1 win.&lt;/p&gt;

&lt;p&gt;Three coins did almost all of it. Two different coins both named AODF, then one named XTO, each lost 90-100% of its price inside a minute. Those three trades were &lt;strong&gt;$224 of the $238&lt;/strong&gt; lost.&lt;/p&gt;

&lt;p&gt;What a rug looks like up close: XTO climbed slowly all day on about $500 of trading a minute. Then a single sale of $1.8M hit its pool, and the price went from $2.03 to $0.00017 in that same minute. A stop-loss can only sell at the price that's left, and nothing was left.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Solana Pulse missed it.&lt;/strong&gt; About three minutes after AODF launched, its creator sent around 667 transfers in 3 seconds, splitting the supply into many wallets. That makes the top 10 holders look tiny (0.5%), so the coin passed the concentration rule. Pulse did see a network of over 500 linked wallets, but it ignored groups that big, because on old coins they're usually an exchange or an airdrop. On a coin less than a day old, that was wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changed in Pulse&lt;/strong&gt; (with tests built from the real AODF and XTO data):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;big linked-wallet groups now count on new coins&lt;/li&gt;
&lt;li&gt;a new &lt;code&gt;creator_split&lt;/code&gt; check catches a creator splitting the supply right after launch&lt;/li&gt;
&lt;li&gt;a warning when a new coin is worth over 100x the cash in its pools (XTO was 487x when the desk bought it)&lt;/li&gt;
&lt;li&gt;a note when other coins use the same ticker&lt;/li&gt;
&lt;li&gt;a &lt;code&gt;rug_chance&lt;/code&gt; answer with its reasons&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building &lt;code&gt;creator_split&lt;/code&gt; also turned up a real bug: fetching a creator's transactions in one batch throws on version 1 transactions, so the check came back "unknown". I wrote that one up separately: &lt;a href="https://dev.to/timothymycompc/solana-rpc-error-32015-why-4-in-10-transactions-vanish-from-your-app-26cm"&gt;Solana RPC error -32015&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run 2: two lanes
&lt;/h2&gt;

&lt;p&gt;The desk restarted November 2 at 13:15 UTC with the new checks and a second lane:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Main desk:&lt;/strong&gt; the original six agents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fast lane:&lt;/strong&gt; its own $1,000. It buys every coin that passes FILTER unless Pulse says AVOID, checks prices every 10 seconds, and sells at +10%, -6% or 30 minutes, whichever comes first. A replay of the first day's coins said these rules would make about +3.8% a trade, but that was only 15 coins. The fast lane is there to test it until it has 50 trades.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After 21.5 hours (read November 3, 10:50 UTC):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Equity&lt;/th&gt;
&lt;th&gt;Trades&lt;/th&gt;
&lt;th&gt;Wins&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Main desk&lt;/td&gt;
&lt;td&gt;$892.90 (-10.7%)&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fast lane&lt;/td&gt;
&lt;td&gt;$955.46 (-4.5%)&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The lesson of the day.&lt;/strong&gt; At 05:10 UTC a brand-new coin, also called XTO, 48 minutes old and up 6,986% in an hour, passed every FILTER rule. Pulse said &lt;strong&gt;AVOID&lt;/strong&gt;, and its reason named the exact pattern: supply split across many wallets, like AODF and XTO, both dumped 99%.&lt;/p&gt;

&lt;p&gt;The fast lane skipped it. The main desk still allowed AVOID coins in a "likely rug" tier that sells in steps on the way up, so it bought. Seventeen minutes later it was &lt;strong&gt;-100%&lt;/strong&gt;. That one trade is $77 of the $107 the main desk is down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fast lane isn't matching its replay.&lt;/strong&gt; It averages -4.7% a trade, not +3.8%. Three reasons so far:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The replay stopped out on a minute's closing price. Live, the stop fires on any 10-second price, and these coins swing 30-50% inside a minute. One coin was stopped at -17.7% and then went to +17% above entry.&lt;/li&gt;
&lt;li&gt;Three stop-losses filled at -13% to -22% within 5-15 seconds of the buy.&lt;/li&gt;
&lt;li&gt;FILTER wants $50k of volume in the last hour, so both lanes buy after the spike, not before it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Does Pulse's AVOID mean anything?
&lt;/h2&gt;

&lt;p&gt;I checked every coin the desk asked Pulse about (299 checks, 296 coins, November 1-2) against its price on November 3:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pulse said&lt;/th&gt;
&lt;th&gt;Coins&lt;/th&gt;
&lt;th&gt;Down 90%+ or no longer priced&lt;/th&gt;
&lt;th&gt;Up&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AVOID&lt;/td&gt;
&lt;td&gt;220&lt;/td&gt;
&lt;td&gt;150 of the 183 with a price at check time (82%)&lt;/td&gt;
&lt;td&gt;5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAUTION&lt;/td&gt;
&lt;td&gt;65&lt;/td&gt;
&lt;td&gt;37%&lt;/td&gt;
&lt;td&gt;22%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SAFE&lt;/td&gt;
&lt;td&gt;15&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;7%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;"No longer priced" means Jupiter stopped pricing the coin. That's a strong sign it's dead, not proof. The SAFE coins were all established tokens (WBTC, ETH, Bonk and the like), and the coins were at most 40 hours old when measured, so this is short-term only.&lt;/p&gt;

&lt;p&gt;My read: Pulse separates rugs from the rest well, and CAUTION is a real risk tier. &lt;strong&gt;The desk's losses come from its trading rules, not from the safety checks.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The main desk stops buying anything Pulse calls AVOID.&lt;/li&gt;
&lt;li&gt;Stops judged on a steadier price than a single 10-second tick.&lt;/li&gt;
&lt;li&gt;The fast lane keeps going until it has 50 trades. Then the numbers decide, not the replay.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If the $280-to-$3,412 bot is real, its edge isn't in the prompt. Following that prompt exactly, carefully and with good safety data, loses money on paper. That's worth knowing before anyone runs it with real money.&lt;/p&gt;




&lt;p&gt;The safety checks come from &lt;strong&gt;Solana Pulse&lt;/strong&gt;: 18 tools for people and AI agents, over MCP or plain HTTP, 25 free checks per tool per day.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Website: &lt;a href="https://solana-pulse-gateway-1021990235790.us-central1.run.app" rel="noopener noreferrer"&gt;https://solana-pulse-gateway-1021990235790.us-central1.run.app&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Live desk: &lt;a href="https://trade-desk-1021990235790.us-central1.run.app/desk" rel="noopener noreferrer"&gt;https://trade-desk-1021990235790.us-central1.run.app/desk&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;X: &lt;a href="https://x.com/solanapulsebots" rel="noopener noreferrer"&gt;https://x.com/solanapulsebots&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/Timothymycompc/solana-pulse-ai-agent-gateway" rel="noopener noreferrer"&gt;https://github.com/Timothymycompc/solana-pulse-ai-agent-gateway&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;YouTube: &lt;a href="https://www.youtube.com/@timothymycompc1205" rel="noopener noreferrer"&gt;https://www.youtube.com/@timothymycompc1205&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Email: &lt;a href="mailto:timothymycompc@gmail.com"&gt;timothymycompc@gmail.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>solana</category>
      <category>ai</category>
      <category>typescript</category>
      <category>trading</category>
    </item>
    <item>
      <title>Solana RPC error -32015: why 4 in 10 transactions vanish from your app</title>
      <dc:creator>Timothymycompc</dc:creator>
      <pubDate>Tue, 03 Nov 2026 03:46:20 +0000</pubDate>
      <link>https://dev.to/timothymycompc/solana-rpc-error-32015-why-4-in-10-transactions-vanish-from-your-app-26cm</link>
      <guid>https://dev.to/timothymycompc/solana-rpc-error-32015-why-4-in-10-transactions-vanish-from-your-app-26cm</guid>
      <description>&lt;p&gt;If your Solana code logs this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Transaction version (1) is not supported by the requesting client.
Please try the request again with the following configuration parameter: "maxSupportedTransactionVersion": 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;your code asked the RPC for transactions up to version 0 and the one it wanted is version 1. The RPC refuses it instead of answering.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it matters now
&lt;/h2&gt;

&lt;p&gt;Version 1 transactions went live on mainnet on 2026-09-15 (the first one we found is in slot 447,120,004). In sampled mainnet blocks they were 13.8% of non-vote transactions the week of Sep 14 and &lt;strong&gt;41.9% from Oct 16 to 30&lt;/strong&gt; (44.4% of swaps). Whether you see one depends only on which wallet or SDK the sender used, so a payment can fail for one customer and work for the next.&lt;/p&gt;

&lt;p&gt;We reported this bug in 30+ open-source projects. Six maintainers have already fixed it: Agent402, elizaOS, UltiMafia, rotki, taurvia and sol-parser-sdk-nodejs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// @solana/web3.js 1.99.0 or later (1.98.x throws on version 1 even with this setting)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTransaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;maxSupportedTransactionVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_transaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max_supported_transaction_version&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;RpcTransactionConfig&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;max_supported_transaction_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="nn"&gt;Default&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;default&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same for &lt;code&gt;getParsedTransaction(s)&lt;/code&gt; and &lt;code&gt;getBlock&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which library versions can read version 1
&lt;/h2&gt;

&lt;p&gt;Tested on mainnet on 2026-10-30 against a real version 1 transaction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;@solana/web3.js 1.95.8 to 1.98.4: throw&lt;/strong&gt;, even when asked correctly. 1.99.0+ works.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;@solana/kit before 7.1.0&lt;/strong&gt; returns &lt;code&gt;version&lt;/code&gt; as the bigint &lt;code&gt;1n&lt;/code&gt;, so &lt;code&gt;version === 1&lt;/code&gt; is false. 7.1.0+ works.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;solana-py 0.30.2 to 0.41.0&lt;/strong&gt; works with &lt;code&gt;max_supported_transaction_version=1&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Traps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;getParsedTransactions&lt;/code&gt; / &lt;code&gt;getTransactions&lt;/code&gt; throw for the &lt;strong&gt;whole batch&lt;/strong&gt; when one entry fails: one version 1 payment hides 49 others.&lt;/li&gt;
&lt;li&gt;Code that catches the error and returns null reports a paid transaction as "not found".&lt;/li&gt;
&lt;li&gt;Raw version 1 bytes start with &lt;code&gt;0x81&lt;/code&gt;, so hand-written parsers break too.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full page, with a live checker for any signature: &lt;a href="https://solana-pulse-gateway-1021990235790.us-central1.run.app/fix/transaction-version-not-supported" rel="noopener noreferrer"&gt;https://solana-pulse-gateway-1021990235790.us-central1.run.app/fix/transaction-version-not-supported&lt;/a&gt;&lt;/p&gt;

</description>
      <category>solana</category>
      <category>web3</category>
      <category>javascript</category>
      <category>rust</category>
    </item>
  </channel>
</rss>
