0xa89f3db4…071asent to0xecb92cc7…1463·#25,166,422·view on Etherscan
<!-- 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>