123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- /**
- * Some data helpers.
- *
- *
- * @_subsection api/utils:Data Helpers [about-data]
- */
- import { assert, assertArgument } from "./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;
- }
- 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
- */
- export 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
- */
- export 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).
- */
- export 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 true if %%value%% is a valid representation of arbitrary
- * data (i.e. a valid [[DataHexString]] or a Uint8Array).
- */
- export function isBytesLike(value) {
- return (isHexString(value, true) || (value instanceof Uint8Array));
- }
- const HexCharacters = "0123456789abcdef";
- /**
- * Returns a [[DataHexString]] representation of %%data%%.
- */
- export function hexlify(data) {
- const bytes = getBytes(data);
- let result = "0x";
- for (let i = 0; i < bytes.length; i++) {
- const v = bytes[i];
- result += HexCharacters[(v & 0xf0) >> 4] + HexCharacters[v & 0x0f];
- }
- return result;
- }
- /**
- * Returns a [[DataHexString]] by concatenating all values
- * within %%data%%.
- */
- export function concat(datas) {
- return "0x" + datas.map((d) => hexlify(d).substring(2)).join("");
- }
- /**
- * Returns the length of %%data%%, in bytes.
- */
- export 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%%.
- */
- export function dataSlice(data, start, end) {
- const bytes = getBytes(data);
- if (end != null && end > bytes.length) {
- assert(false, "cannot slice beyond data bounds", "BUFFER_OVERRUN", {
- buffer: bytes, length: bytes.length, offset: end
- });
- }
- return hexlify(bytes.slice((start == null) ? 0 : start, (end == null) ? bytes.length : end));
- }
- /**
- * Return the [[DataHexString]] result by stripping all **leading**
- ** zero bytes from %%data%%.
- */
- export function stripZerosLeft(data) {
- let bytes = hexlify(data).substring(2);
- while (bytes.startsWith("00")) {
- bytes = bytes.substring(2);
- }
- return "0x" + bytes;
- }
- function zeroPad(data, length, left) {
- const bytes = getBytes(data);
- 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 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``).
- */
- export 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``).
- */
- export function zeroPadBytes(data, length) {
- return zeroPad(data, length, false);
- }
- //# sourceMappingURL=data.js.map
|