<?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>Forem: JayBrass</title>
    <description>The latest articles on Forem by JayBrass (@jaybrass10).</description>
    <link>https://forem.com/jaybrass10</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3837443%2F89837c27-b28f-4feb-8193-77faa6a0432a.jpg</url>
      <title>Forem: JayBrass</title>
      <link>https://forem.com/jaybrass10</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jaybrass10"/>
    <language>en</language>
    <item>
      <title>How I Built a Real-Time DeFi Trading Dashboard with Pyth Network in One Week</title>
      <dc:creator>JayBrass</dc:creator>
      <pubDate>Sat, 21 Mar 2026 18:31:58 +0000</pubDate>
      <link>https://forem.com/jaybrass10/how-i-built-a-real-time-defi-trading-dashboard-with-pyth-network-in-one-week-3mgk</link>
      <guid>https://forem.com/jaybrass10/how-i-built-a-real-time-defi-trading-dashboard-with-pyth-network-in-one-week-3mgk</guid>
      <description>&lt;p&gt;How I Built a Real-Time DeFi Trading Dashboard with Pyth Network in One Week&lt;/p&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;I recently built PythVision — a real-time DeFi analytics and trading dashboard powered by Pyth Network price feeds and Entropy V2. In this article, I'll walk you through how I integrated Pyth's powerful oracle network into a full-stack Next.js application.&lt;/p&gt;

&lt;p&gt;🌐 Live Demo: &lt;a href="https://pythvision.vercel.app" rel="noopener noreferrer"&gt;https://pythvision.vercel.app&lt;/a&gt;&lt;br&gt;
💻 GitHub: &lt;a href="https://github.com/08106549427/pythvision" rel="noopener noreferrer"&gt;https://github.com/08106549427/pythvision&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What is Pyth Network?&lt;/p&gt;

&lt;p&gt;Pyth Network is a decentralized oracle protocol that provides real-time financial market data for DeFi applications. Unlike traditional oracles, Pyth delivers high-fidelity price feeds directly from institutional-grade data sources with sub-second update speeds.&lt;/p&gt;

&lt;p&gt;Pyth offers two key products I used in PythVision:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Price Feeds — Real-time prices for crypto, forex, and commodities&lt;/li&gt;
&lt;li&gt;Entropy V2 — Verifiable on-chain randomness&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What I Built — PythVision&lt;/p&gt;

&lt;p&gt;PythVision is a full DeFi platform with:&lt;/p&gt;

&lt;p&gt;📊 Live Price Dashboard — Real-time BTC, ETH, SOL, BNB, POL prices&lt;br&gt;
🕯️ Candlestick Charts — TradingView powered live charts&lt;br&gt;
💹 Trading Interface — Buy/Sell with wallet connection&lt;br&gt;
💼 Portfolio Tracker — Track positions and PnL&lt;br&gt;
🔔 Price Alerts — Set price targets stored in Supabase&lt;br&gt;
🎲 Entropy V2 Challenges — On-chain randomness trading challenges&lt;br&gt;
🌈 Wallet Connection — RainbowKit + Wagmi&lt;/p&gt;

&lt;p&gt;Tech Stack&lt;/p&gt;

&lt;p&gt;Frontend: Next.js 16, TypeScript, Tailwind CSS&lt;br&gt;
Oracle: Pyth Network Hermes SDK&lt;br&gt;
Randomness: Pyth Entropy V2&lt;br&gt;
Charts: TradingView Lightweight Charts&lt;br&gt;
Wallet: RainbowKit + Wagmi&lt;br&gt;
Database: Supabase&lt;br&gt;
Deployment: Vercel&lt;/p&gt;

&lt;p&gt;Step 1 — Integrating Pyth Price Feeds&lt;/p&gt;

&lt;p&gt;The first thing I built was the price feed integration using Pyth's Hermes client.&lt;/p&gt;

&lt;p&gt;Install the SDK&lt;/p&gt;

&lt;p&gt;npm install @pythnetwork/hermes-client&lt;/p&gt;

&lt;p&gt;Set Up Price Feed IDs&lt;/p&gt;

&lt;p&gt;Each asset has a unique feed ID on Pyth Network:&lt;/p&gt;

&lt;p&gt;const FEEDS = {&lt;br&gt;
  "BTC/USD": "0xe62df6c8b4a85fe1a67db44dc12de5db330f7ac66b72dc658afedf0f4a415b43",&lt;br&gt;
  "ETH/USD": "0xff61491a931112ddf1bd8147cd1b641375f79f5825126d665480874634fd0ace",&lt;br&gt;
  "SOL/USD": "0xef0d8b6fda2ceba41da15d4095d1da392a0d2f8ed0c6c7bc0f4cfac8c280b56d",&lt;br&gt;
  "BNB/USD": "0x2f95862b045670cd22bee3114c39763a4a08beeb663b145d283c31d7d1101c4f",&lt;br&gt;
  "POL/USD": "0x3fa4252848f9f0a1480be62745a4629d9eb1322aebab8a791e344b3b9c1adcf5",&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;Fetch Live Prices&lt;/p&gt;

&lt;p&gt;const fetchPrices = async () =&amp;gt; {&lt;br&gt;
  const symbols = Object.keys(FEEDS);&lt;br&gt;
  const ids = Object.values(FEEDS);&lt;br&gt;
  const query = ids.map(id =&amp;gt; &lt;code&gt;ids[]=${id}&lt;/code&gt;).join("&amp;amp;");&lt;br&gt;
  const url = &lt;code&gt;https://hermes.pyth.network/api/latest_price_feeds?${query}&lt;/code&gt;;&lt;/p&gt;

&lt;p&gt;const response = await fetch(url);&lt;br&gt;
  const data = await response.json();&lt;/p&gt;

&lt;p&gt;data.forEach((item, i) =&amp;gt; {&lt;br&gt;
    const price = Number(item.price.price) * Math.pow(10, item.price.expo);&lt;br&gt;
    console.log(&lt;code&gt;${symbols[i]}: $${price}&lt;/code&gt;);&lt;br&gt;
  });&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;Key Insight&lt;/p&gt;

&lt;p&gt;One thing I learned the hard way — the POL/USD feed ID changed when MATIC was rebranded to POL. Always verify feed IDs at &lt;a href="https://pyth.network/developers/price-feed-ids" rel="noopener noreferrer"&gt;https://pyth.network/developers/price-feed-ids&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2 — Building A React Context For Prices&lt;/p&gt;

&lt;p&gt;To avoid multiple components creating separate price streams, I created a shared React Context:&lt;/p&gt;

&lt;p&gt;export function PriceProvider({ children }) {&lt;br&gt;
  const [prices, setPrices] = useState({});&lt;br&gt;
  const [loading, setLoading] = useState(true);&lt;/p&gt;

&lt;p&gt;useEffect(() =&amp;gt; {&lt;br&gt;
    fetchPrices();&lt;br&gt;
    const interval = setInterval(fetchPrices, 3000);&lt;br&gt;
    return () =&amp;gt; clearInterval(interval);&lt;br&gt;
  }, []);&lt;/p&gt;

&lt;p&gt;return (&lt;br&gt;
    &lt;br&gt;
      {children}&lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;This way all components share the same price data updated every 3 seconds!&lt;/p&gt;

&lt;p&gt;Step 3 — Integrating Pyth Entropy V2&lt;/p&gt;

&lt;p&gt;Entropy V2 is Pyth's on-chain randomness solution. I used it to power "Trading Challenges" — random trading games for users.&lt;/p&gt;

&lt;p&gt;The Smart Contract&lt;/p&gt;

&lt;p&gt;// SPDX-License-Identifier: Apache-2.0&lt;br&gt;
pragma solidity ^0.8.19;&lt;/p&gt;

&lt;p&gt;contract TradingChallenge {&lt;br&gt;
    address private entropyAddress;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function requestChallenge(uint8 challengeType) external payable {
    (bool feeSuccess, bytes memory feeData) = entropyAddress.staticcall(
        abi.encodeWithSignature("getFeeV2()")
    );
    uint256 fee = abi.decode(feeData, (uint256));

    (bool success, bytes memory data) = entropyAddress.call{value: fee}(
        abi.encodeWithSignature("requestV2(uint32)", uint32(500000))
    );
    uint64 sequenceNumber = abi.decode(data, (uint64));
}

function entropyCallback(
    uint64 sequenceNumber,
    address,
    bytes32 randomNumber
) external {
    require(msg.sender == entropyAddress, "Only entropy");
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

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

&lt;p&gt;Key Features of Entropy V2&lt;br&gt;
No need to provide your own random number&lt;br&gt;
Keeper network automatically delivers randomness&lt;br&gt;
Custom gas limits for callbacks&lt;br&gt;
More reliable during unstable chain conditions&lt;/p&gt;

&lt;p&gt;Step 4 — Wallet Connection with RainbowKit&lt;/p&gt;

&lt;p&gt;npm install @rainbow-me/rainbowkit wagmi &lt;a href="mailto:viem@2.x"&gt;viem@2.x&lt;/a&gt; @tanstack/react-query&lt;/p&gt;

&lt;p&gt;export function Providers({ children }) {&lt;br&gt;
  return (&lt;br&gt;
    &lt;br&gt;
      &lt;br&gt;
        &lt;br&gt;
          {children}&lt;br&gt;
        &lt;br&gt;
      &lt;br&gt;
    &lt;br&gt;
  );&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;Step 5 — Price Alerts with Supabase&lt;/p&gt;

&lt;p&gt;I used Supabase to store price alerts persistently:&lt;/p&gt;

&lt;p&gt;const createAlert = async (asset, targetPrice, condition) =&amp;gt; {&lt;br&gt;
  const { data, error } = await supabase&lt;br&gt;
    .from("price_alerts")&lt;br&gt;
    .insert([{ wallet_address, asset, target_price: targetPrice, condition }]);&lt;br&gt;
};&lt;/p&gt;

&lt;p&gt;When a price hits the target, the app triggers a browser notification!&lt;/p&gt;

&lt;p&gt;Challenges I Faced&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;POL/USD Feed ID&lt;br&gt;
MATIC was rebranded to POL — the old feed ID returned 404 errors.&lt;br&gt;
Solution: Always check the latest feed IDs at pyth.network&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multiple Wallet Extensions&lt;br&gt;
Having MetaMask, Rabby, and other wallets installed caused window.ethereum conflicts locally.&lt;br&gt;
Solution: This only happens in development — production works fine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Price Context Sharing&lt;br&gt;
Multiple components were creating separate price streams.&lt;br&gt;
Solution: Created a shared React Context that all components use.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Results&lt;/p&gt;

&lt;p&gt;PythVision is now live at &lt;a href="https://pythvision.vercel.app" rel="noopener noreferrer"&gt;https://pythvision.vercel.app&lt;/a&gt; with:&lt;br&gt;
Real-time prices updating every 3 seconds&lt;br&gt;
Full wallet integration&lt;br&gt;
Price alerts stored in database&lt;br&gt;
Trading challenges powered by Entropy V2&lt;/p&gt;

&lt;p&gt;What's Next&lt;/p&gt;

&lt;p&gt;Deploy TradingChallenge contract to Base mainnet&lt;br&gt;
Add Pyth Pro for institutional-grade data&lt;br&gt;
Add more assets and trading pairs&lt;br&gt;
Mobile app version&lt;/p&gt;

&lt;p&gt;Resources&lt;/p&gt;

&lt;p&gt;Pyth Network Docs: &lt;a href="https://docs.pyth.network" rel="noopener noreferrer"&gt;https://docs.pyth.network&lt;/a&gt;&lt;br&gt;
Pyth Price Feed IDs: &lt;a href="https://pyth.network/developers/price-feed-ids" rel="noopener noreferrer"&gt;https://pyth.network/developers/price-feed-ids&lt;/a&gt;&lt;br&gt;
Entropy V2 Docs: &lt;a href="https://docs.pyth.network/entropy" rel="noopener noreferrer"&gt;https://docs.pyth.network/entropy&lt;/a&gt;&lt;br&gt;
GitHub Repository: &lt;a href="https://github.com/08106549427/pythvision" rel="noopener noreferrer"&gt;https://github.com/08106549427/pythvision&lt;/a&gt;&lt;br&gt;
Live Demo: &lt;a href="https://pythvision.vercel.app" rel="noopener noreferrer"&gt;https://pythvision.vercel.app&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built for the Pyth Playground Community Hackathon 2026&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr0rhr6pbmwdlztr56xhc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr0rhr6pbmwdlztr56xhc.png" alt=" " width="800" height="29"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1fbf3qzwf23rwp915zpi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1fbf3qzwf23rwp915zpi.png" alt=" " width="800" height="396"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvdhoq55zo8k129bsfni5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvdhoq55zo8k129bsfni5.png" alt=" " width="800" height="396"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl45ujjgcg9gd5y0o2736.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl45ujjgcg9gd5y0o2736.png" alt=" " width="800" height="396"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc6o4w9v00zytktupugyl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc6o4w9v00zytktupugyl.png" alt=" " width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>defi</category>
      <category>blockchain</category>
      <category>webdev</category>
      <category>nextjs</category>
    </item>
  </channel>
</rss>
