<?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: TxDesk</title>
    <description>The latest articles on DEV Community by TxDesk (@txdesk).</description>
    <link>https://dev.to/txdesk</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3899034%2F0c207ba6-5370-4fed-8cb8-4686ea666065.png</url>
      <title>DEV Community: TxDesk</title>
      <link>https://dev.to/txdesk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/txdesk"/>
    <language>en</language>
    <item>
      <title>Your Support Team Shouldn't Need to Read a Block Explorer</title>
      <dc:creator>TxDesk</dc:creator>
      <pubDate>Mon, 04 May 2026 14:27:48 +0000</pubDate>
      <link>https://dev.to/txdesk/your-support-team-shouldnt-need-to-read-a-block-explorer-4e0j</link>
      <guid>https://dev.to/txdesk/your-support-team-shouldnt-need-to-read-a-block-explorer-4e0j</guid>
      <description>&lt;p&gt;It's 3am UTC. Someone in your Discord pastes a transaction hash and the message: "did i just get drained??"&lt;/p&gt;

&lt;p&gt;What happens next is mechanical. A moderator opens the block explorer, scrolls past gas limits and method calls and log topics, decodes the transfer, translates &lt;code&gt;0xa9059cbb&lt;/code&gt; into "this was an ERC20 transfer," cross-references the destination address, then types something like "looks like you swapped on Uniswap, here's the route." The user replies with a follow-up. Maybe the same flow runs five more times.&lt;/p&gt;

&lt;p&gt;That same conversation will run two hundred times in this channel tonight. The moderator wasn't hired for forensics. The protocol didn't budget for it either.&lt;/p&gt;

&lt;h2&gt;
  
  
  The notification gap
&lt;/h2&gt;

&lt;p&gt;The Drift exploit on April 1 ran for about twelve minutes. 31 withdrawal transactions, $285M out the door, and the protocol's first X post telling users to halt deposits arrived after on-chain analytics firms had already flagged the active attack. Wasabi on April 30 followed the same shape: the attacker started draining at 07:48 UTC, kept going for roughly two hours, and the official acknowledgment showed up afterward. Users watching the price action on their phones knew something was wrong before the team confirmed it.&lt;/p&gt;

&lt;p&gt;This isn't anyone's fault. The sequence has to be: detect, pause, investigate, post. Posting first risks broadcasting an exploit before the contract is safe. Pausing first protects the funds. Communication is last because it has to be.&lt;/p&gt;

&lt;p&gt;But during that gap, the people who deposited into the protocol have no answer to the question they care about most: is my position safe right now. They get told to "monitor official channels," and the official channel is silent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The "am I affected?" flood
&lt;/h2&gt;

&lt;p&gt;April 18, Kelp DAO: a forged LayerZero message drained 116,500 rsETH, about $292M. Within hours, nine downstream protocols had paused something. Aave froze rsETH and WETH markets. Around $8.45B fled Aave's pools in the next forty-eight hours. The Aave forum's incident report counted 119 borrower positions at liquidation risk after the dust settled.&lt;/p&gt;

&lt;p&gt;Each of those protocols got the same wave. Discord channels filled with the same five questions: am I affected, do I need to do anything, where is my money, can I withdraw, what should I revoke. Same questions, hundreds of times, in parallel across nine protocols. Each answer requires looking at the user's specific position. The volunteer mod can't batch them.&lt;/p&gt;

&lt;p&gt;Revoke.cash maintains a permanent page at revoke.cash/exploits called "Check If You're Affected." It exists because every exploit produces this exact flood, and someone built a static site as the least-bad triage tool. The existence of that page is the evidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  The revoke.cash gap
&lt;/h2&gt;

&lt;p&gt;After Wasabi, the official guidance was to revoke approvals at revoke.cash. Within hours, a phishing account named "Wascbi Profocol" posted a fake revoke link in the same threads where users were asking what to do. Per Blockzeit's coverage, it "apparently misled several people."&lt;/p&gt;

&lt;p&gt;Read what the official advice actually asks of a user. Identify which contracts you've approved. Recognize the real protocol's account from the impostor. Open a tool you've probably never used. Sign a transaction whose effects you can't preview. Do all of this fast, while panicking, while scammers are setting up imitation links.&lt;/p&gt;

&lt;p&gt;The revoke.cash advice is correct. It's also incomplete in a way that matters. Users following the safety procedure got drained again because the procedure assumed knowledge they didn't have, on the day they could least afford a wrong click.&lt;/p&gt;

&lt;h2&gt;
  
  
  The layer nobody built
&lt;/h2&gt;

&lt;p&gt;Protocols have monitoring. Hypernative, Blockaid, Cyvers all detected the recent exploits within seconds. Protocols have docs, audit reports, X accounts, status pages, Discord. What's missing isn't information. It's translation.&lt;/p&gt;

&lt;p&gt;A monitoring alert says "rsETH/WETH market frozen." A user wants to know "is my $40K still there, what is the worst case for me, and what do I need to do in the next ten minutes."&lt;/p&gt;

&lt;p&gt;These are not the same artifact. One is protocol-shaped. The other is position-shaped. The translation between them is what Discord moderators have been doing manually, one user at a time, with a block explorer open in another tab.&lt;/p&gt;

&lt;p&gt;Morpho moved its public Discord to read-only on February 1, 2026. Co-founder Merlin Egalite, on record: "Discord is actually full of scammers. people would get phished while actually searching for answers despite heavy monitoring, safeguards, etc." DefiLlama is migrating off Discord too. The volunteer-mod-with-block-explorer model is being abandoned by the protocols that originally built it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the workflow looks like instead
&lt;/h2&gt;

&lt;p&gt;The piece I've been building is the translation layer. TxDesk (txdesk.io) takes one input, an address or a transaction hash, plus a question in plain English. It runs the lookups a moderator would run, against the user's actual on-chain state, and returns the answer in seconds.&lt;/p&gt;

&lt;p&gt;A user pastes a tx hash and asks "what happened?" The agent decodes the transaction, returns status, parties, amounts, fees, and the decoded method call, in a paragraph a non-technical user can read.&lt;/p&gt;

&lt;p&gt;A user asks "will I get liquidated if ETH drops 20%?" The agent calls &lt;code&gt;explain_liquidation_risk&lt;/code&gt; against their lending position. It returns &lt;code&gt;currentHealthFactor&lt;/code&gt;, &lt;code&gt;distanceToLiquidationPercent&lt;/code&gt;, and an array of &lt;code&gt;perAssetLiquidationPrices&lt;/code&gt; with one row per collateral asset. Plus suggestions: &lt;code&gt;requiredDebtRepaymentUsd&lt;/code&gt; to hit a target health factor, or &lt;code&gt;requiredCollateralAddUsd&lt;/code&gt; to add instead. The user gets a number, not a vibe.&lt;/p&gt;

&lt;p&gt;A user pastes a Sui package ID and asks "is this safe?" The package risk tool returns &lt;code&gt;riskLevel&lt;/code&gt;, &lt;code&gt;isLatestVersion&lt;/code&gt; (false flags deprecated versions, the pattern that bit Scallop), and &lt;code&gt;upgradeCapOwnerKind&lt;/code&gt; (AddressOwner with an upgradeable policy is the single-key blast-radius pattern that bit Volo). A full Cetus CLMM scan returns end-to-end in 1.7 seconds.&lt;/p&gt;

&lt;p&gt;A user pastes a failed transaction. The diagnosis tool returns one of eight Sui failure categories, with two or three suggested fixes computed from the user's wallet state.&lt;/p&gt;

&lt;p&gt;Every field is tagged &lt;code&gt;dataAvailable: full | partial | unavailable&lt;/code&gt;, so the agent can't invent values that didn't load. 39 tools, 43+ chains.&lt;/p&gt;

&lt;p&gt;Every exploit in April produced the same support failure. Different attack vector each time, same broken communication on the user side. The fix isn't more moderators, faster Discord triage, or better Twitter posts. It's an answer that runs in seconds, in plain English, against the user's actual on-chain position, available the moment the user asks. That layer didn't exist. Now it does.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>web3</category>
      <category>programming</category>
      <category>security</category>
    </item>
    <item>
      <title>Three Sui Exploits in One Week. So I Built 5 Security Tools to Catch Them.</title>
      <dc:creator>TxDesk</dc:creator>
      <pubDate>Thu, 30 Apr 2026 13:21:02 +0000</pubDate>
      <link>https://dev.to/txdesk/three-sui-exploits-in-one-week-so-i-built-5-security-tools-to-catch-them-5697</link>
      <guid>https://dev.to/txdesk/three-sui-exploits-in-one-week-so-i-built-5-security-tools-to-catch-them-5697</guid>
      <description>&lt;p&gt;In nine days, three Sui DeFi protocols got hit. &lt;a href="https://www.banklesstimes.com/articles/2026/04/22/volo-protocol-confirms-3-5m-sui-vault-exploit-500k-already-frozen/" rel="noopener noreferrer"&gt;Volo&lt;/a&gt; lost $3.5M on April 21. &lt;a href="https://www.cryptotimes.io/2026/04/27/scallop-loses-142k-in-flash-loan-attack-on-deprecated-contract/" rel="noopener noreferrer"&gt;Scallop&lt;/a&gt; lost $142K on April 26. &lt;a href="https://www.cryptopolitan.com/aftermath-finance-exploit-perpetual-futures/" rel="noopener noreferrer"&gt;Aftermath Finance&lt;/a&gt; lost $1.14M USDC on April 29.&lt;/p&gt;

&lt;p&gt;Three different protocols, three different attack patterns, one shared root cause: nobody had a way to check the structural risk before signing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three patterns
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Scallop&lt;/strong&gt;: Sui packages don't disappear when you upgrade them. They get superseded — but the old version stays callable on chain forever. Scallop's V2 staking-rewards package from November 2023 sat dormant for 17 months until someone found an uninitialized &lt;code&gt;last_index&lt;/code&gt; counter and claimed rewards from a synthetic position that "existed since the spool launched." The frontend pointed at the new version. The on-chain remnants didn't care.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Volo&lt;/strong&gt;: Not a smart-contract bug. The contracts were audited. The single keypair holding upgrade authority over three vaults got compromised. $3.5M gone in one signing session. The audit didn't matter because the audit assumed the key was safe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aftermath Finance&lt;/strong&gt;: A public entry function called &lt;code&gt;add_integrator_config&lt;/code&gt; had no authorization check. The attacker set &lt;code&gt;max_taker_fee&lt;/code&gt; to 0. A signedness bug then interpreted that as negative. They got paid to trade. Eleven transactions, 36 minutes, $1.14M.&lt;/p&gt;

&lt;p&gt;Three patterns: deprecated code still callable, single-key admin, missing auth on a public entry. None of them are detectable by reading dApp UIs. All three are detectable from RPC data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The five tools
&lt;/h2&gt;

&lt;p&gt;I built five Sui-specific security tools for &lt;a href="https://txdesk.io" rel="noopener noreferrer"&gt;TxDesk&lt;/a&gt;, the AI support layer for crypto products I've been working on. Each tool is a single TypeScript service, fully tested, plugged into the agent's tool registry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;assess_sui_package_risk&lt;/code&gt;&lt;/strong&gt;. Detects deprecated package versions by walking the UpgradeCap chain — the original Scallop pattern. Classifies cap ownership (single-key vs Shared multisig vs Immutable) — the original Volo precondition. Counts public entry functions that don't take a Cap parameter — a heuristic for the AftermathFi pattern. The interesting bit: my original plan called for three discovery paths to find the UpgradeCap. Smoke testing against mainnet revealed Sui's &lt;code&gt;0x2::package&lt;/code&gt; module emits no Move events at all, so the event-based path was structurally impossible. Deleted it. The remaining publish-tx scan does all the work, faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;diagnose_failed_sui_transaction&lt;/code&gt;&lt;/strong&gt;. Classifies eight failure categories — &lt;code&gt;INSUFFICIENT_GAS&lt;/code&gt;, &lt;code&gt;MOVE_ABORT_SLIPPAGE&lt;/code&gt;, &lt;code&gt;MOVE_ABORT_AUTH&lt;/code&gt;, &lt;code&gt;MOVE_ABORT_GENERIC&lt;/code&gt;, &lt;code&gt;OBJECT_VERSION_CONFLICT&lt;/code&gt;, &lt;code&gt;SHARED_OBJECT_CONGESTION&lt;/code&gt;, &lt;code&gt;INVALID_GAS_OBJECT&lt;/code&gt;, &lt;code&gt;TYPE_ARGUMENT_ERROR&lt;/code&gt; — with plain-English suggestions per category. The interesting bit: I tightened the slippage heuristic during planning. The original idea was to guess slippage from module name alone (any abort in a &lt;code&gt;pool&lt;/code&gt; module = probably slippage). That's wrong. Many functions in pool modules aren't swaps. Now slippage requires BOTH the module name to match (&lt;code&gt;pool|swap|amm|dex|router&lt;/code&gt;) AND the function name to match (&lt;code&gt;swap|trade|exchange|exact_(in|out)|exec&lt;/code&gt;). If the function name isn't resolvable from the abort error string, classification falls back to &lt;code&gt;MOVE_ABORT_GENERIC&lt;/code&gt;. False negatives over false positives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;inspect_sui_object&lt;/code&gt;&lt;/strong&gt;. Single-RPC tool that returns object type, ownership kind (one of &lt;code&gt;AddressOwner&lt;/code&gt; / &lt;code&gt;ObjectOwner&lt;/code&gt; / &lt;code&gt;Shared&lt;/code&gt; / &lt;code&gt;Immutable&lt;/code&gt;), version, and decoded content. For &lt;code&gt;Coin&amp;lt;T&amp;gt;&lt;/code&gt; objects, a parallel &lt;code&gt;suix_getCoinMetadata(T)&lt;/code&gt; call decodes the balance with proper decimals. The interesting bit: when the metadata fetch fails, we surface the raw balance string and &lt;code&gt;decimals: null&lt;/code&gt; rather than defaulting to the SUI decimals. Showing "1,500,000,000 (raw, decimals unavailable)" is honest. Showing "1.5 SUI" when we don't know the actual decimals would be a guess.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;check_sui_coin_metadata&lt;/code&gt;&lt;/strong&gt;. Answers "is this token legit, and who can mint it?" Validates the coin type structure (also accepts the wrapped form &lt;code&gt;0x2::coin::Coin&amp;lt;...&amp;gt;&lt;/code&gt;), fetches metadata and total supply, locates the &lt;code&gt;TreasuryCap&amp;lt;T&amp;gt;&lt;/code&gt; and inspects its current owner. The interesting bit: I introduced an &lt;code&gt;RpcOutcome&amp;lt;T&amp;gt;&lt;/code&gt; discriminated union here — &lt;code&gt;{ ok: true; value: T | null } | { ok: false }&lt;/code&gt;. The reason is subtle. For metadata, a null result from &lt;code&gt;suix_getCoinMetadata&lt;/code&gt; means "definitively no metadata published" (a scam signal). A network error means "we don't know yet." The original &lt;code&gt;safeRpcCall&lt;/code&gt; helper flattened both to plain &lt;code&gt;null&lt;/code&gt;, which would have falsely flagged real coins as scams during transient RPC outages. The discriminated union forces the call site to distinguish.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;check_sui_account_risk&lt;/code&gt;&lt;/strong&gt;. SUI balance, owned-object inventory, UpgradeCap inventory, recent transaction count. Flags addresses holding upgrade authority over five or more packages as &lt;code&gt;CRITICAL&lt;/code&gt; — the Volo blast-radius pattern. The interesting bit: a 30-second total operation timeout wraps the entire pipeline. Whales with thousands of owned objects could otherwise drag the agent. If the deadline fires mid-pagination, the report returns with &lt;code&gt;coverageComplete: false&lt;/code&gt;, which forces &lt;code&gt;riskLevel: 'UNKNOWN'&lt;/code&gt;. We never fabricate a "looks fine" answer from a partial scan.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mainnet smoke test
&lt;/h2&gt;

&lt;p&gt;I picked Cetus CLMM as the target. It's a well-known Sui DEX, handles real daily volume, and the team is reputable. The package ID came from the &lt;a href="https://github.com/CetusProtocol/cetus-contracts/blob/main/packages/cetus_clmm/Move.toml" rel="noopener noreferrer"&gt;Cetus contracts Move.toml on GitHub&lt;/a&gt;: &lt;code&gt;0x1eabed72c53feb3805120a081dc15963c204dc8d091542592abaf7a35689b2fb&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The agent classified the intent as &lt;code&gt;security_concern&lt;/code&gt;, routed correctly to &lt;code&gt;assess_sui_package_risk&lt;/code&gt; (not &lt;code&gt;assess_contract_risk&lt;/code&gt; — the EVM version), and returned &lt;strong&gt;CRITICAL&lt;/strong&gt; in 1.7 seconds (post-cleanup). Two findings:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;isLatestVersion: false&lt;/code&gt;. The package was superseded by &lt;code&gt;0x25ebb9a7…dfee5e3&lt;/code&gt;. Calling the old version is the Scallop pattern, live in production on a real protocol.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;upgradeCapOwnerKind: 'AddressOwner'&lt;/code&gt;. A single keypair (&lt;code&gt;0xdbfd…4a47&lt;/code&gt;) controls upgrades. The Volo precondition.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's not a hand-picked test fixture. That's the product working on a real Sui DEX on day one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The never-lie principle
&lt;/h2&gt;

&lt;p&gt;The default engineering reflex when an API call fails is to return &lt;code&gt;false&lt;/code&gt;. It compiles. It type-checks. It doesn't crash. And it's a lie.&lt;/p&gt;

&lt;p&gt;"API failed" and "the answer is no" are different statements. Defaulting to &lt;code&gt;false&lt;/code&gt; collapses them and propagates a wrong answer with full confidence.&lt;/p&gt;

&lt;p&gt;Every Sui tool I built uses nullable booleans for every signal that could fail: &lt;code&gt;isPackage: boolean | null&lt;/code&gt;, &lt;code&gt;isLatestVersion: boolean | null&lt;/code&gt;, &lt;code&gt;treasuryCapStatus: SuiTreasuryCapStatus | null&lt;/code&gt;. Each report includes a &lt;code&gt;dataAvailable: 'full' | 'partial' | 'unavailable'&lt;/code&gt; flag. Only &lt;code&gt;'full'&lt;/code&gt; reports are cached. Partial reports are returned to the user but never written to Redis, so the next call retries.&lt;/p&gt;

&lt;p&gt;Concrete example. If we can't find the UpgradeCap for a package — the publish tx got pruned, the RPC timed out, whatever — we don't say there's no cap. We say &lt;code&gt;upgradeCapId: null, upgradeCapOwnerKind: null&lt;/code&gt;. Those are different statements. The first would imply an immutable package. The second admits we don't know.&lt;/p&gt;

&lt;p&gt;The cost: users sometimes see "we couldn't determine X." The benefit: when we DO say something, it's worth trusting.&lt;/p&gt;

&lt;h2&gt;
  
  
  What mainnet smoke testing taught me
&lt;/h2&gt;

&lt;p&gt;I wrote all five tools, wrote 87 tests, all green. Then I ran four &lt;code&gt;curl&lt;/code&gt; commands against the actual Sui mainnet RPC. Three findings:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The SuiVision verification URL I'd put into the package-risk service (&lt;code&gt;api.suivision.xyz/v1/packages/...&lt;/code&gt;) didn't resolve. DNS error. The endpoint I'd assumed existed never did.&lt;/li&gt;
&lt;li&gt;The Move event filter for UpgradeCap discovery (&lt;code&gt;MoveEventType: '0x2::package::PublishEvent'&lt;/code&gt;) returned empty 200 responses. Broadening to the entire &lt;code&gt;0x2::package&lt;/code&gt; module returned zero events from any source. Sui packages don't emit Move events for publish — at all.&lt;/li&gt;
&lt;li&gt;The CurrencyCreated event filter for TreasuryCap discovery DID return events, but the event type is generic (&lt;code&gt;CurrencyCreated&amp;lt;T&amp;gt;&lt;/code&gt;) so a non-parameterized filter never matches, and the event's &lt;code&gt;parsedJson&lt;/code&gt; only contains &lt;code&gt;{decimals}&lt;/code&gt; — not the cap ID I'd assumed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;All three findings led to deletion, not workarounds. SuiVision call: deleted entirely. Path A in package-risk: deleted (Sui literally cannot provide what I was asking for). Path A in coin-metadata: replaced with a publish-tx scan that piggybacks on a &lt;code&gt;sui_getObject&lt;/code&gt; call already happening, costing one additional RPC instead of three.&lt;/p&gt;

&lt;p&gt;Tool execution dropped 46%. Code got smaller. The result is more honest. The lesson: never write a code path that depends on an API behavior you haven't verified — and when smoke testing reveals that path is dead, delete it. Don't leave it as a "best-effort fallback" that's actually a no-op.&lt;/p&gt;

&lt;h2&gt;
  
  
  Numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;5 new services: 2,893 lines&lt;/li&gt;
&lt;li&gt;5 test files: 2,080 lines&lt;/li&gt;
&lt;li&gt;87 new tests, 1,097 across the codebase&lt;/li&gt;
&lt;li&gt;37 tools total in TxDesk now (up from 32)&lt;/li&gt;
&lt;li&gt;One evening session, planning through commit &lt;code&gt;54b2b40&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Smoke test caught real &lt;code&gt;CRITICAL&lt;/code&gt; issues on Cetus CLMM on day one&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;If you're building on Sui or using Sui DeFi protocols, these tools are live at &lt;a href="https://txdesk.io" rel="noopener noreferrer"&gt;txdesk.io&lt;/a&gt;. And if you're a protocol team dealing with fifty identical "am I affected?" messages after every exploit — that's the problem TxDesk solves.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>cryptocurrency</category>
      <category>ai</category>
    </item>
    <item>
      <title>What's the largest project you or any programmer you know has completed entirely with AI assistance?</title>
      <dc:creator>TxDesk</dc:creator>
      <pubDate>Tue, 28 Apr 2026 10:49:45 +0000</pubDate>
      <link>https://dev.to/txdesk/whats-the-largest-project-you-or-any-programmer-you-know-has-completed-entirely-with-ai-assistance-4e1b</link>
      <guid>https://dev.to/txdesk/whats-the-largest-project-you-or-any-programmer-you-know-has-completed-entirely-with-ai-assistance-4e1b</guid>
      <description></description>
      <category>ai</category>
      <category>discuss</category>
      <category>programming</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>I'm 18 and I built a Layer 1 blockchain from scratch in Rust</title>
      <dc:creator>TxDesk</dc:creator>
      <pubDate>Mon, 27 Apr 2026 13:40:40 +0000</pubDate>
      <link>https://dev.to/txdesk/im-18-and-i-built-a-layer-1-blockchain-from-scratch-in-rust-1f8a</link>
      <guid>https://dev.to/txdesk/im-18-and-i-built-a-layer-1-blockchain-from-scratch-in-rust-1f8a</guid>
      <description>&lt;h2&gt;
  
  
  The project
&lt;/h2&gt;

&lt;p&gt;NOVAI is a Layer 1 blockchain where AI entities are protocol primitives, not smart contracts. Most "AI blockchains" bolt AI onto an existing VM through oracle calls or contract wrappers. NOVAI does it differently. AI entities exist at the same level as accounts and validators. They have on-chain identity, persistent memory, economic balance, and capability flags. All enforced at the protocol layer.&lt;/p&gt;

&lt;p&gt;There is no smart contract VM. No WASM runtime. Every transaction type is a native protocol operation.&lt;/p&gt;

&lt;p&gt;The entire codebase is clean-room. No code from Substrate, Tendermint, Cosmos SDK, or any other implementation. 65,000+ lines of Rust across 16 crates, 1,100+ tests, zero unsafe code.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/0x-devc/NOVAI-node" rel="noopener noreferrer"&gt;github.com/0x-devc/NOVAI-node&lt;/a&gt;&lt;br&gt;
Website: &lt;a href="https://novai.network" rel="noopener noreferrer"&gt;novai.network&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  What makes NOVAI different
&lt;/h2&gt;

&lt;p&gt;On most blockchains, "AI integration" means an off-chain model that pokes the chain through oracle calls or contract wrappers. The AI runs somewhere else. The chain just stores the result.&lt;/p&gt;

&lt;p&gt;NOVAI puts AI entities inside the protocol. An entity is a first-class on-chain identity that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Holds its own balance and pays its own fees&lt;/li&gt;
&lt;li&gt;Has its own Ed25519 signing key and signs its own transactions&lt;/li&gt;
&lt;li&gt;Publishes signal commitments (anomaly, prediction, risk-score, and 4 more types)&lt;/li&gt;
&lt;li&gt;Owns persistent memory objects (chain summaries, statistics snapshots, anomaly logs)&lt;/li&gt;
&lt;li&gt;Has governance-controlled autonomy modes and capability flags&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The chain doesn't need to interpret bytecode to understand what an entity is doing. Every operation has known semantics at the protocol layer.&lt;/p&gt;




&lt;h2&gt;
  
  
  What shipped this week
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Open source launch
&lt;/h3&gt;

&lt;p&gt;The full codebase went public under Apache 2.0. Git history was cleaned. CI is green on GitHub Actions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Developer docs - 5 deliverables
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Quick Start Tutorial&lt;/strong&gt; - "Build Your First AI Entity on NOVAI in 10 Minutes"&lt;/p&gt;

&lt;p&gt;Step-by-step CLI walkthrough. Generate keys, fund from faucet, register an AI entity with its own signing key, publish a signal, create a memory object, query everything back. Every command and output block is real captured data from a live 4-node devnet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/0x-devc/NOVAI-node/blob/main/docs/tutorials/FIRST_AI_ENTITY.md" rel="noopener noreferrer"&gt;Read it on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. TypeScript SDK Tutorial&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;170-line working example. Connect to a node, fund an account, transfer tokens, register an AI entity, verify it on chain. Self-contained npm project. Just run &lt;code&gt;npm install &amp;amp;&amp;amp; npm start&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/0x-devc/NOVAI-node/tree/main/sdk/novai-sdk-ts/examples/quick-start" rel="noopener noreferrer"&gt;See the example&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Rust SDK Tutorial&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Same flow in idiomatic async Rust on tokio. Single file, runs with &lt;code&gt;cargo run --example quick-start&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/0x-devc/NOVAI-node/tree/main/sdk/novai-sdk/examples/quick-start" rel="noopener noreferrer"&gt;See the example&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. RPC Reference&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;777 lines covering all 13 JSON-RPC endpoints. Each one has a description, parameter table, response shape, error table, and a real curl command with captured output.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/0x-devc/NOVAI-node/blob/main/docs/RPC_REFERENCE.md" rel="noopener noreferrer"&gt;Read it on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Architecture Deep Dive&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Crate-by-crate walkthrough of all 16 crates organized by dependency layer. Mermaid diagrams for the consensus flow and the transaction lifecycle. Three guided reading paths for newcomers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/0x-devc/NOVAI-node/blob/main/docs/ARCHITECTURE.md" rel="noopener noreferrer"&gt;Read it on GitHub&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Block explorer
&lt;/h3&gt;

&lt;p&gt;React + Vite + Tailwind single-page app that calls the node's RPC endpoints. Live block list with 2-second polling, block detail page, account lookup, AI entity page with memory objects and signals, and a network stats dashboard. Developers run it locally against their devnet.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI entity demos
&lt;/h3&gt;

&lt;p&gt;Three runnable demos showing the AI-entity-as-protocol-primitive pattern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Anomaly bot&lt;/strong&gt; - A TypeScript bot that registers itself as an on-chain entity, polls chain activity every 1.5 seconds, runs three heuristic detectors (empty block streaks, round spikes, stalled chains), and publishes an anomaly signal plus a memory object whenever one fires. Cooldowns prevent re-firing on the same condition.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-entity demo&lt;/strong&gt; - Two bots interacting purely through the chain. Bot A (predictor) publishes prediction signals guessing future block tx counts. Bot B (risk-scorer) reads those predictions via on-chain memory objects, waits for the target block, compares predicted vs actual, and publishes a risk-score signal with the delta. No shared database. No API calls between them. Just on-chain data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CLI demo script&lt;/strong&gt; - Full entity lifecycle in bash with banner sections for blog posts or video recordings. Keygen, faucet, register, credit, signal publish, memory CRUD, query.&lt;/p&gt;

&lt;h3&gt;
  
  
  The bug fix that unblocked everything
&lt;/h3&gt;

&lt;p&gt;While building the tutorials I found that entity-signed signal and memory transactions were silently failing through the RPC path. The root cause was four handlers using the wrong lookup key. They did a primary-key lookup with an address value instead of using the reverse index that maps address to entity ID. The entity record was never found so every signal and memory transaction quietly returned an error that got swallowed.&lt;/p&gt;

&lt;p&gt;The fix was refactoring all four handlers into inner functions that take a pre-resolved entity. Added 7 regression tests that exercise the full dispatch path. Verified end-to-end on a live devnet.&lt;/p&gt;

&lt;p&gt;I wrote about a similar silent-failure bug in my first blog post: &lt;a href="https://dev.to/0xdevc/the-bug-that-silently-broke-my-entire-blockchain-how-a-single-function-rejected-trailing-bytes-4fij"&gt;The Bug That Silently Broke My Entire Blockchain&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The numbers
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;65,000+ lines of Rust&lt;/li&gt;
&lt;li&gt;16 crates in the workspace&lt;/li&gt;
&lt;li&gt;1,100+ tests passing&lt;/li&gt;
&lt;li&gt;30M+ blocks committed on the private testnet&lt;/li&gt;
&lt;li&gt;Zero unsafe code&lt;/li&gt;
&lt;li&gt;10 native transaction types&lt;/li&gt;
&lt;li&gt;4-validator private testnet running since early 2026&lt;/li&gt;
&lt;li&gt;HotStuff BFT consensus with 3-chain commit rule&lt;/li&gt;
&lt;li&gt;Sparse Merkle Tree state with deterministic 32-byte roots&lt;/li&gt;
&lt;li&gt;Ed25519 signatures, Blake3 hashing, Noise XX transport encryption&lt;/li&gt;
&lt;li&gt;Apache 2.0 licensed&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Public testnet. The private testnet runs on a shared VPS that causes state root divergence under sustained load. The fix is a dedicated CPU server. Once that's in place we'll have a public RPC with SSL, validator onboarding, and the block explorer deployed at explorer.novai.network.&lt;/p&gt;

&lt;p&gt;I'm also looking for a technical co-founder. I'm building this solo. If you're a Rust engineer interested in BFT consensus, on-chain AI primitives, or clean-room blockchain development, the codebase is open and PRs are welcome.&lt;/p&gt;




&lt;p&gt;Website: &lt;a href="https://novai.network" rel="noopener noreferrer"&gt;novai.network&lt;/a&gt;&lt;br&gt;
GitHub: &lt;a href="https://github.com/0x-devc/NOVAI-node" rel="noopener noreferrer"&gt;github.com/0x-devc/NOVAI-node&lt;/a&gt;&lt;br&gt;
Twitter: &lt;a href="https://x.com/NOVAInetwork" rel="noopener noreferrer"&gt;@NOVAInetwork&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>rust</category>
      <category>blockchain</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I'm 18, I built an AI support agent for DeFi protocols with 77K lines of code, and I have zero customers</title>
      <dc:creator>TxDesk</dc:creator>
      <pubDate>Sun, 26 Apr 2026 16:26:27 +0000</pubDate>
      <link>https://dev.to/txdesk/im-18-i-built-an-ai-support-agent-for-defi-protocols-with-77k-lines-of-code-and-i-have-zero-4eb5</link>
      <guid>https://dev.to/txdesk/im-18-i-built-an-ai-support-agent-for-defi-protocols-with-77k-lines-of-code-and-i-have-zero-4eb5</guid>
      <description>&lt;p&gt;I'm Victor, 18 years old, solo founder. I've spent the last several months building TxDesk, an AI-powered support widget that DeFi protocols can embed on their sites. Users paste a transaction hash or wallet address, and the agent decodes it into plain English.&lt;br&gt;
What it actually does&lt;br&gt;
The agent pulls live on-chain data across 46 blockchains (21 EVM chains + Solana + Bitcoin + TRON + XRP + 20 more). It can:&lt;/p&gt;

&lt;p&gt;Decode any transaction and explain what happened in plain language&lt;br&gt;
Scan token approvals and flag risky unlimited allowances&lt;br&gt;
Check wallet balances across any supported chain&lt;br&gt;
Diagnose why a transaction failed&lt;br&gt;
Track cross-chain bridge transfers&lt;br&gt;
Assess smart contract risk&lt;br&gt;
Verify wallet ownership via WalletConnect (Sign-In With Ethereum / Solana)&lt;/p&gt;

&lt;p&gt;It deploys as an embeddable website widget (one script tag), a Discord bot, or a Telegram bot.&lt;br&gt;
The stack&lt;/p&gt;

&lt;p&gt;TypeScript monorepo (api + widget + website + shared package)&lt;br&gt;
Preact for the widget (needs to be tiny, it loads on other people's sites)&lt;br&gt;
Rollup for bundling the widget into a single JS file&lt;br&gt;
OpenAI function calling for the AI agent layer&lt;br&gt;
RocksDB-backed caching for chain data&lt;br&gt;
30+ tool functions the AI can call depending on the question&lt;br&gt;
WalletConnect v2 for wallet verification&lt;br&gt;
Stripe for billing&lt;br&gt;
Hetzner VPS, Nginx, Docker&lt;/p&gt;

&lt;p&gt;How I built it&lt;br&gt;
I don't write code from scratch. I use Claude Code (Anthropic's CLI coding tool) to build everything. I describe what I want, review the output, debug issues, and make architectural decisions. The AI writes the code, I steer the product.&lt;br&gt;
This sounds like it shouldn't work for a production system. But here's what the repo looks like after months of this workflow:&lt;/p&gt;

&lt;p&gt;~77,000 lines of TypeScript&lt;br&gt;
~1,700 tests passing&lt;br&gt;
Zero clippy-equivalent warnings&lt;br&gt;
Multi-tenant SaaS with auth, billing, rate limiting, and role-based access&lt;br&gt;
Full CI pipeline&lt;/p&gt;

&lt;p&gt;The key to making AI-assisted coding work at scale is decision documentation. I run 2-3 Claude Code terminals in parallel. Each terminal has no memory of what the others decided. So I write markdown docs that capture every architectural decision and load them into each session. Without that, the AI will happily undo work from another session.&lt;br&gt;
The problem nobody tells you about&lt;br&gt;
Building the product was the easy part. Distribution is where I'm stuck.&lt;br&gt;
Here's what I've tried:&lt;/p&gt;

&lt;p&gt;80+ cold DMs to protocol founders on Twitter, zero replies&lt;br&gt;
40+ cold emails, zero replies&lt;br&gt;
Daily Twitter posting, engagement but zero inbound leads&lt;br&gt;
Discord community presence, got auto-muted for spam when I posted about TxDesk&lt;br&gt;
Posting in protocol Discords, most block new members from posting links&lt;/p&gt;

&lt;p&gt;The product works. I can demo it right now at txdesk.io. But nobody knows it exists, and cold outreach from an unknown 18-year-old solo founder looks identical to the 50 other pitches a protocol team gets every week.&lt;br&gt;
What I'm doing differently now&lt;br&gt;
I've stopped cold outreach entirely. New strategy:&lt;/p&gt;

&lt;p&gt;Targeting crypto community management agencies instead of protocols directly. One agency manages 10-50 client communities, so one sale means multiple deployments.&lt;br&gt;
Being helpful in protocol Discords without mentioning TxDesk. Answering on-chain questions manually to build reputation first.&lt;br&gt;
Twitter engagement on trending crypto security events. Replying with smart analysis on exploit threads. One reply got 1,764 views from 13 followers because I was adding genuine insight, not promoting.&lt;br&gt;
In-person events. Attending Ethereum London meetups. A 5-minute laptop demo beats 100 DMs.&lt;br&gt;
Applying to CV Labs Accelerator in Zug. I grew up there, it's my home turf.&lt;/p&gt;

&lt;p&gt;What I've learned so far&lt;/p&gt;

&lt;p&gt;Nobody cares about your feature list. "46 chains and 30 tools" means nothing to a buyer. "Your moderators won't need to open Etherscan anymore" means everything.&lt;br&gt;
Cold outreach doesn't work when you have zero brand. You need to be known before you pitch.&lt;br&gt;
Building with AI tools is a legitimate superpower for shipping speed. But shipping speed doesn't matter if nobody uses what you ship.&lt;br&gt;
The hardest transition is going from full-time builder (12 hours of coding) to full-time seller (2 hours of outreach and then waiting). The waiting feels like you're not working. You are.&lt;/p&gt;

&lt;p&gt;If you're in a similar spot, zero customers, great product, no distribution, I'd genuinely love to hear what's working for you. And if you're building in the DeFi space and want to try TxDesk, the demo is live at txdesk.io.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>web3</category>
      <category>typescript</category>
      <category>blockchain</category>
    </item>
  </channel>
</rss>
