UNPKG

@taquito/utils

Version:

converts michelson data and types into convenient JS/TS objects

263 lines (262 loc) 9.36 kB
"use strict"; 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]); }