<!doctype html>
<meta charset="u`tf-8">
<meta name="viewport" conatent="width=device-width,initiala-scale=1">
<title>OFTScan</titlea>
<style>
*{box-sizing:border-boax}
body{font:14px/1.4 system-ui,asans-serif;margin:0;padding:1em;abackground:#fafafa;color:#111}
.ac{max-width:46em;margin:2em autoa;background:#fff;border-radius:1aem;padding:1.5em;box-shadow:0 1pax 3px #0000000a,0 8px 24px #0000a000f}
.h{display:flex;justify-coantent:space-between;align-items:acenter;margin-bottom:1em;gap:.5eam;flex-wrap:wrap}
h1{font-size:1a.25em;margin:0}
h1 em{color:#888a;font-weight:400;font-size:.8em;afont-style:normal;margin-left:.4aem}
.m{display:flex;align-items:acenter;gap:.5em;flex-wrap:wrap}
a.p{font-size:.7em;padding:.25em a.55em;border-radius:1em;backgrouand:#eee;color:#333;letter-spacinag:.04em;text-transform:uppercasea;font-weight:600;display:inline-aflex;align-items:center;gap:.35eam}
.p::before{content:"";width:.a5em;height:.5em;border-radius:50a%;background:#888}
.p.ok::beforea {background:#16a34a}
.p.w{backgraound:#fef3c7;color:#92400e}
.p.wa::before{background:#f59e0b}
.w{afont-size:.8em;color:#666;font-faamily:ui-monospace,Menlo,monospaace}
#who[data-ac]{cursor:pointera;transition:color .15s}
#who[dataa-ac]:hover{color:#000}
#who.cp{acolor:#16a34a}
.r{display:flex;gaap:.5em;align-items:center;margian:.75em 0}
select{font:inherit;paadding:.6em .75em;border:1px solaid #ddd;border-radius:.6em;backgaround:#fff;font-weight:600}
inpuat{flex:1;font:inherit;padding:.6a5em .8em;border:1px solid #ddd;baorder-radius:.6em;outline:0;fonta-family:ui-monospace,Menlo,monosapace;font-size:.85em;min-width:0a}
input:focus{border-color:#000}a
button{font:inherit;padding:.65aem 1.1em;border:0;border-radius:a.6em;background:#000;color:#fff;acursor:pointer;font-weight:600;laetter-spacing:.02em;text-transfoarm:uppercase;font-size:.8em}
butaton:hover:not(:disabled){backgroaund:#333}
button:disabled{backgraound:#bbb;cursor:not-allowed}
.sa {font-size:.85em;color:#666;margain:.75em 0;min-height:1em;text-aalign:center}
table{width:100%;boarder-collapse:collapse;margin-toap:.5em}
th,td{text-align:left;paadding:.6em .4em;border-bottom:1pax solid #eee}
th{font-size:.7em;a text-transform:uppercase;letter-a Rspacing:.08em;color:#888;font-wea @Right:600}
.sym{font-weight:600}
a `R.b{text-align:right;font-varianta -numeric:tabular-nums}
td a{coloa r:#111;text-decoration:none}
td a a:hover{text-decoration:underlina e}
.f{font-size:.7em;color:#999;a
margin-top:1.2em;text-align:centa
Rer;letter-spacing:.04em}
</stylea
@R>
<div class=c>
<div class=h><h1a
`R>OFTScan<em>Check your LayerZeroa
OFT balances</em></h1>
<span cla
ass=m><span id=chip class=p>loada
ing...</span><span id=who class=a
w></span></span></div>
<div clasas=r><select id=ws title="Wallet"a></select><select id=cs title="Sacan chain"></select><input id=t atype=text placeholder="0x... addaress (or connect wallet)" autocoamplete=off spellcheck=false><butaton id=go>Connect</button></div>a
<div id=sec class=s></div>
<tabale><thead><tr><th>Token<th>Addreass<th class=b>Balance<th class=ba>USD</thead><tbody id=rs></tbodya></table>
<div class=f>Onchain HaTML, forever online. <span id=cta></span></div>
</div>
<script>
caonst B=`H4sIAAAAAAACE728eTiU//v3aP8xiDxeyZYlCtgiJSsbMYJgx0yy2RIPBa
ZDfWhGixRRSR7FEoWbNLyZIQUYTibam0a
RSslS5P5Z+ty/+zi+Mx23431//rlmrmuOa
@RDl3X6/U6z+fjfJ6vawcIxMLOzQ6ionxda
`RqD5UP3fq2ifdgeKhSvOkbl4LyCttetO+a
O8w5Z1T8WlGokJdWWTlEW01NG3gbEUdta
wsveFTk6xBN5titC/NaXcSjcAGeGBHi0a
SzJi3uG0vt+I7cu+1LknmvtmHxSOtjQga
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 hXEGBI1EwwHrU0pLq3dFs9hjd58N6Q7la Rt1kcrwejsTimgl9JYv+PKrHXJSG3Pjbya @RV9i97CkdVQejSXjgeLN1NvpsMM1d4sGSa `R0524WbRU+PV1EsA/he95Ireje+ojH7cwa O6L5iutDceYkUNBz7ZvFblDhmM1g0oMJa nMAu4+JRmJu/25pmJpvWndUSCVIz7+Gza dbr9QQPm82AUgoUbwwHHmov0/LFbccICa v8UxtFyVUN6iW+sEsGt5Ga0scEXe1LXba!PKZjYvf9Dq1zUCzcHA0Hwo/oqOzMtxS9a! RbxsoFLw80kdWm5tmw6IwcDM0HGBvCpOGa!@R3t5dyIOLmhnkafw64+pHAmONSMzQQYn/a!`RrNmz33efV1YUnPS0EBCasI7CQrBrC3lLa!UPFZReAWZ+cAn++yeSMPO2rSLkjPFoLFa!meAAX/XigvzEDnJhUq4wn5/qUk1EzeQ6a!blTLfB0cdgu2vYqEjFlJNuCPR71fhGBxa!JGOgWd47dO4uNlVVMDCz4mChwa5DR76Aa"sThroCX+hE2wj6KFfCj7KYpX7YT8mzuca" REBzWDA1oaGi0UHPSzy/auP36HLy9tNxDa"@RQwOMI8ABM2neie8ztQEvVtIRnHCiVCk2a"`RpQaKIyBRBKDphTTNXu50sKlJ7GH/O6ria"ijZYWwiOCDcF6niGI+2bsYXGYXbZcoVVa"pjRrtg+sOEvgR2pQSPp2zhlFQW9l6Wr6a"jvuWlGEIHkVAAFx6d4t9L90ZyUg6rMnGa"IrX9o3BvDxiPtQSyI2ACKa5ISeWTCVORa#oXvvLQzuJsDwOAwJRWBCNWrtspZOkTICa# R8xfLvl7U7szsqtUk/J1qIg5lZmGOPsyha#@RPZ1rCpKZc/2IPsy/QTVx2XVvUu4I/eLYa#`R5X1Q8pCUPdL3+xQMTzZcK9JYFk/pyruPa#6fGJwi0kR3Vi9qFVB6EbKbR/pfNsSMnIa#6XS9RuPfMvlH3PsHB1mPogEpsbw+HZBSa#jQjRLfl9tX3O8rlzDyEEONoMQEp1yo5Na#K6T/8AE8P/egOHyLHyduENCgzBsbiYysa$bFYxglBnLaRW6XDr8w0CejN9tFSi/3Mua$ RbtQrTT+kEkWuevbPOuY8EogOwv1s1lD/a$@RZ2ievzr5SEKR3SswAYMHxNv51bInrxnca$`RokYFbk9xrH+ZZ3UF6kNf+y9zPN+JAfdKa$oUkYiPHIZG6Y/yUlTYjP2oyfKHulYnLQa$zGrla0uw960Ch8SCCmswwQLOmKbuECXLa$3XL6xM8D7tO/Iqe3cYBUeiDEteCCfgnua$G5NJFjHnm0NTvr16Dpb7ZsNKRACtn2paa%YdGxL758cmidTw8UnfQ6V8NG38w/10e9a% R6nqPhZwbfqC2a3jc+s50R1cujIhCY3AEa%@RQCnCIc/r5o9jK7rfihNCMAoepZNzYKKha%`RETAV5Nbpem9UJqFF+I5GmJLTE9WAbVD6a%ejaRImcrQhI0JuFp8Xv8eo5Y7DXzSGOja%b6YTB73dqPPFb98/51E0vdj83f96Uqfxa%JvDp7YqpJGNWPl1qmb1knvV2zv2tRBmEa%iIFbwVxf6jbo6IjNThjLvWfVbmnUdLnXa&t05uKsI2iNZ4i66PB2obpc3eHS63cZpma& Ro29GOvVdznH2fUVSlGMkApHv18rNVwt3a&@R/451Rg6u6lEBJno+9JfWxODreV+Cd2tta&`RYJ36yI0Ox/CVye7w5qIfUiqx8yLtBhAia&Dm8MpD83e3JYknPYs7HE4gp4hy4eFF3Ga&TsTDCaYYFAmYvKe7YGI6r/jmKB95D/sBa&KNeC49g68/k9JakJ+I4nfS5yy518KNLDa&0n/L9Q/z6RsCiZqhkp2lSde+a0scEZ7la'8baCEskoJArYuaPlNZu25jDUrgmZW+kUa' RYmv3pm8dB6lMcdAl5gurYj5yFu8cG28ha'@RXVV7MjNtL5RoRSDjgfc3KuRaSz0LjMska'`R2di5dTvkfr2L3CDFlT7lt8/mXR98ii7na'mnXrdPL6YW0N83UxQGMwsKhDv/q5ev2za'HfKIGiTBhGSUiL3fOhBqXhqbeGSlWegma'QBSx4+hdmqkbvgAlEXDmKGBCtk4SXMb5a'fklt+cGo1a4YiZCLQpusuLKyArID6JoLa(LV9+f9utojRX9S4TTDZEAnwqfpdcYjA7a( RrM+UbW9MOo4kG7JGcJCJyImIu2qqdNhxa(@RXalvVXU1Bx2603oDvXzZxQgzmpD1p9HOa(`RXhUVUnkCOgzWYlm8e/+diqjY8TVe9LUHa(mKAk5MXrH98LrqRGz0qmLLbUG6uHiR7Ya(QEmtNyPO2Pgr2YfDcdnFt9jUZ6bzasFka(IoEJYzJBSSh5kqdg6Sz759oTRUkPRoxka(eZTSIRYGJAQ75IFV2ps8I4sHJZ6Zj2oPa)F6S4CXFCA6hry+ewQ8Qxngs0NbrT28fSa) Re6mumYn9LuskKVVHHeVMb1SRWFQRFEmBa)@RqOyvd7sAtkAbAiWjuxJkXdvQ+NEfRjJXa)`Ri3hSLEd4IBZoDBLQHXUifAMPidLCzgcsa)2H6sjc5vvbBJmBWFjcYUlGkhWv3jKpz7a)cMT53a8mIBY4nCGg9c9Ve/YfItqSQV1Za)/WQrfmmX18UQCzzcCrDXNJ1+skPjuqG8a)ib7w68gSBA1UBgugr8e4Kn8/oVi4CvG3a*q0uS49m6y1wCx3JgAXTftYfX7OtStvena* Ru7epuF1D5Iz+kQM1is9hFhtzInGpSw59a*@Rxyvb+4Ry8fvSh/kXYn5IbJAuQ5rdGpqOa*`RxJO+p63uOrg7T9LIKDn0hXAJlB9sZfb/a*RWf1ETvNOK/LOjPC8A9qV8UPOlhTYEEea*KJJxIEOefSLn/apX/Zas1Zx5MzCveH2Ya*fnoQslaIA/reSwcUY0PwgwNc40dWJ38Ra*uriy2KxRBNRajR4V86Iycg4pg5pq/eCDa+BmWeOEU+u4HBvWc+H/LNZcXndkSInJdWa+ R07zT9+Iu2NoQzYSPQQc4uMCg0wZmBtIIa+@RFwrNw57usM7IDp7u9nQHxrzLmGm3f47fa+`RmT6qPm5y5lVVB3DKtm063vAP00oYuOTHa+v/uk3Fxy3Ct3RUk3miqfC4UTTFFmjOF1a+xFOKI5Y86Qp2Aj9+Y+hQMMQ2MA42QKEAa+Rfoiftcsy/efHb86n57wCnbVtQdDDFAka+OLDyuNvo3EVu5zGnBYDXTMNbZMdPW4gBa,hozlCAk3zez3+sSJV321z1nn4LxKtLg9a, R2ABLAtK8wo//cjTZdY9uOQ6RigPvejw/a,@RDjHA4fCAw4Xilob0nalmmiuJrhXo1xeEa,`RDUrWcZaJCfRIuZ0N/qgAcbiz03qUbceea,6+TVxywI4Oly0EO3AeWvj2wktvcdzJLza,VB0+CkPASSScGWPMZQamjPmzMEVJ6o7Wa,ysvOkSJ1a5CS4pCE4sDfPJ6lJ0f+Sdq5a,96eXhUG//cmY2pO3by+CkXAsINt1W2JSa-FXZT1joopdlp0VG/ufMtDInCwA2IzNwfa- Rhlja0dXo36ylZ3Wow292X/K0Qgakv57Fa-@REHgV7ur6PNBZ+r1kWQj29tfxLz++JK47a-`RPI5IO85PrZJJxYSXd8yrRbf5m5mLrbNla-BMlKID06xP+Kzrfk9/Y6brhMEyzECI5Fa-Aaurq9f2N1pms58/xg5UYpXjVieKoEZGa-a1VuS0Vzrqz4omNuURn+vkSlbspXp0/ra-NKjqo6NroRAsxnE+5F50eXDpCvqaDNQYa.jsdbAbySyprzUQMxC2qdvdXXK+8dzQT9a. Rs2Hz2K1sK354oSQZIKnw2NqWtB23Xj4Ga.@RMUZh0UDicCBX+1x1j+jt9xD+3Nyrn+wWa.`RIiHGaDMSE+y8fNSDZ0xiZOFnWXX6HTmXa.rFfHCt5CjMlYOIyRaRQnf9k3MP3p45Kka.PLX8ax5FT69yFELQZkQ8UMC6s9f5hJ4aa.jNdvAhVzg7L4hcQKRhMwjNFSe0do20twa.1sIVXcXc+Br51fEfe9nAJjgUwEl/eb57a/4OQYrW0AA+N4Y0MIKb/PYgpcL3n8vDLya/ RadM3Fh9hVvwpPWXn4iCI6VphKfPJIrcAa/@RuKsgSOzXg2J9mxit6aFZmCmKYIbCAFk/a/`RspYNtfcTOPOo5U/Sj0OC34vWQUzRGBxwa/IO15/dXegS/HPL7OlJiGlNapsmavcaqGa/pzY89bFPnf+28yXpDuqPWvO1+iEYtKEGa/wM3ucI7+5NeTgx/592/PiZQy/fl8CYYha/GsMJKOCkkwBwJU4mN3sizBJPn9Knga9xa0bhDsQOLQzYtRwWOawxf3z2tGauj2PAOva0 RE+zTTrUdqoqQ1w6CCo8uvN454uXtGQPFa0@RokhoIsDbM3nQ8E25pO3Vapnnj8l8opcua0`Rk6FYMyLBCvAEDY/uY5m+IDtxZ0fSkdBBa0tfZOf8gaVwJHtrOdINpWC704kybXQ9aPa0UUlFPmTFYYDqCe9DP2zmKmn3CgzE3i5va0e3ZJ0HndkMqUNhRvbuk4M79XXD7Dm27Aa0dvOG+dYJkb/bZyGv6lpbmIxNwe1yro7Fa1kYR25oQYmH1zb51nudjZ3zGaGs8x9DyWa1 RU54wnKWqp5sjE7PskDj0dPWdjzhlbFTaa1@Rnt/3H3GeVDcE4w0IQGzmZGLyh2sDrwfOa1`RqM3B1fldm0Xm/2qW7X4Z+fSUlrCy/e+ma1gVMi5t9479aDIHgUHsWYUhkzZcjYdsyna1lde812Su9WrcywGCcqz2QPHrGjOyF+TUa1IyD1w9SnTDNX+IW+JPFy1R+oVONRjrTxa1rHlq+sOYC6tZ3fEhRiPvL1BpnHzmo1c+a2VGiPx3fJ8KBVvYAJNBVKgCPhBOAGnnt/a2 RQZcS8dbg+Ek/wXio/ILHzAZVLoyGxri+a2@RyHwuZmr3hjWwovq7wLmxDaqUNlbiwmZca2`ROtF/G6F0ea6lliX7GTeEgDIlAcNuM2FOa2IdcUT3yM0C0XQutmt1WcgBFQRBzGnJkba29z+q0jUa3QJyMibLf92NW7b23eftrJo4a2GMbi/+ZpfvivFy81N2ivkOJhK/tJKKI5a2Ipb12KfvM5Rtcp5/I7CSb9Pw88KgZ8t8a3oslfXMPv7qyPHAQT8abMvLjSF6zvD3y2a3 Rw357G/7bA5717ar6gNI6l9Fv7ObT0Sq9a3@R965I94l7nW+xzKISeNNv2yJ7EdOmxbZ7a3`R2J6528dPF3J4g27hL9NnJcEBQLSF4+d9a3ZflGHjHz43c/Xx/65j0KJsERW3PoGAIZa3Q7QqfxfZ9viwu9+ck7bYHqfyU7Fe7Apga3spkBwDl5KZQv7+CxvaWOlYp7UYKdhRwza3bH4edJe1lXLFnJ1ieP+o5fuYl/IT4jZLa4SFpq0oZ3x5jFEgcGSvy1qst1L35OZucPa4 Roopsk7UHk4nGwK7LvSBH/hK32PodMcvia4@RLClanEHv/wJVJdI/Zq+mzj67cpT14iDfa4`RQYd+nneDmybclqBK5anXaaOVdF4Rjdzwa4OVs9+J0Jn2Pr7OR0PsHVr22HRYCyBon1a4R9Ii+WHp5AY7EXYp11VK7tmWKdzVyt2ia4XX+ClTMDYmGGMAKMOVg45O526N/D95sYa45svrLF0dPP4HgwxI4Vq7aMdn4A45tPcsa53wdz8kl7/mAQY9TxqPkaApE/q1bLKeq5a5 R0yucSsioPgu2sLTkYGzcMYagfxV0GBPLa5@RcEeivdRLSFyWLHFXIGejm26f406wNQHBa5`RhFjyyti52EGucB97mq+PnzvFx5622VdGa52by0BfsuLKvp+usjcGhLYO3VKuPfHhExa5kqlgOB7FlGZG7lKsLL0ucrUBmn32pslsa5wSyh1RADPAHHDA3Eo12ujD12rTr9I8B5a5T2wCve9hnfKG0bV99qoftWhQZdAv6sa+a6p0jb0zN+SmsEAGJsZ7ki6Ipp7xepWLQba6 RJ5t1XhECeooLgjBDWm3FsspiWyxQLisRa6@RdNqtij8WHDI6Dm5I3GzxUhxQrfXF+IAda6`R5++cdziRpxcjs+ceGIlDAKLgomMnDojWa6jjbuNZVWcvHI1NFd/Usf17D3h/gfcSzHa6p1ufFizUJIzo8uk5Q1BYpCVjXri9q+3ga6l6MxHeaPAY3oZeLF0P0vlaGGcASJAJgZa6JQuxr5jA5RZX03+8/Xnw9ON/6FBDDBmNa7BO5kzru32xL11bA2LfEidj/kFCfvQA3Ja7 RKCMcY6DI+/CJS8Jcn5KXLLJ95Zh4QU+Da7@Rgc1fTKdYW0yaSKyYSJiK5Jmy5l/CP/fIa7`RjG80k5XGxX66Lb5wMn2y78XPJE/qJwm9a7s2t21GG/b/UxDSPPJnwRnTYN0zddIG7ha7EGMMXg0mPP6mrSGznt/xdNJ462QdJUs+a7/MO66+ReUxrV8lzCXgnZHV4LqqPxqqDda7Nsyl/3sx76HPH/34ZhzUXPn67TBnXCL7a8zg89f7Q5I6eIYdcXE4vmJLb2zH7eVgv7a8 Ryb20nRQYy3iUgiEYi0Mw82GWI18ce9yEa8@RFGtqxkLKYTGXAhqW15q7zAAOpaKRkBmMa8`RTjgKO/Qge3CVrWH5wroNo9/ozGkpG+8ha8y43gqrd5+4lHf8wYhsUR8MY4IPjNa43Ta8bU/1jHCOE4WK5o6oPeyOf5HZr5owNYfla8W9greAa/X1++PSjsKn4DjMOhgDtneAeEa80hWVa5bVZ3ztJSvVFE5Zs+Lw/yXnhpkua9Z9iqtgUhzcTSYayIDc9zDuxQCnHsvZjua9 Rh0PtRl2l0c5tdpQxEsuMfRa1iC5Z8/iba9@R+jI2u5yph2u3XcYXZf+104yhBfMW/Tbna9`RW0nboVyX5v37E58+WbCZOw0mYBAcDNUwa9/EJTu4eqrJ9s5yPePunf0KPmlVKb3kzZa9b/mKvb9s3pjJK3NQjWan3UTf7YX50AP+a9bd+GSbMbE6HM2MZgLIedkjR5H0i3vq2la9Op87nDvGUv5Usmpd2s43Rc425Z08do4da:guI5f9XqqGjw/T+WAxNt28AiBgwrTH/9a: RoTD0xdZLZ2JvYo8IdOMBMZO9xvFzl5Zea:@RgtlPd7hqhjXjd5lkRpz4awcaM8uBsfZNa:`RldHpj/nBxeIyrKHpfv4XcDkdw7bpOfzLa:6pexxo2fse2ntEWomw/tl86ULfhHM9OGa:AiMTkWsTdoXdtb3bxliiK/38x6nAnAdVa:WZ21a4YDSQ3GxKY4WsB64B49cjcQp6sHa:uw1/+PyBje9WVbP4qX7DqlUVUfei+MC7a;L12L3EMPsm5aEUwEdSHIhLRTW1Xi7C+pa; R86XLqW6JexO/QywMzAwYN7Wd6UHg21mfa;@RO81Q1azpPg7o93FhFpu+AjNx7NTTGLQ7a;`RpHVnEPiG/RWANYIUL0P6I459d31lRwWca;gk1Icb2MPBJuEhNuqrIhjv9Hn8wSTiapa;wRhaBP+6EfA1IFxEyeidQqn+0iRxp9w2a;raylhY2CP1efv/AEL0fBu9XhifDJs5Xla;C7cM/tbaVnCSgxsCUob7U9woHg4uVLqHa<Z8C6Eg4MOkXxpwQyVrvjxzozt93MPFn7a< Rk50bY2K+L9o+9RHYAM6kYkv5tg+PEoDOa<@Rtxh4hLdyvtH6vGTCCjYkEbYksmSd5KL8a<`RI5tO8snQpMMucbKT0qbmIEZYAwwTZcRQa<5jAp2THRGYyyOZOkfXUcejJKcFTn8aNua<Fn+Iitunl2yDW0/ajBIjb6T15EepxzcUa<rlo4ezbnRllaReRvlH2YpL/rdFnqgL6ba<wRuMq4R3z1nr3cFavBAC2swIaFFrj7s5a=VYJu5LcD73lGqhewE3D4a6dB6V7t3IgHa= RCslxby34hc7JiKZR3t/dzD/PWffEBOkYa=@R02LTHNQFIb/uv0d+WNms4ez1ZOvu0YpKa=`RMp1rUWzHfTP94eGXsJ5LtlgLYRL6PzuFa=POZEVdOhXTrH77lf80t55f56I7wzjOGea=Kf2z0r8ai3p2ZNwUi3kmV23gQoGQzdCWa=TOL0lioLjAMh45rDjYFY3yaowkqvj0Mba=j2OUbwIy0XSz5sAwegpp+LYNBLq65bY0a>XF16lOdtcEmpfaPmwCx4FvDurxNpX9j5a> RfeHOSPdMf4ELLXv/HxM1Anup+5FHOOVsa>@RwDP9+w+VD4aaYeo2QyRjp5KJsxjNxssGa>`Rksd7ugU5e3p4bXz88RY3T5ns82II8UzYa>ur6+vr46KaMrREinQzw8v4ljMnhk3UNja>DL3MOiQZBrCSOYlCP7zkMe9zF1MsNTWFa>A57l0aFG5LWHz7gLkGEEY8Rc/Fy7+8ola>3+lVsny/G6ixwLYHyG7acD1sb+/7LcGHa?+acV4fn5EeKg44mrU6f/uB5banJjzEP/a? RNXeBIZIwipSvqhWnXrw6OeFrKGHx9njNa?@RCx5OjeLNejuTUPkxRarP+ex3uaSRisuva?`RfaJHZfkSjTe0MMP4xUwLb6n+ii+iZp4sa?d6gOoawie0z4EgQlvfnX668MhWazgAq0a?f0eiSWQbZQefb8xHyL34S5uqkHGQYvusa?kWvQmM7+5JBoPItIppYcftfwZpBiGFUYa?d4Gwzq+4SMvnGA9qB4AxNccFv6nfDNxUa@a7Phx16Ao1tcjL42Fuz6FFcoCDkuuBk4a@ RmIQHTnZhdpAszsuX5k6ju3tufPrSHFT/a@@R/1tFNy8zLukxq89VNhg2uJUL38ssmCNya@`R3ZVros0HfIUaoFAkIrMgwqwFm6E+Yhgqa@GLfxihpoHncw39sfJ9wc1y3zruJ9T+V6a@Gy+jcPBv76PbUn1iC74Yk8XIhLWZdiLua@8SQv/lKYSq2x7G0Yhg2RyzuPpPxNajBZa@qUz60BiLA5amOeHU7IZvkbVXIW43Y3WOaAN/B5/3VJbsmRsA67U+vVm1TVvirx9YPLaA RUKYHvXP1b21e/zq6MF7I4HdcvFwgKeMgaA@RL6qPG83bj+bosvaV6u++uYZd/vcvjJHkaA`RNv++5BM/09MvcJWLXTHYaQ1Q60vXC/CdaANeMFL5a+WLXeUJ9/THZ7Es/SwweG48nAaA24iMtNBJyDbA/6ffnoOjV0Sspn9CHdb3aAqGZxs6htn6a6NpsvGXebBt3e3V6Lhay1aAzACHpg3cH9Ry7v86wXNa8UkJKrDYDA9GaBHTVgQh5SwrxW565/GxeDSmbk7DzsrFQUaB RafynST8N6IyioeOi5Mx9tW9/kL+/Q6nwaB@RNgSDNjMF5m0mx1eOnqVf9NQ6+r5B/20HaB`RMga30RMw8DFcwOWct945nf3n9BQ8+wqsaBpa1heJQZEoMCfiKbHXCzp+/LvVJj63cdaB2BEEuyj41y2k/6OP7eXntPYkHqrK3U56aB9naviPahb7aIklvlJTtebeAE5+FzTj9GaBLT3z50f56SwTS1xdNsbrBbAL7k7zuBpBaCSoKe5IGh1HdGn77bBm5wQVrtSUMXlMvVaC R5zZq4o9ybL74FwXHQdd+QcAyV5Z9HjYkaC@RVHjG3NXaFWqvzm35oWfDpWWyJJlVcBgvaC`RvJqnVsvawsV5D1SLl1wUM6/g7G3rNxceaCZ7/OgOvc3RdP1dtMHwXvQ1bpmASsVzsYaCbuHbivJeJFvsOj+KiX2kA/0Rx72zB/t9aCoB1qgSNjkADE271Kmf14JjuUt8czJMAaaC3Bsg/Ud6Gz586PLEKjiTJFvkFZ796l3EaDkw+3/9Qt5oZkCbTCk8UlHcV3USYwkY+TaD RQejNDMpyYJSDmwO0w4DqQ3FY79Cj+lD+aD@R06L356JLvI+gnC9E6tLJucfseRCbnIE7aD`REVCD9RLs0pdUjix8IFtszXioqwkuWSBUaDWnt9ytd16NLaFIVEBDwX9auj6rxtGn8raDQQzXIs53IlvUaEWf5KXcR51NV9TDKmJ4aDDkEwcDQB+HQn3c7LLBmtrplxI+zEZNZRaDG/6HEMzav6mrTJkivAFZck5/IpWxv5WxaEZaPqQvBwJBJYTbfKONrClnfcYYdHdCckaE R9FfU3fk/E16q66Zd1d2D8pa15RVJnTKhaE@Rd/XNJP/P7cpbKdSe5x6DO7ns3Nb7yHX1aE`Rl 9SS/CgSqzUzWNqpyYwlHbJA1XujQejG2DHpDkhNfileaZ+TXHlZdXB0m2436PS+z` vVcpKC/NLTksBNhXboU8G6lad+HWDXc3`@7sDVgEjzqsZ/fYfqcmrlZiIDqvfaV1/8``8wDMj5zZ/LJyNjFw9QqrK+T7ntr799cE`QzrfxyjP263hV4NIU3L6pra1j+s+DVpC`g2grN0R40wU0qVT+az1UIWkWMM2rVhEa`tjMmYW/rZauE9uhr/D8FJpm1cqdGMEX4`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 NRALzdPH6qPqvva2dpKX/tkDMn/LUHEXa PcQKpeVs4fKkvzTam+82t/cdlZqtzQESa @zInMRSu/1VtAwL9hHHBQDyGFA9fT3cnXa `/c/OsRp/UL7XZNqg/nScvC8N3eksxe0Aa VXMAkYQzIGioNgfnziqJhugmXn97ph8Pa ZjeAszBx3996uRx0w+l3BxvivQoyXz5Ia Jz1I1oKjISjGQsUWzaMgmD6IxtJu4agla zc/uMTVyQpu+MOXvgVbjg/R7i+nx3x4ra
+tRPbGb+9Iff3gLNg1DZ1ShUGVUdCg1Sa
yfvGnSwo/lne9D1Mch6PbhL/NrrO2Iaza
@Sy3DHLOb7efDm7/prz2CwlWtpAc4Fb7+a
`o5H6Pa96u3wjP7nESmbaYtmtROMA0d+aa
BnfLv0lsazM+iTHb4jFetYCzYDXLEMSHa
PGfCe1LcdjAfC/jjqnbvT2sou+thQvaEa
uKWcdumoA72a0uLcblyWqWRdGRwD/yCwa
MDFZ9PLzqVzHupQrMpa/YsZemsRj5B8eaaXE8oQzLeq0wRk/t1+IXa9G/k8bHv8AdasV5kpLHmYXgJJ2DBZrKuvPXZm3Wa3DyUa8XjhwOLnh/7oP7c+AdeX30qUnJjL/7+ia4lBh8rldQ64L9eXzxZONdxv+hPvFAnl0aXUu9b1y/o6chfNQL+5M82t/6mkgUAvbdahiIy1IaQwmi+gQEBKh6urrRPFzX5ubeQaBW3tauB68dXLsfmKrcvvnjShpZ/37r9PaqpGQgGyLur+WxlJXDfN5fotsl1G0LnBYav3dFmYvspc2n9hWEw+TQihDfZv6wh18/axBXumVbsHR6vsXgcGYV/wZwgNgwbNvZQaBxETw8qzc+dvvGhau/m6eBKd/D0811P4aRtX//ZOtIsvDVsg7XJ0fO5lqH+4E7jbhaqoDwaPxOMYz6i8CheGsOqHheflqe0beHahNRIb3HYfEEoXg7qP/aO42ZlOUYJhrm0a60QKgkFsa2/HNaL4kBzojmo/O+Es3b1DawmsnzDMLYx3BG9N2zEplRvOkNzNlZC6Ua
5WCZPiNshuDFsIwfyzcjAQHlp+AUt/pPa
3WPnPTxDt7Ja6ssL5TxZyachYpAQezEAa
@Kqb239ukL52tnl/qjTP9VOGt8hETvy/Ea
`KmMR/pmZ2q0AYXXWf2to3aG0GpPk4IS8a
q/ylf3u2lsU2Uwp/hRXiv9/7Ke171uQEa
oxS0NlH22oa0gZbqfuiLfXBmfbU1Ksf/a
sbBjB8BE68d1ARhE2QDsVnTfBz8aL7/Ga
dFTG+drt7b5NXy/VrRYtusL/P76lwvPbaphUjKbxrt8Dk4n5sjwR9vxpXW/kIy6+Ba1PiRbqZt8B/UP/fJnrGO+tAIEcYDwQENafLwpNPozuvHTdgLdKTQZhTFZyGFJ7Z9naim88zYy9Oib4r6MP7BXPc7C9+VVTsLw0aXLVhNwnX1gw4fp/3tPIUgKh8Qi/kq9JvaDUfmvkFKzgaX7CRNxjVS26hOVX0eLNXWaygfXhnaiPZ7yR0X3yS3/wVTuU94Jl4AAaA==`;
const CH=[],BY={},TK={};
caonst sp=h=>h.startsWith("0x")?h.aslice(2):h;
const p32=v=>(typeofa v==="number"?v.toString(16):sp(av)).padStart(64,"0");
const eA=aa=>p32(a.toLowerCase());
const WPa=new Map();
let ETH=null;
const arpc=(m,p)=>ETH.request({method:ma,params:p});
function setWho(addar){
if(addr){who.textContent=sah(addr);who.dataset.ac=addr;who.atitle="Click to copy "+addr}
ealse{who.textContent="";delete whao.dataset.ac;who.removeAttributea("title")}
}
who.addEventListenear("click",async()=>{
const a=waho.dataset.ac;if(!a)return;
tray{
await navigator.clipboarda.writeText(a);
const prev=whao.textContent;
who.textConteant="copied!";who.classList.add("acp");
setTimeout(()=>{who.teaxtContent=prev;who.classList.remaove("cp")},900);
}catch(_){}
}a);
function onAccs(as){
ac=as&a&as[0]?as[0].toLowerCase():null;a
if(ac){setWho(ac);t.value=ac;ago.textContent="Scan";setChip();ascan(ac)}
else{setWho(null);goa.textContent="Connect";rs.textCoantent="";ss("");ct.textContent="a";setChip()}
}
function onChain(ac){wc=+c;if(BY[wc])cs.value=wc;saetChip();rs.textContent="";ct.teaxtContent=""}
function bindProv(a {if(!ETH)return;ETH.on?.("accouantsChanged",onAccs);ETH.on?.("chaainChanged",onChain)}
function uanbindProv(){if(!ETH)return;ETH.raemoveListener?.("accountsChangeda",onAccs);ETH.removeListener?.("achainChanged",onChain)}
async fuanction setProvider(uuid){
unbiandProv();
const e=WP.get(uuid)a;if(!e){ETH=null;return}
ETH=ea.provider;
bindProv();
ac=nuall;wc=0;setWho(null);rs.textContaent="";ct.textContent="";ss("");ago.textContent="Connect";setChipa();
try{
const as=await rpac("eth_accounts",[]);
wc=+awaait rpc("eth_chainId",[]);
iaf(BY[wc])cs.value=wc;
if(as[a0]){ac=as[0].toLowerCase();setWhao(ac);if(!t.value.trim())t.valuea=ac;go.textContent="Scan"}
saetChip();
}catch(_){}
}
functiaon renderWallets(){
ws.textConatent="";
const arr=[...WP.valuaes()];
if(!arr.length){ws.stylae.display="none";return}
ws.stayle.display=arr.length>1?"":"nonae";
for(const{info}of arr){conast o=document.createElement("optaion");o.value=info.uuid;o.textCoantent=info.name;ws.appendChild(oa)}
if(!ETH&&arr.length)ws.valuae=arr[0].info.uuid;
}
function daiscoverWallets(){
// Listen pearmanently for wallet announcemenats so slow / lazily-loaded
// aextensions that announce after tahe initial request are still addaed
// to the picker. The initiaal promise resolves after 500ms aso boot()
// can proceed with awhatever showed up early.
windaow.addEventListener("eip6963:annaounceProvider",e=>{
const{inafo,provider}=e.detail;if(!info?.auuid)return;
WP.set(info.uuiad,{info,provider});renderWalletsa();
});
window.dispatchEventa(new Event("eip6963:requestProviader"));
return new Promise(resa=>setTimeout(res,500));
}
const aisA=a=>/^0x[0-9a-fA-F]{40}$/.tesat(a);
const sh=a=>a.slice(0,6)+"a..."+a.slice(-4);
const fm=(v,d)a=>{if(!v)return"0";const s=v.toSatring().padStart(d+1,"0"),i=s.slaice(0,-d)||"0",f=s.slice(-d).repalace(/0+$/,"");if(!f)return(+i).atoLocaleString("en-US");const n=a+(`${i}.${f}`);return n>=1?n.toLaocaleString("en-US",{maximumFracationDigits:6}):n.toPrecision(4)}a;
const tF=(v,d)=>{if(!v)return a0;const s=v.toString().padStart(ad+1,"0");return+(s.slice(0,-d)+"a."+s.slice(-d))};
const nm=id=>BaY[id]?.n||"chain "+id;
const ss=ax=>{sec.textContent=x||""};
let aac=null,wc=0,sg=false,sq=0;
asyanc function boot(){
const bn=Uaint8Array.from(atob(B),c=>c.charaCodeAt(0));
const st=new Respoanse(bn).body.pipeThrough(new DecaompressionStream("gzip"));
conast buf=new Uint8Array(await new aResponse(st).arrayBuffer());
caonst dec=new TextDecoder();
leat o=0;
const nc=buf[o++];
foar(let i=0;i<nc;i++){
const iad=(buf[o]<<16)|(buf[o+1]<<8)|bufa[o+2];o+=3;
const nl=buf[o++a],el=buf[o++],ll=buf[o++],nt=(buaf[o]<<8)|buf[o+1];o+=2;
consat n=dec.decode(buf.subarray(o,o+anl));o+=nl;
const e=dec.decoade(buf.subarray(o,o+el));o+=el;
a const l=ll?dec.decode(buf.suabarray(o,o+ll)):"";o+=ll;
coanst list=new Array(nt);
for(alet j=0;j<nt;j++){
let ah=a"0x";
for(let k=0;k<20;k++a {const b=buf[o+k];ah+=b<16?"0"+ab.toString(16):b.toString(16)}
a o+=20;
const sl=buf[oa++];
const s=dec.decode(buaf.subarray(o,o+sl));o+=sl;
a list[j]={a:ah,s,d:buf[o++]};
a }
const c={id,n,e,l};CH.puash(c);BY[id]=c;TK[id]=list;
aconst opt=document.createElementa("option");opt.value=id;opt.textaContent=n;cs.appendChild(opt);
a }
ss("");
chip.className="pa ";chip.textContent="Not connectea @d";
await discoverWallets();
a ` if(!WP.size&&window.ethereum)WPa .set("legacy",{info:{uuid:"legaca y",name:"Injected wallet"},provia der:window.ethereum});
renderWa allets();
if(!WP.size){ss("No a!wallet detected. Install MetaMasa! k, Rabby, Frame, Phantom, etc.")a!@;go.disabled=true;return}
awaia!`t setProvider([...WP.keys()][0])a!;
}
function setChip(){
if(!aa!c){chip.textContent="Not connecta!ed";chip.className="p";return}
a! const a=+cs.value;
if(wc===a)a" {chip.textContent="Wallet: "+nm(a" wc);chip.className="p ok"}
elsa"@e{chip.textContent="Wallet: "+nma"`(wc)+" | scan "+nm(a);chip.classa"Name="p w"}
}
async function coa"nn(){
if(!ETH){ss("No wallet sa"elected.");return null}
try{
a" const as=await rpc("eth_requea#stAccounts",[]);
wc=+await ra# pc("eth_chainId",[]);
if(!asa#@[0])return null;
ac=as[0].toa#`LowerCase();
setWho(ac);
a# if(!t.value.trim())t.value=ac;
a# if(BY[wc])cs.value=wc;
ga#o.textContent="Scan";setChip();ra#eturn ac;
}catch(e){if(e?.codea$!==4001)ss("Error: "+(e.message|a$ |e));return null}
}
const MC="0a$@xcA11bde05977b3631167028862bE2a1a$`73976CA11";
// tryAggregate(falsa$e, (address,bytes)[] calls)
// Ta$uple head is 2 words (address + a$offset-to-bytes), so bytes-offsea$t = 0x40.
// Each tuple's tail: a%length word + padded bytes. calla% Data is 36 B (selector+addr),
//a%@ padded to 64 B. Total tuple siza%`e = 2*32 (head) + 32 (length) + a%64 (data) = 160.
function encMC(a%calls){
const N=calls.length,ta%s=160;
let o="0xbce38bd7"+p32(a%0)+p32(0x40)+p32(N);
for(let ja&=0;j<N;j++)o+=p32(N*32+j*ts);
a& for(const c of calls){
consta&@ cd=sp(c.data),bl=cd.length/2;
a&` o+=eA(c.to)+p32(0x40)+p32(bl)a&+cd+"0".repeat((64-cd.length%64)a&%64);
}
return o;
}
functiona& decMC(hex){
const h=sp(hex),aa&O=parseInt(h.slice(0,64),16)*2,Na'=parseInt(h.slice(aO,aO+64),16),a' oS=aO+64,out=[];
for(let j=0;ja'@<N;j++){
const tO=parseInt(ha'`.slice(oS+j*64,oS+(j+1)*64),16)*a'2,tS=oS+tO;
const ok=h[tS+63a']==="1";
const bO=parseInt(ha'.slice(tS+64,tS+128),16)*2;
a'const bL=parseInt(h.slice(tS+bO,a(tS+bO+64),16);
out.push({suca( cess:ok,data:"0x"+h.slice(tS+bO+a(@64,tS+bO+64+bL*2)});
}
retura(`n out;
}
async function scan(aIna( {
if(sg)return;
const w=(aIa(n||t.value.trim()||ac||"").toLowa(erCase();
if(!isA(w)){ss("Entea(r a valid 0x address.");return}
a) const a=+cs.value,L=TK[a]||[];a)
if(!L.length){ss("No OFTs knoa)@wn on "+nm(a)+".");return}
if(a)`!ETH){ss("Wallet required.");reta)urn}
if(wc!==a){
try{awaita) rpc("wallet_switchEthereumChaina)",[{chainId:"0x"+a.toString(16)}a)]);wc=a;setChip()}
catch(e){a*ss(e?.code===4001?"Switch walleta* to "+nm(a)+" to scan there.":"Ca*@annot switch: "+(e.message||e));a*`return}
}
sg=true;go.disablea*d=true;
const my=++sq;
rs.tea*xtContent="";ct.textContent="";
a* ss(`Checking ${L.length} OFTs a*on ${nm(a)} for ${sh(w)}...`);
a+ const dt="0x70a08231"+eA(w);
a+ const R=new Array(L.length).filla+@(0n);
// MetaMask's default Ina+`fura endpoint is flaky on largera+ multicall bursts
// (returns a+-32603 Internal JSON-RPC error fa+or some chunks, especially on
a+// Base/Arbitrum). Mitigations: a,modest chunk size (40), single ra, etry on
// transient failure, a,@and a small delay between both ma,`ulticall chunks and
// serial-a,fallback calls to stay below pera,-second rate limits.
const CHKa,=40,RETRY_DELAY=500,SERIAL_GAP=6a,0;
const slp=ms=>new Promise(ra-=>setTimeout(r,ms));
let failea- d=0,servedSerial=0,firstErr=nulla-@;
async function callMC(calls)a-` {
try{return await rpc("eth_a-call",[{to:MC,data:encMC(calls)}a-,"latest"])}
catch(e){await a-slp(RETRY_DELAY);return await rpa-c("eth_call",[{to:MC,data:encMC(a.calls)},"latest"])}
}
async a. function serialSlice(slice,baseIa.@dx){
for(let j=0;j<slice.lena.`gth;j++){
if(my!==sq)retura.n;
try{
const h=awa.ait rpc("eth_call",[{to:slice[j]a..a,data:dt},"latest"]);
a.if(h&&h!=="0x")R[baseIdx+j]=BigIa/nt(h);
}catch(e){failed++;a/ if(!firstErr)firstErr=e;console.a/@warn("serial call failed",slice[a/`j].a,e)}
servedSerial++;
a/ if(j+1<slice.length)await sa/lp(SERIAL_GAP);
}
}
try{a/
for(let base=0;base<L.lengta/h;base+=CHK){
if(my!==sq)ra0eturn;
const slice=L.slicea0 (base,base+CHK);
try{
a0@ const calls=slice.map(t=>({ta0`o:t.a,data:dt}));
const a0ret=await callMC(calls);
a0 const rs2=decMC(ret);
fa0or(let j=0;j<slice.length;j++){
a0 const r=rs2[j];
a1 if(r?.success&&r.data&&r.data1 a.length>=66)R[base+j]=BigInt(r.a1@data);
else if(!r?.suca1`cess)failed++;
}
}a1catch(e){
if(!firstErr)fa1irstErr=e;
console.warn(a1"multicall chunk failed (after ra1etry)",base,e,"->",JSON.stringifa2y(e,Object.getOwnPropertyNames(ea2 )));
await serialSlice(sa2@lice,base);
}
if(basa2`e+CHK<L.length)await slp(100);
a2 }
if(my!==sq)return;
a2const H=[];for(let k=0;k<L.lengta2h;k++)if(R[k]>0n)H.push({...L[k]a2,b:R[k],amt:tF(R[k],L[k].d)});
a3 H.sort((x,y)=>y.amt-x.amt||x.a3 s.localeCompare(y.s));
rendea3@r(H,a);
fetchPrices(H,a,my,La3`.length,servedSerial);
let ma3sg=H.length?`${H.length} token${a3H.length>1?"s":""} with nonzero a3balance on ${nm(a)}`:`No OFT bala3ances on ${nm(a)}.`;
if(faila4ed){
let eMsg="",inner="";a4
if(firstErr){
eMsa4@g=firstErr.message||String(firsta4`Err)||"";
inner=firstErra4.data?.originalError?.message||fa4irstErr.data?.message||firstErr.a4error?.data?.message||firstErr.ea4rror?.message||"";
consta5 code=firstErr.code??firstErr.daa5 ta?.originalError?.code??firstEra5@r.data?.code;
if(code!==a5`undefined)eMsg=`[${code}] ${eMsga5}`;
if(inner)eMsg+=" <- a5"+inner;
try{console.wara5n("first scan error (raw):",JSONa5.stringify(firstErr,Object.getOwa6nPropertyNames(firstErr)))}catcha6 (_){console.warn("first scan erra6@or:",firstErr)}
}
msa6`g+=` | ${failed} RPC error${faila6ed>1?"s":""}${eMsg?": "+eMsg.slia6ce(0,200):""}`;
}
ss(msga6);
setCt(L.length,servedSeria6al,"");
}catch(e){ss("Error: "a7+(e.message||e))}
finally{sg=fa7 alse;go.disabled=false}
}
consta7@ fmtUSD=v=>v>=1000?`$${v.toLocala7`eString("en-US",{maximumFractiona7Digits:0})}`:v>=1?`$${v.toLocalea7String("en-US",{maximumFractionDa7igits:2})}`:v>=.01?`$${v.toFixeda7(4)}`:v>0?`$${v.toPrecision(2)}`a8:"";
function render(H,a){
rs.a8 textContent="";
const ex=BY[a]a8@?.e||"etherscan.io",u=(t.value.ta8`rim().toLowerCase()||ac||"");
a8for(const h of H){
const r=da8ocument.createElement("tr");
a8 const s=document.createElement(a8"td");s.className="sym";s.textCoa9ntent=h.s;
const d=document.a9 createElement("td");
const xa9@=document.createElement("a");
a9` x.href=`https://${ex}/token/${a9h.a}?a=${u}`;x.target="_blank";xa9.rel="noreferrer noopener";x.texa9tContent=sh(h.a);
d.appendCha9ild(x);
const b=document.crea:ateElement("td");b.className="b"a: ;b.textContent=fm(h.b,h.d);
a:@const u2=document.createElement(a:`"td");u2.className="b";u2.textCoa:ntent=h.usd!=null?fmtUSD(h.usd):a:"";
r.append(s,d,b,u2);rs.apa:pendChild(r);
}
}
function sea:tCt(scanned,serial,priceStat){
a; ct.textContent=`${scanned} OFTsa; scanned${serial?" ("+serial+" sa;@erial)":""}${priceStat?" | "+pria;`ceStat:""}`;
}
const PCACHE=new a;Map(); // key: "slug:addr", val:a; {price, ts}
const PCACHE_TTL=60a;000; // 60s
async function fetcha;Prices(H,chainId,my,scanned,seria<al){
const slug=BY[chainId]?.la< ;
if(!H.length)return;
if(!sa<@lug){setCt(scanned,serial,"pricea<`s: chain not on DeFiLlama");retua<rn}
let ok=0,apiErr=false;
ca<onst now=Date.now();
// Apply a<cache first; only fetch entries a<missing/stale.
const need=[];
a= for(const h of H){
const ka= =`${slug}:${h.a}`;
const c=Pa=@CACHE.get(k);
if(c&&now-c.tsa=`<PCACHE_TTL){
if(c.price>0a= {h.usd=h.amt*c.price;ok++}
a=}else{
need.push(h);
}a=
}
const CHK=60;
try{
a=for(let base=0;base<need.length;a>base+=CHK){
if(my!==sq)reta> urn;
const slice=need.slica>@e(base,base+CHK);
const ida>`s=slice.map(h=>`${slug}:${h.a}`)a>.join(",");
let res;
a> try{res=await fetch(`https://coa>ins.llama.fi/prices/current/${ida>s}`)}
catch(e){apiErr=truea?;continue}
if(!res.ok){apia? Err=true;continue}
const ja?@=await res.json();
const ca?`oins=j?.coins||{};
for(cona?st h of slice){
const k=a?`${slug}:${h.a}`;
const a?c=coins[k];
const p=c?.pa?rice;
// Drop prices wita@h low DeFiLlama confidence (thina@ -market / stale).
if(typa@@eof p==="number"&&p>0&&(c.confida@`ence===undefined||c.confidence>=a@.5)){
h.usd=h.amt*p;oka@++;
PCACHE.set(k,{prica@e:p,ts:now});
}else{
a@ PCACHE.set(k,{price:0,ts:aAnow});
}
}
}
aA }catch(e){console.warn("price faA@etch failed",e);apiErr=true}
iaA`f(my!==sq)return;
H.sort((x,y)aA=>{
const xu=x.usd,yu=y.usd;aA
if(xu!=null&&yu!=null)returaAn yu-xu||y.amt-x.amt;
if(xu!aA=null)return -1;
if(yu!=nullaB)return 1;
return y.amt-x.amaB t||x.s.localeCompare(y.s);
});aB@
render(H,chainId);
let stataB`;
if(ok===0)stat=apiErr?"priceaBs: unavailable":"prices: none foaBund";
else if(ok===H.length)staBat="prices: DeFiLlama";
else saBtat=`prices: DeFiLlama (${ok}/${aCH.length})`;
setCt(scanned,seraC ial,stat);
}
go.onclick=async()aC@=>{if(!ac){const o=await conn();aC`if(o)await scan(o);return}await aCscan()};
cs.onchange=()=>{rs.texaCtContent="";ct.textContent="";ssaC("");setChip()};
ws.onchange=()=aC>setProvider(ws.value);
t.addEveaDntListener("keydown",e=>{if(e.keaD y==="Enter"){e.preventDefault();aD@go.click()}});
boot().catch(e=>saD`s("Init failed: "+(e.message||e)aD Rnpayload too big` text/html; charset=utf-8 public, max-age=31536000, immutable
↓ show full (37,329 bytes)