memoscan
← all memos

Memo 0x2a93fa31…83f92a on Ethereum

<!-- loader and all assembled contents cc0 --> <!DOCTYPE html> <html><head><meta charset="UTF-8"> <title>Ethereum Mirror</title> <style> *{margin:0;padding:0;box-sizing:border-box} html,body{width:100%;height:100%;background:#000;overflow:hidden; font-family:monospace;color:#666;display:flex;align-items:center;justify-content:center} #status{position:fixed;z-index:2;text-align:center;font-size:12px;line-height:1.8} #status .err{color:#a44} #status .retry{color:#666;cursor:pointer;text-decoration:underline} #status .retry:hover{color:#aaa} #status .src{color:#444;font-size:10px} </style> </head> <body> <div id="status">loading...</div> <script> var TOKEN = 9994; var START = 6; var COUNT = 15; var CONTRACT = '0xECb92Cc7112b80A2234936315BbB493fb48d1463'; var ETHFS = '0xFe1411d6864592549AdE050215482e4385dFa0FB'; var RPCS = [ 'https://ethereum-rpc.publicnode.com', 'https://eth.drpc.org', 'https://0xrpc.io/eth', 'https://eth.llamarpc.com' ]; var statusEl = document.getElementById('status'); var provider = null; var providerName = ''; function pad32(n) { return n.toString(16).padStart(64, '0'); } function hexToStr(hex) { if (hex.startsWith('0x')) hex = hex.slice(2); var b = new Uint8Array(hex.length / 2); for (var i = 0; i < hex.length; i += 2) b[i / 2] = parseInt(hex.substr(i, 2), 16); return new TextDecoder().decode(b); } function encodeString(s) { var b = new TextEncoder().encode(s); var offset = pad32(32); var length = pad32(b.length); var hexData = ''; for (var i = 0; i < b.length; i++) hexData += b[i].toString(16).padStart(2, '0'); while (hexData.length % 64 !== 0) hexData += '0'; return offset + length + hexData; } function detectProvider() { if (window.ethereum) { provider = 'wallet'; providerName = window.ethereum.isMetaMask ? 'MetaMask' : window.ethereum.isRabby ? 'Rabby' : window.ethereum.isCoinbaseWallet ? 'Coinbase' : 'wallet'; return; } provider = 'rpc'; providerName = 'public RPC'; } async function ethCall(to, data) { var params = [{ to: to, data: data }, 'latest']; if (provider === 'wallet') { try { var result = await window.ethereum.request({ method: 'eth_call', params: params }); if (result) return result; } catch (e) { provider = 'rpc'; providerName = 'public RPC (wallet fallback)'; } } for (var a = 0; a < RPCS.length; a++) { try { var r = await fetch(RPCS[a], { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ jsonrpc: '2.0', method: 'eth_call', params: params, id: 1 }) }); var j = await r.json(); if (j.result && j.result !== '0x') return j.result; } catch (e) {} } return null; } async function readEntry(tokenId, entryIdx) { var data = '0x39c50f01' + pad32(tokenId) + pad32(entryIdx); var raw = await ethCall(CONTRACT, data); if (!raw || raw === '0x' || raw.length < 130) return null; var len = parseInt(raw.slice(66, 130), 16); if (len === 0) return null; return raw.slice(130, 130 + len * 2); } async function readEthfsFile(filename) { var data = '0x60f9bb11' + encodeString(filename); var raw = await ethCall(ETHFS, data); if (!raw || raw === '0x' || raw.length < 130) return null; var len = parseInt(raw.slice(66, 130), 16); if (len === 0) return null; var hex = raw.slice(130, 130 + len * 2); return hexToStr(hex); } async function run() { detectProvider(); statusEl.innerHTML = 'reading chain via ' + providerName + '...'; var parts = []; var gunzipB64 = null; var p5GzB64 = null; // Start ethfs reads in parallel (non-blocking) var ethfsPromise = (async function() { try { gunzipB64 = await readEthfsFile('gunzipScripts-0.0.1.js'); p5GzB64 = await readEthfsFile('p5-v1.5.0.min.js.gz'); } catch (e) {} })(); // Read vault chunks for (var i = 0; i < COUNT; i++) { var entry = START + i; statusEl.innerHTML = 'reading ' + (i + 1) + '/' + COUNT + '...<br><span class="src">via ' + providerName + '</span>'; var hex = await readEntry(TOKEN, entry); if (!hex) { statusEl.innerHTML = '<span class="err">failed to read entry ' + entry + '</span><br>' + '<span class="src">tried: ' + providerName + '</span><br>' + '<span class="retry" onclick="run()">retry</span>'; return; } parts.push(hexToStr(hex)); } await ethfsPromise; // Assemble HTML var html = parts.join(''); // Inject ethfs p5.js fallback if available if (gunzipB64 && p5GzB64) { var gunzipJs = atob(gunzipB64); var S = 'scr' + 'ipt'; var cdnTag = '<' + S + ' src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.11.3/p5.min.js"></' + S + '>'; var fallback = '<' + S + ' id="__gunzip">' + gunzipJs + '</' + S + '>\n' + '<' + S + ' src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.11.3/p5.min.js" ' + 'onerror="(function(){' + "var s=document.createElement('" + S + "');" + "s.type='text/javascript+gzip';" + "s.src='data:text/javascript;base64," + p5GzB64 + "';" + "document.head.appendChild(s);" + "window.gunzipScripts();" + '})()">' + '</' + S + '>'; html = html.replace(cdnTag, fallback); } // Replace the entire document with the assembled art document.open(); document.write(html); document.close(); } run(); </script> </body></html>