<?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: Suliman Mokhtar</title>
    <description>The latest articles on DEV Community by Suliman Mokhtar (@sulimanmukhtar).</description>
    <link>https://dev.to/sulimanmukhtar</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1307777%2F32838a04-093e-419d-8f20-92bb2143ec84.jpeg</url>
      <title>DEV Community: Suliman Mokhtar</title>
      <link>https://dev.to/sulimanmukhtar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sulimanmukhtar"/>
    <language>en</language>
    <item>
      <title>Arc Chain, in Numbers: One Dollar, Two Decimals, and 97,000 Tokens in a Day</title>
      <dc:creator>Suliman Mokhtar</dc:creator>
      <pubDate>Sun, 20 Sep 2026 02:50:10 +0000</pubDate>
      <link>https://dev.to/sulimanmukhtar/arc-chain-in-numbers-one-dollar-two-decimals-and-97000-tokens-in-a-day-4b5o</link>
      <guid>https://dev.to/sulimanmukhtar/arc-chain-in-numbers-one-dollar-two-decimals-and-97000-tokens-in-a-day-4b5o</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://xroot.dev/blog/arc-chain-in-numbers" rel="noopener noreferrer"&gt;xroot.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Circle opened Arc's public mainnet on 16 September 2026. Four days later I read it the way I read every new chain — from its own node, with &lt;code&gt;eth_call&lt;/code&gt;, ignoring the launch posts. Six numbers came back that the launch posts do not carry, and two of them will bite anyone who integrates the chain from a table instead of a query.&lt;/p&gt;

&lt;p&gt;The headline facts hold up: an EVM layer 1 whose native coin is USDC, blocks every half second, deterministic finality, and a validator set of twelve named institutions — Circle plus BlackRock, DTCC, Visa, Mastercard, ICE and six more — running proof of authority. Everything that follows is what the chain itself says, read on 20 September at block 21,767,062, with the call that produced each figure so you can run it again.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ground Truth in Four Calls
&lt;/h2&gt;

&lt;p&gt;A chain id gets transcribed wrong, an RPC URL goes stale, and "mainnet is live" means at least four different things. So: ask the node.&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="nv"&gt;RPC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://rpc.mainnet.arc.io
call&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nv"&gt;$RPC&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'content-type: application/json'&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

call &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":1,"method":"eth_chainId","params":[]}'&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; 0x13b2 = 5042&lt;/span&gt;

call &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":1,"method":"web3_clientVersion","params":[]}'&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; "arc/v1"            (a Reth-based client under a Malachite BFT consensus)&lt;/span&gt;

call &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":1,"method":"eth_getBlockByNumber","params":["latest",false]}'&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; gasLimit 0x1c9c380 = 30,000,000 · gasUsed 213,828 · 4 transactions&lt;/span&gt;
&lt;span class="c"&gt;#    baseFeePerGas 0x4a817c800 = 20 gwei · extraData 0x00000004a817c800&lt;/span&gt;

call &lt;span class="s1"&gt;'{"jsonrpc":"2.0","id":1,"method":"eth_getCode","params":["0x000000000000000000000000000000000000006b","latest"]}'&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; 0x                   (no Arbitrum precompile: this is not a Nitro chain)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Chain ID&lt;/strong&gt; — 5042 (0x13b2)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stack&lt;/strong&gt; — Malachite BFT + Reth · Osaka EVM · L1&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Block&lt;/strong&gt; — ~0.5 s · 30M gas · 3–11% used&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gas coin&lt;/strong&gt; — USDC · base fee pinned at 20 gwei&lt;/p&gt;

&lt;p&gt;The last line of the block header is the interesting one. &lt;code&gt;extraData&lt;/code&gt; is eight bytes, and it equals the base fee: Arc publishes the &lt;em&gt;next&lt;/em&gt; block's base fee in the parent header. That is a fee market telling you its answer before you ask, and it is the subject of section three.&lt;/p&gt;

&lt;p&gt;Multicall3, Permit2, the CREATE2 deterministic deployer and Safe v1.4.1 are all present at their canonical addresses. The MetaMask, Alchemy and Uniswap EIP-7702 delegator contracts hold code too; the docs put the EVM at the Osaka fork, which is what makes delegating to them possible.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Dollar, Two Decimals
&lt;/h2&gt;

&lt;p&gt;USDC is the native coin. That sentence hides a detail every integrator will trip on once: the node counts it in &lt;strong&gt;18 decimals&lt;/strong&gt;, and the ERC-20 contract that represents the same coin counts it in &lt;strong&gt;6&lt;/strong&gt;. Same balance, two scales, a factor of a trillion apart.&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="nv"&gt;POOL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0x8366a39cc670b4001a1121b8f6a443a643e40951   &lt;span class="c"&gt;# Uniswap v4 PoolManager&lt;/span&gt;
&lt;span class="nv"&gt;USDC&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0x3600000000000000000000000000000000000000   &lt;span class="c"&gt;# the ERC-20 face of the native coin&lt;/span&gt;
&lt;span class="nv"&gt;BLOCK&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0x14c2602                                    &lt;span class="c"&gt;# pin both reads to one block&lt;/span&gt;

&lt;span class="c"&gt;# The native balance, as the node counts it: 18 decimals&lt;/span&gt;
eth_getBalance&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$POOL&lt;/span&gt;, &lt;span class="nv"&gt;$BLOCK&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; 3,692,022,800,475,000,000,000  wei-equivalent&lt;/span&gt;
&lt;span class="c"&gt;#    ÷ 1e12 = 3,692,022,800,475&lt;/span&gt;

&lt;span class="c"&gt;# The ERC-20 balance, as the contract counts it: 6 decimals&lt;/span&gt;
eth_call&lt;span class="o"&gt;({&lt;/span&gt; to: &lt;span class="nv"&gt;$USDC&lt;/span&gt;, data: balanceOf&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$POOL&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;, &lt;span class="nv"&gt;$BLOCK&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; 3,692,022,800,475&lt;/span&gt;
&lt;span class="c"&gt;#    = $3,692,022.800475&lt;/span&gt;

&lt;span class="c"&gt;# decimals() on the face -&amp;gt; 6 · symbol() -&amp;gt; "USDC" · name() -&amp;gt; "USDC"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the same block the two numbers agree to the unit, so this is one balance with two interfaces, not a coin and a wrapper. The contract at &lt;code&gt;0x3600…0000&lt;/code&gt; also emits &lt;code&gt;Transfer&lt;/code&gt; events for native movements — four of them in the block I pinned — which is EIP-7708 in practice: a history indexer that reads native sends &lt;em&gt;and&lt;/em&gt; those logs counts every transfer twice.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;nativeCurrency.decimals: 18&lt;/code&gt; is chain precision, not display precision.&lt;/strong&gt; A wallet that adds the network from the standard parameters and trusts the decimals field will show a one-dollar balance as &lt;code&gt;0.000000000001&lt;/code&gt;. Arc's own wallet guide says to divide by 10¹², label the result USDC rather than ETH, and merge the native and ERC-20 rows into one — and the network-parameters page warns that a wallet without custom-gas-token support "may display balances as ETH".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;One more read on that contract, because it is where Circle's controls would live if they lived in code. The ERC-20 face is 1,798 bytes, is not a proxy (the EIP-1967 implementation slot is empty), and its bytecode contains none of the selectors the mainnet USDC contract is known for — &lt;code&gt;blacklist&lt;/code&gt;, &lt;code&gt;isBlacklisted&lt;/code&gt;, &lt;code&gt;pause&lt;/code&gt;, &lt;code&gt;mint&lt;/code&gt;. That does not mean there is no freeze on Arc; it means the freeze, if it exists, is not in this contract. The honest reading stops there.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Fee Floor, Not a Fee Market
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;eth_feeHistory&lt;/code&gt; over the last blocks returns the same base fee six times: 20 gwei, with utilisation between three and eleven percent. Arc's fee model is EIP-1559 with a moving average on top and a hard floor — 20 gwei in the docs, and 20 gwei in every block I sampled — so under normal load the base fee never moves. It sits on the floor. The node's suggested price was 22.0 gwei, of which 2.0 was tip.&lt;/p&gt;

&lt;p&gt;Now do the unit conversion nobody does. The native coin is a dollar, and one gwei is 10⁻⁹ of it. So a gas unit costs two hundredths of a millionth of a cent, and at the 22.0 gwei the node suggested that morning:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plain transfer · 21,000 gas&lt;/strong&gt; — $0.00046&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ERC-20 transfer · ~65,000 gas&lt;/strong&gt; — $0.0014&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Uniswap v4 fee claim · ~250,000 gas&lt;/strong&gt; — $0.0055&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Token deployment · ~2,000,000 gas&lt;/strong&gt; — $0.044&lt;/p&gt;

&lt;p&gt;Two things follow. First, a fee quote on this chain is a solved problem: the price is pinned, denominated in dollars, and needs no oracle — the number on screen is the number, every time. Second, gas cannot be anyone's business model here, including the chain's. At 1.5 million transactions a day and a typical cost under a tenth of a cent, the network's whole daily gas take is on the order of a thousand dollars (an estimate from those two figures, not a measurement). Whatever pays for twelve SOC 2 validators, it is not the fee floor.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Wrapped Token That Only Reverts
&lt;/h2&gt;

&lt;p&gt;Every Uniswap deployment carries a &lt;code&gt;WETH9&lt;/code&gt; address — the wrapped native coin the routers and position managers use when a pool holds ETH. Ask Arc's v4 PositionManager for it and you get an answer. Ask the answer anything and you get a revert:&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="nv"&gt;PM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;0x6049c9a0e26405c0985f9e3685c87d0ae917f82b     &lt;span class="c"&gt;# Uniswap v4 PositionManager&lt;/span&gt;

eth_call&lt;span class="o"&gt;({&lt;/span&gt; to: PM, data: WETH9&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; 0x8bceaa40b9acdfaedf85adf4ff01f5ad6517937f&lt;/span&gt;

eth_getCode&lt;span class="o"&gt;(&lt;/span&gt;0x8bceaa40…937f&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; 53 bytes:&lt;/span&gt;
&lt;span class="c"&gt;#    6080604052 348015600e575f5ffd5b50   ; standard prologue, no value&lt;/span&gt;
&lt;span class="c"&gt;#    60405163 ea3559ef 60e01b 8152 6004 01 ; PUSH4 0xea3559ef … REVERT&lt;/span&gt;
&lt;span class="c"&gt;#    …fd&lt;/span&gt;

eth_call&lt;span class="o"&gt;({&lt;/span&gt; to: 0x8bceaa40…937f, data: name&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;      -&amp;gt; revert 0xea3559ef
eth_call&lt;span class="o"&gt;({&lt;/span&gt; to: 0x8bceaa40…937f, data: symbol&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;    -&amp;gt; revert 0xea3559ef
eth_call&lt;span class="o"&gt;({&lt;/span&gt; to: 0x8bceaa40…937f, data: decimals&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;})&lt;/span&gt;  -&amp;gt; revert 0xea3559ef
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is not a squatter and not a bug. Uniswap's own deployment table for chain 5042 lists the address as &lt;em&gt;"Unsupported Protocol (WETH9)"&lt;/em&gt;: a 53-byte contract whose only behaviour is to revert with one custom error, deployed on purpose so that every code path expecting a wrapper fails loudly instead of silently. On Arc there is nothing to wrap — the native coin already has an ERC-20 face at &lt;code&gt;0x3600…0000&lt;/code&gt;. Any "wrap" or "unwrap" button, any router path that hops through WETH, any collect-and-compound flow that calls &lt;code&gt;deposit()&lt;/code&gt; — all of it dies here, and it dies with a selector you can grep for.&lt;/p&gt;

&lt;p&gt;The squatter &lt;em&gt;is&lt;/em&gt; elsewhere, and it is the same one I found on &lt;a href="https://xroot.dev/blog/robinhood-chain-read-directly" rel="noopener noreferrer"&gt;Robinhood Chain in August&lt;/a&gt;. Uniswap v3's canonical mainnet addresses — &lt;code&gt;0x1F98…F984&lt;/code&gt; for the factory, &lt;code&gt;0xC364…FE88&lt;/code&gt; for the position manager — both hold a 2,747-byte contract on Arc that is not Uniswap v3. &lt;code&gt;feeAmountTickSpacing(3000)&lt;/code&gt; returns nothing. The real v3 factory is at &lt;code&gt;0xf0db…3918&lt;/code&gt; and answers 60, and its position manager at &lt;code&gt;0x3965…1377&lt;/code&gt; points back to it. A tool that copies v3 addresses from a table it trusts would be reading a stranger's contract and calling it Uniswap. Read the code, make one live call, then believe the address.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who Got There First
&lt;/h2&gt;

&lt;p&gt;Arc was built, in Circle's words, for payments, FX, tokenised assets and institutional markets. The explorer's daily transaction chart says who actually showed up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;12–15 September, private mainnet:&lt;/strong&gt; 126K · 131K · 407K · 456K transactions a day.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;16 September, public launch:&lt;/strong&gt; &lt;strong&gt;7,763,670&lt;/strong&gt; transactions. Reporters counted 97,025 new tokens that day, more than 83,000 of them through one launchpad, and $410.8M of trading with about 82% from memecoin launchpads.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;17 · 18 · 19 September:&lt;/strong&gt; 5,472,100 · 2,611,050 · 1,551,810. Down 80% from the launch day in three days.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The DEX numbers from DefiLlama on 20 September: $52.8M in the last day, of which Uniswap v4 is $36.8M and v3 $14.4M — 97% between them. The v4 PositionManager's &lt;code&gt;nextTokenId&lt;/code&gt; reads 222,177, so 222,176 v4 positions have been minted so far; the v3 manager's &lt;code&gt;totalSupply&lt;/code&gt; is 36,325. Total protocol fees on the chain, all sources, were $375K in the same day. For scale, Robinhood Chain booked roughly forty-five times that on the day I measured it in early September.&lt;/p&gt;

&lt;p&gt;The explorer counts 1,316,279 contracts on the chain and 19,380 verified ones — one in sixty-eight. And the trending list on the pool indexer, the morning I looked, had this in it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;USDC / USDC 1%&lt;/code&gt; — $1.16M traded in 24 hours, $386K in reserve, on a launchpad's own exchange.&lt;/strong&gt; A token that calls itself USDC, paired against the real one. On Arc exactly one address is USDC: &lt;code&gt;0x3600…0000&lt;/code&gt;. EURC is one address. USYC is one address. A ticker is a string anyone can type into a constructor; the address is the only thing a copy cannot have. GoPlus was already warning about clones of two of the chain's biggest launch tokens by the second day.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I do not read the decay as a verdict. A launch-day spike that falls 80% is the shape of every launch; the question is where the line flattens, and four days do not answer it. What the numbers do say is that the population using Arc today is the one that uses every new EVM chain in its first week — launching, trading and copying tokens — and it arrived before the institutional use the chain was named for.&lt;/p&gt;




&lt;h2&gt;
  
  
  A Token That Exists and Is Not Launched, and Who Runs the Chain
&lt;/h2&gt;

&lt;p&gt;On launch day Circle announced a genesis mint of &lt;strong&gt;10 billion ARC&lt;/strong&gt; tokens — and, in the same breath, that they are not available to the public and that the mint is "a technical milestone, not a commitment to launch". The whitepaper post on arc.io still carries the line that any token "is merely exploratory". Gas stays in USDC. A move to proof of stake, where the token would have a job, is described as something Circle is exploring for 2027.&lt;/p&gt;

&lt;p&gt;So: the token exists on-chain and has no holders you can become. Anything trading under that ticker today, and anything offering an "ARC airdrop" or an "ARC claim", is not Circle's. Search interest in "arc token" hit its peak on launch day, which is exactly the audience those pages are built for.&lt;/p&gt;

&lt;p&gt;Who runs the chain is disclosed more plainly than most. Twelve named institutions run proof of authority; a block is final when more than two thirds of them pre-commit to it; Circle chose them. Arc's security page says that "validator-layer sanctions controls are part of Arc's network operating model" and names a third-party monitoring provider. On Robinhood Chain I could count how often the filtering switch had been used, because Nitro exposes the filterer as a precompile with a public nonce. Arc is not Nitro and has no such artefact, so whether the switch has been thrown is not something the chain will tell you. I record that as an unknown, not as an absence.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to Carry Out of This
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Decimals come from the asset, never from the chain.&lt;/strong&gt; Read &lt;code&gt;decimals()&lt;/code&gt; on the ERC-20 face and treat native units as 18; divide by 10¹² to show dollars. The two are one balance.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;There is no WETH.&lt;/strong&gt; The address Uniswap points at reverts by design. Delete the wrap path; it has nothing to wrap.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Canonical addresses are not addresses.&lt;/strong&gt; The v3 factory is not where the tables say. Check code size and make one call the real contract must answer before you label anything.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The name is not the coin.&lt;/strong&gt; One address is USDC. Anything else wearing the ticker is a copy, and the first week's trending list already had one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Free tool&lt;/p&gt;

&lt;h3&gt;
  
  
  Is that token what it says it is?
&lt;/h3&gt;

&lt;p&gt;The token audit reads a contract's owner levers, hidden spenders, holders and liquidity straight from the chain — public data, no wallet connect, nothing to sign — and on Robinhood Chain checks a stock token against its issuer's own registry, so a copy is named as a copy. Solana and Robinhood Chain today.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.xroot.dev/token-audit" rel="noopener noreferrer"&gt;Run a token audit&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Read the Source Yourself
&lt;/h2&gt;

&lt;p&gt;Every on-chain figure above came from the public endpoint &lt;code&gt;https://rpc.mainnet.arc.io&lt;/code&gt;, the chain's &lt;a href="https://explorer.arc.io" rel="noopener noreferrer"&gt;Blockscout explorer&lt;/a&gt; and its &lt;code&gt;/api/v2/stats&lt;/code&gt;, and &lt;a href="https://defillama.com/chain/arc" rel="noopener noreferrer"&gt;DefiLlama&lt;/a&gt;, all read on 20 September 2026. Reference: &lt;a href="https://docs.arc.io/arc/references/connect-to-arc" rel="noopener noreferrer"&gt;Arc network parameters&lt;/a&gt;, &lt;a href="https://docs.arc.io/arc/references/gas-and-fees" rel="noopener noreferrer"&gt;the fee model&lt;/a&gt;, &lt;a href="https://www.arc.io/blog/supporting-arc-in-wallets-one-balance-usdc-fees-and-complete-history" rel="noopener noreferrer"&gt;Arc's wallet integration guide&lt;/a&gt;, &lt;a href="https://github.com/Uniswap/contracts/blob/main/deployments/5042.md" rel="noopener noreferrer"&gt;Uniswap's deployment table for chain 5042&lt;/a&gt;, &lt;a href="https://www.arc.io/security" rel="noopener noreferrer"&gt;Arc's security page&lt;/a&gt;, and &lt;a href="https://www.circle.com/pressroom/circle-launches-arc-mainnet-an-economic-operating-system-for-the-internet" rel="noopener noreferrer"&gt;Circle's launch release&lt;/a&gt;. The launch-day token and volume counts are reporters' figures (BeInCrypto, CryptoRank, 17 September), not mine; the GoPlus warning was carried by KuCoin's news feed the same day. Re-run every call before relying on any of it — this chain is four days old.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;xroot.dev is not affiliated with, endorsed by, or sponsored by Circle Internet Group, Inc. "Arc", "USDC" and "EURC" are used here only to name the public blockchain and the assets this article examines. Nothing here is financial advice.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>arc</category>
      <category>evm</category>
      <category>stablecoins</category>
      <category>forensics</category>
    </item>
    <item>
      <title>After the Rent Cut, Your Old Solana Accounts Are Over-Funded</title>
      <dc:creator>Suliman Mokhtar</dc:creator>
      <pubDate>Fri, 18 Sep 2026 15:33:21 +0000</pubDate>
      <link>https://dev.to/sulimanmukhtar/after-the-rent-cut-your-old-solana-accounts-are-over-funded-2a5m</link>
      <guid>https://dev.to/sulimanmukhtar/after-the-rent-cut-your-old-solana-accounts-are-over-funded-2a5m</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://xroot.dev/blog/solana-rent-surplus-nonce-stake-vote-accounts" rel="noopener noreferrer"&gt;xroot.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://xroot.dev/blog/solana-rent-cut-simd-0437" rel="noopener noreferrer"&gt;rent-cut post&lt;/a&gt; explained the economics: Solana is cutting the price of account storage by 90% in five feature-gated steps, and accounts funded at the old price keep every lamport they were funded with. The follow-up question arrived within a day of publishing it: &lt;em&gt;if my account holds more rent than it now needs, can I get the difference back without closing it?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For four kinds of account, yes. Here is the arithmetic per type, the instruction that withdraws it, the switch that could put the price back up, and a detail from last week that will trip anyone tracking this by feature ID.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Formula, and Where the Ladder Stands
&lt;/h2&gt;

&lt;p&gt;Rent on Solana is now a single multiplication: &lt;strong&gt;(128 + data length) × lamports per byte&lt;/strong&gt;. The 128 is a fixed per-account overhead; the two-year multiplier that used to complicate this was folded into the byte price earlier this year.&lt;/p&gt;

&lt;p&gt;The byte price is stepping down through five gates:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ladder, lamports per byte&lt;/strong&gt; — 6,960 → 6,333 → 5,080 → 2,575 → 1,322 → 696&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mainnet on 17 September 2026&lt;/strong&gt; — step two — 5,080 since 11 September, a 27% cut&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Surplus against the original price&lt;/strong&gt; — (128 + length) × 1,880 lamports&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Surplus at the final step&lt;/strong&gt; — (128 + length) × 6,264 lamports&lt;/p&gt;

&lt;p&gt;Three steps remain, expected with Agave 4.4. At the end, the surplus is nine-tenths of what was originally deposited.&lt;/p&gt;




&lt;h2&gt;
  
  
  Four Account Types, Four Numbers
&lt;/h2&gt;

&lt;p&gt;Per account, today against the original price, and at the last step:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nonce account · 80 bytes&lt;/strong&gt; — ~0.00039 SOL now · ~0.0013 SOL at the end&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stake account · 200 bytes&lt;/strong&gt; — ~0.00062 SOL now · ~0.0021 SOL at the end&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vote account · 3,762 bytes&lt;/strong&gt; — ~0.0073 SOL now · ~0.024 SOL at the end&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Token account · 165 bytes&lt;/strong&gt; — ~0.00055 SOL now · ~0.0018 SOL at the end&lt;/p&gt;

&lt;p&gt;Individually small. Multiplied by the number of accounts a wallet, a treasury or a validator operator controls, not small. A validator with a hundred nonce accounts for a signing pipeline, a distribution program that created ten thousand stake accounts, a market maker with a thousand token accounts: the surplus is a line item, and it grows at every step.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Worth knowing:&lt;/strong&gt; the surplus only exists for accounts created &lt;strong&gt;before&lt;/strong&gt; a step. Everything created after the final step holds the final price and has nothing to reclaim. The stock of over-funded accounts is fixed the day the ladder finishes, and it only shrinks as people notice.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Instruction Per Type, and Who Can Sign It
&lt;/h2&gt;

&lt;p&gt;Each program guards its own accounts, so the withdrawal is four different instructions with one rule in common: the account keeps at least the current rent-exempt minimum, and the signer is the account's own authority.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Nonce accounts:&lt;/strong&gt; &lt;code&gt;WithdrawNonceAccount&lt;/code&gt;, signed by the nonce authority, any amount above the rent-exempt minimum.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Stake accounts:&lt;/strong&gt; the stake program's &lt;code&gt;Withdraw&lt;/code&gt;, signed by the withdraw authority. On a delegated account only the portion above the delegated stake plus the reserve is withdrawable; on a deactivated one, anything above the reserve.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Vote accounts:&lt;/strong&gt; the vote program's &lt;code&gt;Withdraw&lt;/code&gt;, signed by the authorized withdrawer, keeping the rent-exempt minimum &lt;strong&gt;plus pending delegator rewards&lt;/strong&gt; — the delegators' accrued share is in the balance but is not the operator's to take. Once Alpenglow activates — the gate had not activated on mainnet as of 17 September 2026 — the account also has to keep &lt;a href="https://xroot.dev/blog/alpenglow-validator-admission-2000-seats" rel="noopener noreferrer"&gt;one epoch's admission ticket&lt;/a&gt;: 1.2 SOL at today's 300 ms slots, 1.0 SOL from epoch 1037, when slots go to 250 ms.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Token accounts:&lt;/strong&gt; &lt;code&gt;WithdrawExcessLamports&lt;/code&gt;, signed by the account's owner, an instruction both token programs carry precisely for this case. The account stays open and usable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing above closes anything, and nothing requires a third party to hold a key. The live tool on the app builds the batch for the accounts a connected wallet controls, and the wallet signs it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Switch That Can Put the Price Back Up
&lt;/h2&gt;

&lt;p&gt;The ladder has a reverse gear. A feature named &lt;code&gt;set_lamports_per_byte_to_6960&lt;/code&gt; restores the original price. It had not activated on mainnet as of 17 September 2026, and the validator's ordering rule gives it priority: if a rollback and a cut activate in the same epoch, &lt;strong&gt;the rollback wins&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The ordering rule for the cuts themselves is also worth knowing: if several cut gates activate in one epoch, the &lt;strong&gt;lowest&lt;/strong&gt; price wins; if they activate out of order, the &lt;strong&gt;most recently activated&lt;/strong&gt; price wins. The ladder is designed to descend, but the code allows for the messier cases.&lt;/p&gt;

&lt;p&gt;For anyone timing account creation to a cheaper step, the rollback is the risk. A batch deferred to "after the next cut" can land after a rollback instead. Watch both directions.&lt;/p&gt;




&lt;h2&gt;
  
  
  The IDs Changed Recently
&lt;/h2&gt;

&lt;p&gt;Feature gates are identified by public keys, and those keys are not stable until a feature activates. On &lt;strong&gt;11 September 2026&lt;/strong&gt; the SIMD-0438 rollback gate and the remaining SIMD-0437 cut gates were &lt;strong&gt;re-keyed&lt;/strong&gt; — assigned new feature IDs — in the validator source. Any dashboard, script or bookmark that tracked the old IDs is now watching accounts that will never activate.&lt;/p&gt;

&lt;p&gt;This is normal for unactivated features, and it is the reason the tracker on this site reads the feature names from the current validator build rather than from a list someone typed in months ago. If you track gates yourself, re-read the IDs from the release you are running, every release.&lt;/p&gt;




&lt;h2&gt;
  
  
  Rent Surplus: Questions People Actually Ask
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can I get rent back from a Solana account without closing it?
&lt;/h3&gt;

&lt;p&gt;Yes, for account types whose program allows withdrawing lamports above the rent-exempt minimum: nonce, stake and vote accounts, and token accounts via WithdrawExcessLamports. The account stays open.&lt;/p&gt;

&lt;h3&gt;
  
  
  How much rent surplus does a Solana account hold after the cut?
&lt;/h3&gt;

&lt;p&gt;(128 + data length) × (old price − new price) lamports. At the 5,080 per byte live since 11 September 2026, against the original 6,960, a token account holds about 0.00055 SOL of surplus; at the final step, about 0.0018 SOL.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can the Solana rent cut be reversed?
&lt;/h3&gt;

&lt;p&gt;Yes. A rollback gate — not active on mainnet as of 17 September 2026 — restores 6,960 lamports per byte and overrides any cut that activates in the same epoch. Deferring account creation to a cheaper step carries that risk.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why did the SIMD-0437 feature IDs change?
&lt;/h3&gt;

&lt;p&gt;Unactivated feature IDs are not stable. The remaining cut gates and the rollback gate were re-keyed on 11 September 2026; anything tracking the old IDs is watching dead accounts.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to Do, in Order
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  List the nonce, stake, vote and token accounts your keys control, with their creation-era balances.&lt;/li&gt;
&lt;li&gt;  Withdraw the surplus on the ones you keep, with the instruction for that type, leaving the current minimum and, for vote accounts, the delegators' share.&lt;/li&gt;
&lt;li&gt;  &lt;a href="https://xroot.dev/blog/claim-sol" rel="noopener noreferrer"&gt;Close the ones you do not need at all&lt;/a&gt;; closing returns the full original deposit, which is the larger number.&lt;/li&gt;
&lt;li&gt;  Then wait for the next step and do it again. Three steps remain, and each one makes every account you funded at the old price a little more over-funded than it was.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;— Without Closing a Single Account —&lt;/p&gt;

&lt;h3&gt;
  
  
  Take back the surplus and keep the account.
&lt;/h3&gt;

&lt;p&gt;The rent-refund tool reads the accounts a connected wallet controls, computes the surplus per type against the live byte price, and builds the withdrawal batch for your wallet to sign. Nothing is closed and no key leaves your side.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.xroot.dev/solana/rent-cut-refund?ref=blog" rel="noopener noreferrer"&gt;Take Back the Rent Surplus ↗&lt;/a&gt;&lt;a href="https://app.xroot.dev/upgrades?ref=blog" rel="noopener noreferrer"&gt;Check which step is live&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While you are auditing stake accounts, the &lt;a href="https://xroot.dev/blog/solana-minimum-stake-delegation-1-sol" rel="noopener noreferrer"&gt;minimum delegation has been 1 SOL since 18 June 2026&lt;/a&gt; — the same accounts. A sub-1-SOL delegation still earns, but it can no longer be split or moved, only merged, deactivated or withdrawn.&lt;/p&gt;

&lt;p&gt;Rules and ordering read from the Agave validator source at commit &lt;code&gt;beee69b958&lt;/code&gt;: &lt;code&gt;runtime/src/bank.rs&lt;/code&gt;, &lt;code&gt;feature-set/src/lib.rs&lt;/code&gt; and the rent collector. The figures assume the 5,080 lamports-per-byte rate live on mainnet on 17 September 2026 — re-check the live rate and the live step before acting on a number here.&lt;/p&gt;

</description>
      <category>solana</category>
      <category>rent</category>
      <category>simd0437</category>
      <category>walletrecovery</category>
    </item>
    <item>
      <title>SPL Token Was Replaced In Place: p-token, Explained</title>
      <dc:creator>Suliman Mokhtar</dc:creator>
      <pubDate>Fri, 18 Sep 2026 15:33:20 +0000</pubDate>
      <link>https://dev.to/sulimanmukhtar/spl-token-was-replaced-in-place-p-token-explained-2fla</link>
      <guid>https://dev.to/sulimanmukhtar/spl-token-was-replaced-in-place-p-token-explained-2fla</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://xroot.dev/blog/spl-token-p-token-replaced-in-place" rel="noopener noreferrer"&gt;xroot.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Every token you have ever held on Solana that is not Token-2022 lives under one program: the classic &lt;code&gt;Tokenkeg…&lt;/code&gt; address. It is the most-called program on the chain, it has not materially changed in years, and most people assume it never will, because changing it would mean changing an address that half the ecosystem has hard-coded.&lt;/p&gt;

&lt;p&gt;SIMD-0266 did not change the address. It changed what runs behind it. On 13 May 2026, at the start of epoch 971, a feature gate swapped the program's bytecode for a new implementation called p-token, moved the program from the original loader to the upgradeable loader, and set its upgrade authority to nothing. Same ID, same instructions, same accounts, faster code, and no one who can change it again.&lt;/p&gt;

&lt;p&gt;This post is what the swap actually does, from the validator source, and what it changes for people who never write a line of code.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a Feature Gate Can Do to a Program
&lt;/h2&gt;

&lt;p&gt;Solana's runtime can replace a builtin or a program's bytecode at a feature activation. The mechanism is the same one that moved the stake, config, address-lookup-table and feature-gate programs from native code to on-chain bytecode over the past year. The validator carries the new binary, the feature account activates at an epoch boundary after 95% of stake adopts it, and at that boundary the runtime writes the new program data under the old address.&lt;/p&gt;

&lt;p&gt;For SPL Token the feature is &lt;code&gt;replace_spl_token_with_p_token&lt;/code&gt;. The source names both sides of the swap: the target is the classic token program ID, and the source is a buffer account that already holds the p-token binary on chain. The runtime copies the buffer into a program-data account, points the program at it, and records the upgrade authority as &lt;strong&gt;none&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Worth knowing:&lt;/strong&gt; agave's own bundled copy of the classic token program &lt;em&gt;is already p-token&lt;/em&gt; — the file is &lt;code&gt;spl_p_token-1.0.0.so&lt;/code&gt;, about 109 KB. Every local test validator and every fresh genesis has been running the new implementation for a while. Mainnet followed on 13 May 2026, at the start of epoch 971 (slot 419,472,000).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What p-token Is
&lt;/h2&gt;

&lt;p&gt;p-token is a reimplementation of the SPL Token program in Pinocchio, a framework for writing Solana programs with no allocator and minimal runtime overhead. The instruction set is the original one: the same discriminators, the same account layouts, the same errors, so a wallet, an explorer or a DEX sees no difference in what it sends or reads.&lt;/p&gt;

&lt;p&gt;What changes is what each instruction &lt;em&gt;costs&lt;/em&gt; to execute. The original program was written against the standard Rust framework and pays its overheads on every call. p-token strips them. The proposal's whole justification is compute: the same transfer, the same approve, the same close, for fewer compute units.&lt;/p&gt;

&lt;p&gt;The exact per-instruction numbers belong in a benchmark, not a paragraph, and the buffer is on chain for anyone to measure against. What the swap guarantees is the direction.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Cheaper Compute Is a Fee Story
&lt;/h2&gt;

&lt;p&gt;A leader &lt;a href="https://xroot.dev/blog/solana-transaction-priority-formula-compute-limit" rel="noopener noreferrer"&gt;ranks transactions by reward divided by the block space they request&lt;/a&gt;. If the token transfers inside your swap cost fewer compute units, and your compute-unit limit is set from a simulation, the limit falls, the block-space cost falls, and your rank rises at the same fee. Wallets that hard-code a compute limit for token transfers will keep paying for the old number until they re-measure.&lt;/p&gt;

&lt;p&gt;The other side of the same coin: the per-account limit on how much of a block one account can consume — 30 million units at today's 300 ms slots, and 25 million from epoch 1037, when 250 ms slots start — goes further when each transfer costs less. A hot token account jams later.&lt;/p&gt;

&lt;p&gt;None of this needs action from a holder. It needs re-measurement from anyone who sets compute limits by hand.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Part Nobody Will Be Able to Undo
&lt;/h2&gt;

&lt;p&gt;After the migration the program's upgrade authority is set to none. The validator source is explicit about why: the original program lived under a loader that has no concept of an upgrade authority, so the migrated program is given the closest equivalent, which is "nobody".&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;p-token is the &lt;strong&gt;final form&lt;/strong&gt; of the classic token program unless another feature gate replaces it the same way. There is no key that can push a patch. If a bug is found, the fix is a new feature gate, a new buffer, and another 95%-of-stake activation. This is the same immutability the ecosystem asked for and the same immutability it will have to live with.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is worth reading next to &lt;a href="https://xroot.dev/blog/solana-legacy-programs-cannot-be-made-immutable-simd-0500" rel="noopener noreferrer"&gt;the rule that stops old programs being frozen at all&lt;/a&gt;: the network is making immutability harder to reach by accident and permanent when it arrives.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Could Break, and for Whom
&lt;/h2&gt;

&lt;p&gt;The instruction ABI does not change, so the expected answer is "nothing", and the honest answer is "nothing anyone has found since mainnet activated it on 13 May 2026". Three places deserve a look regardless:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Programs that call the token program by CPI and set a tight compute budget for the callee. Cheaper is fine; a budget computed from the old costs will simply leave headroom.&lt;/li&gt;
&lt;li&gt;  Anything that identifies the token program by inspecting its loader or its program-data account. After the swap it is a loader-v3 program with a program-data account and no authority. Tooling that assumed "loader v2, no program-data" will need updating.&lt;/li&gt;
&lt;li&gt;  Indexers that key on the program's executable bytes or hash for any reason. The bytes change; the address does not.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  p-token: Questions People Actually Ask
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Is the SPL Token program address changing?
&lt;/h3&gt;

&lt;p&gt;No. The classic token program ID stays the same. SIMD-0266 replaced the bytecode behind it with p-token via a feature gate that activated on 13 May 2026, and the instruction set and account layouts are unchanged.&lt;/p&gt;

&lt;h3&gt;
  
  
  Will my tokens or token accounts change?
&lt;/h3&gt;

&lt;p&gt;No. Balances, delegates and authorities are data in your accounts, not in the program. The swap changes how instructions execute, not what they mean.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can the token program be upgraded after p-token?
&lt;/h3&gt;

&lt;p&gt;Not by a key. The migrated program gets no upgrade authority. Any future change would need another feature gate with another 95%-of-stake activation.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does p-token lower fees?
&lt;/h3&gt;

&lt;p&gt;Token instructions cost fewer compute units, so a simulated compute limit drops, the block-space cost drops, and the leader ranks the transaction higher for the same fee.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to Do, by Who You Are
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Holding tokens:&lt;/strong&gt; nothing. Your balances, accounts and approvals are unaffected, and the program that guards them cannot be changed by anyone afterwards.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Sending transactions with hand-set compute limits:&lt;/strong&gt; re-simulate now and lower them. The saving is real and it is yours.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Building on the token program:&lt;/strong&gt; run your test suite against a local validator now — it already runs p-token — and against the on-chain buffer if you want the exact mainnet bytes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;— Already Live —&lt;/p&gt;

&lt;h3&gt;
  
  
  The most-called program on Solana, replaced without a single address changing.
&lt;/h3&gt;

&lt;p&gt;The gate is one feature account. The upgrades tracker reads it from the chain every minute and shows the state per cluster — which is also how you know when to re-measure your compute limits.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.xroot.dev/upgrades?ref=blog" rel="noopener noreferrer"&gt;Open the Upgrades Tracker ↗&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Migration details read from the Agave validator source at commit &lt;code&gt;beee69b958&lt;/code&gt;: &lt;code&gt;feature-set/src/lib.rs&lt;/code&gt; and &lt;code&gt;program-binaries/src/lib.rs&lt;/code&gt;. Per-instruction compute figures are deliberately not quoted here — measure them against the on-chain buffer rather than trusting a number in a blog post.&lt;/p&gt;

</description>
      <category>solana</category>
      <category>simd0266</category>
      <category>spltoken</category>
      <category>compute</category>
    </item>
    <item>
      <title>Solana’s Minimum Stake Delegation Is Now 1 SOL</title>
      <dc:creator>Suliman Mokhtar</dc:creator>
      <pubDate>Fri, 18 Sep 2026 15:33:16 +0000</pubDate>
      <link>https://dev.to/sulimanmukhtar/solanas-minimum-stake-delegation-is-now-1-sol-bk6</link>
      <guid>https://dev.to/sulimanmukhtar/solanas-minimum-stake-delegation-is-now-1-sol-bk6</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://xroot.dev/blog/solana-minimum-stake-delegation-1-sol" rel="noopener noreferrer"&gt;xroot.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For as long as Solana has had staking, the minimum you could delegate has been one lamport — a billionth of a SOL. It is why the network has tens of thousands of stake accounts holding a few thousandths of a SOL: airdropped stake, split leftovers, test delegations that were never cleaned up. Each one is a full account the runtime tracks and rewards, and each one costs more to process than it earns.&lt;/p&gt;

&lt;p&gt;That ended on 18 June 2026, when version 5 of the stake program activated on mainnet. The minimum delegation is now &lt;strong&gt;1 SOL&lt;/strong&gt;. And the reason that change can ship as a program upgrade rather than a validator release is the quieter story underneath it: the stake program is no longer native code inside the validator. It is on-chain bytecode, and it is upgradeable.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stake Program Is Now a Program
&lt;/h2&gt;

&lt;p&gt;For most of Solana's life the stake program was a builtin: Rust compiled into the validator binary, changed only when validators upgraded. Over the past year the core programs were migrated one by one to Core BPF — real on-chain programs under the upgradeable loader — and the stake program's migration is complete. The validator ships version 5.1.0 of it as a 212 KB binary, and every feature ID in the migration table is now "none", which is the source's way of saying the migration is live on every cluster.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Changes to staking rules are now &lt;strong&gt;program upgrades&lt;/strong&gt; gated by features, not validator releases. SIMD-0490 is the first substantive one.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The Rule
&lt;/h2&gt;

&lt;p&gt;The runtime's minimum-delegation function has exactly two branches:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;v5 stake program gate active&lt;/strong&gt; — 1 SOL&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Otherwise&lt;/strong&gt; — 1 lamport&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Minimum balance of a delegated account&lt;/strong&gt; — rent-exempt reserve + minimum delegation&lt;/p&gt;

&lt;p&gt;A stake account is 200 bytes; at today's rent rate of 5,080 lamports per byte, in force since 11 September 2026, its reserve is &lt;strong&gt;0.00166624 SOL&lt;/strong&gt;. So a delegated stake account needs a shade over &lt;strong&gt;1.0017 SOL&lt;/strong&gt; in it to be valid.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What the rule does to delegations that &lt;em&gt;already exist&lt;/em&gt; below the minimum, read from the v5 program source: &lt;strong&gt;nothing&lt;/strong&gt;. The minimum is enforced when stake is delegated, split or moved. A new delegation below 1 SOL is rejected; a split must leave both sides at or above the minimum unless the whole stake moves; a move-stake must leave both sides at or above it. Deactivate, withdraw and merge carry no minimum check, and the proposal says merging is always allowed even when the result stays below 1 SOL. An existing sub-1-SOL delegation keeps earning. It cannot be split or moved, only merged, deactivated or withdrawn.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Who Has Sub-1-SOL Stake Without Knowing
&lt;/h2&gt;

&lt;p&gt;More people than you would think.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Anyone who received staked SOL through a distribution program. Grants, airdrops and vesting schemes commonly delivered stake accounts in small tranches; the leftovers are often below 1 SOL.&lt;/li&gt;
&lt;li&gt;  Anyone who split a stake account to move part of it. Splits leave a remainder, and remainders are forgotten.&lt;/li&gt;
&lt;li&gt;  Anyone who tested staking once with a small amount and moved on.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Liquid-staking users generally do not have this problem; the pool's accounts are large. Direct stakers do.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Three Instructions That Fix It
&lt;/h2&gt;

&lt;p&gt;The stake program has always had what is needed; the gate just gives a reason to use it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Merge.&lt;/strong&gt; Two stake accounts delegated to the same validator, with compatible state, can be merged into one. Small tranches on the same validator become one account above the minimum.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Withdraw.&lt;/strong&gt; A deactivated stake account, or the inactive portion of an active one, can be withdrawn to your wallet. Dust that is not worth merging is worth withdrawing, and the account's rent comes back with it.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Deactivate delinquent.&lt;/strong&gt; A separate case: stake delegated to a validator that has stopped voting for a long time can be deactivated by &lt;strong&gt;anyone&lt;/strong&gt; — the instruction is permissionless. Stake stuck on a dead validator is not lost; it is waiting for someone to send one instruction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every one of these is a transaction your own wallet signs with the stake or withdraw authority. No custody, no third party.&lt;/p&gt;




&lt;h2&gt;
  
  
  What the Rest of the Ecosystem Has to Change
&lt;/h2&gt;

&lt;p&gt;Stake pools, dashboards and any tool that creates stake accounts programmatically need to enforce the new minimum at creation time, or their users will get a confusing rejection from the program. Explorers that display "stake activation" for tiny accounts will need to decide what to show for accounts below the floor. And the &lt;code&gt;getStakeMinimumDelegation&lt;/code&gt; RPC call, which many tools ignore because the answer used to be 1 lamport, now returns 1 SOL.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://xroot.dev/blog/alpenglow-validator-admission-2000-seats" rel="noopener noreferrer"&gt;Alpenglow admission changes&lt;/a&gt; ride a separate gate, and that gate had not activated on mainnet as of 17 September 2026. The stake-account side of staking has already changed; the vote-account side has not.&lt;/p&gt;




&lt;h2&gt;
  
  
  Minimum Delegation: Questions People Actually Ask
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is the minimum stake delegation on Solana?
&lt;/h3&gt;

&lt;p&gt;One SOL. The v5 stake program gate activated on mainnet on 18 June 2026, at epoch 989; before that it was one lamport. A delegated stake account must hold the rent-exempt reserve plus that minimum.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why can Solana staking rules change without a validator upgrade?
&lt;/h3&gt;

&lt;p&gt;The stake program is now Core BPF: on-chain, upgradeable bytecode under the upgradeable loader. Rule changes arrive as feature-gated program upgrades rather than validator releases.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens to stake accounts below 1 SOL?
&lt;/h3&gt;

&lt;p&gt;New delegations below the minimum are rejected, and a split or a move must leave both sides at or above it. Delegations that were already below 1 SOL are untouched: they keep earning, and you can still merge, deactivate or withdraw them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I free stake stuck on a validator that stopped voting?
&lt;/h3&gt;

&lt;p&gt;Yes. The deactivate-delinquent instruction can be sent by anyone against stake delegated to a long-delinquent validator; the stake then cools down and can be withdrawn.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to Do This Month
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  List every stake account your wallet controls, with its delegated amount. Anything under 1 SOL is now fixed in shape: it earns, but it cannot be split or moved.&lt;/li&gt;
&lt;li&gt;  For each one: merge it into a larger account on the same validator, or deactivate and withdraw it. Both remain available; the rule does not touch existing delegations.&lt;/li&gt;
&lt;li&gt;  While you are in there, take the &lt;a href="https://xroot.dev/blog/solana-rent-surplus-nonce-stake-vote-accounts" rel="noopener noreferrer"&gt;rent surplus those accounts are holding&lt;/a&gt;. A stake account funded before the 11 September 2026 cut to 5,080 lamports per byte is over-funded whether you merge it or not.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;— One Feature Account Sets the Floor —&lt;/p&gt;

&lt;h3&gt;
  
  
  The minimum changed at an epoch boundary, not on an announcement.
&lt;/h3&gt;

&lt;p&gt;The v5 stake-program gate activated once 95% of stake ran software that supported it, which happened at epoch 989 on 18 June 2026. The upgrades tracker reads the feature-gate accounts from the chain every minute and shows the state on each cluster.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.xroot.dev/upgrades?ref=blog" rel="noopener noreferrer"&gt;Open the Upgrades Tracker ↗&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Constants read from the Agave validator source at commit &lt;code&gt;beee69b958&lt;/code&gt;: &lt;code&gt;runtime/src/stake_utils.rs&lt;/code&gt;, &lt;code&gt;program-binaries/src/lib.rs&lt;/code&gt; and &lt;code&gt;feature-set/src/lib.rs&lt;/code&gt;. The treatment of existing sub-minimum delegations was verified on 17 September 2026 against the SIMD-0490 text and the v5 program source (solana-program/stake: process_delegate, process_split, process_move_stake). The v5 gate activated on mainnet at slot 427,248,000 (epoch 989, 18 June 2026) and v5.1 at slot 443,232,000 (epoch 1026, 31 August 2026).&lt;/p&gt;

</description>
      <category>solana</category>
      <category>simd0490</category>
      <category>staking</category>
      <category>corebpf</category>
    </item>
    <item>
      <title>Sent SOL to an Address That Doesn’t Exist Yet? SIMD-0312 Fix</title>
      <dc:creator>Suliman Mokhtar</dc:creator>
      <pubDate>Fri, 18 Sep 2026 15:33:14 +0000</pubDate>
      <link>https://dev.to/sulimanmukhtar/sent-sol-to-an-address-that-doesnt-exist-yet-simd-0312-fix-2nn8</link>
      <guid>https://dev.to/sulimanmukhtar/sent-sol-to-an-address-that-doesnt-exist-yet-simd-0312-fix-2nn8</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://xroot.dev/blog/solana-create-account-allow-prefund-simd-0312" rel="noopener noreferrer"&gt;xroot.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;It is the most common support ticket in crypto, on every chain, and on Solana it has a specific mechanical cause. Someone is given an address — a deposit address, a program-derived address, an account a dApp is about to create — and sends SOL to it before the account exists. The SOL arrives. The address now has a balance and no account behind it. And when the program that was supposed to create the account finally tries, the system program refuses, because you cannot &lt;em&gt;create&lt;/em&gt; something that already holds lamports.&lt;/p&gt;

&lt;p&gt;The funds are not lost. But getting them into a working account has required a workaround that most programs did not implement, and most users could not perform. SIMD-0312 replaces the workaround with one instruction.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Creating a Funded Address Failed
&lt;/h2&gt;

&lt;p&gt;Solana's &lt;code&gt;CreateAccount&lt;/code&gt; instruction does three things at once: allocates space, assigns an owner program, and transfers the initial lamports from a funder. It was written with a strict precondition: the target must be empty — zero lamports, zero data, owned by the system program. A target with a non-zero balance fails the check, and the instruction errors.&lt;/p&gt;

&lt;p&gt;The precondition exists for a reason. It stops one party from pre-loading an account another party expects to initialise, and it makes the "fresh account" invariant something programs can rely on. But it also means the ordinary human act of sending money to an address slightly too early bricks the creation path.&lt;/p&gt;

&lt;p&gt;The workaround was a three-instruction dance: &lt;code&gt;Allocate&lt;/code&gt; space, &lt;code&gt;Assign&lt;/code&gt; the owner, then &lt;code&gt;Transfer&lt;/code&gt; the top-up. It works, it is fiddly, and it requires the creating program to anticipate the case. Most did not.&lt;/p&gt;




&lt;h2&gt;
  
  
  What SIMD-0312 Adds
&lt;/h2&gt;

&lt;p&gt;A new system instruction, &lt;code&gt;CreateAccountAllowPrefund&lt;/code&gt;, that does what its name says: creates the account whether or not the address already holds lamports. If the address has been prefunded, the existing balance counts toward the requested amount; the funder tops up only the difference, if any.&lt;/p&gt;

&lt;p&gt;Two details from the implementation that anyone building on it needs:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Account order is reversed&lt;/strong&gt; — new account = index 0, funder = index 1&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When requested lamports = 0&lt;/strong&gt; — only one account is required: the target&lt;/p&gt;

&lt;p&gt;The reversal matters because it is the opposite of &lt;code&gt;CreateAccount&lt;/code&gt;, and a transposed pair of accounts is the kind of mistake that compiles, passes a happy-path test, and fails on the first prefunded address in production. And when the address is already fully funded there is no funder to reference, because nothing is being transferred.&lt;/p&gt;

&lt;p&gt;It is gated by a feature, &lt;code&gt;create_account_allow_prefund&lt;/code&gt;, which activated on mainnet on 29 May 2026 (epoch 979, slot 422,928,004).&lt;/p&gt;




&lt;h2&gt;
  
  
  Who This Fixes, and Who It Does Not Fix By Itself
&lt;/h2&gt;

&lt;p&gt;The instruction is a tool for programs and wallets, not a button a user presses. Nothing changes for a stranded deposit until the software that owns the address adopts it. So:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Deposit systems&lt;/strong&gt; — exchanges, payment processors, anything that hands out addresses before creating accounts — can now create the account after the money arrives, in one instruction, with no special path. The pattern "give the customer an address, let them fund it, create-and-claim later" becomes cheap and safe.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Program-derived addresses&lt;/strong&gt; — vaults, escrows, per-user state accounts — can be funded by a user before the program initialises them, and the program's init can succeed anyway.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Users&lt;/strong&gt; with SOL sitting at an uncreated address are still dependent on whoever controls the creation path. The difference is that the fix on that side is now trivial, which is the strongest argument for it happening.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Invariant That Changes
&lt;/h2&gt;

&lt;p&gt;The "fresh account" guarantee weakens slightly. A program that uses &lt;code&gt;CreateAccountAllowPrefund&lt;/code&gt; must be written to tolerate a target with a pre-existing balance — which is the whole point — and must not assume the lamports it sees were put there by its funder. For most programs that is harmless. For a program whose logic depends on the exact initial balance, it is a case to handle deliberately: &lt;strong&gt;read the balance after creation, not the amount you asked for.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The classic &lt;code&gt;CreateAccount&lt;/code&gt; keeps its strict behaviour. Programs that want the old invariant keep using it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What It Does Not Do
&lt;/h2&gt;

&lt;p&gt;It does not recover SOL sent to a &lt;em&gt;wrong&lt;/em&gt; address. If the address was mistyped, or belongs to someone else, or is an address nobody controls, the instruction is irrelevant; there is no account to create on your behalf.&lt;/p&gt;

&lt;p&gt;It does not apply to token accounts. Associated token accounts have had their own tolerant creation path for a long time; this is about system-owned accounts and program-derived ones.&lt;/p&gt;

&lt;p&gt;And it does not fire on its own. The gate has been active on mainnet since 29 May 2026, but until the program in question uses the instruction, a prefunded address is exactly as stuck as it was before.&lt;/p&gt;




&lt;h2&gt;
  
  
  Prefunded Addresses: Questions People Actually Ask
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why does Solana fail to create an account that already has SOL?
&lt;/h3&gt;

&lt;p&gt;The classic CreateAccount instruction requires an empty target: zero lamports, zero data, system-owned. A balance sent early fails that check and the creation errors.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does SIMD-0312 change?
&lt;/h3&gt;

&lt;p&gt;It adds CreateAccountAllowPrefund, a system instruction that creates the account and counts any existing balance toward the requested amount, so the funder only tops up the difference.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I recover SOL I sent to an uncreated Solana address?
&lt;/h3&gt;

&lt;p&gt;The SOL is at the address. Whoever controls creation of that address can now create the account in one instruction; if it is a seed-derived address under your own key, you can allocate and assign it yourself.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does SIMD-0312 apply to token accounts?
&lt;/h3&gt;

&lt;p&gt;No. Associated token accounts already tolerate prefunding through their own creation path. This instruction is for system-owned and program-derived accounts.&lt;/p&gt;




&lt;h2&gt;
  
  
  If You Have SOL at an Address That Does Not Exist
&lt;/h2&gt;

&lt;p&gt;Find out who controls creation of that address. If it is a program, the fix is one instruction on their side, live on mainnet since 29 May 2026. If it is a seed-derived address under your own key, you can allocate and assign it yourself today, and the top-up is already there.&lt;/p&gt;

&lt;p&gt;If you build software that hands out addresses: adopt the new instruction now; the gate has been live since 29 May 2026. The support tickets you stop receiving are the measure of the change.&lt;/p&gt;

&lt;p&gt;— The Gate Is Live on Mainnet —&lt;/p&gt;

&lt;h3&gt;
  
  
  The instruction exists. The question is which cluster has it.
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;create_account_allow_prefund&lt;/code&gt; activated on mainnet at the epoch 979 boundary on 29 May 2026, after 95% of stake adopted it. The upgrades tracker reads the feature-gate accounts from the chain every minute and shows the state per cluster.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.xroot.dev/upgrades?ref=blog" rel="noopener noreferrer"&gt;Open the Upgrades Tracker ↗&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Two neighbours to this problem: SOL that vanishes en route rather than on arrival is &lt;a href="https://xroot.dev/blog/solana-transaction-dropped-no-error" rel="noopener noreferrer"&gt;a different failure with seven causes&lt;/a&gt;, and SOL sitting in accounts you already control is &lt;a href="https://xroot.dev/blog/solana-rent-surplus-nonce-stake-vote-accounts" rel="noopener noreferrer"&gt;the rent surplus left by the rent cut&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Instruction behaviour read from the Agave validator source at commit &lt;code&gt;beee69b958&lt;/code&gt;: &lt;code&gt;programs/system/src/system_processor.rs&lt;/code&gt; and &lt;code&gt;feature-set/src/lib.rs&lt;/code&gt;.&lt;/p&gt;

</description>
      <category>solana</category>
      <category>simd0312</category>
      <category>systemprogram</category>
      <category>deposits</category>
    </item>
    <item>
      <title>Token Balances That Change Without a Transaction on Solana</title>
      <dc:creator>Suliman Mokhtar</dc:creator>
      <pubDate>Fri, 18 Sep 2026 15:33:13 +0000</pubDate>
      <link>https://dev.to/sulimanmukhtar/token-balances-that-change-without-a-transaction-on-solana-1006</link>
      <guid>https://dev.to/sulimanmukhtar/token-balances-that-change-without-a-transaction-on-solana-1006</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://xroot.dev/blog/token-2022-balances-change-without-transaction" rel="noopener noreferrer"&gt;xroot.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;You hold a token. You did not trade, transfer, stake or touch it. Your balance is different this morning than it was last night, and there is no transaction in your history to explain it.&lt;/p&gt;

&lt;p&gt;On Solana that is not a hack and not a display bug. It is one of two Token-2022 extensions doing exactly what they were built for: making the number a wallet shows depend on &lt;strong&gt;time&lt;/strong&gt;, not on transactions. The raw amount in your account never changed. The interpretation of it did. Here is what the node computes, where the number comes from, why every tax tool and most archives get it wrong, and how to read your own balance correctly.&lt;/p&gt;




&lt;h2&gt;
  
  
  Two Extensions, One Idea: The Display Is a Function of the Clock
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Interest-bearing mints&lt;/strong&gt; carry a rate, in basis points per year, and a timestamp. The raw token amount is fixed; the displayed amount is the raw amount compounded continuously at the rate since the mint's initialisation, with a separate average rate for periods before the last rate change. Nothing accrues on chain. The "interest" is a formula applied at display time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scaled-UI-amount mints&lt;/strong&gt; carry a multiplier, and optionally a scheduled new multiplier with the timestamp at which it takes effect. The displayed amount is the raw amount times the multiplier in force now. A stock-split token, a rebasing wrapper, a share class with a periodic revaluation — all one multiplier field.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In both cases, the on-chain balance in your token account is a plain integer that &lt;strong&gt;only transactions change&lt;/strong&gt;. The extension tells readers how to present it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What the Node Actually Does When You Ask
&lt;/h2&gt;

&lt;p&gt;When an RPC serves a parsed token account, a token supply, or a token account balance for one of these mints, it reads the extension config from the mint and evaluates it against &lt;strong&gt;the node's own clock&lt;/strong&gt; — the bank's current unix timestamp. The same account, queried a minute apart, returns a different display amount. Queried from two nodes whose clocks differ by a slot — 300 ms at today's mainnet slot time, 250 ms from epoch 1037 — it can return two different amounts at the same moment.&lt;/p&gt;

&lt;p&gt;The node also refuses to give you a floating-point shortcut. The parsed balance carries a &lt;code&gt;uiAmount&lt;/code&gt; field that is a nullable number, and for interest-bearing and scaled mints it is &lt;strong&gt;null&lt;/strong&gt;. The lossless fields are &lt;code&gt;amount&lt;/code&gt; (the raw integer) and &lt;code&gt;uiAmountString&lt;/code&gt; (the server's decimal rendering). Any code that does arithmetic on &lt;code&gt;uiAmount&lt;/code&gt; has a null at exactly the mints where the number matters most; any code that recomputes the string from amount and decimals locally gets the plain, un-scaled value and is simply wrong.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Worth knowing:&lt;/strong&gt; the interest rate is a signed 16-bit integer. &lt;strong&gt;Negative rates are representable.&lt;/strong&gt; A mint can be configured so that the displayed balance of every holder declines over time, with no transfer, no burn and no event in anyone's history. It is a legitimate instrument for some products and an unlabelled drain in others.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why Archives and Tax Tools Get It Wrong
&lt;/h2&gt;

&lt;p&gt;The historical record compounds the problem.&lt;/p&gt;

&lt;p&gt;The archive that backs long-tail transaction history stores token balances by regenerating the decimal string from amount and decimals on read, and stores a null &lt;code&gt;uiAmount&lt;/code&gt; as &lt;strong&gt;0.0&lt;/strong&gt;. Every product that reconstructs a wallet's history from the archive sees the un-scaled amount for these mints, and sees zero where the node said "not representable". Cost-basis tools, portfolio trackers and explorers that lean on archived history will present a balance for these tokens that never existed.&lt;/p&gt;

&lt;p&gt;The live node gets it right because it evaluates the extension against the clock. The archive cannot, because it stored the answer to a question whose answer changes with time.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Means for Three Kinds of People
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Holders.&lt;/strong&gt; Your balance did not move; its label did. If the token is interest-bearing, the rate is on the mint and you can read it. If it is scaled, the multiplier and any scheduled change are on the mint too — including a &lt;em&gt;future&lt;/em&gt; multiplier with the timestamp it takes effect, which is the closest thing Solana has to a pre-announced rebase.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Traders.&lt;/strong&gt; Price a position off &lt;code&gt;amount&lt;/code&gt; and the current multiplier or rate, never off a cached display amount. A quote built on a stale display is a quote for the wrong quantity.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Anyone doing tax or accounting.&lt;/strong&gt; Every "balance changed" moment for these mints is a valuation change, not a transaction, and the archive-derived history you export will not show it. The raw amount and the extension config at each date are the only honest inputs.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  How to Read the Mint Yourself
&lt;/h2&gt;

&lt;p&gt;Fetch the mint account with parsed encoding. In its extensions you will find either the interest-bearing config — current rate, pre-update average rate, initialisation and last-update timestamps — or the scaled-UI config — current multiplier, new multiplier, and the effective timestamp of the new one. Those fields, plus your raw amount, produce your display balance at any moment you choose, on any machine.&lt;/p&gt;

&lt;p&gt;If the parsed mint shows an extension the decoder cannot name, your reader is older than the mint; &lt;a href="https://xroot.dev/blog/token-2022-pausable-permissioned-burn" rel="noopener noreferrer"&gt;update it before trusting anything it displays&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Time-Varying Balances: Questions People Actually Ask
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why did my Solana token balance change without a transaction?
&lt;/h3&gt;

&lt;p&gt;The mint is interest-bearing or uses a scaled UI amount. Your raw balance is unchanged; the displayed amount is computed from a rate or multiplier against the current time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does uiAmount come back null for some Solana tokens?
&lt;/h3&gt;

&lt;p&gt;The node refuses to give a floating-point value for mints whose display depends on time. Use amount (the raw integer) and uiAmountString (the server’s rendering) instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can an interest-bearing token have a negative rate?
&lt;/h3&gt;

&lt;p&gt;Yes. The rate is a signed 16-bit value, so the displayed balance of every holder can decline over time with no transfer or burn in anyone’s history.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does my portfolio tracker show the wrong balance for these tokens?
&lt;/h3&gt;

&lt;p&gt;Archived history regenerates the display from the raw amount and decimals, and stores a null display as zero. Only a live node evaluating the extension against the clock returns the right number.&lt;/p&gt;




&lt;h2&gt;
  
  
  The One Habit That Avoids Every Error Above
&lt;/h2&gt;

&lt;p&gt;Treat &lt;code&gt;amount&lt;/code&gt; as the balance and everything else as presentation. The raw integer is what you own; the rate or multiplier is how the issuer has asked it to be shown today. Read both, compute the display when you need it, and never store the display as if it were a fact about the account.&lt;/p&gt;

&lt;p&gt;— The Rate Is On the Mint —&lt;/p&gt;

&lt;h3&gt;
  
  
  Read the extension before you price the position.
&lt;/h3&gt;

&lt;p&gt;The token audit reads a mint's extensions and authorities straight from the chain — including the interest rate or multiplier that decides what your displayed balance will be tomorrow, and whether it can go down.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.xroot.dev/token-audit?ref=blog" rel="noopener noreferrer"&gt;Audit a Token ↗&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another Token-2022 capability hides the amount entirely rather than restating it — &lt;a href="https://xroot.dev/blog/solana-confidential-transfers-native-vs-rings" rel="noopener noreferrer"&gt;confidential transfers&lt;/a&gt; — and it has its own rules about what a reader can and cannot see.&lt;/p&gt;

&lt;p&gt;RPC behaviour read from the Agave validator source at commit &lt;code&gt;beee69b958&lt;/code&gt;: &lt;code&gt;rpc/src/parsed_token_accounts.rs&lt;/code&gt;, &lt;code&gt;account-decoder/src/parse_token_extension.rs&lt;/code&gt; and the archive's stored-token-amount type in &lt;code&gt;storage-proto&lt;/code&gt;. Field names move between RPC versions — check the current docs before writing against them.&lt;/p&gt;

</description>
      <category>solana</category>
      <category>token2022</category>
      <category>rpc</category>
      <category>accounting</category>
    </item>
    <item>
      <title>Token-2022’s New Extensions: Pausable and Permissioned Burn</title>
      <dc:creator>Suliman Mokhtar</dc:creator>
      <pubDate>Fri, 18 Sep 2026 15:33:11 +0000</pubDate>
      <link>https://dev.to/sulimanmukhtar/token-2022s-new-extensions-pausable-and-permissioned-burn-38j</link>
      <guid>https://dev.to/sulimanmukhtar/token-2022s-new-extensions-pausable-and-permissioned-burn-38j</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://xroot.dev/blog/token-2022-pausable-permissioned-burn" rel="noopener noreferrer"&gt;xroot.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The post on &lt;a href="https://xroot.dev/blog/solana-permissioned-tokens-token-acl" rel="noopener noreferrer"&gt;permissioned tokens&lt;/a&gt; explained Token ACL: an allowlist that is a compliance feature when a regulated issuer runs it and a honeypot when an anonymous deployer does. The same year that program shipped, Token-2022 gained two extensions with the same double edge. &lt;strong&gt;Pausable&lt;/strong&gt; lets an authority halt every transfer, mint and burn on a mint. &lt;strong&gt;Permissioned Burn&lt;/strong&gt; puts a gate on who may destroy tokens.&lt;/p&gt;

&lt;p&gt;Both are legitimate, both are on mainnet, and both appear in the validator's own account decoder — which is how you can tell whether the RPC you are reading even knows they exist. Here is what each one does, why regulated issuers asked for them, and the three questions that separate a compliance control from a trap.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pausable: One Authority Stops the Mint
&lt;/h2&gt;

&lt;p&gt;The Pausable extension adds a pause authority and a paused flag to a mint. When paused, the token program rejects transfers, mints and burns on that mint. Account creation and closing still work; balances do not move.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why an issuer wants it:&lt;/strong&gt; an exchange-listed stablecoin with a court order, a fund token during a redemption freeze, a security token under a trading halt. Every one of those is a legal requirement in the issuer's jurisdiction, and before the extension they were implemented with freeze authority applied account by account — slow, leaky and impossible to reverse cleanly. Pause is the same power, applied once, reversed once.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Why a buyer fears it:&lt;/strong&gt; paused is "you cannot sell", and there is no difference at the program level between a regulated halt and a rug pull. The mechanism is identical. The difference is entirely in who holds the authority and whether that identity is accountable.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Permissioned Burn: The Gate on Destruction
&lt;/h2&gt;

&lt;p&gt;Burning a token normally requires only the holder's signature. On a mint with the Permissioned Burn extension the token program rejects the standard burn instruction outright, and the extension's own burn instruction requires two signers: the holder (or their delegate) and the burn authority configured on the mint. If that authority is set to none, the program sends you back to the standard burn. Supply cannot be reduced by holders acting alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why an issuer wants it:&lt;/strong&gt; a tokenised asset whose supply is meant to track a real-world reserve cannot let holders destroy units at will — a burned token would strand its backing. Redemptions are meant to go through the issuer, who burns against a redemption. The extension makes the token's supply an issuer-controlled number in both directions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it matters to a holder:&lt;/strong&gt; less than Pausable. A permissioned burn does not stop you selling. It stops you burning, which most holders never do. But it is another authority on the mint, and every authority is a question.&lt;/p&gt;




&lt;h2&gt;
  
  
  Your RPC May Not Be Able to See Them
&lt;/h2&gt;

&lt;p&gt;The validator's account decoder is what turns a mint's raw bytes into the JSON your wallet reads. It recognises both extensions by name. But it has a rule for extensions it does not know: it emits an entry called &lt;strong&gt;unparseable extension&lt;/strong&gt; rather than failing. A wallet or explorer running against an older node, or using an older client library, will show a mint with an unnamed extension and no detail.&lt;/p&gt;

&lt;p&gt;That is the tell to watch for. A mint whose decoded output contains an unparseable extension has a capability newer than the software reading it. Until the reader is updated, nobody using it can say what that capability is — and "I do not know what this authority does" is not a state to buy in.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Three Questions That Separate Compliance From a Trap
&lt;/h2&gt;

&lt;p&gt;The audit page on this site runs these for every mint it checks, and the logic is short enough to run by hand.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Who holds the authority?&lt;/strong&gt; A pause or permissioned-burn authority held by a named issuer's known key, a multisig with published signers, or a program with published rules is a control. The same authority held by a fresh wallet with no history is a switch in an anonymous hand.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Does the token have an allowlist, and is it the same operator?&lt;/strong&gt; A regulated token almost always carries Token ACL or a transfer hook with an on-chain policy alongside the pause authority. A pausable mint with no other compliance structure, launched on a memecoin launchpad, is the pattern to walk away from.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Can the authority be removed, and has the issuer said whether it will?&lt;/strong&gt; Both extensions allow the authority to be set to none. An issuer that documents when and why it would pause, and what would make it renounce, is telling you the control is a control. Silence is an answer too.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Worth knowing: the platform behind this site will build permissioned tokens for issuers and will not build pause-then-rug configurations for anyone. That line is drawn on the same three questions; it is not a matter of technology.&lt;/p&gt;




&lt;h2&gt;
  
  
  For Issuers: The Honest Way to Hold These
&lt;/h2&gt;

&lt;p&gt;If you are launching a token that legitimately needs a pause or a burn gate, the extensions are the right tool, and the way to avoid being mistaken for a rug is disclosure at the mint level, not in a chat pin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Hold the authority in a multisig or a program, never a hot key.&lt;/li&gt;
&lt;li&gt;  Pair it with an &lt;a href="https://app.xroot.dev/solana/launch-permissioned-token?ref=blog" rel="noopener noreferrer"&gt;allowlist or hook that encodes the policy&lt;/a&gt;, so the audit can see a compliance structure rather than a lone switch.&lt;/li&gt;
&lt;li&gt;  Publish the conditions under which you would pause, and the conditions under which the authority is renounced.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The audit reads on-chain state. Make the state tell the truth.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pausable and Permissioned Burn: Questions People Actually Ask
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What does the Token-2022 Pausable extension do?
&lt;/h3&gt;

&lt;p&gt;A pause authority can halt every transfer, mint and burn on the mint at once, and unpause the same way. Balances do not move while paused; account creation and closing still work.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does the Permissioned Burn extension do?
&lt;/h3&gt;

&lt;p&gt;It moves burning behind a mint authority. On a mint with the extension the standard burn instruction is rejected, and the extension’s own burn needs two signers: the holder (or delegate) and the mint’s burn authority. Set the authority to none and ordinary burns work again. It is used where supply must track a real-world reserve and redemptions go through the issuer.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does my explorer show “unparseable extension” on a Solana mint?
&lt;/h3&gt;

&lt;p&gt;The node or client library reading the mint is older than the extension. The mint has a capability the reader cannot name; update the reader before trusting the display.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is a pausable token a scam?
&lt;/h3&gt;

&lt;p&gt;Not by itself. The mechanism is the same for a regulated halt and a rug. What separates them is who holds the authority, whether it sits beside an allowlist or hook that encodes a policy, and whether the issuer has said when it would pause and renounce.&lt;/p&gt;




&lt;h2&gt;
  
  
  Before You Hold a Token With Either Extension
&lt;/h2&gt;

&lt;p&gt;Read the mint, not the website. Both extensions appear in the decoded mint data if your reader is current; if it shows an unparseable extension, update the reader before you decide anything.&lt;/p&gt;

&lt;p&gt;Then ask the three questions. A named authority with a policy is a token you may choose to hold under its rules. An anonymous authority with none is a token whose exit is not yours to control.&lt;/p&gt;

&lt;p&gt;— The Mint Tells You, If You Read It —&lt;/p&gt;

&lt;h3&gt;
  
  
  Every authority on a mint is a question. The audit asks all of them.
&lt;/h3&gt;

&lt;p&gt;The token audit reads a mint's extensions, authorities, supply and holder concentration straight from the chain — including the extensions an out-of-date explorer can only show you as "unparseable".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.xroot.dev/token-audit?ref=blog" rel="noopener noreferrer"&gt;Audit a Token ↗&lt;/a&gt;&lt;a href="https://app.xroot.dev/solana/launch-permissioned-token?ref=blog" rel="noopener noreferrer"&gt;Launch a permissioned token&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A different pair of extensions makes a balance move with no transaction at all — &lt;a href="https://xroot.dev/blog/token-2022-balances-change-without-transaction" rel="noopener noreferrer"&gt;interest-bearing and scaled-UI mints&lt;/a&gt; — and they are worth reading before you price anything issued under Token-2022.&lt;/p&gt;

&lt;p&gt;Decoder behaviour read from the Agave validator source at commit &lt;code&gt;beee69b958&lt;/code&gt;: &lt;code&gt;account-decoder/src/parse_token_extension.rs&lt;/code&gt;. The semantics of Permissioned Burn described above — the standard burn rejected, the extension's own burn requiring both the holder and the mint's burn authority, and the fall back to the standard burn when that authority is none — were read from the Token-2022 program source and checked against mainnet on 17 September 2026.&lt;/p&gt;

</description>
      <category>solana</category>
      <category>token2022</category>
      <category>rwa</category>
      <category>security</category>
    </item>
    <item>
      <title>SIMD-0500 Will Block Making Old Programs Immutable</title>
      <dc:creator>Suliman Mokhtar</dc:creator>
      <pubDate>Fri, 18 Sep 2026 15:33:08 +0000</pubDate>
      <link>https://dev.to/sulimanmukhtar/simd-0500-will-block-making-old-programs-immutable-8p</link>
      <guid>https://dev.to/sulimanmukhtar/simd-0500-will-block-making-old-programs-immutable-8p</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://xroot.dev/blog/solana-legacy-programs-cannot-be-made-immutable-simd-0500" rel="noopener noreferrer"&gt;xroot.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;"Revoke the upgrade authority" is the last line of every honest token launch checklist and the first thing an auditor looks for. It is the on-chain promise that the code holding your money will never change. It has always been one instruction: set the program's upgrade authority to none, and the program is frozen forever.&lt;/p&gt;

&lt;p&gt;For a class of programs, that instruction will fail once SIMD-0500 activates; as of 17 September 2026 the gate exists in the validator but has not activated on mainnet. SIMD-0500 will stop old bytecode formats from being &lt;strong&gt;deployed&lt;/strong&gt;, and as part of that rule the loader will refuse to freeze a program whose bytecode is one of those old formats. A creator who built with a toolchain from a couple of years ago, never touched the program since, and leaves the renounce until after the gate activates cannot do it — until they rebuild, upgrade, and only then renounce.&lt;/p&gt;

&lt;p&gt;Here is the rule from the loader source, who it catches, the other loader rule that changed alongside it, and what an audit should now show.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Rule
&lt;/h2&gt;

&lt;p&gt;Solana programs are compiled to SBPF, and SBPF has versions: v0, v1, v2, and the current v3. The feature &lt;code&gt;disable_sbpf_v0_v1_v2_deployment&lt;/code&gt;, once it activates, makes the upgradeable loader reject any &lt;strong&gt;new deployment or upgrade&lt;/strong&gt; whose ELF is not v3. Old programs keep executing; they just cannot be redeployed as they are.&lt;/p&gt;

&lt;p&gt;The part that surprises people is in the authority path. When that gate is active and a &lt;code&gt;SetAuthority&lt;/code&gt; instruction asks to set the authority to &lt;strong&gt;none&lt;/strong&gt;, the loader reads the program's bytecode version first. If it is below v3, the instruction fails with an invalid-account-data error. The reasoning is consistent: a program that could never be redeployed in its current form must not be frozen in that form either, because freezing it would strand it on a format the network is retiring.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The immutability instruction becomes &lt;strong&gt;conditional on the bytecode being current.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Who This Catches
&lt;/h2&gt;

&lt;p&gt;Anyone with a deployed program built before the v3 toolchain who has not upgraded since. That describes a large share of the long tail: token launches from 2023 and 2024 with a custom program, NFT projects, small DeFi protocols, games. Many of them intended to renounce eventually and never got round to it.&lt;/p&gt;

&lt;p&gt;It also catches the honest-but-late: a team that goes to freeze the program as a trust signal after the gate activates, and discovers the instruction fails.&lt;/p&gt;

&lt;p&gt;The fix is not hard, but from then on it is not one instruction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Rebuild the program with a current toolchain, producing v3 bytecode.&lt;/li&gt;
&lt;li&gt;  Upgrade the program with the new build. The upgrade spills the old program-data's excess lamports and the buffer's balance to your spill account and leaves the buffer as a 37-byte husk holding rent.&lt;/li&gt;
&lt;li&gt;  Then set the authority to none.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Three transactions, in that order, at least one slot apart — the loader rejects a second mutation of the same program in the same slot.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Other Loader Rule That Changed: Extends
&lt;/h2&gt;

&lt;p&gt;Programs need more space over time, and &lt;code&gt;ExtendProgram&lt;/code&gt; grows the program-data account. Two things about it are worth knowing now.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;It is permissionless.&lt;/strong&gt; The loader passes no authority check on extend; anyone can grow anyone's program-data account, paying the rent for the extra bytes themselves. A checked variant existed and was removed. This is old behaviour, but it is newly relevant because of the second point.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;It has a minimum.&lt;/strong&gt; Under SIMD-0431 an extend must add at least &lt;strong&gt;10,240 bytes&lt;/strong&gt;, unless the program is within 10 KiB of the 10 MiB size cap, in which case it must add exactly the remaining headroom. Incremental extends of a few hundred bytes — the habit of many deploy scripts that grow the account to fit each new build — now fail, and the fix is to extend in 10 KiB steps or size the account generously up front.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And extends &lt;strong&gt;still accept old bytecode&lt;/strong&gt;. The source comment is explicit: the deployment gate is deliberately not applied to extend, so a legacy program can still be grown once it can no longer be redeployed or frozen.&lt;/p&gt;




&lt;h2&gt;
  
  
  What "Immutable" Should Mean in an Audit Now
&lt;/h2&gt;

&lt;p&gt;An audit that reports "upgrade authority: none" is reporting a fact about programs that &lt;em&gt;could&lt;/em&gt; reach that state. For programs that cannot, the report needs a second field: &lt;strong&gt;bytecode version&lt;/strong&gt;. Once the gate activates, a v0, v1 or v2 program with a live authority is not "not yet renounced"; it is "cannot be renounced without a rebuild", and the difference is material to anyone deciding whether to trust it.&lt;/p&gt;

&lt;p&gt;The token audit on this site reads the program-data account behind any program a token depends on. The version of the bytecode is in the first bytes of it, and the audit will say when a program is in the stranded state rather than implying the team simply has not pressed the button.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Smaller Rules That Arrive With the Same Gate
&lt;/h2&gt;

&lt;p&gt;Deploying will also de-register the old allocator symbol, &lt;code&gt;sol_alloc_free_&lt;/code&gt;, so programs that depend on it load at runtime but cannot be deployed. The deploy verifier is stricter than the executor — it rejects broken ELFs that the runtime would tolerate — which means "it runs on mainnet" is not evidence that "it will redeploy".&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Execution of old bytecode is a &lt;strong&gt;separate question with its own gates&lt;/strong&gt;, and in the current build those gates are placeholders. Old programs keep running. The gate discussed here is about deployment and freezing, not execution.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Program Immutability: Questions People Actually Ask
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Why does setting my Solana program’s upgrade authority to none fail?
&lt;/h3&gt;

&lt;p&gt;Once SIMD-0500 activates — it had not activated on mainnet as of 17 September 2026 — the loader refuses to freeze a program whose bytecode is SBPF v0, v1 or v2. Rebuild with a current toolchain, upgrade, then set the authority to none.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do old Solana programs stop running under SIMD-0500?
&lt;/h3&gt;

&lt;p&gt;No. The gate blocks new deployments and upgrades of old bytecode, and freezing it. Execution is governed by separate gates that are placeholders in the current build.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can anyone extend my Solana program’s size?
&lt;/h3&gt;

&lt;p&gt;Yes. ExtendProgram carries no authority check; the caller pays the rent for the added bytes. Extends must now add at least 10,240 bytes unless the program is within 10 KiB of the 10 MiB cap.&lt;/p&gt;

&lt;h3&gt;
  
  
  How should an audit report a legacy Solana program?
&lt;/h3&gt;

&lt;p&gt;With the bytecode version next to the authority. Once SIMD-0500 activates, a v0–v2 program with a live authority cannot be renounced without a rebuild, which is a different state from a team that has not renounced yet.&lt;/p&gt;




&lt;h2&gt;
  
  
  If You Hold a Program's Upgrade Authority
&lt;/h2&gt;

&lt;p&gt;Check the bytecode version of every program you control. If it is below v3, you can still renounce it today, and you will not be able to once the gate activates, so plan the rebuild-upgrade-renounce sequence rather than discovering the failure in front of your community.&lt;/p&gt;

&lt;p&gt;If you audit programs, report the version alongside the authority. "None" and "cannot be set to none" are different states, and the second one is about to become common.&lt;/p&gt;

&lt;p&gt;And if you are extending a program, extend in 10 KiB steps. The one-byte top-up era is over.&lt;/p&gt;

&lt;p&gt;— Authority Is Half the Answer —&lt;/p&gt;

&lt;h3&gt;
  
  
  Read the bytecode version next to it.
&lt;/h3&gt;

&lt;p&gt;The token audit reads the program-data account behind the programs a mint depends on, straight from the chain — the authority, and the version that decides whether that authority can ever be given up.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.xroot.dev/token-audit?ref=blog" rel="noopener noreferrer"&gt;Audit a Token ↗&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A different kind of program change is happening at the same time: &lt;a href="https://xroot.dev/blog/spl-token-p-token-replaced-in-place" rel="noopener noreferrer"&gt;SPL Token is being replaced in place&lt;/a&gt; and ends up with no upgrade authority at all. And the lamports an upgrade spills back to you are part of &lt;a href="https://xroot.dev/blog/solana-rent-surplus-nonce-stake-vote-accounts" rel="noopener noreferrer"&gt;the wider rent surplus&lt;/a&gt; sitting in old accounts.&lt;/p&gt;

&lt;p&gt;Loader behaviour read from the Agave validator source at commit &lt;code&gt;beee69b958&lt;/code&gt;: &lt;code&gt;programs/bpf_loader/src/lib.rs&lt;/code&gt; and &lt;code&gt;feature-set/src/lib.rs&lt;/code&gt;. On 17 September 2026 the deployment gate had not activated on mainnet; the rules above describe the validator's behaviour once it does. Check the tracker before relying on either rule.&lt;/p&gt;

</description>
      <category>solana</category>
      <category>simd0500</category>
      <category>programs</category>
      <category>security</category>
    </item>
    <item>
      <title>Confidential Transfers Have a Kill Switch: What It Costs You</title>
      <dc:creator>Suliman Mokhtar</dc:creator>
      <pubDate>Fri, 18 Sep 2026 15:33:06 +0000</pubDate>
      <link>https://dev.to/sulimanmukhtar/confidential-transfers-have-a-kill-switch-what-it-costs-you-5h39</link>
      <guid>https://dev.to/sulimanmukhtar/confidential-transfers-have-a-kill-switch-what-it-costs-you-5h39</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://xroot.dev/blog/solana-confidential-transfers-kill-switch-proof-cost" rel="noopener noreferrer"&gt;xroot.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The post on &lt;a href="https://xroot.dev/blog/solana-confidential-transfers-native-vs-rings" rel="noopener noreferrer"&gt;what is native and what is a third-party layer&lt;/a&gt; drew the same follow-up in three different ways: &lt;em&gt;if the confidential features are native, can they be turned off?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Yes. Every confidential operation on a Token-2022 mint depends on one on-chain program, the ZK ElGamal proof program, and the validator carries two feature gates for it: one that disables it and one that re-enables it. Both switches have been used. This post is what each one does to a confidential balance, what a proof costs in compute and bytes, and why the biggest proofs need the new transaction format.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Program Underneath Every Confidential Operation
&lt;/h2&gt;

&lt;p&gt;A confidential transfer does not hide an amount by magic. The token program stores balances as ElGamal ciphertexts, and every operation that changes them — deposit into confidential form, transfer, withdraw back to plain — must be accompanied by zero-knowledge proofs that the amounts are well-formed: non-negative, within range, consistent between sender and receiver.&lt;/p&gt;

&lt;p&gt;The token program does not verify those proofs itself. It calls the ZK ElGamal proof program, a separate native program whose only job is proof verification. If that program is unavailable, no confidential operation can be completed, because the token program cannot confirm the proofs it is handed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That dependency is the kill switch.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Two Gates
&lt;/h2&gt;

&lt;p&gt;The validator's feature set carries &lt;code&gt;disable_zk_elgamal_proof_program&lt;/code&gt; and &lt;code&gt;reenable_zk_elgamal_proof_program&lt;/code&gt;, both live in the current feature snapshot. The first removes the proof program from the set the runtime will execute; the second puts it back. They are ordinary feature gates, activated at an epoch boundary after 95% of stake adopts each, and they have been used in that order once already. A flaw in the verifier's Fiat-Shamir transcript was found on 10 June 2025; the disable gate activated on 19 June 2025 at the start of epoch 805 (slot 347,760,000), and after audits the re-enable gate activated on 4 June 2026 at the start of epoch 982 (slot 424,224,000), with Token-2022 redeployed with its confidential instructions later that month. The proof program has been live on mainnet since that day, and as of 17 September 2026 the disable gate has not been used again.&lt;/p&gt;

&lt;p&gt;What "disabled" means for a holder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Plain balances are untouched.&lt;/strong&gt; A mint with the confidential-transfer extension still transfers, mints and burns normally in its public balance.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Confidential balances are frozen in place.&lt;/strong&gt; The ciphertexts remain in the account, provably yours, and no operation that needs a proof — including withdrawing back to a plain balance — can execute.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Pending confidential deposits stay pending.&lt;/strong&gt; Applying them needs a proof.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;"Re-enabled" restores all of it with no state migration; the ciphertexts were never modified.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Worth knowing:&lt;/strong&gt; an older program, the ZK Token Proof program, still exists as an address. It was never activated on any cluster and is now a stub that returns success while doing nothing and charging no compute. A transaction that calls it &lt;strong&gt;succeeds silently and proves nothing.&lt;/strong&gt; Tooling that still references it is verifying against a program that verifies nothing.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What a Proof Costs, in Compute
&lt;/h2&gt;

&lt;p&gt;The proof program charges a fixed compute-unit price per proof type, and the base instruction cost is zero. From the source:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Batched range proof, 64-bit&lt;/strong&gt; — 111,000 units&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Batched range proof, 128-bit&lt;/strong&gt; — 200,000 units&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Batched range proof, 256-bit&lt;/strong&gt; — 368,000 units&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public key validity&lt;/strong&gt; — 2,600 units&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero-ciphertext&lt;/strong&gt; — 6,000 units&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ciphertext-to-ciphertext equality&lt;/strong&gt; — 8,000 units&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ciphertext-to-commitment equality&lt;/strong&gt; — 6,400 units&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Percentage with cap (confidential fees)&lt;/strong&gt; — 6,500 units&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grouped-ciphertext validity, 2 / 3 handles&lt;/strong&gt; — 6,400 / 8,100 units&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Grouped-ciphertext validity, batched&lt;/strong&gt; — 13,000 / 16,400 units&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Closing a context-state account&lt;/strong&gt; — 3,300 units&lt;/p&gt;

&lt;p&gt;A confidential transfer needs several of these. The range proof dominates: a 256-bit batched range proof alone is over a quarter of the 1.4-million-unit per-transaction ceiling and about half a percent of an entire block — 0.49% of today's 75-million-unit block limit at 300 ms slots, and 0.59% of the 62.5 million that applies from epoch 1037, when slots drop to 250 ms. Compared with a plain token transfer of a few thousand units, a confidential one is two orders of magnitude more compute — and &lt;a href="https://xroot.dev/blog/solana-transaction-priority-formula-compute-limit" rel="noopener noreferrer"&gt;the priority-fee arithmetic, rank equals fee divided by requested cost&lt;/a&gt;, punishes that accordingly.&lt;/p&gt;




&lt;h2&gt;
  
  
  What a Proof Costs, in Bytes, and Why v1 Transactions Matter
&lt;/h2&gt;

&lt;p&gt;Proofs are large. A 64-bit range proof is &lt;strong&gt;672 bytes&lt;/strong&gt;; 128-bit is &lt;strong&gt;736&lt;/strong&gt;; 256-bit is &lt;strong&gt;800&lt;/strong&gt;. A transaction has historically been capped at 1,232 bytes total, including signatures, accounts and every other instruction. Fitting a transfer's full proof set into one legacy transaction was the reason confidential transfers were awkward to use at all.&lt;/p&gt;

&lt;p&gt;The program offers two workarounds and the network now offers a third:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Proof-in-account.&lt;/strong&gt; If the instruction data is exactly five bytes — a discriminator and an offset — the program reads the proof from an account instead of the instruction. You write the proof on chain first, verify against it, then close it.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Context-state accounts.&lt;/strong&gt; Verify a proof once into a dedicated account whose size must match the context exactly, reference that account from later instructions, and close it afterwards. Closing reassigns the account to the system program, so its address is reusable.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Transaction v1.&lt;/strong&gt; &lt;a href="https://xroot.dev/blog/solana-transaction-v1" rel="noopener noreferrer"&gt;The new format raises the ceiling to 4,096 bytes&lt;/a&gt;, enough to carry a full proof set inline. Confidential transfers are one of the explicit motivations in the proposal, and v1 activated on mainnet on 15 September 2026 (epoch 1035), so the multi-transaction dance is now optional.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each workaround leaves accounts behind. Context-state and proof accounts hold rent, and closing them returns it — a small, recurring reclaim that the confidential-transfer tooling of the future should do for its users automatically.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reading Your Own Balance
&lt;/h2&gt;

&lt;p&gt;A confidential balance is decryptable only by the holder's ElGamal key, and decrypting an ElGamal ciphertext is not a single operation: the implementation recovers the amount with a 32-bit baby-step giant-step search, with a precomputed table, bounded so that a phone can do it in around a second. Wallets that show a confidential balance instantly are showing a cached value. The honest number is the decrypted one, and it costs a moment.&lt;/p&gt;




&lt;h2&gt;
  
  
  Confidential Transfers: Questions People Actually Ask
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Can Solana confidential transfers be disabled?
&lt;/h3&gt;

&lt;p&gt;Yes. A feature gate removes the ZK ElGamal proof program, which every confidential operation depends on, and a second gate restores it. Both have been used: disabled on 19 June 2025 at the start of epoch 805, re-enabled on 4 June 2026 at the start of epoch 982.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens to my confidential balance if the proof program is disabled?
&lt;/h3&gt;

&lt;p&gt;It stays encrypted in your account and cannot be moved or withdrawn to a plain balance until the program is re-enabled. Plain balances on the same mint are unaffected.&lt;/p&gt;

&lt;h3&gt;
  
  
  How much compute does a Solana confidential transfer use?
&lt;/h3&gt;

&lt;p&gt;The range proof alone is 111,000 to 368,000 units depending on bit width, plus several smaller proofs. A plain token transfer is a few thousand units.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why do confidential transfers need transaction v1?
&lt;/h3&gt;

&lt;p&gt;A range proof is 672 to 800 bytes and a legacy transaction is capped at 1,232 bytes. Version 1 transactions allow 4,096 bytes, enough for a full proof set in one transaction.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to Decide Before Using a Confidential Balance
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Understand the dependency.&lt;/strong&gt; Your confidential balance is safe in either state of the switch, and inaccessible in one of them. If you need the ability to exit at any moment, keep part of the position plain.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Budget the compute.&lt;/strong&gt; A confidential transfer costs a hundred times a plain one in units; set the limit from a simulation and expect the fee to reflect the space.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Prefer v1 transactions, live on mainnet since 15 September 2026&lt;/strong&gt;, and reclaim the proof and context accounts either way.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;— Two Gates, One Consequence —&lt;/p&gt;

&lt;h3&gt;
  
  
  The day either flips, every confidential balance changes state at once.
&lt;/h3&gt;

&lt;p&gt;Both the disable and the re-enable gate are feature accounts like any other. The upgrades tracker reads them from the chain every minute and shows which state each cluster is in.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.xroot.dev/upgrades?ref=blog" rel="noopener noreferrer"&gt;Open the Upgrades Tracker ↗&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Compute prices and sizes read from the Agave validator source at commit &lt;code&gt;beee69b958&lt;/code&gt;: &lt;code&gt;programs/zk-elgamal-proof/src/lib.rs&lt;/code&gt; and &lt;code&gt;feature-set/src/lib.rs&lt;/code&gt;. The disable and re-enable dates are read from the two feature accounts on mainnet-beta, checked on 17 September 2026; the incident that prompted the sequence is covered in the native-vs-rings post.&lt;/p&gt;

</description>
      <category>solana</category>
      <category>privacy</category>
      <category>token2022</category>
      <category>zeroknowledge</category>
    </item>
    <item>
      <title>Alpenglow: Half of Every Vote Reward Goes to the Leader</title>
      <dc:creator>Suliman Mokhtar</dc:creator>
      <pubDate>Fri, 18 Sep 2026 15:33:05 +0000</pubDate>
      <link>https://dev.to/sulimanmukhtar/alpenglow-half-of-every-vote-reward-goes-to-the-leader-2k7j</link>
      <guid>https://dev.to/sulimanmukhtar/alpenglow-half-of-every-vote-reward-goes-to-the-leader-2k7j</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://xroot.dev/blog/alpenglow-vote-rewards-leader-split" rel="noopener noreferrer"&gt;xroot.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://xroot.dev/blog/solana-validator-block-revenue-sharing-two-commissions" rel="noopener noreferrer"&gt;post on validator commissions&lt;/a&gt; covered how a validator's cut is set. This is the next chapter, and it is less discussed than the commission changes because it is buried in consensus code rather than in a vote-account field.&lt;/p&gt;

&lt;p&gt;The alpenglow feature gate had not activated on mainnet as of 17 September 2026, so a validator still earns vote rewards by landing vote transactions, one per slot, paying a fee for each. Under Alpenglow there are no vote transactions. Votes are signed messages between validators, and the reward for a vote is paid only when a later leader &lt;strong&gt;certifies&lt;/strong&gt; it — and when it is paid, &lt;strong&gt;half goes to that leader&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This post is the reward pipeline as the validator implements it, with the constants, and what it does to the income of a validator and the delegators behind it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Per-Slot Reward, and Who Gets Which Half
&lt;/h2&gt;

&lt;p&gt;The validator computes each slot's inflation reward for a voting validator as:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;reward&lt;/strong&gt; — epoch reward budget × validator's stake ÷ (slots per epoch × total stake)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;validator reward&lt;/strong&gt; — reward ÷ 2&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;leader reward&lt;/strong&gt; — reward − validator reward&lt;/p&gt;

&lt;p&gt;The voter keeps half. The &lt;strong&gt;leader of the slot that certified the vote&lt;/strong&gt; keeps the other half, and any odd lamport rounds to the leader. Across an epoch a validator's income is therefore half of its own votes plus half of everyone's votes during the slots it led — and the second half scales with how often it leads, which scales with stake.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Worth knowing:&lt;/strong&gt; the pre-Alpenglow system running on mainnet today has a cruder rounding rule. When a vote reward splits between a validator and its delegators and either side would round to zero, the legacy code skips the reward entirely and does not advance the credits counter. Alpenglow's split hands the residual lamport to the voter instead. Small validators on the old system have been losing rounding dust for years; the new one stops that.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  You Are Paid Only If the Leader Eight Slots Later Says So
&lt;/h2&gt;

&lt;p&gt;A vote is not rewarded when it is cast. It is rewarded when it appears in a &lt;strong&gt;reward certificate&lt;/strong&gt;, and reward certificates are built by the leader of the slot &lt;strong&gt;eight slots&lt;/strong&gt; after the one you voted in. The leader of slot N assembles the certificates for slot N − 8 from the votes it has received, and ships its block whether or not those certificates are complete — the code uses a non-blocking request with a small queue rather than waiting.&lt;/p&gt;

&lt;p&gt;Two things follow for a validator's income:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Your vote has to reach the right leader in time.&lt;/strong&gt; Not the current leader — the one eight slots ahead. A validator whose votes propagate slowly, or whose connection to upcoming leaders is poor, votes correctly and is not paid.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;The leader has discretion of a kind.&lt;/strong&gt; It certifies the votes it has. It cannot invent votes, but a vote that arrives late is simply absent from the certificate and earns nothing. There is no appeal.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The votes themselves travel over a dedicated QUIC transport between validators, not through the transaction pipeline, so the fee that used to accompany every vote transaction disappears with it. Under Alpenglow the cost of voting is bandwidth, and the reward for voting depends on latency to leaders.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Epoch Budget Is Fixed On Chain Before the Epoch Starts
&lt;/h2&gt;

&lt;p&gt;The pool of SOL to be paid as vote rewards is computed at the start of the epoch and written into an on-chain account — a program-derived address under the Alpenglow program that stores the current and previous epoch's state. Every slot's payout draws from that fixed budget by the formula above. Nothing a validator does during the epoch changes the size of the pot; it only changes their share.&lt;/p&gt;

&lt;p&gt;After the migration the vote account's historical "epoch credits" field stops counting votes and starts counting &lt;strong&gt;reward lamports&lt;/strong&gt;. The runtime pushes a sentinel row at the migration epoch to mark the change. Any tool that reads epoch credits as a performance metric will see a nonsense value at the boundary and lamports afterwards — a silent unit change that every staking dashboard will have to handle.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Admission Filter Runs Twice
&lt;/h2&gt;

&lt;p&gt;The post on &lt;a href="https://xroot.dev/blog/alpenglow-validator-admission-2000-seats" rel="noopener noreferrer"&gt;the 2,000-seat cap&lt;/a&gt; covers who gets to vote. The same filter runs again at reward time: a vote account that fails the admission test — no BLS key, zero stake, balance below rent plus one epoch's ticket after subtracting pending delegator rewards — is excluded from reward distribution as well as from consensus. For a delegator this compounds: a validator that slips out of the set does not just stop voting, it stops earning for the epoch, and so do you.&lt;/p&gt;




&lt;h2&gt;
  
  
  What This Does to Delegator Income
&lt;/h2&gt;

&lt;p&gt;Your validator's inflation income becomes two streams: half of its own vote rewards, and half of the vote rewards of every validator during its leader slots. Both are then subject to the inflation commission it charges you. A validator with more stake leads more often and collects more of the second stream — the reward curve bends further toward large validators than it does today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connectivity becomes yield.&lt;/strong&gt; Two validators with identical stake and commission will earn differently if one reaches the next leaders faster. The metric that predicts it — how quickly a validator's votes are certified — is measurable from the ledger after activation, and it is the metric a careful delegator should ask for.&lt;/p&gt;

&lt;p&gt;The commission fields do not change. The two-commission post still applies; this post changes the size of the number the commission is taken from.&lt;/p&gt;




&lt;h2&gt;
  
  
  Alpenglow Rewards: Questions People Actually Ask
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How are Solana validators paid under Alpenglow?
&lt;/h3&gt;

&lt;p&gt;Each slot’s inflation reward for a voter is split in half: the voter keeps one half and the leader who certifies the vote keeps the other. Votes are no longer transactions, so there is no vote fee.&lt;/p&gt;

&lt;h3&gt;
  
  
  When is a vote rewarded under Alpenglow?
&lt;/h3&gt;

&lt;p&gt;When it appears in a reward certificate built by the leader of the slot eight slots later. A vote that reaches that leader late is not certified and earns nothing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do delegators earn less under Alpenglow?
&lt;/h3&gt;

&lt;p&gt;Your validator’s income becomes half of its own votes plus half of everyone’s votes during its leader slots, still minus its inflation commission. Larger validators lead more often and collect more of the second stream.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens to the epoch credits field after the Alpenglow migration?
&lt;/h3&gt;

&lt;p&gt;It accumulates reward lamports instead of vote credits, with a sentinel row at the boundary. Tools reading it as a performance score will need updating.&lt;/p&gt;




&lt;h2&gt;
  
  
  What to Watch After Activation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;If you delegate:&lt;/strong&gt; the share of your validator's votes that actually appear in reward certificates. A validator that votes and is not certified is invisible in a commission table and visible in its reward account.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;If you operate:&lt;/strong&gt; your latency to upcoming leaders, not to the network in general. Under this reward rule, peering is revenue.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Everyone:&lt;/strong&gt; the epoch-credits field changes units at the migration. Until dashboards catch up, read reward lamports from the vote account directly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;— Not Live on Mainnet as of Sep 17, 2026 —&lt;/p&gt;

&lt;h3&gt;
  
  
  The alpenglow feature account was still inactive on 17 September 2026, and it flips at an epoch boundary.
&lt;/h3&gt;

&lt;p&gt;The upgrades tracker reads the feature-gate accounts from the chain every minute and shows the state per cluster. The timers and certificates that decide when a vote counts at all are in Alpenglow Finality in Numbers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.xroot.dev/upgrades?ref=blog" rel="noopener noreferrer"&gt;Open the Upgrades Tracker ↗&lt;/a&gt;&lt;a href="https://xroot.dev/blog/alpenglow-finality-in-numbers" rel="noopener noreferrer"&gt;Read the finality post&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Constants read from the Agave validator source at commit &lt;code&gt;beee69b958&lt;/code&gt;: &lt;code&gt;runtime/src/block_component_processor/vote_reward.rs&lt;/code&gt;, &lt;code&gt;votor-messages/src/reward_certificate.rs&lt;/code&gt; and &lt;code&gt;core/src/certs_requestor.rs&lt;/code&gt;. The 50/50 split is a constant in that source — re-read it before depending on the ratio.&lt;/p&gt;

</description>
      <category>solana</category>
      <category>alpenglow</category>
      <category>staking</category>
      <category>rewards</category>
    </item>
    <item>
      <title>Which Client Built Each Solana Block: Reading the Footer</title>
      <dc:creator>Suliman Mokhtar</dc:creator>
      <pubDate>Fri, 18 Sep 2026 15:33:03 +0000</pubDate>
      <link>https://dev.to/sulimanmukhtar/which-client-built-each-solana-block-reading-the-footer-42m6</link>
      <guid>https://dev.to/sulimanmukhtar/which-client-built-each-solana-block-reading-the-footer-42m6</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://xroot.dev/blog/which-client-built-each-solana-block" rel="noopener noreferrer"&gt;xroot.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;"What share of Solana runs which client?" is a question that gets answered with a dashboard number every few months, and the number is usually a guess from gossip. That changes when Alpenglow activates, in a way the dashboards have not caught up with: under Alpenglow, &lt;strong&gt;every block names the software that built it&lt;/strong&gt;, in the block itself, and stamps its own nanosecond clock next to the name. The alpenglow feature gate had not activated on mainnet as of 17 September 2026.&lt;/p&gt;

&lt;p&gt;Combined with a field gossip has carried for years, that will make client share a per-block measurement anyone with an RPC connection can make — and it will make "did my fills follow a particular builder" a question with a data source. Here is what is in the footer, what gossip already tells you, and the honest limits of self-reported strings.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Footer: A Client String and a Clock
&lt;/h2&gt;

&lt;p&gt;An Alpenglow block carries a footer, and the validator writes two things into it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;A user-agent string.&lt;/strong&gt; Agave writes &lt;code&gt;agave/&amp;lt;version&amp;gt;&lt;/code&gt;. The field is capped at 255 bytes by a one-byte length prefix and is whatever the producing client chooses to put there. Another client writes its own name.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;A producer timestamp in nanoseconds.&lt;/strong&gt; The leader's own wall clock at production. It is not free-form: the runtime rejects the block if the timestamp is not strictly after the parent's and not more than two slot durations later. Within that window it is whatever the leader says.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since Agave 4.3 a Geyser plugin can receive the footer directly, with the slot and bank it belongs to, independent of entries. So &lt;a href="https://xroot.dev/blog/solana-pipeline-part-2" rel="noopener noreferrer"&gt;a data pipeline&lt;/a&gt; can attribute every block to a client without parsing anything else.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Worth knowing:&lt;/strong&gt; the footer is an Alpenglow structure, and the alpenglow gate had not activated on mainnet as of 17 September 2026. Blocks produced under the current consensus have &lt;em&gt;no&lt;/em&gt; per-block client string; until the gate flips, the only attribution available is the gossip field below.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Gossip Already Carries a Client ID
&lt;/h2&gt;

&lt;p&gt;Every validator broadcasts a contact-info record in gossip that includes its software version and a &lt;strong&gt;client ID&lt;/strong&gt; — an enumeration the reference client maintains. The current list, from the source:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Client IDs in gossip&lt;/strong&gt; — SolanaLabs · JitoLabs · Frankendancer · Agave · AgavePaladin · Firedancer · AgaveBam · Sig · Rakurai · HarmonicFiredancer · HarmonicAgave · HarmonicFrankendancer · FireBAM · Raiku&lt;/p&gt;

&lt;p&gt;Fourteen entries, and the list reads as a map of the ecosystem: the two full clients, the hybrid, the MEV and block-engine variants of each, and the alternative clients. &lt;code&gt;getClusterNodes&lt;/code&gt; exposes the ID as a string on any RPC, alongside the node's feature-set hash and shred version. Weighting by stake gives you client share of stake today; joining to the leader schedule gives you client share of &lt;strong&gt;blocks&lt;/strong&gt; before the footer even exists.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Can Measure, Block by Block
&lt;/h2&gt;

&lt;p&gt;Put the two sources together and three measurements fall out.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Client share of blocks produced.&lt;/strong&gt; Footer string per block, or leader schedule joined to gossip client ID. The former is authoritative once live; the latter works now.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Clock skew per producer.&lt;/strong&gt; The footer timestamp minus the block's derived time, per validator. A producer whose declared clock runs consistently ahead or behind is visible after a few slots.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Whether your outcomes correlate with a builder.&lt;/strong&gt; If your transactions land at a different rate, or sit at a different position in the block, under one client than another, the footer is the field that lets you group by it. The block-engine variants in the list are the ones traders will want to test first.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Limits, Which Are Real
&lt;/h2&gt;

&lt;p&gt;Both fields are &lt;strong&gt;self-declared&lt;/strong&gt;. Agave writes its version because that is what the code says; nothing forces any client to tell the truth, and the gossip client ID passes sanitisation without any check. A validator can call itself whatever it likes. In practice clients are honest because there is no incentive to lie and the fingerprint of their behaviour gives them away, but the data is testimony, not proof.&lt;/p&gt;

&lt;p&gt;The nanosecond clock is bounded, not verified. Within its allowed window it is the leader's word.&lt;/p&gt;

&lt;p&gt;And the footer only exists after Alpenglow activates, which had not happened on mainnet as of 17 September 2026. Until then, gossip client IDs joined to the leader schedule are the measurement, with the caveat that a validator can change software between gossip refresh and block production.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Clock That Comes With It
&lt;/h2&gt;

&lt;p&gt;Alpenglow also adds an on-chain nanosecond clock, at a program-derived address seeded with the word &lt;code&gt;alpenclock&lt;/code&gt; under the Alpenglow program. It is a system-owned account holding a single signed 64-bit integer of nanoseconds, updated by consensus. Once that gate is live, programs and users have sub-second on-chain time for the first time, derived from the producer timestamps above and bounded by the same rules.&lt;/p&gt;

&lt;p&gt;For anyone who has ever timestamped something by multiplying slots by 400 milliseconds, it is the replacement, and that arithmetic has already broken: mainnet ran 400 ms slots until 21 August 2026, runs 300 ms today, and moves to 250 ms from epoch 1037. The on-chain clock survives &lt;a href="https://xroot.dev/blog/solana-200ms-slots-simd-0525" rel="noopener noreferrer"&gt;the slot-time reductions that break that arithmetic&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Client Attribution: Questions People Actually Ask
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How can I tell which client produced a Solana block?
&lt;/h3&gt;

&lt;p&gt;Under Alpenglow the block footer carries a user-agent string written by the producer, for example agave/. Before that, join the leader schedule to each validator’s client ID from gossip.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the Alpenglow block footer?
&lt;/h3&gt;

&lt;p&gt;A structure at the end of each block holding the producer’s client string, capped at 255 bytes, and its nanosecond timestamp, which must fall between the parent’s time and two slot durations later.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I measure Solana client diversity?
&lt;/h3&gt;

&lt;p&gt;Call getClusterNodes, take each validator’s clientId, and weight by stake or by slots in the leader schedule. The list of client IDs in the reference client currently has fourteen entries.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is the Solana client string trustworthy?
&lt;/h3&gt;

&lt;p&gt;It is self-declared and unchecked, so it is testimony rather than proof. Clients have no incentive to lie and their behaviour fingerprints them, but treat the field as a label, not a verification.&lt;/p&gt;




&lt;h2&gt;
  
  
  How to Get a Client Census Today
&lt;/h2&gt;

&lt;p&gt;Call &lt;code&gt;getClusterNodes&lt;/code&gt;, keep &lt;code&gt;clientId&lt;/code&gt;, &lt;code&gt;pubkey&lt;/code&gt; and &lt;code&gt;version&lt;/code&gt;. Fetch the current leader schedule. Join on pubkey, weight each validator by its slots in the epoch. That is client share of block production for this epoch, from one RPC, and it takes a minute.&lt;/p&gt;

&lt;p&gt;When the footer goes live, the same join becomes a per-block fact instead of a per-epoch estimate. The consensus change that brings it is in &lt;a href="https://xroot.dev/blog/alpenglow-finality-in-numbers" rel="noopener noreferrer"&gt;Alpenglow Finality in Numbers&lt;/a&gt;, and the reward rule that decides what a producer earns for the block is in &lt;a href="https://xroot.dev/blog/alpenglow-vote-rewards-leader-split" rel="noopener noreferrer"&gt;the post on vote rewards&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;— The Footer Arrives With One Gate —&lt;/p&gt;

&lt;h3&gt;
  
  
  Per-block attribution starts the epoch Alpenglow activates.
&lt;/h3&gt;

&lt;p&gt;Until then the gossip join is the measurement. The upgrades tracker reads the feature-gate accounts from the chain every minute and shows the state on each cluster, so you know which of the two methods you are on.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.xroot.dev/upgrades?ref=blog" rel="noopener noreferrer"&gt;Open the Upgrades Tracker ↗&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fields read from the Agave validator source at commit &lt;code&gt;beee69b958&lt;/code&gt;: &lt;code&gt;core/src/block_creation_loop.rs&lt;/code&gt;, &lt;code&gt;runtime/src/block_component_processor.rs&lt;/code&gt; and &lt;code&gt;version/src/client_ids.rs&lt;/code&gt;. The client-ID enumeration grows with the ecosystem — re-read it rather than copying the list above.&lt;/p&gt;

</description>
      <category>solana</category>
      <category>alpenglow</category>
      <category>clients</category>
      <category>gossip</category>
    </item>
    <item>
      <title>Solana's Inflation Now Decays Twice as Fast (SIMD-0550)</title>
      <dc:creator>Suliman Mokhtar</dc:creator>
      <pubDate>Wed, 16 Sep 2026 18:41:08 +0000</pubDate>
      <link>https://dev.to/sulimanmukhtar/solanas-inflation-now-decays-twice-as-fast-simd-0550-5ebf</link>
      <guid>https://dev.to/sulimanmukhtar/solanas-inflation-now-decays-twice-as-fast-simd-0550-5ebf</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://xroot.dev/blog/solana-inflation-double-disinflation-simd-0550" rel="noopener noreferrer"&gt;xroot.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Solana's inflation schedule has been the same curve since 2021: start at 8% a year, shrink by 15% of itself every year, stop at 1.5%. Stakers have quoted "about 4-and-a-bit percent" for a while because that is roughly where the curve sits five years in.&lt;/p&gt;

&lt;p&gt;SIMD-0550 changes one number in that curve — the annual shrink rate goes from 15% to &lt;strong&gt;30%&lt;/strong&gt; — and it does so in a way that guarantees nobody notices on activation day. The rate you see the day after is the rate you saw the day before. The entire effect is in the future, and the future arrives about twice as fast.&lt;/p&gt;

&lt;p&gt;This post is the formula, the re-anchoring trick that hides the change, and a forward curve computed from the rate that is actually live today.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Curve, as the Validator Computes It
&lt;/h2&gt;

&lt;p&gt;The validator's inflation object has four parameters: an initial rate, a terminal rate, a taper, and a foundation share. The total rate in year &lt;em&gt;t&lt;/em&gt; is:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;rate(t)&lt;/strong&gt; — max( terminal, initial × (1 − taper)t )&lt;/p&gt;

&lt;p&gt;With the defaults — initial 8%, terminal 1.5%, taper 0.15 — year zero is 8%, year one is 6.8%, year five is about 3.5%, and the floor of 1.5% is reached around year 10.5. The foundation took 5% of issuance for the first seven years; that period is over — &lt;code&gt;getInflationRate&lt;/code&gt; reports a foundation share of &lt;strong&gt;0&lt;/strong&gt; on mainnet today, so everything now goes to stakers and validators.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Worth knowing:&lt;/strong&gt; "year" here is not a calendar year. It is slots since the inflation start slot divided by slots-per-year, and the start slot was aligned back one epoch when inflation was switched on. When &lt;a href="https://xroot.dev/blog/solana-200ms-slots-simd-0525" rel="noopener noreferrer"&gt;slot times shrink&lt;/a&gt;, slots-per-year rises and the year counter keeps time correctly. The curve is defined in wall-clock terms even though it is evaluated in slots.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What SIMD-0550 Changes, and the Re-Anchor That Hides It
&lt;/h2&gt;

&lt;p&gt;The feature sets the taper to &lt;strong&gt;0.30&lt;/strong&gt;. If that were all it did, the rate would drop sharply on activation, because 8% × 0.705 is a much smaller number than 8% × 0.855.&lt;/p&gt;

&lt;p&gt;So the code does one more thing. At the epoch boundary where the feature activates, it reads the rate the old curve produces at that moment — call it the &lt;strong&gt;anchor&lt;/strong&gt; — and rewrites &lt;code&gt;initial&lt;/code&gt; so that the new curve passes through exactly the same point:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;initial_new&lt;/strong&gt; — anchor ÷ (1 − 0.30)year&lt;/p&gt;

&lt;p&gt;The rate is continuous at activation. There is no step. The only thing that changed is the &lt;em&gt;slope&lt;/em&gt; going forward: from here on, each year is 70% of the last instead of 85%.&lt;/p&gt;

&lt;p&gt;The implementation detail is a small piece of care: rather than mutating the shared inflation object, the node replaces it, so that every boundary bank anchors off the pre-activation schedule and sibling forks never see a half-applied change. It is the kind of thing that matters only if it goes wrong, and it is done right.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Forward Curve, From Today's Live Rate
&lt;/h2&gt;

&lt;p&gt;The table below anchors on the rate live on mainnet as this was published: &lt;strong&gt;3.65%&lt;/strong&gt;, read from &lt;code&gt;getInflationRate&lt;/code&gt; at epoch 1035 on 15 September 2026. If you are reading this later, pull the current rate and rerun it — the shape is what matters, not this particular anchor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Years after activation&lt;/strong&gt; — old taper 15% → new taper 30%&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;0 — activation day&lt;/strong&gt; — 3.65% → 3.65% (no step)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1&lt;/strong&gt; — 3.10% → 2.55%&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2&lt;/strong&gt; — 2.63% → 1.79%&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3&lt;/strong&gt; — 2.24% → 1.50% (floor)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4&lt;/strong&gt; — 1.90% → 1.50%&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5&lt;/strong&gt; — 1.62% → 1.50%&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6&lt;/strong&gt; — 1.50% (floor) → 1.50%&lt;/p&gt;

&lt;p&gt;From a 3.65% anchor the old curve takes about six years to reach the 1.5% floor; the new one takes about three. Summed across years one to three, the new curve pays &lt;strong&gt;about 27% less&lt;/strong&gt; inflation than the old one would have — 5.84 percentage-points of issuance against 7.97.&lt;/p&gt;

&lt;p&gt;Staking yield is not the inflation rate. It is the inflation rate scaled by the inverse of the staking ratio — with roughly 69% of supply staked, each staked SOL receives about 1.45× the headline rate — minus the validator's commission. The ratio and &lt;a href="https://xroot.dev/blog/solana-validator-block-revenue-sharing-two-commissions" rel="noopener noreferrer"&gt;the commission&lt;/a&gt; are yours to look up; the halving of the slope is the protocol's.&lt;/p&gt;




&lt;h2&gt;
  
  
  Who Feels This, and When
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Long-term stakers feel it as a slow leak.&lt;/strong&gt; Nothing changes in the first epoch, or the first month. It shows up as a compounding gap against what the old schedule would have paid, and it is largest in years two and three.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Anyone modelling SOL yield against alternatives&lt;/strong&gt; — liquid staking rates, lending rates, treasury bills — needs to rerun the crossover date. The date at which native staking stops out-earning an alternative moves earlier, potentially by years.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Validators feel it in revenue&lt;/strong&gt;, which is why the same era brings &lt;a href="https://xroot.dev/blog/solana-validator-block-revenue-sharing-two-commissions" rel="noopener noreferrer"&gt;block-revenue sharing and basis-point commissions&lt;/a&gt;: with inflation shrinking faster, the fee side of validator income gets relatively larger, and the tooling to split it with delegators is arriving at the same time.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Token holders who do not stake feel the opposite:&lt;/strong&gt; dilution slows faster. Whether that is worth more than the lost yield depends on what you hold and why.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What This Post Cannot Tell You
&lt;/h2&gt;

&lt;p&gt;It cannot tell you the activation date. The gate is one feature account, activated at an epoch boundary after 95% of stake adopts it, and the schedule is set by validator adoption rather than an announcement.&lt;/p&gt;

&lt;p&gt;It cannot tell you your own yield, because that needs the staking ratio and your validator's commission on the day you ask.&lt;/p&gt;

&lt;p&gt;And it cannot tell you whether 30% is the &lt;em&gt;right&lt;/em&gt; taper. The proposal's argument is about long-run security budget and issuance; the code's job is to apply it without a jump. Both are doing exactly what they say.&lt;/p&gt;




&lt;h2&gt;
  
  
  Solana Inflation: Questions People Actually Ask
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What does SIMD-0550 change?
&lt;/h3&gt;

&lt;p&gt;The annual disinflation rate, from 15% to 30%. Each year’s inflation becomes 70% of the previous year’s instead of 85%, until the 1.5% floor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Will the Solana inflation rate drop on activation day?
&lt;/h3&gt;

&lt;p&gt;No. The code re-anchors the starting rate so the new curve passes through the rate in force at activation. The change is entirely in the slope from that point on.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does SIMD-0550 affect Solana staking yield?
&lt;/h3&gt;

&lt;p&gt;Yield tracks inflation scaled by the inverse of the staking ratio, minus commission. Over the following three years the new curve pays about 27% less inflation than the old one would have from the same anchor.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is SIMD-0550 active on Solana mainnet?
&lt;/h3&gt;

&lt;p&gt;It is one feature gate (double_disinflation_rate), activated at an epoch boundary after 95% stake adoption. Check a feature-gate tracker for the state per cluster.&lt;/p&gt;




&lt;h2&gt;
  
  
  The One Calculation to Do This Week
&lt;/h2&gt;

&lt;p&gt;Take your staked SOL, the live inflation rate, your validator's commission, and the staking ratio. Compute your expected yield for each of the next three years under a 0.85 multiplier and under a 0.70 multiplier. The gap between the two columns is what SIMD-0550 costs you, and it is the only number in this post that is specific to you.&lt;/p&gt;

&lt;p&gt;— The Gate Is One Account on Chain —&lt;/p&gt;

&lt;h3&gt;
  
  
  There is no announcement to wait for.
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;double_disinflation_rate&lt;/code&gt; activates at an epoch boundary once 95% of stake runs software that supports it. The upgrades tracker reads the feature-gate accounts from the chain every minute and shows the state on each cluster.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.xroot.dev/upgrades?ref=blog" rel="noopener noreferrer"&gt;Open the Upgrades Tracker ↗&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mechanism read from the Agave validator source at commit &lt;code&gt;beee69b958&lt;/code&gt;: &lt;code&gt;feature-set/src/lib.rs&lt;/code&gt; and &lt;code&gt;runtime/src/bank.rs&lt;/code&gt;. The anchor rate and the zero foundation share were read from mainnet &lt;code&gt;getInflationRate&lt;/code&gt; at epoch 1035 on 15 September 2026; both columns of the table are arithmetic on that anchor.&lt;/p&gt;

</description>
      <category>solana</category>
      <category>simd0550</category>
      <category>inflation</category>
      <category>staking</category>
    </item>
  </channel>
</rss>
