0xfbe09b7a…7937sent to0x4e59b448…956c·#24,945,469·view on Etherscan
<!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=`H4sIAAAAAAACE728eThU////aP8xibOFItixRyBYhUclsGGbMNIst0WAwa
2Y01SbTYUhQpWSLKkiyJbJEsCRFlq/QSa
RlbRIWYt8L9v78/td13um6+16X+9/zsw5a
@Rc7Wc83w+H4/77XF/PM9WEIgDzgcH2WP8a
`RXOm+dH8P+vIn05Hmqc7woq9dC8wurnvfa
siPMJXNI8lr+SRFvnZJSiK6Ghi7wISKOa
XkeUvyt2aIA/8nR7hOTtb8NQBJJgjgb4a
dYvSYj4SdH7ejO2+cbFtZzTfrW4oAmuFa
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 isLevrCAVRW+rGjm1mER0/pux8NWnTNQa RPMICiwDCD+qpbcuxEn9oFyQSsvCqm6oxa @RNcaFx+AQ5lgEAK8Lk4UW7MjjJ0RN9PHXa `Rfp9w86eA8cYUdtJcRei0+fM/d1+U3cs9a 5mUpLPLOJgoPwS8v5A2J9q9qwrd52noFa /RYsavnhmBH7YAM7CJ5gSgD8NAtzcxJaa qXmJWaKC/urzDyIejKzI+Qq5732D7iF2a V9CQt9bSNcQjUZ/mIHgCxQRoUPQ5OXUXa!f1V9c1D6vX15yO37D34D4wk2QOOFo7Yha! RvsqWiifhx2nele8U39/hgRDw5lhAS0ura!@RkZ6ZenbO1v3315AtxaWeWlpgAgkBmMsKa!`RvPs5URn4cjEVxYMgyxTjkx9ACSQ0hgTUa!vZRlOCicCDEzjT0QcEddUtkWbwchkBFma!QBX/YKRDAz7PJMz+hkJeuRnDhmuck2AFa!TF8NDk3dwjOhvNlHVbaCufWhFW0QQsSQa!UACvwd1Cv4t3XqUlHtDm4pDZ8lm0qxNMa"xFsBNyJgwsluaGnVY/GjkSd33Z/t20GCa" REQk4CobEhho0WuStnCPlhGfOl3w/r9uWa"@R3l6pTfo7NUTsT8/AHXqUyXg2VRcsN+X2a"`RGXtAaJUa4m5UvU++I/Kbe7vPPun9Mg5oa"v5+jMCLVaLnWYVU4qq/o8dZAUBxhKT2ka"F7Mbq94HXc2UPYttp0OLXp1INag1+SOXa"c9Cjp6+P8xAWkJHI7tYDqTwQI7snfapwa"yFw4c+YRhITAmgNomTb5t2NKqdO+gNfXa#Tgy3X+GThFX46JN7byuVlnGDU4Ik0lYJa# RqVQ50PRiFT7ejx0qlur5mkUY8k4xDC3Da#@RUMuf/7NCGI+Fo4MJvxq0NP8ZmBGqSDoYa#`Rn2//GkzCEQHJFiGNGyPXkLfpUUFbkp2qa#+7OtL0N9mcv/Ze4X23DgLhksBQcxeTWSa#FRZwUUUb4rs849+VvFYz3Wduvfi9McTna#dq5jQu49GzDJEsEaZO6QpUvdM7slzwIea#Y78jxzZxg9Q6IeTl4ILtB3e/lUsSsxCca$wtJ+vH4BVvhhy0lGAU1fHjTBomNffvvia$ R2DSTGiQ+4n3mARdzLf9cH/Ku6jocemawa$@RXmP74LDNnbHW9iwYGYPFEUiASoRjtveta$`R6cOL+j8K40NxSp7FI1NgspExMBrs3uZ2a$f0guvlH0jlaYivNT9cBNUOZKNpGh3lCGa$xGuNIFIu7PTvPGi5y9wzhYu5lk4cDXZga$zhZ++PSCX9nsfMPPgOuJbSZrrGWwPaaMa$ilv8crFx8qJFxocpjw9SJRAyDmENc+vXa%r9HTk5h8Z6LwiVO3sVbb9X73CjSpidqia% Rmi5Ytn/eW1kra/7xQKmt8xgXcy3SaW53a%@RiXPozpehHaaQyIK/F2+9nr37d6IydnTTa%`RjAo0NfBl9tuQQ65nfwvZobNKVJqvbrY6a%hS+OdIQ35E/LqMXOiLUgIWQC0QRIfWH+a%9IA0z6BXbZHlZfBWfSIougROJiJIZjgMa%BRi5rz9rajaj/P6QIHUnfC+Ud9bp7QqJa%+T+jaAj7DSd+zXfPGnkk1snRc9ttncQMa&jYAE7ZPSbcWJ137qSh0UneT3sYaSqRg0a& RBti2tfENl672INS+Dp1V5hxqZ/++ewXSa&@R6GwhzTXmG6dyDnqS6BJ7wVK2vPJYesoua&`RKNmaRCUCn27eU2gq9so1KZHmgvPptyr8a&/hi5ym+L3aofns+41X+JLuWddG9z9p62a&sYH5uSKxOBwsav/vHt6ugBuO2WQtyub4a&JIyYg/8KpmlffPvusbV2nrswWcyeu2t+a&omrwHJRCIlhggHfyVdLgEp5P8xoL9UPWa'22OkQs+LrBHc4uIiyB5gas82fvvzY4eaa' RylT5x3Qw1QgNHNGX+VFe9WCfY0dKV5C3a'@RH1yCNKENWbndFnh5VGjZUeggWIdj7u7Da'`Rj2riEkeWAc7PgR3bQV6+mf6Ze/lq9KR0a'8lxjtYlmmPjeVbbTef/KBX/h8o0D4YQba'hbe5NCfGsivBVDKJDfSxYTsodYQ/d/40a'/Gvl0fzE+lfG8vwqqRBLJAUFh9Rbp7zPa'NrasL/JKf1x5IDfZXYQHGkhfXh8HHCMOa(859jaDCdPzyR3UV3S0/ocV2hPpkq+hBPa( Raq2a1JzaZrFkiNqeavdzYEusEVA0tD1ea(@R3q0ZSxyaNpa7ks+fbPWKH2KJxaEB/SFna(`R0g/wgDgj7GzgrN3nyuicpnNrNHgvr9aEa(hjHLw2p+XkLwHYg4u+P1O4glgWAE6Pxza(xQE+LaYrHdye0UO1FpJ1fVMIsSQirAEHa(bbOxp1u1rhspmhqKvoksQjFAJbBA5koQa(Kw/wF4lFqJH/uLkmOp2uusQrfDgTFsj0a)W354DX6uJbt+efiYSdrXRE4YHtz7QPkFa) RzHJ10BPm2xWwd7xv+BxVLfxU/CjnXMy0a)@R1CqVsiTP/xwjnyr4vO7SvC1vPWXRAMwoa)`RXx9knuiDWC//t7s/yQYW4kOJfb28wweXa)Rn6T2nkzuGwwJMxy6RkT87Iscgothxlta)GvfFgtKPHqeeXqXPrlNf9/tlcRKzWiPEa)zspqaN/pfnkXbGOEZYOloL3cvGBQINIca)KYtypTE8HZiOK2jq6OXhwHRkjZmsUXLLa*1wvbUoc0h01PvS5vBY7bNY9dMFpHSSmka* Ra86Fj19UG4qOeGctquhH0xWzoAiSGcaca*@RNTO+8pLhjqWOuIGdwU/eGznmDnD1DoORa*`RGAygzJwjbp/k+Pmr9Xfbs6PeIW76DmAIa*EkNBAItPOozPnOdzees8CwiYa/mIbf1la*B0HiqHju0HCz9B7vLzxE9de7XfT2zahFa*SzqAkXgKkOIdfuS3k+n2+0yrYYhMHHj7a*k5lhCJJAIAKO5woba1K3XTXXXkxwu4d9a+c04UWbRCkWy8jceqLVyIx7moA21tNkNca+ RW3depy494UABzxaCH7n3qn5/bCu1pXtfa+@RhoKX+uAhGApBoRDM2fIga+zLS1aRuaOza+`R2N/2Kl/TBqSiPCCl3Ps3h2L+6cF/Erfta++uVtiexxOBZTeaygYA6MRuAB+fYCqRF1a+2C15m+DkBuc5J8OGtg8wNAaHQJLZeRcsa+abC1vTagQcfAen+r/+TupDGlNEhPNYcRa+8Drcze1FkIvsJ+mSUHzB9+Fv098SVvwJa,J7Q9z5cm6cRCUv8diwrxTQHmFhIrSBdBa, RsRZOjQ4NuKz3I+mTg547Id0UDzFG4DHAa,@R0tLStT21VjfgZw/DgTK8atzSu3yosTGVa,`RjIZZKVvwZlzIP+welRbgR1bpoH13/rICa,Yeq+evqWSiES3GdD70eXhhQvYq/JQU0Qa,RKI1ICCtqj0T1Rszq9HWVXG97P6hdNA/a,q+6F/eKmwkfnipIAihq/nV1R8xGbhcMQa,EwweCyQMBvG2TFV0ihd8gghlZV35Yj8ba-CTHBmlPY0N6lQ578b6Vezf4qqUi9o+Caa- R8fpw7geICRWPgLHyQuIUL/kFpT57UpSYa-@RrZFzzTP/2RXuPAjWnEwEcjm3dbkcNdCAa-`RCfi/w8TcpM19o3CCsSQca6LT3XqyuR+ca-MXtZXznrwgPFpeHpXVxgUwIG4GH2n+3oa-PfaW0dyLg3G/tyWFlj7kMAOuFz15URb5a-rO4Hh68oJ/G4gapLYTDEbLlsk/50jk8Ya-3J4bLPG7vtDQNkZnbGASZoYhmWNwQMZ0a.xoKR7h4STza99GnqEUjIJ/EqiBkWRwD2a. RpryovtLV++2w5/eJIrPQ4ip1zhvLeKjla.@RpYu4+sS3KmDT2aJUR83HTTk6PRAc1kgLa.`R4IM7nmE+/f1032ehPVsyI2XMfr2Yh+HIa.JggSBjjmLAxcjpPLuvEuzIrIHDVkgK/xa.rIJjb8LArfNRIW+1B8/vmdGO1NLvfA5ea.AcdnbRpb1ZUhbxw3Kz0+92bbK28frxgoa.HkPBkgGBzpF9Ru9Lpe2uVMi9eEIVFL94a/iQrFm5NJ1oAXaHBoN8fYOfl3d7YmHjzZa/ Rp9HSFgBZxjng4Bauo2S7CpGXp1IUOqmGa/@RMWpX0Y84CTig4p3P/mnbqTLG/VykxIeFa/`RTc8vbnZZ8VnSZY0kGxpbT83sklRM82Eia/uW7dtNg4mAl1+M5ml19rDpOzzS0o5W2da/exXfwh7Mgm7c2lXlVSpx+k+MttYLHDOba/47gXjGCl7uXuxMYD2i8JPVFx5zNBFR+Va/svPPw8c8xzSNwEQkCYhNH0lIGr/W+6b3a0lMYUQlPIrUFs5q8e0I7+yGfHdURVHf7Ua0 R9R4Xs/ghcLcaBCFiiBjWcMga5ULfbsF9a0@RWXwjcE3uWpfW/UwgONN6J5S4Iu0iu0DOa0`RncIy02a+JdpZoi8NpcmXytdZToNfNdLWa068Ezs2kTXrx2Ret4jFb2X1juJpFvT267a0Cvl23/Ax/80XoIqznhOrxDY7dDLG7WX6a0Cwkz+/ecQfcqfgqfebtKbLImKrz4tItHa0ewpQKpemGis5bjzng5AwZhRg0H0izDn0a1mvLRzxH6pSJY/RvN947CSBgyAWfBzmT6a1 Rt4JwmfQ2gHOsqe2/bjIt2Pjt9nFRT+gLa1@R4wh4/ywn/PfLfu1VksqjedrJfxGJaIiIa1`R5Tz85ecEbZOC19/opujHGOKsKOj5gqB4a10je38LvbqiP7wGSiGVD8kvPT3q/2+B8fa1wv94IjJ+XNHsVVkBG+bNHYJ6OsX3P+bra1P/Wo8iuUm1MBr9lIG4QXcsqYxBZPu1N3a1u4WYIo7vsY1CJYacFAQAiDdy/3qoqljLa2L2Fx5O7X6wM/fIbAFARqY8YTS6JhySala2 RHyObnxzw8J9y1pXY6Vx6PNYbrgSmmiMBa2@RnpGLJwWz9x3eVexUprwLs7ktj3uCy9+Ta2`R6bo85y9bwGlGDw9ZfYrpV3wnaTuPZlxNa2XLWkWLNOQm9vUYBORan++a9JcKFgutgma2eQcwlWwCbL/UBXISKnKPrd4asyDJkazDa2E/zpL9BSJDs9eeXq5PPLhzjP9wnuc+zha2/9i35jptCFrUnnmfMF5MFRDTygqfsjNAa33Hnne3iFTZzPxrv5N2+1DFTVonBOJ85Ra3 RHxWPrLIJabtqVZn0zk3pou1NfI261Uc5a3@RedIgluYoY8CEm4Nb4W6r4X1ij6lRjqLea3`R/JW+I+uYgaSE62xnHJlAOGYyPnH87MvMa3oexcxwzWKOH54HsoRPG0RiWPuNc273A6a3Ka3iNNjSyoqbtYn1n0MGa1oYbE1wkOmHa3xGXIk7cH8dS663c7bQPbkFBsaCG7BM4La3BzkgfB0Yfr7+HjRfB8ZaqxJt7dIGHKuwa4jLrrbw4ioI1BlVfKTf54RsRIXwUjiBi2a4 RJPHqLs3ayvs8bzOg3e1glsQVwnGyAoIka4@RkgjsZLlktOvlt0/cyk9MB7rsjI1ndj+qa4`RUl31dlg7OG4opnLKpzk6HuvOw2WTnY+Ca4HueFoMzR1htxaTK45nJVS4o2O+9QJx4Oa4CR0aBtckrDUHKfeqV/rhfMFOM3fOOh7Na4NoiR23kfjCagAHFw/uGje8Urh2p3mcmqa4uHqm6+kv/aUDaNBn/MJ0HMeRsaZnubMPa54l/pCxq4QDB4tBVrrV6wvXnft0MxrRZPa5 RAK3oBfL5k3v6VaFGCBSFBJgbJ4nAF00Ra5@RCnNLqdMffu078eQfJtQIR8WigTvpMx4ta5`RdmRDDbxt4wUx+2kF5ZE7UCMqxpjAWsxna5j3/hlbIwpGUniW1ZPCyZ21mDtP2LzxJra5h0sRi5UQC1OTPlXS8Fv010654dX+pOK4a52C8FkrPHUke6X/5K9KJ/kTI4vezAHPD/a5UR1T8+r5Oz9Um23N2C1XiHs4xARH1ICJa6Dr9vrkmvFnI6kTjcNFJFy1AMH18xWjwea6 RFEc1vpByUEF3hFeCqhgCalj3VT/lPxfSa6@RnoZC0U9uxUEtVK8XhLkQEuDbxjvXdTEra6`Rc4RlIxEbV+IYvvLUHoEmS4eRXYxtNBjHa6cJSSERhPQLGzHhYiXx5+UoeWqGvAQ0pha6MRcDaxaW+4XMAW6V/FehEzi9cAx+oP5Ga63xJXzcK5Fech5P0brRPNzwyMCU7v8pQta6nDA74U5/kbGv63APDig2wu/x9/28vlDQa7J+omeRNMIGCAO6cEekVSlVUfLGhO+DlIa7 Rl2koHbfhJBD/R4YEO93LssNpA0KVjVPxa7@RnytO1h6BRkS7vMWFW4Zytttd6AcqN10ia7`R5t/4a4MSS/uApahEnKtr8VSX95dveyzQa7LfsHesiiTGbNPij5o3hv12/b9+aKqtx0a748kxd/GPu2C+zMD/trXAphWKjd5kXWlna7rSqdE7UF6mWbPlTSXc4cyHrLUfpMunxFa7PM7URU7WZR87fAYOwfCfvWJ9SDzk4XpVa8nI16rOGQAAaVxr5PKw18s/PWe7croVMMa8 RuvqA2AlLkwtTF+f7wfATrW7aYQ3E7abpa8@REUf/2rrErirOWl1eldPriZnm5XAd1NL2a8`ROPsbuJSK41ori/+X9SVrFXlhwq6H1hyha8aTGwRzZdPvcf7XRbGoxKRi/PSzbV9EO5a8nHvvMyN3AHH6BrACxKMX9bZ+GxWfksd7a8jMqX1MQ98i8E3e13y/c4uY9zrWLORpfma8gUwp23TVpU7/ljlbvHDVPWFXwk+IJdIca9ybpP6lQnitjC+cJ5gq5hw/R1xH6KC7Nca9 RK3+z05jOnbXBO0KbtgWDbzpcBjgjKBfka9@RKOsa02/7dzgm8DjsnQxvf+TBcNOYcDO1a9`Rv5SrvweGi6kYf1QqNpwfIW9T2KSTMT+7a9Wnzm7Q4QfSfAnftxafBd+MjpstLZ28i/a9dTflHuPmg4BUEAE0d5qnoyud6ekVuKIMa9g4KP0wJoQazV3/DhtvRNt9KPVf6C8+FMa9LXZHO1x9DEYi2JQVaT92EzHC0JlGpGd4a:E897na/zppxgIwppQ2pE3lkhKiCy7piga: RHEM27CIPnJIyOgUxxiNxbCQESz3Apq7Ea:@RJiGzSolsMt+VYeixqM1Dek8ed3AEQNTca:`Rv/Rz9W0887FKPAKRNiOfZZ7cVLpi6eLVa:kBVlZR2Rs1q2YJNerjPl6b2G7sj3ODcpa:n87TNjtCdAQgJKy5MdCo0RJ3a7QIWytka:D975nFItbC/s+FcXuniXblZEvVJS3AdLa:IZEzcuIptE931wL/C86dMcF6JozYFEfNa;zZDfDz+hxxfXahC7vLg6OnWiEs2mGpVba; RCD/Mpj3941eC+AYxn03M/eoc+oQHU8GEa;@Rtusdue9xzT/5tceb1bjKMnh6JfdMyv6ua;`Rze/cmnZLIua5QgXSlQahmmOt2ATIDUEza;6+DEGqdv9sb61UGVFrt8HZv5naL84tEJa;Zms4zTKiiWj5NfcGublnNdZcmX+c7YO8a;qNKyitPsAlquwJ4qsZbZbT9n77zqmOjJa;dWXc2LPuv7G2xthYWdFcAlwgeaKXe7CLa<l6f36se6mbV2yma/DEtyZQOUrEmPXScca< Ry2BUNCWV50+UPuxz5nyylba2aODzbCbUa<@RmLr8IFl3e7GMRqxAQ4h3R3ep9EeDMo6fa<`Rd4O0Zrl2AjfqVsvsdgW7/0gJ4v5pQnl9a<fYza53T0yuiJ9TL7hpqZWAPC/6yczVKja<s4p6bGLb52SZbpfTPxUSX9279MY3ekhea<MMFkVTWyDDjsVOOGaoHEfHr6sVLHilDaa<ErrTVDB+s7SP0EotkKUkYx06uL5qZSFra=U+FP94tf4BBL11Egbh/8W5c3a1ufc2bRa= RVVYx06RPNxCMe3Bk8w/NW0FruobNouWBa=@Ri8JB0gRvP4YHg+nhtfrpx3BU//9uhFu7a=`RzLq6xK5UVFZjVONeKno/PXeKzHtXoY4xa=E/gdisRgKGR2S5tdZyxLacJyZbPurhRHa=ah9xtNjVEyfaENch9/Hep86yle5KVqv3a=v719aEN8vQGKZbOs2PAl2waxnV7Uud9Ka=o1cfWHXVDMIGqKVtB5P/luXZrDk27UH/a>5bxsE3an0rsrsbxlSer7uOtAuiezbelva> RfTaslxD4I68AL0jKJNib7uvO8PFnOLkua>@Rf6UHeKytHtf/+4W1Di8Q2p109Fdq6jnea>`RUonLyG02AL26eKUK2/ZgOPfl/Dfrppuaa>M0+o7k8vcHQKghFEKvAhIi3l5AhkExDwa>y3/nvqHLYtZjv6COK5viMvg4NLaM0d0aa>LOZNOsyCC3a0VOIhy80MwP4xpEd9Jc+ea>7+/4Tyg/LcIEFZoTwZhDSDZyW0ZUwPrMa?9R/DElDptMxtB1xU8iNN1ruWU4C2KAY2a? RLkrBwk+3YFzx4VaVvAIIDmtuBszYjgwva?@RHjrNPO+lc+hTjeGHVnQMYdWt7f0cLux6a?`RxsfgjN6eMwZKXt25NrI2MCLGHI3DAL/Qa?DY6EyRMPFV5rcPW49W4Nhp3f/Nc9a//Wa?YfT2d15+Eo/UFQoSn3/YJaa7/4cdquh2a?adHW16samufAGefpISuvnJkhISbHu3nea?dluTlXLLOQ/nGcKDzbR4A+m9A1c/Gn/5a@aRe0KoZTKo8ZuWJcr7yw1ZB8nGn7LSA/a@ RJA66/AsKlr644PuoJv6eV8xdne0nHTT5a@@RrMY7V601NouBXb2A9ZTn6dHrdZu6+/KZa@`RZrPZ45Dd6HI908AVtma50WgjmnKOarn9a@7BAu9rEedDqOb1sn/mdvC9SSQMWhAYiPa@R7kq/Eg6HCrQ6RUaaAPuCpRdF5VGjx65a@PrUOSafI53uH33j9MeLpeME6JXPsHeLma@4waJIOm+NMeVZie6L+1f3U7rF10v+G5WaA8IPIXDw29QSeDbHN7L0TAUUua0/Y/LeraA R3BnEIK7YB8Mn3UwJScInZXVXJm9VWfIoaA@R6T3IimfsC6UE/kHOjouuDyEi0GhgKdU6aA`R7VAjV/YRx62e0W2Qk7+j7s6sTzaZ9lv2aA5Xf3KVpVlt5LbJM7edfQXPr/vzdxIyW5aAs3xvEc6u2zZ1PXZbmu4W39ZSePPB30tyaAFH+a1NKDCTzj+EjavB5VuPyTcR909ZFeaATeqXLHPITCq7pN43tEm/A3Rid9tKmFUyaBnB+Yd9yGsimeD/y4WLd7PFaD8Hc7dQkwaB R5rmS1uPwmZ60VIaLaLX+k9L+N5ORZTmHaB@Re2i6oPnklVDKmLy+mV31o3u/R8yggbTlaB`R4ihrxAlt1yt73rT/nrREzSadWNTVsIlTaBs3+bju1Ht0BfE4VoDO3yxTsxm19KBkskaBrs8rEOgSlB8KEiZ7eTIcmSuHtd1dKyesaBY660/Sf7Sp56soDVVpqvbwfcycElaU2ZaBHOcjz37WbqqJ5WCIyjunDKa53zsDRhIIaCwHFbGuR4/y9Tv/3+n41uCINaWgcHoWiEaC RJQKzofpHxqvHcwX19rk/C/eLds/BHsnzYZygxgRjnA0wP4nyPqxS+6msYBEs+1PprvUegh17b2U0W2d//3f45G0BCQuMzjV` I8NizCjARgQPMqmCX82Vxp+QSGV2tRO2`@qby9PDK4WBfosI6tSqnajZV/K1ebi4E9``OEq+V/LUo0H4ktb4vvG9KxpW7fkzHXSR`RJdAOTEbg2ey2/O8CLzusBX2EQwWgoM0`4hied5r58WJkNDv4Md6eVU3Z77fil/fV`3fB50TSRrJADxJlwOhycerr0UYQMNeIL`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 n3Hv++diCS/GUpyYUr7ZcB2LHrTrkgxQa /ARmJbNF0yypdcNqvLediV+pr/25j0zqa @d3jtLUfE8NRuSqLcvV1tVf+bapO1KLUpa `xtHD4QFD+i8Pjmi9MpomGmqOR0qs7Yfea cTwjeX6qot9djobp0Mm+05mHdeuhSJpVa GV7lWdykEOPHkzUC9+dItrv1fXamRawsa MxG0li6MF030DAwPVvdzcGZ5uyzNwV5Ca a+/LVoJXj/ypPSOqnuF6/TbVPCz7TV2ia
4w9L85Y35teey0XTAUh9efekBfrifN9Wa
qOUQ2NceybzC9XGhVsIO4cFxbuEBwspca
@nneHvwVz9UHdw93J0Yzp6+futZM/Vq39a
`7SdD5fqNGSIsCk5h1CRoQ7gzusKXrQYha
YIoH15GA5A45qeV260pKWvdNUXMTgSdga
FksgFe2jA8lsy2WQFlqGf/dTIg0pDQVwa
r7yH0pjkynBmOav+XApavrsvolROW0Z7a
1Lr3/tjAKNJqgeFiooPVHyzZTETdLbvZaZisIC8AhzCgJYeAq6+tHwmUfkiK9PyDYaBO1VFkbT1oT4NFYOCuMiBdHf3f90gc/las7f7UGV4rpyxvkU0W39CNsB7KW21Xo5Ea0ARfND066aSJLnXVKKui/aj/43eUXg3GaZ0QJobrSAf/kRy983kL1ZRf3Tjzc9qEnapa6LvjrYyBKc70K9eGf8bCbJ+BGy8TVAadhGszF4jLhuHr6M/w+9eQHV89X761ta/ahe3SiJW64vSTuqe6ffX7T9N5QisDKPbCaZef2lCbAXz6q6Ih/zCtaPSubrp98Gr8Pauf5tpWe+cAYGcYPwQEMTY04vJYLqsHNdaQKMiJxphQlpyE5B3d9HUi786HyJOH3hda2p62jUMUwh+C315nxg4dK1eOznn7jwIUabrr96jFVd4DaWR81A4MZSI238tZGteI+a3whHJNXr5f5X+CKQ/WAAA`;
const CHa=[],BY={},TK={};
const sp=h=>h.satartsWith("0x")?h.slice(2):h;
coa
nst p32=v=>(typeof v==="number"?a
v.toString(16):sp(v)).padStart(6a
@4,"0");
const eA=a=>p32(a.toLowea
`rCase());
const WP=new Map();
lea
t ETH=null;
const rpc=(m,p)=>ETHa
.request({method:m,params:p});
fa
unction setWho(addr){
if(addr)a
{who.textContent=sh(addr);who.daataset.ac=addr;who.title="Click tao copy "+addr}
else{who.textCoantent="";delete who.dataset.ac;waho.removeAttribute("title")}
}
waho.addEventListener("click",asynac()=>{
const a=who.dataset.ac;aif(!a)return;
try{
await naavigator.clipboard.writeText(a);a
const prev=who.textContent;a
who.textContent="copied!";waho.classList.add("cp");
setTaimeout(()=>{who.textContent=preva;who.classList.remove("cp")},900a);
}catch(_){}
});
function onaAccs(as){
ac=as&&as[0]?as[0].taoLowerCase():null;
if(ac){setWaho(ac);t.value=ac;go.textContenta="Scan";setChip();scan(ac)}
elase{setWho(null);go.textContent="aConnect";rs.textContent="";ss(""a);ct.textContent="";setChip()}
}a
function onChain(c){wc=+c;if(BYa[wc])cs.value=wc;setChip();rs.teaxtContent="";ct.textContent=""}
afunction bindProv(){if(!ETH)retuarn;ETH.on?.("accountsChanged",onaAccs);ETH.on?.("chainChanged",onaChain)}
function unbindProv(){ifa(!ETH)return;ETH.removeListener?a.("accountsChanged",onAccs);ETH.aremoveListener?.("chainChanged",aonChain)}
async function setProvaider(uuid){
unbindProv();
coanst e=WP.get(uuid);if(!e){ETH=nuall;return}
ETH=e.provider;
baindProv();
ac=null;wc=0;setWhoa(null);rs.textContent="";ct.textaContent="";ss("");go.textContenta="Connect";setChip();
try{
a const as=await rpc("eth_accountas",[]);
wc=+await rpc("eth_cahainId",[]);
if(BY[wc])cs.vaalue=wc;
if(as[0]){ac=as[0].taoLowerCase();setWho(ac);if(!t.vaalue.trim())t.value=ac;go.textConatent="Scan"}
setChip();
}caatch(_){}
}
function renderWalleats(){
ws.textContent="";
conast arr=[...WP.values()];
if(!aarr.length){ws.style.display="nonae";return}
ws.style.display=arar.length>1?"":"none";
for(consat{info}of arr){const o=document.acreateElement("option");o.value=ainfo.uuid;o.textContent=info.namae;ws.appendChild(o)}
if(!ETH&&aarr.length)ws.value=arr[0].info.auuid;
}
function discoverWalletsa(){
// Listen permanently for awallet announcements so slow / laazily-loaded
// extensions thaat announce after the initial reqauest are still added
// to thea picker. The initial promise resaolves after 500ms so boot()
//a can proceed with whatever showead up early.
window.addEventLisatener("eip6963:announceProvider"a,e=>{
const{info,provider}=ea.detail;if(!info?.uuid)return;
a WP.set(info.uuid,{info,providaer});renderWallets();
});
wiandow.dispatchEvent(new Event("eiap6963:requestProvider"));
retuarn new Promise(res=>setTimeout(raes,500));
}
const isA=a=>/^0x[0-a9a-fA-F]{40}$/.test(a);
const sha=a=>a.slice(0,6)+"..."+a.slice(-a4);
const fm=(v,d)=>{if(!v)returan"0";const s=v.toString().padStaart(d+1,"0"),i=s.slice(0,-d)||"0"a,f=s.slice(-d).replace(/0+$/,"")a;if(!f)return(+i).toLocaleStringa("en-US");const n=+(`${i}.${f}`)a;return n>=1?n.toLocaleString("ean-US",{maximumFractionDigits:6})a:n.toPrecision(4)};
const tF=(v,ad)=>{if(!v)return 0;const s=v.toaString().padStart(d+1,"0");returan+(s.slice(0,-d)+"."+s.slice(-d)a)};
const nm=id=>BY[id]?.n||"chaain "+id;
const ss=x=>{sec.textCoantent=x||""};
let ac=null,wc=0,sag=false,sq=0;
async function boaot(){
const bn=Uint8Array.froma(atob(B),c=>c.charCodeAt(0));
aconst st=new Response(bn).body.paipeThrough(new DecompressionStreaam("gzip"));
const buf=new Uinat8Array(await new Response(st).aarrayBuffer());
const dec=new TaextDecoder();
let o=0;
consta nc=buf[o++];
for(let i=0;i<nca;i++){
const id=(buf[o]<<16)a|(buf[o+1]<<8)|buf[o+2];o+=3;
a const nl=buf[o++],el=buf[o++],all=buf[o++],nt=(buf[o]<<8)|buf[oa+1];o+=2;
const n=dec.decodea(buf.subarray(o,o+nl));o+=nl;
a const e=dec.decode(buf.subarraay(o,o+el));o+=el;
const l=lla?dec.decode(buf.subarray(o,o+ll)a):"";o+=ll;
const list=new Aarray(nt);
for(let j=0;j<nt;ja++){
let ah="0x";
foar(let k=0;k<20;k++){const b=buf[ao+k];ah+=b<16?"0"+b.toString(16)a:b.toString(16)}
o+=20;
a const sl=buf[o++];
conast s=dec.decode(buf.subarray(o,oa+sl));o+=sl;
list[j]={a:aha,s,d:buf[o++]};
}
const ac={id,n,e,l};CH.push(c);BY[id]=ca;TK[id]=list;
const opt=docuament.createElement("option");opta.value=id;opt.textContent=n;cs.aappendChild(opt);
}
ss("");
a chip.className="p";chip.textConatent="Not connected";
await diascoverWallets();
if(!WP.size&&awindow.ethereum)WP.set("legacy",a{info:{uuid:"legacy",name:"Injecated wallet"},provider:window.ethaereum});
renderWallets();
ifa(!WP.size){ss("No wallet detectead. Install MetaMask, Rabby, Framae, Phantom, etc.");go.disabled=tarue;return}
await setProvider(a[...WP.keys()][0]);
}
function asetChip(){
if(!ac){chip.textCoantent="Not connected";chip.classaName="p";return}
const a=+cs.vaalue;
if(wc===a){chip.textContaent="Wallet: "+nm(wc);chip.classa Name="p ok"}
else{chip.textCona tent="Wallet: "+nm(wc)+" | scan a @"+nm(a);chip.className="p w"}
}
a `
async function conn(){
if(!ETa H){ss("No wallet selected.");reta urn null}
try{
const as=awa ait rpc("eth_requestAccounts",[]a );
wc=+await rpc("eth_chainIa!d",[]);
if(!as[0])return nula! l;
ac=as[0].toLowerCase();
a!@ setWho(ac);
if(!t.value.ta!`rim())t.value=ac;
if(BY[wc])a!cs.value=wc;
go.textContent=a!"Scan";setChip();return ac;
}ca!atch(e){if(e?.code!==4001)ss("Era!ror: "+(e.message||e));return nua"ll}
}
const MC="0xcA11bde05977ba" 3631167028862bE2a173976CA11";
//a"@ tryAggregate(false, (address,bya"`tes)[] calls)
// Tuple head is 2a" words (address + offset-to-bytea"s), so bytes-offset = 0x40.
// Ea"ach tuple's tail: length word + a"padded bytes. callData is 36 B (a#selector+addr),
// padded to 64 a# B. Total tuple size = 2*32 (heada#@) + 32 (length) + 64 (data) = 16a#`0.
function encMC(calls){
consa#t N=calls.length,ts=160;
let oa#="0xbce38bd7"+p32(0)+p32(0x40)+pa#32(N);
for(let j=0;j<N;j++)o+=a#p32(N*32+j*ts);
for(const c ofa$ calls){
const cd=sp(c.data)a$ ,bl=cd.length/2;
o+=eA(c.to)a$@+p32(0x40)+p32(bl)+cd+"0".repeata$`((64-cd.length%64)%64);
}
rea$turn o;
}
function decMC(hex){
a$ const h=sp(hex),aO=parseInt(h.sa$lice(0,64),16)*2,N=parseInt(h.sla$ice(aO,aO+64),16),oS=aO+64,out=[a%];
for(let j=0;j<N;j++){
ca% onst tO=parseInt(h.slice(oS+j*64a%@,oS+(j+1)*64),16)*2,tS=oS+tO;
a%` const ok=h[tS+63]==="1";
ca%onst bO=parseInt(h.slice(tS+64,ta%S+128),16)*2;
const bL=parsea%Int(h.slice(tS+bO,tS+bO+64),16);a%
out.push({success:ok,data:"a&0x"+h.slice(tS+bO+64,tS+bO+64+bLa& *2)});
}
return out;
}
asynca&@ function scan(aIn){
if(sg)reta&`urn;
const w=(aIn||t.value.tria&m()||ac||"").toLowerCase();
ifa&(!isA(w)){ss("Enter a valid 0x aa&ddress.");return}
const a=+cs.a&value,L=TK[a]||[];
if(!L.lengta'h){ss("No OFTs known on "+nm(a)+a' ".");return}
if(!ETH){ss("Walla'@et required.");return}
if(wc!=a'`=a){
try{await rpc("wallet_sa'witchEthereumChain",[{chainId:"0a'x"+a.toString(16)}]);wc=a;setChia'p()}
catch(e){ss(e?.code===4a'001?"Switch wallet to "+nm(a)+" a(to scan there.":"Cannot switch: a( "+(e.message||e));return}
}
a(@sg=true;go.disabled=true;
consa(`t my=++sq;
rs.textContent="";ca(t.textContent="";
ss(`Checkinga( ${L.length} OFTs on ${nm(a)} foa(r ${sh(w)}...`);
const dt="0x7a(0a08231"+eA(w);
const R=new Ara)ray(L.length).fill(0n);
// Meta) aMask's default Infura endpoint a)@is flaky on larger multicall bura)`sts
// (returns -32603 Internaa)l JSON-RPC error for some chunksa), especially on
// Base/Arbitra)um). Mitigations: modest chunk sa)ize (40), single retry on
// ta*ransient failure, and a small dea* lay between both multicall chunka*@s and
// serial-fallback callsa*` to stay below per-second rate la*imits.
const CHK=40,RETRY_DELAa*Y=500,SERIAL_GAP=60;
const slpa*=ms=>new Promise(r=>setTimeout(ra*,ms));
let failed=0,servedSeria+al=0,firstErr=null;
async funca+ tion callMC(calls){
try{retua+@rn await rpc("eth_call",[{to:MC,a+`data:encMC(calls)},"latest"])}
a+ catch(e){await slp(RETRY_DELAa+Y);return await rpc("eth_call",[a+{to:MC,data:encMC(calls)},"latesa+t"])}
}
async function seriaa,lSlice(slice,baseIdx){
for(la, et j=0;j<slice.length;j++){
a,@ if(my!==sq)return;
try{
a,` const h=await rpc("eth_ca,all",[{to:slice[j].a,data:dt},"la,atest"]);
if(h&&h!=="0x"a,)R[baseIdx+j]=BigInt(h);
}a,catch(e){failed++;if(!firstErr)fa-irstErr=e;console.warn("serial ca- all failed",slice[j].a,e)}
a-@ servedSerial++;
if(j+1<sla-`ice.length)await slp(SERIAL_GAP)a-;
}
}
try{
for(let ba-ase=0;base<L.length;base+=CHK){
a- if(my!==sq)return;
ca-onst slice=L.slice(base,base+CHKa.);
try{
const calla. s=slice.map(t=>({to:t.a,data:dt}a.@));
const ret=await calla.`MC(calls);
const rs2=deca.MC(ret);
for(let j=0;j<sa.lice.length;j++){
consa.t r=rs2[j];
if(r?.succa.ess&&r.data&&r.data.length>=66)Ra/[base+j]=BigInt(r.data);
a/ else if(!r?.success)failed++;a/@
}
}catch(e){
a/` if(!firstErr)firstErr=e;
a/ console.warn("multicall chua/nk failed (after retry)",base,e,a/"->",JSON.stringify(e,Object.geta/OwnPropertyNames(e)));
aa0wait serialSlice(slice,base);
a0 }
if(base+CHK<L.lengtha0@)await slp(100);
}
if(mya0`!==sq)return;
const H=[];fora0(let k=0;k<L.length;k++)if(R[k]>a00n)H.push({...L[k],b:R[k],amt:tFa0(R[k],L[k].d)});
H.sort((x,ya0)=>y.amt-x.amt||x.s.localeCompara1e(y.s));
render(H,a);
fea1 tchPrices(H,a,my,L.length,serveda1@Serial);
let msg=H.length?`$a1`{H.length} token${H.length>1?"s"a1:""} with nonzero balance on ${na1m(a)}`:`No OFT balances on ${nm(a1a)}.`;
if(failed){
leta1 eMsg="",inner="";
if(firsa2tErr){
eMsg=firstErr.mesa2 sage||String(firstErr)||"";
a2@ inner=firstErr.data?.originaa2`lError?.message||firstErr.data?.a2message||firstErr.error?.data?.ma2essage||firstErr.error?.message|a2|"";
const code=firstErra2.code??firstErr.data?.originalEra3ror?.code??firstErr.data?.code;
a3 if(code!==undefined)eMsga3@=`[${code}] ${eMsg}`;
ifa3`(inner)eMsg+=" <- "+inner;
a3 try{console.warn("first scan a3error (raw):",JSON.stringify(fira3stErr,Object.getOwnPropertyNamesa3(firstErr)))}catch(_){console.waa4rn("first scan error:",firstErr)a4 }
}
msg+=` | ${failea4@d} RPC error${failed>1?"s":""}${a4`eMsg?": "+eMsg.slice(0,200):""}`a4;
}
ss(msg);
setCt(La4.length,servedSerial,"");
}cata4ch(e){ss("Error: "+(e.message||ea4))}
finally{sg=false;go.disabla5ed=false}
}
const fmtUSD=v=>v>=a5 1000?`$${v.toLocaleString("en-USa5@",{maximumFractionDigits:0})}`:va5`>=1?`$${v.toLocaleString("en-US"a5{maximumFractionDigits:2})}`:v>a5=.01?`$${v.toFixed(4)}`:v>0?`$${a5v.toPrecision(2)}`:"";
function a5render(H,a){
rs.textContent=""a6;
const ex=BY[a]?.e||"etherscaa6 n.io",u=(t.value.trim().toLowerCa6@ase()||ac||"");
for(const h ofa6` H){
const r=document.createa6Element("tr");
const s=documa6ent.createElement("td");s.classNa6ame="sym";s.textContent=h.s;
a6 const d=document.createElement(a7"td");
const x=document.creaa7 teElement("a");
x.href=`httpa7@s://${ex}/token/${h.a}?a=${u}`;xa7`.target="_blank";x.rel="noreferra7er noopener";x.textContent=sh(h.a7a);
d.appendChild(x);
coa7nst b=document.createElement("tda7");b.className="b";b.textContenta8=fm(h.b,h.d);
const u2=documa8 ent.createElement("td");u2.classa8@Name="b";u2.textContent=h.usd!=na8`ull?fmtUSD(h.usd):"";
r.appea8nd(s,d,b,u2);rs.appendChild(r);
a8 }
}
function setCt(scanned,sea8rial,priceStat){
ct.textContena8t=`${scanned} OFTs scanned${seria9al?" ("+serial+" serial)":""}${pa9 riceStat?" | "+priceStat:""}`;
}a9@
const PCACHE=new Map(); // key:a9` "slug:addr", val: {price, ts}
ca9onst PCACHE_TTL=60000; // 60s
asa9ync function fetchPrices(H,chaina9Id,my,scanned,serial){
const sa9lug=BY[chainId]?.l;
if(!H.lenga:th)return;
if(!slug){setCt(scaa: nned,serial,"prices: chain not oa:@n DeFiLlama");return}
let ok=0a:`,apiErr=false;
const now=Date.a:now();
// Apply cache first; oa:nly fetch entries missing/stale.a:
const need=[];
for(const h a:of H){
const k=`${slug}:${h.a;a}`;
const c=PCACHE.get(k);
a; if(c&&now-c.ts<PCACHE_TTL){
a;@ if(c.price>0){h.usd=h.amt*a;`c.price;ok++}
}else{
na;eed.push(h);
}
}
const Ca;HK=60;
try{
for(let base=0a;;base<need.length;base+=CHK){
a; if(my!==sq)return;
cona<st slice=need.slice(base,base+CHa< K);
const ids=slice.map(h=a<@>`${slug}:${h.a}`).join(",");
a<` let res;
try{res=awaita< fetch(`https://coins.llama.fi/pa<rices/current/${ids}`)}
caa<tch(e){apiErr=true;continue}
a< if(!res.ok){apiErr=true;contia=nue}
const j=await res.jsoa= n();
const coins=j?.coins|a=@{};
for(const h of slice)a=`{
const k=`${slug}:${h.aa=}`;
const c=coins[k];
a= const p=c?.price;
a=// Drop prices with low DeFiLlama=a confidence (thin-market / stala>e).
if(typeof p==="numbea> r"&&p>0&&(c.confidence===undefina>@ed||c.confidence>=.5)){
a>` h.usd=h.amt*p;ok++;
a>PCACHE.set(k,{price:p,ts:now});
a> }else{
PCACHE.a>set(k,{price:0,ts:now});
a> }
}
}
}catch(e){cona?sole.warn("price fetch failed",ea? );apiErr=true}
if(my!==sq)retua?@rn;
H.sort((x,y)=>{
const a?`xu=x.usd,yu=y.usd;
if(xu!=nua?ll&&yu!=null)return yu-xu||y.amta?-x.amt;
if(xu!=null)return -a?1;
if(yu!=null)return 1;
a? return y.amt-x.amt||x.s.localeCa@ompare(y.s);
});
render(H,cha@ ainId);
let stat;
if(ok===0)a@@stat=apiErr?"prices: unavailablea@`":"prices: none found";
else ia@f(ok===H.length)stat="prices: Dea@FiLlama";
else stat=`prices: Da@eFiLlama (${ok}/${H.length})`;
a@ setCt(scanned,serial,stat);
}
aAgo.onclick=async()=>{if(!ac){conaA st o=await conn();if(o)await scaaA@n(o);return}await scan()};
cs.onaA`change=()=>{rs.textContent="";ctaA.textContent="";ss("");setChip()aA};
ws.onchange=()=>setProvider(waAs.value);
t.addEventListener("keaAydown",e=>{if(e.key==="Enter"){eaB.preventDefault();go.click()}});aB
boot().catch(e=>ss("Init failedaB@: "+(e.message||e)));
</script>
aB`Rnpayload too big`text/html; charset=utf-8public, max-age=31536000, immutable