@axiom-crypto/tools
Version:
Useful data, field, and byte manipulation tools for Axiom.
67 lines (66 loc) • 2.25 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.decodeQueryV1 = void 0;
// The packed query blob is encodePacked as [versionIdx, length, encdoedQueries[]]: ["uint8", "uint32", "bytes[]"]
// Each row is then encodePacked as [length, blockNumber, address, slot, value]: ["uint8", "uint32", "address", "uint256", "uint256"]
function decodeQueryV1(query) {
const numQueryRows = parseInt(query.slice(0, 8), 16);
const encodedQueries = query.slice(8);
if (isNaN(numQueryRows)) {
throw new Error(`Unable to decode number of query rows: ${query.slice(0, 8)}`);
}
let header = {
version: 1,
rows: numQueryRows,
};
const body = decodePackedQueryRows(encodedQueries, numQueryRows);
return {
header,
body,
};
}
exports.decodeQueryV1 = decodeQueryV1;
function decodePackedQueryRows(encodedQueries, rows) {
let decodedQueries = [];
let offset = 0;
for (let i = 0; i < rows; i++) {
const queryLength = parseInt(encodedQueries.slice(offset, offset + 2), 16);
offset += 2;
if (queryLength > 4) {
throw new Error(`Invalid query length: greater than 4: ${queryLength}`);
}
const blockNumber = parseInt(encodedQueries.slice(offset, offset + 8), 16);
offset += 8;
if (queryLength === 1) {
decodedQueries.push({
blockNumber,
address: undefined,
slot: undefined,
value: undefined,
});
continue;
}
const address = `0x${encodedQueries.slice(offset, offset + 40)}`;
offset += 40;
if (queryLength === 2) {
decodedQueries.push({
blockNumber,
address,
slot: undefined,
value: undefined,
});
continue;
}
const slot = `0x${encodedQueries.slice(offset, offset + 64)}`;
offset += 64;
const value = `0x${encodedQueries.slice(offset, offset + 64)}`;
offset += 64;
decodedQueries.push({
blockNumber,
address,
slot,
value,
});
}
return decodedQueries;
}