<?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: Mitch</title>
    <description>The latest articles on DEV Community by Mitch (@stelmitchay).</description>
    <link>https://dev.to/stelmitchay</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%2F2940888%2Fcaa95ab5-0e15-4565-9fe1-202d81e00c5a.png</url>
      <title>DEV Community: Mitch</title>
      <link>https://dev.to/stelmitchay</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stelmitchay"/>
    <language>en</language>
    <item>
      <title>Gasless Transactions on Solana</title>
      <dc:creator>Mitch</dc:creator>
      <pubDate>Tue, 04 Nov 2025 10:03:14 +0000</pubDate>
      <link>https://dev.to/stelmitchay/gaslesstransactions-on-solana-2340</link>
      <guid>https://dev.to/stelmitchay/gaslesstransactions-on-solana-2340</guid>
      <description>&lt;p&gt;Two years ago, I walked into my first ever crypto event as a complete outsider. When the presenter asked a question, I raised my hand. Boom $3 straight to my wallet for a correct answer. I was genuinely excited. Real digital money I could actually spend, right? Wrong. What followed was a painful lesson in crypto's biggest UX flaw: I needed to buy a completely different token just to move the money I'd earned. Standing there confused, holding dollars I couldn't spend without SOL I didn't have, I thought exactly what millions of first-time users think: this whole thing is a scam.&lt;/p&gt;

&lt;p&gt;That frustration stuck with me. Not because I'm bitter about three dollars, but because I realized this broken experience is repeated thousands of times daily across the ecosystem. Kora is built to remove that friction. To see how it does it, we need to first understand why this point of friction even exists in the first place.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Solana Transactions Normally Work
&lt;/h2&gt;

&lt;p&gt;Every interaction on Solana runs through a transaction. A transaction is nothing more than a container of instructions, each telling an on-chain program what to do. Those programs define the rules, what operations are valid, how accounts are updated, and what conditions must be met. Think of an instruction as a function call to an on-chain program, telling it to perform a particular task and on the other hand a transaction is just a package of one or more instructions. Transactions on Solana are by default atomic in nature—either all instructions succeed or the whole transaction fails&lt;/p&gt;

&lt;p&gt;Sounds clean. But here's the catch: every transaction needs SOL. Always.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example: David Sends SOL to Samuel.
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Account Structure:&lt;/strong&gt; Both wallets (David and Samuel) are accounts owned by the System Program&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each account maintains:

&lt;ul&gt;
&lt;li&gt;Lamports (SOL balance): 1 SOL = 1 billion lamports&lt;/li&gt;
&lt;li&gt;Owner (System Program for wallets)&lt;/li&gt;
&lt;li&gt;Data (usually empty for wallets)&lt;/li&gt;
&lt;li&gt;Executable flag (false for wallets)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Transaction Construction and Signing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;David constructs a transaction with a SystemProgram.transfer instruction&lt;/li&gt;
&lt;li&gt;He signs the transaction and submits it to the network&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Validator Processing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The validator simulates and executes the transaction&lt;/li&gt;
&lt;li&gt;Upon execution, the System Program, since it owns both accounts deducts lamports from David and credits Samuel&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The sender account (David) must sign (is_signer) the transaction to authorize the System Program to deduct from its lamports balance. Both sender and recipient accounts must be writable (is_writable) since their balances change during the transfer.&lt;/p&gt;

&lt;p&gt;In practice this is how to send a transaction that transfers SOL from one account to another:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;anyhow&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;solana_client&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;nonblocking&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;rpc_client&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;RpcClient&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;solana_sdk&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;
    &lt;span class="nn"&gt;commitment_config&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CommitmentConfig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;native_token&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;LAMPORTS_PER_SOL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nn"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Signer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nn"&gt;signer&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;keypair&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Keypair&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;system_instruction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Transaction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nd"&gt;#[tokio::main]&lt;/span&gt;
&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Create a connection to cluster&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;RpcClient&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new_with_commitment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"http://localhost:8899"&lt;/span&gt;&lt;span class="nf"&gt;.to_string&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="nn"&gt;CommitmentConfig&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;confirmed&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Generate sender and recipient keypairs&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;sender&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Keypair&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;recipient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Keypair&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="c1"&gt;// Fund sender with airdrop&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;airdrop_signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;
        &lt;span class="nf"&gt;.request_airdrop&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="nf"&gt;.pubkey&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;LAMPORTS_PER_SOL&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;loop&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;confirmed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="nf"&gt;.confirm_transaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;airdrop_signature&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;confirmed&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Check balance before transfer&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;pre_balance1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="nf"&gt;.get_balance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="nf"&gt;.pubkey&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;pre_balance2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="nf"&gt;.get_balance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="nf"&gt;.pubkey&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Define the amount to transfer&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;transfer_amount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;LAMPORTS_PER_SOL&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// 0.01 SOL&lt;/span&gt;

    &lt;span class="c1"&gt;// Create a transfer instruction for transferring SOL from sender to recipient&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;transfer_instruction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="nn"&gt;system_instruction&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;transfer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="nf"&gt;.pubkey&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="nf"&gt;.pubkey&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;transfer_amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Add the transfer instruction to a new transaction&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;transaction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
        &lt;span class="nn"&gt;Transaction&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new_with_payer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;transfer_instruction&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="nf"&gt;.pubkey&lt;/span&gt;&lt;span class="p"&gt;()));&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;blockhash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="nf"&gt;.get_latest_blockhash&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;transaction&lt;/span&gt;&lt;span class="nf"&gt;.sign&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;blockhash&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Send the transaction to the network&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;transaction_signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;
        &lt;span class="nf"&gt;.send_and_confirm_transaction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;transaction&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="c1"&gt;// Check balance after transfer&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;post_balance1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="nf"&gt;.get_balance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="nf"&gt;.pubkey&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;post_balance2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="nf"&gt;.get_balance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;recipient&lt;/span&gt;&lt;span class="nf"&gt;.pubkey&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;&lt;span class="k"&gt;.await&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"Sender prebalance: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;pre_balance1&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;LAMPORTS_PER_SOL&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"Recipient prebalance: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;pre_balance2&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;LAMPORTS_PER_SOL&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"Sender postbalance: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;post_balance1&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;LAMPORTS_PER_SOL&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"Recipient postbalance: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;post_balance2&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;LAMPORTS_PER_SOL&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nb"&gt;f64&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Transaction Signature: {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;transaction_signature&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nf"&gt;Ok&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;h3&gt;
  
  
  Why SOL Is Always Required for Gas
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Network Protection:&lt;/strong&gt; Fees prevent spam and misuse of validator resources&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validator Compensation:&lt;/strong&gt; Minimum charge is 5,000 lamports per signature. Half is burned; the other half compensates the validator for processing the transaction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why SOL Only?&lt;/strong&gt; Validators rely on SOL as the native, consistently valued token. Accepting other tokens would break consensus, as validators cannot universally verify their value or convert them consistently&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Kora's Core Innovation
&lt;/h2&gt;

&lt;p&gt;At its core, Kora is a relayer that removes the strict dependency on users to hold SOL for every transaction. Instead of forcing users to hold SOL, Kora steps in as the fee payer. Validators still get paid in SOL, but users reimburse the Kora operator in the token they already hold USDC, BONK, or any other SPL token.&lt;/p&gt;

&lt;p&gt;The result is "gasless." Not because the fees vanish, but because the complexity of handling SOL is abstracted away from the user. From the user's perspective, they sign one transaction, in one token, and it just works.&lt;/p&gt;

&lt;p&gt;Building on our previous SOL transfer example, let's see how Kora transforms the Solana transaction flow to eliminate the SOL requirement for end users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kora Transaction Flow: From Friction to Seamless
&lt;/h3&gt;

&lt;p&gt;Here's how Kora handles a BONK token transfer from David to Samuel, with David paying fees in BONK rather than SOL:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;User Interaction:&lt;/strong&gt; The user interacts with a dApp that utilizes Kora&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transaction Construction:&lt;/strong&gt; The application constructs the Solana transaction to transfer BONK from David to Samuel, and includes a token payment instruction to the Kora node operator as part of this transaction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User Authorization:&lt;/strong&gt; The user signs their portion of the transaction using their wallet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kora Routing:&lt;/strong&gt; Instead of sending directly to the Solana network, the application forwards the partially signed transaction to the configured Kora RPC endpoint&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validation Process:&lt;/strong&gt; The Kora node thoroughly validates the transaction against its configured rules defined in the kora.toml file:

&lt;ul&gt;
&lt;li&gt;Are the included instructions valid?&lt;/li&gt;
&lt;li&gt;Is the SPL token payment adequate to cover current SOL fees (based on Oracle price feed)?&lt;/li&gt;
&lt;li&gt;Is this transaction allowed under the node's security policies (allowed programs/tokens)?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Co-signing:&lt;/strong&gt; If valid, Kora co-signs as the fee payer, covering the actual SOL network fees and returns the signed transaction to the app&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network Submission:&lt;/strong&gt; Application forwards the Kora-signed transaction to Solana for processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution:&lt;/strong&gt; Solana executes the transaction. The SPL tokens transfer to the Kora node operator, the actual SOL fees are paid by the Kora node, and the user's intended transaction processes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Completion:&lt;/strong&gt; The application monitors transaction status and notifies the user upon successful completion&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The user successfully completes their transaction using only SPL tokens, while Kora handles all SOL-denominated network fees behind the scenes, making the experience truly "gasless." Because Solana transactions are atomic, if the fee payment to the Kora node fails, or if any other instruction within the bundled transaction fails, the entire operation reverts. The fee conversion from SPL tokens to SOL is handled entirely by the Kora node operator, making it invisible and seamless to the end user.&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sequenceDiagram
    participant User
    participant dApp
    participant KoraNode
    participant SolanaNetwork
    User-&amp;gt;&amp;gt;dApp: Initiates transfer (BONK from David → Samuel)
    dApp-&amp;gt;&amp;gt;dApp: Build transaction\n+ Token payment instruction to Kora node
    dApp-&amp;gt;&amp;gt;User: Request signature
    User-&amp;gt;&amp;gt;dApp: Signs transaction
    dApp-&amp;gt;&amp;gt;KoraNode: Sends partially signed transaction
    KoraNode-&amp;gt;&amp;gt;KoraNode: Validate transaction\n- Valid instructions?\nAdequate SPL token payment?\n- Allowed under policies?
    alt Transaction invalid
        KoraNode--&amp;gt;&amp;gt;dApp: Reject transaction
    else Transaction valid
        KoraNode-&amp;gt;&amp;gt;dApp: Co-signs as fee payer\n(Covers SOL fees)
        dApp-&amp;gt;&amp;gt;SolanaNetwork: Forwards fully signed transaction
        SolanaNetwork-&amp;gt;&amp;gt;SolanaNetwork: Executes transaction\n- Transfers SPL tokens to Kora node\n- Pays SOL fees from Kora node\n- Processes user's transfer
        SolanaNetwork-&amp;gt;&amp;gt;dApp: Confirmation
        dApp-&amp;gt;&amp;gt;User: Notify success
    end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This flow demonstrates how Kora abstracts away the underlying complexity while maintaining the security and atomicity guarantees of Solana transactions. Now let's examine the technical architecture that makes this possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kora's Technical Architecture
&lt;/h2&gt;

&lt;p&gt;The seamless user experience Kora enables even though it sounds magical is not magic it is the product of a meticulously engineered system where each component plays a critical, interdependent role. This architecture is designed not just to abstract gas fees, but to do so securely, scalably, and in a way that empowers developers rather than constraining them&lt;/p&gt;

&lt;h3&gt;
  
  
  The Four Pillars of Kora's architecture
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Rust Core Library:&lt;/strong&gt; &lt;/p&gt;this is the deterministic rulebook and execution engine for the Kora protocol, this library processes every incoming transaction to execute a series validations defined in the node's kora.toml configuration file. Its function is threefold: it first validates all transaction instructions for correctness against their associated Solana programs; it then performs a check, using a price oracle to verify the proffered SPL token fee adequately covers the network cost in SOL plus any margin; and finally, it enforces security policy by whitelisting allowed programs and tokens while blacklisting malicious accounts. This process is the critical gatekeeper, ensuring only valid transactions are co-signed, thereby protecting the node operator's SOL funds from exploitation and transforming their wallet into a secure, programmable asset.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;TypeScript SDK:&lt;/strong&gt; &lt;/p&gt;The TypeScript SDK is the developer-facing gateway to the Kora protocol, providing a streamlined interface for integrating gasless transactions into applications. Its primary purpose is to abstract the underlying complexity of constructing, signing, and relaying transactions to a Kora node. The SDK handles the entire client-side workflow: it bundles the user's intended instructions with a necessary fee payment instruction to the Kora operator, manages the serialization and deserialization of transactions, and facilitates all communication with the Kora RPC server via a defined API. By offering a clean, well-documented API with comprehensive code examples for common actions like token transfers and swaps, it allows developers to implement a gasless user experience with minimal code, focusing on their application logic rather than the low-level intricacies of transaction management.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;JSON-RPC Server:&lt;/strong&gt; &lt;/p&gt;The JSON-RPC Server operates as the central hub for the Kora network, providing the primary interface that applications use to access its gasless functionality. This server delivers a standardized HTTP API which runs on &lt;code&gt;http://localhost:8080&lt;/code&gt; by default, enabling consistent communication regardless of the client's programming language. It exposes several critical endpoints that manage the gasless transaction lifecycle:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;estimate_transaction_fee:&lt;/strong&gt; This endpoint allows applications to calculate the exact cost of a transaction before it is submitted. A client provides a simulation of the transaction, and the server returns a quote denominated in the user's chosen SPL token. This quote is calculated using a price oracle to convert the network fee (in SOL) into the equivalent amount of the specified token, including any margin configured by the node operator. This provides essential cost certainty for the end-user.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;get_supported_tokens:&lt;/strong&gt; This method returns a list of token mints that the node operator has configured as acceptable forms of payment for transaction fees. This list is defined in the kora.toml file under allowed_spl_paid_tokens. Applications can call this endpoint to dynamically populate a UI, showing users which tokens they can use to pay for gas on that particular node.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;sign_and_send_transaction:&lt;/strong&gt; This is the primary endpoint for processing gasless transactions. A client submits a partially-signed transaction bundle that includes both the user's intended instructions and a fee payment instruction. The server performs several actions: it validates the request, delegates the transaction to the core library for security and economic checks, appends the node's signature as the fee payer if validation passes, and finally submits the fully-signed transaction to the Solana network. It then returns the resulting transaction signature to the client for confirmation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;CLI Tool:&lt;/strong&gt; &lt;/p&gt;The CLI Tool is the operational control panel for the node operator, providing the necessary commands to deploy, configure, and monitor a Kora node. Its purpose is to grant the operator direct management capabilities over the node's behavior and health outside of the real-time transaction flow. This tool is used to edit the kora.toml configuration file defining security policies, economic parameters, and authentication secrets—and to start the service with specific runtime flags. It also provides commands for real-time monitoring of node status, checking signer wallet balances, and viewing logs for debugging. By offering a direct command line interface, the CLI ensures that node operators, particularly DevOps and infrastructure teams, have the precise control required to maintain a secure, efficient, and profitable Kora service in a production environment&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;With the four pillars of the architecture establishing how a transaction is processed, the next critical consideration is who authorizes the payment of SOL and how that authority is secured. This brings us to the core of operational security.&lt;/p&gt;

&lt;h2&gt;
  
  
  Signer Options
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Solana Private Key (Self-Managed)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Development environments and small-scale deployments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup Options:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Environment variables&lt;/li&gt;
&lt;li&gt;CLI flags&lt;/li&gt;
&lt;li&gt;JSON file path&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Supported Formats:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Base58 (default)&lt;/li&gt;
&lt;li&gt;U8Array&lt;/li&gt;
&lt;li&gt;JSON file&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Generate New Keypair:&lt;/strong&gt; Use Solana CLI tools&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Turnkey Integration (Enterprise)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Production deployments requiring maximum security&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Benefits:&lt;/strong&gt; Hardware Security Modules (HSMs) and granular policy controls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Requirements:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Turnkey account setup&lt;/li&gt;
&lt;li&gt;Environment variables: Organization ID, API keys, Private Key ID&lt;/li&gt;
&lt;li&gt;Start with &lt;code&gt;--with-turnkey-signer&lt;/code&gt; flag&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Privy Integration (Web3 Apps)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Best for:&lt;/strong&gt; Applications with embedded wallet infrastructure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Requirements:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Privy account configuration&lt;/li&gt;
&lt;li&gt;Environment variables: App ID, App Secret, Wallet ID&lt;/li&gt;
&lt;li&gt;Start with &lt;code&gt;--with-privy-signer&lt;/code&gt; flag&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;The choice of signer integration directly impacts both security posture and operational complexity. Enterprise deployments should prioritize HSM-backed solutions, while development environments can use simpler key management approaches. However, regardless of the signer chosen, proper authentication is essential to prevent unauthorized access.&lt;/p&gt;

&lt;h2&gt;
  
  
  Authentication: Securing Your RPC Endpoint
&lt;/h2&gt;

&lt;p&gt;Without authentication, anyone who discovers your endpoint can submit transactions and drain your SOL balance. Kora provides two complementary authentication methods that can be used individually or combined for maximum security.&lt;/p&gt;

&lt;h3&gt;
  
  
  Method 1: API Key Authentication
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How it Works:&lt;/strong&gt; Simple shared secret transmitted in HTTP headers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup Process:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Add API key to .env file or kora.toml configuration&lt;/li&gt;
&lt;li&gt;Clients include key in x-api-key header with every request&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Security Level:&lt;/strong&gt; Basic protection suitable for internal applications or trusted clients&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Risk Consideration:&lt;/strong&gt; If intercepted, acts like a password that grants full access&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Method 2: HMAC Authentication
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How it Works:&lt;/strong&gt; Creates unique cryptographic signature for each request&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Setup Process:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;Add KORA_HMAC_SECRET (minimum 32 characters) to configuration&lt;/li&gt;
&lt;li&gt;Client Process:&lt;/li&gt;
&lt;li&gt;Combine &lt;code&gt;{timestamp}{request_body}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Sign with HMAC-SHA256 using shared secret&lt;/li&gt;
&lt;li&gt;Send headers: x-timestamp and x-hmac-signature&lt;/li&gt;
&lt;li&gt;Server Validation: Validates signature and timestamp with 5-minute expiry window&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Security Level:&lt;/strong&gt; High-grade protection suitable for public APIs or untrusted networks&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Key Benefit:&lt;/strong&gt; Secret never travels over the network, preventing interception attacks&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;For production deployments, we recommend enabling both authentication methods simultaneously. This layered approach provides defense in depth, ensuring that even if one authentication method is compromised, the secondary method provides continued protection.&lt;/p&gt;

&lt;p&gt;Now that we've covered security fundamentals, let's examine how to configure Kora nodes to meet specific business requirements and operational constraints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuration Management
&lt;/h2&gt;

&lt;p&gt;The kora.toml file serves as the control center for a Kora node's behavior, allowing operators to define business requirements and security policies for transaction processing. It should be located in the deployment directory or specified via the &lt;code&gt;--config&lt;/code&gt; flag when starting the server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Configuration Sections
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Kora Core Policies&lt;/strong&gt; &lt;/p&gt;Configures fundamental server behavior including rate limiting (requests per second) and global authentication policies for api_key and hmac_secret. These settings form the baseline security and performance profile for your node.

&lt;p&gt;&lt;strong&gt;Kora Enabled Methods&lt;/strong&gt; &lt;/p&gt;Controls which RPC methods (e.g., sign_transaction, get_supported_tokens) are enabled or disabled. By default, all methods are enabled unless this section is explicitly configured, giving operators granular control over node functionality.

&lt;p&gt;&lt;strong&gt;Validation Policies&lt;/strong&gt; &lt;/p&gt;Defines Solana-related security rules and transaction limits:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;max_allowed_lamports:&lt;/strong&gt; Limits the maximum SOL amount a Kora node will pay per transaction, providing crucial cost controls&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;max_signatures:&lt;/strong&gt; Sets the maximum number of signatures per transaction to prevent excessive SOL spending on complex transactions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;price_source:&lt;/strong&gt; Specifies the oracle for token price data—"Jupiter" for production environments or "Mock" for testing scenarios&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;allowed_programs:&lt;/strong&gt; Whitelists Solana programs that transactions can interact with, creating a secure "walled garden" environment&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;allowed_tokens and allowed_spl_paid_tokens:&lt;/strong&gt; Whitelist token mints that can be used in transactions or accepted as payment for fees&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;disallowed_accounts:&lt;/strong&gt; Blacklists accounts explicitly blocked from all transactions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fee Payer Policy&lt;/strong&gt; &lt;/p&gt;Restricts what the Kora node's fee payer wallet can do, preventing unexpected behavior or unauthorized transfers. Security best practice recommends setting all options (like allow_sol_transfers, allow_spl_transfers) to false by default and enabling only as specifically needed.

&lt;p&gt;&lt;strong&gt;Price Configuration&lt;/strong&gt; &lt;/p&gt;Defines how transaction fees are calculated, offering three distinct business models:

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Margin Pricing:&lt;/strong&gt; Adds a percentage margin on top of actual network fees (default margin is 0.0%). This ensures SOL costs are covered while generating profit margins for node operators.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fixed Pricing:&lt;/strong&gt; Charges a fixed amount in a specific token regardless of fluctuating network fees. This provides predictable costs for users but transfers fee volatility risk to node operators.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Free Pricing:&lt;/strong&gt; Sponsors all transaction fees, charging nothing to users. This powerful tool for user acquisition and growth is often used for subsidized onboarding campaigns.&lt;/li&gt;
&lt;/ol&gt;


These configuration options provide the flexibility to adapt Kora nodes to different business models, from profit-generating services to user acquisition tools. With configuration covered, let's move to practical implementation with a comprehensive setup guide.

&lt;h2&gt;
  
  
  Getting Started with Kora
&lt;/h2&gt;


To begin developing with Kora, you'll establish a local development environment. This involves installing the Kora RPC server, configuring it to accept SPL token payments, and running a client demonstration to witness fee abstraction in action.

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Solana CLI v2.2.x or newer&lt;/li&gt;
&lt;li&gt;Rust programming environment&lt;/li&gt;
&lt;li&gt;Node.js v24 or later&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Step 1: Install the Kora RPC Server
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;kora-rpc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



This installation provides the `kora-rpc` binary that serves as your local Kora node for development and testing purposes.

&lt;h3&gt;
  
  
  Step 2: Clone the Demo Project
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/solana-foundation/kora.git
&lt;span class="nb"&gt;cd &lt;/span&gt;kora/demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Understanding the Demo Structure:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;client/src/&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;setup.ts&lt;/code&gt; – Local environment initialization, including generating keypairs, airdropping SOL, and initializing test tokens&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;main.ts&lt;/code&gt; – Runs the demonstration transaction using token-based fees&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;client.ts&lt;/code&gt; – Kora client factory for RPC communication&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;types.ts&lt;/code&gt; – TypeScript definitions for Kora RPC request/response types&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;server/&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;kora.toml&lt;/code&gt; – Kora node configuration defining security rules, allowed tokens, and fee parameters&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;demo/.env&lt;/strong&gt; – Created by setup.ts, containing keypairs and mint addresses&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Step 3: Install Client Dependencies
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;client
npm &lt;span class="nb"&gt;install
cd&lt;/span&gt; ..
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 4: Initialize the Local Environment
&lt;/h3&gt;


Run the setup script to prepare your development environment:



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm tsx client/src/setup.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



This initialization process will:


&lt;ul&gt;
&lt;li&gt;Generate development keypairs and write them to demo/.env&lt;/li&gt;
&lt;li&gt;Airdrop SOL to test accounts (for local validator compatibility)&lt;/li&gt;
&lt;li&gt;Create a USDC test token mint and fund test accounts&lt;/li&gt;
&lt;li&gt;Display the USDC mint public key for configuration&lt;/li&gt;
&lt;/ul&gt;


**Important:** Copy the USDC mint address from the output; you'll need it for the next configuration step.

&lt;h3&gt;
  
  
  Step 5: Configure kora.toml
&lt;/h3&gt;


Open `server/kora.toml` and whitelist your test token so Kora accepts it as a payment method.



In the `[validation]` section, configure:



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="c"&gt;# Replace with your actual USDC mint from setup output&lt;/span&gt;
&lt;span class="py"&gt;allowed_tokens&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;USDC_TOKEN_MINT_PUBKEY&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;allowed_spl_paid_tokens&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;USDC_TOKEN_MINT_PUBKEY&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Additional Configuration Options (adjust as needed):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;max_allowed_lamports&lt;/strong&gt; – Cap the SOL your node will sponsor per transaction&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;max_signatures&lt;/strong&gt; – Limit Solana base-fee exposure (fees scale with signature count)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;price_source&lt;/strong&gt; – Token pricing source ("Mock" for local development, "Jupiter" for production)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;allowed_programs&lt;/strong&gt; – Whitelist program IDs users can invoke&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;disallowed_accounts&lt;/strong&gt; – Explicit account blocklist&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;api_key, hmac_secret&lt;/strong&gt; – Enable authentication (strongly recommended for production)&lt;/li&gt;
&lt;/ul&gt;


**Note:** If you re-run setup.ts later with a new mint, remember to update kora.toml accordingly.

&lt;h3&gt;
  
  
  Step 6: Start Services (Multi-Terminal Setup)
&lt;/h3&gt;


You'll need four terminals to run the complete demo environment:

&lt;h4&gt;
  
  
  Terminal 1: Start Local Test Validator
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# From project root or anywhere&lt;/span&gt;
solana-test-validator &lt;span class="nt"&gt;-r&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Terminal 2: Initialize Environment
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# From ./client directory&lt;/span&gt;
npm init-env
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



This script performs several critical setup tasks:


&lt;ul&gt;
&lt;li&gt;Generate keypairs and save them to .env&lt;/li&gt;
&lt;li&gt;Airdrop SOL to test accounts for transaction fees&lt;/li&gt;
&lt;li&gt;Create and initialize a local USDC token&lt;/li&gt;
&lt;li&gt;Fund test accounts with both SOL and tokens&lt;/li&gt;
&lt;/ul&gt;


**Important Configuration Update:** Copy the public key of the newly created USDC test token from your .env file and update both `allowed_tokens` and `allowed_spl_paid_tokens` in `./server/kora.toml`:



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="py"&gt;allowed_tokens&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s"&gt;"YOUR_USDC_LOCAL_PUBLIC_KEY"&lt;/span&gt; &lt;span class="c"&gt;# Update with USDC_LOCAL_KEY public key from .env&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="py"&gt;allowed_spl_paid_tokens&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s"&gt;"YOUR_USDC_LOCAL_PUBLIC_KEY"&lt;/span&gt; &lt;span class="c"&gt;# Update with USDC_LOCAL_KEY public key from .env&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Terminal 3: Start Kora RPC Server
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# From ./server directory&lt;/span&gt;
kora-rpc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



The server reads configuration from kora.toml and uses environment variables from the shared .env file. If using different folder structures, you may need the `--config` flag to specify kora.toml location and `--private-key` to specify your private key directory. Use `kora-rpc -h` for comprehensive help.

&lt;h4&gt;
  
  
  Terminal 4: Run Client Demo
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# From ./client directory&lt;/span&gt;
npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Expected Output:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Kora Config: {
    fee_payer: 'Df2UmGQH86TBDsub7XZoSAo7KZa1ZJZr2w1PL1APUjjU',
    validation_config: {
        max_allowed_lamports: 1000000,
        max_signatures: 10,
        allowed_programs: [
            '11111111111111111111111111111111',
            'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',
            'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL'
        ],
        allowed_tokens: [
            'usdCAEFbouFGxdkbHCRtMTcN7DJHd3aCmP9vqjLgmAp'
        ],
        allowed_spl_paid_tokens: [
            'usdCAEFbouFGxdkbHCRtMTcN7DJHd3aCmP9vqjLgmAp'
        ],
        disallowed_accounts: [],
        price_source: 'Mock'
    }
}
Blockhash: C8W8d5w2H4jKXyFg5CEBoiaPvEpJ1am7xLxZ3fym4a2g
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This output confirms your Kora server is running and properly configured for development. You're now ready to experience gasless transactions firsthand and begin building applications that leverage Kora's fee abstraction capabilities.&lt;/p&gt;

&lt;p&gt;With your development environment established, the next consideration is how to scale and secure these capabilities for production deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Production Deployment and Infrastructure Management
&lt;/h2&gt;

&lt;p&gt;Operating a Kora node requires a strategic approach to deployment and robust infrastructure management. As a paymaster service handling user transactions and managing significant SOL funds, infrastructure choices and operational practices are paramount to success.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deployment Options: Self-Host vs. Cloud
&lt;/h3&gt;

&lt;p&gt;Kora offers flexible deployment across various environments to match different operational requirements and technical constraints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Local Development:&lt;/strong&gt; &lt;/p&gt;Run Kora nodes locally for rapid testing and development iteration. This approach provides full control and immediate feedback during the development process.

&lt;p&gt;&lt;strong&gt;Production Environments:&lt;/strong&gt; &lt;/p&gt;Kora supports deployment via Docker containers or direct installation on any cloud platform. The kora-rpc crate is distributed as a standalone executable that can be installed globally or deployed in containerized environments.

&lt;p&gt;&lt;strong&gt;Railway Integration:&lt;/strong&gt; &lt;/p&gt;Railway provides streamlined deployment experience for Kora nodes, including automatic SSL certificate management, domain configuration, and built-in monitoring capabilities. This managed approach reduces operational overhead while maintaining security standards.
&lt;h3&gt;
  
  
  Scaling Considerations
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Traffic Management:&lt;/strong&gt; &lt;/p&gt;Kora allows node operators to implement global, per-second rate limiting configurable via the rate_limit option in kora.toml. This prevents abuse and ensures consistent performance under varying load conditions.

&lt;p&gt;&lt;strong&gt;Capacity Planning:&lt;/strong&gt; &lt;/p&gt;Node operators must plan for expected use cases and user volume. Consider factors like peak transaction times, seasonal usage patterns, and growth projections when sizing infrastructure.

&lt;p&gt;&lt;strong&gt;RPC Endpoint Strategy:&lt;/strong&gt; &lt;/p&gt;Kora requires a Solana RPC endpoint specified via the &lt;code&gt;--rpc-url&lt;/code&gt; flag or RPC_URL environment variable. For higher transaction volumes, external scalable RPC services can handle increased demand while maintaining performance standards.


These infrastructure considerations directly impact security requirements, which represent the most critical aspect of production Kora node operations.

&lt;h2&gt;
  
  
  Security Best Practices
&lt;/h2&gt;


Security is paramount for Kora node operators, as the node's signer key has direct access to SOL funds used for fee payments. Kora provides multiple layers of protection to safeguard operations and user funds.

&lt;h3&gt;
  
  
  Authentication Security
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Dual Authentication Approach:&lt;/strong&gt; &lt;/p&gt;Kora supports two optional authentication methods that can be used individually or combined for maximum protection:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;API Key Authentication:&lt;/strong&gt; Basic security using shared secrets in HTTP headers via x-api-key. Suitable for internal applications or trusted clients, but vulnerable if intercepted.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HMAC Authentication:&lt;/strong&gt; Advanced security creating unique cryptographic signatures for each request. Each signature includes timestamps that expire after 5 minutes, preventing replay attacks. Attackers cannot create valid requests without the shared secret key.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Combined Authentication:&lt;/strong&gt; For maximum security, both methods can be enabled simultaneously, requiring clients to provide x-api-key, x-timestamp, and x-hmac-signature headers.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Signer Key Security
&lt;/h3&gt;


The signer keypair controls your SOL funds and requires the highest level of protection:


&lt;p&gt;&lt;strong&gt;Operational Security Practices:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dedicated Keypairs:&lt;/strong&gt; Use keypairs exclusively for your Kora node, avoiding reuse of personal wallets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minimal Funding:&lt;/strong&gt; Only fund signer wallets with SOL amounts you're prepared to spend on transaction fees&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure Storage:&lt;/strong&gt; Never hardcode private keys or API keys in source code or logs. Use environment variables or dedicated secrets management systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Regular Rotation:&lt;/strong&gt; Rotate authentication keys periodically (monthly or quarterly schedules)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Enterprise Key Management:&lt;/strong&gt; &lt;/p&gt;For production-grade applications, Kora integrates with enterprise key management services:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Turnkey Integration:&lt;/strong&gt; Provides Hardware Security Modules (HSMs) and policy controls for maximum security&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privy Integration:&lt;/strong&gt; Offers embedded wallet infrastructure with institutional-grade protection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Monitoring and Alerting:&lt;/strong&gt; Implement comprehensive monitoring for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Low SOL balance alerts to prevent service interruption&lt;/li&gt;
&lt;li&gt;Unusual transaction patterns that might indicate compromise&lt;/li&gt;
&lt;li&gt;Authentication failures and security events&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These security measures provide the foundation for reliable, secure Kora node operations. However, understanding the broader impact and applications of this technology reveals why Kora represents a fundamental shift in blockchain user experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Impact: Emerging Markets
&lt;/h2&gt;

&lt;p&gt;In regions like Africa, where blockchain adoption is accelerating rapidly, Kora's fee abstraction becomes even more transformative. Consider these scenarios where Kora can deliver immediate impact:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mobile Money Integration:&lt;/strong&gt; In countries like Sierra Leone, Nigeria, and Kenya, where mobile money dominates financial transactions, users are already comfortable with digital payments. Kora enables seamless bridges between local mobile money systems and Solana dApps, allowing users to pay transaction fees with familiar stablecoin equivalents without ever touching SOL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Remittances and Cross-Border Payments:&lt;/strong&gt; Family members sending money across African borders can use stablecoin-powered applications that leverage Kora for gasless transactions. Recipients can receive and transact immediately without needing to acquire SOL first—a crucial advantage in regions where cryptocurrency exchanges may be limited or expensive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Merchant Adoption:&lt;/strong&gt; Small businesses and market vendors can accept cryptocurrency payments through Kora-powered point-of-sale systems, with transaction fees handled transparently in the background using the same currency they're receiving as payment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building the Future
&lt;/h2&gt;

&lt;p&gt;Whether you're developing stablecoin-first applications for emerging markets, building gaming experiences that need frictionless microtransactions, or creating any dApp where user experience supersedes technical complexity, Kora provides the infrastructure to make "gasless" transactions a reality.&lt;/p&gt;

&lt;p&gt;The future of blockchain adoption lies not in asking users to understand our technical constraints, but in building infrastructure that adapts to their needs. With Kora, that future begins now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ready to Start Building?
&lt;/h2&gt;

&lt;p&gt;Explore the GitHub repository: &lt;a href="https://github.com/solana-foundation/kora" rel="noopener noreferrer"&gt;github.com/solana-foundation/kora&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cryptocurrency</category>
      <category>ux</category>
      <category>web3</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Friction to Flow</title>
      <dc:creator>Mitch</dc:creator>
      <pubDate>Tue, 09 Sep 2025 13:59:00 +0000</pubDate>
      <link>https://dev.to/stelmitchay/friction-to-flow-141l</link>
      <guid>https://dev.to/stelmitchay/friction-to-flow-141l</guid>
      <description>&lt;p&gt;If you've spent any time building on Solana, you know the rhythm of the local development loop. It often involves a lot of friction: waiting for &lt;code&gt;solana-test-validator&lt;/code&gt; to spin up, writing one-off scripts to deploy and initialise programs, and struggling to recreate the complex state of main-net accounts you need to interact with. The feedback loop can feel slow, and the setup overhead for each new feature can be a real drag on momentum.&lt;/p&gt;

&lt;p&gt;I'd gotten used to this friction, accepting it as the cost of building on a high-performance chain. Then I came across Surfpool, and my perspective shifted. It wasn't just another local validator; it was a suite of integrated tools that attacked these friction points in surprisingly powerful ways. After a few weeks of use, my entire workflow feels different—faster, smoother, and more intuitive. This article is my way of sharing the six most impactful features that have fundamentally changed how I develop on Solana.&lt;/p&gt;

&lt;p&gt;The Listicle: 6 Game-Changing Features&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You Can Test Against Mainnet State Without Leaving Your Laptop&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Surfpool's local simulator, called a surfnet, has a killer feature: live mainnet forking. When you run a local surfnet, any transaction or query that references an account not found in your local state is automatically fetched from the public mainnet on the fly. This means you can interact with any mainnet program—be it a major DeFi protocol or a simple SPL token mint—without having to manually script its deployment or download its state beforehand.&lt;/p&gt;

&lt;p&gt;This is a complete game-changer for integration testing, especially for programs that make CPIs to other mainnet protocols. The old way meant dealing with a local validator that was completely ignorant of mainnet state—a query against a mainnet account would simply fail. Your only recourse was to write tedious scripts to create mock accounts. With Surfpool, that entire category of friction is gone. The external accounts you need are just there, with their correct state, exactly when you need them.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You Can Time Travel and Get an X-Ray of Your Transactions&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Every running surfnet comes with Surfpool Studio, a local web UI that acts as a mission control for your development environment. Two features here stand out. The first is "time travel," which lets you instantly jump the network's clock forward by a specific number of days, slots, or even to the next epoch with a single click. The second is a powerful transaction inspector. It doesn't just show you the transaction logs; it gives you a per-instruction breakdown of compute unit usage and provides detailed before-and-after state diffs for every affected account. If you've deployed your program with Surfpool, it even uses your program's IDL to parse and show diffs for your custom account data.&lt;/p&gt;

&lt;p&gt;The ability to manipulate time is invaluable for testing any on-chain logic that's dependent on slots or epochs, eliminating long waits from your feedback loop. The granular detail from the transaction inspector provides an unparalleled level of insight. Debugging becomes incredibly efficient when you can see exactly which instruction is consuming the most CUs or watch the supply field of an SPL Token account change in a perfectly parsed state diff.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You Get a Free GraphQL API the Moment You Deploy&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When you deploy a program using surfpool start, Surfpool can automatically create a subgraph for you. This is essentially a ready-to-use GraphQL database that listens to your surfnet, indexes the events your program emits, and makes them available through a queryable API. The schema is automatically generated from your program's event struct, giving you an indexed backend that is available "right out of the box."&lt;/p&gt;

&lt;p&gt;...we've got a GraphQL database just ready to go and query of every time our program is invoked, and Surf Pool is just giving us that right out of the box. Right when you deploy your program, you've got that ready to go.&lt;/p&gt;

&lt;p&gt;This feature is a massive accelerator for full-stack development. It completely removes the need to set up, configure, and manage a separate indexer and database to power your dApp's frontend. You can move directly from writing your on-chain logic to building your UI, knowing the data layer is already handled.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You Can Give Yourself Any Mainnet Token on Demand&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Surfpool includes "Cheatcode RPC methods" that allow you to directly modify the state of your local surfnet. This power is exposed through an easy-to-use web faucet. With a few clicks, you can instantly fund any of your local wallets with SOL or even any mainnet SPL token, like USDC. There's no need to write custom airdrop scripts or deploy mock token mints; you just tell the faucet what you want, and it appears in your wallet.&lt;/p&gt;

&lt;p&gt;This simple utility removes a significant amount of tedious setup work. Testing applications that interact with various tokens, especially in DeFi, often requires a complex matrix of wallets holding different assets. Surfpool's faucet turns this multi-step scripting process into a few seconds of clicking in a web UI.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Your Local Deployment Script is Your Mainnet Deployment Script&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Surfpool is built around an Infrastructure as Code (IaC) system that uses declarative files called "Runbooks." When you first run surfpool start in your program's directory, it automatically generates these runbooks for you. The most powerful part of this system is that the exact same runbook file used to deploy to your local surfnet can be used to deploy to devnet and mainnet. The only thing you need to change is the target environment in your txtx.yml manifest file, which allows you to swap out environment-specific configurations, such as replacing a local secret key signer with a production-grade multisig signer like Squads.&lt;/p&gt;

&lt;p&gt;This creates a level of deployment consistency and reliability that's often missing in Web3 workflows. By using the same declarative script across all environments, you eliminate the entire class of "it worked on my machine" bugs. You can develop and test with high confidence, knowing that your main-net deployment will follow the exact same, battle-tested steps as your local one.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You Can Literally Talk to Your Local Blockchain&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Surfpool MCP (Meta-Command Palette) feature allows you to integrate your development environment with AI chat assistants like GitHub Copilot or Cursor. Once configured, you can open your AI chat and give it natural language commands. For example, you can type "start a surfnet and fund an account with 100 SOL" and watch as Surfpool executes the commands. You can also ask it questions about your network's state, like "what is the token account balance for USDC?", and the AI will use the appropriate RPC calls on your surfnet to find and return the answer.&lt;/p&gt;

&lt;p&gt;This feature radically lowers the barrier to entry for common development tasks. Instead of hunting for specific CLI flags or memorising RPC method names, you can simply state your intent. It streamlines the setup and query process, keeping you focused on the code you're actually trying to write.&lt;/p&gt;

&lt;p&gt;Conclusion: A New Baseline for Solana DX&lt;/p&gt;

&lt;p&gt;After using these features, it's clear that Surfpool isn't just a local validator replacement; it's an integrated development environment designed to accelerate the entire build-test-deploy lifecycle. By systematically identifying and removing sources of friction—from mainnet simulation and state inspection to deployment automation and data indexing—it establishes a new baseline for what a great developer experience on Solana can be. It lets you spend less time on tedious overhead and more time building.&lt;/p&gt;

&lt;p&gt;With tools this powerful abstracting away development overhead, what new kinds of complex applications will we be empowered to build?&lt;/p&gt;

</description>
    </item>
    <item>
      <title>The $3 That Broke Crypto UX (And How Kora Fixed It)</title>
      <dc:creator>Mitch</dc:creator>
      <pubDate>Mon, 01 Sep 2025 16:11:54 +0000</pubDate>
      <link>https://dev.to/stelmitchay/the-3-that-broke-crypto-ux-and-how-kora-fixed-it-1422</link>
      <guid>https://dev.to/stelmitchay/the-3-that-broke-crypto-ux-and-how-kora-fixed-it-1422</guid>
      <description>&lt;p&gt;Two years ago, I walked into my first crypto event with zero knowledge on crypto. When the presenter asked a question, I raised my hand. Boom $3 straight to my wallet for a correct answer. I was genuinely excited. Real digital money I could actually spend, right? Wrong. What followed was a painful lesson in crypto's biggest UX flaw: I needed to buy a completely different token just to move the money I'd earned. Standing there confused, holding dollars I couldn't spend without SOL I didn't have, I thought exactly what millions of first-time users think: this whole thing is a scam.&lt;/p&gt;

&lt;p&gt;That frustration stuck with me. Not because I'm bitter about three dollars, but because I realised this broken experience is repeated thousands of times daily across the ecosystem. Kora is built to remove that friction. The issue is every time you want to do anything on Solana send tokens, trade, interact with apps you need SOL to pay for it. This creates a &lt;code&gt;chicken-and-egg problem&lt;/code&gt;: you've earned some USDC or BONK tokens, but you can't use them without first getting SOL.&lt;/p&gt;

&lt;p&gt;Why does this happen?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Network Protection: Small fees prevent spam and keep the network running smoothly
&lt;/li&gt;
&lt;li&gt;Paying Validators: The computers that process transactions need compensation&lt;/li&gt;
&lt;li&gt;System Stability: SOL has a stable value that everyone agrees on&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While these reasons make technical sense, they create a terrible experience for new users.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kora's Solution: Pay Fees with Any Token
&lt;/h3&gt;

&lt;p&gt;Kora solves this by acting as a middleman. Instead of forcing you to get SOL first, Kora pays the SOL fees for you, and you pay Kora back using whatever tokens you already have - USDC, BONK, or any other token.&lt;/p&gt;

&lt;h3&gt;
  
  
  How It Works: Before and After
&lt;/h3&gt;

&lt;p&gt;Let's see the difference between traditional transactions on Solana vs Kora transactions:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;colgroup&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;/colgroup&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;th colspan="1" rowspan="1"&gt;&lt;p&gt;Step&lt;/p&gt;&lt;/th&gt;
&lt;th colspan="1" rowspan="1"&gt;&lt;p&gt;Traditional Way (With SOL)&lt;/p&gt;&lt;/th&gt;
&lt;th colspan="1" rowspan="1"&gt;&lt;p&gt;Kora Way (Gasless)&lt;/p&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;1&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;User must first buy SOL&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;User starts with any token (BONK, USDC, etc.)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;2&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;User creates transaction&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;App creates transaction + fee payment to Kora&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;3&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;User pays SOL fees directly&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;User signs transaction (no SOL needed)&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;4&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Transaction goes to Solana network&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Kora validates and co-signs with SOL&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;5&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Network processes transaction&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Network processes: user's action + Kora gets tokens&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;Result&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;User needed SOL upfront&lt;/p&gt;&lt;/td&gt;
&lt;td colspan="1" rowspan="1"&gt;&lt;p&gt;User paid fees in tokens they already had&lt;/p&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The key insight: both transactions cost the same SOL fees, but with Kora, the user never has to handle SOL directly. Kora makes this powerful through four main parts&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rust Core Library: This component functions as the core transaction verification engine. It ensures transaction integrity, computes user-specific token costs based on their selected currency, and enforces protocol compliance.&lt;/li&gt;
&lt;li&gt;TypeScript SDK: This suite provides application developers with streamlined integration of gasless transactions. It abstracts the complexity of building custom infrastructure, allowing developers to leverage Kora's simplified tools.&lt;/li&gt;
&lt;li&gt;JSON-RPC Server: This module acts as an intermediary, facilitating communication between applications and the Kora network. It manages queries related to transaction cost estimation in specified tokens (e.g., USDC) and processes gasless transaction requests.&lt;/li&gt;
&lt;li&gt;CLI Tool: Designed for Kora operators, this interface enables service management, including policy configuration, performance monitoring, and operational oversight.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use Cases
&lt;/h3&gt;

&lt;p&gt;Kora isn't just about solving the gas problem it opens up entirely new possibilities for how people can interact with blockchain applications:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mobile Money Integration&lt;/strong&gt;: In countries like Sierra Leone, Nigeria, and Ghana where mobile money dominates, users can seamlessly bridge from their familiar mobile money solutions or similar systems to Solana dApps using stablecoin equivalents.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remittances&lt;/strong&gt;: Family members sending money across borders can use stablecoin applications where recipients immediately transact without needing to acquire SOL - crucial in regions with limited crypto exchange access.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Merchant Payments&lt;/strong&gt;: Small businesses can accept cryptocurrency payments through point-of-sale systems where transaction fees are handled transparently in the background.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Creator Economy&lt;/strong&gt;: Content creators earning tokens from tips, subscriptions, or sales can immediately reinvest in their creative tools, collaborate with others, or support fellow creators.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Yield Farming&lt;/strong&gt;: Users earning rewards from liquidity pools can immediately compound their earnings or move funds between protocols without keeping a SOL buffer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Automated Strategies&lt;/strong&gt;: DeFi applications can offer truly automated yield strategies where users never need to worry about maintaining SOL balances for transaction fees.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-Protocol Trading&lt;/strong&gt;: Traders can seamlessly move between different DeFi protocols using their trading profits to pay fees, enabling more sophisticated strategies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Micro-lending&lt;/strong&gt;: Users can participate in decentralized lending protocols using their earned tokens directly, without the barrier of SOL acquisition preventing participation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DAO Participation&lt;/strong&gt;: Community members can vote, propose, and participate in governance using tokens they earned through contribution, without SOL blocking their engagement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Social Tokens&lt;/strong&gt;: Creators and communities can build token-based social platforms where followers can tip, purchase access, or buy exclusive content using social tokens directly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crowdfunding&lt;/strong&gt;: Project supporters can immediately use funds raised in one campaign to support other projects they believe in, creating vibrant funding ecosystems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Supply Chain Management&lt;/strong&gt;: Companies can track products and payments across supply chains using earned tokens for transaction fees, simplifying multi-party business processes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payroll Systems&lt;/strong&gt;: Organizations paying employees in tokens can enable those employees to immediately use their earnings for expenses, investments, or other transactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Loyalty Programs&lt;/strong&gt;: Businesses can create sophisticated loyalty systems where customers earn tokens and immediately redeem them across partner merchants without friction.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Integrating Kora
&lt;/h3&gt;

&lt;p&gt;To add gasless transactions to your applications, you can integrate with Kora in three main ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Using Existing Kora Services: Many developers simply connect to existing Kora nodes operated by service providers. This is like using a payment processor - you integrate once and get immediate gasless functionality.&lt;/li&gt;
&lt;li&gt;Running your Own Node: Some applications prefer complete control and run their own Kora infrastructure. This gives them full control over policies, costs, and user experience.&lt;/li&gt;
&lt;li&gt;Hybrid Approach: Larger applications might run their own nodes for core functionality while using third-party services for overflow or specific use cases.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  What is a Kora Node?
&lt;/h4&gt;

&lt;p&gt;A Kora node is essentially a specialized server that acts as a bridge between users and the Solana network. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;It holds SOL to pay network fees&lt;/li&gt;
&lt;li&gt;It accepts other tokens as payment from users&lt;/li&gt;
&lt;li&gt;It validates transactions to ensure they're safe and legitimate&lt;/li&gt;
&lt;li&gt;It co-signs transactions to authorize the SOL payment&lt;/li&gt;
&lt;li&gt;It enforces policies to protect itself and its users&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The node operates 24/7, automatically processing gasless transaction requests according to its configured rules.&lt;/p&gt;

&lt;h5&gt;
  
  
  Who Are Node Operators?
&lt;/h5&gt;

&lt;p&gt;Node operators are the people or organizations that run and maintain Kora nodes. Running a Kora node involves several important considerations that affect both profitability and security:&lt;/p&gt;

&lt;h6&gt;
  
  
  Economic Considerations
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Fee Structure: Operators must decide how to price their services - charging a margin on top of network fees, setting fixed prices, or even offering free transactions to attract users.&lt;/li&gt;
&lt;li&gt;Token Risk: Since operators accept various tokens as payment, they're exposed to price volatility. A token's value might drop between when they receive it and when they convert it to SOL.&lt;/li&gt;
&lt;li&gt;Capital Requirements: Operators need sufficient SOL reserves to handle transaction volume during busy periods, plus backup funds for unexpected spikes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h6&gt;
  
  
  Security Imperatives
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Access Control: Operators must carefully control who can use their service. Kora provides API key and HMAC authentication methods that can be used separately or together for maximum protection.&lt;/li&gt;
&lt;li&gt;Transaction Validation: Operators can set strict rules about which transactions they'll process - limiting SOL amounts, restricting allowed programs, whitelisting specific tokens, and blacklisting suspicious accounts.&lt;/li&gt;
&lt;li&gt;Key Management: The private keys controlling SOL funds need enterprise-grade protection. Kora integrates with professional services like Turnkey (hardware security modules) and Privy (institutional wallet infrastructure) for serious operations.&lt;/li&gt;
&lt;/ul&gt;

&lt;h6&gt;
  
  
  Operational Considerations
&lt;/h6&gt;

&lt;ul&gt;
&lt;li&gt;Monitoring and Alerting: Operators need systems to track SOL balances, unusual transaction patterns, authentication failures, and performance metrics to ensure smooth operation.&lt;/li&gt;
&lt;li&gt;Compliance and Policies: Depending on their jurisdiction and customer base, operators may need to implement compliance measures, transaction limits, and user verification processes.&lt;/li&gt;
&lt;li&gt;Scalability Planning: As usage grows, operators need to plan for increased transaction volume, higher SOL requirements, and potentially distributed infrastructure.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Running Kora Locally
&lt;/h3&gt;

&lt;p&gt;Ready to try gasless transactions? Setting up a development environment is straightforward:&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Solana CLI v2.2.x or newer&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rust programming environment&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Node.js v24 or later&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Quick Setup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Install Kora RPC server
cargo install kora-rpc

# Clone demo project
git clone https://github.com/solana-foundation/kora.git
cd kora/demo

# Install dependencies and initialize
cd client &amp;amp;&amp;amp; npm install &amp;amp;&amp;amp; cd ..
npm tsx client/src/setup.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The setup script generates keypairs, creates test tokens, and displays configuration details. Update &lt;code&gt;server/kora.toml&lt;/code&gt; with your test token mint address, then start the services:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Terminal 1: Start validator
solana-test-validator -r

# Terminal 2: Start Kora RPC
kora-rpc

# Terminal 3: Run demo
npm start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Building the Future
&lt;/h2&gt;

&lt;p&gt;Kora represents more than technical advancement - it's infrastructure for true financial inclusion. By removing the complexity of native token requirements, Kora provides the foundation for accessible user experiences that rival traditional applications.&lt;/p&gt;

&lt;p&gt;The future of blockchain adoption lies not in asking users to understand our technical constraints, but in building infrastructure that adapts to their needs. Whether you're developing stablecoin-first applications for emerging markets, building gaming experiences with frictionless microtransactions, or creating any dApp where user experience supersedes technical complexity, Kora makes it possible.&lt;/p&gt;

&lt;p&gt;With Kora, that future begins now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ready to start building?&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Explore Kora now: &lt;a href="https://github.com/solana-foundation/kora" rel="noopener noreferrer"&gt;github.com/solana-foundation/kora&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Solana's Bridge Between Web2 and Web3</title>
      <dc:creator>Mitch</dc:creator>
      <pubDate>Tue, 06 May 2025 18:26:12 +0000</pubDate>
      <link>https://dev.to/stelmitchay/solanas-bridge-between-web2-and-web3-4n61</link>
      <guid>https://dev.to/stelmitchay/solanas-bridge-between-web2-and-web3-4n61</guid>
      <description>&lt;p&gt;The latest Agave release Agave 2.2 introduces support for &lt;code&gt;secp256r1&lt;/code&gt; signatures. While this might sound like technical jargon, this addition has significant implications for Solana's ecosystem, from everyday users to developers and enterprises. In this article, we'll explore what &lt;code&gt;secp256r1&lt;/code&gt; signatures are, why they matter for Solana, and how they are positioned to shape the future of blockchain interactions.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the Big Deal About &lt;code&gt;Secp256r1&lt;/code&gt; Signatures?
&lt;/h3&gt;

&lt;p&gt;At its core, the addition of native &lt;code&gt;secp256r1&lt;/code&gt; signature verification to Solana is about making blockchain technology more accessible, secure, and compatible with existing web standards. As described in this TLDR Agave 2.2 article by &lt;a href="https://www.helius.dev/blog/agave-v22-update--all-you-need-to-know#native-secp256r1-signature-verification" rel="noopener noreferrer"&gt;Helius&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Solana is adding native support for &lt;code&gt;secp256r1&lt;/code&gt; elliptic curve signature verification, a critical upgrade that enables on-chain compatibility with Passkeys, the WebAuthn standard, and advanced account abstraction models, including two-factor authentication (2FA). This update introduces passwordless authentication, already ubiquitous in Web2, into the Web3 domain, enhancing security and usability for on-chain applications."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But what does all this actually mean? Let's break it down.&lt;/p&gt;

&lt;h3&gt;
  
  
  Digital Signatures 101: The Basics
&lt;/h3&gt;

&lt;p&gt;Think of a digital signature as the blockchain equivalent of your handwritten signature but significantly more secure and mathematically verifiable. When you make a transaction on Solana (or any blockchain), you need to prove it's really you initiating that action.&lt;/p&gt;

&lt;p&gt;Digital signatures work through a pair of cryptographic keys:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;private key&lt;/strong&gt; that only you have (like your unique signature)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;public key&lt;/strong&gt; that everyone can see (like your ID card)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you sign a transaction, your private key creates a unique signature that can be verified using your public key. This verification happens through complex mathematical operations on what's called an "elliptic curve."&lt;/p&gt;

&lt;h3&gt;
  
  
  What Makes &lt;code&gt;Secp256r1&lt;/code&gt; Special?
&lt;/h3&gt;

&lt;p&gt;Solana has primarily used the &lt;code&gt;Ed25519&lt;/code&gt; signature scheme for its core cryptographic operations, while Solana also supports &lt;code&gt;secp256k1&lt;/code&gt;-mainly to enable interoperability and bridging with Bitcoin and Ethereum, which both use the &lt;code&gt;secp256k1&lt;/code&gt; curve; &lt;code&gt;Ed25519&lt;/code&gt; remains the default for signing standard transactions on the Solana network. With the Agave 2.2 update, Solana is adding native support for &lt;code&gt;secp256r1&lt;/code&gt; (also known as NIST &lt;code&gt;P-256&lt;/code&gt; or &lt;code&gt;prime256v1&lt;/code&gt;). &lt;/p&gt;

&lt;p&gt;But what’s the difference, and why is this important?&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Secp256r1&lt;/code&gt; is widely adopted outside the blockchain world. It’s the standard elliptic curve used in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web browsers&lt;/strong&gt; for secure connections&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware security keys&lt;/strong&gt; like YubiKeys&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The WebAuthn standard&lt;/strong&gt; for passwordless authentication&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Traditional banking and financial systems&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By supporting &lt;code&gt;secp256r1&lt;/code&gt;, Solana can now interact seamlessly with these systems. This shift is particularly relevant for cross-chain interactions, regulatory compliance, and a big step toward bridging the gap between traditional web applications (Web2) and decentralised blockchain applications (Web3).&lt;/p&gt;

&lt;h3&gt;
  
  
  📊  &lt;strong&gt;secp256r1 vs ed25519 vs secp256k1&lt;/strong&gt;
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Curve&lt;/th&gt;
&lt;th&gt;Used In&lt;/th&gt;
&lt;th&gt;Security Level&lt;/th&gt;
&lt;th&gt;Standardization&lt;/th&gt;
&lt;th&gt;Typical Use Cases&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;secp256r1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;WebAuthn, Passkeys, HSMs, Solana&lt;/td&gt;
&lt;td&gt;128-bit&lt;/td&gt;
&lt;td&gt;NIST, FIDO&lt;/td&gt;
&lt;td&gt;Web2 auth, hardware keys, enterprise&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ed25519&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Solana native, modern blockchains&lt;/td&gt;
&lt;td&gt;128-bit&lt;/td&gt;
&lt;td&gt;IETF&lt;/td&gt;
&lt;td&gt;Solana, Signal, SSH&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;secp256k1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Bitcoin, Ethereum, EVM chains&lt;/td&gt;
&lt;td&gt;128-bit&lt;/td&gt;
&lt;td&gt;SECG&lt;/td&gt;
&lt;td&gt;Crypto wallets, blockchains&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  What this could potentionally mean for YOU
&lt;/h4&gt;

&lt;p&gt;The introduction of &lt;code&gt;secp256r1&lt;/code&gt; signatures could bring several immediate benefits including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Passwordless Authentication&lt;/strong&gt; : Remember how you can now log into many websites just by using your fingerprint or face ID instead of typing a password? That's WebAuthn in action. With &lt;code&gt;secp256r1&lt;/code&gt; support, Solana applications can now implement the same smooth experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better Hardware Compatibility&lt;/strong&gt;: Many devices we use daily have special security hardware that already supports &lt;code&gt;Secp256r1&lt;/code&gt;, by supporting &lt;code&gt;Secp256r1&lt;/code&gt;, Solana can more directly integrate with these security features, potentially
making wallet apps more secure and user-friendly./

&lt;ul&gt;
&lt;li&gt;Secure Enclaves: The security chips in iPhones, Macs, and many Android devices&lt;/li&gt;
&lt;li&gt;Hardware Security Modules (HSMs): Specialised security devices used by businesses&lt;/li&gt;
&lt;li&gt;TPMs (Trusted Platform Modules): Security chips built into modern computers&lt;/li&gt;
&lt;li&gt;Smart Cards: Including many hardware wallets and secure ID cards&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Two-Factor Authentication (2FA)&lt;/strong&gt; : The update enables more sophisticated account security models, including familiar two-factor authentication systems similar to those used by banks and email providers.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Advanced Account Abstraction&lt;/strong&gt; : This technical term simply means more flexibility in how accounts work. Instead of being limited to a single private key, accounts can now implement more complex authorisation schemes, including multi-signature requirements and time-locked transactions.&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Institutional and Enterprise Adoption&lt;/strong&gt; : Many large organisations and government entities require systems to use NIST-approved cryptography like &lt;code&gt;secp256r1&lt;/code&gt;:

&lt;ul&gt;
&lt;li&gt;Banks and financial institutions often have compliance requirements specifying NIST curves&lt;/li&gt;
&lt;li&gt;Government agencies typically mandate NIST-approved cryptography&lt;/li&gt;
&lt;li&gt;Enterprise security infrastructure is frequently built around these standards.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;strong&gt;Bridging Web2 and Web3&lt;/strong&gt; : Most internet security (the "Web2" world) uses &lt;code&gt;secp256r1&lt;/code&gt;:

&lt;ul&gt;
&lt;li&gt;SSL/TLS certificates that secure websites&lt;/li&gt;
&lt;li&gt;Many authentication systems and security protocols&lt;/li&gt;
&lt;li&gt;Public Key Infrastructure (PKI) that secures much of the internet&lt;/li&gt;
&lt;li&gt;Supporting the same cryptographic standards makes it easier to build applications that bridge traditional web systems and Solana's blockchain&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Technical Corner: For Those Who Want More Detail
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Mathematical Foundations of &lt;code&gt;secp256r1&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;At its core, &lt;code&gt;secp256r1&lt;/code&gt; is defined by a specific set of domain parameters over a prime finite field. The curve equation is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$$
y^2 = x^3 + ax + b
$$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where $a$ and $b$ are constants that define the curve's shape, and all operations are performed modulo a large prime $p$. For &lt;code&gt;secp256r1&lt;/code&gt;, the parameters are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$p = 2^{256} - 2^{224} + 2^{192} + 2^{96} - 1$
$a = p - 3$
$b = 0x5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B$
$G$ (generator point): a predefined point on the curve with known coordinates
$n$: the order of the subgroup generated by $G$
$h$: the cofactor, which is 1 for secp256r1

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;secp256r1&lt;/code&gt; curve is classified as a "random" curve, meaning its parameters were generated through a process intended to avoid any hidden weaknesses or backdoors. This distinguishes it from "Koblitz" curves, such as &lt;code&gt;secp256k1&lt;/code&gt;, whose parameters are derived mathematically rather than randomly. Both curves are considered secure against known attacks, with their primary vulnerability being advances in quantum computing, which threaten all currently deployed public-key cryptosystems.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Secp256r1&lt;/code&gt; and &lt;code&gt;secp256k1&lt;/code&gt; offer comparable security levels for equivalent key sizes. However, &lt;code&gt;secp256r1&lt;/code&gt; enjoys broader institutional support and is mandated by many regulatory frameworks, while &lt;code&gt;secp256k1&lt;/code&gt; is favored in cryptocurrency applications for its computational simplicity and historical association with Bitcoin and Ethereum.&lt;/p&gt;

&lt;h4&gt;
  
  
  Key Generation
&lt;/h4&gt;

&lt;p&gt;The Elliptic Curve Digital Signature Algorithm (ECDSA) is the most common signature scheme used with &lt;code&gt;secp256r1&lt;/code&gt;. &lt;br&gt;
The key generation process involves selecting a random private key &lt;code&gt;$d$&lt;/code&gt; and computing the corresponding public key &lt;code&gt;$Q = dG$&lt;/code&gt;, where $G$ is the curve's generator point.&lt;/p&gt;
&lt;h4&gt;
  
  
  Signing Process
&lt;/h4&gt;

&lt;p&gt;To sign a message, the signer hashes the message using a cryptographic hash function (commonly SHA-256), selects a random nonce $k$, and computes a signature pair $(r, s)$ based on the curve parameters, the private key, and the message hash. The security of the signature relies on the unpredictability of $k$ and the difficulty of the ECDLP.&lt;/p&gt;
&lt;h4&gt;
  
  
  Verification Process
&lt;/h4&gt;

&lt;p&gt;The verifier, using the signer's public key and the signature pair, performs a series of elliptic curve operations to confirm that the signature is valid for the given message. If the computations yield the expected result, the signature is accepted; otherwise, it is rejected.&lt;/p&gt;
&lt;h3&gt;
  
  
  Implementation Timeline and Current Status
&lt;/h3&gt;

&lt;p&gt;The secp256r1 signature verification feature was originally slated for the Agave 2.1 release but was deferred to Agave 2.2. The feature is now live and available for developers to integrate into their applications.&lt;/p&gt;

&lt;p&gt;According to crates.io, the solana-secp256r1-program has seen multiple stable releases in 2025, with the most recent versions being:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2.2.2 (March 26, 2025)&lt;/li&gt;
&lt;li&gt;2.2.1 (February 12, 2025)&lt;/li&gt;
&lt;li&gt;2.1.21 (April 18, 2025)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The implementation is Apache-2.0 licensed, relatively lightweight (33KB, 583 lines of code), and has been downloaded approximately 169,966 times per month, indicating strong developer interest and adoption.&lt;/p&gt;
&lt;h3&gt;
  
  
  Practical Applications: What Can Be Built With This?
&lt;/h3&gt;

&lt;p&gt;With &lt;code&gt;secp256r1&lt;/code&gt; signature verification now available in Solana, several exciting use cases become possible:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Cross-Chain Transactions&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;One of the most compelling use cases for &lt;code&gt;secp256r1&lt;/code&gt; in Solana is enabling secure cross-chain transactions. Many external systems, including enterprise blockchains and traditional financial networks, rely on &lt;code&gt;secp256r1&lt;/code&gt;for digital signatures. By supporting this curve, Solana can facilitate seamless asset transfers and data exchange across disparate platforms.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Regulatory Compliance&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Financial institutions and regulated entities often require cryptographic primitives that conform to NIST standards.  &lt;code&gt;secp256r1&lt;/code&gt;'s status as a NIST-approved curve makes it an attractive option for organizations seeking to build compliant applications on Solana.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Hardware Security Modules (HSMs) and Secure Enclaves&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Many hardware security modules and secure enclave technologies support &lt;code&gt;secp256r1&lt;/code&gt; natively. This enables secure key storage and signing operations, enhancing the overall security posture of Solana-based applications.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;
  
  
  &lt;strong&gt;Decentralized Identity and Authentication&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;Secp256r1&lt;/code&gt; is widely used in decentralized identity (DID) frameworks and authentication protocols. Its integration with Solana enables robust, standards-compliant identity solutions that can interoperate with external systems.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  For Developers: Getting Started
&lt;/h2&gt;

&lt;p&gt;If you're a developer interested in implementing &lt;code&gt;secp256r1&lt;/code&gt; signatures in your Solana applications, you can start by exploring the &lt;code&gt;solana-secp256r1-program crate&lt;/code&gt;, which provides the necessary functionality for signature verification.&lt;/p&gt;

&lt;p&gt;The library is available through standard Rust package managers and is designed to be straightforward to integrate with existing Solana programs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;agave&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;precompiles&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;secp256r1&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;verify_secp256r1_signature&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;message&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;b"hello solana"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="cm"&gt;/* 64-byte DER-encoded signature */&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;public_key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="cm"&gt;/* 33-byte compressed or 65-byte uncompressed public key */&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;is_valid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;verify_secp256r1_signature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;message&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;public_key&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;is_valid&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Proceed with authenticated action&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Reject or error&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;The integration of &lt;code&gt;secp256r1&lt;/code&gt;  into Solana represents an important step in blockchain evolution-making advanced cryptographic security more accessible through familiar interfaces.&lt;/p&gt;

&lt;p&gt;By embracing standards that bridge the traditional web with blockchain technology, Solana is reducing the barriers to entry for new users while providing enhanced security and flexibility for everyone. Whether you're a developer building the next generation of decentralized applications or simply someone who wants a more secure and convenient way to interact with blockchain systems, this update offers something valuable.&lt;/p&gt;

&lt;p&gt;The true impact of this change will be measured not in technical specifications but in user experience. As more applications adopt these new capabilities, we may finally see blockchain technology fulfill its promise of being not just secure and decentralized, but also intuitive and accessible to everyone.&lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://www.helius.dev/blog/agave-v21-update-all-you-need-to-know#native-program-for-verifying-secp256r1-signatures" rel="noopener noreferrer"&gt;Helius: Agave v2.1 Update&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/solana-labs/solana-program-library/tree/master/secp256r1" rel="noopener noreferrer"&gt;Solana secp256r1 GitHub Implementation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/solana-foundation/solana-improvement-documents/pull/75" rel="noopener noreferrer"&gt;SIMD for secp256r1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.solana.com/developing/runtime-facilities/programs#secp256r1-signature-verification" rel="noopener noreferrer"&gt;Solana Docs: secp256r1 Signature Verification&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>solana</category>
      <category>secp256r1</category>
    </item>
    <item>
      <title>Exploring Anchor v0.31.0: Key Features and Enhancements</title>
      <dc:creator>Mitch</dc:creator>
      <pubDate>Tue, 18 Mar 2025 10:04:18 +0000</pubDate>
      <link>https://dev.to/stelmitchay/exploring-anchor-v0310-key-features-and-enhancements-lno</link>
      <guid>https://dev.to/stelmitchay/exploring-anchor-v0310-key-features-and-enhancements-lno</guid>
      <description>&lt;h3&gt;
  
  
  INTRODUCTION
&lt;/h3&gt;

&lt;p&gt;Anchor has long been a cornerstone in Solana development, for writing, testing, deploying, and interacting with Solana programs.The release of version 0.31.0 marks a significant milestone(this is the last major update before v1 is actually released) 0.31.0 introduces more enhancements to development workflows, compatibility improvements, and updates to its core features. &lt;/p&gt;

&lt;p&gt;This article explores the technical advancements in Anchor v0.31.0, including new features like dynamic discriminator support and improved IDL generation workflows, alongside bug fixes that streamline program interaction. Let’s dive into everything you need to know about this update with detailed explanations and code examples.&lt;/p&gt;

&lt;h4&gt;
  
  
  Custom Discriminators
&lt;/h4&gt;

&lt;p&gt;Anchor automatically generated an 8-byte discriminator for each account, limiting flexibility when integrating with other programs. With this update, you can now define your own discriminator values, including using zero-length discriminators where needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is this useful?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Allows better interoperability with non-Anchor programs.&lt;/li&gt;
&lt;li&gt;Provides more control over account structure.&lt;/li&gt;
&lt;li&gt;Reduces overhead when specific discriminators are unnecessary.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example on setting a custom discriminator&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[account(discriminator&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;MyAccount&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;//define account fields&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures that &lt;code&gt;MyAccount&lt;/code&gt; is identified using the discriminator &lt;code&gt;1&lt;/code&gt;, rather than the default auto-generated one.  &lt;/p&gt;

&lt;h4&gt;
  
  
  LazyAccount: Optimized Deserialization
&lt;/h4&gt;

&lt;p&gt;This experimental feature introduces a new account wrapper that defers deserialization until the account data is accessed. It improves performance with large accounts and optimizes execution time in complex transactions.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why is this useful?&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Improves performance when working with large accounts.
&lt;/li&gt;
&lt;li&gt;Reduces unnecessary deserialization overhead.
&lt;/li&gt;
&lt;li&gt;Optimizes execution time in complex transactions.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[derive(Accounts)]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;MyInstruction&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;#[account(lazy)]&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;my_account&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;LazyAccount&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MyAccount&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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;With this implementation, &lt;code&gt;my_account&lt;/code&gt; will only be deserialized if its data is accessed, saving computational resources.  &lt;/p&gt;

&lt;p&gt;To enable this feature, you need to activate it in &lt;code&gt;Cargo.toml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="py"&gt;anchor-lang&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;version&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.31.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="py"&gt;features&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"lazy-account"&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;h4&gt;
  
  
  Conditional Compilation for Instructions
&lt;/h4&gt;

&lt;p&gt;Anchor now supports Rust’s cfg attributes for conditionally compiling instruction functions. This allows feature-gated logic within programs.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[cfg(feature&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"experimental"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;my_instruction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;MyInstruction&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Implementation only available when "experimental" feature is enabled&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&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;h4&gt;
  
  
  Improved Account Resolution Errors
&lt;/h4&gt;

&lt;p&gt;Previously, Anchor returned vague error messages when accounts were missing during validation. Now, it provides more detailed error messages,   &lt;/p&gt;

&lt;p&gt;before&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Account validation failed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;now&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Missing: token_account &lt;span class="o"&gt;(&lt;/span&gt;AssociatedToken&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Mock RPC for More Reliable Testing
&lt;/h4&gt;

&lt;p&gt;Anchor’s RPC client previously depended on &lt;strong&gt;live network conditions&lt;/strong&gt;, causing inconsistent test results.You can now use &lt;code&gt;new_mock&lt;/code&gt; to &lt;strong&gt;simulate specific states in tests&lt;/strong&gt;. This help dependency on live Solana clusters and ensuring deterministic test outcomes.&lt;/p&gt;

&lt;p&gt;before&lt;br&gt;
&lt;/p&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;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;RpcClient&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cluster_url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Unpredictable network responses&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;after&lt;br&gt;
&lt;/p&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;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;RpcClient&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new_mock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"airdrop=100"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Controlled environment&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  New &lt;code&gt;Builder&lt;/code&gt; Struct for Programmatic IDL Creation
&lt;/h4&gt;

&lt;p&gt;You can now dynamically generate IDLs using the IdlBuilder struct instead of manually defining JSON files.&lt;/p&gt;

&lt;p&gt;before&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"my_program"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"instructions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"initialize"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"accounts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"param1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"param2"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;now&lt;br&gt;
&lt;/p&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;idl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;IdlBuilder&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="nf"&gt;.name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"MyProgram"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;.instruction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"initialize"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"param1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"param2"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="nf"&gt;.build&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In addition to introducing powerful new features, Anchor v0.31.0 also brings a host of improvements and optimizations aimed at enhancing developer workflows and ensuring compatibility with evolving Solana toolchains. Let’s explore these updates in detail.&lt;/p&gt;

&lt;h3&gt;
  
  
  Improvements in Anchor 0.31.0
&lt;/h3&gt;

&lt;h4&gt;
  
  
  🚀 Performance Enhancements
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Reduced Stack Memory Overhead:
Previously, initializing multiple accounts with init consumed significant stack space, potentially causing stack overflows in complex programs. This update moves init processing into a separate stack frame, reducing stack usage without requiring syntax changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  🛠️ Developer Workflow Enhancements
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Automatic Legacy IDL Conversion : Legacy IDLs (pre-Anchor v0.30) are now automatically converted to the new format during builds, eliminating the need for manual anchor idl convert commands. &lt;br&gt;
Note: The &lt;code&gt;anchor idl&lt;/code&gt; fetch command does not support auto-conversion..&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Shell Completions for Anchor CLI : Developers using the can now enable shell autocompletion for faster command execution.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  🧪 CLI &amp;amp; Testing Improvements
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Passing Cargo Args to IDL Build &lt;/p&gt;

&lt;p&gt;You can now pass Cargo feature flags when building the IDL.This ensures that the IDL is built with specific features enabled&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;anchor&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;features&lt;/span&gt; &lt;span class="n"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;feature&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;--no-idl Flag for Tests&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If program logic remains unchanged but tests need to run frequently, this flag skips rebuilding the IDL, saving time:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;anchor&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;no&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;idl&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Mollusk Test Template&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Initialize an Anchor workspace with pre-configured tests using this new template:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="n"&gt;anchor&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt; &lt;span class="n"&gt;my&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;program&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;template&lt;/span&gt; &lt;span class="n"&gt;mollusk&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;This template provides pre-configured tests, making it easier to start new projects with testing in mind.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Enhanced &lt;code&gt;anchor clean&lt;/code&gt; command&lt;/p&gt;

&lt;p&gt;Previously, anchor clean only removed build artifacts.&lt;br&gt;
&lt;code&gt;anchor clean&lt;/code&gt; it now also removes the .anchor directory, behaving like &lt;code&gt;cargo clean&lt;/code&gt; but keeping program keypairs intact.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Compatibility Updates
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;⚠️ Deprecation Warning (Solana v1.18.19)&lt;/p&gt;

&lt;p&gt;Solana binaries are being renamed to Agave, and &lt;code&gt;solana-install&lt;/code&gt; has been deprecated as of &lt;code&gt;Solana v1.18.19&lt;/code&gt; If you're using an older version of Anchor, this can cause parsing failures when running Solana-related commands.&lt;/p&gt;

&lt;p&gt;If you attempt to use solana-install, you will now see this warning:&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="n"&gt;solana&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;deprecated&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;discontinued&lt;/span&gt; &lt;span class="n"&gt;when&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;no&lt;/span&gt; &lt;span class="n"&gt;longer&lt;/span&gt; &lt;span class="n"&gt;supported&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; 
&lt;span class="n"&gt;Please&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;Agave&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="c1"&gt;//github.com/anza-xyz/agave/wiki/Agave-Transition&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;


&lt;p&gt;To avoid issues, &lt;code&gt;Anchor 0.31.0&lt;/code&gt;  automatically installs and switches to &lt;code&gt;agave-install&lt;/code&gt; when you specify solana_version greater than 1.18.19 in Anchor.toml.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  How to Ensure Agave is Used
&lt;/h4&gt;

&lt;p&gt;Modify your &lt;code&gt;Anchor.toml&lt;/code&gt; like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;toolchain]
solana_version &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"2.1.0"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alternatively, you can manually install Agave with:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&lt;br&gt;
sh -c "$(curl -sSfL https://release.anza.xyz/v2.1.0/install)"&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;‼️ Solana-Program Warning&lt;/p&gt;

&lt;p&gt;Adding solana-program as a dependency might cause conflicts between Solana v1 and v2 crates. If solana-program is present in your dependencies, you’ll now see this warning:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight javascript"&gt;&lt;code&gt;
&lt;span class="nx"&gt;WARNING&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Adding&lt;/span&gt; &lt;span class="s2"&gt;`solana-program`&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt; &lt;span class="nx"&gt;separate&lt;/span&gt; &lt;span class="nx"&gt;dependency&lt;/span&gt; &lt;span class="nx"&gt;might&lt;/span&gt; &lt;span class="nx"&gt;cause&lt;/span&gt; &lt;span class="nx"&gt;conflicts&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nx"&gt;To&lt;/span&gt; &lt;span class="nx"&gt;solve&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;remove&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="s2"&gt;`solana-program`&lt;/span&gt; &lt;span class="nx"&gt;dependency&lt;/span&gt; &lt;span class="nx"&gt;and&lt;/span&gt; &lt;span class="nx"&gt;use&lt;/span&gt; &lt;span class="nx"&gt;the&lt;/span&gt; &lt;span class="nx"&gt;exported&lt;/span&gt; &lt;span class="nx"&gt;crate&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="s2"&gt;`anchor-lang`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="s2"&gt;`use solana_program`&lt;/span&gt; &lt;span class="nx"&gt;becomes&lt;/span&gt; &lt;span class="s2"&gt;`use anchor_lang::solana_program`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;⚙️ How to Fix This Issue&lt;br&gt;
Simply remove solana-program from your Cargo.toml:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[dependencies]&lt;/span&gt;
&lt;span class="c"&gt;# Remove this:&lt;/span&gt;
&lt;span class="c"&gt;# solana-program = "2.0.0"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;Use this instead:&lt;br&gt;
&lt;code&gt;anchor-lang = "0.31.0"&lt;/code&gt;&lt;br&gt;
Then, update your imports:&lt;br&gt;
&lt;/p&gt;

&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// OLD&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;solana_program&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;pubkey&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Pubkey&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// NEW (correct way)&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;anchor_lang&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;solana_program&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;pubkey&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Pubkey&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;




&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  How to upgrade
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Install the latest version of avm:
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;cargo install --git https://github.com/coral-xyz/anchor avm --force&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;This will allow installing Anchor CLI without having to compile from source.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Update anchor-cli:
&lt;code&gt;avm install 0.31.0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Update Anchor crate(s) to &lt;code&gt;0.31.0.&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Update TS package(s) to &lt;code&gt;0.31.0.&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Install from binary
&lt;/h3&gt;

&lt;p&gt;avm install now downloads binaries from GitHub by default.&lt;/p&gt;

&lt;p&gt;The following build targets are supported:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;aarch64-apple-darwin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x86_64-unknown-linux-gnu&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x86_64-apple-darwin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x86_64-pc-windows-msvc&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can add the &lt;code&gt;--from-source&lt;/code&gt; flag to the install command if that's preferred (or required due to unsupported platform)&lt;/p&gt;

&lt;h3&gt;
  
  
  Impact on Development Workflow
&lt;/h3&gt;

&lt;p&gt;Building on the improvements introduced in Anchor 0.31.0, this release significantly enhances the development workflow by streamlining debugging, testing, and configuration processes. The clearer error messages and more reliable testing tools reduce the time spent diagnosing issues, allowing teams to focus on feature development.&lt;/p&gt;

&lt;p&gt;Performance optimizations, such as lazy deserialization for accounts, improve the efficiency of complex programs. This not only reduces computational overhead during development but also enhances deployment performance. For instance, lazy deserialization is particularly beneficial in read-heavy applications where accounts are frequently accessed but rarely modified.&lt;/p&gt;

&lt;p&gt;The inclusion of features like shell autocompletion for the Anchor CLI and expanded support for conditional compilation makes the framework more intuitive and adaptable to specific project needs. These updates collectively enhance productivity and reduce the learning curve for both new and experienced developers. For new developers, the simplified program initialization and configuration process, combined with improved documentation and tools, lower the barrier to entry by providing a more straightforward path to building Solana programs.&lt;/p&gt;

&lt;h4&gt;
  
  
  Compatibility and Migration
&lt;/h4&gt;

&lt;p&gt;Anchor 0.31.0 is designed with backward compatibility in mind, ensuring a seamless transition for existing projects while future proofing applications against upcoming ecosystem changes. The automatic conversion of legacy IDLs simplifies migration efforts, allowing you to upgrade without extensive manual intervention. This ensures that older projects can leverage the latest features without requiring significant refactoring.&lt;/p&gt;

&lt;p&gt;The framework also adapts seamlessly to Solana's evolving toolchain by supporting Agave binaries for Solana v1.18+ users, eliminating potential parsing failures caused by deprecated tools like &lt;code&gt;solana-install&lt;/code&gt; Configuring projects to use the latest Solana versions is straightforward, ensuring compatibility with future updates. The migration process is well-documented, with clear instructions for upgrading both Rust-based programs and TypeScript SDKs, minimizing downtime and ensuring project stability throughout the transition.&lt;/p&gt;

&lt;h2&gt;
  
  
  ✅ Conclusion
&lt;/h2&gt;

&lt;p&gt;In conclusion Anchor 0.31.0 is really more than just an update this release makes building on Solana faster, easier, and even more efficient. The reduced learning curve, enhanced CLI, and more reliable testing workflows mean both newcomers and experienced builders can work smarter, not harder. With v1 on the horizon, Anchor’s trajectory suggests continued focus on performance, flexibility, and developer experience. Expect future releases to build on these foundations, potentially expanding cross program integration capabilities and refining testing frameworks to meet the evolving needs of the ecosystem.&lt;/p&gt;

&lt;p&gt;For a deeper dive you can check out the&lt;br&gt;
&lt;a href="https://www.anchor-lang.com/docs/updates/release-notes/0-31-0" rel="noopener noreferrer"&gt;Anchor 0.31.0&lt;/a&gt; release notes  and the full &lt;a href="https://github.com/coral-xyz/anchor/blob/v0.31.0/CHANGELOG.md#0310---2025-03-08" rel="noopener noreferrer"&gt;CHANGELOG&lt;/a&gt;&lt;/p&gt;

</description>
      <category>anchor</category>
      <category>solana</category>
    </item>
  </channel>
</rss>
