<?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>Tron RPC: USDT-TRC20, TVM, and the Stablecoin Rail</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Wed, 09 Sep 2026 05:31:02 +0000</pubDate>
      <link>https://dev.to/swiftnodes/tron-rpc-usdt-trc20-tvm-and-the-stablecoin-rail-1nb9</link>
      <guid>https://dev.to/swiftnodes/tron-rpc-usdt-trc20-tvm-and-the-stablecoin-rail-1nb9</guid>
      <description>&lt;p&gt;Tron isn't just another blockchain — it's the world's largest stablecoin rail. With over $50 billion in USDT supply, more than any single chain, Tron has become the default infrastructure for cross-border value transfer, especially in Asia and Latin America. If you're building anything related to stablecoins or emerging markets, you need to understand Tron's RPC.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Tron actually is
&lt;/h2&gt;

&lt;p&gt;Tron is a &lt;strong&gt;high-throughput blockchain&lt;/strong&gt; launched in June 2018, focused on decentralized content and entertainment. It uses Delegated Proof-of-Stake (DPoS) with 27 active Super Representatives producing blocks every 3 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key specs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Network: Mainnet (non-EVM, uses its own identifier)&lt;/li&gt;
&lt;li&gt;Block time: ~3 seconds&lt;/li&gt;
&lt;li&gt;Consensus: Delegated Proof-of-Stake (27 Super Representatives)&lt;/li&gt;
&lt;li&gt;Native token: TRX (6 decimals)&lt;/li&gt;
&lt;li&gt;Virtual Machine: TVM (TRON Virtual Machine) — largely Solidity-compatible&lt;/li&gt;
&lt;li&gt;Primary use case: Stablecoin transfers (USDT-TRC20)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The TVM (TRON Virtual Machine) is largely Solidity-compatible, allowing Ethereum contracts to be ported with minor changes. However, Tron is &lt;strong&gt;non-EVM&lt;/strong&gt; — it doesn't use Ethereum's JSON-RPC interface. Instead, Tron exposes its own HTTP API and gRPC endpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  The RPC: HTTP API and gRPC, not JSON-RPC
&lt;/h2&gt;

&lt;p&gt;Here's where most Ethereum developers get tripped up. Tron doesn't use &lt;code&gt;eth_blockNumber&lt;/code&gt;, &lt;code&gt;eth_getBalance&lt;/code&gt;, or any of the standard Ethereum JSON-RPC methods. Instead, Tron has its own HTTP API with different endpoints and response formats.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Get current block (Tron HTTP API)&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://rpc.swiftnodes.io/rpc/tron &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc": "2.0",
  "method": "wallet/getnowblock",
  "params": {},
  "id": 1
}'&lt;/span&gt;

&lt;span class="c"&gt;# Get account balance&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://rpc.swiftnodes.io/rpc/tron &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc": "2.0",
  "method": "wallet/getaccount",
  "params": {
    "address": "TYourAddressHere"
  },
  "id": 1
}'&lt;/span&gt;

&lt;span class="c"&gt;# Get TRC20 token balance (USDT)&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://rpc.swiftnodes.io/rpc/tron &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc": "2.0",
  "method": "wallet/triggersmartcontract",
  "params": {
    "owner_address": "TYourAddressHere",
    "contract_address": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
    "function_selector": "balanceOf(address)",
    "parameter": "000000000000000000000000TYourAddressHere"
  },
  "id": 1
}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The core methods you'll use:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;What it gives you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wallet/getnowblock&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Current block info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wallet/getblock&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Block by number or ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wallet/getaccount&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Account info and TRX balance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wallet/getcontract&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Smart contract info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wallet/triggersmartcontract&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Call smart contract (read-only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wallet/broadcasttransaction&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Broadcast signed transaction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  TVM: Solidity-compatible, but not identical
&lt;/h2&gt;

&lt;p&gt;Tron's TVM (TRON Virtual Machine) is largely compatible with Solidity, which means you can port most Ethereum contracts to Tron with minor adjustments. However, there are important differences:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Address format:&lt;/strong&gt; Tron uses base58 addresses starting with &lt;code&gt;T&lt;/code&gt; (like &lt;code&gt;TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t&lt;/code&gt; for USDT), not Ethereum's hex addresses.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Energy and bandwidth:&lt;/strong&gt; Tron uses a dual-resource model. Transactions consume &lt;strong&gt;bandwidth&lt;/strong&gt; (for basic transfers) and &lt;strong&gt;energy&lt;/strong&gt; (for smart contract execution). You can stake TRX to get these resources, or pay fees in TRX.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Precompiles:&lt;/strong&gt; Some Ethereum precompiles behave differently or don't exist on Tron. Test thoroughly if porting contracts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Gas mechanics:&lt;/strong&gt; While TVM uses "energy" similar to gas, the calculation and limits differ from Ethereum.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's what a simple TRC20 transfer looks like in Solidity for Tron:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pragma solidity ^0.8.0;

import "./TRC20.sol";

contract MyToken is TRC20 {
    constructor() TRC20("MyToken", "MTK") {
        _mint(msg.sender, 1000000 * 10 ** decimals());
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The code looks identical to Ethereum, but the deployment and interaction use Tron's HTTP API, not &lt;code&gt;eth_sendRawTransaction&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  USDT-TRC20: The dominant stablecoin
&lt;/h2&gt;

&lt;p&gt;Tron's killer feature is USDT-TRC20. Tether on Tron has over $50 billion in supply, more than any single chain. This makes Tron the most-used chain globally for cross-border value transfer.&lt;/p&gt;

&lt;p&gt;Why? &lt;strong&gt;Sub-cent fees and 3-second finality.&lt;/strong&gt; Sending $10,000 USDT on Tron costs less than $1 and settles in seconds. Compare that to Ethereum's variable gas fees and 12-second blocks, and you can see why emerging markets have adopted Tron for remittances.&lt;/p&gt;

&lt;p&gt;To query USDT balances or transfers, you'll interact with the USDT contract at &lt;code&gt;TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Get USDT balance for an address&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://rpc.swiftnodes.io/rpc/tron &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc": "2.0",
  "method": "wallet/triggersmartcontract",
  "params": {
    "owner_address": "TYourAddressHere",
    "contract_address": "TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t",
    "function_selector": "balanceOf(address)",
    "parameter": "000000000000000000000000TYourAddressHere"
  },
  "id": 1
}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The response includes the balance in the &lt;code&gt;constant_result&lt;/code&gt; field, which you'll need to decode from hex.&lt;/p&gt;

&lt;h2&gt;
  
  
  How this compares to other chains
&lt;/h2&gt;

&lt;p&gt;Tron is often compared to other high-throughput chains, but its focus on stablecoins makes it unique:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://swiftnodes.io/blog/what-is-an-rpc-endpoint" rel="noopener noreferrer"&gt;Ethereum&lt;/a&gt;&lt;/strong&gt; has higher decentralization and a larger developer ecosystem, but higher fees and slower blocks. Ethereum is better for DeFi and NFTs; Tron is better for stablecoin transfers.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://swiftnodes.io/blog/bnb-smart-chain-rpc" rel="noopener noreferrer"&gt;BSC&lt;/a&gt;&lt;/strong&gt; is EVM-compatible with lower fees than Ethereum, but Tron has even lower fees and is more focused on stablecoins.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://swiftnodes.io/blog/solana-rpc-429-rate-limits" rel="noopener noreferrer"&gt;Solana&lt;/a&gt;&lt;/strong&gt; offers similar throughput and low fees, but uses a different programming model (Rust vs Solidity). Tron's Solidity compatibility makes it easier for Ethereum developers to port contracts.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From an RPC perspective, Tron is fundamentally different. You can't use ethers.js or viem directly — you need Tron-specific libraries like TronWeb or the HTTP API.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transaction submission
&lt;/h2&gt;

&lt;p&gt;Submitting transactions on Tron is also different. The flow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create transaction:&lt;/strong&gt; Use &lt;code&gt;wallet/createtransaction&lt;/code&gt; (for TRX transfers) or &lt;code&gt;wallet/triggersmartcontract&lt;/code&gt; (for contract calls)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sign transaction:&lt;/strong&gt; Sign locally with the private key (Tron uses ECDSA like Ethereum, but with different address derivation)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Broadcast transaction:&lt;/strong&gt; Use &lt;code&gt;wallet/broadcasttransaction&lt;/code&gt; to submit&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;TronWeb (the JavaScript SDK) handles most of this for you, but it's still a different workflow than Ethereum's &lt;code&gt;eth_sendRawTransaction&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;Tron is a &lt;strong&gt;high-throughput blockchain&lt;/strong&gt; focused on stablecoin transfers. &lt;strong&gt;3-second blocks&lt;/strong&gt;, DPoS consensus with 27 Super Representatives, and the &lt;strong&gt;TVM&lt;/strong&gt; (largely Solidity-compatible). Uses &lt;strong&gt;HTTP API and gRPC&lt;/strong&gt; — not Ethereum JSON-RPC. Native token is TRX (6 decimals).&lt;/p&gt;

&lt;p&gt;For stablecoin applications — especially USDT transfers and emerging market remittances — Tron is where the volume is. USDT-TRC20 has over $50B in supply, making it the largest stablecoin deployment on any chain.&lt;/p&gt;

&lt;p&gt;For reliable Tron RPC access across load-balanced nodes, &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;grab a free API key&lt;/a&gt; and point your app 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/tron?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/tron-rpc" 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>Aptos RPC: Move Language, Parallel Execution, and REST API</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Tue, 08 Sep 2026 06:29:17 +0000</pubDate>
      <link>https://dev.to/swiftnodes/aptos-rpc-move-language-parallel-execution-and-rest-api-1c17</link>
      <guid>https://dev.to/swiftnodes/aptos-rpc-move-language-parallel-execution-and-rest-api-1c17</guid>
      <description>&lt;p&gt;Aptos is a Layer 1 blockchain built by former Meta (Diem) engineers, and it's fundamentally different from the EVM chains most developers are used to. No JSON-RPC, no Solidity, no EVM. Instead, Aptos uses a REST API, the Move programming language, and a parallel execution engine called Block-STM. If you're coming from Ethereum, everything is different — and that's the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Aptos actually is
&lt;/h2&gt;

&lt;p&gt;Aptos is a &lt;strong&gt;high-throughput Layer 1&lt;/strong&gt; designed for sub-second finality and massive parallel transaction processing. It launched mainnet in October 2022 after years of development stemming from Meta's Diem project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key specs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chain ID: 1 (in Aptos terms, not EVM)&lt;/li&gt;
&lt;li&gt;Block time: ~1 second&lt;/li&gt;
&lt;li&gt;Finality: Sub-second (deterministic via AptosBFT)&lt;/li&gt;
&lt;li&gt;Gas token: APT (8 decimals)&lt;/li&gt;
&lt;li&gt;Consensus: AptosBFT (Jolteon-based proof-of-stake)&lt;/li&gt;
&lt;li&gt;Execution: Block-STM (parallel execution engine)&lt;/li&gt;
&lt;li&gt;Smart contracts: Move language (not Solidity)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture is built around three core innovations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Move language:&lt;/strong&gt; A resource-oriented programming language designed for safe digital asset management. Unlike Solidity's account model, Move treats assets as resources that can't be copied or accidentally discarded.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Block-STM:&lt;/strong&gt; A parallel execution engine that runs transactions optimistically in parallel and re-executes only those that conflict. This extracts parallelism without requiring developers to declare dependencies upfront.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AptosBFT:&lt;/strong&gt; A consensus mechanism based on Jolteon, providing deterministic finality in sub-second time. Once a block is committed, it's final — no reorgs, no probabilistic confirmation waits.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The API: REST, not JSON-RPC
&lt;/h2&gt;

&lt;p&gt;Here's where most Ethereum developers get tripped up. Aptos doesn't use JSON-RPC. It uses a &lt;strong&gt;REST API&lt;/strong&gt; (the Aptos fullnode API). If you're trying to use ethers.js or viem, you're in the wrong place.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Get ledger info (chain state)&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://rpc.swiftnodes.io/rpc/aptos | jq &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Get account info&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://rpc.swiftnodes.io/rpc/aptos/accounts/0x1 | jq &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Get account resource (e.g., coin balance)&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://rpc.swiftnodes.io/rpc/aptos/accounts/0x1/resource/0x1::coin::CoinStore&amp;lt;0x1::aptos_coin::AptosCoin&amp;gt; | jq &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The core endpoints you'll use:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Endpoint&lt;/th&gt;
&lt;th&gt;What it gives you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ledger info (chain ID, epoch, block height, timestamp)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/accounts/{address}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Account info (sequence number, authentication key)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/accounts/{address}/resource/{resource_type}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Account resource (balances, module state)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/accounts/{address}/modules&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deployed Move modules&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/transactions&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Submit or query transactions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/blocks/by_height/{height}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Block by height&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Move language: Resources, not accounts
&lt;/h2&gt;

&lt;p&gt;Move is the heart of Aptos, and it's unlike any smart contract language you've used. The key concept: &lt;strong&gt;resources&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In Solidity, balances are just numbers in a mapping. In Move, coins are resources that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can't be copied (no accidental inflation)&lt;/li&gt;
&lt;li&gt;Can't be discarded (no accidental loss)&lt;/li&gt;
&lt;li&gt;Must be explicitly moved or destroyed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's what a simple coin transfer looks like in Move:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;public entry fun transfer&amp;lt;CoinType&amp;gt;(
    from: &amp;amp;signer,
    to: address,
    amount: u64
) acquires CoinStore {
    // Withdraw from sender
    let coins = Coin::withdraw&amp;lt;CoinType&amp;gt;(from, amount);
    // Deposit to recipient
    Coin::deposit&amp;lt;CoinType&amp;gt;(to, coins);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The type system ensures that &lt;code&gt;coins&lt;/code&gt; can't be copied or dropped — it must be deposited somewhere. This eliminates entire classes of bugs that plague Solidity contracts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Block-STM: Parallel execution without the hassle
&lt;/h2&gt;

&lt;p&gt;Most blockchains execute transactions sequentially. If you have 100 transactions in a block, they run one after another. Aptos does something different.&lt;/p&gt;

&lt;p&gt;Block-STM runs all transactions in a block &lt;strong&gt;optimistically in parallel&lt;/strong&gt;. If two transactions conflict (they touch the same state), Block-STM detects the conflict and re-executes only the conflicting transactions. The result: you get parallel execution benefits without having to manually declare dependencies or worry about ordering.&lt;/p&gt;

&lt;p&gt;For developers, this means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write contracts as if execution is sequential&lt;/li&gt;
&lt;li&gt;The runtime handles parallelization automatically&lt;/li&gt;
&lt;li&gt;High throughput without the complexity&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How this compares to other chains
&lt;/h2&gt;

&lt;p&gt;Aptos is often compared to &lt;a href="https://swiftnodes.io/blog/sui-rpc-object-model" rel="noopener noreferrer"&gt;Sui&lt;/a&gt;, which also uses Move. The difference: Aptos uses an account-based model (like Ethereum), while Sui uses an object-based model. Aptos is closer to what Ethereum developers expect, but with Move's safety guarantees.&lt;/p&gt;

&lt;p&gt;Compared to &lt;a href="https://swiftnodes.io/blog/solana-websocket-vs-http" rel="noopener noreferrer"&gt;Solana&lt;/a&gt;, Aptos offers similar throughput but with deterministic finality (Solana has probabilistic finality with reorg risk). Aptos also uses Move instead of Rust, which is more specialized for blockchain but has a steeper learning curve.&lt;/p&gt;

&lt;p&gt;Compared to &lt;a href="https://swiftnodes.io/blog/cosmos-rpc-explained" rel="noopener noreferrer"&gt;Cosmos&lt;/a&gt; chains, Aptos is a single monolithic chain (not an appchain framework). You're trading customization for simplicity and performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Querying account state
&lt;/h2&gt;

&lt;p&gt;In Ethereum, you query balances with &lt;code&gt;eth_getBalance&lt;/code&gt;. In Aptos, you query &lt;strong&gt;resources&lt;/strong&gt;. Every piece of state is a resource stored under an account.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Get APT balance for an account&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="s2"&gt;"https://rpc.swiftnodes.io/rpc/aptos/accounts/0x1/resource/0x1::coin::CoinStore&amp;lt;0x1::aptos_coin::AptosCoin&amp;gt;"&lt;/span&gt; | jq &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# Response includes:&lt;/span&gt;
&lt;span class="c"&gt;# {&lt;/span&gt;
&lt;span class="c"&gt;#   "data": {&lt;/span&gt;
&lt;span class="c"&gt;#     "coin": { "value": "1000000000" },  // 10 APT (8 decimals)&lt;/span&gt;
&lt;span class="c"&gt;#     "frozen": false,&lt;/span&gt;
&lt;span class="c"&gt;#     "deposit_events": { ... },&lt;/span&gt;
&lt;span class="c"&gt;#     "withdraw_events": { ... }&lt;/span&gt;
&lt;span class="c"&gt;#   }&lt;/span&gt;
&lt;span class="c"&gt;# }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The resource type is a fully qualified Move module path: &lt;code&gt;0x1::coin::CoinStore&amp;lt;0x1::aptos_coin::AptosCoin&amp;gt;&lt;/code&gt;. This is verbose but explicit — you know exactly what you're querying.&lt;/p&gt;

&lt;h2&gt;
  
  
  Transaction submission
&lt;/h2&gt;

&lt;p&gt;Submitting transactions is also different. You don't just sign and send raw transactions. You:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Build a transaction payload (specifying the Move function to call)&lt;/li&gt;
&lt;li&gt;Simulate the transaction (optional but recommended)&lt;/li&gt;
&lt;li&gt;Sign with your account's private key&lt;/li&gt;
&lt;li&gt;Submit via the &lt;code&gt;/transactions&lt;/code&gt; endpoint&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Aptos TypeScript SDK handles most of this for you, but it's still a different workflow than Ethereum's &lt;code&gt;eth_sendRawTransaction&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;Aptos is a &lt;strong&gt;high-performance L1&lt;/strong&gt; using Move language and Block-STM parallel execution. Chain ID &lt;strong&gt;1&lt;/strong&gt;, ~1 second blocks, sub-second finality. &lt;strong&gt;REST API&lt;/strong&gt; (not JSON-RPC), APT token (8 decimals). Smart contracts in Move (not Solidity).&lt;/p&gt;

&lt;p&gt;For developers building high-throughput applications — DeFi, gaming, consumer apps — Aptos offers Ethereum-like account model with Move's safety guarantees and parallel execution performance.&lt;/p&gt;

&lt;p&gt;For reliable Aptos REST API access across load-balanced nodes, &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;grab a free API key&lt;/a&gt; and point your app 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/aptos?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/aptos-rpc" 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>Harmony RPC: Sharding, Finality, and What Changed After 2022</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Mon, 07 Sep 2026 05:25:36 +0000</pubDate>
      <link>https://dev.to/swiftnodes/harmony-rpc-sharding-finality-and-what-changed-after-2022-ehg</link>
      <guid>https://dev.to/swiftnodes/harmony-rpc-sharding-finality-and-what-changed-after-2022-ehg</guid>
      <description>&lt;p&gt;Harmony was one of the first major chains to bet on sharding as the path to scale. With 4 shards running in parallel, 2-second block times, and theoretical throughput of thousands of transactions per second, it was positioned as a high-performance alternative to Ethereum. Then the $100M bridge exploit in June 2022 changed everything. The chain is still running, the RPC still works, and for developers building on Harmony, the fundamentals haven't changed. Here's what you need to know.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Harmony actually is
&lt;/h2&gt;

&lt;p&gt;Harmony is a &lt;strong&gt;sharded Layer 1&lt;/strong&gt; blockchain using Proof of Stake consensus. Unlike most chains that process all transactions in a single sequence, Harmony splits its state across 4 shards, each processing transactions in parallel. This gives it higher theoretical throughput than single-chain architectures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key specs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chain ID: 1666600000 (0x63564C40)&lt;/li&gt;
&lt;li&gt;Shard 0 block time: ~2 seconds&lt;/li&gt;
&lt;li&gt;Gas token: ONE&lt;/li&gt;
&lt;li&gt;Consensus: Proof of Stake with BFT finality&lt;/li&gt;
&lt;li&gt;Shards: 4 (shard 0 is the beacon chain)&lt;/li&gt;
&lt;li&gt;EVM compatibility: Full (on shard 0)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture is distinct from both Ethereum L2s and other L1s. Each shard has its own set of validators and processes its own transactions. Cross-shard transactions are handled by the beacon chain (shard 0), which coordinates state between shards.&lt;/p&gt;

&lt;p&gt;For most developers, you'll interact with &lt;strong&gt;shard 0&lt;/strong&gt; — it's where the EVM compatibility lives and where most dApps are deployed. The other shards exist but have limited adoption.&lt;/p&gt;

&lt;h2&gt;
  
  
  The RPC: Standard Ethereum JSON-RPC (with caveats)
&lt;/h2&gt;

&lt;p&gt;Harmony exposes the standard Ethereum JSON-RPC interface on shard 0. If you've built against Ethereum, the core methods work as expected.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Chain ID&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://rpc.swiftnodes.io/rpc/harmony?key&lt;span class="o"&gt;=&lt;/span&gt;YOUR_API_KEY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; {"jsonrpc":"2.0","id":1,"result":"0x63564c40"}&lt;/span&gt;

&lt;span class="c"&gt;# Latest block&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://rpc.swiftnodes.io/rpc/harmony?key&lt;span class="o"&gt;=&lt;/span&gt;YOUR_API_KEY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; {"jsonrpc":"2.0","id":1,"result":"0x592a771"}  # ~93M&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The core methods work as expected:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;What it gives you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_chainId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chain ID (1666600000 / 0x63564C40)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_blockNumber&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Latest block height (shard 0)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_getBlockByNumber&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Block by number (with or without full txs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_getBalance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ONE balance for an address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_call&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Execute a call without creating a transaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_sendRawTransaction&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Submit a signed transaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_getLogs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Query event logs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; All queries default to &lt;strong&gt;shard 0&lt;/strong&gt;. If you need to query other shards, you'll need to use shard-specific endpoints (not widely supported by third-party providers).&lt;/p&gt;

&lt;h2&gt;
  
  
  Gas fees and block structure
&lt;/h2&gt;

&lt;p&gt;Harmony's gas fees are consistently low, typically under 1 gwei. The 2-second block times mean transactions confirm quickly, though you should wait for a few blocks for finality.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Block with transactions&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://rpc.swiftnodes.io/rpc/harmony?key&lt;span class="o"&gt;=&lt;/span&gt;YOUR_API_KEY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest",false],"id":1}'&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; {"jsonrpc":"2.0","id":1,"result":{"number":"0x592a771","timestamp":"0x6a9bafb3","transactions":[...]}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Blocks on shard 0 contain a moderate number of transactions. While Harmony's theoretical throughput is high (thousands of TPS across all shards), actual usage is concentrated on shard 0.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened in 2022 (and why it matters)
&lt;/h2&gt;

&lt;p&gt;In June 2022, Harmony's Rainbow Bridge was exploited for approximately $100M in wrapped assets. The exploit compromised validator keys, allowing the attacker to forge cross-shard transactions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What changed:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The bridge was paused and later relaunched with additional security measures&lt;/li&gt;
&lt;li&gt;Validator set was restructured&lt;/li&gt;
&lt;li&gt;Development pace slowed significantly&lt;/li&gt;
&lt;li&gt;TVL and user activity dropped sharply&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What didn't change:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The chain itself continued operating&lt;/li&gt;
&lt;li&gt;Block production never stopped&lt;/li&gt;
&lt;li&gt;RPC endpoints remained functional&lt;/li&gt;
&lt;li&gt;Existing dApps on shard 0 continued working&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For developers querying the chain via RPC, the exploit doesn't affect your ability to read state, submit transactions, or interact with contracts on shard 0. The chain's consensus and execution layer remained intact.&lt;/p&gt;

&lt;p&gt;If you're building new applications on Harmony, you should be aware of the reduced ecosystem activity and smaller developer community compared to 2021-2022.&lt;/p&gt;

&lt;h2&gt;
  
  
  eth_getLogs and range caps
&lt;/h2&gt;

&lt;p&gt;Like most chains, Harmony imposes range caps on &lt;code&gt;eth_getLogs&lt;/code&gt; to prevent abuse. If you're querying logs for a contract that emits a lot of events, you'll need to chunk your queries into smaller block ranges.&lt;/p&gt;

&lt;p&gt;A safe default is &lt;strong&gt;10,000 blocks per query&lt;/strong&gt;. If you need to scan a wider range, loop through it in chunks:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;FROM_BLOCK&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;90000000&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;TO_BLOCK&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;93000000&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;CHUNK_SIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;FROM_BLOCK&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;TO_BLOCK&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;CHUNK_SIZE&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;logs&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;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogs&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0x...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fromBlock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;toBlock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;CHUNK_SIZE&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TO_BLOCK&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="c1"&gt;// Process logs&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Trace methods and archive access
&lt;/h2&gt;

&lt;p&gt;Harmony's standard RPC does &lt;strong&gt;not&lt;/strong&gt; support &lt;code&gt;trace_block&lt;/code&gt;, &lt;code&gt;trace_transaction&lt;/code&gt;, or &lt;code&gt;debug_traceCall&lt;/code&gt;. These methods require an archive node with tracing enabled, which is a different (and more expensive) infrastructure setup.&lt;/p&gt;

&lt;p&gt;If you need internal transactions, contract creation traces, or state diffs at a specific block, you'll need to use a dedicated archive provider or query the chain's block explorer API.&lt;/p&gt;

&lt;p&gt;For most dApp use cases — reading balances, submitting transactions, querying logs — the standard RPC is sufficient.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finality and cross-shard considerations
&lt;/h2&gt;

&lt;p&gt;Harmony uses BFT consensus with &lt;strong&gt;single-block finality&lt;/strong&gt; on each shard. Once a block is committed by the shard's validator set, it's final. No reorgs, no probabilistic confirmation waits.&lt;/p&gt;

&lt;p&gt;However, &lt;strong&gt;cross-shard transactions&lt;/strong&gt; add complexity. If your application needs to interact with state on multiple shards, you're relying on the beacon chain's cross-shard messaging, which has different timing characteristics.&lt;/p&gt;

&lt;p&gt;For most developers staying on shard 0, this isn't a concern. Your transactions have the same finality guarantees as any other BFT chain.&lt;/p&gt;

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

&lt;p&gt;Harmony is a &lt;strong&gt;sharded L1&lt;/strong&gt; with 4 parallel chains. Chain ID &lt;strong&gt;1666600000&lt;/strong&gt;, ~2 second blocks on shard 0, gas fees under &lt;strong&gt;1 gwei&lt;/strong&gt;. Standard Ethereum JSON-RPC — if you've built on Ethereum, you already know how to query it. Uses ONE for gas.&lt;/p&gt;

&lt;p&gt;The 2022 bridge exploit reduced ecosystem activity but didn't break the chain. Block production continued, RPC endpoints stayed live, and shard 0 remains fully functional.&lt;/p&gt;

&lt;p&gt;For reliable Harmony RPC access across load-balanced nodes, &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;grab a free API key&lt;/a&gt; and point your app 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/harmony?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/harmony-rpc" 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>Polygon RPC: The Gateway L2 for High-Throughput dApps</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Sun, 06 Sep 2026 11:38:14 +0000</pubDate>
      <link>https://dev.to/swiftnodes/polygon-rpc-the-gateway-l2-for-high-throughput-dapps-2akc</link>
      <guid>https://dev.to/swiftnodes/polygon-rpc-the-gateway-l2-for-high-throughput-dapps-2akc</guid>
      <description>&lt;p&gt;Polygon PoS is the scaling solution that proved Ethereum could scale without waiting for rollups to mature. With 1.5-second block times, gas fees that rarely exceed 1 gwei, and over 93 million blocks processed, Polygon has become the default home for dApps that need throughput today, not someday.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Polygon actually is
&lt;/h2&gt;

&lt;p&gt;Polygon PoS is a &lt;strong&gt;sidechain&lt;/strong&gt; to Ethereum, not a rollup. It runs its own consensus mechanism (Proof of Stake with a validator set) and periodically anchors state to Ethereum for security. This is fundamentally different from Optimism, Arbitrum, or Base, which are optimistic rollups that inherit Ethereum's security directly.&lt;/p&gt;

&lt;p&gt;The tradeoff: Polygon offers faster finality (2 seconds vs 2 minutes for rollups) and lower fees, but you're trusting the Polygon validator set rather than Ethereum validators directly. For most applications, this is an acceptable tradeoff — Polygon has been running since 2020 with over 300 validators and has never had a consensus failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key specs:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chain ID: 137 (0x89)&lt;/li&gt;
&lt;li&gt;Block time: ~1.5 seconds&lt;/li&gt;
&lt;li&gt;Gas token: POL (formerly MATIC)&lt;/li&gt;
&lt;li&gt;Consensus: Proof of Stake with checkpointing to Ethereum&lt;/li&gt;
&lt;li&gt;EVM compatibility: Full (same opcodes, same tooling)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Polygon also operates &lt;strong&gt;Polygon zkEVM&lt;/strong&gt;, a separate Type 1 zkEVM chain that uses zero-knowledge proofs for Ethereum-equivalent execution. That's a different chain (chain ID 1101) with different tradeoffs. This post focuses on Polygon PoS, the high-throughput sidechain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The RPC: Standard Ethereum JSON-RPC
&lt;/h2&gt;

&lt;p&gt;Polygon exposes the standard Ethereum JSON-RPC interface. If you've built against Ethereum mainnet, you already know how to query Polygon.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Chain ID&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://rpc.swiftnodes.io/rpc/polygon?key&lt;span class="o"&gt;=&lt;/span&gt;YOUR_API_KEY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; {"jsonrpc":"2.0","id":1,"result":"0x89"}&lt;/span&gt;

&lt;span class="c"&gt;# Latest block&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://rpc.swiftnodes.io/rpc/polygon?key&lt;span class="o"&gt;=&lt;/span&gt;YOUR_API_KEY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; {"jsonrpc":"2.0","id":1,"result":"0x590a5ae"}  # ~93M&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The core methods work as expected:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;What it gives you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_chainId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chain ID (137 / 0x89)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_blockNumber&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Latest block height&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_getBlockByNumber&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Block by number (with or without full txs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_getBalance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;POL balance for an address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_call&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Execute a call without creating a transaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_sendRawTransaction&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Submit a signed transaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_getLogs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Query event logs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Gas fees and block structure
&lt;/h2&gt;

&lt;p&gt;Polygon's gas fees are consistently low. While Ethereum mainnet can spike to 50-200 gwei during congestion, Polygon typically stays under 1 gwei. A typical swap on Uniswap V3 (deployed on Polygon) costs fractions of a cent.&lt;/p&gt;

&lt;p&gt;Blocks arrive every ~1.5 seconds and contain hundreds of transactions. Polygon processes more daily transactions than most L2s combined, making it one of the most active chains in the ecosystem.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Gas price&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://rpc.swiftnodes.io/rpc/polygon?key&lt;span class="o"&gt;=&lt;/span&gt;YOUR_API_KEY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":1}'&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; {"jsonrpc":"2.0","id":1,"result":"0x6fc23ac00"}  # ~30 gwei in wei&lt;/span&gt;

&lt;span class="c"&gt;# Block with transactions&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://rpc.swiftnodes.io/rpc/polygon?key&lt;span class="o"&gt;=&lt;/span&gt;YOUR_API_KEY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest",false],"id":1}'&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; {"jsonrpc":"2.0","id":1,"result":{"number":"0x590a5ae","timestamp":"0x6a9bafb3","transactions":[...]}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's different from rollups
&lt;/h2&gt;

&lt;p&gt;Polygon PoS is often grouped with L2s, but it's architecturally distinct:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://swiftnodes.io/blog/optimism-rpc-the-chain-that-became-a-template" rel="noopener noreferrer"&gt;Optimism&lt;/a&gt;/Arbitrum/&lt;a href="https://swiftnodes.io/blog/base-rpc" rel="noopener noreferrer"&gt;Base&lt;/a&gt;&lt;/strong&gt; are optimistic rollups. They post transaction data to Ethereum and rely on fraud proofs for security. Finality takes ~7 days for withdrawals (or ~1 hour with fast-bridge services).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polygon PoS&lt;/strong&gt; is a sidechain. It runs its own consensus and periodically checkpoints to Ethereum. Finality is ~2 minutes for deposits, ~30 minutes for withdrawals via the official bridge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Polygon zkEVM&lt;/strong&gt; is a Type 1 zkEVM rollup. It uses zero-knowledge proofs for validity, offering stronger security guarantees than PoS but with higher gas fees and slower block times.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From an RPC perspective, they're all EVM-compatible. You can use the same tooling — ethers.js, viem, Hardhat, Foundry — against any of them. The chain ID is the only thing that changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  eth_getLogs and range caps
&lt;/h2&gt;

&lt;p&gt;Like most high-throughput chains, Polygon imposes range caps on &lt;code&gt;eth_getLogs&lt;/code&gt; to prevent abuse. If you're querying logs for a contract that emits a lot of events, you'll need to chunk your queries into smaller block ranges.&lt;/p&gt;

&lt;p&gt;The exact cap varies by provider, but a safe default is &lt;strong&gt;10,000 blocks per query&lt;/strong&gt;. If you need to scan a wider range, loop through it in chunks:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;FROM_BLOCK&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;90000000&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;TO_BLOCK&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;93000000&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;CHUNK_SIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;FROM_BLOCK&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;TO_BLOCK&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;CHUNK_SIZE&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;logs&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;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogs&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0x...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fromBlock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;toBlock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;CHUNK_SIZE&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TO_BLOCK&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="c1"&gt;// Process logs&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Trace methods and archive access
&lt;/h2&gt;

&lt;p&gt;Polygon's standard RPC does &lt;strong&gt;not&lt;/strong&gt; support &lt;code&gt;trace_block&lt;/code&gt;, &lt;code&gt;trace_transaction&lt;/code&gt;, or &lt;code&gt;debug_traceCall&lt;/code&gt;. These methods require an archive node with tracing enabled, which is a different (and more expensive) infrastructure setup.&lt;/p&gt;

&lt;p&gt;If you need internal transactions, contract creation traces, or state diffs at a specific block, you'll need to use a dedicated archive provider or query the chain's block explorer API.&lt;/p&gt;

&lt;p&gt;For most dApp use cases — reading balances, submitting transactions, querying logs — the standard RPC is sufficient.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bridging and finality
&lt;/h2&gt;

&lt;p&gt;Assets move between Polygon and Ethereum via the &lt;strong&gt;official Polygon bridge&lt;/strong&gt; (&lt;a href="https://portal.polygon.technology/bridge" rel="noopener noreferrer"&gt;https://portal.polygon.technology/bridge&lt;/a&gt;) or third-party bridges like Across, Hop, and Stargate.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deposits (Ethereum → Polygon):&lt;/strong&gt; ~20-30 minutes via the official bridge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Withdrawals (Polygon → Ethereum):&lt;/strong&gt; ~30 minutes via the official bridge (faster than rollups' 7-day challenge window)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Polygon's checkpoint mechanism anchors state to Ethereum every ~30 minutes. Once a checkpoint is confirmed on Ethereum, the corresponding Polygon blocks are considered finalized. This is faster than optimistic rollups but slower than chains with instant finality like Solana or Avalanche.&lt;/p&gt;

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

&lt;p&gt;Polygon PoS is a &lt;strong&gt;high-throughput sidechain&lt;/strong&gt; for Ethereum. Chain ID &lt;strong&gt;137&lt;/strong&gt;, ~1.5 second blocks, gas fees typically under &lt;strong&gt;1 gwei&lt;/strong&gt;. Standard Ethereum JSON-RPC — if you've built on Ethereum, you already know how to query it. Uses POL (formerly MATIC) for gas.&lt;/p&gt;

&lt;p&gt;For dApps that need throughput today — DeFi, NFTs, gaming, social — Polygon is where the users are. Uniswap V3, Aave, OpenSea, and thousands of other dApps have made it one of the most active chains by daily transactions.&lt;/p&gt;

&lt;p&gt;For reliable Polygon RPC access across load-balanced nodes, &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;grab a free API key&lt;/a&gt; and point your app 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/polygon?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/polygon-rpc" 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>Base RPC: Coinbase's OP Stack L2 for Consumer dApps</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Sat, 05 Sep 2026 06:13:41 +0000</pubDate>
      <link>https://dev.to/swiftnodes/base-rpc-coinbases-op-stack-l2-for-consumer-dapps-3l76</link>
      <guid>https://dev.to/swiftnodes/base-rpc-coinbases-op-stack-l2-for-consumer-dapps-3l76</guid>
      <description>&lt;p&gt;Base has quietly become one of the most active Layer 2s on Ethereum. Built by Coinbase on the OP Stack, it offers the same EVM compatibility developers expect from Ethereum mainnet, but with ~2 second block times and gas fees that hover around 0.01 gwei. If you're building consumer-facing dApps — trading, payments, social — Base is where the users are.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Base actually is
&lt;/h2&gt;

&lt;p&gt;Base is an &lt;strong&gt;optimistic rollup&lt;/strong&gt; built on the &lt;a href="https://www.optimism.io/" rel="noopener noreferrer"&gt;OP Stack&lt;/a&gt;, the same framework that powers &lt;a href="https://swiftnodes.io/blog/optimism-rpc-the-chain-that-became-a-template" rel="noopener noreferrer"&gt;Optimism&lt;/a&gt;. It launched in August 2023 and has grown to consistently rank in the top 3 L2s by daily transactions.&lt;/p&gt;

&lt;p&gt;The architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Execution layer:&lt;/strong&gt; OP Stack (Geth-based), fully EVM-compatible&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security:&lt;/strong&gt; Inherits from Ethereum via fault proofs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sequencer:&lt;/strong&gt; Currently operated by Coinbase (with stated intent to decentralize)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gas token:&lt;/strong&gt; ETH&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chain ID:&lt;/strong&gt; 8453&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Base is part of the &lt;strong&gt;Optimism Superchain&lt;/strong&gt; — a network of OP Stack chains that share sequencer infrastructure, governance frameworks, and bridging primitives. Other Superchain members include Optimism itself, Mode, Zora, and opBNB.&lt;/p&gt;

&lt;p&gt;The chain has become a hub for consumer-grade dApps: Aerodrome (the dominant DEX), Uniswap V3, Aave V3, Friend.tech (which drove a massive spike in 2023), Farcaster (decentralized social), and a wave of memecoins. Coinbase's wallet integration gives Base a direct on-ramp for millions of users.&lt;/p&gt;

&lt;h2&gt;
  
  
  The RPC: Standard Ethereum JSON-RPC
&lt;/h2&gt;

&lt;p&gt;Base exposes the standard Ethereum JSON-RPC interface. If you've built against Ethereum mainnet, you already know how to query Base.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Chain ID&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://rpc.swiftnodes.io/rpc/base?key&lt;span class="o"&gt;=&lt;/span&gt;YOUR_API_KEY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"eth_chainId","params":[],"id":1}'&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; {"jsonrpc":"2.0","id":1,"result":"0x2105"}&lt;/span&gt;

&lt;span class="c"&gt;# Latest block&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://rpc.swiftnodes.io/rpc/base?key&lt;span class="o"&gt;=&lt;/span&gt;YOUR_API_KEY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"eth_blockNumber","params":[],"id":1}'&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; {"jsonrpc":"2.0","id":1,"result":"0x308a968"}  # ~50.8M&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The core methods work as expected:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;What it gives you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_chainId&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Chain ID (8453 / 0x2105)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_blockNumber&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Latest block height&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_getBlockByNumber&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Block by number (with or without full txs)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_getBalance&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ETH balance for an address&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_call&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Execute a call without creating a transaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_sendRawTransaction&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Submit a signed transaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;eth_getLogs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Query event logs (with range caps — see below)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Gas fees and block structure
&lt;/h2&gt;

&lt;p&gt;Base's gas fees are among the lowest in the L2 ecosystem. At the time of writing, gas prices hover around &lt;strong&gt;0.01 gwei&lt;/strong&gt; — roughly 100x cheaper than Ethereum mainnet. A typical swap on Aerodrome costs fractions of a cent.&lt;/p&gt;

&lt;p&gt;Blocks arrive every ~2 seconds and contain around 150-200 transactions. That's a healthy throughput for a consumer-focused chain.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Gas price&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://rpc.swiftnodes.io/rpc/base?key&lt;span class="o"&gt;=&lt;/span&gt;YOUR_API_KEY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"eth_gasPrice","params":[],"id":1}'&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; {"jsonrpc":"2.0","id":1,"result":"0x2540be400"}  # ~10 gwei in wei&lt;/span&gt;

&lt;span class="c"&gt;# Block with transactions&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://rpc.swiftnodes.io/rpc/base?key&lt;span class="o"&gt;=&lt;/span&gt;YOUR_API_KEY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"eth_getBlockByNumber","params":["latest",false],"id":1}'&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; {"jsonrpc":"2.0","id":1,"result":{"number":"0x308a968","timestamp":"0x6a9bafb3","transactions":[...]}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What's different from other L2s
&lt;/h2&gt;

&lt;p&gt;Base shares the OP Stack with &lt;a href="https://swiftnodes.io/blog/optimism-rpc-the-chain-that-became-a-template" rel="noopener noreferrer"&gt;Optimism&lt;/a&gt;, so the RPC surface is identical. The differences are in the ecosystem and sequencing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Optimism&lt;/strong&gt; is the "original" OP Stack chain, with a focus on protocol development and the Superchain vision. OP token governs the protocol.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Base&lt;/strong&gt; is Coinbase's deployment, optimized for consumer dApps and wallet integration. No native token — gas is paid in ETH.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Arbitrum&lt;/strong&gt; uses a different stack (Nitro, derived from Geth but not OP Stack). It has a different fee model and a different governance token (ARB).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From an RPC perspective, they're all EVM-compatible. You can use the same tooling — ethers.js, viem, Hardhat, Foundry — against any of them. The chain ID is the only thing that changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  eth_getLogs and range caps
&lt;/h2&gt;

&lt;p&gt;Like most L2s, Base imposes range caps on &lt;code&gt;eth_getLogs&lt;/code&gt; to prevent abuse. If you're querying logs for a contract that emits a lot of events, you'll need to chunk your queries into smaller block ranges.&lt;/p&gt;

&lt;p&gt;The exact cap varies by provider, but a safe default is &lt;strong&gt;10,000 blocks per query&lt;/strong&gt;. If you need to scan a wider range, loop through it in chunks:&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;FROM_BLOCK&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50000000&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;TO_BLOCK&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50800000&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;CHUNK_SIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;FROM_BLOCK&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;TO_BLOCK&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;CHUNK_SIZE&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;logs&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;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogs&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0x...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;fromBlock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;toBlock&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;CHUNK_SIZE&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;TO_BLOCK&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="c1"&gt;// Process logs&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Trace methods and archive access
&lt;/h2&gt;

&lt;p&gt;Base's standard RPC does &lt;strong&gt;not&lt;/strong&gt; support &lt;code&gt;trace_block&lt;/code&gt;, &lt;code&gt;trace_transaction&lt;/code&gt;, or &lt;code&gt;debug_traceCall&lt;/code&gt;. These methods require an archive node with tracing enabled, which is a different (and more expensive) infrastructure setup.&lt;/p&gt;

&lt;p&gt;If you need internal transactions, contract creation traces, or state diffs at a specific block, you'll need to use a dedicated archive provider or query the chain's block explorer API.&lt;/p&gt;

&lt;p&gt;For most dApp use cases — reading balances, submitting transactions, querying logs — the standard RPC is sufficient.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bridging and finality
&lt;/h2&gt;

&lt;p&gt;Assets move between Base and Ethereum via the &lt;strong&gt;official Base bridge&lt;/strong&gt; (&lt;a href="https://bridge.base.org" rel="noopener noreferrer"&gt;https://bridge.base.org&lt;/a&gt;) or third-party bridges like Across, Hop, and Squid.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deposits (Ethereum → Base):&lt;/strong&gt; ~10-15 minutes via the official bridge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Withdrawals (Base → Ethereum):&lt;/strong&gt; 7 days via the official bridge (the challenge window for optimistic rollups), or instant via third-party bridges&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Base inherits Ethereum's security through fault proofs. If a sequencer proposes an invalid state root, there's a 7-day window for challengers to dispute it. This is the tradeoff for optimistic rollups: fast deposits, but withdrawals take time unless you use a fast-bridge service.&lt;/p&gt;

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

&lt;p&gt;Base is Coinbase's &lt;strong&gt;OP Stack L2&lt;/strong&gt; on Ethereum. Chain ID &lt;strong&gt;8453&lt;/strong&gt;, ~2 second blocks, gas fees around &lt;strong&gt;0.01 gwei&lt;/strong&gt;. Standard Ethereum JSON-RPC — if you've built on Ethereum, you already know how to query it. Part of the &lt;strong&gt;Optimism Superchain&lt;/strong&gt; alongside Optimism, Mode, and Zora. Gas paid in ETH. No native token.&lt;/p&gt;

&lt;p&gt;For consumer dApps — trading, payments, social — Base is where the users are. Aerodrome, Uniswap V3, Aave, Farcaster, and a wave of memecoins have made it one of the most active L2s by daily transactions.&lt;/p&gt;

&lt;p&gt;For reliable Base RPC access across load-balanced nodes, &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;grab a free API key&lt;/a&gt; and point your app 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/base?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/base-rpc" 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>dYdX RPC: Querying a Decentralized Perpetuals Exchange</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Fri, 04 Sep 2026 05:54:06 +0000</pubDate>
      <link>https://dev.to/swiftnodes/dydx-rpc-querying-a-decentralized-perpetuals-exchange-1nno</link>
      <guid>https://dev.to/swiftnodes/dydx-rpc-querying-a-decentralized-perpetuals-exchange-1nno</guid>
      <description>&lt;p&gt;dYdX Chain is one of the more architecturally distinctive chains in the Cosmos ecosystem, because the entire chain exists to serve a single application: a decentralized perpetual-futures exchange. The orderbook is off-chain, settlement is on-chain, and the validators themselves run the matching engine. Developers who connect an RPC endpoint to dYdX often expect a standard Cosmos pattern and miss the parts that make it different. Here's the map.&lt;/p&gt;

&lt;h2&gt;
  
  
  What dYdX actually does
&lt;/h2&gt;

&lt;p&gt;dYdX is a &lt;strong&gt;decentralized perpetual-futures exchange&lt;/strong&gt; built on the &lt;a href="https://swiftnodes.io/blog/cosmos-rpc-explained" rel="noopener noreferrer"&gt;Cosmos SDK&lt;/a&gt; with CometBFT consensus. The pitch: trade perpetual contracts with the speed of a centralized exchange, but keep your funds in self-custody. The chain handles order matching, trade settlement, liquidations, and funding rate calculations — all on-chain, all with sub-second block times.&lt;/p&gt;

&lt;p&gt;The numbers as of September 2026: $1.6 trillion in lifetime trading volume, 99+ listed markets, and open interest in the tens of millions. The chain migrated from an Ethereum L2 (dYdX v3, StarkEx-powered) to a sovereign Cosmos SDK appchain (dYdX v4) on October 27, 2023. The migration was driven by the need for lower latency, higher throughput, and full control over the execution environment — things that are hard to achieve when your settlement layer is someone else's chain.&lt;/p&gt;

&lt;p&gt;The architecture has three layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Off-chain orderbook:&lt;/strong&gt; Each validator runs an in-memory orderbook. Orders are gossiped peer-to-peer and matched locally. This is what gives dYdX its speed — matching happens in memory, not through consensus.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-chain settlement:&lt;/strong&gt; When orders match, the resulting trades are proposed as transactions and committed through CometBFT consensus. This is where the chain comes in — recording trades, updating positions, handling liquidations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Indexer API:&lt;/strong&gt; A separate indexer aggregates on-chain state into a queryable API for the frontend. Most users and dashboards read from the indexer, not directly from the chain.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Perpetuals are margined in &lt;strong&gt;Noble USDC&lt;/strong&gt; bridged onto the chain via IBC. The native &lt;strong&gt;DYDX token&lt;/strong&gt; (18 decimals, base denom &lt;code&gt;adydx&lt;/code&gt;) is used for staking and governance — not as trading collateral.&lt;/p&gt;

&lt;h2&gt;
  
  
  The RPC: CometBFT JSON-RPC, same as other Cosmos chains
&lt;/h2&gt;

&lt;p&gt;dYdX Chain runs on &lt;code&gt;dydx-mainnet-1&lt;/code&gt;, uses CometBFT v0.38.x, has sub-second blocks (~0.7s in practice), and exposes the standard CometBFT JSON-RPC surface. No &lt;code&gt;eth_*&lt;/code&gt;, no EVM. The chain ID is the string &lt;code&gt;dydx-mainnet-1&lt;/code&gt;, not a numeric EVM ID.&lt;/p&gt;

&lt;p&gt;SwiftNodes serves the CometBFT JSON-RPC endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Node status&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://rpc.swiftnodes.io/rpc/dydx?key&lt;span class="o"&gt;=&lt;/span&gt;YOUR_API_KEY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"status","params":[],"id":1}'&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; {"result":{"node_info":{"network":"dydx-mainnet-1",...},"sync_info":{"latest_block_height":"104059712",...}}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The core methods you'll use:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;What it gives you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Node info, latest block height, sync state, network ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;block&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A block by height — header, transactions, last commit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;block_results&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Transaction results and events for a block&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;broadcast_tx_sync&lt;/code&gt; / &lt;code&gt;_commit&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Submit a signed transaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Look up a transaction by hash&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are the consensus-layer queries — reading blocks, monitoring chain activity, broadcasting transactions. They work the same way across every Cosmos chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the special part lives: dYdX modules
&lt;/h2&gt;

&lt;p&gt;Here's where dYdX diverges from a plain Cosmos chain. The trading state — perpetual markets, positions, orders, fills — lives in dYdX-specific protobuf modules. You query these through &lt;code&gt;abci_query&lt;/code&gt; with the module's gRPC query path, or (more commonly) through the dYdX Indexer API that wraps these queries.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;What it manages&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dydxprotocol.perpetuals&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Perpetual market definitions, funding rates, premium votes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dydxprotocol.subaccounts&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;User positions, margin requirements, PnL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dydxprotocol.clob&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The orderbook — order placement, matching, fills&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dydxprotocol.prices&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Oracle price feeds for each market&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;dydxprotocol.bridge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;USDC bridging from Noble via IBC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The practical split:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consensus RPC (CometBFT)&lt;/strong&gt; — reading blocks, monitoring the chain, broadcasting standard transactions. This is what a flat-rate RPC endpoint gives you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Module queries (abci_query)&lt;/strong&gt; — reading trading state (positions, markets, orderbook state). Requires protobuf-encoded request data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Indexer API&lt;/strong&gt; — the high-level query layer that most frontends and dashboards use. Wraps the module queries with a friendlier REST interface.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building a trading bot, a position tracker, or a liquidation monitor, you'll typically use the Indexer API for market data and positions, and the CometBFT RPC for broadcasting transactions and monitoring block-level events. The Indexer API is maintained by the dYdX team and reads from the chain — it's not a separate service you need to run yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  How this compares to other Cosmos chains
&lt;/h2&gt;

&lt;p&gt;dYdX shares the CometBFT RPC surface with every other Cosmos chain, but the application layer is where it diverges. &lt;a href="https://swiftnodes.io/blog/injective-rpc-orderbook-l1" rel="noopener noreferrer"&gt;Injective&lt;/a&gt; also puts an orderbook in modules — but Injective's orderbook is fully on-chain (orders are transactions). dYdX's orderbook is off-chain (orders are gossiped, matched in memory, then settled on-chain). The difference matters for latency: dYdX can match orders in microseconds because matching doesn't wait for consensus; Injective's matching waits for the next block.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://swiftnodes.io/blog/osmosis-rpc-cosmos-dex" rel="noopener noreferrer"&gt;Osmosis&lt;/a&gt; puts a spot DEX in modules. &lt;a href="https://swiftnodes.io/blog/celestia-rpc-modular-da" rel="noopener noreferrer"&gt;Celestia&lt;/a&gt; is a data availability layer. dYdX is a perpetuals exchange. The pattern is the same — Cosmos SDK modules extend the base chain with application-specific state — but the domain is different each time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finality and block structure
&lt;/h2&gt;

&lt;p&gt;dYdX has &lt;strong&gt;single-block deterministic finality&lt;/strong&gt; via CometBFT BFT consensus — once a block is committed by the validator set, it's final. No reorgs, no probabilistic confirmation waits. With sub-second block times, trades settle in under a second from order placement to on-chain confirmation.&lt;/p&gt;

&lt;p&gt;For an indexer, this means you can trust a committed block immediately. Read blocks via &lt;code&gt;block&lt;/code&gt;, transaction results via &lt;code&gt;block_results&lt;/code&gt;. The same &lt;a href="https://swiftnodes.io/blog/handling-chain-reorgs-indexer" rel="noopener noreferrer"&gt;reorg-handling patterns&lt;/a&gt; you'd build for probabilistic chains like Ethereum don't apply here — once it's committed, it's done.&lt;/p&gt;

&lt;p&gt;The fast block times also mean higher block volume. At ~0.7s per block, dYdX produces roughly 125,000 blocks per day — more than Ethereum's ~7,200. If you're indexing every block, plan for the throughput.&lt;/p&gt;

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

&lt;p&gt;dYdX Chain is a &lt;strong&gt;decentralized perpetual-futures exchange&lt;/strong&gt; built on the Cosmos SDK. Its RPC is &lt;strong&gt;CometBFT JSON-RPC&lt;/strong&gt; — the same surface as every other Cosmos chain. Use &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;block&lt;/code&gt;, &lt;code&gt;block_results&lt;/code&gt;, and &lt;code&gt;tx&lt;/code&gt; to read chain state. Use &lt;code&gt;abci_query&lt;/code&gt; with dYdX-specific module paths (&lt;code&gt;dydxprotocol.clob&lt;/code&gt;, &lt;code&gt;dydxprotocol.perpetuals&lt;/code&gt;, &lt;code&gt;dydxprotocol.subaccounts&lt;/code&gt;) to read trading state, or use the dYdX Indexer API for a higher-level interface. The orderbook is off-chain (gossiped and matched in memory by validators); settlement is on-chain. It has single-block BFT finality, sub-second blocks, Noble USDC for margin, and the DYDX token (18 decimals) for staking and governance.&lt;/p&gt;

&lt;p&gt;For monitoring dYdX chain activity, tracking trading state, or broadcasting transactions, you need a reliable CometBFT endpoint. A flat-rate &lt;a href="https://swiftnodes.io/dydx-rpc" rel="noopener noreferrer"&gt;dYdX RPC endpoint&lt;/a&gt; gives you that across load-balanced nodes, alongside 74 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 app 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/dydx?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/dydx-rpc" 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>Akash Network RPC: Querying a Decentralized Compute Marketplace</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Thu, 03 Sep 2026 06:51:27 +0000</pubDate>
      <link>https://dev.to/swiftnodes/akash-network-rpc-querying-a-decentralized-compute-marketplace-47d9</link>
      <guid>https://dev.to/swiftnodes/akash-network-rpc-querying-a-decentralized-compute-marketplace-47d9</guid>
      <description>&lt;p&gt;Akash Network is one of the more interesting chains to connect an RPC endpoint to, because the chain itself isn't the product — the chain is the &lt;em&gt;settlement layer&lt;/em&gt; for a decentralized compute marketplace. Developers who first query Akash often expect a familiar Cosmos pattern and miss the parts that make it different. The compute marketplace (deployments, bids, leases) lives in Akash-specific modules, not in the standard bank/staking queries. And the workloads themselves — containers running on provider GPUs — don't live on-chain at all. Here's the map.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Akash actually does
&lt;/h2&gt;

&lt;p&gt;Akash is a &lt;strong&gt;decentralized cloud compute marketplace&lt;/strong&gt; built on the &lt;a href="https://swiftnodes.io/blog/cosmos-rpc-explained" rel="noopener noreferrer"&gt;Cosmos SDK&lt;/a&gt; with CometBFT consensus. The pitch: instead of renting GPUs from AWS at $3.93/hr for an H100, you describe your workload, providers bid against each other in a reverse auction, and you pay market price (currently around $1.33/hr for the same H100). The chain records the leases and handles settlement; the actual compute runs in provider-operated Kubernetes clusters off-chain.&lt;/p&gt;

&lt;p&gt;The numbers as of September 2026: ~59 active providers, ~15,000 vCPUs, ~433 GPUs (H100, A100, H200, RTX 5090), ~89 TB memory, ~785 TB storage. The AI inference wave has been the main demand driver — Akash ships pre-configured templates for Llama 3, DeepSeek, and Stable Diffusion, plus Ray cluster support for multi-node training.&lt;/p&gt;

&lt;p&gt;The deployment flow has three steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Deploy:&lt;/strong&gt; you describe your workload in an SDL (Stack Definition Language) file — CPU, memory, GPU, storage, exposed ports, max price. This creates a &lt;em&gt;deployment&lt;/em&gt; on-chain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bid:&lt;/strong&gt; independent providers submit competing bids. This is the reverse auction — providers undercut each other, and the market sets the price.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lease:&lt;/strong&gt; you accept a bid. A &lt;em&gt;lease&lt;/em&gt; is recorded on-chain, and the provider initializes your container in their Kubernetes cluster.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The chain handles the marketplace, the lease accounting, and the payment settlement. The compute itself is off-chain — you won't find container logs or execution results by querying the chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  The RPC: CometBFT JSON-RPC, same as other Cosmos chains
&lt;/h2&gt;

&lt;p&gt;Akash runs on &lt;code&gt;akashnet-2&lt;/code&gt;, uses CometBFT v0.38.x, has ~6-second blocks, and the AKT token has 6 decimals. The RPC is the standard CometBFT JSON-RPC — the same surface you'd use for &lt;a href="https://swiftnodes.io/blog/osmosis-rpc-cosmos-dex" rel="noopener noreferrer"&gt;Osmosis&lt;/a&gt;, &lt;a href="https://swiftnodes.io/blog/injective-rpc-orderbook-l1" rel="noopener noreferrer"&gt;Injective&lt;/a&gt;, or Celestia. No &lt;code&gt;eth_*&lt;/code&gt;, no EVM. The chain ID is the string &lt;code&gt;akashnet-2&lt;/code&gt;, not a numeric EVM ID.&lt;/p&gt;

&lt;p&gt;SwiftNodes serves the CometBFT JSON-RPC endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Node status&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://rpc.swiftnodes.io/rpc/akash?key&lt;span class="o"&gt;=&lt;/span&gt;YOUR_API_KEY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"status","params":[],"id":1}'&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; {"result":{"node_info":{"network":"akashnet-2",...},"sync_info":{"latest_block_height":"28455984",...}}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The core methods you'll use:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;What it gives you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Node info, latest block height, sync state, network ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;block&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A block by height — header, transactions, last commit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;block_results&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Transaction results and events for a block&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;commit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Signed header with validator signatures (84 signers on recent blocks)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;broadcast_tx_sync&lt;/code&gt; / &lt;code&gt;_commit&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Submit a signed transaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Look up a transaction by hash&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are the consensus-layer queries — reading blocks, monitoring chain activity, broadcasting transactions. They work the same way across every Cosmos chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the special part lives: Akash modules
&lt;/h2&gt;

&lt;p&gt;Here's where Akash diverges from a plain Cosmos chain. The marketplace state — deployments, bids, leases, providers — lives in Akash-specific protobuf modules. You query these through &lt;code&gt;abci_query&lt;/code&gt; with the module's gRPC query path:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Query path&lt;/th&gt;
&lt;th&gt;What it reads&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/akash.deployment.v1beta3.Query/Deployments&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Active deployments by owner&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/akash.market.v1beta4.Query/Orders&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Orders (resource requests) for a deployment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/akash.market.v1beta4.Query/Bids&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Provider bids for an order&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/akash.market.v1beta4.Query/Leases&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Active leases (accepted bids)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/akash.provider.v1beta3.Query/Providers&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Registered compute providers&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The &lt;code&gt;abci_query&lt;/code&gt; method takes four parameters: the query path, hex-encoded protobuf request data, a block height (0 = latest), and a prove flag. The protobuf encoding is the tricky part — you typically generate the request bytes from a Cosmos SDK client library rather than hand-crafting them. If you're using &lt;code&gt;akash-cli&lt;/code&gt; or a Cosmos SDK integration, the module queries are wrapped for you.&lt;/p&gt;

&lt;p&gt;The practical split:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Consensus RPC (CometBFT)&lt;/strong&gt; — reading blocks, monitoring the chain, broadcasting standard transactions. This is what a flat-rate RPC endpoint gives you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Module queries (abci_query)&lt;/strong&gt; — reading marketplace state (deployments, bids, leases, providers). Requires protobuf-encoded request data.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Workload management&lt;/strong&gt; — actually deploying containers, accepting bids, managing leases. This happens through the Akash Console or CLI, which wraps the module transactions.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building a dashboard that tracks active deployments, monitors provider capacity, or indexes lease pricing data, you need the CometBFT RPC for chain state plus &lt;code&gt;abci_query&lt;/code&gt; for the marketplace modules. If you're deploying workloads, you'll use the Akash CLI or Console on top.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finality and block structure
&lt;/h2&gt;

&lt;p&gt;Akash has &lt;strong&gt;single-block deterministic finality&lt;/strong&gt; via CometBFT BFT consensus — once a block is committed by the validator set, it's final. No reorgs, no probabilistic confirmation waits. Recent blocks carry ~84 validator signatures in the commit, and blocks contain a handful of transactions (9 txs in a typical recent block at height 28,455,980).&lt;/p&gt;

&lt;p&gt;For an indexer, this means you can trust a committed block immediately. Read blocks via &lt;code&gt;block&lt;/code&gt;, transaction results via &lt;code&gt;block_results&lt;/code&gt;, and the validator commit via &lt;code&gt;commit&lt;/code&gt;. The same &lt;a href="https://swiftnodes.io/blog/handling-chain-reorgs-indexer" rel="noopener noreferrer"&gt;reorg-handling patterns&lt;/a&gt; you'd build for probabilistic chains like Ethereum don't apply here — once it's committed, it's done.&lt;/p&gt;

&lt;h2&gt;
  
  
  How this compares to other Cosmos chains
&lt;/h2&gt;

&lt;p&gt;Akash shares the CometBFT RPC surface with every other Cosmos chain, but the application layer is where it diverges. &lt;a href="https://swiftnodes.io/blog/injective-rpc-orderbook-l1" rel="noopener noreferrer"&gt;Injective&lt;/a&gt; puts an orderbook in a module. &lt;a href="https://swiftnodes.io/blog/osmosis-rpc-cosmos-dex" rel="noopener noreferrer"&gt;Osmosis&lt;/a&gt; puts a DEX in modules. Akash puts a compute marketplace in modules. The pattern is the same — Cosmos SDK modules extend the base chain with application-specific state — but the domain is different each time.&lt;/p&gt;

&lt;p&gt;The difference from &lt;a href="https://swiftnodes.io/blog/celestia-rpc-modular-da" rel="noopener noreferrer"&gt;Celestia&lt;/a&gt; is architectural: Celestia is a data availability layer (its special part is blob posting, which happens through a separate node API, not the core RPC). Akash's marketplace state is fully queryable through the standard CometBFT RPC via &lt;code&gt;abci_query&lt;/code&gt; — there's no separate "Akash node API" you need to run.&lt;/p&gt;

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

&lt;p&gt;Akash is a &lt;strong&gt;decentralized compute marketplace&lt;/strong&gt; built on the Cosmos SDK. Its RPC is &lt;strong&gt;CometBFT JSON-RPC&lt;/strong&gt; — the same surface as every other Cosmos chain. Use &lt;code&gt;status&lt;/code&gt;, &lt;code&gt;block&lt;/code&gt;, &lt;code&gt;block_results&lt;/code&gt;, and &lt;code&gt;commit&lt;/code&gt; to read chain state. Use &lt;code&gt;abci_query&lt;/code&gt; with Akash-specific module paths (&lt;code&gt;akash.deployment&lt;/code&gt;, &lt;code&gt;akash.market&lt;/code&gt;, &lt;code&gt;akash.provider&lt;/code&gt;) to read marketplace state: deployments, bids, leases, and provider registrations. The workloads themselves run off-chain in Kubernetes. It has single-block BFT finality, ~6-second blocks, and the AKT token (6 decimals).&lt;/p&gt;

&lt;p&gt;For monitoring Akash chain activity, tracking marketplace state, or broadcasting transactions, you need a reliable CometBFT endpoint. A flat-rate &lt;a href="https://swiftnodes.io/akash-rpc" rel="noopener noreferrer"&gt;Akash RPC endpoint&lt;/a&gt; gives you that across load-balanced nodes, alongside 74 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 app 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/akash?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/akash-rpc" 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>Axelar RPC: Connecting to the Cross-Chain Messaging Layer</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Wed, 02 Sep 2026 06:19:51 +0000</pubDate>
      <link>https://dev.to/swiftnodes/axelar-rpc-connecting-to-the-cross-chain-messaging-layer-34lm</link>
      <guid>https://dev.to/swiftnodes/axelar-rpc-connecting-to-the-cross-chain-messaging-layer-34lm</guid>
      <description>&lt;p&gt;Axelar is one of the major cross-chain interoperability networks, and it's easy to misunderstand if you arrive expecting an EVM chain — because it isn't one. Axelar is a &lt;strong&gt;Cosmos SDK proof-of-stake network whose whole job is connecting other blockchains&lt;/strong&gt;: moving tokens and arbitrary messages between them. Once you understand that, its RPC makes sense. Here's the map.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Axelar actually does
&lt;/h2&gt;

&lt;p&gt;Most blockchains are islands. Axelar's purpose is to be the &lt;strong&gt;communication layer between them&lt;/strong&gt;, built around two primitives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cross-chain token bridging:&lt;/strong&gt; move a token from one connected chain to another. Axelar locks or burns on the source, mints or releases on the destination, coordinated by its validator set.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;General Message Passing (GMP):&lt;/strong&gt; a contract on one chain calls a function on a contract on &lt;em&gt;another&lt;/em&gt; chain, passing arbitrary data along with it. This is what makes cross-chain &lt;em&gt;applications&lt;/em&gt; possible, not just token transfers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The mechanics: Axelar's validators run light clients of the connected chains and watch for events. When something happens on a source chain, the validators collectively attest to it using &lt;strong&gt;threshold signatures&lt;/strong&gt;, and that attestation authorizes the corresponding action on the destination chain. Axelar launched mainnet in &lt;strong&gt;February 2022&lt;/strong&gt;, is built with the &lt;strong&gt;Cosmos SDK + CometBFT (Tendermint)&lt;/strong&gt; consensus, uses the &lt;strong&gt;AXL&lt;/strong&gt; token (6 decimals) for staking, fees, and governance, and produces &lt;strong&gt;~6-second blocks&lt;/strong&gt; with single-block deterministic finality.&lt;/p&gt;

&lt;h2&gt;
  
  
  The RPC reality: it's a Cosmos chain, not an EVM one
&lt;/h2&gt;

&lt;p&gt;Because Axelar is a Cosmos SDK chain, you don't talk to it with &lt;code&gt;eth_*&lt;/code&gt; — those methods don't exist here. You use the &lt;strong&gt;CometBFT (Tendermint) RPC&lt;/strong&gt;, the same consensus-layer RPC every Cosmos chain exposes. SwiftNodes serves this endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Node + sync status (CometBFT RPC)&lt;/span&gt;
curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://rpc.swiftnodes.io/rpc/axelar?key&lt;span class="o"&gt;=&lt;/span&gt;YOUR_API_KEY &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"jsonrpc":"2.0","method":"status","params":[],"id":1}'&lt;/span&gt;
&lt;span class="c"&gt;# -&amp;gt; {"result":{"node_info":{...},"sync_info":{"latest_block_height":"...",...}}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The CometBFT RPC methods you'll actually use:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;What it gives you&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Node info + latest block height + sync state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;block&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A block by height (params: &lt;code&gt;["height"]&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;block_results&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tx results + events for a block&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;abci_query&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Query application state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;broadcast_tx_sync&lt;/code&gt; / &lt;code&gt;_commit&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Submit a signed transaction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tx&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Look up a transaction by hash&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you're new to the Cosmos RPC stack — how Tendermint RPC relates to the REST (LCD) and gRPC interfaces — we cover the whole thing in our &lt;a href="https://swiftnodes.io/blog/cosmos-rpc-explained" rel="noopener noreferrer"&gt;Cosmos RPC explainer&lt;/a&gt;. The same surface applies across &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 the rest of the Cosmos family.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the special part lives: GMP and cross-chain messages
&lt;/h2&gt;

&lt;p&gt;The thing that makes Axelar &lt;em&gt;Axelar&lt;/em&gt; — the actual cross-chain messaging — doesn't happen over a special RPC method. It's driven by &lt;strong&gt;smart contracts on the connected chains&lt;/strong&gt; calling into Axelar's gateway contracts, with Axelar's validators relaying and attesting the messages between them. From your RPC's point of view, cross-chain activity shows up as ordinary Axelar transactions and events you read with &lt;code&gt;block_results&lt;/code&gt; / &lt;code&gt;abci_query&lt;/code&gt; — the cross-chain magic is coordinated by the validator set, not exposed as a bespoke endpoint.&lt;/p&gt;

&lt;p&gt;The practical split for a developer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;To read or index Axelar itself&lt;/strong&gt; — track GMP message status, watch validator attestations, monitor bridging activity — use the CometBFT RPC. That's what a flat-rate endpoint like SwiftNodes gives you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;To &lt;em&gt;initiate&lt;/em&gt; a cross-chain call&lt;/strong&gt; — you interact with Axelar's gateway contract &lt;em&gt;on your source chain&lt;/em&gt; (e.g. an EVM chain), using its SDKs. Axelar's own RPC is where you &lt;em&gt;observe&lt;/em&gt; and &lt;em&gt;verify&lt;/em&gt; the result.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Finality and reading the chain
&lt;/h2&gt;

&lt;p&gt;Axelar has &lt;strong&gt;single-block deterministic finality&lt;/strong&gt; via CometBFT — once a block is committed by the validator set, it's final, no reorgs. One nuance for cross-chain builders: &lt;em&gt;delivery&lt;/em&gt; on the destination chain also depends on that chain's own finality, so an end-to-end GMP call is only as final as both ends. For indexing Axelar itself, though, you can trust a committed block immediately — no probabilistic confirmation waits, minimal &lt;a href="https://swiftnodes.io/blog/handling-chain-reorgs-indexer" rel="noopener noreferrer"&gt;reorg handling&lt;/a&gt;. Read blocks and results via &lt;code&gt;block&lt;/code&gt; / &lt;code&gt;block_results&lt;/code&gt;, and query state via &lt;code&gt;abci_query&lt;/code&gt;.&lt;/p&gt;

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

&lt;p&gt;Axelar is a &lt;strong&gt;cross-chain interoperability network&lt;/strong&gt;, not an EVM chain — so its RPC is &lt;strong&gt;Cosmos CometBFT (Tendermint) RPC&lt;/strong&gt;, not &lt;code&gt;eth_*&lt;/code&gt;. Use &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;abci_query&lt;/code&gt;, and &lt;code&gt;broadcast_tx_*&lt;/code&gt; to read state and broadcast transactions. The cross-chain part — token bridging and &lt;strong&gt;General Message Passing&lt;/strong&gt; — is coordinated by Axelar's validator set via threshold-signed attestations; you &lt;em&gt;initiate&lt;/em&gt; cross-chain calls from your source chain's gateway contract and &lt;em&gt;observe&lt;/em&gt; them on Axelar. Single-block BFT finality means reads are deterministic.&lt;/p&gt;

&lt;p&gt;For reading Axelar, tracking GMP activity, and broadcasting transactions, you need a reliable CometBFT endpoint. A flat-rate &lt;a href="https://swiftnodes.io/axelar-rpc" rel="noopener noreferrer"&gt;Axelar RPC endpoint&lt;/a&gt; gives you that across load-balanced nodes, alongside dozens of 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 app 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/axelar?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/axelar-rpc-cross-chain-messaging" 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>Boba Network RPC: Chain ID 288 and the Hybrid-Compute Rollup</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Tue, 01 Sep 2026 05:18:23 +0000</pubDate>
      <link>https://dev.to/swiftnodes/boba-network-rpc-chain-id-288-and-the-hybrid-compute-rollup-2k9n</link>
      <guid>https://dev.to/swiftnodes/boba-network-rpc-chain-id-288-and-the-hybrid-compute-rollup-2k9n</guid>
      <description>&lt;p&gt;Most rollups optimize one thing: cost. Boba Network tried to optimize the programming model too. Launched in 2021 as an EVM-compatible optimistic rollup on Ethereum, &lt;strong&gt;Boba (chain ID 288)&lt;/strong&gt; is best known for &lt;strong&gt;Hybrid Compute&lt;/strong&gt; — smart contracts that can trigger off-chain computation and external API calls during execution. This guide covers what you need to build on it: the chain ID, a working mainnet RPC endpoint, live fee behavior, and the usual fork-over habits.&lt;/p&gt;

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

&lt;p&gt;Boba's Ethereum L2 is &lt;strong&gt;chain ID 288&lt;/strong&gt;, with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ETH as the gas token&lt;/strong&gt; (the BOBA token exists as the network's governance and utility asset — not the gas currency).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blocks that follow transaction flow&lt;/strong&gt; — sampled live while writing this: roughly one block every ~2 seconds, with the head past 38.5M.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimistic-rollup security&lt;/strong&gt;: fast L2 confirmations, with withdrawals to Ethereum following the ~7-day challenge window.&lt;/li&gt;
&lt;li&gt;A standard EVM surface — Solidity, viem, ethers, Foundry, and the usual &lt;code&gt;eth_*&lt;/code&gt; methods.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A working config with our 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;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;boba&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;288&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;Boba Network&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/boba?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;boba&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;
  
  
  Hybrid Compute, from the RPC seat
&lt;/h2&gt;

&lt;p&gt;The headline feature: Boba contracts can invoke &lt;strong&gt;off-chain compute and external APIs within a transaction&lt;/strong&gt; — the network's Hybrid Compute framework routes those calls (including AI and Web2 data sources) and folds the results back into execution. It's a chain-level capability rather than an RPC extension, so from where you sit the interface stays boring in the best way:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Standard &lt;code&gt;eth_call&lt;/code&gt; / &lt;code&gt;eth_estimateGas&lt;/code&gt; / &lt;code&gt;eth_sendRawTransaction&lt;/code&gt; semantics apply.&lt;/li&gt;
&lt;li&gt;Hybrid-Compute transactions arrive through the same mempool and block flow as everything else — receipts and logs read identically.&lt;/li&gt;
&lt;li&gt;Indexers and dashboards need no special decoding just to &lt;em&gt;follow&lt;/em&gt; the chain; the exotic part is what contracts choose to do with the capability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Historically Boba shipped alongside the OMG Foundation era (BOBA was airdropped to bridged OMG holders at launch), and the network also runs deployments on other base chains such as BNB Smart Chain — chain 288 is specifically the Ethereum L2, and the one SwiftNodes serves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fees: milligwei country
&lt;/h2&gt;

&lt;p&gt;Boba's fee numbers look like a formatting bug until you accept them. Sampled live through our endpoint while writing this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;eth_gasPrice&lt;/code&gt;: ~0.001 gwei.&lt;/strong&gt; The base fee sat several orders of magnitude below that (sub-microgwei).&lt;/li&gt;
&lt;li&gt;A 21,000-gas transfer therefore costs on the order of &lt;strong&gt;0.00002 ETH&lt;/strong&gt; — deep sub-cent territory.&lt;/li&gt;
&lt;li&gt;The sampled block was nearly empty (one transaction, ~44k gas used), which is normal for a rollup whose block production tracks demand.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Estimation flows work unchanged — &lt;code&gt;eth_estimateGas&lt;/code&gt; and the EIP-1559 fields behave like any EVM chain (&lt;a href="https://swiftnodes.io/blog/estimating-gas-eth-estimategas-eip-1559" rel="noopener noreferrer"&gt;gas estimation basics&lt;/a&gt; apply as-is). Budget for dust, buffer as usual.&lt;/p&gt;

&lt;h2&gt;
  
  
  What carries over — and what to verify
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Standard reads and writes — &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;a href="https://swiftnodes.io/blog/reading-transaction-receipts-eth-gettransactionreceipt" rel="noopener noreferrer"&gt;receipt semantics&lt;/a&gt; unchanged), &lt;code&gt;eth_sendRawTransaction&lt;/code&gt;, &lt;code&gt;eth_subscribe&lt;/code&gt; — all behave as on any EVM chain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Archive access works&lt;/strong&gt;: our block-1 state probe was answered normally, so historical queries route fine — on SwiftNodes that's &lt;a href="https://swiftnodes.io/docs/api-reference#archive" rel="noopener noreferrer"&gt;&lt;code&gt;&amp;amp;archive=1&lt;/code&gt;&lt;/a&gt; on paid plans.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extension methods, verify per-method&lt;/strong&gt;: traces and debug vary by upstream everywhere, Boba included — our &lt;a href="https://swiftnodes.io/docs/method-support" rel="noopener noreferrer"&gt;weekly auto-probed matrix&lt;/a&gt; covers it, with the &lt;a href="https://swiftnodes.io/blog/json-rpc-error-codes-decoded" rel="noopener noreferrer"&gt;error-code reference&lt;/a&gt; for the responses you'll meet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebSocket subscriptions&lt;/strong&gt; fit well at this cadence (&lt;a href="https://swiftnodes.io/blog/websocket-reconnect-without-losing-events" rel="noopener noreferrer"&gt;reconnection habits&lt;/a&gt; transfer directly).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Boba Network is chain ID &lt;strong&gt;288&lt;/strong&gt;: an EVM optimistic rollup on Ethereum with ETH gas, demand-driven blocks around 2-second pace, and fees in milligwei territory. Its signature feature — Hybrid Compute, letting contracts call off-chain compute and APIs mid-execution — leaves the RPC surface standard, so Ethereum tooling carries over as-is. Verify extension-method support per-method rather than assuming, and treat the 7-day withdrawal window as the trust horizon back to Ethereum.&lt;/p&gt;

&lt;p&gt;Building on Boba? A flat-rate &lt;a href="https://swiftnodes.io/boba-rpc" rel="noopener noreferrer"&gt;Boba Network RPC endpoint&lt;/a&gt; serves chain 288 over HTTP and WebSocket, load-balanced across upstreams, alongside 75+ other chains under the same 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/boba?key=YOUR_API_KEY
wss://rpc.swiftnodes.io/ws/boba?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/boba-rpc-hybrid-compute-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>
    <item>
      <title>PulseChain RPC: Chain ID 369 and the Full-State Ethereum Fork</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Mon, 31 Aug 2026 07:18:59 +0000</pubDate>
      <link>https://dev.to/swiftnodes/pulsechain-rpc-chain-id-369-and-the-full-state-ethereum-fork-3635</link>
      <guid>https://dev.to/swiftnodes/pulsechain-rpc-chain-id-369-and-the-full-state-ethereum-fork-3635</guid>
      <description>&lt;p&gt;Most chains start from an empty genesis. PulseChain started from a copy of Ethereum. Launched May 13, 2023, &lt;strong&gt;PulseChain (chain ID 369)&lt;/strong&gt; is an EVM-compatible Layer 1 built as a &lt;em&gt;full-state fork&lt;/em&gt; of Ethereum — accounts, token balances, contracts, and NFTs snapshotted onto a new network with its own gas token and faster blocks. That origin story is also where most developer confusion lives, so this guide covers the essentials: the chain ID, a working mainnet RPC endpoint, and exactly what the fork means for your tooling.&lt;/p&gt;

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

&lt;p&gt;PulseChain mainnet is &lt;strong&gt;chain ID 369&lt;/strong&gt;, with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PLS as the gas token&lt;/strong&gt; — not ETH. Budgeting, fee math, and balance displays need the native currency set correctly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~10-second blocks&lt;/strong&gt; (we sampled live while writing this: a block every few seconds, head past 27.4M).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proof-of-stake validation&lt;/strong&gt; with epoch-based finality.&lt;/li&gt;
&lt;li&gt;A standard EVM surface — Solidity, viem, ethers, Foundry, and the usual &lt;code&gt;eth_*&lt;/code&gt; methods all apply.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A working config with our 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;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;pulsechain&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;369&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;PulseChain&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;Pulse&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;PLS&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/pulsechain?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;pulsechain&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;For MetaMask, the same facts: network name PulseChain, RPC URL as above, &lt;strong&gt;chain ID 369&lt;/strong&gt;, currency symbol &lt;strong&gt;PLS&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  A fork of the state, not just the code
&lt;/h2&gt;

&lt;p&gt;This is the part that trips people up. PulseChain didn't just copy Ethereum's software — it copied Ethereum's &lt;em&gt;state&lt;/em&gt; at the May 2023 snapshot. Consequences worth knowing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Contracts live at the same addresses as on Ethereum&lt;/strong&gt; at snapshot time. A token contract you knew on Ethereum mainnet exists at the identical address on PulseChain — but it is a &lt;em&gt;separate asset on a separate chain&lt;/em&gt;. The copies are referred to as PRC-20 tokens (the ERC-20 equivalent). Same address, different chain, different supply dynamics.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chain ID 369 is the replay boundary.&lt;/strong&gt; Transactions are signed with the chain ID, so nothing replays between Ethereum (1) and PulseChain (369) — but wallet and indexer code that hardcodes chain 1 or derives addresses assuming ETH balances needs updating.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The snapshot is frozen in time.&lt;/strong&gt; PulseChain's copied state reflects Ethereum as of May 2023. Anything that happened on Ethereum since — new deployments, balance changes, upgrades — is not mirrored. Treat the two as fully independent chains that happen to share historical addresses.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The ecosystem itself is anchored by PulseX, the network's primary DEX, alongside HEX and other community projects that came across at the snapshot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fees: big gwei numbers, tiny bills
&lt;/h2&gt;

&lt;p&gt;PulseChain runs EIP-1559-style fees, and the numbers look startling until you remember the unit is PLS. Sampled live through our endpoint while writing this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Base fee: ~892,000 gwei — which is ~0.0009 PLS per gas.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;A simple 21,000-gas transfer therefore costs roughly &lt;strong&gt;19 PLS&lt;/strong&gt; — a fraction of a cent.&lt;/li&gt;
&lt;li&gt;The sampled block carried 25 transactions, and &lt;code&gt;eth_gasPrice&lt;/code&gt; returned the combined price as usual.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All the standard estimation flows work unchanged: &lt;code&gt;eth_estimateGas&lt;/code&gt;, &lt;code&gt;eth_gasPrice&lt;/code&gt;, and the EIP-1559 fields behave like any EVM chain (&lt;a href="https://swiftnodes.io/blog/estimating-gas-eth-estimategas-eip-1559" rel="noopener noreferrer"&gt;gas estimation basics&lt;/a&gt; apply as-is). If your dashboard shows "huge" fees on PulseChain, check the display currency before alarming anyone.&lt;/p&gt;

&lt;h2&gt;
  
  
  What carries over — and what to verify
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Standard reads and writes — &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;a href="https://swiftnodes.io/blog/reading-transaction-receipts-eth-gettransactionreceipt" rel="noopener noreferrer"&gt;receipt semantics&lt;/a&gt; unchanged), &lt;code&gt;eth_sendRawTransaction&lt;/code&gt;, &lt;code&gt;eth_subscribe&lt;/code&gt; — all behave as on any EVM chain.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Archive access works&lt;/strong&gt;: our probe against block 1 returned state normally, so historical queries route fine — on SwiftNodes that's &lt;a href="https://swiftnodes.io/docs/api-reference#archive" rel="noopener noreferrer"&gt;&lt;code&gt;&amp;amp;archive=1&lt;/code&gt;&lt;/a&gt; on paid plans.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Method support beyond the basics, verify per-method&lt;/strong&gt;: extension methods (traces, debug) vary by upstream everywhere, PulseChain included — our &lt;a href="https://swiftnodes.io/docs/method-support" rel="noopener noreferrer"&gt;weekly auto-probed matrix&lt;/a&gt; covers it, with &lt;a href="https://swiftnodes.io/blog/json-rpc-error-codes-decoded" rel="noopener noreferrer"&gt;error-code reference&lt;/a&gt; for the responses you'll see.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WebSocket subscriptions&lt;/strong&gt; are the right pattern at this block cadence (&lt;a href="https://swiftnodes.io/blog/websocket-reconnect-without-losing-events" rel="noopener noreferrer"&gt;reconnection habits&lt;/a&gt; transfer directly).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;PulseChain is chain ID &lt;strong&gt;369&lt;/strong&gt;: an EVM-compatible, full-state fork of Ethereum with PLS gas, ~10-second blocks, and EIP-1559 fees that look large in gwei but cost fractions of a cent. The fork means Ethereum contract addresses exist at the same locations (as separate PRC-20 assets), the snapshot state is frozen at May 2023, and chain ID 369 is your replay boundary. Everything else is standard EVM — with method support worth checking per-method rather than assuming.&lt;/p&gt;

&lt;p&gt;Building on chain 369? A flat-rate &lt;a href="https://swiftnodes.io/pulsechain-rpc" rel="noopener noreferrer"&gt;PulseChain RPC endpoint&lt;/a&gt; serves the network over HTTP and WebSocket, load-balanced across upstreams, alongside 75+ other chains under the same 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/pulsechain?key=YOUR_API_KEY
wss://rpc.swiftnodes.io/ws/pulsechain?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/pulsechain-rpc-ethereum-state-fork" 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>Optimism RPC: The Chain That Became a Template</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Sun, 30 Aug 2026 05:35:50 +0000</pubDate>
      <link>https://dev.to/swiftnodes/optimism-rpc-the-chain-that-became-a-template-3j53</link>
      <guid>https://dev.to/swiftnodes/optimism-rpc-the-chain-that-became-a-template-3j53</guid>
      <description>&lt;p&gt;Most layer-2s are chains. Optimism is a chain &lt;em&gt;and&lt;/em&gt; a template. OP Mainnet (chain ID &lt;strong&gt;10&lt;/strong&gt;, public mainnet since December 2021) is one of the oldest and most battle-tested optimistic rollups — and its codebase, the &lt;strong&gt;OP Stack&lt;/strong&gt;, is what &lt;a href="https://swiftnodes.io/blog/base-rpc-buyers-guide" rel="noopener noreferrer"&gt;Base&lt;/a&gt;, &lt;a href="https://swiftnodes.io/blog/zora-rpc-op-stack-creators" rel="noopener noreferrer"&gt;Zora&lt;/a&gt;, opBNB, Unichain, and Soneium are built on. The practical consequence for developers: what you learn building against Optimism's RPC transfers across the whole family. Here's the map.&lt;/p&gt;

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

&lt;p&gt;Optimism mainnet is &lt;strong&gt;chain ID 10&lt;/strong&gt;, an optimistic rollup on Ethereum with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ETH as the gas token&lt;/strong&gt; — no new native asset to hold for fees.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;2-second blocks&lt;/strong&gt; (verified live while writing this), with transactions ordered by a &lt;strong&gt;sequencer&lt;/strong&gt; that gives you instant soft confirmations; hard finality follows Ethereum's. The sequencer is operated by OP Labs today, with decentralization an explicit roadmap item.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fault proofs live since June 2024&lt;/strong&gt; — the optimistic-rollup dispute mechanism that lets anyone challenge an invalid state claim on Ethereum, rather than trusting an upgrade delay alone.&lt;/li&gt;
&lt;li&gt;A standard EVM execution environment — Solidity, viem, ethers, Foundry, and the usual &lt;code&gt;eth_*&lt;/code&gt; surface apply directly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Connecting is boilerplate:&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;optimism&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;10&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;OP Mainnet&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/optimism?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;optimism&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;
  
  
  Fees are two layers — and estimation already knows
&lt;/h2&gt;

&lt;p&gt;This is the one place Optimism differs from Ethereum in a way you'll notice. Every transaction pays two components:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;An execution fee&lt;/strong&gt; — ordinary EIP-1559 gas for running your transaction on the rollup. This part is minuscule: the base fee we sampled this morning was &lt;strong&gt;~0.000001 gwei&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An L1 data fee&lt;/strong&gt; — the cost of posting your transaction's data to Ethereum (as blobs, since the 2024 upgrades). For calldata-heavy transactions, this component dominates.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The good news: you don't compute either by hand. &lt;code&gt;eth_estimateGas&lt;/code&gt; returns an &lt;strong&gt;all-in figure&lt;/strong&gt; — if the number looks larger than a naive 21,000-plus-calldata guess, that's the L1 data fee folded in at current prices, by design. &lt;code&gt;eth_gasPrice&lt;/code&gt; likewise returns a combined price. Normal estimation flows with your usual buffer work unchanged (&lt;a href="https://swiftnodes.io/blog/estimating-gas-eth-estimategas-eip-1559" rel="noopener noreferrer"&gt;gas estimation basics&lt;/a&gt; apply as-is).&lt;/p&gt;

&lt;h2&gt;
  
  
  The OP Stack: skills that carry
&lt;/h2&gt;

&lt;p&gt;Because the same codebase runs the family, an integration built for OP Mainnet is mostly configuration when it moves sideways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Same RPC surface&lt;/strong&gt; — 2-second blocks, the same two-layer fee shape, optimistic-rollup semantics with each chain's own sequencer and proof setup.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same tooling story&lt;/strong&gt; — viem/ethers chain definitions differ per network, but your indexer logic, subscription patterns, and receipt handling don't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Same operational habits&lt;/strong&gt; — WebSocket subscriptions over polling at 2-second cadence (&lt;a href="https://swiftnodes.io/blog/arbitrum-websocket-gotchas" rel="noopener noreferrer"&gt;reorg and reconnection habits&lt;/a&gt; transfer), &lt;a href="https://swiftnodes.io/blog/eth-getlogs-range-caps" rel="noopener noreferrer"&gt;log range discipline&lt;/a&gt; unchanged.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;SwiftNodes serves the family under one key — &lt;a href="https://swiftnodes.io/optimism-rpc" rel="noopener noreferrer"&gt;Optimism&lt;/a&gt;, &lt;a href="https://swiftnodes.io/base-rpc" rel="noopener noreferrer"&gt;Base&lt;/a&gt;, &lt;a href="https://swiftnodes.io/zora-rpc" rel="noopener noreferrer"&gt;Zora&lt;/a&gt;, &lt;a href="https://swiftnodes.io/opbnb-rpc" rel="noopener noreferrer"&gt;opBNB&lt;/a&gt;, &lt;a href="https://swiftnodes.io/unichain-rpc" rel="noopener noreferrer"&gt;Unichain&lt;/a&gt;, and &lt;a href="https://swiftnodes.io/soneium-rpc" rel="noopener noreferrer"&gt;Soneium&lt;/a&gt; — so a multi-chain product can treat the OP Stack family as one integration target with per-chain endpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one rough edge: traces are uneven
&lt;/h2&gt;

&lt;p&gt;If there's a caveat on Optimism, it's the Parity trace namespace. The OP Stack's standard surface doesn't include &lt;code&gt;trace_*&lt;/code&gt; methods, and where traces do appear they're often gated upstream — probing OP Mainnet through our routing this morning, archive-flavored queries returned provider gate messages rather than data. The honest pattern: &lt;strong&gt;check per-method, per-chain, and re-check&lt;/strong&gt; — support genuinely varies by upstream mix. Our &lt;a href="https://swiftnodes.io/docs/method-support" rel="noopener noreferrer"&gt;weekly auto-probed matrix&lt;/a&gt; does exactly that, with per-method detail pages like &lt;a href="https://swiftnodes.io/docs/methods/trace_filter" rel="noopener noreferrer"&gt;trace_filter&lt;/a&gt; and &lt;a href="https://swiftnodes.io/docs/methods/trace_transaction" rel="noopener noreferrer"&gt;trace_transaction&lt;/a&gt; (and the longer treatment in our &lt;a href="https://swiftnodes.io/blog/trace-filter-trace-transaction-internal-calls" rel="noopener noreferrer"&gt;trace field guide&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Everything else is the standard EVM you expect: &lt;a href="https://swiftnodes.io/blog/reading-transaction-receipts-eth-gettransactionreceipt" rel="noopener noreferrer"&gt;receipts&lt;/a&gt;, logs, subscriptions, and the usual &lt;a href="https://swiftnodes.io/blog/json-rpc-error-codes-decoded" rel="noopener noreferrer"&gt;error-code taxonomy&lt;/a&gt; when something rejects. Historical state (balances and receipts at old blocks) needs archive routing — on SwiftNodes that's &lt;a href="https://swiftnodes.io/docs/api-reference#archive" rel="noopener noreferrer"&gt;&lt;code&gt;&amp;amp;archive=1&lt;/code&gt;&lt;/a&gt; on paid plans.&lt;/p&gt;

&lt;h2&gt;
  
  
  What carries over unchanged
&lt;/h2&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 standard behavior.&lt;/li&gt;
&lt;li&gt;EIP-1559 fields and estimation flows (all-in numbers, buffer as usual).&lt;/li&gt;
&lt;li&gt;Solidity bytecode deploys as-is; the toolchain is untouched.&lt;/li&gt;
&lt;li&gt;WebSocket subscriptions are the right default at 2-second blocks.&lt;/li&gt;
&lt;li&gt;Cross-check method support in the live matrix rather than a feature table — especially for traces and debug methods.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Optimism (chain ID 10) is a mature optimistic rollup — ETH gas, 2-second blocks, fault proofs live since 2024 — and the origin of the OP Stack that powers Base, Zora, opBNB, Unichain, and Soneium. Fees come in two layers (a tiny execution base fee plus the L1 data fee), but &lt;code&gt;eth_estimateGas&lt;/code&gt; returns an all-in figure so normal estimation flows work unchanged. The one thing to verify rather than assume is trace/debug method support, which varies by upstream. Everything else is standard EVM — and every skill transfers sideways across the Superchain family.&lt;/p&gt;

&lt;p&gt;Shipping on OP Mainnet or its siblings? A flat-rate &lt;a href="https://swiftnodes.io/optimism-rpc" rel="noopener noreferrer"&gt;Optimism RPC endpoint&lt;/a&gt; gives you chain 10 over HTTP and WebSocket, load-balanced across upstreams, with the rest of the OP Stack family — and 75+ chains total — under the same 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/optimism?key=YOUR_API_KEY
wss://rpc.swiftnodes.io/ws/optimism?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/optimism-rpc-the-chain-that-became-a-template" 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>trace_filter and trace_transaction: Reading What Receipts Can't Show</title>
      <dc:creator>SwiftNodes</dc:creator>
      <pubDate>Sat, 29 Aug 2026 06:51:27 +0000</pubDate>
      <link>https://dev.to/swiftnodes/tracefilter-and-tracetransaction-reading-what-receipts-cant-show-49gp</link>
      <guid>https://dev.to/swiftnodes/tracefilter-and-tracetransaction-reading-what-receipts-cant-show-49gp</guid>
      <description>&lt;p&gt;A successful receipt tells you almost nothing about what a transaction actually did. The token moved, but through which contracts? The call succeeded, but which internal transfer carried the value? Logs record what contracts &lt;em&gt;chose&lt;/em&gt; to emit; everything between calls is invisible to &lt;code&gt;eth_getTransactionReceipt&lt;/code&gt;. The Parity trace namespace was built for exactly that gap, and two of its methods do most of the work: &lt;strong&gt;&lt;code&gt;trace_transaction&lt;/code&gt;&lt;/strong&gt; for a single transaction's full internal-call tree, and &lt;strong&gt;&lt;code&gt;trace_filter&lt;/code&gt;&lt;/strong&gt; for scanning ranges of blocks. We operate RPC across 75+ chains and probe trace support weekly (it's part of our &lt;a href="https://swiftnodes.io/docs/method-support" rel="noopener noreferrer"&gt;method-support matrix&lt;/a&gt;), so this comes with current availability data, not folklore.&lt;/p&gt;

&lt;h2&gt;
  
  
  trace_transaction: one transaction, fully unpacked
&lt;/h2&gt;

&lt;p&gt;Here's a real response for a fresh Sonic transaction, captured through our endpoint while writing this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;trace_transaction(&lt;/span&gt;&lt;span class="s2"&gt;"0xe3bb52bf…"&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;on&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Sonic&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;→&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"callType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"call"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x1fc056…"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xf87af5…"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"gas"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x10e78"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xe17e76e3…"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"blockNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;78366386&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"result"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"gasUsed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x1201d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"output"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x…0001"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"subtraces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"traceAddress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"transactionHash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xe3bb52bf…"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"transactionPosition"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"call"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each entry is one step of execution. The fields that matter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;action&lt;/code&gt;&lt;/strong&gt; — who called whom (&lt;code&gt;from&lt;/code&gt;/&lt;code&gt;to&lt;/code&gt;), with what &lt;code&gt;value&lt;/code&gt;, &lt;code&gt;callType&lt;/code&gt; (&lt;code&gt;call&lt;/code&gt;, &lt;code&gt;delegatecall&lt;/code&gt;, &lt;code&gt;staticcall&lt;/code&gt;), or for other &lt;code&gt;type&lt;/code&gt;s: &lt;code&gt;create&lt;/code&gt; (contract deployment) and &lt;code&gt;suicide&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;traceAddress&lt;/code&gt;&lt;/strong&gt; — this step's position in the call tree. &lt;code&gt;[]&lt;/code&gt; is the top-level call; &lt;code&gt;[2]&lt;/code&gt; is the third sub-call of the top level; &lt;code&gt;[2,0]&lt;/code&gt; is its first child. That array is how you reconstruct the whole tree.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;subtraces&lt;/code&gt;&lt;/strong&gt; — how many children this step spawned.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;result&lt;/code&gt;&lt;/strong&gt; — gas used and return data at this level, separately from the transaction-level receipt.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A DEX swap through a router, two pools, and a recipient ends up as a dozen or more of these entries — the exact path the value traveled. That reconstruction is what accounting tools, forensic dashboards, and internal-transfer indexers are actually built on. For the cost side of tracing (and why you should never loop these calls casually), see our earlier piece on &lt;a href="https://swiftnodes.io/blog/debug-tracetransaction-cost" rel="noopener noreferrer"&gt;&lt;code&gt;debug_traceTransaction&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  trace_filter: the indexer's range scan
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;trace_transaction&lt;/code&gt; answers "what did this hash do?" &lt;code&gt;trace_filter&lt;/code&gt; answers "what happened across these blocks?" — scans a block range and returns every trace matching your filter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;trace_filter&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;over&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;three&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;recent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Ethereum&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;blocks&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;→&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;276&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;traces&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;returned&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x835033…"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"callType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"call"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x933339…"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x214e8348c4f0000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.15&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ETH&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"input"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"gas"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x13498"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"blockNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25859102&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"subtraces"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"traceAddress"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"transactionHash"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0x49bcbd…"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"call"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The filter object accepts &lt;code&gt;fromBlock&lt;/code&gt;, &lt;code&gt;toBlock&lt;/code&gt;, plus optional &lt;code&gt;address&lt;/code&gt; and &lt;code&gt;topics&lt;/code&gt; constraints. Indexers use it the way Safe's Transaction Service does for non-L2 deployments — their infrastructure docs list the trace methods among the indexer's RPC requirements, with &lt;code&gt;trace_filter&lt;/code&gt; doing the discovery work. Note the volume in that sample: &lt;strong&gt;roughly 2,400 internal actions per Ethereum block&lt;/strong&gt;. That number explains everything in the next section.&lt;/p&gt;

&lt;h3&gt;
  
  
  The param gotcha we hit today
&lt;/h3&gt;

&lt;p&gt;Some implementations reject block tags in the filter and demand numeric blocks. The same query, &lt;code&gt;"fromBlock": "latest"&lt;/code&gt; versus &lt;code&gt;"0x18a9c1d"&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;-32602&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Invalid params"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"invalid value: string &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;latest&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;, expected a 8 byte hex string at line 1 column 21"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fetch &lt;code&gt;eth_blockNumber&lt;/code&gt; and pass hex numbers — it works everywhere the method works at all. &lt;code&gt;-32602&lt;/code&gt; here is good news, by the way: the method exists and parsed your request. That ambiguity between "fix your params" and "method missing" is the same taxonomy we covered in &lt;a href="https://swiftnodes.io/blog/json-rpc-error-codes-decoded" rel="noopener noreferrer"&gt;yesterday's error-code field guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where traces actually work in 2026
&lt;/h2&gt;

&lt;p&gt;The trace namespace comes from the Parity client lineage. Geth never implemented it, which means most L2s and geth-fork chains simply don't have it — and among chains whose software &lt;em&gt;could&lt;/em&gt; serve traces, providers frequently gate them because they're expensive. This week's probe across the 54 EVM chains we serve:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Chains serving it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;trace_filter&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;11 of 54&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;trace_transaction&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;11 of 54&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Both (full indexer suite)&lt;/td&gt;
&lt;td&gt;8 of 54 — Ethereum, Gnosis, Sonic, Berachain, Fraxtal, Plasma, PulseChain, Soneium&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;OP Stack chains and most zk chains return clean rejections — the namespace is gone there by design. And even where a chain supports tracing, the upstream provider can gate it. A real response from a Base request, via a popular public endpoint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"code"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;-32602&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Archive requests require a personal token. Get one at: https://www.allnodes.com/publicnode"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's policy, not capability — which is why per-chain claims need probing rather than reading someone's feature page. The live, re-probed breakdown is on our &lt;a href="https://swiftnodes.io/docs/methods/trace_filter" rel="noopener noreferrer"&gt;trace_filter&lt;/a&gt; and &lt;a href="https://swiftnodes.io/docs/methods/trace_transaction" rel="noopener noreferrer"&gt;trace_transaction&lt;/a&gt; pages, column-by-column for every chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working with traces in practice
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reconstructing internal transfers&lt;/strong&gt;: filter by &lt;code&gt;to&lt;/code&gt; or &lt;code&gt;from&lt;/code&gt; address over a block range, keep entries with &lt;code&gt;type: "call"&lt;/code&gt; and non-zero &lt;code&gt;value&lt;/code&gt; — that's the ETH that moved between contracts, invisible to receipt-based accounting.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Post-mortem debugging&lt;/strong&gt;: when a transaction "succeeded" but balances don't add up, &lt;code&gt;trace_transaction&lt;/code&gt; shows every internal hop. Pair with &lt;a href="https://swiftnodes.io/blog/eth-getproof-verify-state-merkle-proofs" rel="noopener noreferrer"&gt;state proofs&lt;/a&gt; when you need to verify, not just inspect.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Historical tracing requires archive access&lt;/strong&gt;: traces are state-dependent, so scanning old ranges routes through archive nodes — on SwiftNodes that's &lt;a href="https://swiftnodes.io/docs/api-reference#archive" rel="noopener noreferrer"&gt;&lt;code&gt;&amp;amp;archive=1&lt;/code&gt;&lt;/a&gt;, included on paid plans.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Respect the volume&lt;/strong&gt;: thousands of traces per block means wide filters are heavy. Narrow your block range, filter by address where you can, and cache aggressively. Same discipline as &lt;a href="https://swiftnodes.io/blog/eth-getlogs-range-caps" rel="noopener noreferrer"&gt;getLogs range caps&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Check any endpoint yourself
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;npx rpc-doctor &amp;lt;url&amp;gt;&lt;/code&gt; probes method support — including the trace pair — and reports what an endpoint actually serves, for any endpoint, yours or anyone's. It's &lt;a href="https://github.com/swiftnodes/rpc-doctor" rel="noopener noreferrer"&gt;open source&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And if you want traces where they exist and honest answers where they don't: our routing spreads load across upstreams that genuinely serve the namespace, and the &lt;a href="https://swiftnodes.io/docs/method-support" rel="noopener noreferrer"&gt;method-support matrix&lt;/a&gt; is re-probed weekly through the same path your requests take — &lt;a href="https://swiftnodes.io/" rel="noopener noreferrer"&gt;free tier included&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://swiftnodes.io/blog/trace-filter-trace-transaction-internal-calls" 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>
