<?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>Forem: TxDesk</title>
    <description>The latest articles on Forem by TxDesk (@txdesk).</description>
    <link>https://forem.com/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>Forem: TxDesk</title>
      <link>https://forem.com/txdesk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/txdesk"/>
    <language>en</language>
    <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://forem.com/txdesk/three-sui-exploits-in-one-week-so-i-built-5-security-tools-to-catch-them-5697</link>
      <guid>https://forem.com/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://forem.com/txdesk/whats-the-largest-project-you-or-any-programmer-you-know-has-completed-entirely-with-ai-assistance-4e1b</link>
      <guid>https://forem.com/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://forem.com/txdesk/im-18-and-i-built-a-layer-1-blockchain-from-scratch-in-rust-1f8a</link>
      <guid>https://forem.com/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://forem.com/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://forem.com/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>
