{"id":6821,"date":"2026-08-12T07:25:12","date_gmt":"2026-08-12T07:25:12","guid":{"rendered":"https:\/\/tokenmetrics.com\/blog\/harmony-rollback-suspected-exploit-inflates-one-supply\/"},"modified":"2026-08-12T07:25:12","modified_gmt":"2026-08-12T07:25:12","slug":"harmony-rollback-suspected-exploit-inflates-one-supply","status":"publish","type":"post","link":"https:\/\/tokenmetrics.com\/one\/news\/harmony-rollback-suspected-exploit-inflates-one-supply\/","title":{"rendered":"Harmony Considers ONE Rollback After Exploit: BitDelta Cut Futures Earlier"},"content":{"rendered":"<h2>Signal Snapshot<\/h2>\n<ul>\n<li>Token Metrics data shows BitDelta removed ONE futures on Aug 4, cutting a major trading venue.<\/li>\n<li>Top risk is the unverified mint claim, and a rollback could split the network or erode trust.<\/li>\n<\/ul>\n<h2>Key Takeaways<\/h2>\n<ul>\n<li>A rollback is a rare, drastic step that could split the network and hurt faith in layer-1 blockchains.<\/li>\n<li>Investors should treat ONE as high risk until cause is clear; watch exchange freezes and the patch.<\/li>\n<\/ul>\n<h2>What Happened<\/h2>\n<p>On Tuesday, Harmony&#8217;s public statement said the team was working with exchanges to stop and freeze funds. The layer-1 blockchain also said it was preparing a patch and looking at rollback options. Harmony did not confirm the cause, the number of tokens created, or the amount sent to exchanges.<\/p>\n<p>An X account called Juiceberg claimed the unauthorized ONE tokens were minted through empty blocks and that about 2.8 billion tokens were quickly funneled to exchanges as ONE&#8217;s price fell. Juiceberg estimated the attacker had about 115 million ONE remaining onchain. Or 2.9% of the amount allegedly minted, with the remainder either sold or held in exchange deposit wallets. Cointelegraph could not independently verify these claims. The claims remain unproven as of publication.<\/p>\n<p>This is not Harmony&#8217;s first security scare. The network suffered a June 2022 Horizon Bridge hack that stole about $100 million. The FBI later tied that attack to North Korea&#8217;s Lazarus Group.<\/p>\n<h2>Why It Matters<\/h2>\n<p>A rollback means rewriting the blockchain&#8217;s history. That breaks a core promise of crypto: that the ledger is final. If Harmony rolls back, it shows a layer-1 can still be bent by its team.<\/p>\n<p>The move would follow a messy 2022 hack. That old breach hurt users and drew a North Korea link. Another crisis so soon could make big buyers wary of building on Harmony.<\/p>\n<p>For everyday token holders, the risk is clear. If the chain splits, they could end up with coins on two chains. That often craters the price and confuses exchanges. Small holders may find their tokens worthless if a split favors one chain. Exchanges may delist ONE to avoid confusion. That would further hurt liquidity.<\/p>\n<p>The fact that exchanges are freezing funds is a good sign. It limits the attacker&#8217;s exit. But it also shows the team relies on central points of control.<\/p>\n<p>Investor implications run deeper than price. A rollback can invalidate trades executed during the disputed window, leaving buyers of ONE on certain venues with reversed settlements. Custodians and tax software may mislabel post-rollback balances, creating record-keeping headaches. The unverified nature of the mint claim means supply dilution risk is unknown, so position sizing should reflect worst-case scenarios. Token Metrics urges readers that this is not a buy signal; it is a governance and technical red flag. Active monitoring of official channels is the only sound stance until Harmony confirms facts.<\/p>\n\t\t<style id=\"tm-token-card-styles\">\n\t\t.tm-token-card {\n\t\t\tposition: relative;\n\t\t\tmargin: 1.75em 0;\n\t\t\tpadding: 1.25em 1.4em 1.4em;\n\t\t\tbackground: #17171D;\n\t\t\tborder: 1px solid rgba(255, 214, 10, 0.18);\n\t\t\tborder-radius: 16px;\n\t\t\tcolor: #e8eaf2;\n\t\t\tfont-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, \"Helvetica Neue\", Arial, sans-serif;\n\t\t\toverflow: hidden;\n\t\t}\n\t\t.tm-token-card::before {\n\t\t\tcontent: \"\";\n\t\t\tposition: absolute;\n\t\t\ttop: 0;\n\t\t\tleft: 0;\n\t\t\twidth: 4px;\n\t\t\theight: 100%;\n\t\t\tbackground: #FFD60A;\n\t\t}\n\t\t.tm-token-card__header {\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tgap: 0.4em;\n\t\t\tmargin-bottom: 1em;\n\t\t}\n\t\t.tm-token-card__eyebrow {\n\t\t\tmargin: 0;\n\t\t\tfont-size: 0.72em;\n\t\t\tfont-weight: 700;\n\t\t\tletter-spacing: 0.12em;\n\t\t\ttext-transform: uppercase;\n\t\t\tcolor: #FFD60A;\n\t\t}\n\t\t.tm-token-card__title {\n\t\t\tmargin: 0;\n\t\t\tdisplay: inline-flex;\n\t\t\talign-items: baseline;\n\t\t\tgap: 0.55em;\n\t\t\tflex-wrap: wrap;\n\t\t\tfont-size: 1.5em;\n\t\t\tfont-weight: 700;\n\t\t\tline-height: 1.15;\n\t\t\tcolor: #ffffff;\n\t\t\tletter-spacing: -0.01em;\n\t\t}\n\t\t.tm-token-card__name {\n\t\t\tcolor: #ffffff;\n\t\t}\n\t\t.tm-token-card__ticker {\n\t\t\tpadding: 0.2em 0.6em;\n\t\t\tbackground: rgba(255, 214, 10, 0.14);\n\t\t\tcolor: #FFD60A;\n\t\t\tfont-size: 0.55em;\n\t\t\tfont-weight: 700;\n\t\t\tletter-spacing: 0.08em;\n\t\t\tborder-radius: 999px;\n\t\t\ttext-transform: uppercase;\n\t\t\tline-height: 1;\n\t\t}\n\t\t\/* Recap theme forces `list-style-type: disc` on .entry-content ul\n\t\t * and `padding-left: 0` on every <li> via a high-specificity\n\t\t * selector chain (style.css:1872+). We need !important on these\n\t\t * specific properties to (a) suppress the native bullet so it\n\t\t * doesn't double up with our check icon, and (b) keep enough\n\t\t * left padding on the <li> to make room for the absolutely\n\t\t * positioned check icon without text overlap. *\/\n\t\t.tm-token-card__benefits {\n\t\t\tlist-style: none !important;\n\t\t\tmargin: 0 0 1.25em;\n\t\t\tpadding: 0 !important;\n\t\t\tdisplay: flex;\n\t\t\tflex-direction: column;\n\t\t\tgap: 0.55em;\n\t\t}\n\t\t.tm-token-card__benefit {\n\t\t\tposition: relative;\n\t\t\tpadding-left: 2.25em !important;\n\t\t\tpadding-right: 0;\n\t\t\tmargin: 0;\n\t\t\tfont-size: 0.95em;\n\t\t\tline-height: 1.5;\n\t\t\tcolor: rgba(232, 234, 242, 0.9);\n\t\t}\n\t\t.tm-token-card__benefit::marker {\n\t\t\tcontent: \"\" !important;\n\t\t}\n\t\t.tm-token-card__benefit::before {\n\t\t\tcontent: \"\";\n\t\t\tposition: absolute;\n\t\t\tleft: 0;\n\t\t\ttop: 0.32em;\n\t\t\twidth: 1.2em;\n\t\t\theight: 1.2em;\n\t\t\tbackground-image: url(\"data:image\/svg+xml;utf8,<svg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 16 16' fill='none'><circle cx='8' cy='8' r='7.5' fill='%23FFD60A'\/><path d='M4.5 8.2l2.3 2.3L11.5 5.8' stroke='%2317171D' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'\/><\/svg>\");\n\t\t\tbackground-repeat: no-repeat;\n\t\t\tbackground-size: contain;\n\t\t\tbackground-position: center;\n\t\t}\n\t\t.tm-token-card__footer {\n\t\t\tdisplay: flex;\n\t\t\talign-items: center;\n\t\t\tgap: 1em;\n\t\t\tflex-wrap: wrap;\n\t\t}\n\t\t.tm-token-card__cta {\n\t\t\tdisplay: inline-flex;\n\t\t\talign-items: center;\n\t\t\tpadding: 0.85em 1.4em;\n\t\t\tbackground: #FFD60A;\n\t\t\tcolor: #0a0e14;\n\t\t\tfont-weight: 800;\n\t\t\tfont-size: 0.95em;\n\t\t\tline-height: 1;\n\t\t\ttext-decoration: none;\n\t\t\tborder-radius: 999px;\n\t\t\twhite-space: nowrap;\n\t\t\ttransition: transform 0.15s ease, background 0.15s ease, box-shadow 0.15s ease;\n\t\t}\n\t\t.tm-token-card__cta:visited {\n\t\t\tcolor: #0a0e14;\n\t\t}\n\t\t.tm-token-card__cta:hover,\n\t\t.tm-token-card__cta:focus {\n\t\t\tbackground: #ffe04b;\n\t\t\tcolor: #0a0e14;\n\t\t\ttransform: translateY(-1px);\n\t\t\ttext-decoration: none;\n\t\t\tbox-shadow: 0 6px 20px rgba(255, 214, 10, 0.28);\n\t\t}\n\t\t.tm-token-card__meta {\n\t\t\tfont-size: 0.8em;\n\t\t\tcolor: rgba(232, 234, 242, 0.55);\n\t\t\tletter-spacing: 0.01em;\n\t\t}\n\t\t\/* Lightweight Charts price chart \u2014 TM yellow on core dark, CoinGecko OHLC *\/\n\t\t.tm-tv-chart {\n\t\t\tbox-sizing: border-box;\n\t\t\tmargin: 1.5em 0;\n\t\t\tpadding: 1em 1em 0.75em;\n\t\t\tbackground: #17171D;\n\t\t\tborder: 1px solid rgba(255, 214, 10, 0.18);\n\t\t\tborder-radius: 16px;\n\t\t\tcolor: #e8eaf2;\n\t\t\tfont-family: inherit;\n\t\t\tfont-size: inherit;\n\t\t\tline-height: 1.5;\n\t\t\toverflow: hidden;\n\t\t}\n\t\t.single .entry-content > .tm-tv-chart {\n\t\t\twidth: min(var(--cs-entry-content-large-width, 598px), calc(100vw - 3rem));\n\t\t\tmax-width: calc(100vw - 3rem);\n\t\t\tmargin-left: calc(min(var(--cs-entry-content-large-width, 598px), calc(100vw - 3rem)) \/ -2 + 50%);\n\t\t\tmargin-right: calc(min(var(--cs-entry-content-large-width, 598px), calc(100vw - 3rem)) \/ -2 + 50%);\n\t\t}\n\t\t@media (max-width: 575px) {\n\t\t\t.single .entry-content > .tm-tv-chart {\n\t\t\t\twidth: 100%;\n\t\t\t\tmax-width: 100%;\n\t\t\t\tmargin-left: 0;\n\t\t\t\tmargin-right: 0;\n\t\t\t\tpadding: 1rem 0.85rem 0.75rem;\n\t\t\t}\n\t\t\t.tm-tv-chart__caption {\n\t\t\t\ttext-align: left;\n\t\t\t}\n\t\t}\n\t\t.tm-tv-chart__header {\n\t\t\tdisplay: flex;\n\t\t\talign-items: baseline;\n\t\t\tjustify-content: space-between;\n\t\t\tgap: 0.75em;\n\t\t\tmargin: 0 0.25em 0.6em;\n\t\t\tflex-wrap: wrap;\n\t\t}\n\t\t.tm-tv-chart__title {\n\t\t\tdisplay: inline-flex;\n\t\t\talign-items: baseline;\n\t\t\tgap: 0.5em;\n\t\t\tmin-width: 0;\n\t\t}\n\t\t.tm-tv-chart__name {\n\t\t\tfont-size: 1.125em;\n\t\t\tfont-weight: 700;\n\t\t\tcolor: #e8eaf2;\n\t\t\tletter-spacing: 0.01em;\n\t\t}\n\t\t.tm-tv-chart__ticker {\n\t\t\tpadding: 0.15em 0.55em;\n\t\t\tbackground: rgba(255, 214, 10, 0.14);\n\t\t\tcolor: #FFD60A;\n\t\t\tfont-size: 0.7em;\n\t\t\tfont-weight: 700;\n\t\t\tletter-spacing: 0.06em;\n\t\t\tborder-radius: 999px;\n\t\t\ttext-transform: uppercase;\n\t\t}\n\t\t.tm-tv-chart__quote {\n\t\t\tdisplay: inline-flex;\n\t\t\talign-items: baseline;\n\t\t\tgap: 0.5em;\n\t\t}\n\t\t.tm-tv-chart__price {\n\t\t\tfont-size: 1.25em;\n\t\t\tfont-weight: 700;\n\t\t\tcolor: #e8eaf2;\n\t\t\tfont-variant-numeric: tabular-nums;\n\t\t}\n\t\t.tm-tv-chart__change {\n\t\t\tfont-size: 0.95em;\n\t\t\tfont-weight: 600;\n\t\t\tcolor: rgba(232, 234, 242, 0.55);\n\t\t\tfont-variant-numeric: tabular-nums;\n\t\t}\n\t\t.tm-tv-chart__change--up   { color: #4ade80; }\n\t\t.tm-tv-chart__change--down { color: #f87171; }\n\t\t.tm-tv-chart__canvas {\n\t\t\twidth: 100%;\n\t\t\tmin-height: 120px;\n\t\t}\n\t\t.tm-tv-chart__caption {\n\t\t\tmargin: 0.4em 0.25em 0;\n\t\t\tfont-size: 0.8em;\n\t\t\tcolor: rgba(232, 234, 242, 0.45);\n\t\t\ttext-align: right;\n\t\t}\n\n\t\t\/* Token stats panel \u2014 chart + stats + CTA stack on news posts *\/\n\t\t.tm-token-stats {\n\t\t\tmargin: 1.5em 0;\n\t\t\tpadding: 1em 1.1em 0.85em;\n\t\t\tbackground: #17171D;\n\t\t\tborder: 1px solid rgba(255, 214, 10, 0.18);\n\t\t\tborder-radius: 16px;\n\t\t\tcolor: #e8eaf2;\n\t\t\tfont-family: inherit;\n\t\t\tfont-size: inherit;\n\t\t\tline-height: 1.5;\n\t\t}\n\t\t.tm-token-stats__header {\n\t\t\tdisplay: flex; align-items: baseline; justify-content: space-between;\n\t\t\tgap: 0.75em; margin-bottom: 0.6em;\n\t\t}\n\t\t.tm-token-stats__title {\n\t\t\tmargin: 0; font-size: 0.9em; font-weight: 700; color: #FFD60A;\n\t\t\tletter-spacing: 0.04em; text-transform: uppercase;\n\t\t}\n\t\t.tm-token-stats__lookback {\n\t\t\tfont-size: 0.7em; color: rgba(232, 234, 242, 0.5);\n\t\t\ttext-transform: uppercase; letter-spacing: 0.06em;\n\t\t}\n\t\t.tm-token-stats__section { margin-bottom: 0.6em; }\n\t\t.tm-token-stats__section:last-child { margin-bottom: 0; }\n\t\t.tm-token-stats__section-label {\n\t\t\tmargin: 0 0 0.25em; font-size: 0.7em; font-weight: 700;\n\t\t\tletter-spacing: 0.12em; text-transform: uppercase;\n\t\t\tcolor: rgba(255, 214, 10, 0.65);\n\t\t}\n\t\t.tm-token-stats__grid {\n\t\t\tdisplay: grid; grid-template-columns: repeat(3, minmax(0, 1fr));\n\t\t\tgap: 0.25em 0.75em; margin: 0; padding-top: 0.25em;\n\t\t\tborder-top: 1px solid rgba(232, 234, 242, 0.06);\n\t\t}\n\t\t.tm-token-stats__cell {\n\t\t\tdisplay: flex; flex-direction: column; gap: 0.15em; min-width: 0; padding: 0.3em 0;\n\t\t}\n\t\t.tm-token-stats__cell dt {\n\t\t\tmargin: 0; font-size: 0.8em; color: rgba(232, 234, 242, 0.55);\n\t\t\tfont-weight: 500; letter-spacing: 0.02em;\n\t\t}\n\t\t.tm-token-stats__cell dd {\n\t\t\tmargin: 0; font-size: 1em; font-weight: 700; color: #e8eaf2;\n\t\t\tfont-variant-numeric: tabular-nums; line-height: 1.3;\n\t\t}\n\t\t.tm-token-stats__cell dd[data-trend=\"up\"]   { color: #4ade80; }\n\t\t.tm-token-stats__cell dd[data-trend=\"down\"] { color: #f87171; }\n\t\t.tm-token-stats__range {\n\t\t\tdisplay: flex; flex-direction: column; gap: 3px; width: 100%; min-width: 0;\n\t\t}\n\t\t.tm-token-stats__range-track {\n\t\t\tposition: relative; width: 100%; height: 0.2em; margin-top: 0.35em;\n\t\t\tbackground: rgba(232, 234, 242, 0.12); border-radius: 999px;\n\t\t}\n\t\t.tm-token-stats__range-dot {\n\t\t\tposition: absolute; top: 50%; width: 0.6em; height: 0.6em;\n\t\t\tmargin-top: -0.3em; margin-left: -0.3em;\n\t\t\tbackground: #FFD60A; border-radius: 50%;\n\t\t\tbox-shadow: 0 0 0 0.15em rgba(23, 23, 29, 1);\n\t\t}\n\t\t.tm-token-stats__range-bounds {\n\t\t\tdisplay: flex; justify-content: space-between; width: 100%;\n\t\t\tfont-size: 0.75em; font-weight: 500; line-height: 1.2;\n\t\t\tcolor: rgba(232, 234, 242, 0.55); font-variant-numeric: tabular-nums;\n\t\t}\n\t\t.tm-token-stats__source {\n\t\t\tmargin: 0.75em 0 0; font-size: 0.75em; color: rgba(232, 234, 242, 0.45); text-align: right;\n\t\t}\n\t\t@media (max-width: 560px) {\n\t\t\t.tm-token-stats__grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }\n\t\t}\n\t\t@media (max-width: 640px) {\n\t\t\t.tm-token-card {\n\t\t\t\tgrid-template-columns: auto 1fr;\n\t\t\t\tgrid-template-rows: auto auto;\n\t\t\t\tgap: 8px 14px;\n\t\t\t}\n\t\t\t.tm-token-card__cta {\n\t\t\t\tgrid-column: 1 \/ -1;\n\t\t\t\tjustify-content: center;\n\t\t\t}\n\t\t}\n\t<\/style>\n\t\t<figure\n\t\tclass=\"tm-tv-chart\"\n\t\tdata-tm-chart\n\t\tdata-tm-chart-id=\"harmony\"\n\t\tdata-tm-chart-days=\"14\"\n\t\tdata-tm-chart-height=\"220\"\n\t>\n\t\t<header class=\"tm-tv-chart__header\">\n\t\t\t<div class=\"tm-tv-chart__title\">\n\t\t\t\t<span class=\"tm-tv-chart__name\">Harmony<\/span>\n\t\t\t\t<span class=\"tm-tv-chart__ticker\">ONE<\/span>\n\t\t\t<\/div>\n\t\t\t<div class=\"tm-tv-chart__quote\">\n\t\t\t\t<span class=\"tm-tv-chart__price\" data-tm-chart-price>\u2014<\/span>\n\t\t\t\t<span class=\"tm-tv-chart__change\" data-tm-chart-change><\/span>\n\t\t\t<\/div>\n\t\t<\/header>\n\t\t<div\n\t\t\tclass=\"tm-tv-chart__canvas\"\n\t\t\trole=\"img\"\n\t\t\taria-label=\"Price chart for Harmony\"\n\t\t\tstyle=\"height: 220px;\"\n\t\t><\/div>\n\t\t<figcaption class=\"tm-tv-chart__caption\">Live price for Harmony \u2014 data via CoinGecko.<\/figcaption>\n\t<\/figure>\n\t\t<script id=\"tm-tv-chart-hydrator\">\n\t(function () {\n\t\tvar TM_BRAND = {\n\t\t\tbg:      '#17171D',\n\t\t\tline:    '#FFD60A',\n\t\t\tfillTop: 'rgba(255, 214, 10, 0.40)',\n\t\t\tfillBot: 'rgba(255, 214, 10, 0.00)',\n\t\t\ttext:    '#e8eaf2',\n\t\t\tgrid:    'rgba(232, 234, 242, 0.06)',\n\t\t\tborder:  'rgba(255, 214, 10, 0.18)'\n\t\t};\n\t\tfunction loadLibrary(cb) {\n\t\t\tif (window.LightweightCharts) { cb(); return; }\n\t\t\tvar s = document.createElement('script');\n\t\t\ts.src = 'https:\/\/unpkg.com\/lightweight-charts@4.2.3\/dist\/lightweight-charts.standalone.production.js';\n\t\t\t\/\/ Subresource Integrity hash for the pinned 4.2.3 build.\n\t\t\t\/\/ Greptile P1 (PR #1470): without SRI, a compromised npm\n\t\t\t\/\/ package or a CDN MITM at this version would execute\n\t\t\t\/\/ arbitrary JS in every visitor's browser. Recompute via\n\t\t\t\/\/ `curl -sS <src> | openssl dgst -sha384 -binary | base64`\n\t\t\t\/\/ when bumping the version.\n\t\t\ts.integrity = 'sha384-stKllnUqA9AD0gsKCuUtf5XlqAW7PwIgDagoNsTWkjkBmJ\/GZ\/uHTgEBxdLV2VSK';\n\t\t\ts.async = true;\n\t\t\ts.crossOrigin = 'anonymous';\n\t\t\ts.onload = cb;\n\t\t\ts.onerror = function () { console.warn('[tm-tv-chart] failed to load lightweight-charts'); };\n\t\t\tdocument.head.appendChild(s);\n\t\t}\n\n\t\tfunction priceFormat(value) {\n\t\t\tvar abs = Math.abs(value);\n\t\t\tif (abs >= 0.01)    { return { precision: 2, minMove: 0.01 }; }\n\t\t\tif (abs >= 0.0001)  { return { precision: 6, minMove: 0.000001 }; }\n\t\t\treturn { precision: 8, minMove: 0.00000001 };\n\t\t}\n\t\tfunction formatPrice(value) {\n\t\t\tvar fmt = priceFormat(value);\n\t\t\treturn '$' + value.toLocaleString('en-US', { minimumFractionDigits: fmt.precision, maximumFractionDigits: fmt.precision });\n\t\t}\n\t\tfunction formatChangeAbs(value) {\n\t\t\tvar sign = value >= 0 ? '+' : '\u2212';\n\t\t\tvar abs  = Math.abs(value);\n\t\t\tvar fmt  = priceFormat(abs);\n\t\t\treturn sign + '$' + abs.toLocaleString('en-US', { minimumFractionDigits: fmt.precision, maximumFractionDigits: fmt.precision });\n\t\t}\n\t\tfunction updateQuote(figure, data) {\n\t\t\tvar priceEl  = figure.querySelector('[data-tm-chart-price]');\n\t\t\tvar changeEl = figure.querySelector('[data-tm-chart-change]');\n\t\t\tif (!priceEl || !changeEl || data.length === 0) { return; }\n\t\t\tvar last = data[data.length - 1];\n\t\t\tvar dayAgoTs = last.time - 86400;\n\t\t\tvar baseline = data[0];\n\t\t\tfor (var i = data.length - 1; i >= 0; i--) {\n\t\t\t\tif (data[i].time <= dayAgoTs) { baseline = data[i]; break; }\n\t\t\t}\n\t\t\tvar changeAbs = last.value - baseline.value;\n\t\t\tvar changePct = baseline.value !== 0 ? (changeAbs \/ baseline.value) * 100 : 0;\n\t\t\tpriceEl.textContent  = formatPrice(last.value);\n\t\t\tchangeEl.textContent = formatChangeAbs(changeAbs) + ' (' + (changePct >= 0 ? '+' : '\u2212') + Math.abs(changePct).toFixed(2) + '%)';\n\t\t\tchangeEl.classList.remove('tm-tv-chart__change--up', 'tm-tv-chart__change--down');\n\t\t\tif (changeAbs > 0) { changeEl.classList.add('tm-tv-chart__change--up'); }\n\t\t\telse if (changeAbs < 0) { changeEl.classList.add('tm-tv-chart__change--down'); }\n\t\t}\n\n\t\tfunction fetchOhlc(coinId, days) {\n\t\t\tvar url = 'https:\/\/api.coingecko.com\/api\/v3\/coins\/' + encodeURIComponent(coinId)\n\t\t\t\t+ '\/ohlc?vs_currency=usd&days=' + encodeURIComponent(days);\n\t\t\treturn fetch(url, { credentials: 'omit' }).then(function (r) {\n\t\t\t\tif (!r.ok) { throw new Error('coingecko ' + r.status); }\n\t\t\t\treturn r.json();\n\t\t\t}).then(function (rows) {\n\t\t\t\tif (!Array.isArray(rows)) { return []; }\n\t\t\t\treturn rows.map(function (k) {\n\t\t\t\t\treturn { time: Math.floor(k[0] \/ 1000), value: parseFloat(k[4]) };\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\tfunction renderOne(figure) {\n\t\t\tif (figure.dataset.tmChartReady) { return; }\n\t\t\tif (figure.dataset.tmChartFetching) { return; }\n\t\t\tvar coinId = figure.getAttribute('data-tm-chart-id');\n\t\t\tvar days   = figure.getAttribute('data-tm-chart-days') || '14';\n\t\t\tvar height = parseInt(figure.getAttribute('data-tm-chart-height') || '220', 10);\n\t\t\tvar canvas = figure.querySelector('.tm-tv-chart__canvas');\n\t\t\tif (!coinId || !canvas) { return; }\n\t\t\t\/\/ Greptile P1 (PR #1470): only mark the figure ready AFTER\n\t\t\t\/\/ the OHLC fetch resolves successfully. The earlier flow set\n\t\t\t\/\/ the flag before the await, so a single 429 from CoinGecko\n\t\t\t\/\/ permanently disabled retry for that page-load \u2014 every\n\t\t\t\/\/ subsequent renderAll() call (e.g. on resize \/ hashchange)\n\t\t\t\/\/ would short-circuit on the stale flag and the chart would\n\t\t\t\/\/ stay blank forever. The intermediate `tmChartFetching`\n\t\t\t\/\/ flag still prevents in-flight double-fetches.\n\t\t\tfigure.dataset.tmChartFetching = '1';\n\n\t\t\tfetchOhlc(coinId, days).then(function (data) {\n\t\t\t\tif (!data || data.length === 0) {\n\t\t\t\t\tdelete figure.dataset.tmChartFetching;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfigure.dataset.tmChartReady = '1';\n\t\t\t\tdelete figure.dataset.tmChartFetching;\n\t\t\t\tfunction renderSvgChart() {\n\t\t\t\t\tvar w = 1000;\n\t\t\t\t\tvar compact = (canvas.getBoundingClientRect && canvas.getBoundingClientRect().width < 420);\n\t\t\t\t\tvar h = compact ? Math.max(190, height - 20) : height;\n\t\t\t\t\tvar pad = compact\n\t\t\t\t\t\t? { l: 18, r: 132, t: 14, b: 32 }\n\t\t\t\t\t\t: { l: 20, r: 96, t: 14, b: 34 };\n\t\t\t\t\tvar plotW = w - pad.l - pad.r;\n\t\t\t\t\tvar plotH = h - pad.t - pad.b;\n\t\t\t\t\tvar values = data.map(function (d) { return d.value; });\n\t\t\t\t\tvar rawMin = Math.min.apply(null, values);\n\t\t\t\t\tvar rawMax = Math.max.apply(null, values);\n\t\t\t\t\tvar rawSpan = Math.max(rawMax - rawMin, Math.abs(rawMax) * 0.01, 1);\n\t\t\t\t\tfunction niceStep(range, targetTicks) {\n\t\t\t\t\t\tvar rough = range \/ Math.max(1, targetTicks - 1);\n\t\t\t\t\t\tvar exponent = Math.pow(10, Math.floor(Math.log10(rough)));\n\t\t\t\t\t\tvar fraction = rough \/ exponent;\n\t\t\t\t\t\tvar niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n\t\t\t\t\t\treturn niceFraction * exponent;\n\t\t\t\t\t}\n\t\t\t\t\tvar step = niceStep(rawSpan * 1.16, 6);\n\t\t\t\t\tvar min = Math.floor((rawMin - rawSpan * 0.12) \/ step) * step;\n\t\t\t\t\tvar max = Math.ceil((rawMax + rawSpan * 0.12) \/ step) * step;\n\t\t\t\t\tvar span = Math.max(max - min, step);\n\t\t\t\t\tfunction x(i) { return pad.l + (data.length === 1 ? plotW : (i \/ (data.length - 1)) * plotW); }\n\t\t\t\t\tfunction y(v) { return pad.t + ((max - v) \/ span) * plotH; }\n\t\t\t\t\tfunction esc(s) { return String(s).replace(\/[&<>\\\"]\/g, function (c) { return ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '\"': '&quot;' })[c]; }); }\n\t\t\t\t\tfunction fmtTick(v) {\n\t\t\t\t\t\tif (Math.abs(v) >= 1000) {\n\t\t\t\t\t\t\treturn '$' + Math.round(v \/ 1000).toLocaleString('en-US') + 'K';\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn '$' + Math.round(v).toLocaleString('en-US');\n\t\t\t\t\t}\n\t\t\t\t\tfunction fmtDate(ts) { return new Date(ts * 1000).toLocaleDateString(undefined, { month: 'short', day: 'numeric', timeZone: 'UTC' }); }\n\t\t\t\t\tvar line = data.map(function (d, i) { return (i ? 'L' : 'M') + x(i).toFixed(1) + ' ' + y(d.value).toFixed(1); }).join(' ');\n\t\t\t\t\tvar area = line + ' L' + x(data.length - 1).toFixed(1) + ' ' + (pad.t + plotH).toFixed(1) + ' L' + pad.l + ' ' + (pad.t + plotH).toFixed(1) + ' Z';\n\t\t\t\t\tvar grid = '';\n\t\t\t\t\tfor (var gv = max; gv >= min - step * 0.5; gv -= step) {\n\t\t\t\t\t\tvar gy = y(gv);\n\t\t\t\t\t\tgrid += '<line x1=\"' + pad.l + '\" y1=\"' + gy.toFixed(1) + '\" x2=\"' + (pad.l + plotW) + '\" y2=\"' + gy.toFixed(1) + '\" stroke=\"' + TM_BRAND.grid + '\"\/>';\n\t\t\t\t\t\tgrid += '<text x=\"' + (pad.l + plotW + 10) + '\" y=\"' + (gy + 4).toFixed(1) + '\" fill=\"rgba(232,234,242,.72)\" font-size=\"20\">' + esc(fmtTick(gv)) + '<\/text>';\n\t\t\t\t\t}\n\t\t\t\t\tvar labels = '';\n\t\t\t\t\t[0, Math.floor((data.length - 1) \/ 2), data.length - 1].forEach(function (idx, n) {\n\t\t\t\t\t\tlabels += '<text x=\"' + x(idx).toFixed(1) + '\" y=\"' + (h - 9) + '\" text-anchor=\"' + (n === 0 ? 'start' : n === 2 ? 'end' : 'middle') + '\" fill=\"rgba(232,234,242,.62)\" font-size=\"' + (compact ? 24 : 20) + '\">' + esc(fmtDate(data[idx].time)) + '<\/text>';\n\t\t\t\t\t});\n\t\t\t\t\tcanvas.innerHTML = '<svg class=\"tm-tv-chart__svg\" viewBox=\"0 0 ' + w + ' ' + h + '\" width=\"100%\" height=\"100%\" preserveAspectRatio=\"none\" role=\"presentation\" aria-hidden=\"true\">'\n\t\t\t\t\t\t+ '<defs><linearGradient id=\"tm-chart-fill-' + Math.random().toString(36).slice(2) + '\" x1=\"0\" x2=\"0\" y1=\"0\" y2=\"1\"><stop offset=\"0%\" stop-color=\"rgba(255,214,10,.38)\"\/><stop offset=\"100%\" stop-color=\"rgba(255,214,10,0)\"\/><\/linearGradient><\/defs>'\n\t\t\t\t\t\t+ '<rect x=\"0\" y=\"0\" width=\"' + w + '\" height=\"' + h + '\" fill=\"' + TM_BRAND.bg + '\"\/>'\n\t\t\t\t\t\t+ grid\n\t\t\t\t\t\t+ '<path d=\"' + area + '\" fill=\"rgba(255,214,10,.18)\"\/>'\n\t\t\t\t\t\t+ '<path d=\"' + line + '\" fill=\"none\" stroke=\"' + TM_BRAND.line + '\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>'\n\t\t\t\t\t\t+ labels\n\t\t\t\t\t\t+ '<\/svg>';\n\t\t\t\t}\n\t\t\t\trenderSvgChart();\n\t\t\t\tupdateQuote(figure, data);\n\t\t\t\tif (window.ResizeObserver) {\n\t\t\t\t\tvar ro = new ResizeObserver(renderSvgChart);\n\t\t\t\t\tro.observe(canvas);\n\t\t\t\t}\n\t\t\t}).catch(function (err) {\n\t\t\t\t\/\/ Greptile P1 (PR #1470): clear the in-flight flag on\n\t\t\t\t\/\/ failure so a future renderAll() can retry. Without\n\t\t\t\t\/\/ this, a 429 from CoinGecko leaves the figure\n\t\t\t\t\/\/ permanently in a half-loaded state.\n\t\t\t\tdelete figure.dataset.tmChartFetching;\n\t\t\t\tconsole.warn('[tm-tv-chart] data fetch failed for ' + coinId, err);\n\t\t\t});\n\t\t}\n\n\t\tfunction renderAll() {\n\t\t\tvar figures = document.querySelectorAll('[data-tm-chart]');\n\t\t\tif (figures.length === 0) { return; }\n\t\t\tfigures.forEach(renderOne);\n\t\t}\n\n\t\tif (document.readyState === 'loading') {\n\t\t\tdocument.addEventListener('DOMContentLoaded', renderAll);\n\t\t} else {\n\t\t\trenderAll();\n\t\t}\n\t})();\n\t<\/script>\n\t\t\n<h2>Token Metrics View<\/h2>\n<p>Token Metrics data points to a tough setup for ONE even before the exploit news. The Signal stack caught a recent catalyst: BitDelta removed ONE futures on Aug 4. That cut a major venue where traders bet on the token. For investors, the loss of a futures market means fewer hedging tools. Spot holders cannot offset downside with short derivatives, so panic selling meets thinner liquidity.<\/p>\n<p>The Daily Pulse classification flagged this story as a main item. That means the event is central to today&#8217;s crypto news flow, not a side note. Investor implication: high news prominence draws retail attention and can amplify volatility in both directions.<\/p>\n<p>The only Polymarket market pulled in by Token Metrics was unrelated to this hack. It asked about a tropical cyclone forming by mid-August, with a yes probability near 95%. Prediction-market traders are not pricing this event yet, implying smart money sees no tradable outcome curve. That absence of a market is itself a signal: counterparties lack clarity to quote odds.<\/p>\n<p>No price or smart-money flow fields were in the snapshot, so we can&#8217;t read netflow. But the loss of a futures market is a real liquidity hit. Fewer places to trade often means wider spreads and sharper drops when panic hits. Losing futures means less ability to hedge, so spot sellers face more pressure.<\/p>\n<p>Investors should see the BitDelta exit as a warning. A trading venue dropping a token weeks before a crisis is not a good look.<\/p>\n\t\t<aside\n\t\tclass=\"tm-token-stats\"\n\t\tdata-tm-token-stats\n\t\tdata-tm-stats-id=\"harmony\"\n\t\tdata-tm-stats-lookback=\"365\"\n\t\taria-label=\"Harmony key statistics\"\n\t>\n\t\t<header class=\"tm-token-stats__header\">\n\t\t\t<h3 class=\"tm-token-stats__title\">Harmony \u00b7 Key Stats<\/h3>\n\t\t\t<span class=\"tm-token-stats__lookback\">365d lookback<\/span>\n\t\t<\/header>\n\t\t<section class=\"tm-token-stats__section\">\n\t\t\t<h4 class=\"tm-token-stats__section-label\">Market<\/h4>\n\t\t\t<dl class=\"tm-token-stats__grid\">\n\t\t\t\t<div class=\"tm-token-stats__cell\"><dt>Market Cap<\/dt><dd data-tm-stats-value=\"market-cap\">\u2014<\/dd><\/div>\n\t\t\t\t<div class=\"tm-token-stats__cell\"><dt>Vol \/ Cap<\/dt><dd data-tm-stats-value=\"turnover\">\u2014<\/dd><\/div>\n\t\t\t\t<div class=\"tm-token-stats__cell\"><dt>52-Week Range<\/dt><dd data-tm-stats-value=\"range-52w\">\u2014<\/dd><\/div>\n\t\t\t<\/dl>\n\t\t<\/section>\n\t\t<section class=\"tm-token-stats__section\">\n\t\t\t<h4 class=\"tm-token-stats__section-label\">Performance<\/h4>\n\t\t\t<dl class=\"tm-token-stats__grid\">\n\t\t\t\t<div class=\"tm-token-stats__cell\"><dt>30d<\/dt><dd data-tm-stats-value=\"change-30d\">\u2014<\/dd><\/div>\n\t\t\t\t<div class=\"tm-token-stats__cell\"><dt>1y<\/dt><dd data-tm-stats-value=\"change-1y\">\u2014<\/dd><\/div>\n\t\t\t\t<div class=\"tm-token-stats__cell\"><dt>vs BTC<\/dt><dd data-tm-stats-value=\"vs-btc\">\u2014<\/dd><\/div>\n\t\t\t<\/dl>\n\t\t<\/section>\n\t\t<section class=\"tm-token-stats__section\">\n\t\t\t<h4 class=\"tm-token-stats__section-label\">Risk (1y)<\/h4>\n\t\t\t<dl class=\"tm-token-stats__grid\">\n\t\t\t\t<div class=\"tm-token-stats__cell\"><dt>Volatility<\/dt><dd data-tm-stats-value=\"volatility\">\u2014<\/dd><\/div>\n\t\t\t\t<div class=\"tm-token-stats__cell\"><dt>Max Drawdown<\/dt><dd data-tm-stats-value=\"max-drawdown\">\u2014<\/dd><\/div>\n\t\t\t\t<div class=\"tm-token-stats__cell\"><dt>Sharpe<\/dt><dd data-tm-stats-value=\"sharpe\">\u2014<\/dd><\/div>\n\t\t\t<\/dl>\n\t\t<\/section>\n\t\t<p class=\"tm-token-stats__source\">Data via CoinGecko. Risk metrics from the trailing daily closes.<\/p>\n\t<\/aside>\n\t\t<script id=\"tm-token-stats-hydrator\">\n\t(function () {\n\t\t\/\/ Routed through the tm-coingecko-proxy Worker (5-min KV cache,\n\t\t\/\/ paid Pro key) instead of api.coingecko.com directly. Base URL is\n\t\t\/\/ resolved server-side from the `tm_token_card_coingecko_proxy_base`\n\t\t\/\/ filter \/ TM_COINGECKO_PROXY_BASE constant so staging can point\n\t\t\/\/ at a separate Worker.\n\t\tvar PROXY_BASE = \"https:\\\/\\\/tokenmetrics.com\\\/api\\\/cg\";\n\t\tvar DAYS_PER_YEAR = 365;\n\t\tvar coinCache = {};\n\t\tfunction fetchJson(url) {\n\t\t\treturn fetch(url, { credentials: 'omit' }).then(function (r) {\n\t\t\t\tif (!r.ok) { throw new Error('coingecko ' + r.status); }\n\t\t\t\treturn r.json();\n\t\t\t});\n\t\t}\n\t\tfunction fetchSnapshot(id) {\n\t\t\tif (coinCache['snap_' + id]) { return coinCache['snap_' + id]; }\n\t\t\tvar url = PROXY_BASE + '\/coins\/' + encodeURIComponent(id)\n\t\t\t\t+ '?localization=false&tickers=false&community_data=false&developer_data=false&sparkline=false';\n\t\t\tcoinCache['snap_' + id] = fetchJson(url);\n\t\t\treturn coinCache['snap_' + id];\n\t\t}\n\t\tfunction fetchSeries(id, days) {\n\t\t\tvar key = 'series_' + id + '_' + days;\n\t\t\tif (coinCache[key]) { return coinCache[key]; }\n\t\t\tvar url = PROXY_BASE + '\/coins\/' + encodeURIComponent(id)\n\t\t\t\t+ '\/market_chart?vs_currency=usd&days=' + encodeURIComponent(days);\n\t\t\tcoinCache[key] = fetchJson(url).then(function (d) {\n\t\t\t\treturn Array.isArray(d.prices) ? d.prices : [];\n\t\t\t});\n\t\t\treturn coinCache[key];\n\t\t}\n\t\tfunction fmtUsd(value) {\n\t\t\tvar abs = Math.abs(value);\n\t\t\tvar precision = abs >= 0.01 ? 2 : (abs >= 0.0001 ? 6 : 8);\n\t\t\treturn '$' + value.toLocaleString('en-US', { minimumFractionDigits: precision, maximumFractionDigits: precision });\n\t\t}\n\t\tfunction fmtCompactUsd(value) {\n\t\t\tif (value === null || value === undefined || isNaN(value)) { return '\u2014'; }\n\t\t\tvar abs = Math.abs(value);\n\t\t\tif (abs >= 1e12) { return '$' + (value \/ 1e12).toFixed(2) + 'T'; }\n\t\t\tif (abs >= 1e9)  { return '$' + (value \/ 1e9).toFixed(2)  + 'B'; }\n\t\t\tif (abs >= 1e6)  { return '$' + (value \/ 1e6).toFixed(2)  + 'M'; }\n\t\t\tif (abs >= 1e3)  { return '$' + (value \/ 1e3).toFixed(2)  + 'K'; }\n\t\t\treturn fmtUsd(value);\n\t\t}\n\t\tfunction fmtPct(value) {\n\t\t\tif (value === null || value === undefined || isNaN(value)) { return '\u2014'; }\n\t\t\tvar sign = value >= 0 ? '+' : '\u2212';\n\t\t\treturn sign + Math.abs(value).toFixed(2) + '%';\n\t\t}\n\t\tfunction trendOf(value) {\n\t\t\tif (value === null || value === undefined || isNaN(value)) { return null; }\n\t\t\tif (value > 0) { return 'up'; }\n\t\t\tif (value < 0) { return 'down'; }\n\t\t\treturn null;\n\t\t}\n\t\tfunction setCell(root, key, text, trend) {\n\t\t\tvar el = root.querySelector('[data-tm-stats-value=\"' + key + '\"]');\n\t\t\tif (!el) { return; }\n\t\t\tel.textContent = text;\n\t\t\tif (trend === 'up' || trend === 'down') { el.setAttribute('data-trend', trend); }\n\t\t\telse { el.removeAttribute('data-trend'); }\n\t\t}\n\t\tfunction dailyReturns(prices) {\n\t\t\tvar rets = [];\n\t\t\tfor (var i = 1; i < prices.length; i++) {\n\t\t\t\tvar prev = prices[i - 1][1], cur = prices[i][1];\n\t\t\t\tif (prev > 0 && isFinite(prev) && isFinite(cur)) { rets.push(cur \/ prev - 1); }\n\t\t\t}\n\t\t\treturn rets;\n\t\t}\n\t\tfunction mean(arr) {\n\t\t\tif (arr.length === 0) { return 0; }\n\t\t\tvar s = 0; for (var i = 0; i < arr.length; i++) { s += arr[i]; }\n\t\t\treturn s \/ arr.length;\n\t\t}\n\t\tfunction stddev(arr, mu) {\n\t\t\tif (arr.length < 2) { return 0; }\n\t\t\tvar s = 0;\n\t\t\tfor (var i = 0; i < arr.length; i++) { var d = arr[i] - mu; s += d * d; }\n\t\t\treturn Math.sqrt(s \/ (arr.length - 1));\n\t\t}\n\t\tfunction maxDrawdown(prices) {\n\t\t\tif (prices.length < 2) { return { value: 0, duration: 0 }; }\n\t\t\tvar peak = prices[0][1], peakIdx = 0;\n\t\t\tvar maxDd = 0, troughIdx = 0, troughPeakIdx = 0;\n\t\t\tfor (var i = 1; i < prices.length; i++) {\n\t\t\t\tvar p = prices[i][1];\n\t\t\t\tif (p > peak) { peak = p; peakIdx = i; }\n\t\t\t\tif (peak > 0) {\n\t\t\t\t\tvar dd = (p - peak) \/ peak;\n\t\t\t\t\tif (dd < maxDd) { maxDd = dd; troughIdx = i; troughPeakIdx = peakIdx; }\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar duration = 0;\n\t\t\tif (prices[troughIdx] && prices[troughPeakIdx]) {\n\t\t\t\tvar ms = prices[troughIdx][0] - prices[troughPeakIdx][0];\n\t\t\t\tduration = Math.max(0, Math.round(ms \/ 86400000));\n\t\t\t}\n\t\t\treturn { value: maxDd, duration: duration };\n\t\t}\n\t\tfunction quantStats(prices) {\n\t\t\tif (!prices || prices.length < 30) { return null; }\n\t\t\tvar rets = dailyReturns(prices);\n\t\t\tif (rets.length === 0) { return null; }\n\t\t\tvar mu = mean(rets);\n\t\t\tvar sd = stddev(rets, mu);\n\t\t\tvar ann_mu = mu * DAYS_PER_YEAR;\n\t\t\tvar ann_sd = sd * Math.sqrt(DAYS_PER_YEAR);\n\t\t\tvar dd = maxDrawdown(prices);\n\t\t\treturn {\n\t\t\t\tvolatility:      ann_sd,\n\t\t\t\tmaxDrawdown:     dd.value,\n\t\t\t\tmaxDrawdownDays: dd.duration,\n\t\t\t\tsharpe:          ann_sd > 0 ? ann_mu \/ ann_sd : 0\n\t\t\t};\n\t\t}\n\t\tfunction totalReturn(prices) {\n\t\t\tif (!prices || prices.length < 2) { return null; }\n\t\t\tvar first = prices[0][1], last = prices[prices.length - 1][1];\n\t\t\tif (!isFinite(first) || !isFinite(last) || first <= 0) { return null; }\n\t\t\treturn last \/ first - 1;\n\t\t}\n\t\tfunction setRangeCell(root, key, low, current, high) {\n\t\t\tvar el = root.querySelector('[data-tm-stats-value=\"' + key + '\"]');\n\t\t\tif (!el) { return; }\n\t\t\tel.removeAttribute('data-trend');\n\t\t\tif (!isFinite(low) || !isFinite(high) || !isFinite(current) || high <= low) {\n\t\t\t\tel.textContent = '\u2014'; return;\n\t\t\t}\n\t\t\tvar pct = ((current - low) \/ (high - low)) * 100;\n\t\t\tpct = Math.max(0, Math.min(100, pct));\n\t\t\tel.innerHTML = '';\n\t\t\tvar wrap = document.createElement('div'); wrap.className = 'tm-token-stats__range';\n\t\t\tvar track = document.createElement('div'); track.className = 'tm-token-stats__range-track';\n\t\t\tvar dot = document.createElement('div'); dot.className = 'tm-token-stats__range-dot';\n\t\t\tdot.style.left = pct.toFixed(1) + '%';\n\t\t\ttrack.appendChild(dot);\n\t\t\tvar bounds = document.createElement('div'); bounds.className = 'tm-token-stats__range-bounds';\n\t\t\tvar loSpan = document.createElement('span'); loSpan.textContent = fmtUsd(low);\n\t\t\tvar hiSpan = document.createElement('span'); hiSpan.textContent = fmtUsd(high);\n\t\t\tbounds.appendChild(loSpan); bounds.appendChild(hiSpan);\n\t\t\twrap.appendChild(track); wrap.appendChild(bounds); el.appendChild(wrap);\n\t\t}\n\t\tfunction renderOne(root) {\n\t\t\tif (root.dataset.tmStatsReady) { return; }\n\t\t\tvar coinId = root.getAttribute('data-tm-stats-id');\n\t\t\tvar lookback = root.getAttribute('data-tm-stats-lookback') || '365';\n\t\t\tif (!coinId) { return; }\n\t\t\troot.dataset.tmStatsReady = '1';\n\t\t\tPromise.all([\n\t\t\t\tfetchSnapshot(coinId),\n\t\t\t\tfetchSeries(coinId, lookback),\n\t\t\t\tfetchSeries('bitcoin', lookback)\n\t\t\t]).then(function (results) {\n\t\t\t\tvar snap = results[0]; var prices = results[1]; var btcPrices = results[2];\n\t\t\t\tvar md = (snap && snap.market_data) || {};\n\t\t\t\tsetCell(root, 'market-cap', fmtCompactUsd(md.market_cap && md.market_cap.usd));\n\t\t\t\tvar vol = md.total_volume && md.total_volume.usd;\n\t\t\t\tvar mcap = md.market_cap && md.market_cap.usd;\n\t\t\t\tvar turnoverText = '\u2014';\n\t\t\t\tif (vol && mcap && mcap > 0) {\n\t\t\t\t\tturnoverText = fmtCompactUsd(vol) + ' (' + ((vol \/ mcap) * 100).toFixed(2) + '%)';\n\t\t\t\t} else if (vol) { turnoverText = fmtCompactUsd(vol); }\n\t\t\t\tsetCell(root, 'turnover', turnoverText);\n\t\t\t\tif (prices && prices.length > 1) {\n\t\t\t\t\tvar lo = Infinity, hi = -Infinity;\n\t\t\t\t\tfor (var i = 0; i < prices.length; i++) {\n\t\t\t\t\t\tvar p = prices[i][1];\n\t\t\t\t\t\tif (p < lo) { lo = p; } if (p > hi) { hi = p; }\n\t\t\t\t\t}\n\t\t\t\t\tvar cur = (md.current_price && md.current_price.usd) || prices[prices.length - 1][1];\n\t\t\t\t\tsetRangeCell(root, 'range-52w', lo, cur, hi);\n\t\t\t\t}\n\t\t\t\tsetCell(root, 'change-30d', fmtPct(md.price_change_percentage_30d), trendOf(md.price_change_percentage_30d));\n\t\t\t\tsetCell(root, 'change-1y',  fmtPct(md.price_change_percentage_1y),  trendOf(md.price_change_percentage_1y));\n\t\t\t\tvar tokenRet = totalReturn(prices), btcRet = totalReturn(btcPrices);\n\t\t\t\tif (tokenRet !== null && btcRet !== null) {\n\t\t\t\t\tvar vsBtc = (tokenRet - btcRet) * 100;\n\t\t\t\t\tsetCell(root, 'vs-btc', fmtPct(vsBtc), trendOf(vsBtc));\n\t\t\t\t}\n\t\t\t\tvar qs = quantStats(prices);\n\t\t\t\tvar btcQs = quantStats(btcPrices);\n\t\t\t\tif (qs) {\n\t\t\t\t\tsetCell(root, 'volatility', (qs.volatility * 100).toFixed(1) + '%');\n\t\t\t\t\tvar ddText = fmtPct(qs.maxDrawdown * 100);\n\t\t\t\t\tif (qs.maxDrawdownDays > 0) { ddText += ' (' + qs.maxDrawdownDays + 'd)'; }\n\t\t\t\t\tsetCell(root, 'max-drawdown', ddText, 'down');\n\t\t\t\t\tvar sharpeText = qs.sharpe.toFixed(2);\n\t\t\t\t\tif (btcQs && btcQs.sharpe !== 0) { sharpeText += ' \u00b7 BTC ' + btcQs.sharpe.toFixed(2); }\n\t\t\t\t\tsetCell(root, 'sharpe', sharpeText, trendOf(qs.sharpe));\n\t\t\t\t}\n\t\t\t}).catch(function (err) { console.warn('[tm-token-stats] fetch failed for ' + coinId, err); });\n\t\t}\n\t\tfunction renderAll() {\n\t\t\tvar roots = document.querySelectorAll('[data-tm-token-stats]');\n\t\t\troots.forEach(renderOne);\n\t\t}\n\t\tif (document.readyState === 'loading') {\n\t\t\tdocument.addEventListener('DOMContentLoaded', renderAll);\n\t\t} else {\n\t\t\trenderAll();\n\t\t}\n\t})();\n\t<\/script>\n\t\t\n\t\t<aside\n\t\tclass=\"tm-token-card\"\n\t\trole=\"complementary\"\n\t\taria-label=\"Track Harmony (ONE) with Token Metrics\"\n\t\tdata-tm-token-card=\"one\"\n\t>\n\t\t<header class=\"tm-token-card__header\">\n\t\t\t<p class=\"tm-token-card__eyebrow\">Track this token with Token Metrics<\/p>\n\t\t\t<h3 class=\"tm-token-card__title\">\n\t\t\t\t<span class=\"tm-token-card__name\">Harmony<\/span>\n\t\t\t\t<span class=\"tm-token-card__ticker\">ONE<\/span>\n\t\t\t<\/h3>\n\t\t<\/header>\n\t\t<ul class=\"tm-token-card__benefits\">\n\t\t\t\t\t\t\t<li class=\"tm-token-card__benefit\">7-day free trial of Signal<\/li>\n\t\t\t\t\t\t\t<li class=\"tm-token-card__benefit\">Smart-money wallet flows across the top tokens<\/li>\n\t\t\t\t\t\t\t<li class=\"tm-token-card__benefit\">Daily technical setup labels \u2014 Bullish to Bearish, both directions<\/li>\n\t\t\t\t\t\t\t<li class=\"tm-token-card__benefit\">Polymarket consensus on near-term catalysts<\/li>\n\t\t\t\t\t<\/ul>\n\t\t<div class=\"tm-token-card__footer\">\n\t\t\t<a\n\t\t\t\tclass=\"tm-token-card__cta\"\n\t\t\t\thref=\"https:\/\/tokenmetrics.com\/?utm_source=tm_blog&#038;utm_medium=token_card&#038;utm_campaign=signal_one#premium\"\n\t\t\t\trel=\"noopener\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t>See the setup, risk, and invalidation before you act \u2192<\/a>\n\t\t\t<span class=\"tm-token-card__meta\">Signal alerts include the setup, risk, and what would change the trade.<\/span>\n\t\t<\/div>\n\t<\/aside>\n\t\n<h2>Market Context<\/h2>\n<p>This is a security event with a protocol shift angle. An unauthorized mint attacks the supply rule of a blockchain. If true, it means the network let someone create tokens out of thin air.<\/p>\n<p>Historical precedent on Harmony itself exists. The June 2022 Horizon Bridge hack took about $100 million. That was a bridge exploit, not a supply mint. But both show the chain has faced repeated stress across the 2022 cycle and now. The clustering of incidents on the same layer-1 points to structural challenges in its security model.<\/p>\n<p>Category framing matters: this incident belongs to the supply-integrity class of bugs, distinct from bridge theft. Layer-1 blockchains market immutability as a feature; a team-driven rollback undermines that narrative. No broader historical analogs were supplied by Token Metrics for this specific event. Still, the pattern of layer-1 teams stepping in to freeze or rollback is rare and usually signals deep trouble. Security events test the trust model of any layer-1. Harmony&#8217;s response will set a precedent for other chains.<\/p>\n<h2>Risks to Watch<\/h2>\n<ul>\n<li>Confirmation of the mint size is key: if Harmony confirms a large unauthorized mint, supply dilution is massive.<\/li>\n<li>Exchange freeze success matters: if frozen funds cover most sent tokens, seller pressure eases.<\/li>\n<li>Rollback decision risk: if Harmony rolls back, expect a possible chain split and exchange chaos.<\/li>\n<li>Further price drop risk: ONE already fell sharply, more selling could follow if panic spreads.<\/li>\n<li>Observable condition: watch for an official Harmony post confirming or denying the 2.8 billion token exchange flow claimed by Juiceberg.<\/li>\n<li>Observable condition: monitor whether the roughly 115 million ONE claimed onchain moves to mixers or new wallets.<\/li>\n<\/ul>\n<h2>What to Watch Next<\/h2>\n<ul>\n<li>Harmony&#8217;s next update on cause and exact token count from the ongoing report.<\/li>\n<li>Whether major exchanges confirm freezes of suspicious ONE deposits.<\/li>\n<li>The release of the patch and any vote on rollback by validators.<\/li>\n<li>BitDelta&#8217;s stance on relisting ONE futures after the crisis clears.<\/li>\n<li>Any sign of onchain movement from the 115 million ONE still unaccounted per the unverified claim.<\/li>\n<li>Official confirmation of the attacker&#8217;s entry vector, which Harmony has not disclosed.<\/li>\n<\/ul>\n<p>This article is for information only. It is not investment advice.<\/p>\n<h2>Sources \/ Data Used<\/h2>\n<ul>\n<li><a href=\"https:\/\/cointelegraph.com\/news\/armony-rollback-alleged-one-token-mint?utm_source=rss_feed&amp;utm_medium=rss&amp;utm_campaign=rss_partner_inbound\" target=\"_blank\" rel=\"noopener\">Harmony&#8217;s rollback consideration and exploit claims<\/a><\/li>\n<li>Token Metrics data: ONE catalyst (BitDelta futures removal Aug 4) and Daily Pulse classification.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"Harmony is weighing a rollback after claims of a massive unauthorized ONE mint. Exchanges are freezing funds. Token Metrics data shows BitDelta already cut ONE futures. A rollback could split the chain and shake trust.","protected":false},"author":1,"featured_media":6820,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_tm_paid_cta_tier":"","_tm_paid_cta_heading":"","_tm_paid_cta_body":"","csco_display_header_overlay":false,"csco_singular_sidebar":"","csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_reading_time":"","csco_page_toc_navigation":"","csco_post_video_location":[],"csco_post_video_location_hash":"","csco_post_video_url":"","csco_post_video_bg_start_time":0,"csco_post_video_bg_end_time":0,"csco_post_video_bg_volume":false,"_jetpack_hide_featured_image":false,"_jetpack_featured_image_duplicate_dismissed":0,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[158,1058],"tags":[295,1060,1061,282,283],"sections":[183],"entities":[1059],"class_list":["post-6821","post","type-post","status-publish","format-standard","has-post-thumbnail","category-news","category-one","tag-exploit","tag-harmony","tag-one","tag-protocol","tag-security","section-news","entity-one","cs-entry","cs-video-wrap"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/tokenmetrics.com\/blog\/wp-content\/uploads\/2026\/08\/harmony-rollback-suspected-exploit-inflates-one-supply-featured.webp","_links":{"self":[{"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/posts\/6821","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/comments?post=6821"}],"version-history":[{"count":0,"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/posts\/6821\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/media\/6820"}],"wp:attachment":[{"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/media?parent=6821"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/categories?post=6821"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/tags?post=6821"},{"taxonomy":"section","embeddable":true,"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/sections?post=6821"},{"taxonomy":"entity","embeddable":true,"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/entities?post=6821"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}