<?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: SwiftNodes</title>
    <description>The latest articles on DEV Community by SwiftNodes (@swiftnodes).</description>
    <link>https://dev.to/swiftnodes</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%2F4023672%2F97c1b4d7-aef6-4fc3-b459-d4c40cfe7c8c.jpg</url>
      <title>DEV Community: SwiftNodes</title>
      <link>https://dev.to/swiftnodes</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/swiftnodes"/>
    <language>en</language>
    <item>
      <title>Starknet RPC: It's JSON-RPC, but Almost Nothing Else From Ethereum Transfers</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Thu, 30 Jul 2026 06:41:24 +0000</pubDate>
      <link>https://dev.to/swiftnodes/starknet-rpc-its-json-rpc-but-almost-nothing-else-from-ethereum-transfers-54lh</link>
      <guid>https://dev.to/swiftnodes/starknet-rpc-its-json-rpc-but-almost-nothing-else-from-ethereum-transfers-54lh</guid>
      <description>&lt;p&gt;Almost every chain we've covered is EVM, and the pitch is the same: point viem or ethers at the endpoint and your Ethereum knowledge carries over. &lt;strong&gt;Starknet is the one where that's not true.&lt;/strong&gt; It's a validity (ZK) rollup on Ethereum, but the execution layer is &lt;strong&gt;Cairo, not the EVM&lt;/strong&gt; — different VM, different contract language, different account model. The RPC is still JSON-RPC over HTTP, so at a glance it looks familiar, but it's the &lt;strong&gt;&lt;code&gt;starknet_*&lt;/code&gt; namespace, not &lt;code&gt;eth_*&lt;/code&gt;&lt;/strong&gt; — which means your EVM toolchain won't connect and your mental model needs adjusting. If you're coming from Ethereum, this is the spotlight to read slowly. Here's the map.&lt;/p&gt;

&lt;h2&gt;
  
  
  The essentials
&lt;/h2&gt;

&lt;p&gt;Starknet mainnet is chain &lt;strong&gt;&lt;code&gt;SN_MAIN&lt;/code&gt;&lt;/strong&gt; (&lt;code&gt;starknet_chainId&lt;/code&gt; returns the felt-encoded string &lt;code&gt;0x534e5f4d41494e&lt;/code&gt;), a STARK validity rollup with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cairo VM, not EVM&lt;/strong&gt; — contracts are written in &lt;strong&gt;Cairo&lt;/strong&gt; and run on the Starknet OS; Solidity and EVM bytecode don't apply.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;STRK as the fee/staking token&lt;/strong&gt; (18 decimals), launched February 2024.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Validity-proof finality&lt;/strong&gt; — every state update ships with a STARK proof verified on Ethereum L1, so once proven it's cryptographically final (no fraud-proof challenge window).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A versioned JSON-RPC spec&lt;/strong&gt; — the endpoint above reports &lt;code&gt;starknet_specVersion&lt;/code&gt; &lt;code&gt;0.10.2&lt;/code&gt;; the method set is a formal, versioned standard.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Its own toolchain&lt;/strong&gt; — &lt;code&gt;starknet.js&lt;/code&gt; / &lt;code&gt;starknet.py&lt;/code&gt;, &lt;code&gt;starkli&lt;/code&gt;, and &lt;code&gt;scarb&lt;/code&gt; (Cairo build). Not foundry/hardhat/viem.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Connecting uses a Starknet library, not an EVM one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;RpcProvider&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;starknet&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;RpcProvider&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;nodeUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://rpc.swiftnodes.io/rpc/starknet?key=YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBlockNumber&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;          &lt;span class="c1"&gt;// starknet_blockNumber under the hood&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getSpecVersion&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;          &lt;span class="c1"&gt;// "0.10.2"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Point &lt;code&gt;viem&lt;/code&gt;/&lt;code&gt;ethers&lt;/code&gt; at the same URL and it fails — those speak &lt;code&gt;eth_*&lt;/code&gt;, and Starknet doesn't answer to that namespace.&lt;/p&gt;

&lt;h2&gt;
  
  
  The method map: eth_* → starknet_*
&lt;/h2&gt;

&lt;p&gt;The concepts you use daily mostly have an analogue — just under a different name and with different shapes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;You want to…&lt;/th&gt;
&lt;th&gt;Ethereum (&lt;code&gt;eth_*&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;Starknet (&lt;code&gt;starknet_*&lt;/code&gt;)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Latest block height&lt;/td&gt;
&lt;td&gt;&lt;code&gt;eth_blockNumber&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;starknet_blockNumber&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read a block&lt;/td&gt;
&lt;td&gt;&lt;code&gt;eth_getBlockByNumber&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;starknet_getBlockWithTxs&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Call a view function&lt;/td&gt;
&lt;td&gt;&lt;code&gt;eth_call&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;starknet_call&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read storage&lt;/td&gt;
&lt;td&gt;&lt;code&gt;eth_getStorageAt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;starknet_getStorageAt&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Estimate cost&lt;/td&gt;
&lt;td&gt;&lt;code&gt;eth_estimateGas&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;starknet_estimateFee&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fetch a receipt&lt;/td&gt;
&lt;td&gt;&lt;code&gt;eth_getTransactionReceipt&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;starknet_getTransactionReceipt&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Query events/logs&lt;/td&gt;
&lt;td&gt;&lt;code&gt;eth_getLogs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;starknet_getEvents&lt;/code&gt; (continuation tokens)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Submit a transaction&lt;/td&gt;
&lt;td&gt;&lt;code&gt;eth_sendRawTransaction&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;starknet_addInvokeTransaction&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two things to notice immediately: there's no single "send raw transaction" — you submit &lt;strong&gt;INVOKE&lt;/strong&gt;, &lt;strong&gt;DECLARE&lt;/strong&gt;, or &lt;strong&gt;DEPLOY_ACCOUNT&lt;/strong&gt; transactions depending on intent — and event querying uses &lt;strong&gt;continuation tokens&lt;/strong&gt; for pagination rather than a &lt;code&gt;fromBlock&lt;/code&gt;/&lt;code&gt;toBlock&lt;/code&gt; range you scan yourself (a different rhythm from the &lt;a href="https://swiftnodes.io/blog/eth-getlogs-range-caps" rel="noopener noreferrer"&gt;eth_getLogs range-cap dance&lt;/a&gt;).&lt;/p&gt;

&lt;h2&gt;
  
  
  Big difference #1: every account is a contract (native AA, no EOAs)
&lt;/h2&gt;

&lt;p&gt;This is the one that trips up Ethereum developers hardest. &lt;strong&gt;Starknet has no externally-owned accounts.&lt;/strong&gt; There is no "private key = address." Every account is a &lt;strong&gt;deployed smart contract&lt;/strong&gt; that holds its own signature-verification logic — account abstraction isn't a bolt-on standard like ERC-4337, it's the &lt;em&gt;only&lt;/em&gt; account model.&lt;/p&gt;

&lt;p&gt;Practical consequences from the RPC's perspective:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To send a transaction, you invoke &lt;strong&gt;through your account contract&lt;/strong&gt; (an &lt;code&gt;INVOKE&lt;/code&gt;), which the account validates with whatever scheme it implements.&lt;/li&gt;
&lt;li&gt;A brand-new account must be &lt;strong&gt;deployed&lt;/strong&gt; (&lt;code&gt;DEPLOY_ACCOUNT&lt;/code&gt;) before it can transact — the "just receive funds and go" flow from Ethereum doesn't exist.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multicall is native&lt;/strong&gt; — an account can carry multiple calls in one transaction without a Multicall contract.&lt;/li&gt;
&lt;li&gt;Signature formats are account-defined, so don't assume secp256k1/ECDSA (Starknet commonly uses the STARK-friendly curve).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you liked the account-abstraction direction on &lt;a href="https://swiftnodes.io/blog/zksync-era-rpc-differences" rel="noopener noreferrer"&gt;zkSync Era&lt;/a&gt;, Starknet takes it all the way: there, AA is native but the chain is still EVM-compatible; here, AA is native &lt;em&gt;and&lt;/em&gt; the VM is Cairo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Big difference #2: Cairo and felts, not Solidity and uint256
&lt;/h2&gt;

&lt;p&gt;Starknet's fundamental data type is the &lt;strong&gt;field element (felt252)&lt;/strong&gt;, not the EVM's 32-byte word. Addresses, storage keys, calldata, and return values are felts. When you call a contract, arguments and results are arrays of felts, and it's on you (or the library's ABI layer) to encode/decode Cairo types into and out of them. There are no Solidity ABIs — Cairo has its own ABI format, and &lt;code&gt;starknet.js&lt;/code&gt; handles the marshalling if you feed it the contract's ABI.&lt;/p&gt;

&lt;p&gt;The upshot: &lt;strong&gt;address handling and calldata encoding are different enough that you can't reuse EVM helpers.&lt;/strong&gt; A Starknet address isn't a 20-byte hex string; contract calls aren't 4-byte selectors plus ABI-packed args. Lean on the Starknet library rather than hand-rolling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finality: STARK-proven, so no challenge window
&lt;/h2&gt;

&lt;p&gt;Unlike the optimistic rollups we've covered (Blast, Unichain, Fraxtal) — where hard finality waits out a 7-to-14-day fraud-proof window — Starknet is a &lt;strong&gt;validity rollup&lt;/strong&gt;. State transitions are accompanied by a &lt;strong&gt;STARK proof verified on Ethereum&lt;/strong&gt;, so once that proof settles, the state is cryptographically final; there's nothing to challenge. The two tiers are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Soft confirmation&lt;/strong&gt; on Starknet within seconds to minutes (the sequencer has accepted and sequenced your transaction).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hard finality&lt;/strong&gt; once the STARK proof is verified on L1 — final by math, not by an elapsed dispute period.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's a genuinely different finality story from optimistic L2s; the general model is in &lt;a href="https://swiftnodes.io/blog/l2-finality-soft-vs-hard" rel="noopener noreferrer"&gt;soft vs. hard finality&lt;/a&gt;, and like every rollup there's a &lt;a href="https://swiftnodes.io/blog/what-is-a-sequencer" rel="noopener noreferrer"&gt;sequencer&lt;/a&gt; ordering transactions before proofs settle.&lt;/p&gt;

&lt;h2&gt;
  
  
  What does NOT carry over
&lt;/h2&gt;

&lt;p&gt;Be explicit with yourself before you start:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;eth_*&lt;/code&gt; methods&lt;/strong&gt; — not available; use &lt;code&gt;starknet_*&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;viem / ethers / web3.py / foundry / hardhat&lt;/strong&gt; — they speak EVM JSON-RPC and Solidity; use &lt;code&gt;starknet.js&lt;/code&gt; / &lt;code&gt;starknet.py&lt;/code&gt; / &lt;code&gt;starkli&lt;/code&gt; / &lt;code&gt;scarb&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solidity, EVM bytecode, 4-byte selectors, 20-byte addresses, uint256 words&lt;/strong&gt; — replaced by Cairo, felts, and the Cairo ABI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EOAs and raw &lt;code&gt;eth_sendRawTransaction&lt;/code&gt;&lt;/strong&gt; — replaced by account contracts and &lt;code&gt;INVOKE&lt;/code&gt;/&lt;code&gt;DECLARE&lt;/code&gt;/&lt;code&gt;DEPLOY_ACCOUNT&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What &lt;em&gt;does&lt;/em&gt; carry over is the shape of the work: it's still JSON-RPC over HTTP(S), you still read blocks/receipts/events and submit transactions, and &lt;a href="https://swiftnodes.io/blog/reading-transaction-receipts-eth-gettransactionreceipt" rel="noopener noreferrer"&gt;reading a receipt to confirm success&lt;/a&gt; is conceptually the same check — just via &lt;code&gt;starknet_getTransactionReceipt&lt;/code&gt; and Starknet's status fields.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Starknet (chain &lt;code&gt;SN_MAIN&lt;/code&gt;) is a &lt;strong&gt;non-EVM STARK validity rollup&lt;/strong&gt;: JSON-RPC over HTTP like Ethereum, but the &lt;strong&gt;&lt;code&gt;starknet_*&lt;/code&gt;&lt;/strong&gt; namespace, not &lt;code&gt;eth_*&lt;/code&gt; — so viem/ethers/foundry don't connect and you use &lt;code&gt;starknet.js&lt;/code&gt;/&lt;code&gt;starkli&lt;/code&gt; instead. Contracts are &lt;strong&gt;Cairo&lt;/strong&gt;, values are &lt;strong&gt;felts&lt;/strong&gt;, and &lt;strong&gt;every account is a contract&lt;/strong&gt; (native account abstraction, no EOAs — you send &lt;code&gt;INVOKE&lt;/code&gt; transactions through your account, and new accounts must be deployed first). Most &lt;code&gt;eth_*&lt;/code&gt; calls have a &lt;code&gt;starknet_*&lt;/code&gt; analogue (with &lt;code&gt;starknet_getEvents&lt;/code&gt; using continuation tokens), and finality is &lt;strong&gt;STARK-proven with no challenge window&lt;/strong&gt; — cryptographic once the proof lands on L1. Treat it as its own platform that happens to share Ethereum's RPC transport, not as another EVM chain.&lt;/p&gt;

&lt;p&gt;Building Cairo dApps, account-abstraction wallets, or indexers over Starknet? A flat-rate &lt;a href="https://swiftnodes.io/starknet-rpc" rel="noopener noreferrer"&gt;Starknet RPC endpoint&lt;/a&gt; gives you the full &lt;code&gt;starknet_*&lt;/code&gt; JSON-RPC over HTTP alongside 75+ other chains under one key. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt; and point your stack at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://rpc.swiftnodes.io/rpc/starknet?key=YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://swiftnodes.io/blog/starknet-rpc-non-evm" rel="noopener noreferrer"&gt;SwiftNodes blog&lt;/a&gt;. SwiftNodes provides flat-rate multi-chain RPC endpoints — HTTP + WebSocket, 75+ chains, no per-request metering. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Blast RPC: The L2 Where Balances Grow on Their Own (and Why That Breaks Naive Indexers)</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Wed, 29 Jul 2026 06:28:20 +0000</pubDate>
      <link>https://dev.to/swiftnodes/blast-rpc-the-l2-where-balances-grow-on-their-own-and-why-that-breaks-naive-indexers-3bf4</link>
      <guid>https://dev.to/swiftnodes/blast-rpc-the-l2-where-balances-grow-on-their-own-and-why-that-breaks-naive-indexers-3bf4</guid>
      <description>&lt;p&gt;On almost every chain, an account's balance only changes when a transaction moves it — so indexers, accounting systems, and AMMs all lean on one assumption: &lt;em&gt;balance changes come with a &lt;code&gt;Transfer&lt;/code&gt; event.&lt;/em&gt; Blast breaks that assumption on purpose. It's an Ethereum Layer 2 (chain ID &lt;strong&gt;81457&lt;/strong&gt;) whose defining feature is &lt;strong&gt;native yield&lt;/strong&gt;: bridged ETH earns staking yield and the USDB stablecoin earns T-bill yield, and both &lt;strong&gt;rebase directly into account balances with no action and no transfer.&lt;/strong&gt; For users that's magic; for developers it's a design constraint you have to plan around. Blast is standard EVM underneath (ordinary &lt;code&gt;eth_*&lt;/code&gt;, viem/ethers/foundry unchanged), but the yield primitive is the reason to read carefully before you build. Here's the map.&lt;/p&gt;

&lt;h2&gt;
  
  
  The essentials
&lt;/h2&gt;

&lt;p&gt;Blast mainnet (live since February 29, 2024) is &lt;strong&gt;chain ID 81457&lt;/strong&gt;, an optimistic rollup with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ETH as the gas token&lt;/strong&gt; (18 decimals) — but &lt;em&gt;auto-rebasing&lt;/em&gt; ETH, whose balance grows over time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~2-second blocks&lt;/strong&gt; — fast soft confirmation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimistic rollup finality&lt;/strong&gt; with a notably &lt;strong&gt;long ~14-day challenge window&lt;/strong&gt; for L1 withdrawals (longer than the typical 7-day OP Stack window — see finality below).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native yield&lt;/strong&gt; on bridged ETH and on &lt;strong&gt;USDB&lt;/strong&gt; (the yield-bearing stablecoin).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EVM-compatible&lt;/strong&gt; — Solidity, ABIs, and standard tooling deploy without changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Connecting is standard EVM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;defineChain&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;blast&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineChain&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;81457&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Blast&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;nativeCurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Ether&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ETH&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;decimals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;rpcUrls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://rpc.swiftnodes.io/rpc/blast?key=YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;blast&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;http&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBlockNumber&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;   &lt;span class="c1"&gt;// just works&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The headline: balances that grow by themselves
&lt;/h2&gt;

&lt;p&gt;Blast's native yield means two things move without anyone sending a transaction:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Bridged ETH earns staking yield&lt;/strong&gt; — an account's ETH balance rebases upward over time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;USDB earns T-bill yield&lt;/strong&gt; — the stablecoin's balance rebases the same way.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's no &lt;code&gt;mint&lt;/code&gt;, no &lt;code&gt;Transfer&lt;/code&gt;, no user action. The protocol simply grows balances. For a wallet or a "your money is working" product, that's the entire pitch. For anyone &lt;em&gt;reading&lt;/em&gt; the chain programmatically, it's the thing to design around — because it violates the invariant most tooling assumes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gotcha #1: you can't derive balances from &lt;code&gt;Transfer&lt;/code&gt; events
&lt;/h2&gt;

&lt;p&gt;The standard way to track ERC-20 holdings — sum every &lt;code&gt;Transfer&lt;/code&gt; in and out — &lt;strong&gt;silently under-counts on Blast&lt;/strong&gt;, because rebasing yield increases balances without emitting a transfer. The same applies to native ETH: an address's ETH grows without any transaction touching it.&lt;/p&gt;

&lt;p&gt;So on Blast, for anything yield-bearing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Snapshot balances, don't reconstruct them from events.&lt;/strong&gt; Query &lt;code&gt;eth_getBalance&lt;/code&gt; (for ETH) and &lt;code&gt;balanceOf&lt;/code&gt; (for USDB / rebasing tokens) &lt;em&gt;at the block you care about&lt;/em&gt;, rather than assuming &lt;code&gt;starting_balance + transfers_in − transfers_out&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;If you maintain a running ledger, &lt;strong&gt;re-sync balances periodically&lt;/strong&gt; against on-chain reads to absorb accrued yield, or your numbers drift.&lt;/li&gt;
&lt;li&gt;Event-driven indexing still works for &lt;em&gt;movements&lt;/em&gt; — you just can't treat the absence of events as "balance unchanged." (The general event-indexing mechanics still apply; see &lt;a href="https://swiftnodes.io/blog/eth-getlogs-range-caps" rel="noopener noreferrer"&gt;eth_getLogs range caps&lt;/a&gt; and &lt;a href="https://swiftnodes.io/blog/eth-subscribe-logs" rel="noopener noreferrer"&gt;subscribing to logs&lt;/a&gt;.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the single most common way teams get Blast accounting wrong: they build a normal transfer-summing indexer and wonder why balances don't match the explorer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gotcha #2: yield modes — contracts default to "Void"
&lt;/h2&gt;

&lt;p&gt;Because auto-rebasing balances break a lot of contract logic (an AMM whose reserves silently change would mis-price; a vault tracking shares against a fixed balance would drift), Blast doesn't force yield on smart contracts. Instead, every account has a &lt;strong&gt;yield mode&lt;/strong&gt;, configured through Blast's yield system contract:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Automatic&lt;/strong&gt; — balance rebases upward (the default for EOAs / user wallets).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Void&lt;/strong&gt; — no yield; balance stays put. &lt;strong&gt;This is the default for smart contracts&lt;/strong&gt;, precisely so existing DeFi logic keeps working.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claimable&lt;/strong&gt; — yield accrues separately and is claimed explicitly, leaving the principal balance stable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The practical rule when you deploy on Blast: &lt;strong&gt;if your contract holds ETH or USDB and you want it to earn, you must opt in&lt;/strong&gt; — and for most contracts the safe choice is &lt;strong&gt;Claimable&lt;/strong&gt;, so your core balance stays invariant while yield accumulates on the side. Turning on &lt;strong&gt;Automatic&lt;/strong&gt; for a contract that assumes a fixed balance is a foot-gun. This configuration is a Blast-specific step with no equivalent on a vanilla EVM chain, and it's the thing to get right before mainnet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finality: fast soft, but a long ~14-day withdrawal window
&lt;/h2&gt;

&lt;p&gt;As an optimistic rollup, Blast gives fast &lt;strong&gt;soft confirmation (~2s)&lt;/strong&gt; at the sequencer, but true L1 settlement — and any withdrawal back to Ethereum — waits out an &lt;strong&gt;extended ~14-day challenge window&lt;/strong&gt;, roughly double the usual 7-day OP Stack period. If your app moves value L2→L1, design for that delay explicitly; the &lt;a href="https://swiftnodes.io/blog/l2-finality-soft-vs-hard" rel="noopener noreferrer"&gt;soft vs. hard finality&lt;/a&gt; breakdown covers the model, and it's the same optimistic-rollup shape as OP-aligned chains like &lt;a href="https://swiftnodes.io/blog/unichain-rpc-uniswap-l2" rel="noopener noreferrer"&gt;Unichain&lt;/a&gt; — just with a longer window.&lt;/p&gt;

&lt;p&gt;For indexing, treat the L2 head like any optimistic rollup: reasonably reliable but reorg-capable at the tip, so key your data on block hash and reconcile — see &lt;a href="https://swiftnodes.io/blog/handling-chain-reorgs-indexer" rel="noopener noreferrer"&gt;handling chain reorgs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What carries over unchanged
&lt;/h2&gt;

&lt;p&gt;Aside from native yield and yield modes, treat Blast as a standard EVM chain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;eth_call&lt;/code&gt;, &lt;code&gt;eth_getBalance&lt;/code&gt;, &lt;code&gt;eth_getLogs&lt;/code&gt;, &lt;code&gt;eth_getTransactionReceipt&lt;/code&gt;, &lt;code&gt;eth_estimateGas&lt;/code&gt;, &lt;code&gt;eth_sendRawTransaction&lt;/code&gt;, &lt;code&gt;eth_subscribe&lt;/code&gt; all behave normally.&lt;/li&gt;
&lt;li&gt;Solidity contracts, ABIs, and the viem/ethers/hardhat/foundry toolchain deploy and run as-is.&lt;/li&gt;
&lt;li&gt;ETH is the 18-decimal gas token; fees follow EIP-1559 with an L1 data-fee component like any rollup (&lt;a href="https://swiftnodes.io/blog/estimating-gas-eth-estimategas-eip-1559" rel="noopener noreferrer"&gt;gas estimation basics&lt;/a&gt;); &lt;a href="https://swiftnodes.io/blog/reading-transaction-receipts-eth-gettransactionreceipt" rel="noopener noreferrer"&gt;transaction receipts&lt;/a&gt; read the same way; WebSocket subscriptions work, and at ~2s blocks streaming beats tight polling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Blast (chain ID 81457) is an optimistic-rollup L2 whose defining feature is &lt;strong&gt;native yield&lt;/strong&gt; — bridged ETH and USDB rebase into balances automatically, with no transaction and no &lt;code&gt;Transfer&lt;/code&gt; event. That breaks two common assumptions: &lt;strong&gt;(1)&lt;/strong&gt; you can't reconstruct balances by summing transfers, so snapshot &lt;code&gt;eth_getBalance&lt;/code&gt; / &lt;code&gt;balanceOf&lt;/code&gt; at a block and re-sync for accrued yield; and &lt;strong&gt;(2)&lt;/strong&gt; contracts have a &lt;strong&gt;yield mode&lt;/strong&gt; (Automatic / Void / Claimable) — they default to &lt;strong&gt;Void&lt;/strong&gt;, and if you want yield the safe pattern is usually &lt;strong&gt;Claimable&lt;/strong&gt; so your core balance stays invariant. Everything else is standard EVM (ETH gas, viem/ethers/foundry unchanged), with fast ~2s soft confirmation but a long &lt;strong&gt;~14-day&lt;/strong&gt; L1 withdrawal window. Build it like an optimistic rollup; just respect the rebasing.&lt;/p&gt;

&lt;p&gt;Building yield-bearing DeFi, USDB payment flows, or anything indexing Blast balances? A flat-rate &lt;a href="https://swiftnodes.io/blast-rpc" rel="noopener noreferrer"&gt;Blast RPC endpoint&lt;/a&gt; gives you chain 81457 over HTTP and WebSocket alongside 75+ other chains under one key. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt; and point your stack at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://rpc.swiftnodes.io/rpc/blast?key=YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://swiftnodes.io/blog/blast-rpc-native-yield" rel="noopener noreferrer"&gt;SwiftNodes blog&lt;/a&gt;. SwiftNodes provides flat-rate multi-chain RPC endpoints — HTTP + WebSocket, 75+ chains, no per-request metering. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Fraxtal RPC: The OP Stack Chain That Doesn't Use ETH for Gas</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Tue, 28 Jul 2026 05:06:26 +0000</pubDate>
      <link>https://dev.to/swiftnodes/fraxtal-rpc-the-op-stack-chain-that-doesnt-use-eth-for-gas-37j4</link>
      <guid>https://dev.to/swiftnodes/fraxtal-rpc-the-op-stack-chain-that-doesnt-use-eth-for-gas-37j4</guid>
      <description>&lt;p&gt;Almost every OP Stack L2 shares one assumption: ETH is the gas token. Fraxtal breaks it. It's Frax Finance's Layer 2 — built on the OP Stack, aligned with the Optimism Superchain — but it runs on &lt;strong&gt;FRAX as the native gas asset&lt;/strong&gt;, and it layers on a blockspace-incentive system (&lt;strong&gt;Flox&lt;/strong&gt;) that pays &lt;em&gt;contract developers&lt;/em&gt; for the gas their users spend. Underneath it's a standard EVM (chain ID &lt;strong&gt;252&lt;/strong&gt;, ordinary &lt;code&gt;eth_*&lt;/code&gt;, viem/ethers/foundry unchanged), so the tooling is familiar. The two Frax-specific twists are what you actually need to design around. Here's the map.&lt;/p&gt;

&lt;h2&gt;
  
  
  The essentials
&lt;/h2&gt;

&lt;p&gt;Fraxtal mainnet (live since February 2024) is &lt;strong&gt;chain ID 252&lt;/strong&gt;, an OP Stack L2 with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FRAX as the native gas token&lt;/strong&gt; (18 decimals) — &lt;em&gt;not&lt;/em&gt; ETH, which is the headline difference from most OP Stack chains.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~2-second blocks&lt;/strong&gt; — fast L2 confirmation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimistic rollup finality&lt;/strong&gt; — soft confirmation is immediate on the L2; withdrawals to Ethereum follow the usual &lt;strong&gt;~7-day challenge window&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EVM-compatible&lt;/strong&gt; — Solidity, ABIs, and standard tooling deploy without changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Connecting is standard EVM — the one thing to get right is the native currency:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;defineChain&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fraxtal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineChain&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;252&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Fraxtal&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;nativeCurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Frax&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;FRAX&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;decimals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;  &lt;span class="c1"&gt;// not ETH&lt;/span&gt;
  &lt;span class="na"&gt;rpcUrls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://rpc.swiftnodes.io/rpc/fraxtal?key=YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;fraxtal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;http&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBlockNumber&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;   &lt;span class="c1"&gt;// just works&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Twist #1: gas is FRAX, not ETH
&lt;/h2&gt;

&lt;p&gt;The practical consequence lives in your fee handling. &lt;code&gt;eth_estimateGas&lt;/code&gt; still returns gas &lt;em&gt;units&lt;/em&gt; the same way it does everywhere (&lt;a href="https://swiftnodes.io/blog/estimating-gas-eth-estimategas-eip-1559" rel="noopener noreferrer"&gt;gas estimation basics&lt;/a&gt;), and EIP-1559 fields behave normally — but the value you multiply by, the balance a user needs to transact, and the token your relayer or funding wallet must hold are all &lt;strong&gt;FRAX&lt;/strong&gt;, not ETH. Anywhere your code hard-codes "the native token is ETH" for display, funding, or balance checks, Fraxtal will surprise you.&lt;/p&gt;

&lt;p&gt;If you've read the &lt;a href="https://swiftnodes.io/blog/celo-rpc-l2-fee-currency" rel="noopener noreferrer"&gt;Celo fee-currency post&lt;/a&gt;, this is a cousin — Celo lets you pay gas &lt;em&gt;in&lt;/em&gt; various fee currencies, while Fraxtal simply &lt;em&gt;makes the native gas token FRAX&lt;/em&gt; end to end. Either way, the lesson is the same one that recurs across non-ETH chains: &lt;strong&gt;don't assume the gas asset.&lt;/strong&gt; Read it from the chain config.&lt;/p&gt;

&lt;h2&gt;
  
  
  Twist #2: Flox — gas that pays developers back
&lt;/h2&gt;

&lt;p&gt;This is the feature that has no equivalent on a vanilla OP Stack L2. Fraxtal runs &lt;strong&gt;Flox&lt;/strong&gt;, a blockspace incentive system that distributes &lt;strong&gt;FXTL points&lt;/strong&gt; based on gas activity — and crucially, it rewards &lt;strong&gt;both the user who spends the gas and the contract they interact with.&lt;/strong&gt; In other words, if users transact against your deployed contract, &lt;em&gt;you&lt;/em&gt; accrue FXTL for that usage.&lt;/p&gt;

&lt;p&gt;For a developer choosing where to deploy, that flips the usual calculus. On most chains, the gas your users spend is pure cost that leaves the ecosystem; on Fraxtal, it partially cycles back to the builders driving the activity. It's conceptually adjacent to &lt;a href="https://swiftnodes.io/blog/astar-rpc-evm-wasm-parachain" rel="noopener noreferrer"&gt;Astar's dApp Staking&lt;/a&gt;, where on-chain rewards flow to contracts by usage — but Flox ties it directly to &lt;strong&gt;gas spent&lt;/strong&gt;, so the metric is raw blockspace consumption rather than a separate staking vote.&lt;/p&gt;

&lt;p&gt;From the RPC's point of view, Flox is a protocol/accounting layer — it doesn't change how you call the chain. You deploy and interact with &lt;code&gt;eth_sendRawTransaction&lt;/code&gt; / &lt;code&gt;eth_call&lt;/code&gt; exactly as normal; the FXTL accrual happens off to the side based on the gas those transactions burn. It's a reason to build here, not an API you invoke. (Tokenomics around FRAX and the frxUSD stablecoin have evolved through Frax's later upgrades — check Frax's official docs for the current specifics before you design economics around FXTL.)&lt;/p&gt;

&lt;h2&gt;
  
  
  OP Stack mechanics carry over
&lt;/h2&gt;

&lt;p&gt;Because Fraxtal is OP Stack, everything you know from other Superchain L2s applies — the same model we covered on &lt;a href="https://swiftnodes.io/blog/unichain-rpc-uniswap-l2" rel="noopener noreferrer"&gt;Unichain&lt;/a&gt; and &lt;a href="https://swiftnodes.io/blog/zora-rpc-op-stack-creators" rel="noopener noreferrer"&gt;Zora&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;sequencer&lt;/strong&gt; orders transactions and gives near-instant soft confirmation; transaction data is posted to Ethereum L1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Two-tier finality:&lt;/strong&gt; the L2 head is fast and practically reliable, but true settlement — and any withdrawal back to Ethereum — waits out the &lt;strong&gt;~7-day optimistic challenge window.&lt;/strong&gt; If your app moves value L2→L1, design for that delay; see &lt;a href="https://swiftnodes.io/blog/l2-finality-soft-vs-hard" rel="noopener noreferrer"&gt;soft vs. hard finality&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Fee structure includes an &lt;strong&gt;L1 data component&lt;/strong&gt; on top of L2 execution, so total cost tracks Ethereum's calldata pricing — just denominated in FRAX here.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What carries over unchanged
&lt;/h2&gt;

&lt;p&gt;Aside from the FRAX gas token and Flox, treat Fraxtal as a standard EVM chain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;eth_call&lt;/code&gt;, &lt;code&gt;eth_getBalance&lt;/code&gt;, &lt;code&gt;eth_getLogs&lt;/code&gt;, &lt;code&gt;eth_getTransactionReceipt&lt;/code&gt;, &lt;code&gt;eth_estimateGas&lt;/code&gt;, &lt;code&gt;eth_sendRawTransaction&lt;/code&gt;, &lt;code&gt;eth_subscribe&lt;/code&gt; all behave normally.&lt;/li&gt;
&lt;li&gt;Solidity contracts, ABIs, and the viem/ethers/hardhat/foundry toolchain deploy and run as-is.&lt;/li&gt;
&lt;li&gt;18-decimal native token; WebSocket subscriptions (&lt;code&gt;newHeads&lt;/code&gt;, &lt;code&gt;logs&lt;/code&gt;) work; at ~2s blocks, streaming beats tight polling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Fraxtal (chain ID 252) is Frax Finance's OP Stack L2 with two departures from the standard Superchain playbook: &lt;strong&gt;gas is paid in FRAX, not ETH&lt;/strong&gt; (so never assume the native asset — read it from the chain config), and its &lt;strong&gt;Flox system pays FXTL points to both users and the contracts they use&lt;/strong&gt;, turning gas spend into a builder incentive. Everything else is standard OP Stack — fast sequencer soft-confirmation, an L1 data-fee component, and a &lt;strong&gt;~7-day withdrawal challenge window&lt;/strong&gt; — over an ordinary &lt;code&gt;eth_*&lt;/code&gt; EVM that viem/ethers/foundry drive unchanged. Build it like any OP Stack chain; just get the gas token and the withdrawal delay right.&lt;/p&gt;

&lt;p&gt;Building on Frax's ecosystem — frxUSD settlement, liquid staking, or Flox-incentivized dApps? A flat-rate &lt;a href="https://swiftnodes.io/fraxtal-rpc" rel="noopener noreferrer"&gt;Fraxtal RPC endpoint&lt;/a&gt; gives you chain 252 over HTTP and WebSocket alongside 75+ other chains under one key. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt; and point your stack at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://rpc.swiftnodes.io/rpc/fraxtal?key=YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://swiftnodes.io/blog/fraxtal-rpc-frax-op-stack" rel="noopener noreferrer"&gt;SwiftNodes blog&lt;/a&gt;. SwiftNodes provides flat-rate multi-chain RPC endpoints — HTTP + WebSocket, 75+ chains, no per-request metering. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>ZetaChain RPC: One Contract That Touches Native Bitcoin</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Mon, 27 Jul 2026 10:31:47 +0000</pubDate>
      <link>https://dev.to/swiftnodes/zetachain-rpc-one-contract-that-touches-native-bitcoin-202l</link>
      <guid>https://dev.to/swiftnodes/zetachain-rpc-one-contract-that-touches-native-bitcoin-202l</guid>
      <description>&lt;p&gt;Most "cross-chain" really means "wrap the asset and trust a bridge." ZetaChain takes a different swing: a smart contract on ZetaChain can &lt;strong&gt;read from and write to other chains directly — including chains that have no smart contracts of their own, like Bitcoin — while controlling the &lt;em&gt;native&lt;/em&gt; asset&lt;/strong&gt;, no wrapped token in sight. You write one Solidity contract, and it orchestrates value across many chains. The contract layer (ZetaEVM, chain ID &lt;strong&gt;7000&lt;/strong&gt;) is standard &lt;code&gt;eth_*&lt;/code&gt;, so viem/ethers/foundry work unchanged — but the omnichain machinery underneath is what makes it interesting. Here's the map.&lt;/p&gt;

&lt;h2&gt;
  
  
  The essentials
&lt;/h2&gt;

&lt;p&gt;ZetaChain mainnet is &lt;strong&gt;chain ID 7000&lt;/strong&gt;, an EVM (ZetaEVM) with an unusual foundation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cosmos-SDK L1 with CometBFT consensus&lt;/strong&gt; — validators stake ZETA; ~5-second blocks with &lt;strong&gt;instant, non-reversible BFT finality&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ZETA as the gas token&lt;/strong&gt; (18 decimals).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Omnichain by design&lt;/strong&gt; — cross-chain interoperability is a protocol feature, managed by a distributed &lt;strong&gt;TSS (threshold signature scheme)&lt;/strong&gt; validator set.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EVM-compatible&lt;/strong&gt; — deploy Solidity with standard tooling.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Connecting to the ZetaEVM is boringly standard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;defineChain&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;zeta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineChain&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;7000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ZetaChain&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;nativeCurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ZETA&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ZETA&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;decimals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;rpcUrls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://rpc.swiftnodes.io/rpc/zetachain?key=YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;zeta&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;http&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBlockNumber&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;   &lt;span class="c1"&gt;// just works&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The headline: omnichain contracts over native assets
&lt;/h2&gt;

&lt;p&gt;Here's what makes ZetaChain different from a bridge or a wrapped-asset chain. Its validator set collectively controls addresses on external chains via a &lt;strong&gt;threshold signature scheme&lt;/strong&gt; — no single party holds the keys. That lets the &lt;em&gt;chain itself&lt;/em&gt; hold and move native assets on Bitcoin, Ethereum, and other connected networks. So a contract on ZetaChain can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;React to a deposit on another chain&lt;/strong&gt; (including a native BTC transfer) and run logic in response.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Move native assets on external chains&lt;/strong&gt; as an outcome of that logic — without a centralized bridge operator and without minting a wrapped representation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The concrete payoff developers point to: &lt;strong&gt;native Bitcoin DeFi.&lt;/strong&gt; Instead of building on WBTC (a wrapped IOU with its own trust assumptions), a ZetaChain contract can work with &lt;em&gt;actual&lt;/em&gt; BTC, because the TSS network can custody and release it. It's a genuinely different model from, say, &lt;a href="https://swiftnodes.io/blog/rootstock-rpc-bitcoin-evm" rel="noopener noreferrer"&gt;Rootstock&lt;/a&gt;, which brings smart contracts to Bitcoin via merge-mining and a pegged BTC — ZetaChain instead reaches &lt;em&gt;out&lt;/em&gt; to native Bitcoin (and other chains) from an omnichain hub.&lt;/p&gt;

&lt;h2&gt;
  
  
  How you actually use it from the RPC
&lt;/h2&gt;

&lt;p&gt;For the developer, the good news is that this power is exposed through &lt;strong&gt;standard EVM calls&lt;/strong&gt;. You interact with ZetaChain's cross-chain system contracts (its gateway and related protocol contracts) the same way you'd call any contract — &lt;code&gt;eth_call&lt;/code&gt; to read, &lt;code&gt;eth_sendRawTransaction&lt;/code&gt; to write. The omnichain behavior is what those system contracts do; the &lt;em&gt;interface&lt;/em&gt; is ordinary EVM:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy your omnichain contract with foundry/hardhat like any Solidity contract.&lt;/li&gt;
&lt;li&gt;Read cross-chain state and balances with &lt;code&gt;eth_call&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Trigger cross-chain actions by calling the gateway; the TSS network carries them out on the target chain.&lt;/li&gt;
&lt;li&gt;Watch results with &lt;code&gt;eth_getLogs&lt;/code&gt; / &lt;code&gt;eth_subscribe&lt;/code&gt; on ZetaEVM, plus the connected-chain confirmations.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't need a special RPC namespace for the cross-chain part — it's all Solidity and &lt;code&gt;eth_*&lt;/code&gt;, which is why standard tooling works. (Under the hood it's a Cosmos-SDK chain, like the "EVM cockpit over a Cosmos engine" pattern we covered on &lt;a href="https://swiftnodes.io/blog/kaia-rpc-klaytn-finschia" rel="noopener noreferrer"&gt;Kaia&lt;/a&gt; and &lt;a href="https://swiftnodes.io/blog/story-rpc-programmable-ip" rel="noopener noreferrer"&gt;Story&lt;/a&gt;; the native Cosmos layer is reachable via CometBFT RPC as in the &lt;a href="https://swiftnodes.io/blog/cosmos-rpc-explained" rel="noopener noreferrer"&gt;Cosmos RPC explainer&lt;/a&gt;, but for EVM work you stay on chain 7000.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Finality: instant, so index the head
&lt;/h2&gt;

&lt;p&gt;CometBFT gives &lt;strong&gt;instant, single-slot BFT finality&lt;/strong&gt; — a committed block is final, no reorgs. That matters doubly for an omnichain chain: a cross-chain action you observed as final won't be undone on the ZetaChain side. The whole class of &lt;a href="https://swiftnodes.io/blog/handling-chain-reorgs-indexer" rel="noopener noreferrer"&gt;reorg-handling defenses&lt;/a&gt; collapses to "confirm once" on ZetaEVM. (The &lt;em&gt;connected&lt;/em&gt; chains keep their own finality characteristics — a native BTC leg still follows Bitcoin's probabilistic confirmations — so cross-chain flows are as final as their slowest chain, which is worth designing around.)&lt;/p&gt;

&lt;h2&gt;
  
  
  What carries over unchanged
&lt;/h2&gt;

&lt;p&gt;On the ZetaEVM (chain 7000), treat it as a standard EVM chain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;eth_call&lt;/code&gt;, &lt;code&gt;eth_getBalance&lt;/code&gt;, &lt;code&gt;eth_getLogs&lt;/code&gt;, &lt;code&gt;eth_getTransactionReceipt&lt;/code&gt;, &lt;code&gt;eth_estimateGas&lt;/code&gt;, &lt;code&gt;eth_sendRawTransaction&lt;/code&gt;, &lt;code&gt;eth_subscribe&lt;/code&gt; all behave normally.&lt;/li&gt;
&lt;li&gt;Solidity contracts, ABIs, and the viem/ethers/hardhat/foundry toolchain deploy and run as-is.&lt;/li&gt;
&lt;li&gt;ZETA is the gas token with 18 decimals; WebSocket subscriptions (&lt;code&gt;newHeads&lt;/code&gt;, &lt;code&gt;logs&lt;/code&gt;) work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your app spans native UTXO chains too (ZetaChain famously connects to Bitcoin), it's worth understanding the UTXO side as well — see the &lt;a href="https://swiftnodes.io/blog/litecoin-rpc-blockbook-utxo" rel="noopener noreferrer"&gt;Litecoin/Blockbook spotlight&lt;/a&gt; for how non-account chains are queried.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;ZetaChain (EVM chain ID 7000) is an omnichain L1: a single Solidity contract can read and write across connected chains — including &lt;strong&gt;native Bitcoin, with no wrapping and no centralized bridge&lt;/strong&gt; — because a TSS validator set lets the chain custody and move native assets on external networks. The ZetaEVM is standard &lt;code&gt;eth_*&lt;/code&gt; (viem/ethers/foundry unchanged) and you drive the cross-chain machinery through ordinary contract calls; underneath it's a Cosmos-SDK chain with &lt;strong&gt;instant BFT finality&lt;/strong&gt; (confirm once on ZetaEVM). Build the EVM side like any EVM chain, and reach out to other chains through the omnichain gateway.&lt;/p&gt;

&lt;p&gt;Building omnichain apps, native Bitcoin DeFi, or bridgeless cross-chain flows? A flat-rate &lt;a href="https://swiftnodes.io/zetachain-rpc" rel="noopener noreferrer"&gt;ZetaChain RPC endpoint&lt;/a&gt; gives you chain 7000 over HTTP and WebSocket alongside 75+ other chains under one key. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt; and point your stack at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://rpc.swiftnodes.io/rpc/zetachain?key=YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://swiftnodes.io/blog/zetachain-rpc-omnichain" rel="noopener noreferrer"&gt;SwiftNodes blog&lt;/a&gt;. SwiftNodes provides flat-rate multi-chain RPC endpoints — HTTP + WebSocket, 75+ chains, no per-request metering. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Plasma RPC: The Chain Where Sending USDT Costs Nothing</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Sun, 26 Jul 2026 06:36:26 +0000</pubDate>
      <link>https://dev.to/swiftnodes/plasma-rpc-the-chain-where-sending-usdt-costs-nothing-353e</link>
      <guid>https://dev.to/swiftnodes/plasma-rpc-the-chain-where-sending-usdt-costs-nothing-353e</guid>
      <description>&lt;p&gt;Most chains treat stablecoins as just another ERC-20. Plasma treats them as the point. It's an EVM Layer 1 &lt;strong&gt;purpose-built for stablecoin payments&lt;/strong&gt;, and its headline feature is one users feel immediately: &lt;strong&gt;basic USDT transfers are zero-fee&lt;/strong&gt;, sponsored by a protocol-level paymaster — so a user can send USDT without holding the native token at all. For a developer building payments, that removes the single biggest friction on every other chain. Plasma is standard EVM underneath (chain ID &lt;strong&gt;9745&lt;/strong&gt;, ordinary &lt;code&gt;eth_*&lt;/code&gt;, viem/ethers/foundry unchanged), but the stablecoin-first design is the reason to build here. Here's the map.&lt;/p&gt;

&lt;h2&gt;
  
  
  The essentials
&lt;/h2&gt;

&lt;p&gt;Plasma mainnet (beta since September 2025) is &lt;strong&gt;chain ID 9745&lt;/strong&gt;, an EVM Layer 1 with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;XPL as the native gas token&lt;/strong&gt; (18 decimals) — but often &lt;em&gt;not&lt;/em&gt; the token users actually pay with (see below).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sub-second blocks&lt;/strong&gt; and &lt;strong&gt;fast BFT finality&lt;/strong&gt; via &lt;strong&gt;PlasmaBFT&lt;/strong&gt; consensus.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bitcoin anchoring&lt;/strong&gt; — Plasma periodically anchors its state to Bitcoin for added security.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EVM-compatible&lt;/strong&gt; — Solidity, ABIs, and standard tooling deploy without changes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Connecting is standard EVM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;defineChain&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;plasma&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineChain&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;9745&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Plasma&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;nativeCurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;XPL&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;XPL&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;decimals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;rpcUrls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://rpc.swiftnodes.io/rpc/plasma?key=YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;plasma&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;http&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBlockNumber&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;   &lt;span class="c1"&gt;// just works&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The headline: zero-fee USDT transfers
&lt;/h2&gt;

&lt;p&gt;The feature that defines Plasma is a &lt;strong&gt;protocol paymaster that sponsors basic USDT transfers&lt;/strong&gt;. In practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A user can &lt;strong&gt;send USDT with no gas fee and without holding XPL.&lt;/strong&gt; The "you must acquire the native token before you can move anything" cliff — the one that kills onboarding on every other chain — simply isn't there for the most common action.&lt;/li&gt;
&lt;li&gt;For a payments product, that's transformative: someone can receive USDT and immediately send it onward, with no prior funding step and no native-token balance to manage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The developer implication is that your &lt;strong&gt;payment flows can assume gasless USDT movement&lt;/strong&gt; for basic transfers. You're not integrating a third-party paymaster or building meta-transaction relayers — the sponsorship is a protocol feature of the chain. (If you've read the &lt;a href="https://swiftnodes.io/blog/celo-rpc-l2-fee-currency" rel="noopener noreferrer"&gt;Celo fee-currency post&lt;/a&gt;, this is a close cousin — but where Celo lets you &lt;em&gt;pay gas in&lt;/em&gt; a stablecoin, Plasma &lt;em&gt;sponsors&lt;/em&gt; the basic transfer outright.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Gas in stablecoins for everything else
&lt;/h2&gt;

&lt;p&gt;Zero-fee covers basic USDT transfers; for more complex transactions, Plasma lets users &lt;strong&gt;pay gas in stablecoins&lt;/strong&gt; rather than requiring XPL. So even a contract interaction doesn't force a user to hold the native token — they can settle fees in the stablecoin they already have.&lt;/p&gt;

&lt;p&gt;For you, that means the same design consideration Celo introduced: &lt;strong&gt;gas isn't purely a native-token concern.&lt;/strong&gt; Standard &lt;code&gt;eth_estimateGas&lt;/code&gt; still returns the gas &lt;em&gt;units&lt;/em&gt; (&lt;a href="https://swiftnodes.io/blog/estimating-gas-eth-estimategas-eip-1559" rel="noopener noreferrer"&gt;gas estimation basics&lt;/a&gt;); the stablecoin-fee layer sits on top, converting that to a charge in the chosen token. If you build with XPL as the fee token, everything behaves like a vanilla EVM chain — the stablecoin options are there when you want them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sub-second BFT finality: built for payments
&lt;/h2&gt;

&lt;p&gt;PlasmaBFT gives &lt;strong&gt;sub-second block times and fast BFT finality&lt;/strong&gt; — which matters enormously for a payments chain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Payments confirm in well under a second and don't reverse.&lt;/strong&gt; For a point-of-sale or remittance flow, "did it go through?" resolves instantly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No reorgs to defend against.&lt;/strong&gt; BFT finality means a confirmed block is final — the whole class of &lt;a href="https://swiftnodes.io/blog/handling-chain-reorgs-indexer" rel="noopener noreferrer"&gt;reorg-handling patterns&lt;/a&gt; reduces to "confirm once." Index at the head and trust it. It's the same fast-finality comfort as other BFT EVM chains like &lt;a href="https://swiftnodes.io/blog/kaia-rpc-klaytn-finschia" rel="noopener noreferrer"&gt;Kaia&lt;/a&gt; and &lt;a href="https://swiftnodes.io/blog/flare-rpc-enshrined-oracles" rel="noopener noreferrer"&gt;Flare&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;strong&gt;Bitcoin anchoring&lt;/strong&gt; adds a second layer to the security story — Plasma periodically commits its state to Bitcoin, borrowing Bitcoin's settlement assurances for long-range integrity. It's mostly invisible from the RPC, but it's part of why a stablecoin-settlement chain leans on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What carries over unchanged
&lt;/h2&gt;

&lt;p&gt;Aside from the paymaster and stablecoin-fee model, treat Plasma as a standard EVM chain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;eth_call&lt;/code&gt;, &lt;code&gt;eth_getBalance&lt;/code&gt;, &lt;code&gt;eth_getLogs&lt;/code&gt;, &lt;code&gt;eth_getTransactionReceipt&lt;/code&gt;, &lt;code&gt;eth_estimateGas&lt;/code&gt;, &lt;code&gt;eth_sendRawTransaction&lt;/code&gt;, &lt;code&gt;eth_subscribe&lt;/code&gt; all behave normally.&lt;/li&gt;
&lt;li&gt;Solidity contracts, ABIs, and the viem/ethers/hardhat/foundry toolchain deploy and run as-is.&lt;/li&gt;
&lt;li&gt;XPL is the native gas token with 18 decimals; WebSocket subscriptions (&lt;code&gt;newHeads&lt;/code&gt;, &lt;code&gt;logs&lt;/code&gt;) work; at sub-second blocks, stream rather than poll.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two practical notes: because it's a stablecoin-heavy chain, your &lt;strong&gt;indexing will be dominated by ERC-20 &lt;code&gt;Transfer&lt;/code&gt; events&lt;/strong&gt; (USDT movement) — filter on the transfer signature and the token address. And it's a &lt;strong&gt;young chain&lt;/strong&gt; (mainnet beta since late 2025), so parameters can still evolve — check Plasma's official docs for the latest specifics before shipping.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Plasma (chain ID 9745) is a stablecoin-focused EVM L1 whose defining feature is a &lt;strong&gt;protocol paymaster that makes basic USDT transfers zero-fee&lt;/strong&gt; — users send USDT with no gas and no native token — with &lt;strong&gt;gas payable in stablecoins&lt;/strong&gt; for everything else. It's standard EVM (XPL native gas, viem/ethers/foundry unchanged), with &lt;strong&gt;sub-second PlasmaBFT finality&lt;/strong&gt; (confirm once, no reorgs) and &lt;strong&gt;Bitcoin anchoring&lt;/strong&gt; for added security. Build it like any EVM chain, and lean on the gasless-stablecoin model for payment UX.&lt;/p&gt;

&lt;p&gt;Building stablecoin payments, remittances, or cross-border settlement? A flat-rate &lt;a href="https://swiftnodes.io/plasma-rpc" rel="noopener noreferrer"&gt;Plasma RPC endpoint&lt;/a&gt; gives you chain 9745 over HTTP and WebSocket alongside 75+ other chains under one key. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt; and point your stack at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;https://rpc.swiftnodes.io/rpc/plasma?key=YOUR_API_KEY
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://swiftnodes.io/blog/plasma-rpc-stablecoin-chain" rel="noopener noreferrer"&gt;SwiftNodes blog&lt;/a&gt;. SwiftNodes provides flat-rate multi-chain RPC endpoints — HTTP + WebSocket, 75+ chains, no per-request metering. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Astar RPC: One Chain, Two VMs, Polkadot Security</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Sat, 25 Jul 2026 06:31:14 +0000</pubDate>
      <link>https://dev.to/swiftnodes/astar-rpc-one-chain-two-vms-polkadot-security-4nm2</link>
      <guid>https://dev.to/swiftnodes/astar-rpc-one-chain-two-vms-polkadot-security-4nm2</guid>
      <description>&lt;p&gt;Most chains give you one virtual machine. Astar gives you two: a full &lt;strong&gt;EVM&lt;/strong&gt; environment &lt;em&gt;and&lt;/em&gt; &lt;strong&gt;WebAssembly (Wasm)&lt;/strong&gt; contracts, on the same Polkadot parachain. If you're building with Solidity, you use the EVM side — &lt;strong&gt;chain ID 592&lt;/strong&gt;, ordinary &lt;code&gt;eth_*&lt;/code&gt;, viem/ethers/foundry unchanged — and you may never touch the Wasm layer. But it's worth knowing what's underneath, because Astar is a &lt;strong&gt;Substrate-based Polkadot parachain&lt;/strong&gt;, and that gives it a security and finality model different from a standalone L1 or a rollup. Here's the map.&lt;/p&gt;

&lt;h2&gt;
  
  
  The essentials
&lt;/h2&gt;

&lt;p&gt;Astar's EVM is &lt;strong&gt;chain ID 592&lt;/strong&gt;, with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ASTR as the gas token&lt;/strong&gt; (18 decimals) — also used for staking and dApp Staking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~12-second blocks&lt;/strong&gt; with &lt;strong&gt;deterministic finality&lt;/strong&gt; via Polkadot's &lt;strong&gt;GRANDPA&lt;/strong&gt; finality gadget.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polkadot parachain&lt;/strong&gt; — inherits shared security from the Polkadot relay chain via nominated proof-of-stake.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dual VM&lt;/strong&gt; — EVM (Solidity) and Wasm (ink!) contracts coexist on the network.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Solidity work, connecting is completely standard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;astar&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem/chains&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// chain ID 592&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;astar&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;http&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://rpc.swiftnodes.io/rpc/astar?key=YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBlockNumber&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;   &lt;span class="c1"&gt;// just works&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One clarification up front: &lt;strong&gt;chain 592 is the Polkadot-based Astar EVM.&lt;/strong&gt; Astar has separately operated a zkEVM deployment on different infrastructure — that's a distinct network. When you point tooling at chain 592, you're on the parachain EVM.&lt;/p&gt;

&lt;h2&gt;
  
  
  The dual-VM model: EVM &lt;em&gt;and&lt;/em&gt; Wasm
&lt;/h2&gt;

&lt;p&gt;Astar's defining trait is that it runs two smart-contract environments side by side:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;EVM&lt;/strong&gt; — standard Solidity, deployed and called exactly as on Ethereum. This is what chain 592's RPC serves.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wasm (ink!)&lt;/strong&gt; — Rust-based WebAssembly contracts, native to the Substrate/Polkadot world.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For an RPC consumer, the practical takeaway is simple: &lt;strong&gt;the EVM side is a normal &lt;code&gt;eth_*&lt;/code&gt; endpoint&lt;/strong&gt;, so your Solidity contracts, ABIs, and tooling work with zero changes. The Wasm side lives in the Substrate layer and is reached through Polkadot's own RPC (Substrate JSON-RPC / Polkadot.js), not &lt;code&gt;eth_*&lt;/code&gt;. If you're doing pure Solidity, you stay entirely in the EVM RPC and the Wasm layer is just... there, an option for teams that want it. The two can interoperate, but that's an advanced path — most EVM developers use chain 592 like any other EVM chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The parachain model: what changes underneath
&lt;/h2&gt;

&lt;p&gt;Astar isn't a standalone L1 and isn't a rollup — it's a &lt;strong&gt;parachain&lt;/strong&gt;, which shapes two things worth understanding:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shared security from Polkadot.&lt;/strong&gt; Rather than bootstrapping its own validator economy, Astar inherits security from the Polkadot relay chain's validator set (nominated PoS). Its safety rides on Polkadot's.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deterministic finality via GRANDPA.&lt;/strong&gt; Polkadot's finality gadget provides &lt;em&gt;deterministic&lt;/em&gt; finality — once a block is finalized, it's irreversible. That means &lt;strong&gt;no reorgs to defend against&lt;/strong&gt; once finality is reached. The whole class of &lt;a href="https://swiftnodes.io/blog/handling-chain-reorgs-indexer" rel="noopener noreferrer"&gt;reorg-handling patterns&lt;/a&gt; — waiting many confirmations, tolerating tip rollbacks — reduces to tracking the finalized head. It's the same "confirm once" comfort you get on other deterministic-finality EVM chains like &lt;a href="https://swiftnodes.io/blog/kaia-rpc-klaytn-finschia" rel="noopener noreferrer"&gt;Kaia&lt;/a&gt; and &lt;a href="https://swiftnodes.io/blog/flare-rpc-enshrined-oracles" rel="noopener noreferrer"&gt;Flare&lt;/a&gt;, just delivered by Polkadot's consensus rather than a chain-specific one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There's also a conceptual parallel worth drawing: like the Cosmos chains where an EVM sits atop a non-EVM native layer, Astar's EVM (via the Frontier compatibility layer) sits atop &lt;strong&gt;Substrate&lt;/strong&gt;. You mostly won't see it from the &lt;code&gt;eth_*&lt;/code&gt; RPC, but it's why the underlying architecture differs from a from-scratch EVM chain. (If you've read the &lt;a href="https://swiftnodes.io/blog/cosmos-rpc-explained" rel="noopener noreferrer"&gt;Cosmos RPC explainer&lt;/a&gt;, it's a similar "EVM cockpit over a different engine" idea — and different again from a non-EVM chain like &lt;a href="https://swiftnodes.io/blog/sui-rpc-object-model" rel="noopener noreferrer"&gt;Sui&lt;/a&gt; with its own object model.)&lt;/p&gt;

&lt;h2&gt;
  
  
  dApp Staking: an ecosystem quirk worth knowing
&lt;/h2&gt;

&lt;p&gt;Astar has a distinctive &lt;strong&gt;dApp Staking&lt;/strong&gt; program: ASTR stakers can direct rewards to the projects building on the network, so dApps earn ongoing support based on the stake backing them. It doesn't change your RPC integration, but it's part of why teams choose to build here — worth a mention if you're evaluating the chain, not just querying it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What carries over unchanged
&lt;/h2&gt;

&lt;p&gt;On the EVM side (chain 592), treat Astar as a standard EVM chain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;eth_call&lt;/code&gt;, &lt;code&gt;eth_getBalance&lt;/code&gt;, &lt;code&gt;eth_getLogs&lt;/code&gt;, &lt;code&gt;eth_getTransactionReceipt&lt;/code&gt;, &lt;code&gt;eth_estimateGas&lt;/code&gt;, &lt;code&gt;eth_sendRawTransaction&lt;/code&gt;, &lt;code&gt;eth_subscribe&lt;/code&gt; all behave normally.&lt;/li&gt;
&lt;li&gt;Solidity contracts, ABIs, and the viem/ethers/hardhat/foundry toolchain deploy and run as-is.&lt;/li&gt;
&lt;li&gt;ASTR is the gas token with 18 decimals; WebSocket subscriptions (&lt;code&gt;newHeads&lt;/code&gt;, &lt;code&gt;logs&lt;/code&gt;) work; if you're pulling lots of reads, &lt;a href="https://swiftnodes.io/blog/json-rpc-batching" rel="noopener noreferrer"&gt;batch them&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Astar (EVM chain ID 592) is a Polkadot parachain that runs &lt;strong&gt;both EVM and Wasm&lt;/strong&gt; contracts. For Solidity, it's a standard &lt;code&gt;eth_*&lt;/code&gt; endpoint — viem/ethers/foundry unchanged — while the Wasm (ink!) side lives in the Substrate layer reached via Polkadot's RPC. The parachain model gives it &lt;strong&gt;shared security from Polkadot&lt;/strong&gt; and &lt;strong&gt;deterministic GRANDPA finality&lt;/strong&gt; (no reorgs once finalized, so index the finalized head and confirm once). Build the EVM side like any EVM chain; know that the Wasm option and Substrate underpinnings are there.&lt;/p&gt;

&lt;p&gt;Deploying Solidity on Astar, or building across its EVM and Wasm environments? A flat-rate &lt;a href="https://swiftnodes.io/astar-rpc" rel="noopener noreferrer"&gt;Astar RPC endpoint&lt;/a&gt; gives you chain 592 over HTTP and WebSocket alongside 75+ other chains under one key. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt; and point your stack at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://rpc.swiftnodes.io/rpc/astar?key=YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://swiftnodes.io/blog/astar-rpc-evm-wasm-parachain" rel="noopener noreferrer"&gt;SwiftNodes blog&lt;/a&gt;. SwiftNodes provides flat-rate multi-chain RPC endpoints — HTTP + WebSocket, 75+ chains, no per-request metering. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Flare RPC: The L1 With Oracles Built Into the Protocol</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Fri, 24 Jul 2026 04:40:48 +0000</pubDate>
      <link>https://dev.to/swiftnodes/flare-rpc-the-l1-with-oracles-built-into-the-protocol-hme</link>
      <guid>https://dev.to/swiftnodes/flare-rpc-the-l1-with-oracles-built-into-the-protocol-hme</guid>
      <description>&lt;p&gt;On most chains, getting external data into a smart contract means integrating a &lt;em&gt;third-party&lt;/em&gt; oracle — deploy against Chainlink, wire up feeds, manage the dependency. Flare inverts that: &lt;strong&gt;the oracle is part of the chain.&lt;/strong&gt; Decentralized price feeds (FTSO) and cross-chain/Web2 data verification (FDC) are &lt;strong&gt;enshrined protocol primitives&lt;/strong&gt; — contracts read them natively, with no external oracle to deploy or pay. For a developer, Flare is a standard EVM L1 on the surface (chain ID &lt;strong&gt;14&lt;/strong&gt;, ordinary &lt;code&gt;eth_*&lt;/code&gt;, viem/ethers/foundry unchanged) — but its native data layers are the reason to build here, and they're all reachable over the same RPC. Here's the map.&lt;/p&gt;

&lt;h2&gt;
  
  
  The essentials
&lt;/h2&gt;

&lt;p&gt;Flare mainnet is &lt;strong&gt;chain ID 14&lt;/strong&gt;, an EVM Layer 1 with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FLR as the gas token&lt;/strong&gt; (18 decimals).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~1.8-second blocks&lt;/strong&gt; with &lt;strong&gt;near-instant finality&lt;/strong&gt; — once a block is accepted, it's final.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Snowman++ / Federated Byzantine Agreement&lt;/strong&gt; consensus (Avalanche-derived) — fast, BFT-style finality.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EVM-compatible&lt;/strong&gt; — Solidity, ABIs, and standard tooling work directly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Connecting is boringly standard EVM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;flare&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem/chains&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// chain ID 14&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;flare&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;http&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://rpc.swiftnodes.io/rpc/flare?key=YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBlockNumber&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;   &lt;span class="c1"&gt;// just works&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What makes Flare different: enshrined data protocols
&lt;/h2&gt;

&lt;p&gt;Flare's reason to exist is bringing trustworthy external data on-chain &lt;em&gt;natively&lt;/em&gt;. Two protocols are built into the base layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FTSO (Flare Time Series Oracle)&lt;/strong&gt; — decentralized &lt;strong&gt;price and time-series feeds&lt;/strong&gt;, sourced from a set of independent data providers and delivered on-chain. Instead of integrating an external price oracle, a Flare contract reads FTSO feeds directly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FDC (Flare Data Connector)&lt;/strong&gt; — lets contracts &lt;strong&gt;verify state from other blockchains and Web2 sources&lt;/strong&gt;. It's the "is this true on chain X / at URL Y?" primitive, enshrined so contracts can trust attested external data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key point for RPC consumers: &lt;strong&gt;you access these the same way you access any contract — with &lt;code&gt;eth_call&lt;/code&gt;.&lt;/strong&gt; FTSO and FDC are exposed through on-chain system contracts, so reading a price feed or a verified data attestation is a normal EVM read against a known address. There's no separate oracle API and no special RPC namespace — the "oracle" is just more state your standard &lt;code&gt;eth_call&lt;/code&gt; can reach.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// FTSO feeds and FDC attestations are read like any contract — standard eth_call.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;readContract&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;address&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ftsoRegistryOrFeedAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// Flare's enshrined FTSO system contract&lt;/span&gt;
  &lt;span class="na"&gt;abi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ftsoAbi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;functionName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;getFeedById&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;// exact method depends on the FTSO version/interface&lt;/span&gt;
  &lt;span class="na"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;feedId&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The developer implication is that a DeFi app needing prices, or a cross-chain app needing to verify a deposit on another network, does that with &lt;strong&gt;native reads&lt;/strong&gt; rather than a third-party oracle integration. If you're pulling several feeds at once, &lt;a href="https://swiftnodes.io/blog/json-rpc-batching" rel="noopener noreferrer"&gt;batch the calls&lt;/a&gt; to cut round-trips — it's the same JSON-RPC batching you'd use anywhere.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finality: near-instant, so drop the reorg defenses
&lt;/h2&gt;

&lt;p&gt;Flare's FBA/Snowman++ consensus gives &lt;strong&gt;near-immediate finality&lt;/strong&gt; — once a block is accepted, it doesn't roll back. Practically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No reorgs to defend against.&lt;/strong&gt; The whole class of &lt;a href="https://swiftnodes.io/blog/handling-chain-reorgs-indexer" rel="noopener noreferrer"&gt;reorg-handling patterns&lt;/a&gt; — waiting N confirmations, keying on &lt;code&gt;(txHash, logIndex)&lt;/code&gt;, tolerating tip rollbacks — collapses to "confirm once." Index at the head and trust it.&lt;/li&gt;
&lt;li&gt;This matters doubly for oracle-consuming apps: a price read or a cross-chain attestation you acted on won't be undone by a reorg. That's the kind of guarantee you want when a feed drives liquidations or a bridge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's the same fast-finality profile as other BFT-style EVM L1s we've covered, like &lt;a href="https://swiftnodes.io/blog/kaia-rpc-klaytn-finschia" rel="noopener noreferrer"&gt;Kaia&lt;/a&gt; and &lt;a href="https://swiftnodes.io/blog/sei-rpc-parallel-evm" rel="noopener noreferrer"&gt;Sei&lt;/a&gt; — code written to wait 12 confirmations is just adding latency here.&lt;/p&gt;

&lt;h2&gt;
  
  
  What carries over unchanged
&lt;/h2&gt;

&lt;p&gt;Aside from the native data layers, treat Flare as a standard EVM chain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;eth_call&lt;/code&gt;, &lt;code&gt;eth_getBalance&lt;/code&gt;, &lt;code&gt;eth_getLogs&lt;/code&gt;, &lt;code&gt;eth_getTransactionReceipt&lt;/code&gt;, &lt;code&gt;eth_estimateGas&lt;/code&gt;, &lt;code&gt;eth_sendRawTransaction&lt;/code&gt;, &lt;code&gt;eth_subscribe&lt;/code&gt; all behave normally — including &lt;a href="https://swiftnodes.io/blog/reading-transaction-receipts-eth-gettransactionreceipt" rel="noopener noreferrer"&gt;reading receipts&lt;/a&gt; for your own transactions.&lt;/li&gt;
&lt;li&gt;Solidity contracts, ABIs, and the viem/ethers/hardhat/foundry toolchain deploy and run as-is.&lt;/li&gt;
&lt;li&gt;FLR is the gas token with 18 decimals; WebSocket subscriptions (&lt;code&gt;newHeads&lt;/code&gt;, &lt;code&gt;logs&lt;/code&gt;) work; at ~1.8s blocks, stream rather than poll.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Flare (chain ID 14) is an EVM L1 with &lt;strong&gt;oracles enshrined in the protocol&lt;/strong&gt;: FTSO delivers decentralized price/time-series feeds and FDC verifies cross-chain and Web2 data, both read through on-chain system contracts with ordinary &lt;code&gt;eth_call&lt;/code&gt; — no third-party oracle to deploy or pay. It's standard EVM otherwise (FLR gas, ~1.8s blocks, viem/ethers/foundry unchanged), with &lt;strong&gt;near-instant finality&lt;/strong&gt; so you can drop confirmation-counting and reorg defenses. Build it like any EVM chain, and lean on the native data layers instead of bolting on an external oracle.&lt;/p&gt;

&lt;p&gt;Building DeFi that needs price feeds, or cross-chain apps that verify external state? A flat-rate &lt;a href="https://swiftnodes.io/flare-rpc" rel="noopener noreferrer"&gt;Flare RPC endpoint&lt;/a&gt; gives you chain 14 over HTTP and WebSocket alongside 75+ other chains under one key. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt; and point your stack at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://rpc.swiftnodes.io/rpc/flare?key=YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://swiftnodes.io/blog/flare-rpc-enshrined-oracles" rel="noopener noreferrer"&gt;SwiftNodes blog&lt;/a&gt;. SwiftNodes provides flat-rate multi-chain RPC endpoints — HTTP + WebSocket, 75+ chains, no per-request metering. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Cosmos RPC Explained: Tendermint RPC vs REST vs gRPC</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Thu, 23 Jul 2026 06:40:51 +0000</pubDate>
      <link>https://dev.to/swiftnodes/cosmos-rpc-explained-tendermint-rpc-vs-rest-vs-grpc-326g</link>
      <guid>https://dev.to/swiftnodes/cosmos-rpc-explained-tendermint-rpc-vs-rest-vs-grpc-326g</guid>
      <description>&lt;p&gt;If you come to the Cosmos ecosystem from Ethereum, the first thing that trips you up isn't the SDK or the tokens — it's the word "RPC." On Ethereum, &lt;em&gt;the RPC&lt;/em&gt; is a single JSON-RPC endpoint, and &lt;code&gt;eth_*&lt;/code&gt; methods do everything. On a Cosmos chain, "RPC" can mean &lt;strong&gt;three different interfaces&lt;/strong&gt;, each running on its own port, each answering a different kind of question. Point CosmJS at the wrong one and nothing works. This post clears that up: what the three interfaces are, when to use each, and the one mental shift — &lt;strong&gt;you query modules, not contracts&lt;/strong&gt; — that makes the whole thing click. It applies to every Cosmos-SDK chain, including the ones we've spotlighted: &lt;a href="https://swiftnodes.io/blog/celestia-rpc-modular-da" rel="noopener noreferrer"&gt;Celestia&lt;/a&gt;, &lt;a href="https://swiftnodes.io/blog/osmosis-rpc-cosmos-dex" rel="noopener noreferrer"&gt;Osmosis&lt;/a&gt;, and Injective.&lt;/p&gt;

&lt;h2&gt;
  
  
  First, the mental shift: modules, not contracts
&lt;/h2&gt;

&lt;p&gt;On Ethereum, state lives inside smart contracts, and you read it by &lt;code&gt;eth_call&lt;/code&gt;-ing a contract function. On a Cosmos chain, the base functionality — balances, staking, governance, and app-specific logic — lives in &lt;strong&gt;modules&lt;/strong&gt; compiled into the chain binary (&lt;code&gt;bank&lt;/code&gt;, &lt;code&gt;staking&lt;/code&gt;, &lt;code&gt;gov&lt;/code&gt;, plus app modules like Osmosis's &lt;code&gt;poolmanager&lt;/code&gt;). You don't call a contract's &lt;code&gt;balanceOf&lt;/code&gt;; you query the &lt;strong&gt;bank module&lt;/strong&gt; for an address's balance.&lt;/p&gt;

&lt;p&gt;So there's no &lt;code&gt;eth_getBalance&lt;/code&gt;, no &lt;code&gt;eth_getLogs&lt;/code&gt;, no &lt;code&gt;eth_call&lt;/code&gt;. Instead, every interface below is a different &lt;em&gt;way to reach the same module queries and the underlying consensus data.&lt;/em&gt; Keep that in mind and the three endpoints stop being confusing — they're three doors into the same house.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  1. Tendermint / CometBFT RPC — the consensus layer (port 26657)
&lt;/h3&gt;

&lt;p&gt;This is what people usually mean by "the Cosmos RPC," and it's what an integration points CosmJS at. It's a JSON-RPC (and URI) interface to the &lt;strong&gt;consensus engine&lt;/strong&gt; — CometBFT (formerly Tendermint) — exposing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chain/consensus data&lt;/strong&gt;: &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;block&lt;/code&gt;, &lt;code&gt;block_results&lt;/code&gt;, &lt;code&gt;commit&lt;/code&gt;, &lt;code&gt;validators&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transactions&lt;/strong&gt;: &lt;code&gt;tx&lt;/code&gt;, &lt;code&gt;tx_search&lt;/code&gt;, and broadcasting via &lt;code&gt;broadcast_tx_sync&lt;/code&gt; / &lt;code&gt;_async&lt;/code&gt; / &lt;code&gt;_commit&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generic state access&lt;/strong&gt;: &lt;code&gt;abci_query&lt;/code&gt; — the escape hatch that lets you query &lt;em&gt;any&lt;/em&gt; module's state by path.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's the lowest-level, most universal interface: block data, transaction submission, and (via &lt;code&gt;abci_query&lt;/code&gt;) all module state. If you're tailing the chain, broadcasting transactions, or building with CosmJS, this is your endpoint.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StargateClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@cosmjs/stargate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// CosmJS talks to the Tendermint/CometBFT RPC&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;StargateClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://rpc.swiftnodes.io/rpc/osmosis?key=YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getHeight&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;             &lt;span class="c1"&gt;// current block height&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAllBalances&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;address&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// bank module, under the hood&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. REST / LCD — the HTTP gateway (port 1317)
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;LCD&lt;/strong&gt; ("Light Client Daemon," now just the REST API) is a RESTful gateway that maps plain HTTP GET paths to the same module queries. It's generated from the modules' protobuf definitions via gRPC-gateway, so every query has a URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /cosmos/bank/v1beta1/balances/{address}
GET /cosmos/staking/v1beta1/validators
GET /osmosis/poolmanager/v1beta1/pools
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;REST is the convenient choice for browsers, quick scripts, and reading module state without any protobuf tooling — paste a URL, get JSON. It's a read-and-broadcast gateway, not a consensus interface: you won't tail blocks here, but you'll happily fetch balances, positions, and app-module state.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. gRPC — the typed interface (port 9090)
&lt;/h3&gt;

&lt;p&gt;Under the hood, Cosmos modules define their queries in &lt;strong&gt;protobuf&lt;/strong&gt;, and gRPC is the native, strongly-typed way to call them. With generated clients you get type safety, efficient binary encoding, and streaming — the right choice for &lt;strong&gt;production backends&lt;/strong&gt; that want typed queries rather than hand-built URLs or JSON. REST is literally a gateway &lt;em&gt;in front of&lt;/em&gt; gRPC, so anything REST can do, gRPC can do with types.&lt;/p&gt;

&lt;h3&gt;
  
  
  Which one do I use?
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Interface&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Tail blocks, get consensus/tx data&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Tendermint RPC&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Broadcast a signed transaction&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Tendermint RPC&lt;/strong&gt; (&lt;code&gt;broadcast_tx_*&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Quick reads, browser apps, no tooling&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;REST / LCD&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typed queries in a production backend&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;gRPC&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Generic "query any module state"&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Tendermint RPC&lt;/strong&gt; &lt;code&gt;abci_query&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For most integrations — wallets, indexers, dApps built with CosmJS — you'll live in the &lt;strong&gt;Tendermint RPC&lt;/strong&gt;, because it covers block data, transaction submission, and (via &lt;code&gt;abci_query&lt;/code&gt;) all module state. That's the endpoint SwiftNodes serves at &lt;code&gt;/rpc/&amp;lt;chain&amp;gt;&lt;/code&gt; for Cosmos chains.&lt;/p&gt;

&lt;h2&gt;
  
  
  Broadcasting transactions: messages, not calldata
&lt;/h2&gt;

&lt;p&gt;Cosmos transactions aren't EVM calldata — they're &lt;strong&gt;Cosmos SDK messages&lt;/strong&gt; (&lt;code&gt;Msg&lt;/code&gt; types: &lt;code&gt;MsgSend&lt;/code&gt;, &lt;code&gt;MsgDelegate&lt;/code&gt;, Osmosis's &lt;code&gt;MsgSwapExactAmountIn&lt;/code&gt;, etc.). You build and sign them with CosmJS, then broadcast over the Tendermint RPC:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SigningStargateClient&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@cosmjs/stargate&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;SigningStargateClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connectWithSigner&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://rpc.swiftnodes.io/rpc/osmosis?key=YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;wallet&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sendTokens&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;denom&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;uosmo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1000000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}],&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;auto&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two Cosmos gotchas worth flagging, both covered in the &lt;a href="https://swiftnodes.io/blog/osmosis-rpc-cosmos-dex" rel="noopener noreferrer"&gt;Osmosis spotlight&lt;/a&gt;: amounts are in &lt;strong&gt;micro-denominations&lt;/strong&gt; (&lt;code&gt;uosmo&lt;/code&gt;, &lt;code&gt;uatom&lt;/code&gt; — 1 token = 1,000,000 base units), and cross-chain assets show up as &lt;strong&gt;&lt;code&gt;ibc/&amp;lt;HASH&amp;gt;&lt;/code&gt;&lt;/strong&gt; denoms you resolve via the denom trace.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finality: single-block, no reorgs
&lt;/h2&gt;

&lt;p&gt;One genuinely nice thing after Ethereum: CometBFT gives &lt;strong&gt;single-block BFT finality&lt;/strong&gt;. When a block commits, it's final — there are no reorgs, no confirmation counting, no "wait 12 blocks." Index at the tip and trust it. (Contrast with the reorg defenses probabilistic chains force on you — none of that here.)&lt;/p&gt;

&lt;h2&gt;
  
  
  How this maps to the Cosmos chains you'll use
&lt;/h2&gt;

&lt;p&gt;Every Cosmos-SDK chain follows this same three-interface pattern; only the &lt;em&gt;app modules&lt;/em&gt; differ:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://swiftnodes.io/blog/celestia-rpc-modular-da" rel="noopener noreferrer"&gt;Celestia&lt;/a&gt;&lt;/strong&gt; — a modular data-availability layer; its core consensus RPC is standard CometBFT, with blob submission living in a separate node API.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://swiftnodes.io/blog/osmosis-rpc-cosmos-dex" rel="noopener noreferrer"&gt;Osmosis&lt;/a&gt;&lt;/strong&gt; — a DEX where the AMM is a native module (&lt;code&gt;poolmanager&lt;/code&gt;/&lt;code&gt;gamm&lt;/code&gt;), queried through exactly these interfaces rather than a smart contract.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Injective&lt;/strong&gt; — a finance-focused chain whose order-book and exchange logic are likewise native modules (&lt;a href="https://swiftnodes.io/injective-rpc" rel="noopener noreferrer"&gt;Injective RPC&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Learn the pattern once and every Cosmos chain is approachable — the modules change, the three doors don't. And since the Tendermint RPC is plain JSON-RPC, standard conveniences like &lt;a href="https://swiftnodes.io/blog/json-rpc-batching" rel="noopener noreferrer"&gt;request batching&lt;/a&gt; still apply when you're making many reads. (It's a different world from the non-Cosmos non-EVM chains like &lt;a href="https://swiftnodes.io/blog/sui-rpc-object-model" rel="noopener noreferrer"&gt;Sui&lt;/a&gt;, which has its own object-model API entirely.)&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;"Cosmos RPC" isn't one thing — it's three interfaces to the same chain: &lt;strong&gt;Tendermint/CometBFT RPC&lt;/strong&gt; (consensus + tx broadcast + generic &lt;code&gt;abci_query&lt;/code&gt;, port 26657, what CosmJS uses), &lt;strong&gt;REST/LCD&lt;/strong&gt; (HTTP gateway to module queries, port 1317, browser-friendly), and &lt;strong&gt;gRPC&lt;/strong&gt; (typed protobuf queries, port 9090, for backends). The unifying idea is that you &lt;strong&gt;query modules, not contracts&lt;/strong&gt; — no &lt;code&gt;eth_*&lt;/code&gt;, no &lt;code&gt;balanceOf&lt;/code&gt;; you ask the &lt;code&gt;bank&lt;/code&gt; module for a balance and the app module for app state. Transactions are signed &lt;code&gt;Msg&lt;/code&gt; types broadcast over the Tendermint RPC, and finality is single-block (no reorgs).&lt;/p&gt;

&lt;p&gt;Building on the Cosmos ecosystem? A flat-rate &lt;a href="https://swiftnodes.io/cosmos-rpc" rel="noopener noreferrer"&gt;Cosmos RPC endpoint&lt;/a&gt; gives you CometBFT RPC across Celestia, Osmosis, Injective, the Cosmos Hub and more — all under one key. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt; and connect CosmJS to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://rpc.swiftnodes.io/rpc/&amp;lt;chain&amp;gt;?key=YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://swiftnodes.io/blog/cosmos-rpc-explained" rel="noopener noreferrer"&gt;SwiftNodes blog&lt;/a&gt;. SwiftNodes provides flat-rate multi-chain RPC endpoints — HTTP + WebSocket, 75+ chains, no per-request metering. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Celo RPC: The L2 Where You Pay Gas in Stablecoins</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Wed, 22 Jul 2026 06:59:18 +0000</pubDate>
      <link>https://dev.to/swiftnodes/celo-rpc-the-l2-where-you-pay-gas-in-stablecoins-50dp</link>
      <guid>https://dev.to/swiftnodes/celo-rpc-the-l2-where-you-pay-gas-in-stablecoins-50dp</guid>
      <description>&lt;p&gt;Celo has a feature most EVM chains don't: &lt;strong&gt;you can pay gas in stablecoins.&lt;/strong&gt; A user with only cUSD in their wallet can transact without ever holding the native token — the fee is charged in the ERC-20 they already have. For a mobile-first payments network, that's the whole point, and it's the thing that most changes how you build here. Celo is also unusual in another way: it &lt;strong&gt;migrated from a standalone Layer 1 to an Ethereum L2&lt;/strong&gt; in 2025, keeping the same chain ID through the transition. It's standard EVM either way — chain ID &lt;strong&gt;42220&lt;/strong&gt;, ordinary &lt;code&gt;eth_*&lt;/code&gt;, viem/ethers unchanged — but two Celo-specific facts shape the work. Here's the map.&lt;/p&gt;

&lt;h2&gt;
  
  
  The essentials
&lt;/h2&gt;

&lt;p&gt;Celo mainnet is &lt;strong&gt;chain ID 42220&lt;/strong&gt;, and as of March 2025 it's an &lt;strong&gt;OP Stack Layer 2&lt;/strong&gt; on Ethereum:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CELO is the native gas token&lt;/strong&gt; (18 decimals) — but not the &lt;em&gt;only&lt;/em&gt; fee token (see below).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~1-second blocks&lt;/strong&gt; — down from ~5s on the old L1, after the L2 migration.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OP Stack + EigenDA&lt;/strong&gt; — Celo runs Optimism's stack but posts data to &lt;strong&gt;EigenDA&lt;/strong&gt; for data availability rather than Ethereum blobs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EVM-compatible&lt;/strong&gt; — Solidity, ABIs, and standard tooling work directly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Connecting is standard EVM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;celo&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem/chains&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// chain ID 42220&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;celo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;http&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://rpc.swiftnodes.io/rpc/celo?key=YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBlockNumber&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;   &lt;span class="c1"&gt;// just works&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The standout feature: fee currencies (gas in stablecoins)
&lt;/h2&gt;

&lt;p&gt;On almost every chain, gas is paid in the native token — you &lt;em&gt;must&lt;/em&gt; hold ETH, or CELO, or whatever, to move anything. Celo breaks that assumption with &lt;strong&gt;fee abstraction&lt;/strong&gt;: a transaction can specify a &lt;strong&gt;&lt;code&gt;feeCurrency&lt;/code&gt;&lt;/strong&gt; — a whitelisted ERC-20 (like &lt;strong&gt;cUSD&lt;/strong&gt; or &lt;strong&gt;cEUR&lt;/strong&gt;) — and the protocol charges the fee in that token instead of CELO.&lt;/p&gt;

&lt;p&gt;Why it matters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding.&lt;/strong&gt; A user funded with only a stablecoin can transact immediately — no "go acquire the gas token first" step. For payments and emerging-market use cases, that removes the single biggest UX cliff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Predictable fees.&lt;/strong&gt; Denominating fees in a stablecoin means the cost of a transaction doesn't swing with the native token's price.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The developer implication is that &lt;strong&gt;gas isn't purely a native-token concern here.&lt;/strong&gt; If you're building wallet or payment flows, you deal with an extra field: transactions can carry a &lt;code&gt;feeCurrency&lt;/code&gt;, and estimating cost means knowing which token the fee is in. Standard &lt;code&gt;eth_estimateGas&lt;/code&gt; still returns the gas &lt;em&gt;units&lt;/em&gt; (&lt;a href="https://swiftnodes.io/blog/estimating-gas-eth-estimategas-eip-1559" rel="noopener noreferrer"&gt;gas estimation basics&lt;/a&gt;); the fee-currency layer sits on top, converting that to a charge in the chosen ERC-20. If you use CELO as the fee token, everything behaves like a normal EVM chain — the abstraction is opt-in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design fact #2: it's now an OP Stack L2 (with EigenDA)
&lt;/h2&gt;

&lt;p&gt;Celo launched as its own L1 in 2020 and &lt;strong&gt;completed its transition to an Ethereum L2 on March 26, 2025&lt;/strong&gt; (at block 31,056,500), rebuilt on the OP Stack. Two consequences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OP Stack mechanics now apply.&lt;/strong&gt; A sequencer orders transactions, gas has an L1 data-fee component, and withdrawals to Ethereum pass through the standard optimistic challenge window — the same model we covered on &lt;a href="https://swiftnodes.io/blog/unichain-rpc-uniswap-l2" rel="noopener noreferrer"&gt;Unichain&lt;/a&gt;, &lt;a href="https://swiftnodes.io/blog/zora-rpc-op-stack-creators" rel="noopener noreferrer"&gt;Zora&lt;/a&gt;, and (as a contrast) the based-rollup &lt;a href="https://swiftnodes.io/blog/taiko-rpc-based-rollup" rel="noopener noreferrer"&gt;Taiko&lt;/a&gt;. Finality is L2-soft/L1-hard; see &lt;a href="https://swiftnodes.io/blog/l2-finality-soft-vs-hard" rel="noopener noreferrer"&gt;soft vs hard finality&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data availability is EigenDA, not Ethereum blobs.&lt;/strong&gt; Rather than posting rollup data to Ethereum as &lt;a href="https://swiftnodes.io/blog/what-are-blobs-eip-4844" rel="noopener noreferrer"&gt;blobs&lt;/a&gt;, Celo uses &lt;strong&gt;EigenDA&lt;/strong&gt; — an external DA layer (conceptually similar to the modular-DA role &lt;a href="https://swiftnodes.io/blog/celestia-rpc-modular-da" rel="noopener noreferrer"&gt;Celestia&lt;/a&gt; plays). It's a cost/scaling choice and mostly invisible from the RPC, but it's why Celo's data-availability story differs from a vanilla OP Stack chain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The nice part for existing integrations: &lt;strong&gt;the chain ID stayed 42220&lt;/strong&gt; through the migration, so your RPC endpoint config and chain references didn't need to change — only the underlying architecture did.&lt;/p&gt;

&lt;h2&gt;
  
  
  One more quirk: CELO token duality
&lt;/h2&gt;

&lt;p&gt;CELO is the native gas token, but it also has an &lt;strong&gt;ERC-20 representation&lt;/strong&gt; — "token duality." You can interact with CELO both as native value (like ETH) and via a standard ERC-20 interface at a well-known address. Most of the time you won't think about it, but if a contract expects an ERC-20 and you're dealing with the native token, that's the mechanism that bridges the two.&lt;/p&gt;

&lt;h2&gt;
  
  
  What carries over unchanged
&lt;/h2&gt;

&lt;p&gt;Aside from fee currencies and the DA layer, treat Celo as a standard OP Stack EVM chain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;eth_call&lt;/code&gt;, &lt;code&gt;eth_getLogs&lt;/code&gt;, &lt;code&gt;eth_getBalance&lt;/code&gt;, &lt;code&gt;eth_getTransactionReceipt&lt;/code&gt;, &lt;code&gt;eth_sendRawTransaction&lt;/code&gt;, &lt;code&gt;eth_subscribe&lt;/code&gt; all behave normally.&lt;/li&gt;
&lt;li&gt;Solidity contracts, ABIs, and the viem/ethers/foundry toolchain deploy and run as-is.&lt;/li&gt;
&lt;li&gt;WebSocket subscriptions (&lt;code&gt;newHeads&lt;/code&gt;, &lt;code&gt;logs&lt;/code&gt;) work; at ~1s blocks, stream rather than poll.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Celo (chain ID 42220) is now an &lt;strong&gt;OP Stack L2&lt;/strong&gt; (migrated from L1 in March 2025, using EigenDA for data availability), with ~1-second blocks and standard &lt;code&gt;eth_*&lt;/code&gt; — viem/ethers work unchanged. Its two distinctive traits: &lt;strong&gt;fee currencies&lt;/strong&gt; let users pay gas in stablecoins like cUSD instead of CELO (a mobile-first onboarding superpower, and an extra &lt;code&gt;feeCurrency&lt;/code&gt; field in payment flows), and it's a rare chain that &lt;strong&gt;kept its chain ID through an L1→L2 migration&lt;/strong&gt;. Build it like an OP Stack chain, and lean on fee abstraction if you're doing payments.&lt;/p&gt;

&lt;p&gt;Building mobile payments, stablecoin apps, or ReFi on Celo? A flat-rate &lt;a href="https://swiftnodes.io/celo-rpc" rel="noopener noreferrer"&gt;Celo RPC endpoint&lt;/a&gt; gives you chain 42220 over HTTP and WebSocket alongside 75+ other chains under one key. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt; and point your stack at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://rpc.swiftnodes.io/rpc/celo?key=YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://swiftnodes.io/blog/celo-rpc-l2-fee-currency" rel="noopener noreferrer"&gt;SwiftNodes blog&lt;/a&gt;. SwiftNodes provides flat-rate multi-chain RPC endpoints — HTTP + WebSocket, 75+ chains, no per-request metering. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>WEMIX RPC: Building on a Gaming-First EVM Chain</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Tue, 21 Jul 2026 07:06:04 +0000</pubDate>
      <link>https://dev.to/swiftnodes/wemix-rpc-building-on-a-gaming-first-evm-chain-2m9o</link>
      <guid>https://dev.to/swiftnodes/wemix-rpc-building-on-a-gaming-first-evm-chain-2m9o</guid>
      <description>&lt;p&gt;WEMIX3.0 is the Layer 1 built by Wemade — a Korean game company, not a crypto-native team — and that origin shows in the design. It's tuned for games: fast blocks, high throughput, and a validator model that gives you &lt;em&gt;immediate&lt;/em&gt; confirmation, which matters a lot when a player just minted an item or completed a trade. For a developer the good news is that it's &lt;strong&gt;standard EVM&lt;/strong&gt; — chain ID 1111, ordinary &lt;code&gt;eth_*&lt;/code&gt;, Solidity and viem/ethers unchanged. What's worth understanding is &lt;em&gt;why&lt;/em&gt; it behaves the way it does, because two design choices shape how you build and index on it. Here's the map.&lt;/p&gt;

&lt;h2&gt;
  
  
  The essentials
&lt;/h2&gt;

&lt;p&gt;WEMIX3.0 mainnet is &lt;strong&gt;chain ID 1111&lt;/strong&gt;, an EVM Layer 1 with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WEMIX as the gas token&lt;/strong&gt; (18 decimals) — also used for staking.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~1-second blocks&lt;/strong&gt; — short block times suited to game transaction volume.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stake-based Proof-of-Authority&lt;/strong&gt; — blocks are produced and the network governed by a council of up to &lt;strong&gt;40 Node Council Partners&lt;/strong&gt;, with a path toward a fuller staked-PoS model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;EVM-compatible&lt;/strong&gt; — Solidity contracts and standard Ethereum tooling apply directly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Connecting is boringly standard:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;defineChain&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;wemix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defineChain&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1111&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;WEMIX3.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;nativeCurrency&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;WEMIX&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;symbol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;WEMIX&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;decimals&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;rpcUrls&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://rpc.swiftnodes.io/rpc/wemix?key=YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;wemix&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;http&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBlockNumber&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;   &lt;span class="c1"&gt;// just works&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;WEMIX shares its heritage with another Korean EVM chain we've covered: Wemade originally ran its tokens and games on Ethereum and &lt;strong&gt;Klaytn&lt;/strong&gt; before migrating to its own chain in 2022. If you've built on &lt;a href="https://swiftnodes.io/blog/kaia-rpc-klaytn-finschia" rel="noopener noreferrer"&gt;Kaia&lt;/a&gt; (the Klaytn–Finschia merger), the ecosystem and tooling conventions will feel familiar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design choice #1: PoA council → instant finality, no reorgs
&lt;/h2&gt;

&lt;p&gt;WEMIX doesn't use permissionless proof-of-stake or proof-of-work — it uses a &lt;strong&gt;stake-based Proof-of-Authority&lt;/strong&gt; council of known validators. That's a genuine trade-off to be honest about (a curated validator set is more centralized than a permissionless one), but it buys a property developers care about: &lt;strong&gt;fast, deterministic finality&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The practical payoff for you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No reorgs to defend against.&lt;/strong&gt; With a known council producing blocks under BFT-style finality, a confirmed block stays confirmed. The whole class of &lt;a href="https://swiftnodes.io/blog/handling-chain-reorgs-indexer" rel="noopener noreferrer"&gt;reorg-handling defenses&lt;/a&gt; — waiting N confirmations, keying on &lt;code&gt;(txHash, logIndex)&lt;/code&gt;, tolerating tip rollbacks — mostly collapses to "confirm once." You can index at the head and trust it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Immediate UX confirmation.&lt;/strong&gt; For a game, "did my item mint land?" resolves in about a second and won't reverse. You don't have to build the "pending → maybe-reorged" state machine that probabilistic chains force on you.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Code written for Ethereum that waits 12 confirmations before treating a transaction as final is just adding a dozen seconds of pointless latency here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design choice #2: it's a gaming chain, so plan for game-shaped traffic
&lt;/h2&gt;

&lt;p&gt;WEMIX's reason to exist is its game ecosystem — &lt;strong&gt;WEMIX PLAY&lt;/strong&gt; (the game platform), &lt;strong&gt;NILE&lt;/strong&gt; (DeFi and NFTs), &lt;strong&gt;WEMIX Pay&lt;/strong&gt; (payments), and a stablecoin product. The consequence for an RPC consumer is a traffic profile dominated by &lt;strong&gt;high-frequency, asset-centric transactions&lt;/strong&gt;: item mints, in-game economy transfers, NFT activity — often in bursts around game events or drops.&lt;/p&gt;

&lt;p&gt;That shapes your &lt;em&gt;indexing&lt;/em&gt; more than your write path (much like the mint-heavy pattern we covered on &lt;a href="https://swiftnodes.io/blog/zora-rpc-op-stack-creators" rel="noopener noreferrer"&gt;Zora&lt;/a&gt;):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Filter for asset events.&lt;/strong&gt; Game items and rewards are ERC-721/1155 mints and transfers. Filter &lt;code&gt;eth_getLogs&lt;/code&gt; on the event signature (&lt;code&gt;topics[0]&lt;/code&gt;) plus &lt;code&gt;from = 0x0&lt;/code&gt; to isolate mints from ordinary transfers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Page dense blocks.&lt;/strong&gt; At ~1s blocks with burst traffic, a wide block range can return a lot of logs — page by block range and respect the endpoint's log/range limits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stream over WebSocket.&lt;/strong&gt; For live game state, subscribe to &lt;code&gt;logs&lt;/code&gt;/&lt;code&gt;newHeads&lt;/code&gt; over &lt;code&gt;wss://&lt;/code&gt; rather than tight polling; at one-second blocks, polling lags fast.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Stream ERC-721 item mints (Transfer from the zero address) live&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ws&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;WebSocket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;wss://rpc.swiftnodes.io/ws/wemix?key=YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onopen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;ws&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;jsonrpc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;2.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;eth_subscribe&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;logs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;topics&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Transfer&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0x0000000000000000000000000000000000000000000000000000000000000000&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// from 0x0 = mint&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="p"&gt;}],&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What carries over unchanged
&lt;/h2&gt;

&lt;p&gt;Past those two considerations, WEMIX is standard EVM:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;eth_call&lt;/code&gt;, &lt;code&gt;eth_getBalance&lt;/code&gt;, &lt;code&gt;eth_getLogs&lt;/code&gt;, &lt;code&gt;eth_getTransactionReceipt&lt;/code&gt;, &lt;code&gt;eth_estimateGas&lt;/code&gt;, &lt;code&gt;eth_sendRawTransaction&lt;/code&gt;, &lt;code&gt;eth_subscribe&lt;/code&gt; all behave normally — see &lt;a href="https://swiftnodes.io/blog/reading-transaction-receipts-eth-gettransactionreceipt" rel="noopener noreferrer"&gt;reading receipts&lt;/a&gt; and &lt;a href="https://swiftnodes.io/blog/estimating-gas-eth-estimategas-eip-1559" rel="noopener noreferrer"&gt;gas estimation&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Solidity contracts, ABIs, and the viem/ethers/hardhat/foundry toolchain deploy and run as-is.&lt;/li&gt;
&lt;li&gt;WEMIX is the gas token with 18 decimals — no exotic fee handling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;WEMIX3.0 (chain ID 1111) is a gaming-first EVM L1 from Wemade: WEMIX gas, ~1-second blocks, and a stake-based PoA council of up to 40 validators. viem/ethers/foundry work unchanged. The two things that shape building on it: the PoA council gives &lt;strong&gt;deterministic finality with no reorgs&lt;/strong&gt; (drop the confirmation-counting and reorg defenses — confirm once), and the &lt;strong&gt;game-heavy traffic&lt;/strong&gt; means your indexing should be tuned for bursty ERC-721/1155 mint and transfer activity, streamed over WebSocket.&lt;/p&gt;

&lt;p&gt;Building a game, a marketplace, or a WEMIX PLAY integration? A flat-rate &lt;a href="https://swiftnodes.io/wemix-rpc" rel="noopener noreferrer"&gt;WEMIX RPC endpoint&lt;/a&gt; gives you chain 1111 with WebSocket support alongside 75+ other chains under one key. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt; and point your stack at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://rpc.swiftnodes.io/rpc/wemix?key=YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://swiftnodes.io/blog/wemix-rpc-gaming-l1" rel="noopener noreferrer"&gt;SwiftNodes blog&lt;/a&gt;. SwiftNodes provides flat-rate multi-chain RPC endpoints — HTTP + WebSocket, 75+ chains, no per-request metering. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Sui RPC: Where Everything You Own Is an Object</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Mon, 20 Jul 2026 04:22:10 +0000</pubDate>
      <link>https://dev.to/swiftnodes/sui-rpc-where-everything-you-own-is-an-object-36pl</link>
      <guid>https://dev.to/swiftnodes/sui-rpc-where-everything-you-own-is-an-object-36pl</guid>
      <description>&lt;p&gt;Most "alt-L1" chains still think in accounts and balances — Sui doesn't. On Sui, &lt;strong&gt;everything you own is a first-class object&lt;/strong&gt; with its own ID and owner, and that single design decision changes the entire RPC surface. There's no &lt;code&gt;eth_getBalance&lt;/code&gt;, no &lt;code&gt;eth_call&lt;/code&gt;, no &lt;code&gt;eth_getLogs&lt;/code&gt;. If you're arriving from Ethereum, the tooling is unfamiliar but the mental model is actually &lt;em&gt;simpler&lt;/em&gt; once it clicks: you don't ask a contract what it thinks you own — you ask the chain which objects belong to your address. Here's the map.&lt;/p&gt;

&lt;h2&gt;
  
  
  The essentials
&lt;/h2&gt;

&lt;p&gt;Sui is a &lt;strong&gt;non-EVM Layer 1&lt;/strong&gt; from Mysten Labs, mainnet since May 2023:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Move language&lt;/strong&gt; (Sui Move) — resource-oriented, assets are safe by construction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Object-centric model&lt;/strong&gt; — assets are objects with owners, not entries in a contract's storage mapping.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Parallel execution&lt;/strong&gt; — transactions touching disjoint objects don't contend and run concurrently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sub-second finality&lt;/strong&gt; for owned-object transactions; a few seconds via consensus for shared objects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SUI&lt;/strong&gt; is the gas token, with &lt;strong&gt;9 decimals&lt;/strong&gt; (the base unit is MIST; 1 SUI = 1e9 MIST).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No fixed block time&lt;/strong&gt; — the chain advances in &lt;strong&gt;checkpoints&lt;/strong&gt;, not numbered blocks.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The RPC is JSON-RPC, but the method namespace is &lt;code&gt;sui_*&lt;/code&gt; / &lt;code&gt;suix_*&lt;/code&gt;, not &lt;code&gt;eth_*&lt;/code&gt;. Use the official SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SuiClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;getFullnodeUrl&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@mysten/sui/client&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SuiClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://rpc.swiftnodes.io/rpc/sui?key=YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLatestCheckpointSequenceNumber&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;   &lt;span class="c1"&gt;// the chain tip&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The mental shift: query objects, not contract storage
&lt;/h2&gt;

&lt;p&gt;On Ethereum, "what NFTs does this wallet hold?" means calling a contract's &lt;code&gt;balanceOf&lt;/code&gt;/&lt;code&gt;ownerOf&lt;/code&gt; or indexing &lt;code&gt;Transfer&lt;/code&gt; events — you're reconstructing ownership from a contract's internal bookkeeping. On Sui, ownership is &lt;strong&gt;native to the protocol&lt;/strong&gt;: every object records its owner, so you query it directly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Everything an address owns — coins, NFTs, arbitrary Move objects&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;owned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getOwnedObjects&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// A specific object by ID, with its Move type and fields&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getObject&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;objectId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;showType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;showContent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;showOwner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// All coin balances for an address (SUI + any other coin type)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;balances&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAllBalances&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the core reframe. &lt;code&gt;getOwnedObjects&lt;/code&gt; is the query you'll reach for constantly — it's the "what does this address actually have?" primitive that Ethereum never gave you at the protocol level.&lt;/p&gt;

&lt;h2&gt;
  
  
  Owned vs shared objects: the finality fast path
&lt;/h2&gt;

&lt;p&gt;Sui's speed comes from a distinction with no EVM equivalent, and it's worth understanding because it affects latency:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Owned objects&lt;/strong&gt; (e.g., your coins, your NFT) have a single owner. A transaction touching only owned objects &lt;strong&gt;can skip full consensus&lt;/strong&gt; and finalize in &lt;strong&gt;sub-second&lt;/strong&gt; time — because nothing else can be mutating your object concurrently.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared objects&lt;/strong&gt; (e.g., a DEX pool everyone trades against) can be touched by anyone, so those transactions go through the &lt;strong&gt;Mysticeti consensus&lt;/strong&gt; path — still fast (a few seconds), but not the owned-object fast path.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a developer this means: simple transfers and single-owner updates are &lt;em&gt;extremely&lt;/em&gt; fast, while contended DeFi state settles through consensus. Design latency expectations around which kind of object a transaction touches.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading transactions and events (indexing)
&lt;/h2&gt;

&lt;p&gt;There's no &lt;code&gt;eth_getLogs&lt;/code&gt;, so &lt;a href="https://swiftnodes.io/blog/eth-getlogs-range-caps" rel="noopener noreferrer"&gt;the range-cap headaches&lt;/a&gt; don't apply — but you index differently:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// A transaction by digest, with effects, events, and object changes&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;tx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getTransactionBlock&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="nx"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;showEffects&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;showEvents&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;showObjectChanges&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Query events by type, module, or sender&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;events&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;queryEvents&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;MoveModule&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;package&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pkgId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;module&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;my_module&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The chain tip is a &lt;strong&gt;checkpoint sequence number&lt;/strong&gt;, not a block height — poll &lt;code&gt;getLatestCheckpointSequenceNumber&lt;/code&gt; (or subscribe over WebSocket) and read checkpoints to tail the chain. &lt;code&gt;objectChanges&lt;/code&gt; on a transaction tells you exactly which objects were created, mutated, or transferred — the object-model equivalent of parsing logs.&lt;/p&gt;

&lt;p&gt;Standard JSON-RPC conveniences still apply — if you're making many independent reads, &lt;a href="https://swiftnodes.io/blog/json-rpc-batching" rel="noopener noreferrer"&gt;batch them&lt;/a&gt; to cut round-trips.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's different from the other non-EVM chains
&lt;/h2&gt;

&lt;p&gt;If you've built on the Cosmos chains we've covered — &lt;a href="https://swiftnodes.io/blog/celestia-rpc-modular-da" rel="noopener noreferrer"&gt;Celestia&lt;/a&gt;, &lt;a href="https://swiftnodes.io/blog/osmosis-rpc-cosmos-dex" rel="noopener noreferrer"&gt;Osmosis&lt;/a&gt; — note that Sui is &lt;em&gt;not&lt;/em&gt; CometBFT/Tendermint either; it has its own &lt;code&gt;sui_*&lt;/code&gt; API and consensus (Mysticeti). And unlike UTXO chains like &lt;a href="https://swiftnodes.io/blog/litecoin-rpc-blockbook-utxo" rel="noopener noreferrer"&gt;Litecoin&lt;/a&gt;, Sui's objects are rich, typed, and programmable, not just unspent outputs. Sui is genuinely its own model — the closest intuition is "typed, owned objects" rather than accounts, UTXOs, or Cosmos modules.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Sui is a non-EVM Move L1 with an object-centric model: assets are first-class objects with owners, so you query ownership natively (&lt;code&gt;getOwnedObjects&lt;/code&gt;, &lt;code&gt;getObject&lt;/code&gt;, &lt;code&gt;getAllBalances&lt;/code&gt;) instead of reconstructing it from contract storage. The API is &lt;code&gt;sui_*&lt;/code&gt;/&lt;code&gt;suix_*&lt;/code&gt; via the &lt;code&gt;@mysten/sui&lt;/code&gt; SDK, not &lt;code&gt;eth_*&lt;/code&gt;. SUI has 9 decimals (base unit MIST), the chain advances in checkpoints (no fixed blocks), and &lt;strong&gt;owned-object transactions finalize sub-second by skipping consensus&lt;/strong&gt; while shared-object transactions settle through Mysticeti in a few seconds.&lt;/p&gt;

&lt;p&gt;Building consumer-scale apps, on-chain games, or low-latency DeFi on Sui? A flat-rate &lt;a href="https://swiftnodes.io/sui-rpc" rel="noopener noreferrer"&gt;Sui RPC endpoint&lt;/a&gt; gives you a full node's &lt;code&gt;sui_*&lt;/code&gt; API alongside 75+ other chains under one key. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt; and point the SDK at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://rpc.swiftnodes.io/rpc/sui?key=YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://swiftnodes.io/blog/sui-rpc-object-model" rel="noopener noreferrer"&gt;SwiftNodes blog&lt;/a&gt;. SwiftNodes provides flat-rate multi-chain RPC endpoints — HTTP + WebSocket, 75+ chains, no per-request metering. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Taiko RPC: The L2 With No Sequencer</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Sun, 19 Jul 2026 06:17:28 +0000</pubDate>
      <link>https://dev.to/swiftnodes/taiko-rpc-the-l2-with-no-sequencer-4imo</link>
      <guid>https://dev.to/swiftnodes/taiko-rpc-the-l2-with-no-sequencer-4imo</guid>
      <description>&lt;p&gt;Every OP Stack chain we've covered — Base, Unichain, Zora — has a sequencer: one privileged party that orders transactions, and the thing you're implicitly trusting for liveness and fair ordering. &lt;strong&gt;Taiko doesn't have one.&lt;/strong&gt; It's a &lt;em&gt;based rollup&lt;/em&gt;: Ethereum's own validators propose Taiko's blocks as part of normal L1 block production. That single architectural choice cascades into everything a developer cares about — liveness, finality, MEV, and reliability. And because Taiko is also a &lt;strong&gt;Type-1 zkEVM&lt;/strong&gt;, your Ethereum tooling works with &lt;em&gt;zero&lt;/em&gt; changes. Here's the map for chain ID &lt;strong&gt;167000&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The essentials
&lt;/h2&gt;

&lt;p&gt;Taiko mainnet (&lt;em&gt;Alethia&lt;/em&gt;) is &lt;strong&gt;chain ID 167000&lt;/strong&gt;, an EVM Layer 2 with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ETH as the gas token&lt;/strong&gt; (18 decimals) — no separate gas token to source.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~12-second blocks&lt;/strong&gt;, aligned with Ethereum's slot times — because block proposing rides on L1, the cadence follows L1.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type-1 zkEVM equivalence&lt;/strong&gt; — the most Ethereum-equivalent zkEVM design. Contracts deploy bit-identically; opcode behavior is exact.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Connecting is completely standard EVM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;taiko&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;viem/chains&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// chain ID 167000&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createPublicClient&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;taiko&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;http&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://rpc.swiftnodes.io/rpc/taiko?key=YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBlockNumber&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;   &lt;span class="c1"&gt;// just works&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What "based" changes: no sequencer to trust — or to fail
&lt;/h2&gt;

&lt;p&gt;On a typical rollup, a &lt;strong&gt;sequencer&lt;/strong&gt; receives your transactions, orders them, and produces L2 blocks (&lt;a href="https://swiftnodes.io/blog/what-is-a-sequencer" rel="noopener noreferrer"&gt;what a sequencer does&lt;/a&gt;). It's efficient, but it's also a single point of trust and a single point of failure — sequencer outages have taken major L2s offline for hours. A "based" rollup removes it entirely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Block proposing happens on Ethereum L1.&lt;/strong&gt; Taiko blocks are proposed via L1 transactions, so Ethereum's proposers include them as part of normal block production. There is no separate Taiko sequencer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Liveness = Ethereum's liveness.&lt;/strong&gt; As long as Ethereum is producing blocks, Taiko is producing blocks. There is no "the sequencer is down" failure mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Censorship resistance = Ethereum's.&lt;/strong&gt; Because anyone can propose via L1, ordering isn't controlled by one operator. This also reshapes MEV — there's no single sequencer with exclusive ordering rights to extract it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For you as a builder, the practical upshot is &lt;strong&gt;reliability inherited from L1&lt;/strong&gt;. The chain's uptime story is Ethereum's uptime story, not a startup's sequencer infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "Type-1 zkEVM" changes: your tooling doesn't know the difference
&lt;/h2&gt;

&lt;p&gt;zkEVMs trade off equivalence for proving speed. Type-1 sits at the far equivalence end: &lt;strong&gt;exact Ethereum behavior&lt;/strong&gt;, no bytecode-level compromises. In practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solidity contracts, ABIs, and deployment bytecode are &lt;strong&gt;identical&lt;/strong&gt; to L1 — deploy with foundry/hardhat unchanged, and addresses/behavior match.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;eth_call&lt;/code&gt;, &lt;code&gt;eth_getLogs&lt;/code&gt;, &lt;code&gt;eth_getTransactionReceipt&lt;/code&gt;, &lt;code&gt;eth_estimateGas&lt;/code&gt;, &lt;code&gt;eth_sendRawTransaction&lt;/code&gt;, &lt;code&gt;eth_subscribe&lt;/code&gt; all behave exactly as on Ethereum.&lt;/li&gt;
&lt;li&gt;Tooling that assumes precise Ethereum semantics (debuggers, tracers, gas profilers) works without special-casing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If a chain is going to be "just Ethereum but cheaper," Type-1 is the version where that's &lt;em&gt;literally&lt;/em&gt; true at the opcode level.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finality: validity proofs, not a 7-day wait
&lt;/h2&gt;

&lt;p&gt;This is where Taiko diverges sharply from the optimistic rollups (OP Stack, Arbitrum). Taiko is a &lt;strong&gt;zk-rollup&lt;/strong&gt; — it proves state transitions with &lt;strong&gt;validity proofs&lt;/strong&gt; instead of assuming-honest-then-challenging:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Soft confirmation&lt;/strong&gt; at the ~12s block, like any L2 (see &lt;a href="https://swiftnodes.io/blog/l2-finality-soft-vs-hard" rel="noopener noreferrer"&gt;soft vs hard finality&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hard finality once the zk proof is submitted to L1&lt;/strong&gt; — minutes, not the &lt;strong&gt;~7-day optimistic challenge window&lt;/strong&gt; that optimistic rollups impose on withdrawals. A validity proof mathematically establishes correctness, so there's nothing to challenge.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For anything touching L1 settlement or bridging, that's a materially faster and cleaner finality model. The trade-off Taiko accepts is slower &lt;em&gt;proof generation&lt;/em&gt; (Type-1 equivalence makes proofs heavier) — but that's the prover's problem, not your app's.&lt;/p&gt;

&lt;h2&gt;
  
  
  What carries over unchanged (basically everything)
&lt;/h2&gt;

&lt;p&gt;Because it's a Type-1 zkEVM, treat Taiko as Ethereum for development:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data is posted to L1 (as blobs — see &lt;a href="https://swiftnodes.io/blog/what-are-blobs-eip-4844" rel="noopener noreferrer"&gt;what are blobs&lt;/a&gt;), so the L1 data-fee component of gas applies, as on any rollup.&lt;/li&gt;
&lt;li&gt;Indexing is standard: &lt;code&gt;eth_getLogs&lt;/code&gt; by topic/address, WebSocket &lt;code&gt;logs&lt;/code&gt;/&lt;code&gt;newHeads&lt;/code&gt; subscriptions. At ~12s blocks, reorg risk at the tip is Ethereum-like — the usual &lt;a href="https://swiftnodes.io/blog/handling-chain-reorgs-indexer" rel="noopener noreferrer"&gt;reorg-handling patterns&lt;/a&gt; apply.&lt;/li&gt;
&lt;li&gt;No exotic namespaces, no gas-token quirks, no sequencer-specific endpoints.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The one mental adjustment: block cadence is ~12s (L1-aligned), not the ~2s of an OP Stack chain like &lt;a href="https://swiftnodes.io/blog/unichain-rpc-uniswap-l2" rel="noopener noreferrer"&gt;Unichain&lt;/a&gt; or &lt;a href="https://swiftnodes.io/blog/zora-rpc-op-stack-creators" rel="noopener noreferrer"&gt;Zora&lt;/a&gt; — size your polling and confirmation logic accordingly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The short version
&lt;/h2&gt;

&lt;p&gt;Taiko (chain ID 167000) is a &lt;strong&gt;based zk-rollup&lt;/strong&gt;: Ethereum's validators propose its blocks, so there's no sequencer to trust or to go down — liveness and censorship-resistance are inherited from L1. It's a &lt;strong&gt;Type-1 zkEVM&lt;/strong&gt;, so Solidity, ABIs, and every &lt;code&gt;eth_*&lt;/code&gt; method behave bit-identically to Ethereum (viem/ethers/foundry work with zero changes). ETH gas, ~12s L1-aligned blocks, and &lt;strong&gt;zk validity-proof finality in minutes&lt;/strong&gt; rather than the ~7-day withdrawal window of optimistic rollups.&lt;/p&gt;

&lt;p&gt;Building on a rollup where uptime is Ethereum's uptime and your tooling doesn't need a single tweak? A flat-rate &lt;a href="https://swiftnodes.io/taiko-rpc" rel="noopener noreferrer"&gt;Taiko RPC endpoint&lt;/a&gt; gives you chain 167000 alongside 75+ others under one key. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt; and point your stack at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://rpc.swiftnodes.io/rpc/taiko?key=YOUR_API_KEY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://swiftnodes.io/blog/taiko-rpc-based-rollup" rel="noopener noreferrer"&gt;SwiftNodes blog&lt;/a&gt;. SwiftNodes provides flat-rate multi-chain RPC endpoints — HTTP + WebSocket, 75+ chains, no per-request metering. &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;Grab a free key&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
