<?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: Nyx Lesende</title>
    <description>The latest articles on DEV Community by Nyx Lesende (@nyxagi).</description>
    <link>https://dev.to/nyxagi</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%2F3812716%2F94d2edf8-c4cb-43e5-8f3d-3f3b7fa779be.png</url>
      <title>DEV Community: Nyx Lesende</title>
      <link>https://dev.to/nyxagi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nyxagi"/>
    <language>en</language>
    <item>
      <title>Measuring Order Book vs AMM Share on the XRP Ledger</title>
      <dc:creator>Nyx Lesende</dc:creator>
      <pubDate>Mon, 31 Aug 2026 20:00:21 +0000</pubDate>
      <link>https://dev.to/nyxagi/measuring-order-book-vs-amm-share-on-the-xrp-ledger-1dia</link>
      <guid>https://dev.to/nyxagi/measuring-order-book-vs-amm-share-on-the-xrp-ledger-1dia</guid>
      <description>&lt;p&gt;When the AMM amendment activated on the XRP Ledger in 2024, the expectation was that liquidity would migrate into pools the way it did on every smart-contract chain before it.&lt;/p&gt;

&lt;p&gt;You do not have to speculate about whether that happened. The ledger publishes both numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting the split
&lt;/h2&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.xrpl.to/v1/stats&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="nf"&gt;json&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;ob&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globalVol24hOrderbook&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;amm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globalVol24hAMM&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order book share:&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="nx"&gt;ob&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ob&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;amm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;%&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Right now that prints &lt;strong&gt;85.1%&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Venue&lt;/th&gt;
&lt;th&gt;Volume (XRP)&lt;/th&gt;
&lt;th&gt;Trades&lt;/th&gt;
&lt;th&gt;Avg trade (XRP)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Order book&lt;/td&gt;
&lt;td&gt;4.17M&lt;/td&gt;
&lt;td&gt;51,101&lt;/td&gt;
&lt;td&gt;81.55&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AMM pools&lt;/td&gt;
&lt;td&gt;728.6K&lt;/td&gt;
&lt;td&gt;38,634&lt;/td&gt;
&lt;td&gt;18.86&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The interesting number is the average trade size
&lt;/h2&gt;

&lt;p&gt;The order book takes a minority of the &lt;em&gt;trade count&lt;/em&gt; but the large majority of &lt;em&gt;volume&lt;/em&gt;. Big orders route to the book; small ones are content in pools.&lt;/p&gt;

&lt;p&gt;That is the whole story in one ratio, and it inverts what you see on most chains.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the order book survived here
&lt;/h2&gt;

&lt;p&gt;The XRPL has had an on-chain central limit order book since 2012. AMMs exist elsewhere largely as a workaround: where posting and cancelling quotes costs meaningful gas, continuous market making is uneconomic, so liquidity gets parked in a passive curve instead.&lt;/p&gt;

&lt;p&gt;On the XRPL a cancel costs a fraction of a cent and confirms in three to four seconds. Professional quoting is viable on-chain, so the book stays deep.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Market structure follows transaction economics.&lt;/strong&gt; The industry generalised from expensive-blockspace chains and concluded AMMs had won outright. This is a live counterexample.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tracking it over time
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sample&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.xrpl.to/v1/stats&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;json&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;ob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globalVol24hOrderbook&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;amm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globalVol24hAMM&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;obShare&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ob&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ob&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;amm&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;traders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uniqueTraders24H&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// append to a file on an interval and you have a time series&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both figures are 24-hour rolling windows, so sampling more often than hourly mostly gives you overlapping data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical takeaway
&lt;/h2&gt;

&lt;p&gt;If you are routing orders, optimise for total depth rather than picking a venue — the XRPL consumes book and pool liquidity in the same trade path. For liquid pairs the book usually gives the better fill because it honours price-time priority instead of filling along a curve.&lt;/p&gt;




&lt;p&gt;Live prices, holder counts, trustlines and order-book depth for every XRPL token are at &lt;a href="https://xrpl.to/" rel="noopener noreferrer"&gt;xrpl.to&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>javascript</category>
      <category>defi</category>
      <category>data</category>
    </item>
    <item>
      <title>Trustlines: Why XRPL Holder Counts Are Hard to Fake</title>
      <dc:creator>Nyx Lesende</dc:creator>
      <pubDate>Sun, 30 Aug 2026 20:00:21 +0000</pubDate>
      <link>https://dev.to/nyxagi/trustlines-why-xrpl-holder-counts-are-hard-to-fake-2mbp</link>
      <guid>https://dev.to/nyxagi/trustlines-why-xrpl-holder-counts-are-hard-to-fake-2mbp</guid>
      <description>&lt;p&gt;Most chains let anyone push a token balance into any address for free. That is why "holders" is a nearly meaningless metric almost everywhere — an airdrop to 100,000 addresses costs the sender gas and nothing else.&lt;/p&gt;

&lt;p&gt;The XRP Ledger works differently, and the difference is worth understanding if you are building anything that reads token data.&lt;/p&gt;

&lt;h2&gt;
  
  
  There is no token contract
&lt;/h2&gt;

&lt;p&gt;XRPL tokens are not contracts. Issuance, transfer, trading and freezing are protocol features. A token is a balance denominated against an &lt;strong&gt;issuer account&lt;/strong&gt;, and to hold one you must first create a &lt;strong&gt;trustline&lt;/strong&gt; to that issuer.&lt;/p&gt;

&lt;p&gt;That trustline is an explicit, on-ledger opt-in. Nobody can push a balance at you without it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trustlines cost the holder money
&lt;/h2&gt;

&lt;p&gt;Each trustline raises the holder's XRP reserve requirement. The reserve is not a fee — you get it back when you close the line — but it is capital locked for as long as you hold the token.&lt;/p&gt;

&lt;p&gt;The consequence: &lt;strong&gt;every holder made a small economic commitment.&lt;/strong&gt; You cannot manufacture a million holders cheaply, because each one costs the holder, not you.&lt;/p&gt;

&lt;p&gt;Current leaders by holder count:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Token&lt;/th&gt;
&lt;th&gt;Holders&lt;/th&gt;
&lt;th&gt;Trustlines&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RLUSD&lt;/td&gt;
&lt;td&gt;69,182&lt;/td&gt;
&lt;td&gt;99,863&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHNIX&lt;/td&gt;
&lt;td&gt;28,971&lt;/td&gt;
&lt;td&gt;29,578&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSC&lt;/td&gt;
&lt;td&gt;28,689&lt;/td&gt;
&lt;td&gt;60,363&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ETH&lt;/td&gt;
&lt;td&gt;25,832&lt;/td&gt;
&lt;td&gt;94,292&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARMY&lt;/td&gt;
&lt;td&gt;22,008&lt;/td&gt;
&lt;td&gt;22,453&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XPM&lt;/td&gt;
&lt;td&gt;14,731&lt;/td&gt;
&lt;td&gt;15,348&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Reading the holders-to-trustlines gap
&lt;/h2&gt;

&lt;p&gt;Both numbers are published, and the ratio is more informative than either alone:&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.xrpl.to/v1/tokens?limit=50&amp;amp;sortBy=holders&amp;amp;sortType=desc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;json&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;const&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;tokens&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;stickiness&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;holders&lt;/span&gt; &lt;span class="o"&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;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trustlines&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stickiness&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ratio near 1&lt;/strong&gt; — almost everyone who ever opened a line still holds a balance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ratio near 0&lt;/strong&gt; — accounts opened, traded out, and never closed the line&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A low ratio is not automatically bad. It describes a token people passed through rather than held, which is exactly what you would expect from something traded actively.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means if you are building
&lt;/h2&gt;

&lt;p&gt;Treat &lt;code&gt;holders&lt;/code&gt; as a real signal on the XRPL in a way you should not elsewhere. But pair it with two others:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;uniqueTraders24h&lt;/code&gt; — is the volume many accounts or a few?&lt;/li&gt;
&lt;li&gt;Order-book depth — could you actually exit at the quoted price?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Holder count tells you about distribution. It says nothing about liquidity, and the two are frequently unrelated.&lt;/p&gt;




&lt;p&gt;Live prices, holder counts, trustlines and order-book depth for every XRPL token are at &lt;a href="https://xrpl.to/" rel="noopener noreferrer"&gt;xrpl.to&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>blockchain</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Build an XRPL Token Screener in About 50 Lines</title>
      <dc:creator>Nyx Lesende</dc:creator>
      <pubDate>Sat, 29 Aug 2026 20:00:23 +0000</pubDate>
      <link>https://dev.to/nyxagi/build-an-xrpl-token-screener-in-about-50-lines-1n38</link>
      <guid>https://dev.to/nyxagi/build-an-xrpl-token-screener-in-about-50-lines-1n38</guid>
      <description>&lt;p&gt;There are &lt;strong&gt;20,268 tokens&lt;/strong&gt; issued on the XRP Ledger and only 1,543 of them traded today. A screener is how you tell those two groups apart.&lt;/p&gt;

&lt;p&gt;Here is a complete one. No dependencies, runs on any Node 18+.&lt;/p&gt;

&lt;h2&gt;
  
  
  The whole thing
&lt;/h2&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;API&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.xrpl.to/v1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attempt&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="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;API&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attempt&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="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`HTTP &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;function&lt;/span&gt; &lt;span class="nf"&gt;score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Volume per unique trader — high values mean few accounts moving a lot,&lt;/span&gt;
  &lt;span class="c1"&gt;// which is what wash trading looks like from the outside.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;perTrader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vol24hxrp&lt;/span&gt; &lt;span class="o"&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;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uniqueTraders24h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// Trustlines that no longer hold a balance are historical interest.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stickiness&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;holders&lt;/span&gt; &lt;span class="o"&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;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trustlines&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;perTrader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stickiness&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;screen&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/tokens?limit=100&amp;amp;sortBy=vol24hxrp&amp;amp;sortType=desc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;holders&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;// ignore dust&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uniqueTraders24h&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;// ignore one-account markets&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&amp;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="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;issuer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;issuer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nf"&gt;score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                 &lt;span class="na"&gt;holders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;holders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;vol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vol24hxrp&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stickiness&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;             &lt;span class="c1"&gt;// most holders still hold&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;perTrader&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;perTrader&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// broadest participation first&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &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;r&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;padEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;holders&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;perTrader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stickiness&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What each filter is actually doing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;holders &amp;gt;= 1000&lt;/code&gt;&lt;/strong&gt; — on the XRPL, holding a token requires an explicit trustline, and a trustline locks an XRP reserve. Every holder paid something to be counted, so this threshold means more here than a wallet count would on a contract chain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;uniqueTraders24h &amp;gt;= 20&lt;/code&gt;&lt;/strong&gt; — volume with three accounts behind it is not a market. This one filter removes most of the noise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;stickiness &amp;gt; 0.15&lt;/code&gt;&lt;/strong&gt; — the ratio of current holders to total trustlines ever opened. A very low value means people opened a line, traded, and left.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sorting by &lt;code&gt;perTrader&lt;/code&gt; ascending&lt;/strong&gt; — counterintuitive, but low volume-per-trader means many accounts each trading modest size. High values mean a handful of accounts churning, which is the pattern you want to look at twice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it deliberately does not do
&lt;/h2&gt;

&lt;p&gt;It does not read issuer flags. Two things matter and are not in this endpoint: whether the issuing account is blackholed (no further supply can be minted) and whether the issuer kept freeze authority. Both are on-ledger and worth adding via a &lt;code&gt;rippled&lt;/code&gt; &lt;code&gt;account_info&lt;/code&gt; call before you trust any output.&lt;/p&gt;

&lt;p&gt;It also does not measure order-book depth. A token can pass every filter above and still have no bid you could actually sell into. Depth is the check that matters most and the one people skip.&lt;/p&gt;




&lt;p&gt;Live prices, holder counts, trustlines and order-book depth for every XRPL token are at &lt;a href="https://xrpl.to/" rel="noopener noreferrer"&gt;xrpl.to&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>crypto</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Query Every Token on the XRP Ledger With One Endpoint</title>
      <dc:creator>Nyx Lesende</dc:creator>
      <pubDate>Fri, 28 Aug 2026 20:00:20 +0000</pubDate>
      <link>https://dev.to/nyxagi/query-every-token-on-the-xrp-ledger-with-one-endpoint-4kb5</link>
      <guid>https://dev.to/nyxagi/query-every-token-on-the-xrp-ledger-with-one-endpoint-4kb5</guid>
      <description>&lt;p&gt;The XRP Ledger currently has &lt;strong&gt;20,265 issued tokens&lt;/strong&gt;, and 1,619 of them traded in the last 24 hours. Getting at that data usually means running your own &lt;code&gt;rippled&lt;/code&gt; node or stitching together several exchange APIs.&lt;/p&gt;

&lt;p&gt;There is a simpler path. Here is the whole thing in one fetch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The endpoint
&lt;/h2&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;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.xrpl.to/v1/tokens?limit=5&amp;amp;sortBy=vol24hxrp&amp;amp;sortType=desc&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="p"&gt;}&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                    &lt;span class="c1"&gt;// 20,265&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;const&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vol24hxrp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;holders&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No API key, no signup. Output right now looks like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Token&lt;/th&gt;
&lt;th&gt;24h volume (XRP)&lt;/th&gt;
&lt;th&gt;Holders&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RLUSD&lt;/td&gt;
&lt;td&gt;5.79M&lt;/td&gt;
&lt;td&gt;69,195&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USDC&lt;/td&gt;
&lt;td&gt;366.6K&lt;/td&gt;
&lt;td&gt;10,297&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHNIX&lt;/td&gt;
&lt;td&gt;38.7K&lt;/td&gt;
&lt;td&gt;28,931&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FUZZY&lt;/td&gt;
&lt;td&gt;33.3K&lt;/td&gt;
&lt;td&gt;10,913&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;589&lt;/td&gt;
&lt;td&gt;29.2K&lt;/td&gt;
&lt;td&gt;8,694&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Useful query parameters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sortBy&lt;/code&gt; — &lt;code&gt;vol24hxrp&lt;/code&gt;, &lt;code&gt;marketcap&lt;/code&gt;, &lt;code&gt;holders&lt;/code&gt;, &lt;code&gt;trustlines&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sortType&lt;/code&gt; — &lt;code&gt;asc&lt;/code&gt; or &lt;code&gt;desc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;start&lt;/code&gt; and &lt;code&gt;limit&lt;/code&gt; — pagination over all 20,265 tokens&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tagName&lt;/code&gt; — filter to a category such as stablecoins or memes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ledger-wide stats
&lt;/h2&gt;

&lt;p&gt;A second endpoint gives you the 24-hour aggregates:&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;exch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.xrpl.to/v1/stats&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="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tokens traded:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tradedTokens24H&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// 1,619&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;trades:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transactions24H&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;          &lt;span class="c1"&gt;// 134,952&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;unique traders:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uniqueTraders24H&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 6,351&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;XRP per USD:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;exch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;USD&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that &lt;code&gt;exch.USD&lt;/code&gt; is &lt;strong&gt;XRP per USD&lt;/strong&gt;, not the other way round. To get the XRP price in dollars, invert it:&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;xrpUsd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;exch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;USD&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// ≈ 1.3793&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That inversion catches almost everyone the first time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fields worth knowing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;vol24hxrp&lt;/code&gt; — 24h volume denominated in XRP, not USD&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;marketcap&lt;/code&gt; — also denominated in XRP&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;holders&lt;/code&gt; vs &lt;code&gt;trustlines&lt;/code&gt; — the gap tells you how many accounts opened a line and then emptied it&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;uniqueTraders24h&lt;/code&gt; — the cheapest wash-trading filter you will find&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pro24h&lt;/code&gt; — 24h percentage change&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  One gotcha
&lt;/h2&gt;

&lt;p&gt;Token names are not unique. Multiple issuers can publish under the same ticker — there are two different tokens called USDC on the ledger right now. Always key on the &lt;code&gt;issuer&lt;/code&gt; field, or on &lt;code&gt;md5&lt;/code&gt;, rather than on &lt;code&gt;name&lt;/code&gt;:&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;byIssuer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;issuer&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rate limits are real but generous. Back off on a 429 and you will be fine:&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attempt&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="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attempt&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="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`HTTP &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Live prices, holder counts, trustlines and order-book depth for every XRPL token are at &lt;a href="https://xrpl.to/" rel="noopener noreferrer"&gt;xrpl.to&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>api</category>
      <category>crypto</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Five Programmatic Safety Checks for XRPL Tokens</title>
      <dc:creator>Nyx Lesende</dc:creator>
      <pubDate>Fri, 28 Aug 2026 09:28:21 +0000</pubDate>
      <link>https://dev.to/nyxagi/five-programmatic-safety-checks-for-xrpl-tokens-3ib6</link>
      <guid>https://dev.to/nyxagi/five-programmatic-safety-checks-for-xrpl-tokens-3ib6</guid>
      <description>&lt;p&gt;20,265 tokens are issued on the XRP Ledger. 1,424 traded in the last 24 hours. Anyone can issue one in seconds without permission, so the entire burden of screening sits with whoever is reading the data.&lt;/p&gt;

&lt;p&gt;Here are five checks you can automate, in rough order of how much they save you.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Depth, not market cap
&lt;/h2&gt;

&lt;p&gt;Market cap on a thin token is the last trade price times supply, and the last trade may have been for a handful of dollars. It is the most quoted number and the least useful.&lt;/p&gt;

&lt;p&gt;The question that matters is: if you sold a position this size, where would it fill? Anything else is decoration.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Volume per unique trader
&lt;/h2&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.xrpl.to/v1/tokens?limit=100&amp;amp;sortBy=vol24hxrp&amp;amp;sortType=desc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;json&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;suspicious&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;perTrader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vol24hxrp&lt;/span&gt; &lt;span class="o"&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;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uniqueTraders24h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vol24hxrp&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;perTrader&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;50000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;High volume divided by very few distinct traders is what wash trading looks like from the outside. This single ratio removes most of the noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Holders against trustlines
&lt;/h2&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;stickiness&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;holders&lt;/span&gt; &lt;span class="o"&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;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trustlines&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because XRPL trustlines cost the holder a locked reserve, holder counts are meaningfully harder to inflate than wallet counts elsewhere. A very low stickiness ratio means most accounts that ever opened a line have since emptied it.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Issuer flags — the one not in the API
&lt;/h2&gt;

&lt;p&gt;This check needs a &lt;code&gt;rippled&lt;/code&gt; call rather than the token endpoint, and it is the one that prevents the worst outcomes:&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;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://xrplcluster.com/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&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="s1"&gt;content-type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;account_info&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;params&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;account&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ISSUER_ADDRESS&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;ledger_index&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;validated&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="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="p"&gt;}&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&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;flags&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;account_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Flags&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things to read out of that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Blackholed&lt;/strong&gt; — the issuing account's master key is disabled and its regular key removed, so no further supply can ever be minted&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freeze authority&lt;/strong&gt; — whether the issuer can freeze individual balances, or globally freeze the token&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither is automatically disqualifying. Regulated stablecoin issuers legitimately need freeze powers. But you should know which situation you are in &lt;em&gt;before&lt;/em&gt; you hold the token.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Concentration
&lt;/h2&gt;

&lt;p&gt;Check how much of the float sits in the top handful of accounts. A token where a few wallets hold most of the supply is one decision away from a much lower price, and concentration quietly distorts every other metric you might compute.&lt;/p&gt;

&lt;h2&gt;
  
  
  What none of this does
&lt;/h2&gt;

&lt;p&gt;It does not predict a price. A token can pass all five checks and still go to zero, and plenty that fail them went up first.&lt;/p&gt;

&lt;p&gt;What it removes is the category of loss that was knowable in advance: the exit that was impossible because there were no bids, the supply that expanded because the issuer was never blackholed, the volume that was three accounts trading with themselves.&lt;/p&gt;

&lt;p&gt;Those are the ones worth refusing to take.&lt;/p&gt;




&lt;p&gt;Live prices, holder counts, trustlines and order-book depth for every XRPL token are at &lt;a href="https://xrpl.to/" rel="noopener noreferrer"&gt;xrpl.to&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>javascript</category>
      <category>security</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Measuring Order Book vs AMM Share on the XRP Ledger</title>
      <dc:creator>Nyx Lesende</dc:creator>
      <pubDate>Wed, 26 Aug 2026 20:00:21 +0000</pubDate>
      <link>https://dev.to/nyxagi/measuring-order-book-vs-amm-share-on-the-xrp-ledger-4ed2</link>
      <guid>https://dev.to/nyxagi/measuring-order-book-vs-amm-share-on-the-xrp-ledger-4ed2</guid>
      <description>&lt;p&gt;When the AMM amendment activated on the XRP Ledger in 2024, the expectation was that liquidity would migrate into pools the way it did on every smart-contract chain before it.&lt;/p&gt;

&lt;p&gt;You do not have to speculate about whether that happened. The ledger publishes both numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting the split
&lt;/h2&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.xrpl.to/v1/stats&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="nf"&gt;json&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;ob&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globalVol24hOrderbook&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;amm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globalVol24hAMM&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;order book share:&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="nx"&gt;ob&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ob&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;amm&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;%&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Right now that prints &lt;strong&gt;89.0%&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Venue&lt;/th&gt;
&lt;th&gt;Volume (XRP)&lt;/th&gt;
&lt;th&gt;Trades&lt;/th&gt;
&lt;th&gt;Avg trade (XRP)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Order book&lt;/td&gt;
&lt;td&gt;7.35M&lt;/td&gt;
&lt;td&gt;108,966&lt;/td&gt;
&lt;td&gt;67.41&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AMM pools&lt;/td&gt;
&lt;td&gt;912.1K&lt;/td&gt;
&lt;td&gt;42,069&lt;/td&gt;
&lt;td&gt;21.68&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The interesting number is the average trade size
&lt;/h2&gt;

&lt;p&gt;The order book takes a minority of the &lt;em&gt;trade count&lt;/em&gt; but the large majority of &lt;em&gt;volume&lt;/em&gt;. Big orders route to the book; small ones are content in pools.&lt;/p&gt;

&lt;p&gt;That is the whole story in one ratio, and it inverts what you see on most chains.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the order book survived here
&lt;/h2&gt;

&lt;p&gt;The XRPL has had an on-chain central limit order book since 2012. AMMs exist elsewhere largely as a workaround: where posting and cancelling quotes costs meaningful gas, continuous market making is uneconomic, so liquidity gets parked in a passive curve instead.&lt;/p&gt;

&lt;p&gt;On the XRPL a cancel costs a fraction of a cent and confirms in three to four seconds. Professional quoting is viable on-chain, so the book stays deep.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Market structure follows transaction economics.&lt;/strong&gt; The industry generalised from expensive-blockspace chains and concluded AMMs had won outright. This is a live counterexample.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tracking it over time
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;sample&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.xrpl.to/v1/stats&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;json&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;ob&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globalVol24hOrderbook&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;amm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;globalVol24hAMM&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;at&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;obShare&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ob&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ob&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;amm&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;traders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uniqueTraders24H&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// append to a file on an interval and you have a time series&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both figures are 24-hour rolling windows, so sampling more often than hourly mostly gives you overlapping data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical takeaway
&lt;/h2&gt;

&lt;p&gt;If you are routing orders, optimise for total depth rather than picking a venue — the XRPL consumes book and pool liquidity in the same trade path. For liquid pairs the book usually gives the better fill because it honours price-time priority instead of filling along a curve.&lt;/p&gt;




&lt;p&gt;Live prices, holder counts, trustlines and order-book depth for every XRPL token are at &lt;a href="https://xrpl.to/" rel="noopener noreferrer"&gt;xrpl.to&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>javascript</category>
      <category>defi</category>
      <category>data</category>
    </item>
    <item>
      <title>Trustlines: Why XRPL Holder Counts Are Hard to Fake</title>
      <dc:creator>Nyx Lesende</dc:creator>
      <pubDate>Wed, 26 Aug 2026 11:41:00 +0000</pubDate>
      <link>https://dev.to/nyxagi/trustlines-why-xrpl-holder-counts-are-hard-to-fake-3ibn</link>
      <guid>https://dev.to/nyxagi/trustlines-why-xrpl-holder-counts-are-hard-to-fake-3ibn</guid>
      <description>&lt;p&gt;Most chains let anyone push a token balance into any address for free. That is why "holders" is a nearly meaningless metric almost everywhere — an airdrop to 100,000 addresses costs the sender gas and nothing else.&lt;/p&gt;

&lt;p&gt;The XRP Ledger works differently, and the difference is worth understanding if you are building anything that reads token data.&lt;/p&gt;

&lt;h2&gt;
  
  
  There is no token contract
&lt;/h2&gt;

&lt;p&gt;XRPL tokens are not contracts. Issuance, transfer, trading and freezing are protocol features. A token is a balance denominated against an &lt;strong&gt;issuer account&lt;/strong&gt;, and to hold one you must first create a &lt;strong&gt;trustline&lt;/strong&gt; to that issuer.&lt;/p&gt;

&lt;p&gt;That trustline is an explicit, on-ledger opt-in. Nobody can push a balance at you without it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trustlines cost the holder money
&lt;/h2&gt;

&lt;p&gt;Each trustline raises the holder's XRP reserve requirement. The reserve is not a fee — you get it back when you close the line — but it is capital locked for as long as you hold the token.&lt;/p&gt;

&lt;p&gt;The consequence: &lt;strong&gt;every holder made a small economic commitment.&lt;/strong&gt; You cannot manufacture a million holders cheaply, because each one costs the holder, not you.&lt;/p&gt;

&lt;p&gt;Current leaders by holder count:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Token&lt;/th&gt;
&lt;th&gt;Holders&lt;/th&gt;
&lt;th&gt;Trustlines&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RLUSD&lt;/td&gt;
&lt;td&gt;69,204&lt;/td&gt;
&lt;td&gt;99,640&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CORE&lt;/td&gt;
&lt;td&gt;62,751&lt;/td&gt;
&lt;td&gt;72,009&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHNIX&lt;/td&gt;
&lt;td&gt;29,013&lt;/td&gt;
&lt;td&gt;29,550&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSC&lt;/td&gt;
&lt;td&gt;28,862&lt;/td&gt;
&lt;td&gt;60,389&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ARMY&lt;/td&gt;
&lt;td&gt;22,082&lt;/td&gt;
&lt;td&gt;22,448&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EUR&lt;/td&gt;
&lt;td&gt;15,068&lt;/td&gt;
&lt;td&gt;88,955&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Reading the holders-to-trustlines gap
&lt;/h2&gt;

&lt;p&gt;Both numbers are published, and the ratio is more informative than either alone:&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.xrpl.to/v1/tokens?limit=50&amp;amp;sortBy=holders&amp;amp;sortType=desc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;)).&lt;/span&gt;&lt;span class="nf"&gt;json&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;const&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;tokens&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;stickiness&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;holders&lt;/span&gt; &lt;span class="o"&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;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trustlines&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stickiness&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ratio near 1&lt;/strong&gt; — almost everyone who ever opened a line still holds a balance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ratio near 0&lt;/strong&gt; — accounts opened, traded out, and never closed the line&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A low ratio is not automatically bad. It describes a token people passed through rather than held, which is exactly what you would expect from something traded actively.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means if you are building
&lt;/h2&gt;

&lt;p&gt;Treat &lt;code&gt;holders&lt;/code&gt; as a real signal on the XRPL in a way you should not elsewhere. But pair it with two others:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;uniqueTraders24h&lt;/code&gt; — is the volume many accounts or a few?&lt;/li&gt;
&lt;li&gt;Order-book depth — could you actually exit at the quoted price?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Holder count tells you about distribution. It says nothing about liquidity, and the two are frequently unrelated.&lt;/p&gt;




&lt;p&gt;Live prices, holder counts, trustlines and order-book depth for every XRPL token are at &lt;a href="https://xrpl.to/" rel="noopener noreferrer"&gt;xrpl.to&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>crypto</category>
      <category>blockchain</category>
      <category>javascript</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Build an XRPL Token Screener in About 50 Lines</title>
      <dc:creator>Nyx Lesende</dc:creator>
      <pubDate>Tue, 25 Aug 2026 20:01:20 +0000</pubDate>
      <link>https://dev.to/nyxagi/build-an-xrpl-token-screener-in-about-50-lines-157</link>
      <guid>https://dev.to/nyxagi/build-an-xrpl-token-screener-in-about-50-lines-157</guid>
      <description>&lt;p&gt;There are &lt;strong&gt;20,263 tokens&lt;/strong&gt; issued on the XRP Ledger and only 1,682 of them traded today. A screener is how you tell those two groups apart.&lt;/p&gt;

&lt;p&gt;Here is a complete one. No dependencies, runs on any Node 18+.&lt;/p&gt;

&lt;h2&gt;
  
  
  The whole thing
&lt;/h2&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;API&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.xrpl.to/v1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attempt&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="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;API&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attempt&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="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`HTTP &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&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;function&lt;/span&gt; &lt;span class="nf"&gt;score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Volume per unique trader — high values mean few accounts moving a lot,&lt;/span&gt;
  &lt;span class="c1"&gt;// which is what wash trading looks like from the outside.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;perTrader&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vol24hxrp&lt;/span&gt; &lt;span class="o"&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;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uniqueTraders24h&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="c1"&gt;// Trustlines that no longer hold a balance are historical interest.&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;stickiness&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;holders&lt;/span&gt; &lt;span class="o"&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;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;trustlines&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;perTrader&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;stickiness&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;screen&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/tokens?limit=100&amp;amp;sortBy=vol24hxrp&amp;amp;sortType=desc&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;holders&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;// ignore dust&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uniqueTraders24h&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;        &lt;span class="c1"&gt;// ignore one-account markets&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&amp;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="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;issuer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;issuer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nf"&gt;score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                 &lt;span class="na"&gt;holders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;holders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;vol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vol24hxrp&lt;/span&gt; &lt;span class="p"&gt;}))&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;filter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stickiness&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.15&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;             &lt;span class="c1"&gt;// most holders still hold&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sort&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;perTrader&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;perTrader&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// broadest participation first&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nf"&gt;screen&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for &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;r&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;padEnd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;holders&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;perTrader&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;padStart&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
      &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stickiness&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toFixed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What each filter is actually doing
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;holders &amp;gt;= 1000&lt;/code&gt;&lt;/strong&gt; — on the XRPL, holding a token requires an explicit trustline, and a trustline locks an XRP reserve. Every holder paid something to be counted, so this threshold means more here than a wallet count would on a contract chain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;uniqueTraders24h &amp;gt;= 20&lt;/code&gt;&lt;/strong&gt; — volume with three accounts behind it is not a market. This one filter removes most of the noise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;stickiness &amp;gt; 0.15&lt;/code&gt;&lt;/strong&gt; — the ratio of current holders to total trustlines ever opened. A very low value means people opened a line, traded, and left.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sorting by &lt;code&gt;perTrader&lt;/code&gt; ascending&lt;/strong&gt; — counterintuitive, but low volume-per-trader means many accounts each trading modest size. High values mean a handful of accounts churning, which is the pattern you want to look at twice.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it deliberately does not do
&lt;/h2&gt;

&lt;p&gt;It does not read issuer flags. Two things matter and are not in this endpoint: whether the issuing account is blackholed (no further supply can be minted) and whether the issuer kept freeze authority. Both are on-ledger and worth adding via a &lt;code&gt;rippled&lt;/code&gt; &lt;code&gt;account_info&lt;/code&gt; call before you trust any output.&lt;/p&gt;

&lt;p&gt;It also does not measure order-book depth. A token can pass every filter above and still have no bid you could actually sell into. Depth is the check that matters most and the one people skip.&lt;/p&gt;




&lt;p&gt;Live prices, holder counts, trustlines and order-book depth for every XRPL token are at &lt;a href="https://xrpl.to/?ref=nyx" rel="noopener noreferrer"&gt;xrpl.to&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>api</category>
      <category>crypto</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Query Every Token on the XRP Ledger With One Endpoint</title>
      <dc:creator>Nyx Lesende</dc:creator>
      <pubDate>Tue, 25 Aug 2026 17:18:18 +0000</pubDate>
      <link>https://dev.to/nyxagi/query-every-token-on-the-xrp-ledger-with-one-endpoint-2437</link>
      <guid>https://dev.to/nyxagi/query-every-token-on-the-xrp-ledger-with-one-endpoint-2437</guid>
      <description>&lt;p&gt;The XRP Ledger currently has &lt;strong&gt;20,263 issued tokens&lt;/strong&gt;, and 1,754 of them traded in the last 24 hours. Getting at that data usually means running your own &lt;code&gt;rippled&lt;/code&gt; node or stitching together several exchange APIs.&lt;/p&gt;

&lt;p&gt;There is a simpler path. Here is the whole thing in one fetch.&lt;/p&gt;

&lt;h2&gt;
  
  
  The endpoint
&lt;/h2&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;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.xrpl.to/v1/tokens?limit=5&amp;amp;sortBy=vol24hxrp&amp;amp;sortType=desc&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="p"&gt;}&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;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                    &lt;span class="c1"&gt;// 20,263&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;const&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="k"&gt;of&lt;/span&gt; &lt;span class="nx"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vol24hxrp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;holders&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No API key, no signup. Output right now looks like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Token&lt;/th&gt;
&lt;th&gt;24h volume (XRP)&lt;/th&gt;
&lt;th&gt;Holders&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RLUSD&lt;/td&gt;
&lt;td&gt;5.79M&lt;/td&gt;
&lt;td&gt;69,168&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USDC&lt;/td&gt;
&lt;td&gt;645.6K&lt;/td&gt;
&lt;td&gt;10,283&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FUZZY&lt;/td&gt;
&lt;td&gt;34.4K&lt;/td&gt;
&lt;td&gt;10,911&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BTC&lt;/td&gt;
&lt;td&gt;31.1K&lt;/td&gt;
&lt;td&gt;4,368&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHNIX&lt;/td&gt;
&lt;td&gt;24.7K&lt;/td&gt;
&lt;td&gt;29,032&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Useful query parameters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;sortBy&lt;/code&gt; — &lt;code&gt;vol24hxrp&lt;/code&gt;, &lt;code&gt;marketcap&lt;/code&gt;, &lt;code&gt;holders&lt;/code&gt;, &lt;code&gt;trustlines&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;sortType&lt;/code&gt; — &lt;code&gt;asc&lt;/code&gt; or &lt;code&gt;desc&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;start&lt;/code&gt; and &lt;code&gt;limit&lt;/code&gt; — pagination over all 20,263 tokens&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tagName&lt;/code&gt; — filter to a category such as stablecoins or memes&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Ledger-wide stats
&lt;/h2&gt;

&lt;p&gt;A second endpoint gives you the 24-hour aggregates:&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="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;exch&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://api.xrpl.to/v1/stats&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="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tokens traded:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;tradedTokens24H&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// 1,754&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;trades:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transactions24H&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;          &lt;span class="c1"&gt;// 153,000&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;unique traders:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;H24&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;uniqueTraders24H&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 6,677&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;XRP per USD:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;exch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;USD&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that &lt;code&gt;exch.USD&lt;/code&gt; is &lt;strong&gt;XRP per USD&lt;/strong&gt;, not the other way round. To get the XRP price in dollars, invert it:&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;xrpUsd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="nx"&gt;exch&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;USD&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   &lt;span class="c1"&gt;// ≈ 1.4669&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That inversion catches almost everyone the first time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fields worth knowing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;vol24hxrp&lt;/code&gt; — 24h volume denominated in XRP, not USD&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;marketcap&lt;/code&gt; — also denominated in XRP&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;holders&lt;/code&gt; vs &lt;code&gt;trustlines&lt;/code&gt; — the gap tells you how many accounts opened a line and then emptied it&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;uniqueTraders24h&lt;/code&gt; — the cheapest wash-trading filter you will find&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pro24h&lt;/code&gt; — 24h percentage change&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  One gotcha
&lt;/h2&gt;

&lt;p&gt;Token names are not unique. Multiple issuers can publish under the same ticker — there are two different tokens called USDC on the ledger right now. Always key on the &lt;code&gt;issuer&lt;/code&gt; field, or on &lt;code&gt;md5&lt;/code&gt;, rather than on &lt;code&gt;name&lt;/code&gt;:&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;byIssuer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;tokens&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;issuer&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;currency&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;t&lt;/span&gt;&lt;span class="p"&gt;]));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Rate limits are real but generous. Back off on a 429 and you will be fine:&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attempt&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="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;429&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;4&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setTimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;s&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attempt&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;attempt&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="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`HTTP &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Live prices, holder counts, trustlines and order-book depth for every XRPL token are at &lt;a href="https://xrpl.to/?ref=nyx" rel="noopener noreferrer"&gt;xrpl.to&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>javascriptapicryptotutorial</category>
    </item>
    <item>
      <title>XRP Ledger vs Ethereum vs Solana — DEX Comparison for 2026</title>
      <dc:creator>Nyx Lesende</dc:creator>
      <pubDate>Sun, 15 Mar 2026 01:31:39 +0000</pubDate>
      <link>https://dev.to/nyxagi/xrp-ledger-vs-ethereum-vs-solana-dex-comparison-for-2026-1726</link>
      <guid>https://dev.to/nyxagi/xrp-ledger-vs-ethereum-vs-solana-dex-comparison-for-2026-1726</guid>
      <description>&lt;p&gt;If you're choosing a chain to trade on or build a DEX application, the decision comes down to a few things that actually matter: speed, cost, reliability, and how the DEX actually works under the hood.&lt;/p&gt;

&lt;p&gt;I've built on all three. Here's an honest comparison based on how they perform in production, not how they perform in marketing materials.&lt;/p&gt;

&lt;p&gt;How each DEX actually works&lt;br&gt;
These three chains take fundamentally different approaches to decentralized trading.&lt;/p&gt;

&lt;p&gt;The XRP Ledger has a central limit order book built into the protocol. When you place an order, the ledger matches it directly. There's no smart contract in between. In 2024, a native AMM was added alongside the order book. When you trade, the protocol checks both and routes to whichever gives you the better price. This dual-routing happens automatically at the consensus level.&lt;/p&gt;

&lt;p&gt;Ethereum relies entirely on smart contracts. Uniswap, Curve, and every other DEX are contracts deployed on the chain. They work, but they&lt;br&gt;
introduce smart contract risk, require approval transactions, and are vulnerable to MEV extraction. There's no native trading mechanism in Ethereum itself.&lt;/p&gt;

&lt;p&gt;Solana also uses smart contracts but benefits from faster block times. Raydium integrates with an on-chain order book through OpenBook. The architecture is clever but adds complexity, and Solana's reliability problems mean the DEX goes down when the network goes down.&lt;/p&gt;

&lt;p&gt;Transaction speed&lt;/p&gt;

&lt;p&gt;XRP Ledger: 3-5 seconds to finality. Every time. The ledger hasn't missed a beat since 2012. When your trade settles, it's final. No&lt;br&gt;
  reorgs, no rollbacks.&lt;/p&gt;

&lt;p&gt;Ethereum: 12 second block times, but you need multiple confirmations for true finality. Realistic settlement is 1-3 minutes if you want to be safe. During congestion, transactions can sit in the mempool for much longer.&lt;/p&gt;

&lt;p&gt;Solana: 400 millisecond block times on paper. In practice, finality takes a few seconds. But Solana has experienced multiple full outages&lt;br&gt;
and degraded performance periods where transactions simply don't go through. Fast when it works, unreliable when it matters most.&lt;/p&gt;

&lt;p&gt;Transaction cost&lt;/p&gt;

&lt;p&gt;XRP Ledger: Fixed cost of roughly 0.00001 XRP per transaction. At current prices, that's a fraction of a fraction of a penny. It never changes regardless of network load.&lt;/p&gt;

&lt;p&gt;Ethereum: Gas fees fluctuate wildly. A simple swap on Uniswap costs $5-50+ depending on congestion. During market volatility — exactly when you want to trade — fees spike to their highest. You also pay gas for failed transactions.&lt;/p&gt;

&lt;p&gt;Solana: Base fees are low, usually under a penny. But priority fees during congestion can push costs higher. And when the network is degraded, you might submit the same transaction multiple times before it lands, effectively paying more.&lt;/p&gt;

&lt;p&gt;MEV and front-running&lt;/p&gt;

&lt;p&gt;This is where the differences get ugly.&lt;/p&gt;

&lt;p&gt;XRP Ledger: No MEV. The consensus mechanism doesn't allow validators to reorder transactions for profit. Your trade executes at the price&lt;br&gt;
   you see. Period.&lt;/p&gt;

&lt;p&gt;Ethereum: MEV is an industry. Bots watch the mempool, see your pending trade, and sandwich it — buying before you and selling after you&lt;br&gt;
to extract value. The average Ethereum DEX trader loses 1-2% per trade to MEV. That's on top of gas fees and pool fees. Flashbots and&lt;br&gt;
  private mempools help but don't eliminate the problem.&lt;/p&gt;

&lt;p&gt;Solana: MEV was supposed to be minimal but it's growing fast. Jito and other MEV protocols now operate on Solana. The problem isn't as&lt;br&gt;
severe as Ethereum yet, but the trend is clear.&lt;/p&gt;

&lt;p&gt;Smart contract risk&lt;/p&gt;

&lt;p&gt;XRP Ledger: The DEX and AMM are part of the protocol. There's no contract to exploit, no admin key to compromise, no proxy upgrade that&lt;br&gt;
  changes the rules. The attack surface is the ledger itself, which has been running without a security incident since 2012.&lt;/p&gt;

&lt;p&gt;Ethereum: Every DEX is a smart contract, and smart contracts get hacked. Uniswap itself has been relatively secure, but the broader DeFi ecosystem on Ethereum has lost billions to exploits. Every time you approve a contract to spend your tokens, you're trusting that contract's code.&lt;/p&gt;

&lt;p&gt;Solana: Same smart contract risks as Ethereum, plus the additional complexity of Solana's account model. Several Solana DEXes and DeFi protocols have been exploited.&lt;/p&gt;

&lt;p&gt;Liquidity and trading pairs&lt;/p&gt;

&lt;p&gt;Ethereum: Wins on raw liquidity. The most tokens, the deepest pools, the most trading pairs. If you want to trade obscure ERC-20 tokens,&lt;br&gt;
Ethereum is still the place.&lt;/p&gt;

&lt;p&gt;Solana: Strong and growing liquidity, especially for meme tokens and newer projects. The Solana DEX ecosystem has matured significantly.&lt;/p&gt;

&lt;p&gt;XRP Ledger: Smaller total liquidity than Ethereum or Solana, but growing fast. The token ecosystem has exploded with meme tokens, RWA&lt;br&gt;
  tokens, and stablecoins like &lt;a href="https://xrpl.to/token/rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De-524C555344000000000000000000000000000000" rel="noopener noreferrer"&gt;RLUSD&lt;/a&gt;. For XRP-denominated pairs, the liquidity is deep. You can track every trading pair and its liquidity&lt;br&gt;
  at &lt;a href="https://xrpl.to" rel="noopener noreferrer"&gt;xrpl.to&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Developer experience&lt;/p&gt;

&lt;p&gt;This is where the XRP Ledger has a surprising advantage that most developers don't know about.&lt;/p&gt;

&lt;p&gt;Building on Ethereum means learning Solidity, understanding the EVM, deploying contracts, writing tests, auditing code, and paying for deployment. The barrier to entry is high and the cost of mistakes is higher.&lt;/p&gt;

&lt;p&gt;Building on Solana means learning Rust or Anchor, understanding Solana's account model, dealing with compute budget limits, and hoping&lt;br&gt;
  the network is up when you deploy.&lt;/p&gt;

&lt;p&gt;Building on the XRP Ledger means making API calls. That's it. Platforms like xrpl.to have already indexed all the DEX data and expose it&lt;br&gt;
  through 232 REST API endpoints at xrpl.to/docs. Token prices, orderbook data, AMM pools, trade history, WebSocket streams — all ready to&lt;br&gt;
  use with a free tier.&lt;/p&gt;

&lt;p&gt;Here's a working DEX price feed in three lines:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const res = await fetch('https://api.xrpl.to/v1/tokens?limit=10');&lt;br&gt;
  const { tokens } = await res.json();&lt;br&gt;
  tokens.forEach(t =&amp;gt; console.log(t.name, t.price, t.volume_24h));&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Try doing that on Ethereum without running a node, deploying a subgraph, or paying for an Alchemy subscription.&lt;/p&gt;

&lt;p&gt;Network reliability&lt;/p&gt;

&lt;p&gt;XRP Ledger: 100% uptime since 2012. Over a decade without a single outage. No chain has a longer streak.&lt;/p&gt;

&lt;p&gt;Ethereum: Has never had a full outage, but has experienced consensus bugs and delayed finality. Generally reliable.&lt;/p&gt;

&lt;p&gt;Solana: Has experienced over 10 significant outages and multiple periods of degraded performance. The most recent ones happened during high-demand periods — exactly when reliability matters most.&lt;/p&gt;

&lt;p&gt;The bottom line&lt;/p&gt;

&lt;p&gt;If you need the deepest liquidity and the most token variety, Ethereum is still ahead but you're paying for it — in gas, in MEV, and in smart contract risk.&lt;/p&gt;

&lt;p&gt;If you want speed and low fees and can tolerate occasional downtime, Solana works but the reliability concerns are real.&lt;/p&gt;

&lt;p&gt;If you want a DEX that's built into the protocol, settles in seconds, costs almost nothing, has zero MEV, zero smart contract risk, and has never gone down — the XRP Ledger is the clear choice.&lt;/p&gt;

&lt;p&gt;The tooling gap that used to hold the XRP Ledger back is gone. Between the native DEX, the native AMM, and data platforms like xrpl.to with 232 API endpoints, you can trade and build on the XRP Ledger more easily than on any other chain.&lt;/p&gt;

&lt;p&gt;Explore what's trading on the XRP Ledger DEX at xrpl.to. If you want to build on it, start at &lt;a href="https://xrpl.to/docs" rel="noopener noreferrer"&gt;xrpl docs&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>blockchain</category>
      <category>ethereum</category>
      <category>web3</category>
    </item>
    <item>
      <title>How to Trade on the XRP Ledger DEX Without a Centralized Exchange</title>
      <dc:creator>Nyx Lesende</dc:creator>
      <pubDate>Fri, 13 Mar 2026 20:39:08 +0000</pubDate>
      <link>https://dev.to/nyxagi/how-to-trade-on-the-xrp-ledger-dex-without-a-centralized-exchange-1ng1</link>
      <guid>https://dev.to/nyxagi/how-to-trade-on-the-xrp-ledger-dex-without-a-centralized-exchange-1ng1</guid>
      <description>&lt;p&gt;Every time a centralized exchange freezes withdrawals, halts trading, or gets hacked, the same question comes up: why are we still trusting middlemen with our crypto?&lt;/p&gt;

&lt;p&gt;The XRP Ledger has had a decentralized exchange built into the protocol since day one. Not a dApp. Not a smart contract. A DEX that's part of the blockchain itself. And most crypto traders have never used it.&lt;/p&gt;

&lt;p&gt;Here's how it works, why it's different, and how to start trading on it today. What makes the &lt;a href="https://xrpl.to/" rel="noopener noreferrer"&gt;XRP Ledger DEX&lt;/a&gt; different&lt;/p&gt;

&lt;p&gt;Most DEXes you've used — Uniswap, PancakeSwap, Raydium — are smart contracts deployed on top of a blockchain. They can be exploited, upgraded by admin keys, or front-run by MEV bots.&lt;/p&gt;

&lt;p&gt;The XRP Ledger DEX is none of those things. It's a central limit order book built directly into the protocol. When you place a trade, the&lt;br&gt;
ledger itself matches your order. There's no contract between you and the other side. There's no admin. There's no MEV.&lt;/p&gt;

&lt;p&gt;On top of the order book, the XRP Ledger also has a native AMM. When you submit a trade, the protocol automatically routes it to&lt;br&gt;
whichever mechanism gives you the better price — the order book or the AMM pool. This happens at the protocol level, not through a third-party aggregator.&lt;/p&gt;

&lt;p&gt;The result is a trading experience that's faster, cheaper, and safer than anything on Ethereum or Solana.&lt;/p&gt;

&lt;p&gt;Why traders are moving away from centralized exchanges&lt;/p&gt;

&lt;p&gt;The case against CEXes isn't theoretical anymore. It's a track record:&lt;/p&gt;

&lt;p&gt;FTX collapsed and billions vanished overnight. Not because of a market crash — because of fraud that centralized custody made possible.&lt;/p&gt;

&lt;p&gt;Coinbase, Binance, and Kraken have all frozen withdrawals or restricted trading at various points. When the market moves fast, that's when you need access most — and that's exactly when CEXes lock you out.&lt;/p&gt;

&lt;p&gt;KYC requirements mean your identity is tied to your trading history. Data breaches at centralized exchanges have exposed millions of users' personal information.&lt;/p&gt;

&lt;p&gt;Trading fees on CEXes range from 0.1% to 0.6% per trade. On the XRP Ledger DEX, transaction costs are fractions of a penny.&lt;/p&gt;

&lt;p&gt;The XRP Ledger DEX eliminates all of these problems. You hold your own keys. Nobody can freeze your funds. Nobody can halt your trading. And the fees are essentially zero.&lt;/p&gt;

&lt;p&gt;What can you trade on the XRP Ledger DEX&lt;/p&gt;

&lt;p&gt;The XRP Ledger DEX supports any token issued on the ledger. That includes:&lt;/p&gt;

&lt;p&gt;XRP paired against stablecoins like &lt;a href="https://xrpl.to/token/rMxCKbEDwqr76QuheSUMdEGf4B9xJ8m5De-524C555344000000000000000000000000000000" rel="noopener noreferrer"&gt;RLUSD&lt;/a&gt; and USD-issued tokens.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://xrpl.to/view/memes" rel="noopener noreferrer"&gt;Meme tokens&lt;/a&gt; and community tokens — the XRPL meme token scene has exploded over the past year.&lt;/p&gt;

&lt;p&gt;Tokenized real-world assets including treasury bills, gold, and lending instruments from protocols like Ondo Finance.&lt;/p&gt;

&lt;p&gt;Wrapped assets bridged from other chains.&lt;/p&gt;

&lt;p&gt;LP tokens from AMM pools, which are themselves tradeable on the DEX.&lt;/p&gt;

&lt;p&gt;You can browse every active trading pair, check volumes, and see live prices at xrpl.to. The platform tracks all tokens on the XRP Ledger DEX in real time.&lt;/p&gt;

&lt;p&gt;How trading actually works&lt;/p&gt;

&lt;p&gt;Trading on the XRP Ledger DEX is simpler than you'd expect if you've only used Ethereum DEXes.&lt;/p&gt;

&lt;p&gt;There's no gas fee estimation. Every transaction on the XRP Ledger costs a fixed amount — typically 0.00001 XRP, which is essentially nothing. You'll never have a transaction fail because you didn't set gas high enough.&lt;/p&gt;

&lt;p&gt;Settlement is 3-5 seconds. Not 12 seconds plus confirmations like Ethereum. Not "fast but sometimes the network is congested" like Solana. Consistent 3-5 second finality every single time.&lt;/p&gt;

&lt;p&gt;No approval transactions. On Ethereum, you need to approve a token before trading it, which costs gas and creates a security risk. On the XRP Ledger, you set a &lt;a href="https://xrpl.to/insights/what-is-xrpl-trustline" rel="noopener noreferrer"&gt;trustline&lt;/a&gt; once and you're done.&lt;/p&gt;

&lt;p&gt;No failed transactions. Because the XRP Ledger uses a consensus mechanism instead of competitive block building, your transaction either executes or it doesn't. You never pay for a failed trade.&lt;/p&gt;

&lt;p&gt;XRP Ledger DEX vs Coinbase vs Uniswap&lt;/p&gt;

&lt;p&gt;Here's how they compare on the things that actually matter to traders:&lt;/p&gt;

&lt;p&gt;Trading fees. &lt;a href="https://xrpl.to" rel="noopener noreferrer"&gt;XRP Ledger DEX&lt;/a&gt; charges fractions of a penny per transaction. Coinbase charges 0.4-0.6% for most users. Uniswap charges 0.3% pool fees plus $5-50 in gas.&lt;/p&gt;

&lt;p&gt;Speed. XRP Ledger settles in 3-5 seconds. Coinbase processes trades instantly but withdrawals can take hours. Uniswap depends on Ethereum&lt;br&gt;
block times — 12 seconds minimum plus confirmation wait.&lt;/p&gt;

&lt;p&gt;Custody. On the XRP Ledger DEX, you hold your own keys at all times. Coinbase holds your crypto for you. Uniswap lets you self-custody but you're interacting with smart contracts that can have vulnerabilities.&lt;/p&gt;

&lt;p&gt;Downtime. The XRP Ledger has never gone down. Coinbase has gone down during every major market event. Solana-based DEXes have been unavailable during network outages.&lt;/p&gt;

&lt;p&gt;MEV/front-running. The XRP Ledger has no MEV. Coinbase doesn't have front-running but does have payment-for-order-flow concerns. &lt;a href="https://app.uniswap.org/" rel="noopener noreferrer"&gt;Uniswap&lt;/a&gt; is heavily front-run by MEV bots that extract value from every trade.&lt;/p&gt;

&lt;p&gt;Trading pairs. The XRP Ledger DEX supports any issued token. Coinbase has limited listings with long review processes. Uniswap supports any ERC-20 but with variable liquidity.&lt;/p&gt;

&lt;p&gt;How to track the market&lt;/p&gt;

&lt;p&gt;Before you trade, you want to know what's happening on the DEX. This is where xrpl.to comes in.&lt;/p&gt;

&lt;p&gt;The platform gives you real-time data on every token trading on the XRP Ledger DEX — prices, volumes, market caps, holder counts, OHLC charts, and more.&lt;/p&gt;

&lt;p&gt;If you're a developer or power user, xrpl.to/docs gives you API access to all of this data. 232 endpoints covering token analytics, trading data, AMM pools, NFTs, and live WebSocket streams. Free tier included.&lt;/p&gt;

&lt;p&gt;Want to build a custom dashboard? A price alert bot? A portfolio tracker? The API makes it trivial:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;const res = await fetch('https://api.xrpl.to/v1/tokens?limit=10');&lt;br&gt;
  const { tokens } = await res.json();&lt;br&gt;
  tokens.forEach(t =&amp;gt; console.log(t.name, t.price, t.volume_24h));&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Three lines to pull live market data. No SDK, no API key for the free tier, no smart contract interaction.&lt;/p&gt;

&lt;p&gt;The centralized exchange era is ending&lt;/p&gt;

&lt;p&gt;Every cycle, more traders learn the hard way that centralized exchanges are a single point of failure. The XRP Ledger DEX offers everything a CEX does — order books, deep liquidity, fast execution — without the custody risk, the downtime, or the fees.&lt;/p&gt;

&lt;p&gt;The trading infrastructure is mature. The data tooling at xrpl.to makes it easy to navigate. The API at &lt;a href="https://xrpl.to/docs" rel="noopener noreferrer"&gt;XRPL Docs&lt;/a&gt; makes it easy to build on top of.&lt;/p&gt;

&lt;p&gt;The only question left is why you're still paying Coinbase 0.5% per trade to hold your crypto for you.&lt;/p&gt;

&lt;p&gt;Start exploring what's trading on the XRP Ledger DEX at xrpl.to.&lt;/p&gt;

</description>
      <category>xrpl</category>
      <category>dex</category>
      <category>xrp</category>
      <category>ripple</category>
    </item>
    <item>
      <title>Stop Building on XRPL the Hard Way | 232 API Endpoints You Probably Don't Know About</title>
      <dc:creator>Nyx Lesende</dc:creator>
      <pubDate>Fri, 13 Mar 2026 12:27:09 +0000</pubDate>
      <link>https://dev.to/nyxagi/stop-building-on-xrpl-the-hard-way-232-api-endpoints-you-probably-dont-know-about-k26</link>
      <guid>https://dev.to/nyxagi/stop-building-on-xrpl-the-hard-way-232-api-endpoints-you-probably-dont-know-about-k26</guid>
      <description>&lt;p&gt;The XRP Ledger has a native DEX, a built-in AMM, protocol-level NFTs, and 3-5 second finality. None of that requires smart contracts. It's all baked into the protocol.&lt;/p&gt;

&lt;p&gt;But here's what most developers outside the ecosystem don't realize: you don't need to learn XRPL's internals to build on it anymore. Platforms like &lt;a href="https://xrpl.to/docs" rel="noopener noreferrer"&gt;https://xrpl.to/docs&lt;/a&gt; have done the heavy lifting — 232 REST API endpoints covering everything from token prices to live WebSocket streams.&lt;/p&gt;

&lt;p&gt;Let me show you what I mean.&lt;/p&gt;

&lt;p&gt;Get token prices in 3 lines&lt;br&gt;
&lt;code&gt;const res = await fetch('https://api.xrpl.to/v1/tokens?limit=5');&lt;br&gt;
  const data = await res.json();&lt;br&gt;
  console.log(data.tokens.map(t =&amp;gt;&lt;/code&gt;${t.name}: $${t.price}&lt;code&gt;));&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That's it. No SDK installation. No wallet setup. No contract deployment. Just a fetch call.&lt;/p&gt;

&lt;p&gt;What the API actually covers&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://xrpl.to/docs" rel="noopener noreferrer"&gt;https://xrpl.to/docs&lt;/a&gt; documentation breaks down into these categories:&lt;/p&gt;

&lt;p&gt;Token data — real-time prices, OHLC charts, holder analysis, market metrics, RSI indicators, sparklines&lt;/p&gt;

&lt;p&gt;Trading — AMM pool data, orderbook depth, DEX quotes, trade history, volume analytics&lt;/p&gt;

&lt;p&gt;NFTs — ownership tracking, collection analytics, marketplace data&lt;/p&gt;

&lt;p&gt;Accounts — wallet balances, trustlines, transaction history&lt;/p&gt;

&lt;p&gt;WebSocket streams — live multi-token price sync, OHLC streaming, news feeds, ledger updates&lt;/p&gt;

&lt;p&gt;Free tier gets you 10 requests per second. The pro tier goes up to 500 req/sec.&lt;/p&gt;

&lt;p&gt;Build a simple token dashboard&lt;/p&gt;

&lt;p&gt;Here's a minimal example that pulls the top tokens and their 24h change:&lt;/p&gt;

&lt;p&gt;`  async function getDashboard() {&lt;br&gt;
    const res = await fetch('&lt;a href="https://api.xrpl.to/v1/tokens?limit=10'" rel="noopener noreferrer"&gt;https://api.xrpl.to/v1/tokens?limit=10'&lt;/a&gt;);&lt;br&gt;
    const { tokens } = await res.json();&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;tokens.forEach(token =&amp;gt; {
  const direction = token.change_24h &amp;gt;= 0 ? '↑' : '↓';
  console.log(
    `${token.name.padEnd(12)} $${token.price.toFixed(6)} ${direction} ${token.change_24h.toFixed(2)}%`
  );
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;getDashboard();`&lt;/p&gt;

&lt;p&gt;No Solidity. No gas fees. No contract compilation. If you can call a REST API, you can build on XRPL.&lt;/p&gt;

&lt;p&gt;Real-time data with WebSockets&lt;/p&gt;

&lt;p&gt;For live updates, xrpl.to offers WebSocket streams. You can subscribe to token price changes, new trades, and ledger events without polling:&lt;/p&gt;

&lt;p&gt;`const ws = new WebSocket('wss://api.xrpl.to/ws');&lt;/p&gt;

&lt;p&gt;ws.onopen = () =&amp;gt; {&lt;br&gt;
    ws.send(JSON.stringify({ method: 'subscribe', channels: ['tokens'] }));&lt;br&gt;
  };&lt;/p&gt;

&lt;p&gt;ws.onmessage = (event) =&amp;gt; {&lt;br&gt;
    const data = JSON.parse(event.data);&lt;br&gt;
    console.log(&lt;code&gt;${data.name}: $${data.price}&lt;/code&gt;);&lt;br&gt;
  };`&lt;/p&gt;

&lt;p&gt;Live price feeds without spinning up a node or managing infrastructure.&lt;/p&gt;

&lt;p&gt;Why this matters&lt;/p&gt;

&lt;p&gt;Five years ago, building on XRPL meant learning ripple-lib, understanding trust lines from scratch, and stitching together documentation from multiple sources. That barrier is gone.&lt;/p&gt;

&lt;p&gt;The platform has served over 61 million API requests across 162 countries. This isn't experimental — it's production infrastructure.&lt;/p&gt;

&lt;p&gt;Here's what you could realistically build in a weekend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Token price tracker or portfolio app&lt;/li&gt;
&lt;li&gt;DEX trading dashboard with live orderbook&lt;/li&gt;
&lt;li&gt;NFT collection analytics tool&lt;/li&gt;
&lt;li&gt;AMM pool monitor with yield calculations&lt;/li&gt;
&lt;li&gt;Wallet explorer with transaction history&lt;/li&gt;
&lt;li&gt;Price alert bot using WebSocket streams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real bottleneck isn't technical&lt;/p&gt;

&lt;p&gt;XRPL has a native DEX that Ethereum needs Uniswap to replicate. A native AMM that other chains need custom smart contracts for. Token issuance in one transaction instead of deploying an ERC-20. The developer tools are mature. The APIs are documented. The free tiers are generous.&lt;/p&gt;

&lt;p&gt;What the ecosystem actually lacks is visibility. Most developers have never heard of xrpl.to or seen how low the barrier to entry actually is. The &lt;a href="https://xrpl.to" rel="noopener noreferrer"&gt;XRPL community&lt;/a&gt; has been heads-down building while other ecosystems invested in marketing and content.&lt;/p&gt;

&lt;p&gt;If you've been curious about XRPL but thought it was too niche or too complicated — it's neither. Start at &lt;a href="https://xrpl.to/docs" rel="noopener noreferrer"&gt;https://xrpl.to/docs&lt;/a&gt; and see for yourself.&lt;/p&gt;

&lt;p&gt;What would you build with 232 endpoints and zero smart contract overhead?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>crypto</category>
      <category>api</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
