{"version":3,"sources":["../src/schema/types.ts","../src/tsUtils.ts","../src/schema/tools/validators/index.ts","../src/utils/errors.ts","../src/utils/semver.ts","../src/schema/tools/validators/constants.ts","../src/schema/tools/validators/common-validators.ts","../src/schema/tools/validators/collection-validators.ts","../src/schema/tools/validators/token-validators.ts","../src/schema/tools/collection.ts","../src/utils/address/stringUtils.ts","../src/schema/schemaUtils.ts","../src/schema/tools/token.ts","../src/utils/address/index.ts","../src/utils/address/constants.ts","../src/utils/address/imports.ts","../src/utils/address/ethereum.ts","../src/utils/address/substrate.ts","../src/utils/address/crossAccountId.ts","../src/utils/index.ts","../src/schema/tools/oldSchemaDecoder.ts","../src/schema/tools/universal.ts","../src/schema/index.ts"],"sourcesContent":["import {CrossAccountId} from \"../types\";\r\nimport {getEnumValues} from \"../tsUtils\";\r\nimport {bool} from \"@polkadot/types\";\r\n\r\nexport type InfixOrUrlOrCid =\r\n  { url: string, urlInfix?: undefined, ipfsCid?: undefined }\r\n  |\r\n  { urlInfix: string, url?: undefined, ipfsCid?: undefined }\r\n  |\r\n  { ipfsCid: string, url?: undefined, urlInfix?: undefined }\r\nexport type InfixOrUrlOrCidAndHash = InfixOrUrlOrCid & { hash?: string }\r\nexport const URL_TEMPLATE_INFIX = <const>'{infix}'\r\nexport type UrlTemplateString = `${string}${typeof URL_TEMPLATE_INFIX}${string}`\r\n\r\n\r\nexport enum AttributeType {\r\n  integer = \"integer\",        // number\r\n  float = \"float\",            // number\r\n  boolean = \"boolean\",        // number\r\n  timestamp = \"timestamp\",    // number // js, milliseconds from epoch\r\n  string = \"string\",          // string\r\n  url = \"url\",                // string\r\n  isoDate = \"isoDate\",        // string // ISO Date: YYYY-MM-DD\r\n  time = \"time\",              // string // 24h time: HH:mm:ss\r\n  colorRgba = \"colorRgba\",    // string // 'rrggbbaa'\r\n}\r\n\r\nexport const NumberAttributeTypes = [\r\n  AttributeType.integer, AttributeType.float, AttributeType.boolean, AttributeType.timestamp,\r\n]\r\nexport const IntegerAttributeTypes = [\r\n  AttributeType.integer, AttributeType.boolean, AttributeType.timestamp,\r\n]\r\nexport const StringAttributeTypes = [\r\n  AttributeType.string, AttributeType.url, AttributeType.isoDate, AttributeType.time, AttributeType.colorRgba,\r\n]\r\nexport const AttributeTypeValues = getEnumValues(AttributeType)\r\n\r\n\r\nexport type BoxedNumberWithDefault = {\r\n  _: number\r\n}\r\nexport type LocalizedStringWithDefault = {\r\n  _: string\r\n  [K: string]: string\r\n}\r\nexport type LocalizedStringOrBoxedNumberWithDefault = BoxedNumberWithDefault | LocalizedStringWithDefault\r\n\r\nexport interface AttributeSchema {\r\n  name: LocalizedStringWithDefault\r\n  optional?: boolean\r\n  isArray?: boolean\r\n  type: AttributeType\r\n  enumValues?: { [K: number]: LocalizedStringOrBoxedNumberWithDefault }\r\n}\r\n\r\ntype EncodedEnumAttributeValue = number | Array<number>\r\nexport type EncodedTokenAttributeValue =\r\n  number |\r\n  Array<number> |\r\n  LocalizedStringOrBoxedNumberWithDefault\r\n  | LocalizedStringOrBoxedNumberWithDefault[]\r\n\r\nexport interface EncodedTokenAttributes {\r\n  [K: number]: EncodedTokenAttributeValue\r\n}\r\n\r\nexport type CollectionAttributesSchema = {\r\n  [K: number]: AttributeSchema\r\n}\r\n\r\nexport enum COLLECTION_SCHEMA_NAME {\r\n  unique = 'unique',\r\n  old = '_old_',\r\n  ERC721Metadata = 'ERC721Metadata'\r\n}\r\n\r\nexport interface UniqueCollectionSchemaToCreate {\r\n  schemaName: COLLECTION_SCHEMA_NAME.unique\r\n  schemaVersion: string // semver\r\n\r\n  coverPicture: InfixOrUrlOrCidAndHash\r\n  coverPicturePreview?: InfixOrUrlOrCidAndHash\r\n\r\n  attributesSchemaVersion?: string\r\n  attributesSchema?: CollectionAttributesSchema\r\n\r\n  image: {\r\n    urlTemplate: UrlTemplateString\r\n  }\r\n\r\n  imagePreview?: {\r\n    urlTemplate?: UrlTemplateString\r\n  }\r\n\r\n  video?: {\r\n    urlTemplate?: UrlTemplateString\r\n  }\r\n\r\n  audio?: {\r\n    urlTemplate?: UrlTemplateString\r\n    format: string\r\n    isLossless?: boolean\r\n  }\r\n\r\n  spatialObject?: {\r\n    urlTemplate?: UrlTemplateString\r\n    format: string\r\n  }\r\n}\r\n\r\nexport type UniqueCollectionSchemaDecoded =\r\n  Omit<UniqueCollectionSchemaToCreate, 'schemaName' | 'coverPicture' | 'coverPicturePreview'>\r\n  & {\r\n  schemaName: COLLECTION_SCHEMA_NAME\r\n  collectionId: number\r\n  coverPicture: DecodedInfixOrUrlOrCidAndHash\r\n  coverPicturePreview?: DecodedInfixOrUrlOrCidAndHash\r\n  oldProperties?: {\r\n    _old_schemaVersion?: string\r\n    _old_offchainSchema?: string\r\n    _old_constOnChainSchema?: string\r\n    _old_variableOnChainSchema?: string\r\n  }\r\n}\r\n\r\ninterface IToken<GenericInfixUrlOrCidWithHash> {\r\n  name?: LocalizedStringWithDefault\r\n  description?: LocalizedStringWithDefault\r\n  image: GenericInfixUrlOrCidWithHash\r\n  imagePreview?: GenericInfixUrlOrCidWithHash\r\n  video?: GenericInfixUrlOrCidWithHash\r\n  audio?: GenericInfixUrlOrCidWithHash\r\n  spatialObject?: GenericInfixUrlOrCidWithHash\r\n}\r\n\r\nexport interface UniqueTokenToCreate extends IToken<InfixOrUrlOrCidAndHash> {\r\n  encodedAttributes?: EncodedTokenAttributes\r\n}\r\n\r\nexport type DecodedAttributes = {\r\n  [K: number]: {\r\n    name: LocalizedStringWithDefault\r\n    value: LocalizedStringOrBoxedNumberWithDefault | Array<LocalizedStringOrBoxedNumberWithDefault>\r\n    type: AttributeType\r\n    isArray: boolean\r\n    rawValue: EncodedTokenAttributeValue | string | Array<string>\r\n    isEnum: boolean\r\n  }\r\n}\r\n\r\nexport type DecodedInfixOrUrlOrCidAndHash = InfixOrUrlOrCidAndHash & { fullUrl: string | null }\r\n\r\nexport interface UniqueTokenDecoded extends IToken<DecodedInfixOrUrlOrCidAndHash> {\r\n  tokenId: number\r\n  collectionId: number\r\n  owner: CrossAccountId\r\n  nestingParentToken?: {\r\n    collectionId: number\r\n    tokenId: number\r\n  }\r\n  attributes: DecodedAttributes\r\n}\r\n\r\nexport type DecodingImageLinkOptions = {\r\n  imageUrlTemplate?: UrlTemplateString\r\n  dummyImageFullUrl?: string\r\n}\r\n","export const getKeys = <T extends Object>(o: T) => Object.keys(o) as Array<keyof T>\r\nexport const getValues = <T extends Object>(o: T) => Object.values(o) as Array<T[keyof T]>\r\nexport const getEntries = <T extends Object>(o: T) => Object.entries(o) as Array<[keyof T, T[keyof T]]>\r\n\r\nexport type Writeable<T> = { -readonly [P in keyof T]: T[P] };\r\n\r\ntype EnumBaseType = Record<string,  number | string>\r\n\r\nexport const getEnumKeys = <T extends EnumBaseType>(en: T): Array<keyof T> => {\r\n  const arr = getValues(en)\r\n  return arr.slice(0, arr.length / 2) as any as Array<keyof T>\r\n}\r\nexport const getEnumValues = <T extends EnumBaseType>(en: T): Array<T[keyof T]> => {\r\n  const arr = getValues(en)\r\n  return arr.slice(arr.length / 2)\r\n}\r\n\r\ntype EnumReverse<T extends EnumBaseType> = {[K in T[keyof T]]: keyof T}\r\nexport const getReversedEnum = <T extends EnumBaseType>(en: T): EnumReverse<T> => {\r\n  const arr = getValues(en)\r\n  const result = {} as any\r\n  for (let i = 0; i < arr.length/2; i++) {\r\n    result[arr[i + arr.length/2]] = arr[i]\r\n  }\r\n  return result\r\n}\r\n\r\nexport const safeJSONParse = <T>(str: string): T | string => {\r\n  try {\r\n    return JSON.parse(str) as T\r\n  } catch {\r\n    return str\r\n  }\r\n}\r\n","export * from './common-validators'\r\nexport * from './collection-validators'\r\nexport * from './token-validators'\r\nexport * from './constants'\r\n","import {ISubmittableResult, SubmittableResult} from \"../types\";\r\n\r\nexport class ValidationError extends TypeError {\r\n  constructor(message: string) {\r\n    super(message)\r\n    this.name = 'ValidationError'\r\n  }\r\n}\r\n\r\nexport class ExtrinsicError extends Error {\r\n  txResult: ISubmittableResult\r\n\r\n  constructor(txResult: SubmittableResult, errMessage: string, label?: string) {\r\n    if (!label) {\r\n      const info = txResult.dispatchInfo?.toHuman()\r\n      label = `transaction ${info?.section}${info?.method}`\r\n    }\r\n    super(`Transaction failed: \"${errMessage}\"${label ? ' for' + label : ''}.`)\r\n    this.txResult = txResult\r\n  }\r\n}\r\n","export class Semver {\r\n  protected _major: number\r\n  protected _minor: number\r\n  protected _patch: number\r\n\r\n  constructor(semver: [number, number, number]) {\r\n    this._major = semver[0]\r\n    this._minor = semver[1]\r\n    this._patch = semver[2]\r\n  }\r\n\r\n  get major() {\r\n    return this._major\r\n  }\r\n\r\n  get minor() {\r\n    return this._minor\r\n  }\r\n\r\n  get patch() {\r\n    return this._patch\r\n  }\r\n\r\n  toString() {\r\n    return `${this.major}.${this.minor}.${this.patch}`\r\n  }\r\n\r\n  private static parseToArray(version: string): null | [number, number, number] {\r\n    if (typeof version !== \"string\") return null\r\n\r\n    const [main] = version.split('+')[0].split('-').map(i => i.split('.'))\r\n\r\n    const major = parseInt(main[0])\r\n\r\n    if (isNaN(major)) return null\r\n\r\n    const minor = parseInt(main[1])\r\n    const patch = parseInt(main[2])\r\n    return [major, isNaN(minor) ? 0 : minor, isNaN(patch) ? 0 : patch]\r\n  }\r\n\r\n  static fromString(version: string): Semver {\r\n    const parsed = Semver.parseToArray(version)\r\n    if (!parsed) throw new Error(`Semver.fromString: wrong version string value: \"${version}\"`)\r\n    return new Semver(parsed)\r\n  }\r\n\r\n  static isValid(version: string): boolean {\r\n    return typeof version === 'string' && Semver.parseToArray(version) !== null\r\n  }\r\n\r\n  isGteThan(version: string) {\r\n    const parsed = Semver.parseToArray(version)\r\n    if (!parsed) return false\r\n\r\n    if (this._major > parsed[0]) return true\r\n    if (this._major < parsed[0]) return false\r\n\r\n    if (this._minor > parsed[1]) return true\r\n    if (this._minor < parsed[1]) return false\r\n\r\n    return this._patch >= parsed[2]\r\n  }\r\n\r\n  isLessThan(version: string) {\r\n    const parsed = Semver.parseToArray(version)\r\n    if (!parsed) return false\r\n\r\n    if (this._major < parsed[0]) return true\r\n    if (this._major > parsed[0]) return false\r\n\r\n    if (this._minor < parsed[1]) return true\r\n    if (this._minor > parsed[1]) return false\r\n\r\n    return this._patch < parsed[2]\r\n  }\r\n\r\n  isEqual(version: string) {\r\n    const parsed = Semver.parseToArray(version)\r\n    if (!parsed) return false\r\n\r\n    return this._major === parsed[0] && this._minor === parsed[1] && this._patch === parsed[2]\r\n  }\r\n}\r\n","export const RGB_REGEX = /^#[A-Fa-f0-9]{6}$/\r\n\r\nexport const RGBA_REGEX = /^#[A-Fa-f0-9]{8}$/\r\n\r\nexport const LANG_REGEX = /^[a-z]{2}(-[A-Z]{2})?$/\r\n","import {ValidationError} from \"../../../utils/errors\";\r\nimport {TokenPropertyPermissionObject} from \"../../../substrate/extrinsics/unique/types\";\r\nimport {\r\n    BoxedNumberWithDefault,\r\n    InfixOrUrlOrCidAndHash,\r\n    LocalizedStringWithDefault,\r\n    URL_TEMPLATE_INFIX,\r\n    UrlTemplateString\r\n} from \"../../types\";\r\nimport {getKeys} from \"../../../tsUtils\";\r\nimport {Semver} from \"../../../utils/semver\";\r\nimport {LANG_REGEX} from \"./constants\";\r\n\r\nexport const isPlainObject = (obj: any, varName: string): obj is Object => {\r\n    if (typeof obj !== 'object')\r\n        throw new ValidationError(`${varName} is not an object, got ${typeof obj}: ${obj}`)\r\n    if (obj === null)\r\n        throw new ValidationError(`${varName} is a null, should be valid object`)\r\n    if (obj instanceof Map)\r\n        throw new ValidationError(`${varName} is a Map, should be plain object`)\r\n    if (obj instanceof Set)\r\n        throw new ValidationError(`${varName} is a Set, should be plain object`)\r\n    if (Array.isArray(obj))\r\n        throw new ValidationError(`${varName} is an array, should be plain object`)\r\n\r\n    return true\r\n}\r\n\r\nexport const validateNumber = (num: any, shouldBeInteger: boolean, varName: string): num is number => {\r\n    if (typeof num !== 'number' || isNaN(num)) {\r\n        throw new ValidationError(`${varName} is not a valid number, got ${num}`)\r\n    }\r\n    if (shouldBeInteger && num !== Math.round(num)) {\r\n        throw new ValidationError(`${varName} is not an integer number, got ${num}`)\r\n    }\r\n    return true\r\n}\r\n\r\nexport const validateAttributeKey = (num: string | number | symbol, varName: string): boolean => {\r\n    let isOk = false\r\n\r\n    if (typeof num === 'number') {\r\n        isOk = num === Math.round(num);\r\n    } else if (typeof num === 'string') {\r\n        const parsed = parseFloat(num);\r\n\r\n        isOk = !isNaN(parsed) && parsed === Math.round(parsed);\r\n    }\r\n\r\n    if (!isOk) {\r\n        throw new ValidationError(`${varName}[\"${String(num)}\"] is not a valid number key, got ${String(num)}`)\r\n    }\r\n\r\n    return true\r\n}\r\n\r\nconst validateLangCode = (key: string | number | symbol, varName: string): boolean => {\r\n    if (typeof key !== 'string') {\r\n        throw new ValidationError(`${varName}: key ${String(key)} should be a string`)\r\n    }\r\n    if (!key.match(LANG_REGEX)) {\r\n        throw new ValidationError(`${varName} should be a valid Language code string (like 'co' or 'ca-ES'), got ${key}`)\r\n    }\r\n\r\n    return true\r\n}\r\n\r\nexport const validateURL = (url: string, varName: string): boolean => {\r\n    if (typeof url !== 'string') {\r\n        throw new ValidationError(`${varName} should be a string`)\r\n    }\r\n\r\n    try {\r\n        new URL(url)\r\n        return true\r\n    } catch (err) {\r\n        throw new ValidationError(`${varName} should be a valid URL, got ${url}`)\r\n    }\r\n}\r\n\r\nexport const validateAndParseSemverString = (str: string, varName: string): Semver => {\r\n    if (!Semver.isValid(str))\r\n        throw new ValidationError(`${varName} is not a valid semver string (passed ${str})`)\r\n\r\n    return Semver.fromString(str)\r\n}\r\n\r\nexport const validateLocalizedStringWithDefault = (dict: any, canHaveLocalization: boolean, varName: string): dict is LocalizedStringWithDefault => {\r\n    isPlainObject(dict, varName)\r\n\r\n    const keys = getKeys(dict)\r\n\r\n    if (keys.length === 0) {\r\n        throw new ValidationError(`${varName} is an empty object, should have at least one key`)\r\n    }\r\n\r\n    if (!dict.hasOwnProperty('_')) {\r\n        throw new ValidationError(`${varName} is doesn't contain field \"_\"`)\r\n    }\r\n\r\n    if (typeof dict._ !== 'string') {\r\n        throw new ValidationError(`${varName}._ is not a string`)\r\n    }\r\n\r\n    if (!canHaveLocalization && keys.length !== 1) {\r\n        throw new ValidationError(`${varName} cannot have localization strings, got object with keys [\"${keys.join('\", \"')}\"]`)\r\n    }\r\n\r\n    for (const key in dict) {\r\n        if (key === '_') continue\r\n\r\n        validateLangCode(key, `${varName}[\"${key}\"]`)\r\n        if (typeof dict[key] !== 'string') {\r\n            throw new ValidationError(`${varName}[\"${key}\"] should be a string, got ${typeof key}: ${key}`)\r\n        }\r\n    }\r\n\r\n    return true\r\n}\r\n\r\nexport const validateBoxedNumberWithDefault = (dict: BoxedNumberWithDefault, shouldBeInteger: boolean, varName: string): dict is BoxedNumberWithDefault => {\r\n    isPlainObject(dict, varName)\r\n\r\n    if (getKeys(dict).length === 0) {\r\n        throw new ValidationError(`${varName} is an empty object, should have at least one key`)\r\n    }\r\n\r\n    if (!dict.hasOwnProperty('_')) {\r\n        throw new ValidationError(`${varName} is doesn't contain field \"_\"`)\r\n    }\r\n\r\n    validateNumber(dict._, shouldBeInteger, `${varName}._`)\r\n\r\n    for (const key in dict) {\r\n        if (key === '_') continue\r\n    }\r\n\r\n    return true\r\n}\r\n\r\nexport const validateUrlTemplateString = (str: any, varName: string): str is UrlTemplateString => {\r\n    const prefix = `TemplateUrlString is not valid, ${varName}`\r\n    if (typeof str !== 'string')\r\n        throw new ValidationError(`${prefix} is not a string, got ${str}`)\r\n    if (str.indexOf(URL_TEMPLATE_INFIX) < 0)\r\n        throw new ValidationError(`${prefix} doesn't contain \"${URL_TEMPLATE_INFIX}\", got ${str}`)\r\n    return true\r\n}\r\n\r\nexport const validateUrlWithHashObject = (obj: any, varName: string): obj is InfixOrUrlOrCidAndHash => {\r\n    isPlainObject(obj, varName)\r\n\r\n    const keysAmount = ['urlInfix', 'url', 'ipfsCid']\r\n        .map(field => Number(typeof obj[field] === 'string'))\r\n        .reduce((prev, curr) => {\r\n            return prev + curr\r\n        }, 0)\r\n\r\n    if (keysAmount !== 1) {\r\n        throw new ValidationError(`${varName} should have one and only one of \"urlInfix\" or \"url\" or \"ipfsCid\" string fields, got ${JSON.stringify(obj)}`)\r\n    }\r\n\r\n    if (typeof obj.url === 'string') {\r\n        validateURL(obj.url, `${varName}.url`)\r\n    }\r\n\r\n    if (obj.hasOwnProperty('hash'))\r\n        validateFieldByType(obj, 'hash', 'string', false, varName)\r\n\r\n    return true\r\n}\r\n\r\nexport const validateFieldByType = <T extends object>(obj: T, key: keyof T, type: string, optional: boolean, varName: string): boolean => {\r\n    isPlainObject(obj, varName)\r\n\r\n    if (optional) {\r\n        if (obj.hasOwnProperty(key) && typeof obj[key] !== type) {\r\n            throw new ValidationError(`${varName}.${String(key)} is passed and not a ${type}, got ${typeof obj[key]}: ${obj[key]}`)\r\n        }\r\n    } else {\r\n        if (!obj.hasOwnProperty(key)) {\r\n            throw new ValidationError(`${varName}.${String(key)} not found in ${varName}`)\r\n        }\r\n        if (typeof obj[key] !== type) {\r\n            throw new ValidationError(`${varName}.${String(key)} should be a ${type}, got ${typeof obj[key]}: ${obj[key]}`)\r\n        }\r\n    }\r\n    return true\r\n}\r\n\r\nexport const validateSingleTokenPropertyPermission = (tpp: any, varName: string): tpp is TokenPropertyPermissionObject => {\r\n    isPlainObject(tpp, varName)\r\n    validateFieldByType(tpp, 'key', 'string', false, varName)\r\n\r\n    const permissionVarName = `${varName}.permission`\r\n\r\n    isPlainObject(tpp.permission, permissionVarName)\r\n\r\n    validateFieldByType(tpp.permission, 'mutable', 'boolean', false, permissionVarName)\r\n    validateFieldByType(tpp.permission, 'collectionAdmin', 'boolean', false, permissionVarName)\r\n    validateFieldByType(tpp.permission, 'tokenOwner', 'boolean', false, permissionVarName)\r\n\r\n    return true\r\n}\r\n\r\nexport const checkSafeFactory = <T extends (...args: any) => any>(fn: T) => {\r\n    const returnFn = (...params: Parameters<T>) => {\r\n        try {\r\n            return fn(...params as any)\r\n        } catch {\r\n            return false as ReturnType<T>\r\n        }\r\n    }\r\n    return returnFn as T\r\n}\r\n\r\nexport const validateUrlTemplateStringSafe = checkSafeFactory(validateUrlTemplateString)\r\n\r\nexport const validateURLSafe = checkSafeFactory(validateURL)\r\n\r\nexport const validateLocalizedStringWithDefaultSafe = checkSafeFactory(validateLocalizedStringWithDefault)","import {\r\n    AttributeSchema,\r\n    AttributeType,\r\n    AttributeTypeValues,\r\n    COLLECTION_SCHEMA_NAME,\r\n    CollectionAttributesSchema,\r\n    IntegerAttributeTypes,\r\n    NumberAttributeTypes,\r\n    StringAttributeTypes,\r\n    UniqueCollectionSchemaToCreate\r\n} from \"../../types\";\r\nimport {ValidationError} from \"../../../utils/errors\";\r\nimport {CollectionTokenPropertyPermissions} from \"../../../substrate/extrinsics/unique/types\";\r\nimport {\r\n    validateAndParseSemverString,\r\n    validateBoxedNumberWithDefault,\r\n    validateFieldByType,\r\n    validateLocalizedStringWithDefault,\r\n    validateSingleTokenPropertyPermission,\r\n    validateUrlTemplateString,\r\n    validateUrlWithHashObject,\r\n    isPlainObject,\r\n    validateNumber,\r\n    validateAttributeKey,\r\n} from \"./common-validators\";\r\nimport {RGB_REGEX, RGBA_REGEX} from \"./constants\";\r\n\r\nexport const validateValueVsAttributeType = (value: any, type: AttributeType, varName: string): value is typeof type => {\r\n    isPlainObject(value, varName)\r\n\r\n    if (NumberAttributeTypes.includes(type)) {\r\n        const shouldBeInteger = IntegerAttributeTypes.includes(type)\r\n        validateBoxedNumberWithDefault(value, shouldBeInteger, varName)\r\n        if (type === AttributeType.boolean && ![0, 1].includes(value._)) {\r\n            throw new ValidationError(`${varName}: should be a boolean integer: 0 or 1, got ${value._}`)\r\n        }\r\n\r\n        return true\r\n    }\r\n\r\n    if (StringAttributeTypes.includes(type)) {\r\n        const canHaveLocalization = type === AttributeType.string\r\n        validateLocalizedStringWithDefault(value, canHaveLocalization, varName)\r\n\r\n        if (type === AttributeType.isoDate && isNaN(new Date(value._).valueOf())) {\r\n            throw new ValidationError(`${varName}: should be a valid ISO Date (YYYY-MM-DD), got ${value._}`)\r\n        }\r\n\r\n        if (type === AttributeType.time && isNaN(new Date('1970-01-01T' + value._).valueOf())) {\r\n            throw new ValidationError(`${varName}: should be a valid time in (hh:mm or hh:mm:ss), got ${value._}`)\r\n        }\r\n\r\n        if (type === AttributeType.colorRgba && (!value._.match(RGB_REGEX) && !value._.match(RGBA_REGEX))) {\r\n            throw new ValidationError(`${varName}: should be a valid rgb or rgba color (like \"#ff00ff00\"), got ${value._}`)\r\n        }\r\n\r\n        return true\r\n    }\r\n\r\n    throw new ValidationError(`${varName}: unknown attribute type: ${type}`)\r\n}\r\n\r\nexport const validateAttributesSchemaSingleAttribute = (attr: AttributeSchema, varName: string): attr is AttributeSchema => {\r\n    isPlainObject(attr, varName)\r\n\r\n    validateLocalizedStringWithDefault(attr.name, true, `${varName}.name`)\r\n\r\n    if (attr.hasOwnProperty('optional') && typeof attr.optional !== 'boolean')\r\n        throw new ValidationError(`${varName}.optional should be boolean when passed, got ${typeof attr.optional}: ${attr.optional}`)\r\n\r\n    if (attr.hasOwnProperty('isArray') && typeof attr.isArray !== 'boolean') {\r\n        throw new ValidationError(`${varName}.optional should be boolean when passed, got ${typeof attr.optional}: ${attr.optional}`)\r\n    }\r\n\r\n    if (!AttributeTypeValues.includes(attr.type))\r\n        throw new ValidationError(`${varName}.type should be a valid attribute type, got ${typeof attr.type}: ${attr.type}`)\r\n\r\n    if (attr.hasOwnProperty('enumValues')) {\r\n        isPlainObject(attr.enumValues, `${varName}.enumValues`)\r\n\r\n        for (const key in attr.enumValues) {\r\n            const localVarName = `${varName}.enumValues[${key}]`\r\n            const intKey = parseInt(key)\r\n            validateNumber(intKey, true, localVarName)\r\n\r\n            validateValueVsAttributeType(\r\n                attr.enumValues[intKey],\r\n                attr.type,\r\n                localVarName\r\n            )\r\n        }\r\n    }\r\n\r\n    return true\r\n}\r\n\r\nexport const validateCollectionAttributesSchema = (attributes: any, varName: string): attributes is CollectionAttributesSchema => {\r\n    isPlainObject(attributes, varName)\r\n    for (const key in attributes) {\r\n        validateAttributeKey(key, varName)\r\n        validateAttributesSchemaSingleAttribute(attributes[key], `${varName}[\"${key}\"]`)\r\n    }\r\n\r\n    return true\r\n}\r\n\r\nexport const validateUniqueCollectionSchema = <C extends UniqueCollectionSchemaToCreate>(schema: any): schema is C => {\r\n    isPlainObject(schema, 'Passed collection schema')\r\n\r\n    if (schema.schemaName !== COLLECTION_SCHEMA_NAME.unique)\r\n        throw new ValidationError(`schemaName is not valid (passed ${schema.schemaName})`)\r\n\r\n    const schemaVersion = validateAndParseSemverString(schema.schemaVersion, 'schemaVersion')\r\n    if (!schemaVersion.isEqual('1.0.0')) {\r\n        throw new ValidationError(`collection schema has unsupported type: ${schemaVersion.toString()}`)\r\n    }\r\n\r\n    validateUrlWithHashObject(schema.coverPicture, 'coverPicture')\r\n\r\n    if (schema.hasOwnProperty('coverPicturePreview')) {\r\n        validateUrlWithHashObject(schema.coverPicturePreview, 'coverPicturePreview')\r\n    }\r\n\r\n    if (!schema.attributesSchemaVersion !== !schema.attributesSchema) {\r\n        throw new ValidationError(`\"attributesSchemaVersion\" and \"attributesSchema\" should both be filled or both empty`)\r\n    }\r\n\r\n    if (schema.attributesSchemaVersion && schema.attributesSchema) {\r\n        const attributesSchemaVersion = validateAndParseSemverString(\r\n            schema.attributesSchemaVersion,\r\n            'attributesSchemaVersion',\r\n        )\r\n\r\n        if (!attributesSchemaVersion.isEqual('1.0.0')) {\r\n            throw new ValidationError(`collection attributes schema has unsupported type: ${attributesSchemaVersion.toString()}`)\r\n        }\r\n\r\n        validateCollectionAttributesSchema(schema.attributesSchema, 'attributesSchema')\r\n    }\r\n\r\n    isPlainObject(schema.image, 'image')\r\n    validateUrlTemplateString(schema.image.urlTemplate, 'image')\r\n\r\n    if (schema.hasOwnProperty('imagePreview')) {\r\n        isPlainObject(schema.video, 'video')\r\n        validateUrlTemplateString(schema.video.urlTemplate, 'video')\r\n    }\r\n\r\n    if (schema.hasOwnProperty('video')) {\r\n        isPlainObject(schema.video, 'video')\r\n        validateUrlTemplateString(schema.video.urlTemplate, 'video')\r\n    }\r\n\r\n    if (schema.hasOwnProperty('audio')) {\r\n        isPlainObject(schema.audio, 'audio')\r\n        validateUrlTemplateString(schema.audio.urlTemplate, 'audio')\r\n\r\n        validateFieldByType(schema.audio, 'format', 'string', false, 'audio')\r\n        validateFieldByType(schema.audio, 'isLossless', 'boolean', true, 'audio')\r\n    }\r\n\r\n    if (schema.hasOwnProperty('spatialObject')) {\r\n        isPlainObject(schema.spatialObject, 'spatialObject')\r\n        validateUrlTemplateString(schema.spatialObject.urlTemplate, 'spatialObject')\r\n\r\n        validateFieldByType(schema.spatialObject, 'format', 'string', false, 'spatialObject')\r\n    }\r\n\r\n    return true\r\n}\r\n\r\nexport const validateCollectionTokenPropertyPermissions = (tpps: any, varName: string = 'tokenPropertyPermissions'): tpps is CollectionTokenPropertyPermissions => {\r\n    if (!Array.isArray(tpps))\r\n        throw new ValidationError(`${varName} should be an array, got ${typeof tpps}: ${tpps}`)\r\n\r\n    tpps.forEach((tpp, index) => {\r\n        validateSingleTokenPropertyPermission(tpp, `${varName}[${index}]`)\r\n    })\r\n\r\n    return true\r\n}","import {\r\n    AttributeSchema,\r\n    COLLECTION_SCHEMA_NAME,\r\n    UniqueCollectionSchemaDecoded,\r\n    UniqueCollectionSchemaToCreate\r\n} from \"../../types\";\r\nimport {getKeys} from \"../../../tsUtils\";\r\nimport {ValidationError} from \"../../../utils/errors\";\r\nimport {validateValueVsAttributeType} from \"./collection-validators\";\r\nimport {\r\n    validateAndParseSemverString,\r\n    validateLocalizedStringWithDefault,\r\n    validateUrlWithHashObject,\r\n    validateNumber,\r\n    isPlainObject,\r\n    validateAttributeKey,\r\n} from \"./common-validators\";\r\n\r\nconst validateAttributeEnumKey = (schema: AttributeSchema, num: number, varName: string) => {\r\n    validateNumber(num, true, varName)\r\n    const enumKeys = getKeys(schema.enumValues || {}).map(n => parseInt(n as any as string))\r\n    if (!enumKeys.includes(num)) {\r\n        throw new ValidationError(`${varName} value (${num}) not found in the attribute schema enum keys: [${enumKeys.join()}]`)\r\n    }\r\n}\r\nexport const validateUniqueToken = <T, C extends UniqueCollectionSchemaToCreate | UniqueCollectionSchemaDecoded>(token: any, collectionSchema: C): token is T => {\r\n    if (collectionSchema.schemaName !== COLLECTION_SCHEMA_NAME.unique) {\r\n        throw new ValidationError(`schemaName is not \"unique\" (passed ${collectionSchema.schemaName})`)\r\n    }\r\n    if (token.hasOwnProperty('name')) {\r\n        validateLocalizedStringWithDefault(token.name, true, 'token.name')\r\n    }\r\n    if (token.hasOwnProperty('description')) {\r\n        validateLocalizedStringWithDefault(token.description, true, 'token.description')\r\n    }\r\n\r\n    validateUrlWithHashObject(token.image, 'token.image')\r\n\r\n    if (token.hasOwnProperty('imagePreview')) {\r\n        validateUrlWithHashObject(token.imagePreview, 'token.imagePreview')\r\n    }\r\n\r\n    const schemaVersion = validateAndParseSemverString(collectionSchema.schemaVersion, 'collectionSchema.schemaVersion')\r\n\r\n    if (token.encodedAttributes && collectionSchema.attributesSchema) {\r\n        isPlainObject(token.encodedAttributes, 'token.encodedAttributes')\r\n\r\n        for (let key in collectionSchema.attributesSchema) {\r\n            const schema = collectionSchema.attributesSchema[key]\r\n\r\n            validateAttributeKey(key, 'token.encodedAttributes')\r\n            const varName = `token.encodedAttributes.${key}`\r\n\r\n            const attr = token.encodedAttributes[key]\r\n\r\n            if (!token.encodedAttributes.hasOwnProperty(key)) {\r\n                if (schema.optional) {\r\n                    continue\r\n                } else {\r\n                    throw new ValidationError(`${varName} should be provided, it's not optional attribute`)\r\n                }\r\n            }\r\n\r\n            if (schema.isArray && !Array.isArray(attr)) {\r\n                throw new ValidationError(`${varName} is not array, while schema requires an array`)\r\n            }\r\n            if (!schema.isArray && Array.isArray(attr)) {\r\n                throw new ValidationError(`${varName} is an array, while schema requires to be not an array`)\r\n            }\r\n\r\n            const attrs = schema.isArray ? attr : [attr]\r\n\r\n            if (schema.enumValues) {\r\n                attrs.forEach((num: any, index: number) => {\r\n                    validateAttributeEnumKey(schema, num, `${varName}[${index}]`)\r\n                })\r\n            } else {\r\n                attrs.forEach((attrElem: any, index: number) => {\r\n                    validateValueVsAttributeType(attrElem, schema.type, `${varName}[${index}]`)\r\n                })\r\n            }\r\n        }\r\n    }\r\n\r\n    if (collectionSchema.hasOwnProperty('video') && token.hasOwnProperty('video')) {\r\n        validateUrlWithHashObject(token.video, 'token.video')\r\n    }\r\n\r\n    if (collectionSchema.hasOwnProperty('audio') && token.hasOwnProperty('audio')) {\r\n        validateUrlWithHashObject(token.audio, 'token.audio')\r\n    }\r\n\r\n    if (collectionSchema.hasOwnProperty('spatialObject') && token.hasOwnProperty('spatialObject')) {\r\n        validateUrlWithHashObject(token.spatialObject, 'token.spatialObject')\r\n    }\r\n\r\n    return true\r\n}","import {UniqueCollectionSchemaDecoded, UniqueCollectionSchemaToCreate} from '../types'\r\nimport {\r\n  CollectionProperties,\r\n  CollectionTokenPropertyPermissions,\r\n  TokenPropertyPermissionObject\r\n} from '../../substrate/extrinsics/unique/types'\r\nimport {converters2Layers, decodeTokenUrlOrInfixOrCidWithHashField, DecodingResult} from '../schemaUtils'\r\nimport {getKeys} from '../../tsUtils'\r\nimport {validateCollectionTokenPropertyPermissions, validateUniqueCollectionSchema} from './validators'\r\nimport {PropertiesArray} from '../../types'\r\n\r\nexport const encodeCollectionSchemaToProperties = (schema: UniqueCollectionSchemaToCreate): CollectionProperties => {\r\n  validateUniqueCollectionSchema(schema)\r\n  return converters2Layers.objectToProperties(schema)\r\n}\r\n\r\nexport const unpackCollectionSchemaFromProperties = (properties: PropertiesArray): any => {\r\n  return converters2Layers.propertiesToObject(properties) as any\r\n}\r\n\r\nexport const decodeUniqueCollectionFromProperties = async (collectionId: number, properties: CollectionProperties): Promise<DecodingResult<UniqueCollectionSchemaDecoded>> => {\r\n  try {\r\n    const unpackedSchema: UniqueCollectionSchemaDecoded = unpackCollectionSchemaFromProperties(properties)\r\n    validateUniqueCollectionSchema(unpackedSchema)\r\n    unpackedSchema.collectionId = collectionId as number\r\n\r\n    if (unpackedSchema.coverPicture) {\r\n      unpackedSchema.coverPicture = decodeTokenUrlOrInfixOrCidWithHashField(unpackedSchema.coverPicture, unpackedSchema.image)\r\n    }\r\n    if (unpackedSchema.coverPicturePreview) {\r\n      unpackedSchema.coverPicturePreview = decodeTokenUrlOrInfixOrCidWithHashField(unpackedSchema.coverPicturePreview, unpackedSchema.image)\r\n    }\r\n    return {\r\n      result: unpackedSchema,\r\n      error: null,\r\n    }\r\n  } catch (e) {\r\n    return {\r\n      result: null,\r\n      error: e as Error,\r\n    }\r\n  }\r\n}\r\n\r\nconst generateDefaultTPPObjectForKey = (key: string): TokenPropertyPermissionObject => ({\r\n  key,\r\n  permission: {mutable: false, collectionAdmin: true, tokenOwner: false}\r\n})\r\n\r\nconst generateDefaultTPPsForInfixOrUrlOrCidAndHashObject = (permissions: CollectionTokenPropertyPermissions, prefix: string) => {\r\n  permissions.push(generateDefaultTPPObjectForKey(`${prefix}.i`)) // url infix\r\n  permissions.push(generateDefaultTPPObjectForKey(`${prefix}.c`)) // ipfs cid\r\n  permissions.push(generateDefaultTPPObjectForKey(`${prefix}.u`)) // url\r\n  permissions.push(generateDefaultTPPObjectForKey(`${prefix}.h`)) // hash\r\n}\r\n\r\nexport interface ICollectionSchemaToTokenPropertyPermissionsOptions {\r\n  overwriteTPPs?: CollectionTokenPropertyPermissions\r\n}\r\n\r\nexport const generateTokenPropertyPermissionsFromCollectionSchema = (schema: UniqueCollectionSchemaToCreate, options?: ICollectionSchemaToTokenPropertyPermissionsOptions): CollectionTokenPropertyPermissions => {\r\n  const permissions: CollectionTokenPropertyPermissions = [\r\n    generateDefaultTPPObjectForKey('n'), // name\r\n    generateDefaultTPPObjectForKey('d'), // description\r\n  ]\r\n\r\n  generateDefaultTPPsForInfixOrUrlOrCidAndHashObject(permissions, 'i')     // image url, urlInfix, ipfsCid and hash (i.u, i.i, i.c, i.h)\r\n\r\n  if (schema.hasOwnProperty('imagePreview')) {\r\n    generateDefaultTPPsForInfixOrUrlOrCidAndHashObject(permissions, 'p')    // imagePreview url, urlInfix, ipfsCid and hash (p.u, p.i, p.c, p.h)\r\n  }\r\n\r\n  if (schema.hasOwnProperty('video')) {\r\n    generateDefaultTPPsForInfixOrUrlOrCidAndHashObject(permissions, 'v')    // video url, urlInfix, ipfsCid and hash (v.u, v.i, v.c, v.h)\r\n  }\r\n\r\n  if (schema.hasOwnProperty('audio')) {\r\n    generateDefaultTPPsForInfixOrUrlOrCidAndHashObject(permissions, 'au')   // audio url, urlInfix, ipfsCid and hash (au.u, au.i, au.c, au.h)\r\n  }\r\n\r\n  if (schema.hasOwnProperty('spatialObject')) {\r\n    generateDefaultTPPsForInfixOrUrlOrCidAndHashObject(permissions, 'so')   // spatialObject url, urlInfix, ipfsCid and hash (so.u, so.i, so.c, so.h)\r\n  }\r\n\r\n  if (schema.attributesSchema) {\r\n    getKeys(schema.attributesSchema).forEach(key => {\r\n      permissions.push(generateDefaultTPPObjectForKey(`a.${key}`))\r\n    })\r\n  }\r\n\r\n  if (options?.overwriteTPPs) {\r\n    const {overwriteTPPs} = options\r\n\r\n    if (!validateCollectionTokenPropertyPermissions(overwriteTPPs)) {\r\n      throw new Error(`overwriteTPPs are not valid`)\r\n    }\r\n\r\n    for (const tpp of overwriteTPPs) {\r\n      const index = permissions.findIndex(permission => permission.key === tpp.key)\r\n      if (index < 0) {\r\n        permissions.push(tpp)\r\n      } else {\r\n        permissions[index] = tpp\r\n      }\r\n    }\r\n  }\r\n\r\n  return permissions\r\n}\r\n","import {safeJSONParse} from \"../../tsUtils\";\n\nexport const vec2str = (arr: Array<number | string>) => {\n  return arr\n    .map(x => String.fromCharCode(typeof x === 'number' ? x : parseInt(x, 10)))\n    .join('')\n}\n\nexport const str2vec = (str: string) => {\n  if (typeof str !== 'string') {\n    return str\n  }\n  return str.split('').map(x => x.charCodeAt(0))\n}\n\nexport const strToU8a = (str: string): Uint8Array => new Uint8Array(str2vec(str))\n\nexport const hexToU8a = (hexString: string): Uint8Array =>\n  Uint8Array.from(((hexString.startsWith('0x') ? hexString.slice(2) : hexString).match(/.{1,2}/g) || []).map((byte) => parseInt(byte, 16)))\n\nexport const u8aToHex = (bytes: number[] | Uint8Array): string => {\n  const arr = bytes instanceof Uint8Array ? Array.from(bytes) : bytes\n  return '0x' + arr.reduce((str, byte) => str + byte.toString(16).padStart(2, '0'), '');\n}\n\nexport const hexStringToString = (hexString: string): string =>\n  ((hexString.startsWith('0x') ? hexString.slice(2) : hexString).match(/.{1,2}/g) || [])\n    .map(el => String.fromCharCode(parseInt(el, 16)))\n    .join('')\n\n\nexport const safeJsonParseStringOrHexString = <T = any>(stringOrHexString: string): T | string => {\n  try {\n    return JSON.parse(stringOrHexString) as T\n  } catch {\n    return safeJSONParse<T>(hexStringToString(stringOrHexString))\n  }\n}\n\nexport const parseAndCheckTheNumberIsDWORD = (n: number | string) => {\n  const num: number = (typeof n === 'string') ? parseInt(n, 10) : n\n\n  if (isNaN(num)) throw new Error(`Passed number is NaN: ${n}`)\n  if (num < 0) throw new Error(`Passed number is less than 0: ${n}`)\n  if (num > 0xFFFFFFFF) throw new Error(`Passed number is more than 2**32: ${n}`)\n\n  return num\n}\n\nexport const DWORDHexString = {\n  fromNumber: (n: number): string => {\n    return parseAndCheckTheNumberIsDWORD(n).toString(16).padStart(8, '0')\n  },\n  toNumber: (s: string): number => {\n    const num: number = parseInt(s, 16)\n\n    if (isNaN(num)) throw new Error(`Passed string is not hexadecimal: ${s}`)\n\n    return num\n  }\n}\n","import {PropertiesArray} from '../types'\n\nimport {\n  DecodedInfixOrUrlOrCidAndHash,\n  InfixOrUrlOrCidAndHash,\n  URL_TEMPLATE_INFIX,\n  UrlTemplateString\n} from \"./types\";\nimport {safeJsonParseStringOrHexString} from \"../utils/address/stringUtils\";\n\nconst convert2LayerObjectToProperties = <T extends object>(obj: T, separator: string): PropertiesArray => {\n  if (typeof obj !== \"object\" || obj === null) {\n    throw new Error(`Object is not valid: ${obj}`)\n  }\n\n  const collectionProperties: PropertiesArray = []\n\n  for (let key in obj) {\n    const value = obj[key]\n    if (\n      typeof value === 'object' &&\n      !(value === null || value instanceof Map || value instanceof Set || Array.isArray(value))\n    ) {\n      for (let secondLevelKey in value) {\n        const secondLevelValue = value[secondLevelKey]\n        collectionProperties.push({\n          key: `${key}${separator}${secondLevelKey}`,\n          value: JSON.stringify(secondLevelValue)\n        })\n      }\n    } else {\n      collectionProperties.push({\n        key,\n        value: JSON.stringify(value)\n      })\n    }\n  }\n\n  return collectionProperties\n}\n\nexport const convertPropertyArrayTo2layerObject = <T extends object>(properties: PropertiesArray, separator: string): T => {\n  const obj: any = {}\n\n  for (let {key, value} of properties) {\n    const keyParts = key.split(separator)\n    const length = keyParts.length\n    if (length === 1) {\n      obj[key] = safeJsonParseStringOrHexString(value)\n    } else {\n      const [key, innerKey] = keyParts\n      if (typeof obj[key] !== 'object') {\n        obj[key] = {}\n      }\n      obj[key][innerKey] = safeJsonParseStringOrHexString(value)\n    }\n  }\n  return obj as T\n}\n\nconst SEPARATOR = '.'\n\nexport const converters2Layers = {\n  objectToProperties: <T extends object>(obj: T): PropertiesArray => {\n    return convert2LayerObjectToProperties(obj, SEPARATOR)\n  },\n  propertiesToObject: <T extends object>(arr: PropertiesArray): T => {\n    return convertPropertyArrayTo2layerObject(arr, SEPARATOR)\n  }\n}\n\nexport const decodeTokenUrlOrInfixOrCidWithHashField =  <U extends {urlTemplate?: UrlTemplateString}>(obj: InfixOrUrlOrCidAndHash, urlTemplateObj: U | undefined): DecodedInfixOrUrlOrCidAndHash => {\n  const result: DecodedInfixOrUrlOrCidAndHash = {\n    ...obj,\n    fullUrl: null\n  }\n\n  if (typeof obj.url === 'string') {\n    result.fullUrl = obj.url\n    return result\n  }\n\n  const urlTemplate = urlTemplateObj?.urlTemplate\n\n  if (typeof urlTemplate !== 'string' || urlTemplate.indexOf(URL_TEMPLATE_INFIX) < 0) {\n    if (typeof obj.ipfsCid === 'string') {\n      result.fullUrl = `ipfs://${obj.ipfsCid}`\n    }\n  } else {\n    if (typeof obj.urlInfix === 'string') {\n      result.fullUrl = urlTemplate.replace(URL_TEMPLATE_INFIX, obj.urlInfix)\n    } else if (typeof obj.ipfsCid === 'string') {\n      result.fullUrl = urlTemplate.replace(URL_TEMPLATE_INFIX, obj.ipfsCid)\n    }\n  }\n\n  return result\n}\n\nexport type DecodingResult<T> = {\n  result: T\n  error: null\n} | {\n  result: null\n  error: Error\n}\n","import {HumanizedNftToken, PropertiesArray} from '../../types'\nimport {\n  DecodedAttributes,\n  EncodedTokenAttributes,\n  InfixOrUrlOrCidAndHash, LocalizedStringOrBoxedNumberWithDefault, LocalizedStringWithDefault,\n  UniqueCollectionSchemaDecoded,\n  UniqueCollectionSchemaToCreate,\n  UniqueTokenDecoded,\n  UniqueTokenToCreate\n} from '../types'\nimport {validateLocalizedStringWithDefaultSafe, validateUniqueToken} from './validators'\nimport {getEntries} from '../../tsUtils'\nimport {CollectionProperties} from '../../substrate/extrinsics/unique/types'\nimport {\n  decodeTokenUrlOrInfixOrCidWithHashField,\n  DecodingResult\n} from \"../schemaUtils\";\nimport {UniqueUtils} from \"../../utils\";\nimport {safeJsonParseStringOrHexString} from \"../../utils/address/stringUtils\";\n\nconst addUrlObjectToTokenProperties = (properties: PropertiesArray, prefix: string, source: InfixOrUrlOrCidAndHash) => {\n  if (typeof source.urlInfix === 'string') {\n    properties.push({key: `${prefix}.i`, value: source.urlInfix})\n  } else if (typeof source.ipfsCid === 'string') {\n    properties.push({key: `${prefix}.c`, value: source.ipfsCid})\n  } else if (typeof source.url === 'string') {\n    properties.push({key: `${prefix}.u`, value: source.url})\n  }\n\n  if (typeof source.hash === 'string') {\n    properties.push({key: `${prefix}.h`, value: source.hash})\n  }\n}\n\nconst addKeyToTokenProperties = (properties: PropertiesArray, key: string, value: string | number | object) => {\n  let strValue = JSON.stringify(value)\n\n  properties.push({\n    key,\n    value: strValue\n  })\n}\n\nexport const encodeTokenToProperties = (token: UniqueTokenToCreate, schema: UniqueCollectionSchemaToCreate | UniqueCollectionSchemaDecoded): PropertiesArray => {\n  validateUniqueToken(token, schema as UniqueCollectionSchemaToCreate)\n\n  const properties: PropertiesArray = []\n  if (token.name) addKeyToTokenProperties(properties, 'n', token.name)\n  if (token.description) addKeyToTokenProperties(properties, 'd', token.description)\n\n  if (token.encodedAttributes) {\n    for (const n in token.encodedAttributes) {\n      const value = token.encodedAttributes[n]\n      addKeyToTokenProperties(properties, `a.${n}`, value)\n    }\n  }\n\n  if (token.image) addUrlObjectToTokenProperties(properties, 'i', token.image)\n  if (schema.imagePreview && token.imagePreview) addUrlObjectToTokenProperties(properties, 'p', token.imagePreview)\n  if (schema.video && token.video) addUrlObjectToTokenProperties(properties, 'v', token.video)\n  if (schema.audio && token.audio) addUrlObjectToTokenProperties(properties, 'au', token.audio)\n  if (schema.spatialObject && token.spatialObject) addUrlObjectToTokenProperties(properties, 'so', token.spatialObject)\n\n  return properties\n}\n\nconst fillTokenFieldByKeyPrefix = <T extends UniqueTokenToCreate>(token: T, properties: PropertiesArray, prefix: string, tokenField: keyof T) => {\n  const keysMatchingPrefix = [`${prefix}.i`, `${prefix}.u`, `${prefix}.c`, `${prefix}.h`]\n  if (properties.some(({key}) => keysMatchingPrefix.includes(key))) token[tokenField] = {} as any\n\n  const field = token[tokenField] as any as InfixOrUrlOrCidAndHash\n\n  const urlInfixProperty = properties.find(({key}) => key === keysMatchingPrefix[0])\n  if (urlInfixProperty) field.urlInfix = urlInfixProperty.value\n\n  const urlProperty = properties.find(({key}) => key === keysMatchingPrefix[1])\n  if (urlProperty) field.url = urlProperty.value\n\n  const ipfsCidProperty = properties.find(({key}) => key === keysMatchingPrefix[2])\n  if (ipfsCidProperty) field.ipfsCid = ipfsCidProperty.value\n\n  const hashProperty = properties.find(({key}) => key === keysMatchingPrefix[3])\n  if (hashProperty) field.hash = hashProperty.value\n}\n\n\nexport const unpackEncodedTokenFromProperties = <T extends UniqueTokenToCreate>(properties: CollectionProperties, schema: UniqueCollectionSchemaToCreate | UniqueCollectionSchemaDecoded): T => {\n  const token: T = {} as T\n\n  const nameProperty = properties.find(({key}) => key === 'n')\n  if (nameProperty) {\n    const parsedName = safeJsonParseStringOrHexString<LocalizedStringWithDefault>(nameProperty.value)\n    if (typeof parsedName !== 'string') {\n      token.name = parsedName\n    }\n  }\n\n  const descriptionProperty = properties.find(({key}) => key === 'd')\n  if (descriptionProperty) {\n    const parsedDescription = safeJsonParseStringOrHexString<LocalizedStringWithDefault>(descriptionProperty.value)\n    if (typeof parsedDescription !== 'string') {\n      token.description = parsedDescription\n    }\n  }\n\n  fillTokenFieldByKeyPrefix(token, properties, 'i', 'image')\n  fillTokenFieldByKeyPrefix(token, properties, 'p', 'imagePreview')\n  fillTokenFieldByKeyPrefix(token, properties, 'v', 'video')\n  fillTokenFieldByKeyPrefix(token, properties, 'au', 'audio')\n  fillTokenFieldByKeyPrefix(token, properties, 'so', 'spatialObject')\n\n  const attributeProperties = properties.filter(({key}) => key.startsWith('a.'))\n  if (attributeProperties.length) {\n    const attrs = {} as EncodedTokenAttributes\n\n    for (const attrProp of attributeProperties) {\n      const {key, value} = attrProp\n      const parsed = safeJsonParseStringOrHexString<any>(value)\n      const attributeKey = parseInt(key.split('.')[1] || '')\n\n      if (!isNaN(attributeKey) && schema.attributesSchema?.hasOwnProperty(attributeKey)) {\n        attrs[attributeKey] = parsed\n      }\n    }\n\n    token.encodedAttributes = attrs\n  }\n\n  return token\n}\n\n\nexport const decodeTokenFromProperties = async (collectionId: number, tokenId: number, rawToken: HumanizedNftToken, schema: UniqueCollectionSchemaToCreate | UniqueCollectionSchemaDecoded): Promise<DecodingResult<UniqueTokenDecoded>> => {\n  const unpackedToken = unpackEncodedTokenFromProperties(rawToken.properties, schema)\n\n  console.log('UNPACKED TOKEN')\n  console.log(unpackedToken)\n\n  try {\n    validateUniqueToken(unpackedToken, schema)\n  } catch (e) {\n    return {\n      result: null,\n      error: e as Error,\n    }\n  }\n\n  const token: UniqueTokenDecoded = {\n    owner: rawToken.owner,\n    tokenId,\n    collectionId,\n    attributes: fullDecodeTokenAttributes(unpackedToken, schema),\n    image: decodeTokenUrlOrInfixOrCidWithHashField(unpackedToken.image, schema.image)\n  }\n  if (token.owner.Ethereum && UniqueUtils.Address.is.nestingAddress(token.owner.Ethereum)) {\n    token.nestingParentToken = UniqueUtils.Address.nesting.addressToIds(token.owner.Ethereum)\n  }\n\n  if (unpackedToken.name) token.name = unpackedToken.name\n  if (unpackedToken.description) token.description = unpackedToken.description\n\n  if (unpackedToken.imagePreview) {\n    token.imagePreview = decodeTokenUrlOrInfixOrCidWithHashField(unpackedToken.imagePreview, schema.imagePreview)\n  }\n  if (unpackedToken.video) {\n    token.video = decodeTokenUrlOrInfixOrCidWithHashField(unpackedToken.video, schema.video)\n  }\n  if (unpackedToken.audio) {\n    token.audio = decodeTokenUrlOrInfixOrCidWithHashField(unpackedToken.audio, schema.audio)\n  }\n  if (unpackedToken.spatialObject) {\n    token.spatialObject = decodeTokenUrlOrInfixOrCidWithHashField(unpackedToken.spatialObject, schema.spatialObject)\n  }\n\n  return {\n    result: token,\n    error: null,\n  }\n}\n\nexport const fullDecodeTokenAttributes = (token: UniqueTokenToCreate, collectionSchema: UniqueCollectionSchemaToCreate | UniqueCollectionSchemaDecoded): DecodedAttributes => {\n  const attributes: DecodedAttributes = {}\n  if (!token.encodedAttributes) return {}\n\n  const entries = getEntries(token.encodedAttributes)\n  for (const entry of entries) {\n    const [key, rawValue] = entry\n\n    const schema = collectionSchema.attributesSchema?.[key]\n    if (!schema) continue\n\n    let value: any = rawValue\n\n    if (schema.enumValues) {\n      if (schema.isArray && Array.isArray(rawValue)) {\n        value = rawValue\n          .map(v => typeof v === 'number' ? schema.enumValues?.[v] : null)\n          .filter(v => !!v)\n      } else {\n        if (typeof rawValue === 'number') {\n          value = schema.enumValues[rawValue]\n        }\n      }\n    }\n\n    attributes[key] = {\n      name: schema.name,\n      value: value as LocalizedStringOrBoxedNumberWithDefault | Array<LocalizedStringOrBoxedNumberWithDefault>,\n      isArray: schema.isArray || false,\n      type: schema.type,\n      rawValue,\n      isEnum: !!schema.enumValues,\n    }\n  }\n  return attributes\n}\n","import {COLLECTION_ADDRESS_PREFIX, NESTING_PREFIX} from './constants'\r\n\r\nimport {\r\n  addressToEvm, compareSubstrateAddresses,\r\n  decodeSubstrateAddress, encodeSubstrateAddress,\r\n  evmToAddress,\r\n  normalizeSubstrateAddress\r\n} from './substrate'\r\n\r\nimport {\r\n  collectionIdAndTokenIdToNestingAddress,\r\n  collectionIdToEthAddress, compareEthereumAddresses,\r\n  ethAddressToCollectionId,\r\n  nestingAddressToCollectionIdAndTokenId,\r\n  normalizeEthereumAddress\r\n} from './ethereum'\r\nimport {\r\n  CrossAccountId, CrossAccountIdUncapitalized,\r\n  EthAddressObj, EthAddressObjUncapitalized,\r\n  SubAddressObj, SubAddressObjUncapitalized,\r\n} from \"../../types\";\r\nimport {\r\n  substrateNormalizedWithMirrorIfEthereum,\r\n  addressToCrossAccountId, addressToCrossAccountIdNormalized,\r\n  guessAddressAndExtractItNormalized,\r\n  guessAddressAndExtractItNormalizedSafe\r\n} from \"./crossAccountId\";\r\n\r\nimport * as StringUtils from './stringUtils'\r\nimport * as algorithms from './imports'\r\nimport * as constants from './constants'\r\n\r\nexport {constants, algorithms, StringUtils}\r\n\r\nconst ETH_ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}$/\r\n\r\nexport type DecodeSubstrateAddressResult = {\r\n  u8a: Uint8Array,\r\n  hex: string,\r\n  bigint: bigint\r\n}\r\n\r\nexport const validate = {\r\n  substrateAddress: (address: string) => {\r\n    decodeSubstrateAddress(address)\r\n    return true\r\n  },\r\n  ethereumAddress: (address: string) => {\r\n    if (!is.ethereumAddress(address)) {\r\n      throw new Error(`address \"${address}\" is not valid ethereum address`)\r\n    }\r\n    return true\r\n  },\r\n  collectionAddress: (address: string) => {\r\n    if (!is.collectionAddress(address)) {\r\n      throw new Error(`address ${address} is not a collection address`)\r\n    }\r\n    return true\r\n  },\r\n  nestingAddress: (address: string) => {\r\n    if (!is.nestingAddress(address)) {\r\n      throw new Error(`address ${address} is not a nesting address`)\r\n    }\r\n    return true\r\n  },\r\n  collectionId: (collectionId: number) => {\r\n    if (!is.collectionId(collectionId)) {\r\n      throw new Error(`collectionId should be a number between 0 and 0xffffffff`)\r\n    }\r\n    return true\r\n  },\r\n  tokenId: (tokenId: number) => {\r\n    if (!is.tokenId(tokenId)) {\r\n      throw new Error(`collectionId should be a number between 0 and 0xffffffff`)\r\n    }\r\n    return true\r\n  },\r\n}\r\n\r\nexport const is = {\r\n  substrateAddress: (address: string): boolean => {\r\n    try {\r\n      decodeSubstrateAddress(address)\r\n      return true\r\n    } catch {\r\n      return false\r\n    }\r\n  },\r\n  ethereumAddress: (address: string): boolean => {\r\n    return typeof address === 'string' && address.length === 42 && !!address.match(ETH_ADDRESS_REGEX)\r\n  },\r\n\r\n  collectionAddress: (address: string): boolean => {\r\n    return is.ethereumAddress(address) && address.toLowerCase().startsWith(COLLECTION_ADDRESS_PREFIX)\r\n  },\r\n  nestingAddress: (address: string): boolean => {\r\n    return is.ethereumAddress(address) && address.toLowerCase().startsWith(NESTING_PREFIX)\r\n  },\r\n\r\n  collectionId: (collectionId: number): boolean => {\r\n    return !(typeof collectionId !== 'number' || isNaN(collectionId) || collectionId < 0 || collectionId > 0xffffffff)\r\n  },\r\n  tokenId: (tokenId: number): boolean => {\r\n    return !(typeof tokenId !== 'number' || isNaN(tokenId) || tokenId < 0 || tokenId > 0xffffffff)\r\n  },\r\n\r\n  crossAccountId(obj: any): obj is CrossAccountId {\r\n    return is.substrateAddressObject(obj) || is.ethereumAddressObject(obj)\r\n  },\r\n  crossAccountIdUncapitalized(obj: any): obj is CrossAccountIdUncapitalized {\r\n    return is.substrateAddressObjectUncapitalized(obj) || is.ethereumAddressObjectUncapitalized(obj)\r\n  },\r\n  substrateAddressObject(obj: any): obj is SubAddressObj {\r\n    return typeof obj === 'object' && typeof obj?.Substrate === 'string' && is.substrateAddress(obj.Substrate)\r\n  },\r\n  ethereumAddressObject(obj: any): obj is EthAddressObj {\r\n    return typeof obj === 'object' && typeof obj?.Ethereum === 'string' && is.ethereumAddress(obj.Ethereum)\r\n  },\r\n  substrateAddressObjectUncapitalized(obj: any): obj is SubAddressObjUncapitalized {\r\n    return typeof obj === 'object' && typeof obj?.substrate === 'string' && is.substrateAddress(obj.substrate)\r\n  },\r\n  ethereumAddressObjectUncapitalized(obj: any): obj is EthAddressObjUncapitalized {\r\n    return typeof obj === 'object' && typeof obj?.ethereum === 'string' && is.ethereumAddress(obj.ethereum)\r\n  },\r\n}\r\n\r\nexport const collection  = {\r\n  idToAddress: collectionIdToEthAddress,\r\n  addressToId: ethAddressToCollectionId,\r\n}\r\nexport const nesting = {\r\n  idsToAddress: collectionIdAndTokenIdToNestingAddress,\r\n  addressToIds: nestingAddressToCollectionIdAndTokenId,\r\n}\r\nexport const to = {\r\n  crossAccountId: addressToCrossAccountId,\r\n  crossAccountIdNormalized: addressToCrossAccountIdNormalized,\r\n  substrateNormalizedOrMirrorIfEthereum: substrateNormalizedWithMirrorIfEthereum,\r\n}\r\n\r\nexport const extract = {\r\n  normalizedAddressFromObject: guessAddressAndExtractItNormalized,\r\n  normalizedAddressFromObjectSafe: guessAddressAndExtractItNormalizedSafe,\r\n  crossAccountIdFromObject: (obj: any): CrossAccountId => {\r\n    return addressToCrossAccountId(guessAddressAndExtractItNormalized(obj))\r\n  },\r\n  crossAccountIdFromObjectNormalized: (obj: any): CrossAccountId => {\r\n    return addressToCrossAccountId(guessAddressAndExtractItNormalized(obj))\r\n  },\r\n}\r\n\r\nexport const mirror = {\r\n  substrateToEthereum: addressToEvm,\r\n  ethereumToSubstrate: evmToAddress,\r\n}\r\n\r\nexport const normalize = {\r\n  substrateAddress: normalizeSubstrateAddress,\r\n  ethereumAddress: normalizeEthereumAddress,\r\n}\r\n\r\nexport const compare = {\r\n  substrateAddresses: compareSubstrateAddresses,\r\n  ethereumAddresses: compareEthereumAddresses,\r\n}\r\n\r\nexport const substrate = {\r\n  encode: encodeSubstrateAddress,\r\n  decode: decodeSubstrateAddress,\r\n  compare: compareSubstrateAddresses,\r\n}\r\n\r\nexport const Address = {\r\n  constants,\r\n  is,\r\n  validate,\r\n  collection,\r\n  nesting,\r\n  to,\r\n  extract,\r\n  mirror,\r\n  normalize,\r\n  compare,\r\n  substrate,\r\n  algorithms,\r\n  StringUtils,\r\n}\r\n","export const STATIC_ADDRESSES = <const>{\r\n  contractHelpers: '0x842899ECF380553E8a4de75bF534cdf6fBF64049',\r\n  collectionHelpers: '0x6C4E9fE1AE37a41E93CEE429e8E1881aBdcbb54F',\r\n}\r\nexport const NESTING_PREFIX = <const>'0xf8238ccfff8ed887463fd5e0'\r\nexport const COLLECTION_ADDRESS_PREFIX = <const>'0x17c4e6453cc49aaaaeaca894e6d9683e'\r\n","import basex from 'base-x'\r\nimport {keccak_256} from '@noble/hashes/sha3'\r\nimport {blake2b} from '@noble/hashes/blake2b'\r\n\r\nconst BASE58_ALPHABET = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'\r\nconst BASE64_ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\r\n\r\nconst base58 = basex(BASE58_ALPHABET)\r\nconst base64 = basex(BASE64_ALPHABET)\r\n\r\nexport {keccak_256, blake2b, base58, base64, basex}\r\n","import * as string from \"./stringUtils\"\r\nimport {keccak_256} from \"./imports\"\r\nimport {COLLECTION_ADDRESS_PREFIX, NESTING_PREFIX} from \"./constants\"\r\nimport {is, validate} from \"./index\"\r\n\r\nconst unsafeNormalizeEthereumAddress = (address: string) => {\r\n  const addr = address.toLowerCase().replace(/^0x/i, '')\r\n  const addressHash = string.u8aToHex(keccak_256(addr)).replace(/^0x/i, '')\r\n\r\n  let checksumAddress = '0x'\r\n\r\n  for (let i = 0; i < addr.length; i++) {\r\n    checksumAddress += (parseInt(addressHash[i], 16) > 7)\r\n      ? addr[i].toUpperCase()\r\n      : addr[i]\r\n  }\r\n\r\n  return checksumAddress\r\n}\r\nexport const normalizeEthereumAddress = (address: string) => {\r\n  validate.ethereumAddress(address)\r\n  return unsafeNormalizeEthereumAddress(address)\r\n}\r\n\r\ntype EthAddressObj = { Ethereum: string }\r\nexport const compareEthereumAddresses = (address1: string | EthAddressObj | object, address2: string | EthAddressObj | object): boolean => {\r\n  const addr1 = typeof address1 === 'string'\r\n    ? address1\r\n    : ((address1 as EthAddressObj).Ethereum || (address1 as any).ethereum) as string | undefined\r\n  const addr2 = typeof address2 === 'string'\r\n    ? address2\r\n    : ((address2 as EthAddressObj).Ethereum || (address2 as any).ethereum) as string | undefined\r\n\r\n  if (!addr1 || !addr2 || !is.ethereumAddress(addr1) || !is.ethereumAddress(addr2)) {\r\n    return false\r\n  }\r\n  return addr1.toLowerCase() === addr2.toLowerCase()\r\n\r\n}\r\n\r\nexport const collectionIdToEthAddress = (collectionId: number): string | null => {\r\n  validate.collectionId(collectionId)\r\n  return unsafeNormalizeEthereumAddress(\r\n    COLLECTION_ADDRESS_PREFIX +\r\n    string.DWORDHexString.fromNumber(collectionId)\r\n  )\r\n}\r\nexport const ethAddressToCollectionId = (address: string): number | null => {\r\n  validate.collectionAddress(address)\r\n  return string.DWORDHexString.toNumber(address.slice(-8))\r\n}\r\n\r\nexport const collectionIdAndTokenIdToNestingAddress = (collectionId: number, tokenId: number): string => {\r\n  validate.collectionId(collectionId)\r\n  validate.tokenId(tokenId)\r\n\r\n  return unsafeNormalizeEthereumAddress(\r\n    NESTING_PREFIX +\r\n    string.DWORDHexString.fromNumber(collectionId) +\r\n    string.DWORDHexString.fromNumber(tokenId)\r\n  )\r\n}\r\n\r\nexport const nestingAddressToCollectionIdAndTokenId = (address: string): { collectionId: number, tokenId: number } => {\r\n  validate.nestingAddress(address)\r\n  return {\r\n    collectionId: string.DWORDHexString.toNumber(address.slice(-16, -8)),\r\n    tokenId: string.DWORDHexString.toNumber(address.slice(-8)),\r\n  }\r\n}\r\n","import {base58, blake2b} from './imports'\r\nimport {DecodeSubstrateAddressResult, validate} from './index'\r\nimport {normalizeEthereumAddress} from './ethereum'\r\nimport {hexToU8a, u8aToHex} from './stringUtils'\r\nimport * as string from \"./stringUtils\";\r\n\r\nconst blake2AsU8a = (u8a: Uint8Array, dkLen: 8 | 16 | 32 | 48 | 64 = 32): Uint8Array => {\r\n  return blake2b(u8a, {dkLen})\r\n}\r\n\r\nconst u8aConcat = (u8as: readonly Uint8Array[]): Uint8Array => {\r\n  let offset = 0\r\n\r\n  let length = 0\r\n\r\n  for (let i = 0; i < u8as.length; i++) {\r\n    length += u8as[i].length\r\n  }\r\n\r\n  const result = new Uint8Array(length)\r\n\r\n  for (let i = 0; i < u8as.length; i++) {\r\n    result.set(u8as[i], offset)\r\n    offset += u8as[i].length\r\n  }\r\n\r\n  return result\r\n}\r\n\r\n// strToU8a('SS58PRE')\r\nconst SS58_PREFIX = new Uint8Array([83, 83, 53, 56, 80, 82, 69])\r\n\r\nconst sshash = (data: Uint8Array): Uint8Array => {\r\n  return blake2AsU8a(u8aConcat([SS58_PREFIX, data]), 64);\r\n}\r\n\r\nconst checkAddressChecksum = (decoded: Uint8Array): [boolean, number, number, number] => {\r\n  const ss58Length = (decoded[0] & 0b0100_0000) ? 2 : 1;\r\n  const ss58Decoded = ss58Length === 1\r\n    ? decoded[0]\r\n    : ((decoded[0] & 0x3f) << 2) | (decoded[1] >> 6) | ((decoded[1] & 0x3f) << 8);\r\n\r\n  // 32/33 bytes public + 2 bytes checksum + prefix\r\n  const isPublicKey = [34 + ss58Length, 35 + ss58Length].includes(decoded.length);\r\n  const length = decoded.length - (isPublicKey ? 2 : 1);\r\n\r\n  // calculate the hash and do the checksum byte checks\r\n  const hash = sshash(decoded.subarray(0, length));\r\n  const isValid = (decoded[0] & 0x80) === 0 && ![46, 47].includes(decoded[0]) && (\r\n    isPublicKey\r\n      ? decoded[decoded.length - 2] === hash[0] && decoded[decoded.length - 1] === hash[1]\r\n      : decoded[decoded.length - 1] === hash[0]\r\n  );\r\n\r\n  return [isValid, length, ss58Length, ss58Decoded];\r\n}\r\n\r\nexport const normalizeSubstrateAddress = (address: string, prefix: number = 42): string => {\r\n  return encodeSubstrateAddress(decodeSubstrateAddress(address).u8a, prefix)\r\n}\r\n\r\n\r\nexport function encodeSubstrateAddress (key: Uint8Array | string | bigint, ss58Format: number = 42): string {\r\n  const u8a :Uint8Array = typeof key === 'string'\r\n    ? hexToU8a(key)\r\n    : typeof key === 'bigint'\r\n      ? hexToU8a(key.toString(16))\r\n      : key\r\n\r\n  if (ss58Format < 0 || ss58Format > 16383 || [46, 47].includes(ss58Format)) {\r\n    throw new Error(`ss58Format is not valid, received ${typeof ss58Format} \"${ss58Format}\"`)\r\n  }\r\n\r\n  const allowedDecodedLengths = [1, 2, 4, 8, 32, 33]\r\n  if (!allowedDecodedLengths.includes(u8a.length)) {\r\n    throw new Error(`key length is not valid, received ${u8a.length}, valid values are ${allowedDecodedLengths.join(', ')}`)\r\n  }\r\n\r\n  const u8aPrefix = ss58Format < 64\r\n    ? new Uint8Array([ss58Format])\r\n    : new Uint8Array([\r\n      ((ss58Format & 0xfc) >> 2) | 0x40,\r\n      (ss58Format >> 8) | ((ss58Format & 0x03) << 6)\r\n    ])\r\n\r\n  const input = u8aConcat([u8aPrefix, u8a])\r\n\r\n  return base58.encode(\r\n    u8aConcat([\r\n      input,\r\n      sshash(input).subarray(0, [32, 33].includes(u8a.length) ? 2 : 1)\r\n    ])\r\n  );\r\n}\r\n\r\nexport function decodeSubstrateAddress (address: string, ignoreChecksum?: boolean, ss58Format: number = -1): DecodeSubstrateAddressResult {\r\n  let realError: Error | null = null\r\n\r\n  try {\r\n    const decoded = base58.decode(address);\r\n\r\n    const allowedEncodedLengths = [3, 4, 6, 10, 35, 36, 37, 38]\r\n\r\n    if (!allowedEncodedLengths.includes(decoded.length)) {\r\n      realError = new Error(`key length is not valid, decoded key length is ${decoded.length}, valid values are ${allowedEncodedLengths.join(', ')}`)\r\n      throw realError\r\n    }\r\n\r\n    const [isValid, endPos, ss58Length, ss58Decoded] = checkAddressChecksum(decoded)\r\n\r\n    if (!ignoreChecksum && !isValid) {\r\n      realError = new Error(`Invalid decoded address checksum`)\r\n      throw realError\r\n    }\r\n    if (![-1, ss58Decoded].includes(ss58Format)) {\r\n      realError = new Error(`Expected ss58Format ${ss58Format}, received ${ss58Decoded}`)\r\n      throw realError\r\n    }\r\n\r\n    const publicKey = decoded.slice(ss58Length, endPos)\r\n\r\n    const hex = u8aToHex(publicKey)\r\n    return {\r\n      u8a: publicKey,\r\n      hex,\r\n      bigint: BigInt(hex)\r\n    }\r\n  } catch (error) {\r\n    throw realError\r\n      ? realError\r\n      : new Error(`Decoding ${address}: ${(error as Error).message}`)\r\n  }\r\n}\r\n\r\ntype SubAddressObj = { Substrate: string }\r\nexport const compareSubstrateAddresses = (address1: string | SubAddressObj | object, address2: string | SubAddressObj | object): boolean => {\r\n  const addr1 = typeof address1 === 'string'\r\n    ? address1\r\n    : ((address1 as SubAddressObj).Substrate || (address1 as any).substrate) as string | undefined\r\n  const addr2 = typeof address2 === 'string'\r\n    ? address2\r\n    : ((address2 as SubAddressObj).Substrate || (address2 as any).substrate) as string | undefined\r\n\r\n  if (!addr1 || !addr2) {\r\n    return false\r\n  }\r\n\r\n  try {\r\n    const decoded1 = decodeSubstrateAddress(addr1)\r\n    const decoded2 = decodeSubstrateAddress(addr2)\r\n    return decoded1.bigint === decoded2.bigint\r\n  } catch(e) {\r\n    return false\r\n  }\r\n}\r\n\r\nexport const addressToEvm = (address: string, ignoreChecksum?: boolean): string => {\r\n  const truncated = decodeSubstrateAddress(address, ignoreChecksum).u8a.subarray(0, 20)\r\n  return normalizeEthereumAddress(u8aToHex(truncated))\r\n}\r\n\r\n// strToU8a('evm:')\r\nconst EVM_PREFIX_U8A = new Uint8Array([101, 118, 109, 58])\r\nexport const evmToAddress = (evmAddress: string, ss58Format: number = 42): string => {\r\n  validate.ethereumAddress(evmAddress)\r\n\r\n  const message = u8aConcat([EVM_PREFIX_U8A, hexToU8a(evmAddress)])\r\n\r\n  return encodeSubstrateAddress(blake2AsU8a(message), ss58Format)\r\n}\r\n","import {normalizeEthereumAddress} from \"./ethereum\";\r\nimport {normalizeSubstrateAddress} from \"./substrate\";\r\nimport {CrossAccountId} from \"../../types\";\r\nimport {is, mirror, normalize} from \"./index\";\r\n\r\nexport const guessAddressAndExtractItNormalizedSafe = (address: string | object): string | null => {\r\n  if (typeof address === 'object') {\r\n    if (is.substrateAddressObject(address)) return normalize.substrateAddress(address.Substrate)\r\n    else if (is.substrateAddressObjectUncapitalized(address)) return normalize.substrateAddress(address.substrate)\r\n    else if (is.ethereumAddressObject(address)) return normalizeEthereumAddress(address.Ethereum)\r\n    else if (is.ethereumAddressObjectUncapitalized(address)) return normalizeEthereumAddress(address.ethereum)\r\n    else return null\r\n  }\r\n  if (typeof address === 'string') {\r\n    if (is.substrateAddress(address)) return normalizeSubstrateAddress(address)\r\n    else if (is.ethereumAddress(address)) return normalizeEthereumAddress(address)\r\n    else return null\r\n  }\r\n\r\n  return null\r\n}\r\n\r\nexport const guessAddressAndExtractItNormalized = (address: string | object): string => {\r\n  const result = guessAddressAndExtractItNormalizedSafe(address)\r\n  if (!result) {\r\n    throw new Error(`Passed address is not a valid address string or object: ${JSON.stringify(address).slice(0, 100)}`)\r\n  }\r\n  return result\r\n}\r\n\r\nexport const addressToCrossAccountId = (address: string): CrossAccountId => {\r\n  if (is.substrateAddress(address)) {\r\n    return {Substrate: address}\r\n  } else if (is.ethereumAddress(address)) {\r\n    return {Ethereum: address}\r\n  }\r\n\r\n  throw new Error(`Passed address ${address} is not substrate nor ethereum address`)\r\n}\r\n\r\nexport const addressToCrossAccountIdNormalized = (address: string): CrossAccountId => {\r\n  if (is.substrateAddress(address)) {\r\n    return {Substrate: normalize.substrateAddress(address)}\r\n  } else if (is.ethereumAddress(address)) {\r\n    return {Ethereum: normalize.ethereumAddress(address)}\r\n  }\r\n\r\n  throw new Error(`Passed address ${address} is not substrate nor ethereum address`)\r\n}\r\n\r\nexport const substrateNormalizedWithMirrorIfEthereum = (address: string): string => {\r\n  const addressObject = addressToCrossAccountId(address)\r\n  return addressObject.Substrate\r\n    ? normalizeSubstrateAddress(addressObject.Substrate)\r\n    : mirror.ethereumToSubstrate(addressObject.Ethereum as string)\r\n}\r\n","import * as Address from './address'\r\n\r\nconst StringUtils = Address.StringUtils\r\n\r\nconst Browser = {\r\n  checkEnvironmentIsBrowser: (safe?: boolean) => {\r\n    if (typeof window === 'undefined') {\r\n      if (safe) {\r\n        return false\r\n      } else {\r\n        throw new Error('cannot sign with extenion not in browser')\r\n      }\r\n    }\r\n    return true\r\n  }\r\n}\r\n\r\nexport {Address, StringUtils, Browser}\r\n\r\n\r\nexport const UniqueUtils = {\r\n  Browser,\r\n  StringUtils,\r\n  Address,\r\n}\r\n","import {\r\n  AttributeSchema,\r\n  AttributeType,\r\n  COLLECTION_SCHEMA_NAME,\r\n  CollectionAttributesSchema,\r\n  DecodedAttributes,\r\n  DecodedInfixOrUrlOrCidAndHash,\r\n  DecodingImageLinkOptions,\r\n  LocalizedStringWithDefault,\r\n  UniqueCollectionSchemaDecoded,\r\n  UniqueTokenDecoded,\r\n  UrlTemplateString\r\n} from \"../types\";\r\nimport {validateURLSafe} from \"./validators\";\r\nimport {CollectionProperties} from \"../../substrate/extrinsics/unique/types\";\r\nimport {DecodingResult} from \"../schemaUtils\";\r\nimport {CrossAccountId, HumanizedNftToken} from \"../../types\";\r\nimport type {Message, Type} from 'protobufjs'\r\nimport {Root} from 'protobufjs'\r\nimport {ValidationError} from \"../../utils/errors\";\r\nimport {getEntries, getKeys, getValues, safeJSONParse} from \"../../tsUtils\";\r\nimport {StringUtils, UniqueUtils} from \"../../utils\";\r\n\r\n\r\nconst isOffchainSchemaAValidUrl = (offchainSchema: string | undefined): offchainSchema is string => {\r\n  return typeof offchainSchema === \"string\" &&\r\n    validateURLSafe(offchainSchema, 'offchainSchema') &&\r\n    offchainSchema.indexOf('{id}') >= 0\r\n}\r\n\r\nexport const decodeOldSchemaCollection = async (collectionId: number, properties: CollectionProperties, options: Required<DecodingImageLinkOptions>): Promise<DecodingResult<UniqueCollectionSchemaDecoded>> => {\r\n  const {imageUrlTemplate, dummyImageFullUrl} = options\r\n\r\n  const propObj = properties.reduce((acc, {key, value}) => {\r\n    acc[key] = value;\r\n    return acc\r\n  }, {} as Record<string, string>)\r\n\r\n  const offchainSchema: string | undefined = propObj._old_offchainSchema\r\n  const constOnchainSchema: string | undefined = propObj._old_constOnChainSchema\r\n  const schemaVersion: string | undefined = propObj._old_schemaVersion\r\n  const variableOnchainSchema: string | undefined = propObj._old_variableOnChainSchema\r\n\r\n  const offchainSchemaIsValidUrl = isOffchainSchemaAValidUrl(offchainSchema)\r\n\r\n  const schema: UniqueCollectionSchemaDecoded = {\r\n    schemaName: COLLECTION_SCHEMA_NAME.old,\r\n\r\n    collectionId,\r\n    coverPicture: {\r\n      url: dummyImageFullUrl,\r\n      fullUrl: null\r\n    },\r\n    image: {\r\n      urlTemplate: offchainSchemaIsValidUrl\r\n        ? offchainSchema.replace('{id}', '{infix}') as UrlTemplateString\r\n        : imageUrlTemplate\r\n    },\r\n\r\n    schemaVersion: '0.0.1',\r\n    attributesSchema: {},\r\n    attributesSchemaVersion: '1.0.0'\r\n  }\r\n\r\n  let parsedVariableOnchainSchema = null\r\n  try {\r\n    parsedVariableOnchainSchema = JSON.parse(variableOnchainSchema)\r\n  } catch {\r\n  }\r\n\r\n  if (parsedVariableOnchainSchema && typeof parsedVariableOnchainSchema === 'object' && typeof parsedVariableOnchainSchema.collectionCover === 'string') {\r\n    schema.coverPicture.ipfsCid = parsedVariableOnchainSchema.collectionCover\r\n    delete schema.coverPicture.url\r\n    schema.coverPicture.fullUrl = imageUrlTemplate.replace('{infix}', parsedVariableOnchainSchema.collectionCover)\r\n  } else if (offchainSchemaIsValidUrl) {\r\n    const coverUrl = offchainSchema.replace('{id}', '1')\r\n    schema.coverPicture.url = coverUrl\r\n    schema.coverPicture.fullUrl = coverUrl\r\n  }\r\n\r\n\r\n  let root: Root = {} as any\r\n  let NFTMeta: Type = {} as any\r\n  try {\r\n    root = Root.fromJSON(JSON.parse(constOnchainSchema))\r\n    NFTMeta = root.lookupType('onChainMetaData.NFTMeta')\r\n  } catch (err: any) {\r\n    return {\r\n      result: null,\r\n      error: err as Error,\r\n    }\r\n  }\r\n\r\n  const attributesSchema: CollectionAttributesSchema = {}\r\n\r\n  let i = 0;\r\n  for (const field of NFTMeta.fieldsArray) {\r\n    if (field.name === 'ipfsJson') {\r\n      continue\r\n    }\r\n\r\n    const options = !['string', 'number'].includes(field.type) && root.lookupEnum(field.type).options;\r\n\r\n    const parsedOptions: LocalizedStringWithDefault[] = options\r\n      ? getValues(options)\r\n        .map(v => safeJSONParse<{en: string | undefined}>(v))\r\n        .filter(v => typeof v !== 'string' && typeof v.en === 'string')\r\n        .map(v => {\r\n          const result: any = {...(v as any)}\r\n          if (typeof result._ === 'string') return result\r\n\r\n          result._ = result.en || result[getKeys(result)[0]] || undefined\r\n\r\n          if (typeof result._ !== 'string') return null\r\n\r\n          return result;\r\n        })\r\n        .filter(v => !!v)\r\n      : []\r\n\r\n    const attr: AttributeSchema = {\r\n      type: AttributeType.string,\r\n      name: {_: field.name},\r\n      isArray: field.repeated,\r\n      optional: !field.required,\r\n    }\r\n    if (parsedOptions.length) {\r\n      attr.enumValues = parsedOptions.reduce(\r\n        (acc, el, index) => {\r\n          acc[index] = el\r\n          return acc\r\n        },\r\n        {} as {[K: number]: LocalizedStringWithDefault}\r\n      )\r\n    }\r\n\r\n    attributesSchema[i++] = attr\r\n  }\r\n\r\n  schema.attributesSchema = attributesSchema\r\n  schema.attributesSchemaVersion = '1.0.0'\r\n\r\n  schema.oldProperties = {\r\n    _old_schemaVersion: schemaVersion,\r\n    _old_offchainSchema: offchainSchema,\r\n    _old_constOnChainSchema: constOnchainSchema,\r\n    _old_variableOnChainSchema: variableOnchainSchema,\r\n  }\r\n\r\n  return {result: schema, error: null}\r\n}\r\n\r\n//todo: replace rawToken type with humanized token after core team's fix\r\nexport const decodeOldSchemaToken = async (collectionId: number, tokenId: number, rawToken: { owner: any, properties: any[] }, schema: UniqueCollectionSchemaDecoded, options: Required<DecodingImageLinkOptions>): Promise<DecodingResult<UniqueTokenDecoded>> => {\r\n  const constOnchainSchema = schema.oldProperties?._old_constOnChainSchema\r\n\r\n  if (!constOnchainSchema) {\r\n    return {\r\n      result: null,\r\n      error: new ValidationError(`collection doesn't contain _old_constOnChainSchema field`)\r\n    }\r\n  }\r\n\r\n  let root: Root = {} as any\r\n  let NFTMeta: Type = {} as any\r\n  try {\r\n    root = Root.fromJSON(JSON.parse(constOnchainSchema))\r\n    NFTMeta = root.lookupType('onChainMetaData.NFTMeta')\r\n  } catch (err: any) {\r\n    return {\r\n      result: null,\r\n      error: err as Error,\r\n    }\r\n  }\r\n\r\n  if (!rawToken) {\r\n    return {\r\n      result: null,\r\n      error: new ValidationError(`parsing token with old schema: no token passed`)\r\n    }\r\n  }\r\n\r\n  const parsedToken: HumanizedNftToken = {\r\n    owner: rawToken.owner.toHuman() as CrossAccountId,\r\n    properties: rawToken.properties.map(property => {\r\n      return {\r\n        key: property.key.toHuman() as string,\r\n        value: property.value.toJSON() as string,\r\n        // valueH: property.value.toHuman() as string,\r\n      }\r\n    })\r\n  }\r\n\r\n  const constDataProp = parsedToken.properties.find(({key}) => key === '_old_constData')\r\n  if (!constDataProp) {\r\n    return {\r\n      result: null,\r\n      error: new ValidationError('no _old_constData property found')\r\n    }\r\n  }\r\n\r\n  const u8aToken = StringUtils.hexToU8a(constDataProp.value)\r\n  let tokenDecoded: Message<{}> = {} as any\r\n  let tokenDecodedHuman: Record<string, any> = {}\r\n  try {\r\n    tokenDecoded = NFTMeta.decode(u8aToken)\r\n    tokenDecodedHuman = tokenDecoded.toJSON()\r\n  } catch (err: any) {\r\n    return {\r\n      result: null,\r\n      error: err\r\n    }\r\n  }\r\n\r\n  const tokenAttributesResult: DecodedAttributes = {}\r\n\r\n  const entries = getEntries(tokenDecodedHuman)\r\n  let i = 0\r\n  for (const entry of entries) {\r\n    let [name, rawValue] = entry as [string, any]\r\n    if (name === 'ipfsJson') {\r\n      continue\r\n    }\r\n\r\n    let value = rawValue\r\n    let isArray = false\r\n    let isEnum = false\r\n\r\n    const field = tokenDecoded.$type.fields[name]\r\n\r\n    if (!['string', 'number'].includes(field.type)) {\r\n      const enumOptions = root.lookupEnum(field.type).options\r\n      isEnum = !!enumOptions;\r\n\r\n      if (field.rule === 'repeated' && Array.isArray(rawValue)) {\r\n        const parsedValues = rawValue\r\n          .map((v: any) => {\r\n            const parsed = safeJSONParse<any>(enumOptions?.[v] || v)\r\n            if (typeof parsed !== 'string') {\r\n              parsed._ = parsed.en\r\n              return parsed\r\n            } else {\r\n              return null\r\n            }\r\n          })\r\n          .filter(v => typeof v?._ === 'string')\r\n\r\n\r\n        value = parsedValues\r\n        isArray = true\r\n      } else {\r\n        value = safeJSONParse(enumOptions?.[rawValue] || rawValue)\r\n        if (typeof value !== 'string') {\r\n          value._ = value.en || getValues(value)[0]\r\n        }\r\n      }\r\n    }\r\n\r\n    if (field.type === 'string') value = {_:value}\r\n\r\n    tokenAttributesResult[i++] = {\r\n      name: {_: name},\r\n      type: field.type === 'number' ? AttributeType.float : AttributeType.string,\r\n      value,\r\n      isArray,\r\n      isEnum,\r\n      rawValue,\r\n    }\r\n  }\r\n\r\n\r\n  const schemaVersion = schema.oldProperties?._old_schemaVersion\r\n  const offchainSchema = schema.oldProperties?._old_offchainSchema\r\n\r\n\r\n  const {imageUrlTemplate, dummyImageFullUrl} = options\r\n\r\n  let image: DecodedInfixOrUrlOrCidAndHash = {\r\n    url: dummyImageFullUrl,\r\n    fullUrl: null,\r\n  }\r\n\r\n  let ipfsImageIsSet = false\r\n  if (schemaVersion === 'Unique') {\r\n    try {\r\n      const ipfsCid = JSON.parse(tokenDecodedHuman.ipfsJson).ipfs\r\n      image = {\r\n        ipfsCid,\r\n        fullUrl: imageUrlTemplate.replace('{infix}', ipfsCid)\r\n      }\r\n      ipfsImageIsSet = true\r\n    } catch {\r\n    }\r\n  }\r\n\r\n  if (!ipfsImageIsSet && isOffchainSchemaAValidUrl(offchainSchema)) {\r\n    image = {\r\n      urlInfix: tokenId.toString(),\r\n      fullUrl: offchainSchema.replace('{id}', tokenId.toString())\r\n    }\r\n  }\r\n\r\n  const decodedToken: UniqueTokenDecoded = {\r\n    collectionId,\r\n    tokenId,\r\n    owner: parsedToken.owner,\r\n    image,\r\n    attributes: tokenAttributesResult,\r\n  }\r\n\r\n  if (parsedToken.owner.Ethereum && UniqueUtils.Address.is.nestingAddress(parsedToken.owner.Ethereum)) {\r\n    decodedToken.nestingParentToken = UniqueUtils.Address.nesting.addressToIds(parsedToken.owner.Ethereum)\r\n  }\r\n\r\n  return {\r\n    result: decodedToken,\r\n    error: null,\r\n  }\r\n}\r\n","import {HumanizedNftToken, PropertiesArray, UpDataStructsTokenData} from \"../../types\";\nimport {DecodingResult} from \"../schemaUtils\";\nimport {\n  COLLECTION_SCHEMA_NAME,\n  DecodingImageLinkOptions,\n  UniqueCollectionSchemaDecoded,\n  UniqueTokenDecoded,\n  UrlTemplateString\n} from \"../types\";\nimport * as oldSchema from \"./oldSchemaDecoder\";\nimport * as collection from \"./collection\";\nimport {ValidationError} from \"../../utils/errors\";\nimport * as token from \"./token\";\nimport {validateUrlTemplateStringSafe} from \"./validators\";\nimport {safeJSONParse} from \"../../tsUtils\";\nimport {safeJsonParseStringOrHexString} from \"../../utils/address/stringUtils\";\n\nconst DEFAULT_IMAGE_URL_TEMPLATE: UrlTemplateString = `https://ipfs.unique.network/ipfs/{infix}`\nconst DEFAULT_DUMMY_IMAGE_FULL_URL = `https://ipfs.unique.network/ipfs/QmPCqY7Lmxerm8cLKmB18kT1RxkwnpasPVksA8XLhViVT7`\n\n\n\nconst parseImageLinkOptions = (options?: DecodingImageLinkOptions): Required<DecodingImageLinkOptions> => {\n  let imageUrlTemplate: UrlTemplateString = DEFAULT_IMAGE_URL_TEMPLATE\n  if (validateUrlTemplateStringSafe(options?.imageUrlTemplate, 'options.imageUrlTemplate')) {\n    imageUrlTemplate = options!.imageUrlTemplate\n  }\n\n  const dummyImageFullUrl = typeof options?.dummyImageFullUrl === 'string'\n    ? options.dummyImageFullUrl\n    : DEFAULT_DUMMY_IMAGE_FULL_URL\n\n  return {\n    imageUrlTemplate,\n    dummyImageFullUrl,\n  }\n}\n\n\n\nexport const universallyDecodeCollectionSchema = async (collectionId: number, properties: PropertiesArray, options?: DecodingImageLinkOptions): Promise<DecodingResult<UniqueCollectionSchemaDecoded>> => {\n  const schemaNameProp = properties.find(({key}) => key === 'schemaName')?.value || null\n  const schemaName = typeof schemaNameProp === 'string' ? safeJsonParseStringOrHexString<string>(schemaNameProp) : null\n  const isOldSchema = !!properties.find(({key}) => key === '_old_schemaVersion')\n\n  if (isOldSchema) {\n    const imageLinkOptions = parseImageLinkOptions(options)\n    return await oldSchema.decodeOldSchemaCollection(collectionId, properties, imageLinkOptions)\n  } else if (schemaName === COLLECTION_SCHEMA_NAME.unique) {\n    return await collection.decodeUniqueCollectionFromProperties(collectionId, properties)\n  }\n\n  return {\n    result: null,\n    error: new ValidationError(`Unknown collection schema`)\n  }\n}\n\nexport const universallyDecodeToken = async (collectionId: number, tokenId: number, rawToken: UpDataStructsTokenData, schema: UniqueCollectionSchemaDecoded, options?: DecodingImageLinkOptions): Promise<DecodingResult<UniqueTokenDecoded>> => {\n  if (!schema) {\n    return {\n      result: null,\n      error: new ValidationError('unable to parse: collection schema was not provided')\n    }\n  }\n  const humanizedToken: HumanizedNftToken = rawToken.toHuman() as HumanizedNftToken\n\n  if (schema.schemaName === COLLECTION_SCHEMA_NAME.unique) {\n    return await token.decodeTokenFromProperties(collectionId, tokenId, humanizedToken, schema)\n  } else if (schema.schemaName === COLLECTION_SCHEMA_NAME.old) {\n    const imageLinkOptions = parseImageLinkOptions(options)\n    return await oldSchema.decodeOldSchemaToken(collectionId, tokenId, rawToken, schema, imageLinkOptions)\n  }\n\n  return {\n    result: null,\n    error: new ValidationError(`unable to parse: collection schemaName is unknown (passed ${schema.schemaName}`)\n  }\n}\n","export * from './types'\r\nimport * as types from './types'\r\nimport * as validators from './tools/validators'\r\nimport * as collection from './tools/collection'\r\nimport * as token from './tools/token'\r\nimport * as oldSchema from './tools/oldSchemaDecoder'\r\nimport * as universal from './tools/universal'\r\n\r\nexport const SchemaTools = {\r\n  decode: {\r\n    collectionSchema: universal.universallyDecodeCollectionSchema,\r\n    token: universal.universallyDecodeToken\r\n  },\r\n  encodeUnique: {\r\n    collectionSchema: collection.encodeCollectionSchemaToProperties,\r\n    collectionTokenPropertyPermissions: collection.generateTokenPropertyPermissionsFromCollectionSchema,\r\n    token: token.encodeTokenToProperties,\r\n  },\r\n  tools: {\r\n    unique: {\r\n      collection,\r\n      token,\r\n      validators,\r\n    },\r\n    oldSchema,\r\n    universal,\r\n  },\r\n  types,\r\n}\r\n"],"mappings":"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","names":[]}