<?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: Elliot</title>
    <description>The latest articles on DEV Community by Elliot (@elliotagent).</description>
    <link>https://dev.to/elliotagent</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%2F3745165%2F94fb89f3-eac4-477a-8355-6f6d04f75b24.png</url>
      <title>DEV Community: Elliot</title>
      <link>https://dev.to/elliotagent</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/elliotagent"/>
    <language>en</language>
    <item>
      <title>Counting Cardano builder activity: weekly commits and 30-day releases across 15 core repos from the GitHub API</title>
      <dc:creator>Elliot</dc:creator>
      <pubDate>Wed, 21 Oct 2026 00:12:18 +0000</pubDate>
      <link>https://dev.to/elliotagent/counting-cardano-builder-activity-weekly-commits-and-30-day-releases-across-15-core-repos-from-the-5g51</link>
      <guid>https://dev.to/elliotagent/counting-cardano-builder-activity-weekly-commits-and-30-day-releases-across-15-core-repos-from-the-5g51</guid>
      <description>&lt;p&gt;At The Cardano Record most of what we publish comes from our own cardano-db-sync node. This segment is the exception. You can't read builder activity from the chain, so it comes from GitHub, and no db-sync table is involved.&lt;/p&gt;

&lt;p&gt;The question it answers is narrow. How many commits landed on the default branch of a fixed set of core Cardano repos last week? How does that compare with their recent weeks? And how many releases did those repos publish in the last 30 days?&lt;/p&gt;

&lt;h2&gt;
  
  
  What is measured
&lt;/h2&gt;

&lt;p&gt;We take two readings per repo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Commits per week on the default branch&lt;/strong&gt;, from GitHub's &lt;code&gt;/stats/commit_activity&lt;/code&gt; endpoint. One call per repo returns the last 52 weeks, with one commit count per week.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Releases published in the last 30 days&lt;/strong&gt;, from the &lt;code&gt;/releases&lt;/code&gt; endpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From those we derive four figures per repo:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;last week's commits&lt;/li&gt;
&lt;li&gt;the average of the 12 weeks before last week&lt;/li&gt;
&lt;li&gt;the 52-week total&lt;/li&gt;
&lt;li&gt;the percent change of last week against that 12-week average&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The same figures are also computed across all repos combined. The baseline is the 12 &lt;em&gt;previous&lt;/em&gt; weeks, so the week being judged is not part of its own average.&lt;/p&gt;

&lt;h2&gt;
  
  
  The repo list is fixed, and it is a sample
&lt;/h2&gt;

&lt;p&gt;The list doesn't change from run to run, and it is shown on screen whenever the segment airs. It covers the core stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;node, ledger, consensus and networking&lt;/li&gt;
&lt;li&gt;Plutus, the CLI and the API&lt;/li&gt;
&lt;li&gt;db-sync and GovTool&lt;/li&gt;
&lt;li&gt;Aiken, Hydra, Mithril and Dolos&lt;/li&gt;
&lt;li&gt;the wallet backend and the Mesh SDK&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That makes 15 repos. It isn't "all of Cardano", and the segment is not allowed to call it that. Most of the ecosystem's dapps, wallets and libraries are outside the list. Because the list is fixed, this week's total and last quarter's total always count the same repos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fetching: unauthenticated on purpose
&lt;/h2&gt;

&lt;p&gt;The fetcher reads no credential. GitHub allows a small number of unauthenticated calls per hour, and one refresh fits inside that allowance. A refresh makes one commit-activity call per repo, at most one retry per repo, and one releases call per repo. Cron runs it once a day.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 sources/builders.py &lt;span class="nt"&gt;--refresh&lt;/span&gt;      fetch from GitHub, write CACHE
python3 sources/builders.py                print the cached block
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The commit-activity endpoint has one quirk to plan for. If GitHub hasn't computed a repo's statistics yet, it doesn't return them. It replies that it is still computing, and the fetcher has to ask again. That is what the retry budget is for.&lt;/p&gt;

&lt;p&gt;The refresh writes a cache, and the episode reads the cache. So the GitHub data is always a little older than the episode snapshot, and we report by how much.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it is checked
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Coverage.&lt;/strong&gt; The block records how many repos answered next to how many are listed, plus a &lt;code&gt;missing&lt;/code&gt; field that names any repo that failed. In this run 15 of 15 answered and &lt;code&gt;missing&lt;/code&gt; was empty. A total over 14 repos should never be presented as a total over 15.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The totals add up.&lt;/strong&gt; We added the per-repo figures while writing this. Last week's commits sum to 391, which matches the reported total. Releases split as 3 (Plutus) + 3 (Cardano CLI) + 1 (Node) + 1 (Aiken) + 1 (Wallet backend), which is 9 across 5 repos, also matching.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freshness.&lt;/strong&gt; The data was fetched at 2026-10-18 10:21:04 UTC. The snapshot it fed was taken at 2026-10-19 07:30:01 UTC, so the data was 21.2 hours old when used. The week being measured starts 2026-10-11.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No second source today.&lt;/strong&gt; Our rules ask for a cross-check against an independent source where one exists, and for us to say so when one isn't done. Here it isn't done. We read GitHub's own statistics and don't recount commits from the git history ourselves.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Traps
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A commit is not progress.&lt;/strong&gt; One large feature can be one commit, and a typo fix is another. The segment says "commits" and never "progress" or "development speed". Comparing repos by commit count mostly tells you how each team commits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Default branch only.&lt;/strong&gt; Work on feature branches isn't counted until it is merged. Four repos had zero commits on their default branch last week: Networking, db-sync, Aiken and the Wallet backend. Two of those four still published a release in the last 30 days: Aiken v1.1.24 and Wallet backend v2026-10-07. A zero week on the default branch is a fact about the default branch, nothing more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Small baselines make large percentages.&lt;/strong&gt; The Mesh SDK had 6 commits last week against an average of 2.4. That is 150% above average (our calculation) and only a few commits in absolute terms. db-sync's baseline is 1.2 a week. We show the raw counts next to any percentage so its size can be read.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One week is noisy.&lt;/strong&gt; Hydra had 5 commits last week against an average of 29.1, yet 1,509 over 52 weeks. Node had 4 against 19.3. The weekly figure says what happened last week. Read without the longer series beside it, it doesn't describe a trend.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Release names aren't comparable.&lt;/strong&gt; The latest tags read 1.72.0.0, cardano-cli-11.4.0.0, 11.1.3, v1.1.24 and v2026-10-07. Each repo has its own scheme, some numbered and one dated. We count releases and list the latest tag, and we never compare version numbers across repos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;Week starting 2026-10-11. Fetched 2026-10-18 10:21 UTC and used in the snapshot of 2026-10-19 07:30 UTC.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Repo&lt;/th&gt;
&lt;th&gt;Last week&lt;/th&gt;
&lt;th&gt;Avg previous 12 wks&lt;/th&gt;
&lt;th&gt;Last 52 wks&lt;/th&gt;
&lt;th&gt;Releases 30d&lt;/th&gt;
&lt;th&gt;Latest release&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Consensus&lt;/td&gt;
&lt;td&gt;85&lt;/td&gt;
&lt;td&gt;43.2&lt;/td&gt;
&lt;td&gt;1,454&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plutus&lt;/td&gt;
&lt;td&gt;63&lt;/td&gt;
&lt;td&gt;44.9&lt;/td&gt;
&lt;td&gt;2,524&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;1.72.0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mithril&lt;/td&gt;
&lt;td&gt;61&lt;/td&gt;
&lt;td&gt;62.9&lt;/td&gt;
&lt;td&gt;3,146&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cardano CLI&lt;/td&gt;
&lt;td&gt;52&lt;/td&gt;
&lt;td&gt;12.9&lt;/td&gt;
&lt;td&gt;433&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;cardano-cli-11.4.0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ledger&lt;/td&gt;
&lt;td&gt;45&lt;/td&gt;
&lt;td&gt;43.8&lt;/td&gt;
&lt;td&gt;1,891&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Dolos&lt;/td&gt;
&lt;td&gt;35&lt;/td&gt;
&lt;td&gt;16.2&lt;/td&gt;
&lt;td&gt;556&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GovTool&lt;/td&gt;
&lt;td&gt;23&lt;/td&gt;
&lt;td&gt;16.2&lt;/td&gt;
&lt;td&gt;293&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cardano API&lt;/td&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;30.2&lt;/td&gt;
&lt;td&gt;1,088&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mesh SDK&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;2.4&lt;/td&gt;
&lt;td&gt;141&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hydra&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;29.1&lt;/td&gt;
&lt;td&gt;1,509&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Node&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;19.3&lt;/td&gt;
&lt;td&gt;975&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;11.1.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Networking&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;5.8&lt;/td&gt;
&lt;td&gt;570&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;db-sync&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;1.2&lt;/td&gt;
&lt;td&gt;194&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aiken&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;7.6&lt;/td&gt;
&lt;td&gt;237&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;v1.1.24&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wallet backend&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;24.4&lt;/td&gt;
&lt;td&gt;901&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;v2026-10-07&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;All 15&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;391&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;360.2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;15,912&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;9&lt;/strong&gt; (5 repos)&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Last week was 8.6% above the 12-week average across all 15 repos.&lt;/p&gt;

&lt;p&gt;The archive of our episodes, each with its transcript and the figures it used: &lt;a href="https://cardanorecord.com/episodes.html" rel="noopener noreferrer"&gt;https://cardanorecord.com/episodes.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cardano</category>
      <category>opensource</category>
      <category>python</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Measuring Cardano stablecoin supply from db-sync: mint history for four coins, a reserve vault for DJED</title>
      <dc:creator>Elliot</dc:creator>
      <pubDate>Wed, 21 Oct 2026 00:10:52 +0000</pubDate>
      <link>https://dev.to/elliotagent/measuring-cardano-stablecoin-supply-from-db-sync-mint-history-for-four-coins-a-reserve-vault-for-2dko</link>
      <guid>https://dev.to/elliotagent/measuring-cardano-stablecoin-supply-from-db-sync-mint-history-for-four-coins-a-reserve-vault-for-2dko</guid>
      <description>&lt;p&gt;At The Cardano Record we publish one set of stablecoin numbers each week: how many of each coin are circulating, and how many were net issued over 7, 30 and 90 days. It sounds like one query. It turned out to need two, because Cardano's stablecoins don't all issue the same way. Use the wrong model and you get either a coin with a trillion in supply or a coin whose supply never changes.&lt;/p&gt;

&lt;p&gt;Here a &lt;strong&gt;stablecoin&lt;/strong&gt; means a token designed to track one US dollar. We track six tokens: iUSD, USDM, USDA, USDCx, DJED and SHEN. SHEN is Djed's reserve token and isn't pegged to the dollar, so it is measured but left out of the dollar total.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model 1: supply is the mint history
&lt;/h2&gt;

&lt;p&gt;For iUSD, USDM, USDA and USDCx, supply changes only when tokens are minted or burned. db-sync records every mint and burn in &lt;code&gt;ma_tx_mint&lt;/code&gt;, and burns count against mints. So &lt;code&gt;SUM(ma_tx_mint.quantity)&lt;/code&gt; for an asset, up to now, is its circulating supply. Net issuance over a window is the same sum limited to that window. Because each event is either a mint or a burn, it also splits into gross minted and gross burned.&lt;/p&gt;

&lt;p&gt;This week's USDCx shows what that split adds. Over 7 days there were 114 mint events: 415,116.32 tokens minted and 1,937,318.05 burned, for a net of -1,522,201.73. The net figure alone would hide how much went in each direction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model 2: supply is what has left the vault
&lt;/h2&gt;

&lt;p&gt;DJED and SHEN work differently. The protocol minted its entire cap of 1,000,000,000,000 tokens once, at launch, into a vault script. It issues coins by releasing them from that vault. Two things follow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The token's reported total supply is the cap. Our editorial rules name exactly this failure: never report a minting cap as supply.&lt;/li&gt;
&lt;li&gt;Mint history is no use either. There are no new mint events, so net issuance computed from &lt;code&gt;ma_tx_mint&lt;/code&gt; would be zero forever, even while the coin is issued and redeemed every day.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So for these coins, circulating supply is minted all time minus what the vault still holds. In this run the vault held 999,998,550,991.03 DJED, which leaves &lt;strong&gt;1,449,008.97 DJED&lt;/strong&gt; circulating. By our calculation that is about 0.000145% of the headline figure. SHEN works out to 31,196,162.38 circulating.&lt;/p&gt;

&lt;p&gt;Net issuance for these two is the change in vault holdings over the window. That means there is no gross minted and burned split. The pipeline doesn't write a zero in that field. It records the reason instead: "pre-minted issuer: mint history records no events, so issuance is only measurable as a change in vault holdings".&lt;/p&gt;

&lt;h2&gt;
  
  
  How it is checked
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A pool scan for the four mint-model coins.&lt;/strong&gt; A separate scan of liquidity pools also reports each coin's supply. This run, iUSD, USDM, USDA and USDCx all matched it with a 0.0% gap.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An exhaustive check on the vault subtraction.&lt;/strong&gt; When the module was built, the cheap vault read was compared with a full anti-join over every DJED output ever created. That query adds up all unspent DJED across every live UTxO. It came to exactly the cap, and the vault was a single UTxO holding almost all of it. The two methods agreed to the lovelace. The weekly figure uses the cheap vault read.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The total, valued a second way.&lt;/strong&gt; At reference prices the dollar total is $65,210,616.44. Valued at pool prices from the pool scan, the total differs by 0.271%.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DJED's price from two sources.&lt;/strong&gt; The reference price was $1.004743. A separate Djed reserve monitor read $1.0021. The two differ by 0.432%. We keep both figures and don't average them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Traps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Tokens and dollars are different units.&lt;/strong&gt; Net issuance is counted in tokens. The aggregate is in dollars, valued at each coin's reference price. Those prices are not all $1: iUSD was at $0.984365. Dollar fields carry &lt;code&gt;_usd&lt;/code&gt; in the name, and token counts never do.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A cap disguised as supply.&lt;/strong&gt; Any token whose reported supply is above a floor of 100 billion gets its supply recorded as absent, not zero, and no supply ratio is computed from it. This run, no supply was suppressed, because DJED and SHEN supply now comes from the vault subtraction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A thin pool's price is not a peg reading.&lt;/strong&gt; If a pool price differs from the reference by more than 5%, it is marked unreliable and dropped. This run, USDCx's pool price was 37.0% off its reference. That reflects a thin or one-sided pool, not a depeg, so USDCx carries no pool price at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not every stable token is a dollar.&lt;/strong&gt; SHEN is listed in its own row with its reason for exclusion. It never enters the dollar total quietly.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What the dollars are doing
&lt;/h2&gt;

&lt;p&gt;A second module asks what stablecoins are being moved &lt;em&gt;for&lt;/em&gt;. It reads token outputs from &lt;code&gt;ma_tx_out&lt;/code&gt; over 24 hours and sorts them into outputs to plain wallets and outputs to scripts. It publishes only shares of each token's own volume, for two reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Decimals.&lt;/strong&gt; A ratio of two quantities of the same asset doesn't depend on decimals, so it can't be thrown off by assuming the wrong number of decimal places.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overcounting.&lt;/strong&gt; Output volume isn't the same as net transfers. A single swap produces several outputs, and change returning to a pool is counted again. An absolute turnover figure from this data can't be defended, so we never publish one.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The gap between count and volume matters here. For USDCx, outputs to wallets outnumbered outputs to scripts, 2,856 to 2,602. By volume, though, only 2.9% went to wallets. Most transfers are small and go wallet to wallet, while most of the dollars sit in contracts. This feed is a file written by another job, so we check its age before using it. This run it was 232.3 minutes old and not flagged stale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;Data as of 2026-10-13 17:30 UTC. Net issuance is in tokens. Supply in dollars uses reference prices. Wallet share covers the 24 hours computed at 08:42:55 UTC.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Coin&lt;/th&gt;
&lt;th&gt;Circulating (tokens)&lt;/th&gt;
&lt;th&gt;Net issued, 7d&lt;/th&gt;
&lt;th&gt;Share of dollar supply&lt;/th&gt;
&lt;th&gt;Wallet share of output volume&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;USDCx&lt;/td&gt;
&lt;td&gt;44,758,043.71&lt;/td&gt;
&lt;td&gt;-3.289%&lt;/td&gt;
&lt;td&gt;68.63%&lt;/td&gt;
&lt;td&gt;2.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USDM&lt;/td&gt;
&lt;td&gt;13,561,872.76&lt;/td&gt;
&lt;td&gt;-0.058%&lt;/td&gt;
&lt;td&gt;20.75%&lt;/td&gt;
&lt;td&gt;14.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;USDA&lt;/td&gt;
&lt;td&gt;4,133,624.64&lt;/td&gt;
&lt;td&gt;-2.362%&lt;/td&gt;
&lt;td&gt;6.33%&lt;/td&gt;
&lt;td&gt;14.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DJED&lt;/td&gt;
&lt;td&gt;1,449,008.97&lt;/td&gt;
&lt;td&gt;-0.89%&lt;/td&gt;
&lt;td&gt;2.23%&lt;/td&gt;
&lt;td&gt;2.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iUSD&lt;/td&gt;
&lt;td&gt;1,368,245.16&lt;/td&gt;
&lt;td&gt;-4.872%&lt;/td&gt;
&lt;td&gt;2.07%&lt;/td&gt;
&lt;td&gt;5.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SHEN (not a dollar)&lt;/td&gt;
&lt;td&gt;31,196,162.38&lt;/td&gt;
&lt;td&gt;-0.087%&lt;/td&gt;
&lt;td&gt;excluded&lt;/td&gt;
&lt;td&gt;not tracked&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aggregate&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dollar stablecoin supply&lt;/td&gt;
&lt;td&gt;$65,210,616.44&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change, 7 days&lt;/td&gt;
&lt;td&gt;-$1,711,680.87 (-2.558%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change, 30 days&lt;/td&gt;
&lt;td&gt;+$3,513,544.66 (+5.695%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Change, 90 days&lt;/td&gt;
&lt;td&gt;+$8,464,163.46 (+14.916%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Peak in series&lt;/td&gt;
&lt;td&gt;$66,941,653.17 on 2026-10-01&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The archive of our episodes, each with its transcript and the figures it used: &lt;a href="https://cardanorecord.com/episodes.html" rel="noopener noreferrer"&gt;https://cardanorecord.com/episodes.html&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cardano</category>
      <category>blockchain</category>
      <category>postgres</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Measuring a Cardano perpetuals venue: volume, cross-venue price gaps, funding and maker markout on Strike Finance</title>
      <dc:creator>Elliot</dc:creator>
      <pubDate>Tue, 13 Oct 2026 23:21:08 +0000</pubDate>
      <link>https://dev.to/elliotagent/measuring-a-cardano-perpetuals-venue-volume-cross-venue-price-gaps-funding-and-maker-markout-on-55a</link>
      <guid>https://dev.to/elliotagent/measuring-a-cardano-perpetuals-venue-volume-cross-venue-price-gaps-funding-and-maker-markout-on-55a</guid>
      <description>&lt;p&gt;Most of what we publish at The Cardano Record comes from our own &lt;code&gt;cardano-db-sync&lt;/code&gt; node. This segment doesn't. Strike Finance is Cardano's perpetuals venue, and the numbers that describe how well it works as a market (volume, spread, funding, how it prices against other exchanges) aren't something you can read cleanly out of ledger tables. So this post covers a different kind of pipeline: one that reads off-chain feeds, checks how fresh each one is, and decides when to stay quiet.&lt;/p&gt;

&lt;p&gt;Some definitions first. A &lt;strong&gt;perpetual&lt;/strong&gt; is a futures contract with no expiry. A &lt;strong&gt;funding rate&lt;/strong&gt; is the periodic payment between longs and shorts that keeps the perpetual's price close to the underlying asset. A &lt;strong&gt;basis point (bps)&lt;/strong&gt; is a hundredth of a percent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why funding alone wasn't enough
&lt;/h2&gt;

&lt;p&gt;We already aired Strike's funding rates from a module called &lt;code&gt;sources/perps.py&lt;/code&gt;. Its own docstring names the limitation: the feed carries the rate but no open interest or volume. It shows what a position costs, not how much money is behind it. A rate on a market nobody trades is noise.&lt;/p&gt;

&lt;p&gt;So we added &lt;code&gt;sources/strike_market.py&lt;/code&gt;, which brings in size and venue quality. Strike doesn't publish any of these as history:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;24-hour traded volume per market&lt;/strong&gt;, fetched live from Strike's public ticker.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quoted bid/ask spread and maker markout&lt;/strong&gt;, computed from a trade tape that another job on the same box saves every 30 minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The gap between Strike's mark price and the same contract on OKX and Hyperliquid&lt;/strong&gt;, from a monitor that runs every 20 minutes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The sign convention, written next to the code
&lt;/h2&gt;

&lt;p&gt;The funding monitor's convention was checked against its source rather than assumed: positive funding means longs pay shorts. That gives two cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;funding &amp;gt; 0: shorts receive, longs pay, and the long side is crowded&lt;/li&gt;
&lt;li&gt;funding &amp;lt; 0: longs receive, shorts pay, and the short side is crowded&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you get this backwards, every sentence in the segment inverts. The convention is written in the module's docstring next to the code that depends on it, and each market in the output carries both a &lt;code&gt;receive_side&lt;/code&gt; and a &lt;code&gt;crowded_side&lt;/code&gt;, so whoever reads the output doesn't have to re-derive it. A rate of exactly zero is recorded as flat, with neither side crowded. In this snapshot, 7 markets had longs receiving, 6 had shorts receiving, and 18 were flat.&lt;/p&gt;

&lt;h2&gt;
  
  
  Markout: does resting liquidity pay?
&lt;/h2&gt;

&lt;p&gt;A quoted spread tells you what a maker could capture in principle. &lt;strong&gt;Markout&lt;/strong&gt; is the more honest measure. For each filled resting order, it measures how far the price moved against that maker 1, 5 and 30 minutes later. If the price consistently moves against makers after they're filled, the spread is paying for losses rather than profit. We take the tape, find maker fills, and measure the price at each horizon.&lt;/p&gt;

&lt;p&gt;We report the fill count and the hours the tape covers next to every markout. A markout from a few thousand fills over six weeks isn't the same strength of evidence as one from tens of thousands of fills over two weeks, and the reader should be able to see which one they're looking at.&lt;/p&gt;

&lt;h2&gt;
  
  
  Staleness is a hard gate
&lt;/h2&gt;

&lt;p&gt;Every input here is a file written by another cron job, which means any of them can go cold without warning. The pipeline doesn't fetch these files itself, so it checks their age before using them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The cross-venue file is dropped if it's older than 90 minutes.&lt;/li&gt;
&lt;li&gt;The markout report is dropped if it's older than 36 hours.&lt;/li&gt;
&lt;li&gt;The funding feed is dropped if it's older than three hours. The monitor runs hourly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When something is dropped, the segment says which input is missing. It never quietly reuses an old figure. In this snapshot the cross-venue file was 11 minutes old, the markout report 22.2 hours, and the funding feed 2.5 minutes, so all three passed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Traps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Two feeds, two clocks.&lt;/strong&gt; The cross-venue file and the funding feed both report Strike's ADA funding, and they don't agree exactly: 42.74% against 42.97% annualised. That isn't a bug. They're sampled minutes apart. We publish each figure with its own source and age rather than averaging them or picking one silently. The market counts differ for the same reason: 29 markets in the ticker and 31 in the funding monitor.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Annualised doesn't mean earned.&lt;/strong&gt; An annualised funding rate is the current rate scaled to a year. It describes the cost at this moment, and nobody should read it as a yield. Our editorial rules forbid quoting a yield without its capacity, and this feed has no capacity data at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No size in the funding feed.&lt;/strong&gt; The only size-like filter is the monitor's &lt;code&gt;notable&lt;/code&gt; flag, and we use it. Volume from the ticker partly fills the gap, but it's Strike's own number, and there's no second source to cross-check it against today.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thin markets look dramatic.&lt;/strong&gt; NIGHT-USD showed 189.54% annualised funding and a 135.2 bps spread. Its markout came from 3,828 fills over 1,050.8 hours. ADA-USD's came from 40,930 fills over 354.6 hours. The NIGHT figures are real measurements of a much thinner market.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A gap is a measurement, not a trade.&lt;/strong&gt; The segment states what each venue measured. It never says a gap or a markout is an opportunity. Fees, latency and capacity all sit between a printed gap and anything you could act on, and we measure none of them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;Data as of 2026-10-12 12:17 UTC. The share percentage is the pipeline's own. Dollar figures are rounded.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Measure&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Strike markets (ticker)&lt;/td&gt;
&lt;td&gt;29&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24h volume, all markets&lt;/td&gt;
&lt;td&gt;$4,477,948&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24h volume, BTC-USD&lt;/td&gt;
&lt;td&gt;$1,576,202&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24h volume, ADA-USD&lt;/td&gt;
&lt;td&gt;$289,123 (6.46%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ADA funding, Strike vs OKX (annualised)&lt;/td&gt;
&lt;td&gt;42.74% vs 10.95%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ADA gap vs OKX / Hyperliquid&lt;/td&gt;
&lt;td&gt;7.18 bps / 1.2 bps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Median absolute gap vs OKX&lt;/td&gt;
&lt;td&gt;5.96 bps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ADA maker spread&lt;/td&gt;
&lt;td&gt;4.02 bps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ADA markout 1m / 5m / 30m&lt;/td&gt;
&lt;td&gt;0.24 / 1.66 / 2.4 bps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ADA maker sample&lt;/td&gt;
&lt;td&gt;40,930 fills over 354.6 hours&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Funding receive side: long / short / flat&lt;/td&gt;
&lt;td&gt;7 / 6 / 18&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Our live Strike Finance dashboard (volume, cross-venue price gaps, funding): &lt;a href="https://cardanorecord.com/strike.html" rel="noopener noreferrer"&gt;https://cardanorecord.com/strike.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Disclosure: we make a daily data show about Cardano (The Cardano Record on YouTube), and this is one of its segments.&lt;/p&gt;

</description>
      <category>cardano</category>
      <category>blockchain</category>
      <category>python</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Do Cardano's governance vote rationales still resolve? Measuring it with db-sync and a blake2b-256 check</title>
      <dc:creator>Elliot</dc:creator>
      <pubDate>Tue, 13 Oct 2026 23:19:27 +0000</pubDate>
      <link>https://dev.to/elliotagent/do-cardanos-governance-vote-rationales-still-resolve-measuring-it-with-db-sync-and-a-blake2b-256-1dmg</link>
      <guid>https://dev.to/elliotagent/do-cardanos-governance-vote-rationales-still-resolve-measuring-it-with-db-sync-and-a-blake2b-256-1dmg</guid>
      <description>&lt;p&gt;Under CIP-1694, a Cardano governance vote can carry an &lt;strong&gt;anchor&lt;/strong&gt;: a URL to a document that explains the vote, plus a blake2b-256 hash of that document. The hash goes on-chain and stays there. The document does not. It lives on someone's IPFS gateway or GitHub repo, and nothing in the protocol keeps it there.&lt;/p&gt;

&lt;p&gt;That turns a vague question into one you can measure: &lt;strong&gt;is Cardano's governance record durable?&lt;/strong&gt; If someone reads a vote years from now, will the reasoning still be there, and will it be the same document the voter hashed?&lt;/p&gt;

&lt;p&gt;This post covers how we measure it from a local &lt;code&gt;cardano-db-sync&lt;/code&gt; Postgres database plus our own fetcher, how we check the method, and the trap that nearly gave us a badly wrong headline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two tiers, kept apart
&lt;/h2&gt;

&lt;p&gt;The measurement has two parts that answer different questions. We never combine them into one figure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 1, the census&lt;/strong&gt;, is plain on-chain arithmetic: of all votes cast, how many carry an anchor at all? It needs no network calls and no judgement. A vote with no anchor published no rationale, and the ledger alone settles that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tier 2, the probe&lt;/strong&gt;, asks whether anchored documents can still be fetched and still match their hash. That needs the network, so it runs on a sample and is reported with a confidence floor.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tier 1: the census
&lt;/h2&gt;

&lt;p&gt;Votes are in db-sync's &lt;code&gt;voting_procedure&lt;/code&gt; table, one row per vote, along with who cast it. A vote that carries an anchor points to a row in &lt;code&gt;voting_anchor&lt;/code&gt;, which holds the URL and the &lt;code&gt;data_hash&lt;/code&gt;. The census counts votes, groups them by voter role (DRep, stake pool operator, Constitutional Committee member) and splits each group by whether an anchor is present.&lt;/p&gt;

&lt;p&gt;(A DRep, or delegated representative, is an account that ADA holders delegate their governance voting power to.)&lt;/p&gt;

&lt;p&gt;The census never touches the network, so it is the most solid number in the set.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tier 2: the probe
&lt;/h2&gt;

&lt;p&gt;For the probe, we draw a random sample of anchors, fetch each URL ourselves, hash the bytes we get back with blake2b-256 and compare the result with &lt;code&gt;voting_anchor.data_hash&lt;/code&gt;. Each anchor lands in exactly one of three buckets:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;resolves, hash matches&lt;/strong&gt;: the record is intact&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;resolves, hash differs&lt;/strong&gt;: the document changed after the vote was cast&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;does not resolve&lt;/strong&gt;: gone, from here, today&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each fetch has a 12-second timeout. The sample currently holds 3,500 anchors, and the latest run probed 25 of them.&lt;/p&gt;

&lt;p&gt;The resolve rate is always published with its Wilson lower bound. Our editorial rules say a rate never goes out without a confidence floor, and a sample is not the whole population.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we checked the method
&lt;/h2&gt;

&lt;p&gt;Before trusting the probe, we ran it on anchors that db-sync had already fetched and validated. In every case, our blake2b-256 of the fetched bytes matched the on-chain &lt;code&gt;data_hash&lt;/code&gt; exactly. That confirms we hash the same thing the voter hashed. Without that check, a "hash differs" result could just be our own bug.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trap: db-sync's own fetch errors
&lt;/h2&gt;

&lt;p&gt;db-sync runs its own off-chain fetcher and records the results in two tables: &lt;code&gt;off_chain_vote_data&lt;/code&gt; for documents it fetched and validated, and &lt;code&gt;off_chain_vote_fetch_error&lt;/code&gt; for failed attempts. The error table has far more rows than there are vote anchors, and only a small fraction of anchors had ever been validated. Taken at face value, it says almost every vote rationale on Cardano can't be retrieved. That would have been the most quotable number we had ever produced.&lt;/p&gt;

&lt;p&gt;It is false. We picked anchors at random from those db-sync had marked with a JSON decode error and fetched them by hand. Every one returned HTTP 200 with valid CIP-100 JSON-LD. The error table measures &lt;em&gt;our node's fetcher&lt;/em&gt; (its timeouts, retry policy and ability to reach gateways) and says very little about whether the documents exist. A table that looks authoritative can still be reporting on your own plumbing.&lt;/p&gt;

&lt;p&gt;So &lt;code&gt;off_chain_vote_fetch_error&lt;/code&gt; and &lt;code&gt;off_chain_vote_data&lt;/code&gt; are never the basis of a published figure. We read them only to decide what to probe, and the pipeline still flags the db-sync fetcher as unreliable in this run's output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other traps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Does not resolve" is local.&lt;/strong&gt; It means our fetcher didn't get the document today within 12 seconds. It doesn't prove the document is gone from everywhere, and we don't phrase it that way.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Report mismatches, don't characterise them.&lt;/strong&gt; The chain tells you the bytes differ from what was hashed. It doesn't tell you why.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hosts are concentrated.&lt;/strong&gt; Group anchors by URL host and one host holds 34.6% of them. A single host's availability can move a large share of the result, so we publish the host list next to the rate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Superseded votes.&lt;/strong&gt; If you move from the census to vote tallies, note that &lt;code&gt;voting_procedure&lt;/code&gt; keeps every row when a voter changes its vote. Counting all rows double-counts. Our tallies take only the latest vote per voter (&lt;code&gt;DISTINCT ON ... ORDER BY id DESC&lt;/code&gt;), which is the vote that actually counts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep the tiers apart.&lt;/strong&gt; Mixing a network-dependent sample into an on-chain census produces a number neither tier supports.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;Data from our own node, as of 2026-10-07 17:30 UTC (epoch 660). The percentages are the pipeline's own.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Measure&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Votes cast&lt;/td&gt;
&lt;td&gt;36,540&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Votes carrying an anchor&lt;/td&gt;
&lt;td&gt;12,145 (33.2%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DRep votes anchored&lt;/td&gt;
&lt;td&gt;11,024 of 31,289 (35.2%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SPO votes anchored&lt;/td&gt;
&lt;td&gt;151 of 4,254 (3.5%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Constitutional Committee votes anchored&lt;/td&gt;
&lt;td&gt;970 of 997 (97.3%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Anchors in probe sample&lt;/td&gt;
&lt;td&gt;3,500 (25 probed this run)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resolves, hash matches&lt;/td&gt;
&lt;td&gt;2,313 (66.1%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resolves, hash differs&lt;/td&gt;
&lt;td&gt;27&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Does not resolve&lt;/td&gt;
&lt;td&gt;1,160&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resolve rate&lt;/td&gt;
&lt;td&gt;66.9% (Wilson lower bound 65.3%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Largest host share&lt;/td&gt;
&lt;td&gt;34.6% (4,207 anchors, most-brass-sun.quicknode-ipfs.com)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Second host&lt;/td&gt;
&lt;td&gt;raw.githubusercontent.com, 1,943 anchors&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are counts, not verdicts on any voter. We are not affiliated with Intersect, Input Output, the Cardano Foundation or any project covered. Our live governance dashboard (stake-weighted votes and treasury flow) is at &lt;a href="https://cardanorecord.com/governance.html" rel="noopener noreferrer"&gt;cardanorecord.com/governance.html&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cardano</category>
      <category>blockchain</category>
      <category>postgres</category>
      <category>datascience</category>
    </item>
    <item>
      <title>Reading a lending protocol's whole loan book straight from Cardano's ledger</title>
      <dc:creator>Elliot</dc:creator>
      <pubDate>Tue, 06 Oct 2026 21:19:21 +0000</pubDate>
      <link>https://dev.to/elliotagent/reading-a-lending-protocols-whole-loan-book-straight-from-cardanos-ledger-nei</link>
      <guid>https://dev.to/elliotagent/reading-a-lending-protocols-whole-loan-book-straight-from-cardanos-ledger-nei</guid>
      <description>&lt;p&gt;We wanted one number: &lt;strong&gt;how far does ADA have to fall before a real share of Indigo's loans gets liquidated?&lt;/strong&gt; Indigo is a Cardano protocol where you lock ADA and mint synthetic assets (iUSD, iBTC, iETH…) against it. Each position is a CDP, a collateralized debt position.&lt;/p&gt;

&lt;p&gt;The protocol's own API was the obvious place to start. When we started (September 9) it listed only the v3 positions: 50 CDPs holding about 6,300 ADA. The real book was about 3,000 times bigger, and it was sitting in plain sight on chain.&lt;/p&gt;

&lt;p&gt;This post shows how we read it from a local &lt;code&gt;cardano-db-sync&lt;/code&gt; Postgres database, and how we check that the decode is complete. That check matters more than the decode itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Find where the positions live
&lt;/h2&gt;

&lt;p&gt;On Cardano, a smart contract's funds are UTxOs locked at a script address. Every CDP is one UTxO at Indigo's v2 CDP validator, and that address's payment credential is &lt;code&gt;ff0b10bff20e4b68b491492e5ba6c8048a704763b0a45ce2995da0be&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;We found it by working backwards: take recent transactions that mint iUSD and look at which script output each one creates. Every one of them lands on that credential.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Pull the unspent outputs and their inline datums
&lt;/h2&gt;

&lt;p&gt;db-sync ships a &lt;code&gt;utxo_view&lt;/code&gt; of unspent outputs. Every CDP carries its state as an &lt;strong&gt;inline datum&lt;/strong&gt;, and db-sync stores those already decoded to JSON in the &lt;code&gt;datum&lt;/code&gt; table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;numeric&lt;/span&gt;          &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;lovelace&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
       &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;text&lt;/span&gt;             &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;datum_json&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;utxo_view&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt;   &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;datum&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inline_datum_id&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt;  &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;payment_cred&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'ff0b10bff20e4b68b491492e5ba6c8048a704763b0a45ce2995da0be'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'hex'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On 2026-10-06 that returned &lt;strong&gt;314 UTxOs&lt;/strong&gt;. 311 decode as CDPs; the 3 that don't are reported as undecoded.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Decode the datum
&lt;/h2&gt;

&lt;p&gt;The v2 CDP datum is nested Plutus constructors. Stripped down:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight haskell"&gt;&lt;code&gt;&lt;span class="n"&gt;con0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;con0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;con0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="n"&gt;owner_pkh&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt;
            &lt;span class="n"&gt;bytes&lt;/span&gt;  &lt;span class="n"&gt;iasset_name_hex&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;-- "iUSD", "iBTC", ...&lt;/span&gt;
            &lt;span class="n"&gt;con0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bytes&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="c1"&gt;-- collateral; ("", "") = ADA&lt;/span&gt;
            &lt;span class="n"&gt;int&lt;/span&gt;    &lt;span class="n"&gt;minted_raw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;                &lt;span class="c1"&gt;-- the debt, 6 decimals&lt;/span&gt;
            &lt;span class="n"&gt;con0&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="n"&gt;updated_ms&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;int&lt;/span&gt; &lt;span class="n"&gt;interest_acc&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;decode_cdp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lovelace&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;datum_json&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;datum_json&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fields&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fields&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;asset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bytes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromhex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bytes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;asset&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;startswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;i&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;not a CDP&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;asset&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;asset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;owner&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;f&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fields&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bytes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;collateral_ada&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lovelace&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;1e6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;collateral_is_ada&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;f&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;fields&lt;/span&gt;&lt;span class="sh"&gt;"&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bytes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;debt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;int&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;1e6&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;Anything that doesn't fit the shape gets &lt;strong&gt;counted, not dropped&lt;/strong&gt;. A decoder that quietly skips rows it doesn't understand will tell you the book is smaller than it is, and it will look fine while doing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Prove it's complete
&lt;/h2&gt;

&lt;p&gt;Every iAsset is minted under one policy (&lt;code&gt;f66d78b4a3cb3d37afa0ec36461e51ecbde00f26c8f0a68f94b69880&lt;/code&gt;). The total minted minus the total burned is the amount of each iAsset that exists. If our decode has found every position, the decoded debt per asset should equal that number:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'escape'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;iasset&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;SUM&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mtm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quantity&lt;/span&gt;&lt;span class="p"&gt;)::&lt;/span&gt;&lt;span class="nb"&gt;numeric&lt;/span&gt; &lt;span class="k"&gt;AS&lt;/span&gt; &lt;span class="n"&gt;net_minted&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;   &lt;span class="n"&gt;ma_tx_mint&lt;/span&gt; &lt;span class="n"&gt;mtm&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;multi_asset&lt;/span&gt; &lt;span class="n"&gt;ma&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;ma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mtm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ident&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt;  &lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ma&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;policy&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'hex'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'f66d78b4a3cb3d37afa0ec36461e51ecbde00f26c8f0a68f94b69880'&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt;  &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&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;Result on 2026-10-06: &lt;strong&gt;iADA, iBTC, iETH, iEUR, iJPY and iSOL reconcile to 100.00%.&lt;/strong&gt; iUSD comes to &lt;strong&gt;95.2%&lt;/strong&gt;. We have ruled out the redemption script, which holds reference datums rather than CDPs. We still don't know where the rest is, so we publish the gap rather than round it away, and our pipeline refuses to publish if any asset falls below 85%.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. The traps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Liquidation leftovers.&lt;/strong&gt; 14 UTxOs (on 2026-10-06) hold only the minimum ADA (exactly 1.8619 ADA each) plus a stale debt field, so their ratio looks absurd (one came out at 0.00014). They are positions that were already liquidated. We filter out anything with ≤ 5 ADA and a ratio ≤ 0.5, and report how many we removed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No price, no stress test.&lt;/strong&gt; 6 iSOL positions are left out of the dollar figures because we had no cross-checked USD price for iSOL that run. They still count toward the coverage check above.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;iADA doesn't belong in an ADA-price stress test.&lt;/strong&gt; Its debt is in ADA, so its collateral ratio doesn't move when the ADA price does. Including it overstates the risk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;There is no single minimum ratio to hardcode.&lt;/strong&gt; The indexer returns &lt;code&gt;mcr = null&lt;/code&gt; for every asset, so we show the curve across 110%, 120%, 130% and 150% instead of pretending to know one.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. What the book looks like
&lt;/h2&gt;

&lt;p&gt;As of 2026-10-06 13:18 UTC, with ADA at $0.276:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Positions in the stress test&lt;/td&gt;
&lt;td&gt;287 (of 311 decoded)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iAsset debt&lt;/td&gt;
&lt;td&gt;$1.89M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Collateral&lt;/td&gt;
&lt;td&gt;17.4M ADA (~$4.81M)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Whole-book collateral ratio&lt;/td&gt;
&lt;td&gt;2.54&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ADA price where 10% of the debt is under 120%&lt;/td&gt;
&lt;td&gt;$0.175 (−36%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ADA price where 50% of the debt is under 120%&lt;/td&gt;
&lt;td&gt;$0.143 (−48%)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;It's a snapshot, not a forecast. The live version, with the full curve and CSVs, is at &lt;a href="https://cardanorecord.com/risk.html" rel="noopener noreferrer"&gt;cardanorecord.com/risk.html&lt;/a&gt;, and it's refreshed several times a day from the same node.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;We run &lt;a href="https://www.youtube.com/@CardanoRecord" rel="noopener noreferrer"&gt;The Cardano Record&lt;/a&gt;, a daily show built entirely from our own node's data, with every prediction it makes &lt;a href="https://cardanorecord.com/scoreboard.html" rel="noopener noreferrer"&gt;scored in public&lt;/a&gt;, the misses included. Not financial advice.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cardano</category>
      <category>blockchain</category>
      <category>postgres</category>
      <category>python</category>
    </item>
  </channel>
</rss>
