(()=>{'use strict';const $=s=>document.querySelector(s);const read=(k,session=false)=>{try{return(session?sessionStorage:localStorage).getItem(k)}catch{return null}};const store=(k,v,session=false)=>{try{(session?sessionStorage:localStorage).setItem(k,v);return true}catch{return false}};const menu=$('.menu-toggle');menu.addEventListener('click',()=>{const open=menu.getAttribute('aria-expanded')==='true';menu.setAttribute('aria-expanded',String(!open));menu.setAttribute('aria-label',open?'Open menu':'Close menu');$('#mobile-nav').hidden=open});document.addEventListener('keydown',e=>{if(e.key==='Escape'){menu.setAttribute('aria-expanded','false');menu.setAttribute('aria-label','Open menu');$('#mobile-nav').hidden=true}});const consent=$('#consent');consent.hidden=!!read('dm-consent');document.querySelectorAll('[data-consent]').forEach(b=>b.addEventListener('click',()=>{store('dm-consent',b.dataset.consent);consent.hidden=true}));$('[data-preferences]').addEventListener('click',()=>{consent.hidden=false;consent.querySelector('button').focus()});let toastTimer;function toast(text){$('#toast').textContent=text;$('#toast').hidden=false;clearTimeout(toastTimer);toastTimer=setTimeout(()=>$('#toast').hidden=true,6000)}const tokens={ETH:3245,USDT:1,USDC:1,DAI:1,WBTC:64000,LINK:14.8};const routes=[{name:'Uniswap V3',icon:'U',fee:.0002,gas:8,impactFactor:1},{name:'1inch',icon:'1',fee:.0006,gas:6,impactFactor:1.5},{name:'ParaSwap',icon:'P',fee:.001,gas:5,impactFactor:2}];const fmt=(v,d=4)=>v.toLocaleString('en-US',{maximumFractionDigits:d,minimumFractionDigits:Math.min(2,d)});const form=$('#compare-form');if(form){let timer=null,current=null;const amount=$('#amount'),from=$('#from-token'),to=$('#to-token'),save=$('#save-search');function values(){const n=Number(amount.value);if(!amount.value||!Number.isFinite(n)||n<.000001||n>1e8)return{error:'Enter an amount between 0.000001 and 100,000,000.'};if(from.value===to.value)return{error:'Choose two different tokens to compare a pair.'};return{n,from:from.value,to:to.value}}function render(v){const inputUSD=v.n*tokens[v.from];const data=routes.map(r=>{const impact=Math.min(.02,inputUSD/3245*.0001*r.impactFactor);const output=v.n*tokens[v.from]/tokens[v.to]*(1-r.fee-impact);return{...r,impact,output,net:output-r.gas/tokens[v.to]}}).sort((a,b)=>b.net-a.net);const list=$('#quote-list');list.replaceChildren();data.forEach((r,i)=>{const row=document.createElement('div');row.className='quote-row'+(i===0?' best':'');const icon=document.createElement('span');icon.className='route-icon';icon.textContent=r.icon;const identity=document.createElement('div');const name=document.createElement('p');name.className='route-name';name.textContent=r.name;if(i===0){const badge=document.createElement('span');badge.className='best-tag';badge.textContent='BEST NET';name.append(badge)}const meta=document.createElement('p');meta.className='route-meta';meta.textContent='Gas $'+r.gas+' · Impact '+(r.impact*100).toFixed(3)+'%';identity.append(name,meta);const out=document.createElement('div');out.className='route-output';out.textContent=fmt(r.output,tokens[v.to]>100?6:4)+' '+v.to;const net=document.createElement('small');net.textContent=r.net<0?'Below sample gas cost':'Net '+fmt(r.net,tokens[v.to]>100?6:4)+' '+v.to;out.append(net);row.append(icon,identity,out);list.append(row)});const difference=(data[0].net-data[data.length-1].net)*tokens[v.to];$('#savings-amount').textContent='$'+fmt(difference,2)+' in this example';$('#quotes').hidden=false;$('#compare-loading').hidden=true;save.disabled=false;form.setAttribute('aria-busy','false');current=v}function calculate(immediate=false){clearTimeout(timer);current=null;const v=values();$('#compare-error').textContent=v.error||'';amount.setAttribute('aria-invalid',v.error&&v.error.startsWith('Enter')?'true':'false');$('#quotes').hidden=true;save.disabled=true;$('#compare-loading').hidden=!!v.error;form.setAttribute('aria-busy',String(!v.error));if(v.error){form.setAttribute('aria-busy','false');return}if(immediate)render(v);else timer=setTimeout(()=>render(v),650)}form.addEventListener('submit',e=>{e.preventDefault();calculate()});[from,to].forEach(el=>el.addEventListener('change',()=>calculate()));amount.addEventListener('input',()=>calculate());$('#reverse-pair').addEventListener('click',()=>{const prev=from.value;from.value=to.value;to.value=prev;calculate()});save.addEventListener('click',()=>{if(!current)return;const saved=store('dm-search',JSON.stringify(current),true);toast(saved?'Demo search saved in this tab. No price alert is created or delivered.':'Your browser blocked session storage. This demo search could not be saved.');});calculate(true);window.addEventListener('pagehide',()=>clearTimeout(timer));window.addEventListener('pageshow',e=>{if(e.persisted)calculate(true)})}const monthly=[{month:'APR',volume:4200,gas:70,swaps:12},{month:'MAY',volume:6840,gas:105,swaps:19},{month:'JUN',volume:5640,gas:86,swaps:16},{month:'JUL',volume:9000,gas:150,swaps:25},{month:'AUG',volume:8160,gas:141,swaps:23},{month:'SEP',volume:11400,gas:210,swaps:32}];if($('#chart-bars')){function period(n){const data=monthly.slice(-n);$('#metric-volume').textContent='$'+fmt(data.reduce((s,d)=>s+d.volume,0),0);$('#metric-gas').textContent='$'+fmt(data.reduce((s,d)=>s+d.gas,0),0);$('#metric-swaps').textContent=data.reduce((s,d)=>s+d.swaps,0);const bars=$('#chart-bars');bars.replaceChildren();for(const d of data){const bar=document.createElement('div');bar.style.setProperty('--height',(d.volume/12000*100)+'%');bar.title=d.month+': $'+fmt(d.volume,0)+' sample volume';const fill=document.createElement('i');const label=document.createElement('span');label.textContent=d.month;bar.append(fill,label);bars.append(bar)}$('.chart').setAttribute('aria-label',data.map(d=>d.month+' sample volume '+d.volume+' USD').join('; '));$('#chart-summary').textContent=data[0].month+(n>1?'–SEP':'')+' · '+n+' sample month'+(n>1?'s':'');document.querySelectorAll('[data-period]').forEach(b=>{const on=Number(b.dataset.period)===n;b.classList.toggle('active',on);b.setAttribute('aria-pressed',String(on))})}document.querySelectorAll('[data-period]').forEach(b=>b.addEventListener('click',()=>period(Number(b.dataset.period))));period(6)}const signup=$('#signup-form');if(signup){const p=new URLSearchParams(location.search).get('plan');if(['starter','pro','trader'].includes(p))$('#plan').value=p;try{const saved=JSON.parse(read('dm-search',true)||'null');if(saved&&tokens[saved.from]&&tokens[saved.to]&&Number.isFinite(saved.n)&&saved.n>0){$('#saved-search').textContent='Your saved demo search: '+saved.n+' '+saved.from+' → '+saved.to+'. No alert is active.';$('#saved-search').hidden=false}}catch{}signup.addEventListener('submit',e=>{e.preventDefault();if(!signup.reportValidity())return;$('#signup-success').textContent='Demo complete. Your '+$('#plan').selectedOptions[0].textContent.split(' — ')[0]+' selection is ready. No account, email or subscription was created.';$('#signup-success').hidden=false});['email','plan'].forEach(id=>$('#'+id).addEventListener('input',()=>$('#signup-success').hidden=true))}})();