package vo import ( "fmt" "regexp" "strings" ) // Address is a value object representing a blockchain or internal platform address. type Address string // addressPattern matches common hex-based addresses (0x-prefixed, 10-64 hex chars) // as well as non-hex internal platform addresses (alphanumeric + hyphens, >= 6 chars). var ( hexAddressPattern = regexp.MustCompile(`^0x[0-9a-fA-F]{10,64}$`) internalAddressPattern = regexp.MustCompile(`^[a-zA-Z0-9_-]{6,128}$`) ) // NewAddress creates a validated Address value object. func NewAddress(raw string) (Address, error) { trimmed := strings.TrimSpace(raw) if trimmed == "" { return "", fmt.Errorf("address must not be empty") } if !hexAddressPattern.MatchString(trimmed) && !internalAddressPattern.MatchString(trimmed) { return "", fmt.Errorf("invalid address format: %s", trimmed) } return Address(trimmed), nil } // String returns the string representation of the address. func (a Address) String() string { return string(a) } // IsHex reports whether the address is a hex-encoded on-chain address. func (a Address) IsHex() bool { return hexAddressPattern.MatchString(string(a)) } // IsValid reports whether the address passes format validation. func (a Address) IsValid() bool { s := string(a) return hexAddressPattern.MatchString(s) || internalAddressPattern.MatchString(s) }