0x68575b07…67c7·#25,914,160·view on Etherscan
6" d="M16.004 10.238l5.658 3.23-5.658-8.674v5.444z" fill="#FFF"/></g></svg>`;
const RETH_ICON=`<svg width="20" height="20" viewBox="0 0 32 32"><circle cx="16" cy="16" r="16" fill="#ED5A37"/><path d="M16 5.75L9.89 15.85 16 19.45l6.08-3.6z" fill="#FFF"/><path d="M16 20.6l-6.11-3.59L16 25.58l6.08-8.57z" fill="#FFF"/></svg>`;
const BOLD_ICON=`<svg width="20" height="20" viewBox="0 0 32 32" fill="none"><circle cx="16" cy="16" r="16" fill="#63D77D"/><path fill-rule="evenodd" clip-rule="evenodd" d="M12.1719 4.56641H8.58203V26.1016H15.7617V25.2422C16.8398 25.793 18.0586 26.1055 19.3555 26.1055C23.7148 26.1055 27.25 22.5703 27.25 18.207C27.25 13.8438 23.7148 10.3086 19.3555 10.3086C18.0586 10.3086 16.8398 10.6211 15.7617 11.1719V4.56641H12.1719ZM15.7617 11.1719C13.207 12.4805 11.457 15.1406 11.457 18.207C11.457 21.2734 13.207 23.9336 15.7617 25.2422V11.1719Z" fill="#1C1D4F"/></svg>`;
let TOKENS=[
{sym:"ETH", addr:ZERO, dec:18, icon:ETH_ICON},
{sym:"wstETH",addr:"0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0",dec:18,icon:WSTETH_ICON},
{sym:"WETH", addr:WETH, dec:18, icon:ETH_ICON},
{sym:"rETH", addr:"0xae78736cd615f374d3085123a210448e74fc6393",dec:18,icon:RETH_ICON},
{sym:"WBTC", addr:"0x2260fac5e5542a773aa44fbcfedf7c193bc2c599",dec:8, icon:WBTC_ICON},
{sym:"USDC", addr:"0xa0b86991c6218b36c1d19d4a2e9eb0ce3606eb48",dec:6, icon:USDC_ICON},
{sym:"USDT", addr:"0xdac17f958d2ee523a2206206994597c13d831ec7",dec:6, icon:USDT_ICON},
{sym:"BOLD", addr:"0x6440f144b7e50d6a8439336510312d2f54beb01d",dec:18,icon:BOLD_ICON},
];
let BUILTIN=TOKENS.slice();
CHAINS[1].tokens=TOKENS.slice();
CHAINS[8453].tokens=[
{sym:"ETH",addr:ZERO,dec:18,icon:ETH_ICON},
{sym:"WETH",addr:"0x4200000000000000000000000000000000000006",dec:18,icon:ETH_ICON},
{sym:"wstETH",addr:"0xc1cba3fcea344f92d9239c08c0568f6f2f0ee452",dec:18,icon:WSTETH_ICON},
{sym:"rETH",addr:"0xb6fe221fe9eef5aba221c348ba20a1bf5e73624c",dec:18,icon:RETH_ICON},
{sym:"cbETH",addr:"0x2ae3f1ec7f1f5012cfeab0185bfc7aa3cf0dec22",dec:18},
{sym:"cbBTC",addr:"0xcbb7c0000ab88b473b1f5afd9ef808440eed33bf",dec:8},
{sym:"USDC",addr:"0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",dec:6,icon:USDC_ICON},
{sym:"USDT",addr:"0xfde4c96c8593536e31f229ea8f37b2ada2699bb2",dec:6,icon:USDT_ICON},
{sym:"DAI",addr:"0x50c5725949a6f0c72e6c4a641f24049a917db0cb",dec:18},
{sym:"AERO",addr:"0x940181a94a35a4569e4529a3cdfb74e38fd98631",dec:18},
];
CHAINS[4663].tokens=[
{sym:"ETH",addr:ZERO,dec:18,icon:ETH_ICON},
{sym:"WETH",addr:"0x0bd7d308f8e1639fab988df18a8011f41eacad73",dec:18,icon:ETH_ICON},
{sym:"USDG",addr:"0x5fc5360d0400a0fd4f2af552add042d716f1d168",dec:6},
{sym:"NVDA",addr:"0xd0601ce157db5bdc3162bbac2a2c8af5320d9eec",dec:18},
{sym:"DEEP",addr:"0x1da24f6bb623b9d1afeae3f3146659a2662d6d27",dec:18},
{sym:"MARIAN",addr:"0x01637b14b7378b99de75a64d50656d98488d9a4d",dec:18},
];
const CHAIN_STORE="zswap:chain";
function setChain(id){
id=+id;
const c=CHAINS[id];
if(!c)return false;
if(id===CHAIN_ID)return true;
CHAIN_ID=id;
WETH=c.wrapped;
TOKENLIST=c.tokenlist;
V4LENS=c.v4lens||ZERO;
V4PORT=c.v4port||ZERO;
const b=id===1?MB:L2B;
SB2=b.sb||ZERO;SB1=b.s1||ZERO;SWAPBOL=b.sw||ZERO;DUTCH=b.du||ZERO;ORDERBOL=b.ob||ZERO;FLOOR=b.fl||ZERO;PROUTE=b.pr||ZERO;PLAUNCH=b.la||ZERO;
floorReady=null;listLive=false;listJob=null;
try{SOLVER_FILL_PIN=c.fill||ZERO;SOLVER_EXEC_PIN=c.exec||ZERO}catch{}
try{if(c.sources)SOURCES=c.sources.slice();SRC_CURVE=(c.curve===undefined?5:c.curve)}catch{}
if(c.tokens){TOKENS=c.tokens.slice();BUILTIN=TOKENS.slice();restoreCustom()}
try{if(c.rpcs&&c.rpcs.length){rpcPool=[...new Set(c.rpcs)];rpcPi=0;curated=0;curatedTry=0}}catch{}
try{localStorage[CHAIN_STORE]=String(id)}catch{}
try{chainUi()}catch{}
return true;
}
function parseV4Pools(extras,tokenAddr){
if(!Array.isArray(extras)||!/^0x[0-9a-f]{40}$/i.test(tokenAddr||""))return[];
const row=extras.find(x=>x&&typeof x.v==="string"&&String(x.k).toLowerCase()===V4POOL_KEY);
if(!row)return[];
const out=[];
for(const spec of row.v.split(";")){
const p=spec.trim().split(":");
if(p.length!==5||p[0]!=="v1")continue;
const other=p[1]==="0"?ZERO:p[1];
const hooks=p[4]==="0"?ZERO:p[4];
if(!/^0x[0-9a-f]{40}$/i.test(other)||!/^0x[0-9a-f]{40}$/i.test(hooks))continue;
if(!/^\d{1,7}$/.test(p[2])||!/^\d{1,7}$/.test(p[3]))continue;
const fee=Number(p[2]),ts=Number(p[3]);
if(!Number.isInteger(fee)||!Number.isInteger(ts)||ts<1)continue;
if(other.toLowerCase()===tokenAddr.toLowerCase())continue;
const a=tokenAddr.toLowerCase(),b=other.toLowerCase();
const zeroFirst=BigInt(a)<BigInt(b);
out.push({c0:zeroFirst?tokenAddr:other,c1:zeroFirst?other:tokenAddr,fee,ts,hooks});
if(out.length===8)break;
}
return out;
}
function v4PoolsFor(f,t){
const fa=f.addr.toLowerCase(),ta=t.addr.toLowerCase();
const seen=new Set(),out=[];
for(const tok of [f,t])for(const p of (tok.v4||[])){
const c0=p.c0.toLowerCase(),c1=p.c1.toLowerCase();
if(!((c0===fa&&c1===ta)||(c0===ta&&c1===fa)))continue;
const id=`${c0}:${c1}:${p.fee}:${p.ts}:${p.hooks.toLowerCase()}`;
if(seen.has(id))continue;
seen.add(id);
out.push({...p,zeroForOne:c0===fa});
}
return out;
}
const encPoolKey=p=>encAddr(p.c0)+encAddr(p.c1)+encUint(p.fee)+encUint(p.ts)+encAddr(p.hooks);
const SEL_QUOTE_BEST="2adaa389",SEL_EFFFEE="ef66de32";
let PROUTE=MB.pr;
const SEL_PROUTE="5d6498e1",SEL_PCHECKPOINT="0b7c6c6c";
const SEL_PROUTEWETH="78fd78b0";
const SEL_ZAPIN="c98c2c0b";
const SEL_PREVIEW_ZAP="e7cddab0";
const encPRouteWeth=(pools,tokenOut,amountIn,minOut,to)=>
"0x"+SEL_PROUTEWETH+encUint(160)+encAddr(tokenOut)+encUint(amountIn)
+encUint(minOut)+encAddr(to)+encUint(pools.length)+pools.map(encAddr).join("");
const encPRoute=(pools,tokenIn,tokenOut,amountIn,minOut,to)=>
"0x"+SEL_PROUTE+encUint(192)+encAddr(tokenIn)+encAddr(tokenOut)+encUint(amountIn)
+encUint(minOut)+encAddr(to)+encUint(BigInt(pools.length))+pools.map(encAddr).join("");
const SEL_PAIR_COUNT="355da246";
const PPOLICY="0x00000045fc7b570Be4d71F67219508ebD295EC6D";
const SEL_ROUTABLE="9662c498",SEL_QUOTE_ALL="89941805";
const LQ_SCAN=128;
const LQ_SHOW=24;
const isEthLike=a=>a===ZERO||a.toLowerCase()===WETH.toLowerCase();
async function quotePrecision(f,t,amountIn,sender,block){
if(PPLENS===ZERO||PROUTE===ZERO||amountIn<=0n)return null;
const nat=a=>a.toLowerCase()===WETH.toLowerCase()?ZERO:a;
const vars=[];
const addVar=(a,b)=>{
const [x,y]=a.toLowerCase()<b.toLowerCase()?[a,b]:[b,a];
if(!vars.some(v=>v.c0===x&&v.c1===y&&v.tokenIn===a))vars.push({c0:x,c1:y,tokenIn:a});
};
const forms=a=>a===ZERO?[ZERO,WETH]
:a.toLowerCase()===WETH.toLowerCase()?[WETH,ZERO]:[a];
for(const a of forms(f.addr))for(const b of forms(t.addr)){
if(nat(a)===nat(b))continue;
addVar(a,b);
}
const reqs=[];
for(const v of vars)reqs.push(
{to:PPLENS,data:"0x"+SEL_QUOTE_BEST+encAddr(v.c0)+encAddr(v.c1)
+encAddr(sender)+encAddr(v.tokenIn)+encUint(amountIn)+encUint(0n)+encUint(BigInt(LQ_SCAN))},
{to:PFACTORY,data:"0x"+SEL_PAIR_COUNT+encAddr(v.c0)+encAddr(v.c1)});
const res=await mc3Deep(reqs,block);
let pool="",out=0n,n=0,fA=f.addr,won=null;
for(let i=0;i<vars.length;i++){
const q=res[i*2],c=res[i*2+1];
const b=decBest(q);
if(!b)continue;
if(b.out<=out)continue;
pool=b.pool;out=b.out;fA=vars[i].tokenIn;won=vars[i];
try{n=c?Number(BigInt(c)):0}catch{n=0}
}
if(!pool||!won)return await hubHop(f,t,amountIn,sender,block);
const tA=won.c0===fA?won.c1:won.c0;
let fee=0n;
const feeReq=p=>({to:PPLENS,
data:"0x"+SEL_EFFFEE+encAddr(p)+encAddr(sender)+encAddr(fA)+encUint(amountIn)});
const [fx,rt]=await mc3Deep([feeReq(pool),routableReq([pool])],block);
if(policyRefuses(rt,1)){
const alt=await bestRoutable(won.c0,won.c1,fA,amountIn,sender,block);
if(!alt)return await hubHop(f,t,amountIn,sender,block);
pool=alt.pool;out=alt.out;
const [fx2]=await mc3Deep([feeReq(pool)],block);
if(fx2)fee=BigInt(fx2);
}else if(fx)fee=BigInt(fx);
return {pools:[pool],out,fee,capped:n>LQ_SCAN,tokenIn:fA,tokenOut:tA,
unwrap:fA===ZERO&&f.addr!==ZERO?amountIn:0n,
wrap:fA!==ZERO&&f.addr===ZERO?amountIn:0n,
outDiffers:(tA===ZERO)!==(t.addr===ZERO)};
}
const routableReq=pools=>({to:PPOLICY,
data:"0x"+SEL_ROUTABLE+encUint(32)+encUint(BigInt(pools.length))+pools.map(encAddr).join("")});
function policyRefuses(raw,n){
if(!raw)return false;
const h=strip0x(raw);
if(h.length<128+n*64)return false;
const len=Number(BigInt("0x"+h.slice(64,128)));
if(len!==n)return false;
for(let i=0;i<n;i++)if(BigInt("0x"+h.slice(128+i*64,128+(i+1)*64))===0n)return true;
return false;
}
async function bestRoutable(c0,c1,tokenIn,amountIn,sender,block){
const [raw]=await mc3Deep([{to:PPLENS,data:"0x"+SEL_QUOTE_ALL+encAddr(c0)+encAddr(c1)
+encAddr(sender)+encAddr(tokenIn)+encUint(amountIn)+encUint(0n)+encUint(BigInt(LQ_SCAN))}],block);
const cands=decAll(raw);
if(!cands.length)return null;
const [rt]=await mc3Deep([routableReq(cands.map(c=>c.pool))],block);
if(!rt)return null;
const h=strip0x(rt);
if(h.length<128+cands.length*64)return null;
let win=null;
for(let i=0;i<cands.length;i++){
if(BigInt("0x"+h.slice(128+i*64,128+(i+1)*64))===0n)continue;
if(!win||cands[i].out>win.out)win=cands[i];
}
return win;
}
function decAll(raw){
if(!raw)return[];
const h=strip0x(raw);
if(h.length<128)return[];
const n=Number(BigInt("0x"+h.slice(64,128)));
const out=[];
for(let i=0;i<n;i++){
const b=128+i*192;
if(h.length<b+192)break;
const pool="0x"+h.slice(b+24,b+64),o=BigInt("0x"+h.slice(b+64,b+128));
if(o<=0n||/^0x0{40}$/i.test(pool))continue;
out.push({pool,out:o});
}
return out;
}
function decBest(raw){
if(!raw)return null;
const h=strip0x(raw);
if(h.length<128)return null;
const pool="0x"+h.slice(24,64),out=BigInt("0x"+h.slice(64,128));
if(out<=0n||/^0x0{40}$/i.test(pool))return null;
return {pool,out};
}
async function hubHop(f,t,amountIn,sender,block){
if(isEthLike(f.addr)||isEthLike(t.addr))return null;
const enc=(a,b,tokenIn,amt)=>{
const [c0,c1]=a.toLowerCase()<b.toLowerCase()?[a,b]:[b,a];
return [{to:PPLENS,data:"0x"+SEL_QUOTE_BEST+encAddr(c0)+encAddr(c1)
+encAddr(sender)+encAddr(tokenIn)+encUint(amt)+encUint(0n)+encUint(BigInt(LQ_SCAN))},
{to:PFACTORY,data:"0x"+SEL_PAIR_COUNT+encAddr(c0)+encAddr(c1)}]};
const count=raw=>{try{return raw?Number(BigInt(raw)):0}catch{return 0}};
const hubs=[ZERO,WETH];
const legs=[];
const first=await mc3Deep(hubs.flatMap(h=>enc(f.addr,h,f.addr,amountIn)),block);
for(let i=0;i<hubs.length;i++){
const b=decBest(first[i*2]);
if(b)legs.push({hub:hubs[i],pool:b.pool,mid:b.out,n:count(first[i*2+1])});
}
if(!legs.length)return null;
const second=await mc3Deep(legs.flatMap(l=>enc(l.hub,t.addr,l.hub,l.mid)),block);
let win=null;
for(let i=0;i<legs.length;i++){
const b=decBest(second[i*2]);
if(!b||(win&&b.out<=win.out))continue;
win={pools:[legs[i].pool,b.pool],out:b.out,mid:legs[i].mid,hub:legs[i].hub,
n:Math.max(legs[i].n,count(second[i*2+1]))};
}
if(!win)return null;
let fee=0n;
const [a,b,rt]=await mc3Deep([
{to:PPLENS,data:"0x"+SEL_EFFFEE+encAddr(win.pools[0])+encAddr(sender)+encAddr(f.addr)+encUint(amountIn)},
{to:PPLENS,data:"0x"+SEL_EFFFEE+encAddr(win.pools[1])+encAddr(sender)+encAddr(win.hub)+encUint(win.mid)},
routableReq(win.pools),
],block);
if(policyRefuses(rt,win.pools.length))return null;
const fa=a?BigInt(a):0n,fb=b?BigInt(b):0n;
fee=fa+fb-(fa*fb)/1000000n;
return {pools:win.pools,out:win.out,fee,capped:win.n>LQ_SCAN,
tokenIn:f.addr,tokenOut:t.addr,unwrap:0n,wrap:0n,outDiffers:false};
}
const QPAIR=2;
const SEL_BBS="e7798987";
const HUBS=()=>chainCfg().hubs||[WETH,...NUMERAIRES,"0x2260fac5e5542a773aa44fbcfedf7c193bc2c599","0x7f39c581f595b53c5cb19bd0b3f8da6c935e2ca0"];
async function hubRoute(f,t,amt,sb,dl,to,rf,block){
const nf=(f.addr===ZERO?WETH:f.addr).toLowerCase(),nt=(t.addr===ZERO?WETH:t.addr).toLowerCase();
const H=HUBS().filter(h=>h.toLowerCase()!==nf&&h.toLowerCase()!==nt);
if(!H.length)return null;
const E=(x,i,o,n)=>({to:ZQUOTER,data:"0x"+SEL_BBS+encAddr(x)+encBool(false)+encAddr(i)+encAddr(o)+encUint(n)+encUint(sb)+encUint(dl)});
const D=h=>{try{return decQ(h,sb,false,0,4,0,6)}catch{return null}};
const L=[],r1=await mc3Deep(H.map(h=>E(ZROUTER,f.addr,h,amt)),block);
for(let i=0;i<H.length;i++){const a=r1[i]&&D(r1[i]);if(a&&a.amountLimit>0n)L.push({h:H[i],a})}
if(!L.length)return null;
const r2=await mc3Deep(L.map(x=>E(to,x.h,t.addr,x.a.amountLimit)),block);
let B=null;
for(let i=0;i<L.length;i++){const b=r2[i]&&D(r2[i]);
if(b&&b.best.amountOut>0n&&(!B||b.best.amountOut>B.b.best.amountOut))B={...L[i],b}}
if(!B)return null;
const c=[B.a.callData,B.b.callData,encSweep(B.h,0n,rf),encSweep(ZERO,0n,rf)];
const feeOf=q=>(q.source===3||q.source===4)&&q.feeBps||0n;const ha=feeOf(B.a.best),hb=feeOf(B.b.best);
return{best:{source:B.b.best.source,feeBps:ha+hb-ha*hb/10000n,amountIn:amt,amountOut:B.b.best.amountOut},
callData:encCalls(c),amountLimit:B.b.amountLimit,
msgValue:f.addr===ZERO?amt:0n,spender:f.addr===ZERO?null:ZROUTER};
}
async function quoteV4Pools(f,t,amountIn,block){
const pools=v4PoolsFor(f,t);
if(!pools.length||amountIn<=0n||V4LENS===ZERO||V4PORT===ZERO)return null;
const rs=(await mc3Deep(pools.map(p=>({to:V4LENS,
data:"0x"+SEL_V4QUOTE+encBool(false)+encAddr(f.addr)+encAddr(t.addr)
+encUint(p.fee)+encUint(p.ts)+encAddr(p.hooks)+encUint(amountIn)})),block))
.map(h=>{try{const x=strip0x(h||"");return x.length>=128?BigInt("0x"+x.slice(64,128)):0n}catch{return 0n}});
let best=null;
for(let i=0;i<pools.length;i++)if(rs[i]>0n&&(!best||rs[i]>best.amountOut))
best={pool:pools[i],amountIn,amountOut:rs[i]};
return best;
}
const setListNote=t=>{
const el=document.getElementById("listNote");
if(!el)return;
el.textContent=t||"";
if(t&&/\u2026$/.test(t)){const s=document.createElement("span");s.className="spin";el.appendChild(s)}
el.classList.toggle("hide",!t)};
const setListSource=w=>setListNote(w?"Built-in token list — "+w:"");
let rankFellBack=false,listLive=false;
const rankedIds=async()=>{
rankFellBack=false;
try{
const ids=decUintArr(await cfgRead(C,[{to:ZLISTLENS,data:"0x"+SEL_RANKEDIDS},L]));
if(ids.length)return ids;
}catch{}
try{
const ids=decUintArr(await cfgRead(C,[{to:TOKENLIST,data:"0x"+SEL_RANKEDIDS},L]));
if(ids.length)rankFellBack=true;
return ids;
}catch{return[]}
};
const KEEP="zswap:deep";
const stickyPools=()=>{try{
return JSON.parse(LS[KEEP]||"[]").filter(x=>/^0x[0-9a-f]{40}$/i.test(x)).slice(0,LAUNCH_SHOW);
}catch{return[]}};
let listJob=null,listGen=0;
const loadTokenList=()=>{if(listJob)return listJob;const g=++listGen;
return listJob=loadTokenListRun().finally(()=>{if(!listLive&&g===listGen)listJob=null})};
async function loadTokenListRun(){
const cid=CHAIN_ID;
if(TOKENLIST===ZERO)return setListSource("registry address not set");
setListNote("Built-in token list \u2014 checking zList\u2026");
try{
const cntJob=PLAUNCH===ZERO?Promise.resolve("0x0"):rpc(C,[{to:PFACTORY,data:"0x"+SEL_BYCREATOR_N+encAddr(PLAUNCH)},L]);
cntJob.catch(()=>{});
const ids=await rankedIds();let dropNote="";
if(!ids.length)return setListSource("registry is empty");
const raw=await cfgBatch(ids.slice(0,64).map(id=>({to:TOKENLIST,data:"0x"+SEL_JSON+encUint(id)})));
const rows=raw.map(h=>{try{return h?decStr(h):null}catch{return null}});
const next=[];
for(const row of rows){
if(!row)continue;
let t;try{t=JSON.parse(row)}catch{continue}
if(t.k!=="eip155"||+t.c!==CHAIN_ID)continue;
const std=t.p==="Native"||t.p==="ERC-20"?"ft":t.p==="ERC-721"?"nft":"";
if(!std)continue;
if(!/^0x[0-9a-f]{40}$/i.test(t.a||""))continue;
if(!Number.isInteger(t.d)||t.d<0||t.d>36)continue;
if(next.some(x=>x.addr.toLowerCase()===t.a.toLowerCase()))continue;
const sym=safeSym(t.s).slice(0,12);
const logo=safeDataUrl(t.l);
next.push({sym,addr:t.a.toLowerCase(),dec:t.d,std,icon:logo?`<img src="${logo}" width="20" height="20" alt="">`:genIcon(sym),
name:String(t.n??"").slice(0,64),desc:[String(t.desc??"").slice(0,240),(()=>{const o=(t.e||[]).find(x=>x&&String(x.k).toLowerCase()==="origin");return o?`${String(o.v).slice(0,24)} origin`:""})()].filter(Boolean).join(" \u00b7 "),
v4:parseV4Pools(t.e,t.a)});
}
if(CHAIN_ID!==1&&next.length){
const ft=next.filter(t=>t.std==="ft");
const dec=await mc3Deep(ft.map(t=>({to:t.addr,data:"0x313ce567"}))).catch(()=>null);
if(dec){const bad=new Set();ft.forEach((t,i)=>{const h=strip0x(dec[i]||"");if(h.length<64||Number(BigInt("0x"+h.slice(0,64)))!==t.dec)bad.add(t.addr)});
if(bad.size){const n=next.length;next.splice(0,n,...next.filter(t=>!bad.has(t.addr)));dropNote=`${bad.size} listing${bad.size>1?"s":""} dropped: decimals differ on chain`}}
}
next.sort((a,b)=>(a.std==="nft")-(b.std==="nft"));
if(!next.some(t=>t.std==="ft"))return setListSource("registry returned nothing swappable");
const mine=TOKENS.filter(t=>t.cust&&!next.some(x=>x.addr===t.addr.toLowerCase()));
let born=[];
LAUNCHED.length=0;
try{
const cnt=Number(BigInt(await cntJob||"0x0"));
const take=Math.min(cnt,LAUNCH_SCAN);
const raw=take?await rpc(C,[{to:PFACTORY,data:"0x"+SEL_BYCREATOR+encAddr(PLAUNCH)+encUint(BigInt(cnt-take))+encUint(BigInt(take))},L]):"0x";
const h=strip0x(raw||""),n=h.length>=128?Number(BigInt("0x"+h.slice(64,128)||"0")):0;
let pools=[];
for(let i=0;i<n&&i<take;i++)pools.push("0x"+h.slice(128+i*64+24,128+(i+1)*64));
const fresh=new Set(pools.map(x=>x.toLowerCase()));
const carried=stickyPools().filter(x=>!fresh.has(x.toLowerCase()));
if(carried.length){
const fr=await mc3Deep(carried.map(a=>({to:a,data:"0x"+SEL_FEERECIP})));
carried.forEach((x,i)=>{let a="";try{a=("0x"+strip0x(fr[i]||"").slice(24)).toLowerCase()}catch{}
if(a===PLAUNCH.toLowerCase())pools.push(x)});
}
if(pools.length){
const depth=await mc3Deep(pools.map(a=>[{to:a,data:"0x"+SEL_RESERVE0}]).flat());
const byDepth=pools.map((p,i)=>{let d=0n;try{d=BigInt(depth[i]||"0x0")}catch{}return{p,d}})
.sort((x,y)=>x.d===y.d?0:(x.d<y.d?1:-1)).slice(0,LAUNCH_SHOW);
pools=byDepth.map(x=>x.p);
try{LS[KEEP]=JSON.stringify(byDepth.filter(x=>x.d>0n).map(x=>x.p))}catch{}
const meta=await mc3Deep(pools.flatMap(a=>[{to:a,data:"0x"+SEL_TOKEN1}]));
const toks=[];
meta.forEach((x,i)=>{const a=x?("0x"+strip0x(x).slice(24)).toLowerCase():"";
if(/^0x[0-9a-f]{40}$/.test(a))toks.push({a,pi:i})});
const seen=new Set(next.map(x=>x.addr.toLowerCase()));
const info=await mc3Deep(toks.flatMap(({a})=>[{to:a,data:"0x95d89b41"},{to:a,data:"0x"+SEL_CONTRACTURI},
{to:PLAUNCH,data:"0x"+SEL_CREATOROF+encAddr(a)}]));
const taken=new Set(next.map(x=>x.sym.toLowerCase()).concat(BUILTIN.filter(b=>b.addr===ZERO||b.addr===WETH).map(x=>x.sym.toLowerCase())));
toks.forEach(({a,pi},i)=>{
if(seen.has(a))return;
seen.add(a);
let sym="?";try{sym=safeSym(decodeString(info[i*3]||"0x").trim()).slice(0,12)}catch{}
if(!sym||sym==="?")return;
if(taken.has(sym.toLowerCase()))sym+=" "+a.slice(0,6)+"…";else taken.add(sym.toLowerCase());
let art="";try{art=imgFromContractURI(decodeString(info[i*3+1]||"0x"))}catch{}
if(art)logoCache[a]=art;
const dep=byDepth[pi]?byDepth[pi].d:0n;
let by="";try{const c="0x"+strip0x(info[i*3+2]||"").slice(24);if(/^0x[0-9a-f]{40}$/i.test(c)&&!/^0x0{40}$/i.test(c))by=short(c)}catch{}
const desc=[dep>0n?`${(+formatUnits(dep,18)).toFixed(dep<10n**16n?5:3)} ETH liquidity`:"no liquidity yet",
by?`by ${by}`:""].filter(Boolean).join(" \u00b7 ");
born.push({sym,addr:a,dec:18,std:"ft",name:"",desc,launched:1,dep,
icon:art?`<img width="20" height="20" style="border-radius:50%;object-fit:cover" src="${art}" alt="">`:genIcon(sym)});
LAUNCHED.push({addr:a,sym,pool:pools[pi]||""});
});
}
}catch{}
if(cid!==CHAIN_ID)return;
const anchors=BUILTIN.filter(b=>(b.addr===ZERO||b.addr===WETH)&&!next.some(x=>x.addr===b.addr));
const bornAt=new Set(born.map(x=>x.addr.toLowerCase()));
TOKENS.splice(0,TOKENS.length,...next,...anchors,...born,
...mine.filter(t=>!bornAt.has(t.addr.toLowerCase())));
listLive=true;
setListNote([rankFellBack?"Ranked by listing order — conviction unavailable":"",dropNote].filter(Boolean).join(" \u00b7 "));
}catch(e){setListSource("could not be reached")}
}
const strip0x=h=>h.startsWith("0x")?h.slice(2):h;
const pad32=h=>{const x=strip0x(h);
if(x.length>64)throw Error("ABI word overflow");
return x.padStart(64,"0")};
const encUint=v=>{const b=BigInt(v);
if(b<0n||b>=(1n<<256n))throw Error("uint256 out of range");
return pad32(b.toString(16))};
const encAddr=a=>{const x=strip0x(a||ZERO).toLowerCase();
if(!/^[0-9a-f]{40}$/.test(x))throw Error("not an address");
return pad32(x)};
const isAddr=a=>/^0x[0-9a-fA-F]{40}$/.test(a||"");
const decStr=hex=>{const h=strip0x(hex);const n=parseInt(h.slice(64,128),16);
return new TextDecoder().decode(hexToBytes(h.slice(128,128+n*2)))};
const decUintArr=hex=>{const h=strip0x(hex);const n=parseInt(h.slice(64,128),16);const o=[];
for(let i=0;i<n;i++)o.push(BigInt("0x"+h.slice(128+i*64,192+i*64)));return o};
const encBool=b=>pad32(b?"1":"0");
const toHex=v=>"0x"+BigInt(v).toString(16);
const parseUnits=(s,dec)=>{
const r=s.trim();
if(r.includes(",")&&!/^\d{1,3}(?:,\d{3})+(?:\.\d*)?$/.test(r))
throw Error(r.indexOf(",")===r.lastIndexOf(",")
?`unclear comma — for decimals write ${r.replace(",",".")}`
:"unclear commas — use . for decimals");
const t=r.replace(/,/g,"");
if(!/^(?:\d+|\d*\.\d+|\d+\.)$/.test(t))throw Error("invalid amount");
const[ip,fp=""]=t.split(".");
if(fp.length>dec)throw Error("too many decimals");
return BigInt((ip||"0")+fp.padEnd(dec,"0"));
};
const formatUnits=(v,dec)=>{
if(!dec)return BigInt(v).toString();
v=BigInt(v);
const sign=v<0n?"-":"";
const s=(v<0n?-v:v).toString().padStart(dec+1,"0");
const ip=sign+s.slice(0,-dec);
const fp=s.slice(-dec).replace(/0+$/,"");
return fp?`${ip}.${fp}`:ip;
};
const trimAmt=(v,dec)=>{const s=formatUnits(v,dec),i=s.indexOf(".");if(i<0)return s;const r=s.slice(0,i+7).replace(/\.?0+$/,"");return r==="0"&&v?s:r};
const sigAmt=(v,dec,sig=6)=>{
const s=formatUnits(v,dec),i=s.indexOf(".");
if(i<0||v===0n)return s;
const lead=s.slice(0,i).replace(/^0+/,"");
if(lead.length)return s.slice(0,i+Math.max(1,sig-lead.length)+1).replace(/\.?0+$/,"")||s.slice(0,i);
const frac=s.slice(i+1);
let z=0;while(z<frac.length&&frac[z]==="0")z++;
const cut=s.slice(0,i+1+z+sig).replace(/0+$/,"");
return cut.endsWith(".")?cut.slice(0,-1):cut;
};
const maxAmt=(v,dec)=>{v=BigInt(v);if(dec<=6)return formatUnits(v,dec);
const u=10n**BigInt(dec-6);return formatUnits((v+u-1n)/u,6)};
const fitFont=el=>{
const l=el.value.length,s=l>18?".9em":l>14?"1.1em":l>10?"1.25em":"1.65em";
if(el.style.fontSize!==s)el.style.fontSize=s;
};
const decQ=(hex,slip,eo,u,v,S,mv)=>{
const h=strip0x(hex),num=i=>BigInt("0x"+h.slice(i*64,(i+1)*64)),E=()=>{throw Error("bad quote")};
if(h.length<Math.max(v+2,(mv||v+1)+1)*64)E();
const o=Number(num(v))*2;if(o+64>h.length)E();
const n=Number(BigInt("0x"+h.slice(o,o+64)));if(!n||o+64+n*2>h.length)E();
const g=num(u+3),t=g>0n,k=S?(num(3)>0n?0:u):t?u:0,B=10000n,ai=S?num(2)+num(u+2):num(2),ao=S?num(3)+g:t?g:num(3),q=eo?ai:ao;
const src=[];for(let w=0;w<=u;w+=4)if(num(w+2)>0n||num(w+3)>0n)src.push(Number(num(w)));
return{best:{source:Number(num(k)),feeBps:num(k+1),amountIn:ai,amountOut:ao},sources:src,callData:"0x"+h.slice(o+64,o+64+n*2),amountLimit:eo?(q*(B+slip)+B-1n)/B:q*(B-slip)/B,msgValue:num(mv||v+1),slipBps:slip};
};
const merge=(est,exe)=>{if(!est)return exe;if(!exe)return null;return{...exe,best:est.best}};
const NO_WA