Read HNT oracle price on-chain in the HNT-to-DC simulator - #2082

Open
jthiller wants to merge 2 commits into
mainfrom
claude/helium-pr-1207-review-hmetmv
Open

Read HNT oracle price on-chain in the HNT-to-DC simulator#2082
jthiller wants to merge 2 commits into
mainfrom
claude/helium-pr-1207-review-hmetmv

Conversation

@jthiller

@jthillerjthiller commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

What

Rewrites the live-price source for the HNT→DC calculator on /tokens/data-credit:

  • src/theme/HntToDcSimulator.jsx no longer opens a WebSocket to hermes.pyth.network. It now subscribes to the keyless heliumtools.org HNT price stream over SSE (EventSource, native reconnect): one snapshot on connect, then a frame only when the price changes. The widget displays the stream's oracle.usd — the on-chain Pyth price the Data Credits program reads.
  • Fallback: if the stream errors before ever delivering a price, the widget does a single one-time Solana RPC read of the same oracle — it resolves the current oracle address from the on-chain DataCreditsV0 account and parses the Pyth PriceUpdateV2 account directly — so the price still renders with no standing third-party dependency beyond the stream.
  • Removes @pythnetwork/price-service-client (this widget was its only consumer) and regenerates yarn.lock.
  • One-sentence prose touch on docs/tokens/data-credit.mdx to say the price comes from the on-chain Pyth feed used by the Data Credits program.

UI, CSS, and labels are unchanged.

Why

Pyth's unauthenticated Hermes endpoint stops serving keyless traffic on 2026-08-18. After that date the widget's live price would silently die — liveHntPrice stays 0 and the "Set Live Oracle Price" button never renders, with no visible error.

Streaming keeps Solana RPC load at zero in the steady state (no per-tab polling), while the on-chain fallback keeps the widget self-sufficient if the stream is unreachable. Both paths track oracle rotations automatically: the stream serves whatever account DataCreditsV0 points at, and the fallback resolves that pointer itself — which is how the widget already followed the helium/helium-program-library#1207 cutover (old 4Ddm…J33 → new He5m…89A5, executed on mainnet) with no docs change.

Notes for reviewers

  • Failure mode is unchanged: if neither the stream nor the fallback yields a price, the live-price button stays hidden and the simulator slider still works — identical to today's degraded behavior.
  • The fallback parser fails closed: it verifies the account's feed ID against the known HNT/USD feed (0x649f…9756) and rejects anything that doesn't match, so a layout drift can't render a garbage price.
  • Payloads are handled defensively: the stream's spot block can be null; the widget type-checks oracle.usd before applying it, and a fallback response can't overwrite a fresher stream price that arrived while the RPC read was in flight.
  • Verified: live-tested in a browser — stream path renders the price instantly with 0 RPC calls; pointing the stream at a dead URL fired exactly one 2-call RPC fallback that rendered the identical price (both paths read the same oracle account). Byte offsets confirmed empirically against mainnet. yarn build and Prettier pass.

🤖 Generated with Claude Code

Pyth's unauthenticated Hermes endpoint (hermes.pyth.network) stops serving
keyless traffic on 2026-08-18, which would silently kill the live price in
the /tokens/data-credit calculator. Instead of streaming from Hermes, the
widget now polls Solana RPC every 30s: it resolves the current oracle from
the on-chain DataCreditsV0 account (so it follows oracle rotations like
helium/helium-program-library#1207 automatically) and parses the Pyth
PriceUpdateV2 account directly. Any parse or fetch failure falls back to
the existing behavior of hiding the live-price button.
Removes the now-unused @pythnetwork/price-service-client dependency.
Polling Solana RPC from every open docs tab puts avoidable load on the
RPC proxy. The widget now subscribes to the heliumtools.org HNT price
stream (SSE: one snapshot on connect, then a frame only when the price
changes) and uses its on-chain oracle value. If the stream errors before
ever delivering a price, the widget falls back to a single Solana RPC
read of the same oracle account, so the price still renders with no
standing dependency beyond the stream.
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying heliumdocs with Cloudflare Pages Cloudflare Pages

Latest commit:63948a2
Status: ✅ Deploy successful!
Preview URL:https://5d772e23.heliumdocs.pages.dev
Branch Preview URL:https://claude-helium-pr-1207-review.heliumdocs.pages.dev

View logs

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jthiller
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Read HNT oracle price on-chain in the HNT-to-DC simulator - #2082

Open
jthiller wants to merge 2 commits into
mainfrom
claude/helium-pr-1207-review-hmetmv
Open

Read HNT oracle price on-chain in the HNT-to-DC simulator#2082
jthiller wants to merge 2 commits into
mainfrom
claude/helium-pr-1207-review-hmetmv

Conversation

@jthiller

@jthillerjthiller commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

What

Rewrites the live-price source for the HNT→DC calculator on /tokens/data-credit:

  • src/theme/HntToDcSimulator.jsx no longer opens a WebSocket to hermes.pyth.network. It now subscribes to the keyless heliumtools.org HNT price stream over SSE (EventSource, native reconnect): one snapshot on connect, then a frame only when the price changes. The widget displays the stream's oracle.usd — the on-chain Pyth price the Data Credits program reads.
  • Fallback: if the stream errors before ever delivering a price, the widget does a single one-time Solana RPC read of the same oracle — it resolves the current oracle address from the on-chain DataCreditsV0 account and parses the Pyth PriceUpdateV2 account directly — so the price still renders with no standing third-party dependency beyond the stream.
  • Removes @pythnetwork/price-service-client (this widget was its only consumer) and regenerates yarn.lock.
  • One-sentence prose touch on docs/tokens/data-credit.mdx to say the price comes from the on-chain Pyth feed used by the Data Credits program.

UI, CSS, and labels are unchanged.

Why

Pyth's unauthenticated Hermes endpoint stops serving keyless traffic on 2026-08-18. After that date the widget's live price would silently die — liveHntPrice stays 0 and the "Set Live Oracle Price" button never renders, with no visible error.

Streaming keeps Solana RPC load at zero in the steady state (no per-tab polling), while the on-chain fallback keeps the widget self-sufficient if the stream is unreachable. Both paths track oracle rotations automatically: the stream serves whatever account DataCreditsV0 points at, and the fallback resolves that pointer itself — which is how the widget already followed the helium/helium-program-library#1207 cutover (old 4Ddm…J33 → new He5m…89A5, executed on mainnet) with no docs change.

Notes for reviewers

  • Failure mode is unchanged: if neither the stream nor the fallback yields a price, the live-price button stays hidden and the simulator slider still works — identical to today's degraded behavior.
  • The fallback parser fails closed: it verifies the account's feed ID against the known HNT/USD feed (0x649f…9756) and rejects anything that doesn't match, so a layout drift can't render a garbage price.
  • Payloads are handled defensively: the stream's spot block can be null; the widget type-checks oracle.usd before applying it, and a fallback response can't overwrite a fresher stream price that arrived while the RPC read was in flight.
  • Verified: live-tested in a browser — stream path renders the price instantly with 0 RPC calls; pointing the stream at a dead URL fired exactly one 2-call RPC fallback that rendered the identical price (both paths read the same oracle account). Byte offsets confirmed empirically against mainnet. yarn build and Prettier pass.

🤖 Generated with Claude Code

Pyth's unauthenticated Hermes endpoint (hermes.pyth.network) stops serving
keyless traffic on 2026-08-18, which would silently kill the live price in
the /tokens/data-credit calculator. Instead of streaming from Hermes, the
widget now polls Solana RPC every 30s: it resolves the current oracle from
the on-chain DataCreditsV0 account (so it follows oracle rotations like
helium/helium-program-library#1207 automatically) and parses the Pyth
PriceUpdateV2 account directly. Any parse or fetch failure falls back to
the existing behavior of hiding the live-price button.
Removes the now-unused @pythnetwork/price-service-client dependency.
Polling Solana RPC from every open docs tab puts avoidable load on the
RPC proxy. The widget now subscribes to the heliumtools.org HNT price
stream (SSE: one snapshot on connect, then a frame only when the price
changes) and uses its on-chain oracle value. If the stream errors before
ever delivering a price, the widget falls back to a single Solana RPC
read of the same oracle account, so the price still renders with no
standing dependency beyond the stream.
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying heliumdocs with Cloudflare Pages Cloudflare Pages

Latest commit:63948a2
Status: ✅ Deploy successful!
Preview URL:https://5d772e23.heliumdocs.pages.dev
Branch Preview URL:https://claude-helium-pr-1207-review.heliumdocs.pages.dev

View logs

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jthiller
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Read HNT oracle price on-chain in the HNT-to-DC simulator - #2082

Open
jthiller wants to merge 2 commits into
mainfrom
claude/helium-pr-1207-review-hmetmv
Open

Read HNT oracle price on-chain in the HNT-to-DC simulator#2082
jthiller wants to merge 2 commits into
mainfrom
claude/helium-pr-1207-review-hmetmv

Conversation

@jthiller

@jthillerjthiller commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

What

Rewrites the live-price source for the HNT→DC calculator on /tokens/data-credit:

  • src/theme/HntToDcSimulator.jsx no longer opens a WebSocket to hermes.pyth.network. It now subscribes to the keyless heliumtools.org HNT price stream over SSE (EventSource, native reconnect): one snapshot on connect, then a frame only when the price changes. The widget displays the stream's oracle.usd — the on-chain Pyth price the Data Credits program reads.
  • Fallback: if the stream errors before ever delivering a price, the widget does a single one-time Solana RPC read of the same oracle — it resolves the current oracle address from the on-chain DataCreditsV0 account and parses the Pyth PriceUpdateV2 account directly — so the price still renders with no standing third-party dependency beyond the stream.
  • Removes @pythnetwork/price-service-client (this widget was its only consumer) and regenerates yarn.lock.
  • One-sentence prose touch on docs/tokens/data-credit.mdx to say the price comes from the on-chain Pyth feed used by the Data Credits program.

UI, CSS, and labels are unchanged.

Why

Pyth's unauthenticated Hermes endpoint stops serving keyless traffic on 2026-08-18. After that date the widget's live price would silently die — liveHntPrice stays 0 and the "Set Live Oracle Price" button never renders, with no visible error.

Streaming keeps Solana RPC load at zero in the steady state (no per-tab polling), while the on-chain fallback keeps the widget self-sufficient if the stream is unreachable. Both paths track oracle rotations automatically: the stream serves whatever account DataCreditsV0 points at, and the fallback resolves that pointer itself — which is how the widget already followed the helium/helium-program-library#1207 cutover (old 4Ddm…J33 → new He5m…89A5, executed on mainnet) with no docs change.

Notes for reviewers

  • Failure mode is unchanged: if neither the stream nor the fallback yields a price, the live-price button stays hidden and the simulator slider still works — identical to today's degraded behavior.
  • The fallback parser fails closed: it verifies the account's feed ID against the known HNT/USD feed (0x649f…9756) and rejects anything that doesn't match, so a layout drift can't render a garbage price.
  • Payloads are handled defensively: the stream's spot block can be null; the widget type-checks oracle.usd before applying it, and a fallback response can't overwrite a fresher stream price that arrived while the RPC read was in flight.
  • Verified: live-tested in a browser — stream path renders the price instantly with 0 RPC calls; pointing the stream at a dead URL fired exactly one 2-call RPC fallback that rendered the identical price (both paths read the same oracle account). Byte offsets confirmed empirically against mainnet. yarn build and Prettier pass.

🤖 Generated with Claude Code

Pyth's unauthenticated Hermes endpoint (hermes.pyth.network) stops serving
keyless traffic on 2026-08-18, which would silently kill the live price in
the /tokens/data-credit calculator. Instead of streaming from Hermes, the
widget now polls Solana RPC every 30s: it resolves the current oracle from
the on-chain DataCreditsV0 account (so it follows oracle rotations like
helium/helium-program-library#1207 automatically) and parses the Pyth
PriceUpdateV2 account directly. Any parse or fetch failure falls back to
the existing behavior of hiding the live-price button.
Removes the now-unused @pythnetwork/price-service-client dependency.
Polling Solana RPC from every open docs tab puts avoidable load on the
RPC proxy. The widget now subscribes to the heliumtools.org HNT price
stream (SSE: one snapshot on connect, then a frame only when the price
changes) and uses its on-chain oracle value. If the stream errors before
ever delivering a price, the widget falls back to a single Solana RPC
read of the same oracle account, so the price still renders with no
standing dependency beyond the stream.
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying heliumdocs with Cloudflare Pages Cloudflare Pages

Latest commit:63948a2
Status: ✅ Deploy successful!
Preview URL:https://5d772e23.heliumdocs.pages.dev
Branch Preview URL:https://claude-helium-pr-1207-review.heliumdocs.pages.dev

View logs

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jthiller
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Read HNT oracle price on-chain in the HNT-to-DC simulator - #2082

Open
jthiller wants to merge 2 commits into
mainfrom
claude/helium-pr-1207-review-hmetmv
Open

Read HNT oracle price on-chain in the HNT-to-DC simulator#2082
jthiller wants to merge 2 commits into
mainfrom
claude/helium-pr-1207-review-hmetmv

Conversation

@jthiller

@jthillerjthiller commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

What

Rewrites the live-price source for the HNT→DC calculator on /tokens/data-credit:

  • src/theme/HntToDcSimulator.jsx no longer opens a WebSocket to hermes.pyth.network. It now subscribes to the keyless heliumtools.org HNT price stream over SSE (EventSource, native reconnect): one snapshot on connect, then a frame only when the price changes. The widget displays the stream's oracle.usd — the on-chain Pyth price the Data Credits program reads.
  • Fallback: if the stream errors before ever delivering a price, the widget does a single one-time Solana RPC read of the same oracle — it resolves the current oracle address from the on-chain DataCreditsV0 account and parses the Pyth PriceUpdateV2 account directly — so the price still renders with no standing third-party dependency beyond the stream.
  • Removes @pythnetwork/price-service-client (this widget was its only consumer) and regenerates yarn.lock.
  • One-sentence prose touch on docs/tokens/data-credit.mdx to say the price comes from the on-chain Pyth feed used by the Data Credits program.

UI, CSS, and labels are unchanged.

Why

Pyth's unauthenticated Hermes endpoint stops serving keyless traffic on 2026-08-18. After that date the widget's live price would silently die — liveHntPrice stays 0 and the "Set Live Oracle Price" button never renders, with no visible error.

Streaming keeps Solana RPC load at zero in the steady state (no per-tab polling), while the on-chain fallback keeps the widget self-sufficient if the stream is unreachable. Both paths track oracle rotations automatically: the stream serves whatever account DataCreditsV0 points at, and the fallback resolves that pointer itself — which is how the widget already followed the helium/helium-program-library#1207 cutover (old 4Ddm…J33 → new He5m…89A5, executed on mainnet) with no docs change.

Notes for reviewers

  • Failure mode is unchanged: if neither the stream nor the fallback yields a price, the live-price button stays hidden and the simulator slider still works — identical to today's degraded behavior.
  • The fallback parser fails closed: it verifies the account's feed ID against the known HNT/USD feed (0x649f…9756) and rejects anything that doesn't match, so a layout drift can't render a garbage price.
  • Payloads are handled defensively: the stream's spot block can be null; the widget type-checks oracle.usd before applying it, and a fallback response can't overwrite a fresher stream price that arrived while the RPC read was in flight.
  • Verified: live-tested in a browser — stream path renders the price instantly with 0 RPC calls; pointing the stream at a dead URL fired exactly one 2-call RPC fallback that rendered the identical price (both paths read the same oracle account). Byte offsets confirmed empirically against mainnet. yarn build and Prettier pass.

🤖 Generated with Claude Code

Pyth's unauthenticated Hermes endpoint (hermes.pyth.network) stops serving
keyless traffic on 2026-08-18, which would silently kill the live price in
the /tokens/data-credit calculator. Instead of streaming from Hermes, the
widget now polls Solana RPC every 30s: it resolves the current oracle from
the on-chain DataCreditsV0 account (so it follows oracle rotations like
helium/helium-program-library#1207 automatically) and parses the Pyth
PriceUpdateV2 account directly. Any parse or fetch failure falls back to
the existing behavior of hiding the live-price button.
Removes the now-unused @pythnetwork/price-service-client dependency.
Polling Solana RPC from every open docs tab puts avoidable load on the
RPC proxy. The widget now subscribes to the heliumtools.org HNT price
stream (SSE: one snapshot on connect, then a frame only when the price
changes) and uses its on-chain oracle value. If the stream errors before
ever delivering a price, the widget falls back to a single Solana RPC
read of the same oracle account, so the price still renders with no
standing dependency beyond the stream.
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying heliumdocs with Cloudflare Pages Cloudflare Pages

Latest commit:63948a2
Status: ✅ Deploy successful!
Preview URL:https://5d772e23.heliumdocs.pages.dev
Branch Preview URL:https://claude-helium-pr-1207-review.heliumdocs.pages.dev

View logs

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jthiller
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Read HNT oracle price on-chain in the HNT-to-DC simulator - #2082

Open
jthiller wants to merge 2 commits into
mainfrom
claude/helium-pr-1207-review-hmetmv
Open

Read HNT oracle price on-chain in the HNT-to-DC simulator#2082
jthiller wants to merge 2 commits into
mainfrom
claude/helium-pr-1207-review-hmetmv

Conversation

@jthiller

@jthillerjthiller commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

What

Rewrites the live-price source for the HNT→DC calculator on /tokens/data-credit:

  • src/theme/HntToDcSimulator.jsx no longer opens a WebSocket to hermes.pyth.network. It now subscribes to the keyless heliumtools.org HNT price stream over SSE (EventSource, native reconnect): one snapshot on connect, then a frame only when the price changes. The widget displays the stream's oracle.usd — the on-chain Pyth price the Data Credits program reads.
  • Fallback: if the stream errors before ever delivering a price, the widget does a single one-time Solana RPC read of the same oracle — it resolves the current oracle address from the on-chain DataCreditsV0 account and parses the Pyth PriceUpdateV2 account directly — so the price still renders with no standing third-party dependency beyond the stream.
  • Removes @pythnetwork/price-service-client (this widget was its only consumer) and regenerates yarn.lock.
  • One-sentence prose touch on docs/tokens/data-credit.mdx to say the price comes from the on-chain Pyth feed used by the Data Credits program.

UI, CSS, and labels are unchanged.

Why

Pyth's unauthenticated Hermes endpoint stops serving keyless traffic on 2026-08-18. After that date the widget's live price would silently die — liveHntPrice stays 0 and the "Set Live Oracle Price" button never renders, with no visible error.

Streaming keeps Solana RPC load at zero in the steady state (no per-tab polling), while the on-chain fallback keeps the widget self-sufficient if the stream is unreachable. Both paths track oracle rotations automatically: the stream serves whatever account DataCreditsV0 points at, and the fallback resolves that pointer itself — which is how the widget already followed the helium/helium-program-library#1207 cutover (old 4Ddm…J33 → new He5m…89A5, executed on mainnet) with no docs change.

Notes for reviewers

  • Failure mode is unchanged: if neither the stream nor the fallback yields a price, the live-price button stays hidden and the simulator slider still works — identical to today's degraded behavior.
  • The fallback parser fails closed: it verifies the account's feed ID against the known HNT/USD feed (0x649f…9756) and rejects anything that doesn't match, so a layout drift can't render a garbage price.
  • Payloads are handled defensively: the stream's spot block can be null; the widget type-checks oracle.usd before applying it, and a fallback response can't overwrite a fresher stream price that arrived while the RPC read was in flight.
  • Verified: live-tested in a browser — stream path renders the price instantly with 0 RPC calls; pointing the stream at a dead URL fired exactly one 2-call RPC fallback that rendered the identical price (both paths read the same oracle account). Byte offsets confirmed empirically against mainnet. yarn build and Prettier pass.

🤖 Generated with Claude Code

Pyth's unauthenticated Hermes endpoint (hermes.pyth.network) stops serving
keyless traffic on 2026-08-18, which would silently kill the live price in
the /tokens/data-credit calculator. Instead of streaming from Hermes, the
widget now polls Solana RPC every 30s: it resolves the current oracle from
the on-chain DataCreditsV0 account (so it follows oracle rotations like
helium/helium-program-library#1207 automatically) and parses the Pyth
PriceUpdateV2 account directly. Any parse or fetch failure falls back to
the existing behavior of hiding the live-price button.
Removes the now-unused @pythnetwork/price-service-client dependency.
Polling Solana RPC from every open docs tab puts avoidable load on the
RPC proxy. The widget now subscribes to the heliumtools.org HNT price
stream (SSE: one snapshot on connect, then a frame only when the price
changes) and uses its on-chain oracle value. If the stream errors before
ever delivering a price, the widget falls back to a single Solana RPC
read of the same oracle account, so the price still renders with no
standing dependency beyond the stream.
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying heliumdocs with Cloudflare Pages Cloudflare Pages

Latest commit:63948a2
Status: ✅ Deploy successful!
Preview URL:https://5d772e23.heliumdocs.pages.dev
Branch Preview URL:https://claude-helium-pr-1207-review.heliumdocs.pages.dev

View logs

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jthiller
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Read HNT oracle price on-chain in the HNT-to-DC simulator - #2082

Open
jthiller wants to merge 2 commits into
mainfrom
claude/helium-pr-1207-review-hmetmv
Open

Read HNT oracle price on-chain in the HNT-to-DC simulator#2082
jthiller wants to merge 2 commits into
mainfrom
claude/helium-pr-1207-review-hmetmv

Conversation

@jthiller

@jthillerjthiller commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

What

Rewrites the live-price source for the HNT→DC calculator on /tokens/data-credit:

  • src/theme/HntToDcSimulator.jsx no longer opens a WebSocket to hermes.pyth.network. It now subscribes to the keyless heliumtools.org HNT price stream over SSE (EventSource, native reconnect): one snapshot on connect, then a frame only when the price changes. The widget displays the stream's oracle.usd — the on-chain Pyth price the Data Credits program reads.
  • Fallback: if the stream errors before ever delivering a price, the widget does a single one-time Solana RPC read of the same oracle — it resolves the current oracle address from the on-chain DataCreditsV0 account and parses the Pyth PriceUpdateV2 account directly — so the price still renders with no standing third-party dependency beyond the stream.
  • Removes @pythnetwork/price-service-client (this widget was its only consumer) and regenerates yarn.lock.
  • One-sentence prose touch on docs/tokens/data-credit.mdx to say the price comes from the on-chain Pyth feed used by the Data Credits program.

UI, CSS, and labels are unchanged.

Why

Pyth's unauthenticated Hermes endpoint stops serving keyless traffic on 2026-08-18. After that date the widget's live price would silently die — liveHntPrice stays 0 and the "Set Live Oracle Price" button never renders, with no visible error.

Streaming keeps Solana RPC load at zero in the steady state (no per-tab polling), while the on-chain fallback keeps the widget self-sufficient if the stream is unreachable. Both paths track oracle rotations automatically: the stream serves whatever account DataCreditsV0 points at, and the fallback resolves that pointer itself — which is how the widget already followed the helium/helium-program-library#1207 cutover (old 4Ddm…J33 → new He5m…89A5, executed on mainnet) with no docs change.

Notes for reviewers

  • Failure mode is unchanged: if neither the stream nor the fallback yields a price, the live-price button stays hidden and the simulator slider still works — identical to today's degraded behavior.
  • The fallback parser fails closed: it verifies the account's feed ID against the known HNT/USD feed (0x649f…9756) and rejects anything that doesn't match, so a layout drift can't render a garbage price.
  • Payloads are handled defensively: the stream's spot block can be null; the widget type-checks oracle.usd before applying it, and a fallback response can't overwrite a fresher stream price that arrived while the RPC read was in flight.
  • Verified: live-tested in a browser — stream path renders the price instantly with 0 RPC calls; pointing the stream at a dead URL fired exactly one 2-call RPC fallback that rendered the identical price (both paths read the same oracle account). Byte offsets confirmed empirically against mainnet. yarn build and Prettier pass.

🤖 Generated with Claude Code

Pyth's unauthenticated Hermes endpoint (hermes.pyth.network) stops serving
keyless traffic on 2026-08-18, which would silently kill the live price in
the /tokens/data-credit calculator. Instead of streaming from Hermes, the
widget now polls Solana RPC every 30s: it resolves the current oracle from
the on-chain DataCreditsV0 account (so it follows oracle rotations like
helium/helium-program-library#1207 automatically) and parses the Pyth
PriceUpdateV2 account directly. Any parse or fetch failure falls back to
the existing behavior of hiding the live-price button.
Removes the now-unused @pythnetwork/price-service-client dependency.
Polling Solana RPC from every open docs tab puts avoidable load on the
RPC proxy. The widget now subscribes to the heliumtools.org HNT price
stream (SSE: one snapshot on connect, then a frame only when the price
changes) and uses its on-chain oracle value. If the stream errors before
ever delivering a price, the widget falls back to a single Solana RPC
read of the same oracle account, so the price still renders with no
standing dependency beyond the stream.
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying heliumdocs with Cloudflare Pages Cloudflare Pages

Latest commit:63948a2
Status: ✅ Deploy successful!
Preview URL:https://5d772e23.heliumdocs.pages.dev
Branch Preview URL:https://claude-helium-pr-1207-review.heliumdocs.pages.dev

View logs

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jthiller
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Read HNT oracle price on-chain in the HNT-to-DC simulator - #2082

Open
jthiller wants to merge 2 commits into
mainfrom
claude/helium-pr-1207-review-hmetmv
Open

Read HNT oracle price on-chain in the HNT-to-DC simulator#2082
jthiller wants to merge 2 commits into
mainfrom
claude/helium-pr-1207-review-hmetmv

Conversation

@jthiller

@jthillerjthiller commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

What

Rewrites the live-price source for the HNT→DC calculator on /tokens/data-credit:

  • src/theme/HntToDcSimulator.jsx no longer opens a WebSocket to hermes.pyth.network. It now subscribes to the keyless heliumtools.org HNT price stream over SSE (EventSource, native reconnect): one snapshot on connect, then a frame only when the price changes. The widget displays the stream's oracle.usd — the on-chain Pyth price the Data Credits program reads.
  • Fallback: if the stream errors before ever delivering a price, the widget does a single one-time Solana RPC read of the same oracle — it resolves the current oracle address from the on-chain DataCreditsV0 account and parses the Pyth PriceUpdateV2 account directly — so the price still renders with no standing third-party dependency beyond the stream.
  • Removes @pythnetwork/price-service-client (this widget was its only consumer) and regenerates yarn.lock.
  • One-sentence prose touch on docs/tokens/data-credit.mdx to say the price comes from the on-chain Pyth feed used by the Data Credits program.

UI, CSS, and labels are unchanged.

Why

Pyth's unauthenticated Hermes endpoint stops serving keyless traffic on 2026-08-18. After that date the widget's live price would silently die — liveHntPrice stays 0 and the "Set Live Oracle Price" button never renders, with no visible error.

Streaming keeps Solana RPC load at zero in the steady state (no per-tab polling), while the on-chain fallback keeps the widget self-sufficient if the stream is unreachable. Both paths track oracle rotations automatically: the stream serves whatever account DataCreditsV0 points at, and the fallback resolves that pointer itself — which is how the widget already followed the helium/helium-program-library#1207 cutover (old 4Ddm…J33 → new He5m…89A5, executed on mainnet) with no docs change.

Notes for reviewers

  • Failure mode is unchanged: if neither the stream nor the fallback yields a price, the live-price button stays hidden and the simulator slider still works — identical to today's degraded behavior.
  • The fallback parser fails closed: it verifies the account's feed ID against the known HNT/USD feed (0x649f…9756) and rejects anything that doesn't match, so a layout drift can't render a garbage price.
  • Payloads are handled defensively: the stream's spot block can be null; the widget type-checks oracle.usd before applying it, and a fallback response can't overwrite a fresher stream price that arrived while the RPC read was in flight.
  • Verified: live-tested in a browser — stream path renders the price instantly with 0 RPC calls; pointing the stream at a dead URL fired exactly one 2-call RPC fallback that rendered the identical price (both paths read the same oracle account). Byte offsets confirmed empirically against mainnet. yarn build and Prettier pass.

🤖 Generated with Claude Code

Pyth's unauthenticated Hermes endpoint (hermes.pyth.network) stops serving
keyless traffic on 2026-08-18, which would silently kill the live price in
the /tokens/data-credit calculator. Instead of streaming from Hermes, the
widget now polls Solana RPC every 30s: it resolves the current oracle from
the on-chain DataCreditsV0 account (so it follows oracle rotations like
helium/helium-program-library#1207 automatically) and parses the Pyth
PriceUpdateV2 account directly. Any parse or fetch failure falls back to
the existing behavior of hiding the live-price button.
Removes the now-unused @pythnetwork/price-service-client dependency.
Polling Solana RPC from every open docs tab puts avoidable load on the
RPC proxy. The widget now subscribes to the heliumtools.org HNT price
stream (SSE: one snapshot on connect, then a frame only when the price
changes) and uses its on-chain oracle value. If the stream errors before
ever delivering a price, the widget falls back to a single Solana RPC
read of the same oracle account, so the price still renders with no
standing dependency beyond the stream.
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying heliumdocs with Cloudflare Pages Cloudflare Pages

Latest commit:63948a2
Status: ✅ Deploy successful!
Preview URL:https://5d772e23.heliumdocs.pages.dev
Branch Preview URL:https://claude-helium-pr-1207-review.heliumdocs.pages.dev

View logs

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jthiller
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Read HNT oracle price on-chain in the HNT-to-DC simulator - #2082

Open
jthiller wants to merge 2 commits into
mainfrom
claude/helium-pr-1207-review-hmetmv
Open

Read HNT oracle price on-chain in the HNT-to-DC simulator#2082
jthiller wants to merge 2 commits into
mainfrom
claude/helium-pr-1207-review-hmetmv

Conversation

@jthiller

@jthillerjthiller commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

What

Rewrites the live-price source for the HNT→DC calculator on /tokens/data-credit:

  • src/theme/HntToDcSimulator.jsx no longer opens a WebSocket to hermes.pyth.network. It now subscribes to the keyless heliumtools.org HNT price stream over SSE (EventSource, native reconnect): one snapshot on connect, then a frame only when the price changes. The widget displays the stream's oracle.usd — the on-chain Pyth price the Data Credits program reads.
  • Fallback: if the stream errors before ever delivering a price, the widget does a single one-time Solana RPC read of the same oracle — it resolves the current oracle address from the on-chain DataCreditsV0 account and parses the Pyth PriceUpdateV2 account directly — so the price still renders with no standing third-party dependency beyond the stream.
  • Removes @pythnetwork/price-service-client (this widget was its only consumer) and regenerates yarn.lock.
  • One-sentence prose touch on docs/tokens/data-credit.mdx to say the price comes from the on-chain Pyth feed used by the Data Credits program.

UI, CSS, and labels are unchanged.

Why

Pyth's unauthenticated Hermes endpoint stops serving keyless traffic on 2026-08-18. After that date the widget's live price would silently die — liveHntPrice stays 0 and the "Set Live Oracle Price" button never renders, with no visible error.

Streaming keeps Solana RPC load at zero in the steady state (no per-tab polling), while the on-chain fallback keeps the widget self-sufficient if the stream is unreachable. Both paths track oracle rotations automatically: the stream serves whatever account DataCreditsV0 points at, and the fallback resolves that pointer itself — which is how the widget already followed the helium/helium-program-library#1207 cutover (old 4Ddm…J33 → new He5m…89A5, executed on mainnet) with no docs change.

Notes for reviewers

  • Failure mode is unchanged: if neither the stream nor the fallback yields a price, the live-price button stays hidden and the simulator slider still works — identical to today's degraded behavior.
  • The fallback parser fails closed: it verifies the account's feed ID against the known HNT/USD feed (0x649f…9756) and rejects anything that doesn't match, so a layout drift can't render a garbage price.
  • Payloads are handled defensively: the stream's spot block can be null; the widget type-checks oracle.usd before applying it, and a fallback response can't overwrite a fresher stream price that arrived while the RPC read was in flight.
  • Verified: live-tested in a browser — stream path renders the price instantly with 0 RPC calls; pointing the stream at a dead URL fired exactly one 2-call RPC fallback that rendered the identical price (both paths read the same oracle account). Byte offsets confirmed empirically against mainnet. yarn build and Prettier pass.

🤖 Generated with Claude Code

Pyth's unauthenticated Hermes endpoint (hermes.pyth.network) stops serving
keyless traffic on 2026-08-18, which would silently kill the live price in
the /tokens/data-credit calculator. Instead of streaming from Hermes, the
widget now polls Solana RPC every 30s: it resolves the current oracle from
the on-chain DataCreditsV0 account (so it follows oracle rotations like
helium/helium-program-library#1207 automatically) and parses the Pyth
PriceUpdateV2 account directly. Any parse or fetch failure falls back to
the existing behavior of hiding the live-price button.
Removes the now-unused @pythnetwork/price-service-client dependency.
Polling Solana RPC from every open docs tab puts avoidable load on the
RPC proxy. The widget now subscribes to the heliumtools.org HNT price
stream (SSE: one snapshot on connect, then a frame only when the price
changes) and uses its on-chain oracle value. If the stream errors before
ever delivering a price, the widget falls back to a single Solana RPC
read of the same oracle account, so the price still renders with no
standing dependency beyond the stream.
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying heliumdocs with Cloudflare Pages Cloudflare Pages

Latest commit:63948a2
Status: ✅ Deploy successful!
Preview URL:https://5d772e23.heliumdocs.pages.dev
Branch Preview URL:https://claude-helium-pr-1207-review.heliumdocs.pages.dev

View logs

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jthiller