<?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: ginaa</title>
    <description>The latest articles on DEV Community by ginaa (@0xxxxxxxx).</description>
    <link>https://dev.to/0xxxxxxxx</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%2F4209179%2Fc735abdc-c511-456a-ae67-5a46b5894162.png</url>
      <title>DEV Community: ginaa</title>
      <link>https://dev.to/0xxxxxxxx</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/0xxxxxxxx"/>
    <language>en</language>
    <item>
      <title>signread: an open-weight model that reads your wallet signature before you sign it</title>
      <dc:creator>ginaa</dc:creator>
      <pubDate>Mon, 26 Oct 2026 16:30:28 +0000</pubDate>
      <link>https://dev.to/0xxxxxxxx/signread-an-open-weight-model-that-reads-your-wallet-signature-before-you-sign-it-55a2</link>
      <guid>https://dev.to/0xxxxxxxx/signread-an-open-weight-model-that-reads-your-wallet-signature-before-you-sign-it-55a2</guid>
      <description>&lt;p&gt;This is a submission for the Hacktoberfest Open-Source AI Challenge: Week 4.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;Most crypto wallet drains are not hacks. Someone signs something they could not read: a gasless Permit, a Permit2 batch, a Seaport listing for 0 ETH, a setApprovalForAll, or a blind 32-byte hash. The wallet shows hex, and people tap Sign.&lt;/p&gt;

&lt;p&gt;signread takes that payload and turns it into one verdict (HIGH, MEDIUM or LOW), the facts behind it, and a short explanation in plain language from a local open-weight model. It also has a page mode that scans mint pages, airdrop posts and AI-agent skill.md files for traps: seed-phrase asks, curl | sh, prompt injection aimed at agents, blanket approvals, hidden fees and refund-later schemes.&lt;/p&gt;

&lt;p&gt;I do not own a laptop. I built and run this from my phone, so the main way to use it is a GitHub Actions button: paste the payload, and read the result in the run summary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/DaddyUnikii/signread" rel="noopener noreferrer"&gt;https://github.com/DaddyUnikii/signread&lt;/a&gt;&lt;br&gt;
Release: &lt;a href="https://github.com/DaddyUnikii/signread/releases/tag/v0.1.0" rel="noopener noreferrer"&gt;https://github.com/DaddyUnikii/signread/releases/tag/v0.1.0&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Example: a Seaport order that lists an NFT and pays the owner nothing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HIGH  Seaport order: you list items for sale
  you give        ERC721 #1234 x1
  paid out        1 wei to someone else
  order end time  never expires
  HIGH  you receive nothing for these items (classic free-listing drain)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AI (qwen2.5:1.5b): If you sign this, anyone can take NFT #1234 without paying you, and the permission never expires. Do not sign.&lt;/p&gt;

&lt;h2&gt;
  
  
  How open-source AI is at the core
&lt;/h2&gt;

&lt;p&gt;The runner installs Ollama, pulls Qwen 2.5 1.5B (Apache-2.0, open weights) and runs it on CPU. No API key, no account, and the payload never leaves the runner. You can swap in llama3.2:3b, gemma2:2b or any OpenAI-compatible local server (llama.cpp, vLLM, LM Studio).&lt;/p&gt;

&lt;p&gt;The key design choice: the AI explains, the rules decide.&lt;/p&gt;

&lt;p&gt;A deterministic decoder, covered by tests, computes the verdict. The model only gets the structured findings, is told to treat quoted text as untrusted data, and is not allowed to change the verdict. So a prompt-injected page or a sweet-talking message cannot talk the model into saying "safe". The open model does what it is good at, explaining in the user's own language (English or Indonesian), and stays out of the part that has to be exact.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open beat closed here
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Privacy: what you are about to sign is sensitive, and it stays on a machine you control.&lt;/li&gt;
&lt;li&gt;Cost: free to run on a GitHub runner, so anyone can fork it and use it from a phone.&lt;/li&gt;
&lt;li&gt;Control: a small local model with a fixed job is predictable, and the verdict never depends on a hosted API changing behind you.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tech
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Zero dependencies, Node 18+&lt;/li&gt;
&lt;li&gt;Decodes EIP-2612 and DAI permits, Permit2, Seaport, generic EIP-712, personal_sign (including SIWE domain checks) and common approval calldata&lt;/li&gt;
&lt;li&gt;16 tests, CI on Node 18, 20 and 22&lt;/li&gt;
&lt;li&gt;--fail-on HIGH for bots and CI&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;A browser-extension front end, more marketplaces, and a poisoned-address checker for your transaction history.&lt;/p&gt;

&lt;p&gt;Thanks for reading. Don't sign what you can't read.&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>devchallenge</category>
      <category>opensource</category>
      <category>web3</category>
    </item>
  </channel>
</rss>
