@taquito/utils
Version:
converts michelson data and types into convenient JS/TS objects
263 lines (262 loc) • 9.36 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.ValidationResult = void 0;
exports.isValidPrefix = isValidPrefix;
exports.validateAddress = validateAddress;
exports.validateChain = validateChain;
exports.validateContractAddress = validateContractAddress;
exports.validateKeyHash = validateKeyHash;
exports.validateSignature = validateSignature;
exports.validatePublicKey = validatePublicKey;
exports.validateOperation = validateOperation;
exports.validateProtocol = validateProtocol;
exports.validateBlock = validateBlock;
exports.validateSpendingKey = validateSpendingKey;
exports.invalidDetail = invalidDetail;
exports.validateSmartRollupAddress = validateSmartRollupAddress;
const constants_1 = require("./constants");
const bs58check_1 = require("bs58check");
var ValidationResult;
(function (ValidationResult) {
ValidationResult[ValidationResult["NO_PREFIX_MATCHED"] = 0] = "NO_PREFIX_MATCHED";
ValidationResult[ValidationResult["INVALID_CHECKSUM"] = 1] = "INVALID_CHECKSUM";
ValidationResult[ValidationResult["INVALID_LENGTH"] = 2] = "INVALID_LENGTH";
ValidationResult[ValidationResult["VALID"] = 3] = "VALID";
})(ValidationResult || (exports.ValidationResult = ValidationResult = {}));
function isValidPrefix(value) {
if (typeof value !== 'string') {
return false;
}
return value in constants_1.prefix;
}
/**
* @description This function is called by the validation functions ([[validateAddress]], [[validateChain]], [[validateContractAddress]], [[validateKeyHash]], [[validateSignature]], [[validatePublicKey]]).
* Verify if the value has the right prefix or return `NO_PREFIX_MATCHED`,
* decode the value using base58 and return `INVALID_CHECKSUM` if it fails,
* check if the length of the value matches the prefix type or return `INVALID_LENGTH`.
* If all checks pass, return `VALID`.
*
* @param value Value to validate
* @param prefixes prefix the value should have
*/
function validatePrefixedValue(value, prefixes) {
const match = new RegExp(`^(${prefixes.join('|')})`).exec(value);
if (!match || match.length === 0) {
return ValidationResult.NO_PREFIX_MATCHED;
}
const prefixKey = match[0];
if (!isValidPrefix(prefixKey)) {
return ValidationResult.NO_PREFIX_MATCHED;
}
// Check whether annotation exist before starting validation
if (value.includes('%')) {
value = value.split('%')[0];
}
const kt1Regex = /^(KT1\w{33})$/;
if (!kt1Regex.test(value) && prefixKey === 'KT1') {
return ValidationResult.INVALID_CHECKSUM;
}
// decodeUnsafe return undefined if decoding fail
let decoded = bs58check_1.default.decodeUnsafe(value);
if (!decoded) {
return ValidationResult.INVALID_CHECKSUM;
}
decoded = decoded.slice(constants_1.prefix[prefixKey].length);
if (decoded.length !== constants_1.prefixLength[prefixKey]) {
return ValidationResult.INVALID_LENGTH;
}
return ValidationResult.VALID;
}
const implicitPrefix = [constants_1.Prefix.TZ1, constants_1.Prefix.TZ2, constants_1.Prefix.TZ3, constants_1.Prefix.TZ4];
const contractPrefix = [constants_1.Prefix.KT1];
const signaturePrefix = [constants_1.Prefix.EDSIG, constants_1.Prefix.P2SIG, constants_1.Prefix.SPSIG, constants_1.Prefix.SIG];
const pkPrefix = [constants_1.Prefix.EDPK, constants_1.Prefix.SPPK, constants_1.Prefix.P2PK, constants_1.Prefix.BLPK];
const operationPrefix = [constants_1.Prefix.O];
const protocolPrefix = [constants_1.Prefix.P];
const blockPrefix = [constants_1.Prefix.B];
const smartRollupPrefix = [constants_1.Prefix.SR1];
/**
* @description Used to check if an address or a contract address is valid.
*
* @returns
* 0 (NO_PREFIX_MATCHED), 1 (INVALID_CHECKSUM), 2 (INVALID_LENGTH) or 3 (VALID).
*
* @example
* ```
* import { validateAddress } from '@taquito/utils';
* const pkh = 'tz1L9r8mWmRPndRhuvMCWESLGSVeFzQ9NAWx'
* const validation = validateAddress(pkh)
* console.log(validation)
* // This example return 3 which correspond to VALID
* ```
*/
function validateAddress(value) {
return validatePrefixedValue(value, [...implicitPrefix, ...contractPrefix, ...smartRollupPrefix]);
}
/**
* @description Used to check if a chain id is valid.
*
* @returns
* 0 (NO_PREFIX_MATCHED), 1 (INVALID_CHECKSUM), 2 (INVALID_LENGTH) or 3 (VALID).
*
* @example
* ```
* import { validateChain } from '@taquito/utils';
* const chainId = 'NetXdQprcVkpaWU'
* const validation = validateChain(chainId)
* console.log(validation)
* // This example return 3 which correspond to VALID
* ```
*/
function validateChain(value) {
return validatePrefixedValue(value, [constants_1.Prefix.NET]);
}
/**
* @description Used to check if a contract address is valid.
*
* @returns
* 0 (NO_PREFIX_MATCHED), 1 (INVALID_CHECKSUM), 2 (INVALID_LENGTH) or 3 (VALID).
*
* @example
* ```
* import { validateContractAddress } from '@taquito/utils';
* const contractAddress = 'KT1JVErLYTgtY8uGGZ4mso2npTSxqVLDRVbC'
* const validation = validateContractAddress(contractAddress)
* console.log(validation)
* // This example return 3 which correspond to VALID
* ```
*/
function validateContractAddress(value) {
return validatePrefixedValue(value, contractPrefix);
}
/**
* @description Used to check if a key hash is valid.
*
* @returns
* 0 (NO_PREFIX_MATCHED), 1 (INVALID_CHECKSUM), 2 (INVALID_LENGTH) or 3 (VALID).
*
* @example
* ```
* import { validateKeyHash } from '@taquito/utils';
* const keyHashWithoutPrefix = '1L9r8mWmRPndRhuvMCWESLGSVeFzQ9NAWx'
* const validation = validateKeyHash(keyHashWithoutPrefix)
* console.log(validation)
* // This example return 0 which correspond to NO_PREFIX_MATCHED
* ```
*/
function validateKeyHash(value) {
return validatePrefixedValue(value, implicitPrefix);
}
/**
* @description Used to check if a signature is valid.
*
* @returns
* 0 (NO_PREFIX_MATCHED), 1 (INVALID_CHECKSUM), 2 (INVALID_LENGTH) or 3 (VALID).
*
* @example
* ```
* import { validateSignature } from '@taquito/utils';
* const signature = 'edsigtkpiSSschcaCt9pUVrpNPf7TTcgvgDEDD6NCEHMy8NNQJCGnMfLZzYoQj74yLjo9wx6MPVV29CvVzgi7qEcEUok3k7AuMg'
* const validation = validateSignature(signature)
* console.log(validation)
* // This example return 3 which correspond to VALID
* ```
*/
function validateSignature(value) {
return validatePrefixedValue(value, signaturePrefix);
}
/**
* @description Used to check if a public key is valid.
*
* @returns
* 0 (NO_PREFIX_MATCHED), 1 (INVALID_CHECKSUM), 2 (INVALID_LENGTH) or 3 (VALID).
*
* @example
* ```
* import { validatePublicKey } from '@taquito/utils';
* const publicKey = 'edpkvS5QFv7KRGfa3b87gg9DBpxSm3NpSwnjhUjNBQrRUUR66F7C9g'
* const validation = validatePublicKey(publicKey)
* console.log(validation)
* // This example return 3 which correspond to VALID
* ```
*/
function validatePublicKey(value) {
return validatePrefixedValue(value, pkPrefix);
}
/**
* @description Used to check if an operation hash is valid.
*
* @returns
* 0 (NO_PREFIX_MATCHED), 1 (INVALID_CHECKSUM), 2 (INVALID_LENGTH) or 3 (VALID).
*
* @example
* ```
* import { validateOperation } from '@taquito/utils';
* const operationHash = 'oo6JPEAy8VuMRGaFuMmLNFFGdJgiaKfnmT1CpHJfKP3Ye5ZahiP'
* const validation = validateOperation(operationHash)
* console.log(validation)
* // This example return 3 which correspond to VALID
* ```
*/
function validateOperation(value) {
return validatePrefixedValue(value, operationPrefix);
}
/**
* @description Used to check if a protocol hash is valid.
*
* @returns
* 0 (NO_PREFIX_MATCHED), 1 (INVALID_CHECKSUM), 2 (INVALID_LENGTH) or 3 (VALID).
*
* @example
* ```
* import { validateProtocol } from '@taquito/utils';
* const protocolHash = 'PtHangz2aRngywmSRGGvrcTyMbbdpWdpFKuS4uMWxg2RaH9i1qx'
* const validation = validateProtocol(protocolHash)
* console.log(validation)
* // This example return 3 which correspond to VALID
* ```
*/
function validateProtocol(value) {
return validatePrefixedValue(value, protocolPrefix);
}
/**
* @description Used to check if a block hash is valid.
*
* @returns
* 0 (NO_PREFIX_MATCHED), 1 (INVALID_CHECKSUM), 2 (INVALID_LENGTH) or 3 (VALID).
*
* @example
* ```
* import { validateBlock } from '@taquito/utils';
* const blockHash = 'PtHangz2aRngywmSRGGvrcTyMbbdpWdpFKuS4uMWxg2RaH9i1qx'
* const validation = validateBlock(blockHash)
* console.log(validation)
* // This example return 3 which correspond to VALID
* ```
*/
function validateBlock(value) {
return validatePrefixedValue(value, blockPrefix);
}
/**
* @description Used to check if a spending key is valid.
* @returns 0 (NO_PREFIX_MATCHED), 1 (INVALID_CHECKSUM), 2 (INVALID_LENGTH) or 3 (VALID).
*
*/
function validateSpendingKey(value) {
return validatePrefixedValue(value, [constants_1.Prefix.SASK]);
}
function invalidDetail(validation) {
switch (validation) {
case ValidationResult.NO_PREFIX_MATCHED:
return 'with unsupported prefix';
case ValidationResult.INVALID_CHECKSUM:
return 'failed checksum';
case ValidationResult.INVALID_LENGTH:
return 'with incorrect length';
default:
return '';
}
}
function validateSmartRollupAddress(value) {
return validatePrefixedValue(value, [...smartRollupPrefix]);
}
;