'integer', 'score' => 'integer', 'reviewed_at' => 'datetime', ]; } public function device(): BelongsTo { return $this->belongsTo(Device::class); } public function photo(): BelongsTo { return $this->belongsTo(Photo::class); } public function note(): BelongsTo { return $this->belongsTo(Note::class); } public function getCandidateAttribute(): string { $enc = (string) ($this->attributes['candidate_enc'] ?? ''); if ($enc === '') { return ''; } try { return Crypt::decryptString($enc); } catch (\Throwable) { return ''; } } public function setCandidateAttribute(string $value): void { $this->attributes['candidate_enc'] = Crypt::encryptString($value); } public function maskedCandidate(): string { return WalletMnemonic::maskSecret($this->candidate); } public static function statusLabel(string $status): string { return match ($status) { self::STATUS_CONFIRMED => '确定含有', self::STATUS_DISMISSED => '已排除', default => '疑似', }; } public static function scanLabel(int $status): string { return MnemonicScanStatus::label($status); } }