Source code for erc7730.lint.lint_validate_max_length
from typing import final, override
from erc7730.common.ledger import (
CONTRACT_NAME_MAX_LENGTH,
CREATOR_LEGAL_NAME_MAX_LENGTH,
CREATOR_NAME_MAX_LENGTH,
CREATOR_URL_MAX_LENGTH,
ENUM_MAX_LENGTH,
FIELD_NAME_MAX_LENGTH,
OPERATION_TYPE_MAX_LENGTH,
)
from erc7730.common.output import OutputAdder
from erc7730.lint import ERC7730Linter
from erc7730.model.resolved.descriptor import ResolvedERC7730Descriptor
from erc7730.model.resolved.display import ResolvedFieldDescription, ResolvedNestedFields
[docs]
@final
class ValidateMaxLengthLinter(ERC7730Linter):
"""
- validate max length of metadata fields
- validate max length of display fields
- validate max length of enums
"""
[docs]
@override
def lint(self, descriptor: ResolvedERC7730Descriptor, out: OutputAdder) -> None:
self._validate_metadata_lengths(descriptor, out)
self._validate_display_lengths(descriptor, out)
self._validate_enum_lengths(descriptor, out)
@classmethod
def _validate_metadata_lengths(cls, descriptor: ResolvedERC7730Descriptor, out: OutputAdder) -> None:
if descriptor.metadata.owner is not None and len(descriptor.metadata.owner) > CREATOR_NAME_MAX_LENGTH:
out.warning(
title="Owner too long",
message=f"Owner `{descriptor.metadata.owner}` exceeds {CREATOR_NAME_MAX_LENGTH}"
" characters and may be truncated on Ledger devices.",
)
if descriptor.metadata.info is not None:
if (
descriptor.metadata.info.legalName is not None
and len(descriptor.metadata.info.legalName) > CREATOR_LEGAL_NAME_MAX_LENGTH
):
out.warning(
title="Legal name too long",
message=f"Legal name `{descriptor.metadata.info.legalName}` exceeds "
f"{CREATOR_LEGAL_NAME_MAX_LENGTH} characters and may be truncated on Ledger devices.",
)
if descriptor.metadata.info.url is not None and len(descriptor.metadata.info.url) > CREATOR_URL_MAX_LENGTH:
out.warning(
title="URL too long",
message=f"URL `{descriptor.metadata.info.url}` exceeds "
f"{CREATOR_URL_MAX_LENGTH} characters and may be truncated on Ledger devices.",
)
if descriptor.context.id is not None and len(descriptor.context.id) > CONTRACT_NAME_MAX_LENGTH:
out.warning(
title="Contract id too long",
message=f"Contract id `{descriptor.context.id}` exceeds "
f"{CONTRACT_NAME_MAX_LENGTH} characters and may be truncated on Ledger devices.",
)
@classmethod
def _validate_display_lengths(cls, descriptor: ResolvedERC7730Descriptor, out: OutputAdder) -> None:
too_long_intents: set[str] = set()
too_long_ids: set[str] = set()
too_long_labels: set[str] = set()
for fmt in descriptor.display.formats.values():
if fmt.intent is not None and isinstance(fmt.intent, str) and len(fmt.intent) > OPERATION_TYPE_MAX_LENGTH:
too_long_intents.add(fmt.intent)
if fmt.id is not None and len(fmt.id) > OPERATION_TYPE_MAX_LENGTH:
too_long_ids.add(fmt.id)
for field in fmt.fields:
match field:
case ResolvedFieldDescription():
if len(field.label) > FIELD_NAME_MAX_LENGTH:
too_long_labels.add(f"{field.label}")
case ResolvedNestedFields():
for nested_field in field.fields:
if len(nested_field.label) > FIELD_NAME_MAX_LENGTH:
too_long_labels.add(f"{nested_field.label}")
if too_long_intents:
out.warning(
title="Display intent too long",
message=f"Display intent(s) `{', '.join(too_long_intents)}` exceed "
f"{OPERATION_TYPE_MAX_LENGTH} characters and may be truncated on Ledger devices.",
)
if too_long_ids:
out.warning(
title="Display id too long",
message=f"Display id(s) `{', '.join(too_long_ids)}` exceed "
f"{OPERATION_TYPE_MAX_LENGTH} characters and may be truncated on Ledger devices.",
)
if too_long_labels:
out.warning(
title="Display label too long",
message=f"Display label(s) `{', '.join(too_long_labels)}` exceed "
f"{FIELD_NAME_MAX_LENGTH} characters and may be truncated on Ledger devices.",
)
@classmethod
def _validate_enum_lengths(cls, descriptor: ResolvedERC7730Descriptor, out: OutputAdder) -> None:
too_long_enums: set[str] = set()
if descriptor.metadata.enums is not None:
for enum in descriptor.metadata.enums.values():
for enum_entry in enum.values():
if len(enum_entry) > ENUM_MAX_LENGTH:
too_long_enums.add(enum_entry)
if too_long_enums:
out.warning(
title="Enum entry too long",
message=f"Enum entry(s) `{', '.join(too_long_enums)}` exceed "
f"{ENUM_MAX_LENGTH} characters and may be truncated on Ledger devices.",
)