UNPKG

@hyperlane-xyz/core

Version:

Core solidity contracts for Hyperlane

126 lines (115 loc) 4.91 kB
function prettyHex(hash) { return `${hash.slice(0, 8)}..${hash.slice(56)}`; } // return a light-ish hue function colorCode(hash) { const code = parseInt(hash.slice(60), 16); const h = code % 361; const s = code % 101; let l = code % 101; // yeah this is biased but it's good enough if (l < 30) { l += 30; } return `hsl(${h}, ${s}%, ${l}%)`; } async function fetchLogs() { const response = await fetch("/logs"); return await response.json(); } function tooltipFormat(v) { var out = "" out += `<div>` out += `<em>hash</em>: <code>${v["hash"]}</code><br/>` out += `<em>num</em>: <code>${v["number"]}</code><br/>` out += `<em>parent</em>: <code>${v["parentHash"]}</code><br/>` out += `<em>time</em>: <code>${v["timestamp"]}</code><br/>` if(v.hasOwnProperty("l1origin")) { out += `<em>L1 hash</em>: <code>${v["l1origin"]["hash"]}</code><br/>` out += `<em>L1 num</em>: <code>${v["l1origin"]["number"]}</code><br/>` out += `<em>seq</em>: <code>${v["sequenceNumber"]}</code><br/>` } out += `</div>` return out } async function pageTable() { const logs = await fetchLogs(); if (logs.length === 0) { return } const dataEl = $(`<div id="snapshot-tables" class="row"></div>`); $("#logs").append(dataEl); let numCols = 0 if (logs.length !== 0) { numCols = logs[0].length } const paginationEl = $(`<div id="pagination"></div>`) $("#logs").append(paginationEl) paginationEl.pagination({ dataSource: logs, pageSize: 40, showGoInput: true, showGoButton: true, callback: (data, pagination) => { let tables = [] for (var i = 0; i < numCols; i++) { // TODO: Fix grid overflow with more than 2 rollup drivers let html = '<div class="col-6">'; html += `<table class="table"> <thead> <caption style="caption-side:top">${data[0][i].engine_addr}</caption> <tr> <th scope="col">Timestamp</th> <th scope="col">L1Head</th> <th scope="col">L1Current</th> <th scope="col">L2Head</th> <th scope="col">L2Safe</th> <th scope="col">L2FinalizedHead</th> </tr> </thead> `; html += "<tbody>"; // TODO: it'll also be useful to indicate which rollup driver updated its state for the given timestamp for (const record of data) { const e = record[i]; if (e === undefined) { // this column has reached its end break } // outer stringify in title attribute escapes the content and adds the quotes for the html to be valid // inner stringify in // TODO: click to copy full hash html += `<tr> <td title="${e.event}" data-toggle="tooltip"> ${e.t} </td> <td title="${tooltipFormat(e.l1Head)}" data-bs-html="true" data-toggle="tooltip" style="background-color:${colorCode(e.l1Head.hash)};"> ${prettyHex(e.l1Head.hash)} </td> <td title="${tooltipFormat(e.l1Current)}" data-bs-html="true" data-toggle="tooltip" style="background-color:${colorCode(e.l1Current.hash)};"> ${prettyHex(e.l1Current.hash)} </td> <td title="${tooltipFormat(e.l2Head)}" data-bs-html="true" data-toggle="tooltip" style="background-color:${colorCode(e.l2Head.hash)};"> ${prettyHex(e.l2Head.hash)} </td> <td title="${tooltipFormat(e.l2Safe)}" data-bs-html="true" data-toggle="tooltip" style="background-color:${colorCode(e.l2Safe.hash)};"> ${prettyHex(e.l2Safe.hash)} </td> <td title="${tooltipFormat(e.l2FinalizedHead)}" data-bs-html="true" data-toggle="tooltip" style="background-color:${colorCode(e.l2FinalizedHead.hash)};"> ${prettyHex(e.l2FinalizedHead.hash)} </td> </tr>`; } html += "</tbody>"; html += "</table></div>"; tables.push(html); } const html = tables.join("\n"); dataEl.html(html); $('[data-toggle="tooltip"]').tooltip(); } }) } (async () => { pageTable() })()