@zlattice/lattice-js
Version:
Lattice blockchain TypeScript SDK with dual module support (CJS + ESM)
164 lines • 4.87 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getBytes = getBytes;
exports.getBytesCopy = getBytesCopy;
exports.isHexString = isHexString;
exports.concat = concat;
exports.dataLength = dataLength;
exports.dataSlice = dataSlice;
exports.stripZerosLeft = stripZerosLeft;
exports.zeroPadValue = zeroPadValue;
exports.zeroPadBytes = zeroPadBytes;
/**
* Some data helpers.
*
*
* @_subsection api/utils:Data Helpers [about-data]
*/
const bytes_1 = require("@ethersproject/bytes");
const errors_1 = require("./errors.js");
function _getBytes(value, name, copy) {
if (value instanceof Uint8Array) {
if (copy) {
return new Uint8Array(value);
}
return value;
}
if (typeof value === "string" && value.match(/^0x(?:[0-9a-f][0-9a-f])*$/i)) {
const result = new Uint8Array((value.length - 2) / 2);
let offset = 2;
for (let i = 0; i < result.length; i++) {
result[i] = parseInt(value.substring(offset, offset + 2), 16);
offset += 2;
}
return result;
}
(0, errors_1.assertArgument)(false, "invalid BytesLike value", name || "value", value);
}
/**
* Get a typed Uint8Array for %%value%%. If already a Uint8Array
* the original %%value%% is returned; if a copy is required use
* [[getBytesCopy]].
*
* @see: getBytesCopy
*/
function getBytes(value, name) {
return _getBytes(value, name, false);
}
/**
* Get a typed Uint8Array for %%value%%, creating a copy if necessary
* to prevent any modifications of the returned value from being
* reflected elsewhere.
*
* @see: getBytes
*/
function getBytesCopy(value, name) {
return _getBytes(value, name, true);
}
/**
* Returns true if %%value%% is a valid [[HexString]].
*
* If %%length%% is ``true`` or a //number//, it also checks that
* %%value%% is a valid [[DataHexString]] of %%length%% (if a //number//)
* bytes of data (e.g. ``0x1234`` is 2 bytes).
*/
function isHexString(value, length) {
if (typeof value !== "string" || !value.match(/^0x[0-9A-Fa-f]*$/)) {
return false;
}
if (typeof length === "number" && value.length !== 2 + 2 * length) {
return false;
}
if (length === true && value.length % 2 !== 0) {
return false;
}
return true;
}
/**
* Returns a [[DataHexString]] by concatenating all values
* within %%data%%.
*/
function concat(datas) {
return `0x${datas.map((d) => (0, bytes_1.hexlify)(d).substring(2)).join("")}`;
}
/**
* Returns the length of %%data%%, in bytes.
*/
function dataLength(data) {
if (isHexString(data, true)) {
return (data.length - 2) / 2;
}
return getBytes(data).length;
}
/**
* Returns a [[DataHexString]] by slicing %%data%% from the %%start%%
* offset to the %%end%% offset.
*
* By default %%start%% is 0 and %%end%% is the length of %%data%%.
*/
function dataSlice(data, start, end) {
const bytes = getBytes(data);
if (end != null && end > bytes.length) {
(0, errors_1.assert)(false, "cannot slice beyond data bounds", "BUFFER_OVERRUN", {
buffer: bytes,
length: bytes.length,
offset: end
});
}
return (0, bytes_1.hexlify)(bytes.slice(start == null ? 0 : start, end == null ? bytes.length : end));
}
/**
* Return the [[DataHexString]] result by stripping all **leading**
** zero bytes from %%data%%.
*/
function stripZerosLeft(data) {
let bytes = (0, bytes_1.hexlify)(data).substring(2);
while (bytes.startsWith("00")) {
bytes = bytes.substring(2);
}
return `0x${bytes}`;
}
function zeroPad(data, length, left) {
const bytes = getBytes(data);
(0, errors_1.assert)(length >= bytes.length, "padding exceeds data length", "BUFFER_OVERRUN", {
buffer: new Uint8Array(bytes),
length: length,
offset: length + 1
});
const result = new Uint8Array(length);
result.fill(0);
if (left) {
result.set(bytes, length - bytes.length);
}
else {
result.set(bytes, 0);
}
return (0, bytes_1.hexlify)(result);
}
/**
* Return the [[DataHexString]] of %%data%% padded on the **left**
* to %%length%% bytes.
*
* If %%data%% already exceeds %%length%%, a [[BufferOverrunError]] is
* thrown.
*
* This pads data the same as **values** are in Solidity
* (e.g. ``uint128``).
*/
function zeroPadValue(data, length) {
return zeroPad(data, length, true);
}
/**
* Return the [[DataHexString]] of %%data%% padded on the **right**
* to %%length%% bytes.
*
* If %%data%% already exceeds %%length%%, a [[BufferOverrunError]] is
* thrown.
*
* This pads data the same as **bytes** are in Solidity
* (e.g. ``bytes16``).
*/
function zeroPadBytes(data, length) {
return zeroPad(data, length, false);
}
//# sourceMappingURL=data.js.map