PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@vechain/sdk-core/src/utils/data
Просмотр файла: data.ts
import * as nc_utils from '@noble/curves/abstract/utils';
import { InvalidDataType } from '@vechain/sdk-errors';
import { Hex } from '../../vcdm/Hex';
import { Txt } from '../../vcdm/Txt';
import { ZERO_BYTES } from '../const';
/**
* Decodes a hexadecimal string representing a bytes32 value into a string.
* The bytes32 string can be padded with zeros to the left or right.
* An example of usage is to decode a bytes32 string returned by a smart contract function.
*
* @param {string} hex - The hexadecimal string to decode.
* @returns {string} - The decoded string value.
* @throws {InvalidDataType}
*/
const decodeBytes32String = (hex: string): string => {
if (!Hex.isValid(hex) || Hex.of(hex).digits.length !== 64)
throw new InvalidDataType(
'dataUtils.decodeBytes32String()',
`Failed to decode value ${hex} to string. Value is not a valid hex string or it is not 64 characters long`,
{ value: hex }
);
const valueInBytes = Hex.of(hex).bytes;
// Find the first zero byte.
const firstZeroIndex = valueInBytes.findIndex((byte) => byte === 0);
// If the first byte is zero, then the encoded bytes 32 string is padded with zeros to the left.
if (firstZeroIndex === 0) {
// Find the first non-zero byte.
const firstNotZeroIndex = valueInBytes.findIndex((byte) => byte !== 0);
// Decode the encoded bytes 32 string to string by removing the padded zeros.
return Txt.of(valueInBytes.subarray(firstNotZeroIndex)).toString();
} else if (firstZeroIndex !== -1) {
// Decode the encoded bytes 32 string to string by removing the padded zeros.
return Txt.of(valueInBytes.subarray(0, firstZeroIndex)).toString();
} else {
return Txt.of(valueInBytes).toString();
}
};
/**
* Encodes a string into a bytes32 hexadecimal expression with optional zero padding.
* The encoded bytes32 string can be used as a parameter for a smart contract function.
*
* @param {string} value - The value to encode.
* @param {'left' | 'right'} [zeroPadding='left'] - The type of zero padding to apply.
* @returns {string} The encoded bytes32 string is a hexadecimal expression prefixed with `0x.
* @throws {InvalidDataType}
*/
const encodeBytes32String = (
value: string,
zeroPadding: 'left' | 'right' = 'right' // Default to 'right' as ethers.js does.
): string => {
// Wrap any error raised by utf8BytesOf(value).
try {
const valueInBytes = Txt.of(value).bytes;
if (valueInBytes.length > 32) {
throw new InvalidDataType(
'dataUtils.encodeBytes32String()',
`Failed to encode value ${value} to bytes32 string. Value exceeds 32 bytes.`,
{ value }
);
}
const pad = ZERO_BYTES(32 - valueInBytes.length);
return zeroPadding === 'left'
? Hex.of(nc_utils.concatBytes(pad, valueInBytes)).toString()
: Hex.of(nc_utils.concatBytes(valueInBytes, pad)).toString();
} catch (e) {
throw new InvalidDataType(
'dataUtils.encodeBytes32String()',
`Failed to encode value ${value} to bytes32 string.`,
{ value },
e
);
}
};
export const dataUtils = {
decodeBytes32String,
encodeBytes32String
};
Выполнить команду
Для локальной разработки. Не используйте в интернете!