{"id":1922,"date":"2026-05-04T19:45:28","date_gmt":"2026-05-04T19:45:28","guid":{"rendered":"https:\/\/tokenmetrics.com\/blog\/?p=1922"},"modified":"2026-07-06T07:31:25","modified_gmt":"2026-07-06T07:31:25","slug":"tmai-migration-solana","status":"publish","type":"post","link":"https:\/\/tokenmetrics.com\/blog\/tmai-migration-solana\/","title":{"rendered":"TMAI Migration to Solana: 5 Critical Holder Steps"},"content":{"rendered":"<!-- TM_CHART_MOBILE_WIDTH_HOTFIX_START -->\n<style id=\"tm-chart-mobile-width-hotfix\">\n.single .entry-content > .tm-tv-chart {\n  box-sizing: border-box !important;\n  width: min(var(--cs-entry-content-large-width, 598px), calc(100vw - 3rem)) !important;\n  max-width: calc(100vw - 3rem) !important;\n  margin-left: calc(min(var(--cs-entry-content-large-width, 598px), calc(100vw - 3rem)) \/ -2 + 50%) !important;\n  margin-right: calc(min(var(--cs-entry-content-large-width, 598px), calc(100vw - 3rem)) \/ -2 + 50%) !important;\n  overflow: hidden !important;\n}\n.tm-tv-chart__canvas { width: 100% !important; min-height: 190px !important; }\n.tm-tv-chart__canvas > svg.tm-tv-chart__svg { display:block; width:100% !important; height:100% !important; }\n.tm-tv-chart__canvas .tv-lightweight-charts { display:none !important; }\n@media (max-width: 575px) {\n  .single .entry-content > .tm-tv-chart {\n    width: 100% !important;\n    max-width: 100% !important;\n    margin-left: 0 !important;\n    margin-right: 0 !important;\n    padding: 0.9rem 0.8rem 0.7rem !important;\n  }\n  .single .entry-content > .tm-tv-chart .tm-tv-chart__caption {\n    text-align: left !important;\n    font-size: 0.76em !important;\n    line-height: 1.35 !important;\n  }\n}\n<\/style>\n<script id=\"tm-chart-svg-width-hotfix\">\n(function(){\n  var BRAND={bg:'#17171D',line:'#FFD60A',grid:'rgba(232,234,242,.10)',text:'rgba(232,234,242,.70)'};\n  function esc(s){return String(s).replace(\/[&<>\\\"]\/g,function(c){return {'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;'}[c];});}\n  function fmtTick(v){if(Math.abs(v)>=1000){return '$'+Math.round(v\/1000).toLocaleString('en-US')+'K';} return '$'+Math.round(v).toLocaleString('en-US');}\n  function fmtPrice(v){return '$'+v.toLocaleString('en-US',{minimumFractionDigits:2,maximumFractionDigits:2});}\n  function fmtDate(ts){return new Date(ts*1000).toLocaleDateString(undefined,{month:'short',day:'numeric',timeZone:'UTC'});}\n  function draw(fig,data){\n    if(!data||data.length<2) return;\n    var canvas=fig.querySelector('.tm-tv-chart__canvas'); if(!canvas) return;\n    var compact=canvas.getBoundingClientRect&#038;&#038;canvas.getBoundingClientRect().width<420;\n    var h=compact?200:(parseInt(fig.getAttribute('data-tm-chart-height')||'220',10)||220);\n    canvas.style.height=h+'px';\n    var w=1000,pad=compact?{l:18,r:132,t:14,b:32}:{l:20,r:96,t:14,b:34},plotW=w-pad.l-pad.r,plotH=h-pad.t-pad.b;\n    var vals=data.map(function(d){return d.value;}),rawMin=Math.min.apply(null,vals),rawMax=Math.max.apply(null,vals),rawSpan=Math.max(rawMax-rawMin,Math.abs(rawMax)*.01,1); function niceStep(range,targetTicks){var rough=range\/Math.max(1,targetTicks-1),exponent=Math.pow(10,Math.floor(Math.log10(rough))),fraction=rough\/exponent,niceFraction=fraction<=1?1:fraction<=2?2:fraction<=5?5:10; return niceFraction*exponent;} var step=niceStep(rawSpan*1.16,6),min=Math.floor((rawMin-rawSpan*.12)\/step)*step,max=Math.ceil((rawMax+rawSpan*.12)\/step)*step,span=Math.max(max-min,step);\n    function x(i){return pad.l+(data.length===1?plotW:(i\/(data.length-1))*plotW);} function y(v){return pad.t+((max-v)\/span)*plotH;}\n    var line=data.map(function(d,i){return (i?'L':'M')+x(i).toFixed(1)+' '+y(d.value).toFixed(1);}).join(' ');\n    var area=line+' L'+x(data.length-1).toFixed(1)+' '+(pad.t+plotH).toFixed(1)+' L'+pad.l+' '+(pad.t+plotH).toFixed(1)+' Z';\n    var grid=''; for(var gv=max;gv>=min-step*.5;gv-=step){var gy=y(gv); grid+='<line x1=\"'+pad.l+'\" y1=\"'+gy.toFixed(1)+'\" x2=\"'+(pad.l+plotW)+'\" y2=\"'+gy.toFixed(1)+'\" stroke=\"'+BRAND.grid+'\"\/>'; grid+='<text x=\"'+(pad.l+plotW+10)+'\" y=\"'+(gy+4).toFixed(1)+'\" fill=\"'+BRAND.text+'\" font-size=\"20\">'+esc(fmtTick(gv))+'<\/text>';}\n    var labels=''; [0,Math.floor((data.length-1)\/2),data.length-1].forEach(function(idx,n){labels+='<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    canvas.innerHTML='<svg class=\"tm-tv-chart__svg\" viewBox=\"0 0 '+w+' '+h+'\" width=\"100%\" height=\"100%\" preserveAspectRatio=\"none\" role=\"presentation\" aria-hidden=\"true\"><rect x=\"0\" y=\"0\" width=\"'+w+'\" height=\"'+h+'\" fill=\"'+BRAND.bg+'\"\/>'+grid+'<path d=\"'+area+'\" fill=\"rgba(255,214,10,.18)\"\/><path d=\"'+line+'\" fill=\"none\" stroke=\"'+BRAND.line+'\" stroke-width=\"5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/>'+labels+'<\/svg>';\n    var price=fig.querySelector('[data-tm-chart-price]'), ch=fig.querySelector('[data-tm-chart-change]'), last=data[data.length-1], base=data[0];\n    if(price) price.textContent=fmtPrice(last.value); if(ch){var abs=last.value-base.value,pct=base.value?(abs\/base.value)*100:0; ch.textContent=(abs>=0?'+':'\u2212')+'$'+Math.abs(abs).toLocaleString('en-US',{maximumFractionDigits:2})+' ('+(pct>=0?'+':'\u2212')+Math.abs(pct).toFixed(2)+'%)';}\n  }\n  function render(fig){ if(fig.dataset.tmSvgHotfixReady) return; var id=fig.getAttribute('data-tm-chart-id'), days=fig.getAttribute('data-tm-chart-days')||'14'; if(!id) return; fig.dataset.tmSvgHotfixReady='1'; fetch('https:\/\/api.coingecko.com\/api\/v3\/coins\/'+encodeURIComponent(id)+'\/ohlc?vs_currency=usd&days='+encodeURIComponent(days),{credentials:'omit'}).then(function(r){return r.ok?r.json():[];}).then(function(rows){var data=(Array.isArray(rows)?rows:[]).map(function(k){return {time:Math.floor(k[0]\/1000),value:parseFloat(k[4])};}).filter(function(d){return isFinite(d.value);}); draw(fig,data); if(window.ResizeObserver){new ResizeObserver(function(){draw(fig,data);}).observe(fig.querySelector('.tm-tv-chart__canvas'));}}).catch(function(){}); }\n  function run(){document.querySelectorAll('[data-tm-chart]').forEach(render);} if(document.readyState==='loading') document.addEventListener('DOMContentLoaded',run); else run(); setTimeout(function(){document.querySelectorAll('[data-tm-chart]').forEach(function(f){delete f.dataset.tmSvgHotfixReady; render(f);});},1800);\n})();\n<\/script>\n<!-- TM_CHART_MOBILE_WIDTH_HOTFIX_END -->\n\n<!-- tm-authority-conversion-template:v1 -->\n<section class=\"tm-authority-conversion-template\" aria-label=\"Token Metrics research snapshot\" style=\"border:1px solid #e6e0c8;border-radius:16px;padding:0;margin:28px 0;background:#fffdf6;box-shadow:0 10px 30px rgba(15,23,42,0.06);overflow:hidden;\">\n  <div style=\"border-left:5px solid #f2c94c;padding:20px 22px 18px;\">\n    <p style=\"margin:0 0 6px;font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:#8a6d00;font-weight:700;\">Token Metrics research snapshot<\/p>\n    <h2 style=\"margin:0 0 10px;font-size:22px;line-height:1.25;\">What to know before reading<\/h2>\n    <p style=\"margin:0 0 14px;font-size:16px;line-height:1.65;color:#1f2937;\">The TMAI migration from Base to Solana is open for wallet checks.<\/p>\n    <ul style=\"margin:0 0 16px 20px;padding:0;color:#374151;font-size:15px;line-height:1.6;\">\n      <li><strong>Watch next:<\/strong> Use the article as context, then confirm the latest data before making a portfolio decision.<\/li>\n      <li><strong>Reviewed by:<\/strong> Token Metrics Editorial Team. <strong>Updated:<\/strong> June 25, 2026.<\/li>\n    <\/ul>\n    <div style=\"display:flex;flex-wrap:wrap;gap:10px;margin-top:12px;\">\n      <a href=\"https:\/\/tokenmetrics.com\/\" style=\"display:inline-block;border-radius:999px;background:#111827;color:#fff;padding:10px 14px;text-decoration:none;font-weight:700;\">Read Daily Pulse free<\/a>\n      <a href=\"https:\/\/pulse.tokenmetrics.com\/upgrade\" style=\"display:inline-block;border-radius:999px;background:#f2c94c;color:#111827;padding:10px 14px;text-decoration:none;font-weight:700;\">View plans<\/a>\n      <a href=\"https:\/\/tokenmetrics.com\/blog\" style=\"display:inline-block;border-radius:999px;border:1px solid #d1d5db;color:#111827;padding:10px 14px;text-decoration:none;font-weight:700;\">Read latest blog posts<\/a>\n    <\/div>\n  <\/div>\n<\/section>\n<script type=\"application\/ld+json\" data-tm-authority-template=\"v1\">{\"@context\":\"https:\/\/schema.org\",\"@type\":\"Article\",\"headline\":\"TMAI Migration to Solana: 5 Critical Holder Steps\",\"description\":\"The TMAI migration from Base to Solana is open for wallet checks.\",\"datePublished\":\"2026-05-04T19:45:28\",\"dateModified\":\"2026-06-25T00:00:00Z\",\"author\":{\"@type\":\"Organization\",\"name\":\"Token Metrics Editorial Team\"},\"publisher\":{\"@type\":\"Organization\",\"name\":\"Token Metrics\",\"url\":\"https:\/\/tokenmetrics.com\/\"},\"mainEntityOfPage\":{\"@type\":\"WebPage\",\"@id\":\"https:\/\/tokenmetrics.com\/blog\/tmai-migration-solana\/\"}}<\/script>\n\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=\"solana\"\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\">Solana<\/span>\n\t\t\t\t<span class=\"tm-tv-chart__ticker\">SOL<\/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 Solana\"\n\t\t\tstyle=\"height: 220px;\"\n\t\t><\/div>\n\t\t<figcaption class=\"tm-tv-chart__caption\">Live price for Solana \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\n\n<p class=\"wp-block-paragraph\"><strong>The TMAI migration from Base to Solana is open for wallet checks.<\/strong> You can check your wallet now. Claims open on <strong>Tuesday, May 5, 2026 at 10:00 AM Austin time<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/tokenmetrics.com\/migration\/#check-eligibility\" rel=\"noopener\" target=\"_blank\"><strong>Check your eligibility in the official migration portal<\/strong><\/a>.<\/p>\n\n\n\n<div class=\"tm-migration-alert tm-migration-alert-exchange\" style=\"border:1px solid #dc2626;background:#fef2f2;color:#7f1d1d;padding:16px 18px;border-radius:8px;margin:22px 0;\">\n<div style=\"font-weight:800;margin:0 0 8px;\">Exchange users: do not move TMAI from an exchange just to use the wallet checker.<\/div>\n<div style=\"margin:0;\">The portal checks Base wallets only. It cannot read exchange accounts. Exchange-held TMAI will use a separate follow-up path.<\/div>\n<\/div>\n\n\n\n<figure class=\"wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-4-3 wp-has-aspect-ratio\"><div class=\"wp-block-embed__wrapper\">\n<iframe loading=\"lazy\" title=\"Token Metrics TMAI Token Migration to Solana: 5 Critical Steps for Holders\" width=\"1200\" height=\"900\" src=\"https:\/\/www.youtube.com\/embed\/lGyWqZ09RBo?feature=oembed\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" referrerpolicy=\"strict-origin-when-cross-origin\" allowfullscreen><\/iframe>\n<\/div><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Fast read<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>If TMAI was in your own Base wallet:<\/strong> use the TMAI migration portal to check that Base wallet.<\/li>\n\n\n\n<li><strong>If TMAI was on an exchange:<\/strong> wait for the separate exchange-held process. Do not move it just to use the wallet checker.<\/li>\n\n\n\n<li><strong>If you staked veTMAI:<\/strong> eligible stakers have already been paid back from the TM Foundation treasury, including rewards.<\/li>\n\n\n\n<li><strong>If you had vesting:<\/strong> remaining vesting amounts were added to the claim for the beneficiary Base wallet.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The TMAI migration follows unauthorized activity involving an admin wallet for our existing Base staking and vesting contracts. The TMAI token contract was not hacked. User wallets were not drained by this incident. Eligible Base veTMAI stakers have been paid back from the TM Foundation treasury. Base proxy upgrade control has been moved to multisig, and TMAI is moving to new Solana infrastructure.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What you should do now<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open the official migration portal: <a href=\"https:\/\/tokenmetrics.com\/migration\/#check-eligibility\" target=\"_blank\" rel=\"noopener\">tokenmetrics.com\/migration<\/a>.<\/li>\n\n\n\n<li>Enter the Base wallet address that held TMAI at the snapshot block.<\/li>\n\n\n\n<li>Review your claim amount.<\/li>\n\n\n\n<li>Return when claims open on Tuesday, May 5, 2026 at 10:00 AM Austin time.<\/li>\n\n\n\n<li>Sign with your Base wallet, then approve one Solana transaction.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Security reminder:<\/strong> Token Metrics will never ask for your seed phrase or private key. Use only links published from official Token Metrics channels.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Who this applies to<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Base TMAI holders:<\/strong> If your Base wallet is in the locked snapshot and is not excluded, you can claim Solana TMAI during the 90-day claim window.<\/li>\n\n\n\n<li><strong>Base veTMAI stakers:<\/strong> You may not have seen this yet because there is no live staking dashboard. We already sent eligible stakers their TMAI back from the TM Foundation treasury. We also included staking rewards based on how long each wallet staked, up to a 1x reward for 12-month stakes.<\/li>\n\n\n\n<li><strong>Vesting recipients:<\/strong> If you still had TMAI left in a vesting schedule, we added that remaining amount to the claim for your Base wallet. It will be paid as unlocked Solana TMAI.<\/li>\n\n\n\n<li><strong>Exchange users:<\/strong> See the red warning above. Exchange-held TMAI will use a separate follow-up path.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">What happened<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">An admin wallet for the existing Base staking and vesting contracts was compromised. The attacker used that wallet to drain about <strong>2.11 billion TMAI<\/strong>, or about 21% of the original 10 billion Base TMAI supply, from those contracts.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This was not a hack of the TMAI token contract. It was unauthorized use of one admin key tied to staking and vesting contracts.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What was not affected<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>User wallets were not drained by this incident.<\/li>\n\n\n\n<li>The TMAI token contract was not hacked.<\/li>\n\n\n\n<li>The new Solana token and claim program are separate from the Base contracts.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Base veTMAI stakers were paid back<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">There is no live staking dashboard, so many stakers may not know this happened. We manually sent eligible Base veTMAI stakers their TMAI back from <strong>TM Foundation treasury funds<\/strong>. We also included staking rewards based on how long each wallet staked, up to a 1x reward for 12-month stakes.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>368 wallets received 1,686,175,007 TMAI total.<\/li>\n\n\n\n<li>That total includes the original staked TMAI plus earned rewards.<\/li>\n\n\n\n<li>On-chain proof: <a href=\"https:\/\/basescan.org\/tx\/0xe6eb07abd365ed5335f034ef239816f9130eaca473cc6d5764f54d6c748eadbf\" target=\"_blank\" rel=\"noopener\">BaseScan transaction<\/a> | <a href=\"https:\/\/app.safe.global\/transactions\/tx?safe=base:0xBbeE759D6CcEFc3E929dE1654D66f6b5A6300464&amp;id=multisig_0xBbeE759D6CcEFc3E929dE1654D66f6b5A6300464_0xe4c9e5bfcca1afb2d7fae454e42ece07fb4f69bf0b86d55748847d93b58bd81e\" target=\"_blank\" rel=\"noopener\">Gnosis Safe transaction<\/a>.<\/li>\n\n\n\n<li>Every transfer matches our repayment ledger.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Why we are disclosing this now<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We did not want to announce the TMAI migration without a clear next step for holders. Before publishing this update, we needed to check the on-chain facts, pay back eligible Base veTMAI stakers, recover needed admin access, move Base proxy upgrade control to multisig, lock the Base snapshot, deploy the Solana token and claim program, and open the portal for wallet checks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That work is now complete. Wallet checks are live. Mainnet Solana addresses are listed below. Claims have a fixed opening time.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How the TMAI migration works<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The TMAI migration uses a locked Base snapshot and a Solana claim program. If your Base wallet is eligible, you sign a Base wallet message to prove you own it. Then you approve one Solana transaction to receive Solana TMAI.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Snapshot block:<\/strong> <a href=\"https:\/\/basescan.org\/block\/45094609\" target=\"_blank\" rel=\"noopener\">45094609 on Base<\/a>.<\/li>\n\n\n\n<li><strong>Wallets in the automatic claim set:<\/strong> 76,017.<\/li>\n\n\n\n<li><strong>TMAI in the automatic claim set:<\/strong> 7,229,612,566.582523 TMAI.<\/li>\n\n\n\n<li><strong>Claim opens:<\/strong> Tuesday, May 5, 2026 at 10:00 AM Austin time.<\/li>\n\n\n\n<li><strong>Claim closes:<\/strong> Monday, August 3, 2026 at 10:00 AM Austin time.<\/li>\n\n\n\n<li><strong>Official portal:<\/strong> <a href=\"https:\/\/tokenmetrics.com\/migration\/#check-eligibility\" target=\"_blank\" rel=\"noopener\">tokenmetrics.com\/migration<\/a>.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">For this self-custody TMAI migration portal, you do <strong>not<\/strong> need to burn Base TMAI. The portal checks the locked Base snapshot and pays Solana TMAI from the Solana claim vault.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Solana launch allocations<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Solana TMAI launches with a total supply of <strong>13 billion tokens<\/strong>:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>10 billion &#8211; Migration reserve.<\/strong> Funds the claim vault and the 90-day claim window.<\/li>\n\n\n\n<li><strong>2.11 billion &#8211; TM Foundation treasury.<\/strong> Reimburses the Foundation for TMAI drained from Base contracts and helps rebuild operating reserves.<\/li>\n\n\n\n<li><strong>890 million &#8211; Liquidity Reserve.<\/strong> Supports Solana liquidity after exchange delistings.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Mainnet addresses<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Base TMAI token:<\/strong> <a href=\"https:\/\/basescan.org\/token\/0xCa4569949699D56E1834EFe9f58747Ca0f151B01\" target=\"_blank\" rel=\"noopener\"><code>0xCa4569949699D56E1834EFe9f58747Ca0f151B01<\/code><\/a><\/li>\n\n\n\n<li><strong>Solana TMAI mint:<\/strong> <a href=\"https:\/\/solscan.io\/token\/JBH3sZw1MFHunc4ifgLFkUKGecDpB1FwSXkEo8PnCD4Z\" target=\"_blank\" rel=\"noopener\"><code>JBH3sZw1MFHunc4ifgLFkUKGecDpB1FwSXkEo8PnCD4Z<\/code><\/a><\/li>\n\n\n\n<li><strong>Solana claim program:<\/strong> <a href=\"https:\/\/solscan.io\/account\/EqJ9zRtnVm5Fuw6uFyT6yjWtK1wjXd41uGhbU9UAFiar\" target=\"_blank\" rel=\"noopener\"><code>EqJ9zRtnVm5Fuw6uFyT6yjWtK1wjXd41uGhbU9UAFiar<\/code><\/a><\/li>\n\n\n\n<li><strong>Claim distributor:<\/strong> <a href=\"https:\/\/solscan.io\/account\/BktGkWr6z8Kco3Giu2mJu6m6rd5aPvjz51SxU2PeVKg\" target=\"_blank\" rel=\"noopener\"><code>BktGkWr6z8Kco3Giu2mJu6m6rd5aPvjz51SxU2PeVKg<\/code><\/a><\/li>\n\n\n\n<li><strong>Claim vault:<\/strong> <a href=\"https:\/\/solscan.io\/account\/E84pm2cEffZWacbLfAz5toVzeM6Zwdu1RBLmzbgzgu6e\" target=\"_blank\" rel=\"noopener\"><code>E84pm2cEffZWacbLfAz5toVzeM6Zwdu1RBLmzbgzgu6e<\/code><\/a><\/li>\n\n\n\n<li><strong>TM Foundation vault:<\/strong> <a href=\"https:\/\/solscan.io\/account\/EvzKZkPKgp9BFJMM1xEWPYGB1WNyttKQZCkNEmb2dyf1\" target=\"_blank\" rel=\"noopener\"><code>EvzKZkPKgp9BFJMM1xEWPYGB1WNyttKQZCkNEmb2dyf1<\/code><\/a><\/li>\n\n\n\n<li><strong>TM Community Reserve vault:<\/strong> <a href=\"https:\/\/solscan.io\/account\/CayzrkXf2ysV1FehNMz5QJ6LfmU9fSwJ4ZvYQvBaqxt5\" target=\"_blank\" rel=\"noopener\"><code>CayzrkXf2ysV1FehNMz5QJ6LfmU9fSwJ4ZvYQvBaqxt5<\/code><\/a><\/li>\n\n\n\n<li><strong>Meteora TMAI\/USDC pool:<\/strong> <a href=\"https:\/\/app.meteora.ag\/dammv2\/5Lzna79ZByGbB8MCwx5pRY7KDVNwm9VZ3iKFwg8tCjHH\" target=\"_blank\" rel=\"noopener\"><code>5Lzna79ZByGbB8MCwx5pRY7KDVNwm9VZ3iKFwg8tCjHH<\/code><\/a><\/li>\n\n\n<li><strong>Jupiter swap:<\/strong> <a href=\"https:\/\/jup.ag\/swap?sell=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v&#038;buy=JBH3sZw1MFHunc4ifgLFkUKGecDpB1FwSXkEo8PnCD4Z\" target=\"_blank\" rel=\"noopener\">https:\/\/jup.ag\/swap?sell=EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v&#038;buy=JBH3sZw1MFHunc4ifgLFkUKGecDpB1FwSXkEo8PnCD4Z<\/a><\/li>\n\n\n<li><strong>GMGN chart:<\/strong> <a href=\"https:\/\/gmgn.ai\/sol\/token\/JBH3sZw1MFHunc4ifgLFkUKGecDpB1FwSXkEo8PnCD4Z\" target=\"_blank\" rel=\"noopener\">https:\/\/gmgn.ai\/sol\/token\/JBH3sZw1MFHunc4ifgLFkUKGecDpB1FwSXkEo8PnCD4Z<\/a><\/li>\n\n\n\n<li><strong>Pool execution transaction:<\/strong> <a href=\"https:\/\/solscan.io\/tx\/24vhL8sYhGquvc4Hz699rux4q6t1mcbB8LKDY5ZFnsd2RLBf4SA8PcpP1fqX13TR5SsvaC7xscadv9Y5qdqiz4mt\" target=\"_blank\" rel=\"noopener\"><code>24vhL8sYhGquvc4Hz699rux4q6t1mcbB8LKDY5ZFnsd2RLBf4SA8PcpP1fqX13TR5SsvaC7xscadv9Y5qdqiz4mt<\/code><\/a><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Official Meteora pool<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The official Meteora <strong>TMAI\/USDC<\/strong> pool is live here: <a href=\"https:\/\/app.meteora.ag\/dammv2\/5Lzna79ZByGbB8MCwx5pRY7KDVNwm9VZ3iKFwg8tCjHH\" target=\"_blank\" rel=\"noopener\">https:\/\/app.meteora.ag\/dammv2\/5Lzna79ZByGbB8MCwx5pRY7KDVNwm9VZ3iKFwg8tCjHH<\/a>. Do not trade unofficial pools or lookalike tokens.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pool execution transaction: <a href=\"https:\/\/solscan.io\/tx\/24vhL8sYhGquvc4Hz699rux4q6t1mcbB8LKDY5ZFnsd2RLBf4SA8PcpP1fqX13TR5SsvaC7xscadv9Y5qdqiz4mt\" target=\"_blank\" rel=\"noopener\"><code>24vhL8sYhGquvc4Hz699rux4q6t1mcbB8LKDY5ZFnsd2RLBf4SA8PcpP1fqX13TR5SsvaC7xscadv9Y5qdqiz4mt<\/code><\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Migration claim deadline and unclaimed tokens<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The claim portal will stay open for 90 days. After the deadline, Token Metrics will no longer support Base TMAI. The supported token will be Solana TMAI.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Any unclaimed migration tokens move to the <strong>TM Community Reserve<\/strong>. This is separate from the TM Foundation treasury.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What we have done<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Paid back eligible Base veTMAI stakers from TM Foundation treasury, including staking rewards.<\/li>\n\n\n\n<li>Recovered admin access needed for incident response and moved Base proxy upgrade control to multisig.<\/li>\n\n\n\n<li>Locked the final Base snapshot for the migration.<\/li>\n\n\n\n<li>Removed attacker wallets and compromised contract wallets from the automatic claim tree.<\/li>\n\n\n\n<li>Added remaining vesting amounts to the claim for each vesting recipient&#8217;s Base wallet.<\/li>\n\n\n\n<li>Deployed the Solana TMAI mint, claim program, distributor, and claim vault.<\/li>\n\n\n\n<li>Published the migration portal for wallet checks.<\/li>\n\n\n\n<li>Committed to removing single-signer admin wallets from future deployments.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Attacker-controlled wallets excluded from migration<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Our review identified the following attacker wallets and compromised contract wallets. These addresses are excluded from the Solana migration. TMAI held by them at the snapshot block will not be honored on Solana.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Base (chain 8453)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>0xF104C65C228EeC0752c0B2779eBf112997a1866B<\/code> &#8211; compromised admin wallet<\/li>\n\n\n\n<li><code>0x4fB5EfE430cb915fCFE784e922c460F256405946<\/code> &#8211; attacker-controlled Safe<\/li>\n\n\n\n<li><code>0x14949BB1cc673a89539A4aa51E678ec6C8C4e5d7<\/code> &#8211; TMAI Vesting proxy<\/li>\n\n\n\n<li><code>0x5383b73486469742d55668F84e31300626D012F8<\/code> &#8211; veTMAI proxy<\/li>\n\n\n\n<li><code>0x836dF31FA999524FCDf2326eBc926ED1339aB68f<\/code> &#8211; secondary proxy<\/li>\n\n\n\n<li><code>0x0C0d95EFd40E391B0d23886FBB9Cb99bf835318d<\/code> &#8211; ProxyAdmin #1<\/li>\n\n\n\n<li><code>0x38be05A39bA3fe48c8f438d9D5A6e71bbf898EDA<\/code> &#8211; ProxyAdmin #2<\/li>\n\n\n\n<li><code>0xE754e4E12bF31Af34D326F6F368A0d350338637b<\/code> &#8211; malicious implementation contract<\/li>\n\n\n\n<li><code>0x88827bEb24D33Bd154AF01BE604691585f01CB43<\/code> &#8211; malicious implementation contract<\/li>\n\n\n\n<li><code>0xa820De9720ae2fd1436Eb73Fc7693C8396F094bA<\/code> &#8211; malicious implementation contract<\/li>\n\n\n\n<li><code>0xA149044aBB619622b86Fc520823f2d711A465FeF<\/code> &#8211; direct USDC cashout wallet<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Ethereum Mainnet (chain 1)<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>0x4BA938F3541191A824A71198B9DFAD464C27338c<\/code> &#8211; cross-chain intermediary<\/li>\n\n\n\n<li><code>0x8Aa6e8A46B458d15702E1Ea120D6A7Fd11daCce1<\/code> &#8211; Binance deposit funnel<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently asked questions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Can I check eligibility before claims open?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. Wallet checks are live now at <a href=\"https:\/\/tokenmetrics.com\/migration\/#check-eligibility\" rel=\"noopener\" target=\"_blank\">tokenmetrics.com\/migration<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Do I need to burn Base TMAI?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">For the self-custody claim portal, no. The portal checks the locked Base snapshot and pays eligible Solana TMAI from the Solana claim vault.<\/p>\n\n\n\n<div class=\"tm-migration-alert tm-migration-alert-exchange\" style=\"border:1px solid #dc2626;background:#fef2f2;color:#7f1d1d;padding:14px 16px;border-radius:8px;margin:18px 0;\">\n<div style=\"font-weight:800;margin:0;\">Exchange users: do not burn, send, withdraw, or move exchange-held TMAI until Token Metrics publishes the separate exchange-held process.<\/div>\n<\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Which Base wallet do I sign with?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use the Base wallet that held eligible TMAI at the snapshot block. The portal will show the eligible Base address after lookup.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Which Solana wallet receives the tokens?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You choose the Solana wallet during the claim flow. Make sure you control it before you submit the claim.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What if I held TMAI on an exchange?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><strong style=\"color:#b91c1c;\">Do not move TMAI from an exchange just to use the wallet checker.<\/strong> Exchange-held TMAI will be handled in a separate follow-up path. The portal can only check Base wallets. It cannot read exchange accounts or prove what a customer held inside an exchange account. Moving tokens from an exchange after the snapshot does not make the new wallet eligible for the self-custody claim flow.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What if I was in vesting?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If you still had TMAI left in a vesting schedule, we added that remaining amount to the claim for your Base wallet. It will be paid as unlocked Solana TMAI. Check the Base wallet tied to your vesting schedule.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Where can I verify a completed claim?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">After a claim is complete, the portal shows the Solana transaction, destination wallet, token account, and claim status account. Use the Solscan links in the portal to check it on-chain.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What if Phantom does not show my Solana TMAI after I claim?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Your claim can be complete on Solana even if Phantom does not show the token immediately. TMAI is a new Solana token, so Phantom may hide it or show it without price data at first.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open Phantom.<\/li>\n<li>Go to your Solana account.<\/li>\n<li>Open the token list or Manage Tokens screen.<\/li>\n<li>Search for <strong>TMAI<\/strong> or paste the mint address: <code>JBH3sZw1MFHunc4ifgLFkUKGecDpB1FwSXkEo8PnCD4Z<\/code>.<\/li>\n<li>Turn the token on if it is hidden.<\/li>\n<li>If it still does not appear, use Solscan to verify your token account and check again later after Phantom refreshes its token list.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Use Solscan as the source of truth: <a href=\"https:\/\/solscan.io\/token\/JBH3sZw1MFHunc4ifgLFkUKGecDpB1FwSXkEo8PnCD4Z\" target=\"_blank\" rel=\"noopener\">https:\/\/solscan.io\/token\/JBH3sZw1MFHunc4ifgLFkUKGecDpB1FwSXkEo8PnCD4Z<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Will Base TMAI still be supported?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">No. Base TMAI will no longer be supported after the 90-day claim window closes. The supported token will be Solana TMAI.<\/p>\n\n\n\t\t<aside\n\t\tclass=\"tm-token-stats\"\n\t\tdata-tm-token-stats\n\t\tdata-tm-stats-id=\"solana\"\n\t\tdata-tm-stats-lookback=\"365\"\n\t\taria-label=\"Solana key statistics\"\n\t>\n\t\t<header class=\"tm-token-stats__header\">\n\t\t\t<h3 class=\"tm-token-stats__title\">Solana \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\n\t\t<aside\n\t\tclass=\"tm-token-card\"\n\t\trole=\"complementary\"\n\t\taria-label=\"Track Solana (SOL) with Token Metrics\"\n\t\tdata-tm-token-card=\"sol\"\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\">Solana<\/span>\n\t\t\t\t<span class=\"tm-token-card__ticker\">SOL<\/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 class=\"tm-token-card__cta\" href=\"https:\/\/tokenmetrics.com\/?utm_source=tm_blog&#038;utm_medium=token_card&#038;utm_campaign=signal_sol#premium\" rel=\"noopener\" target=\"_blank\">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","protected":false},"excerpt":{"rendered":"The TMAI migration from Base to Solana is open for wallet checks. Claims open Tuesday, May 5, 2026 at 10:00 AM Austin time. The TMAI token contract was not hacked, and user wallets were not drained. Eligible Base veTMAI stakers have already been paid back from the TM Foundation treasury, including staking rewards.","protected":false},"author":1,"featured_media":4190,"comment_status":"closed","ping_status":"closed","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_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[157],"tags":[149,192,193],"sections":[],"entities":[],"class_list":["post-1922","post","type-post","status-publish","format-standard","has-post-thumbnail","category-announcements","tag-solana","tag-tmai","tag-token-migration","cs-entry","cs-video-wrap"],"jetpack_featured_media_url":"https:\/\/tokenmetrics.com\/blog\/wp-content\/uploads\/2026\/06\/tmai-migration-to-solana-5-critical-holder-steps-tm-hero-1782432096109.webp","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/posts\/1922","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=1922"}],"version-history":[{"count":51,"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/posts\/1922\/revisions"}],"predecessor-version":[{"id":5946,"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/posts\/1922\/revisions\/5946"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/media\/4190"}],"wp:attachment":[{"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/media?parent=1922"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/categories?post=1922"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/tags?post=1922"},{"taxonomy":"section","embeddable":true,"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/sections?post=1922"},{"taxonomy":"entity","embeddable":true,"href":"https:\/\/tokenmetrics.com\/blog\/wp-json\/wp\/v2\/entities?post=1922"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}