$contract * @param array $sourceMetadata */ public function __construct( public string $canonicalType, public CaptureOutcome $outcome, public ?string $contractKey = null, public ?string $sourceEndpoint = null, public string $sourceVersion = 'v1.0', public ?string $sourceSchemaHash = null, public ?string $reasonCode = null, public ?string $sourceContractState = null, public array $contract = [], public array $sourceMetadata = [], ) {} /** * @return list */ public static function sourceContractStates(): array { return [ self::CONTRACT_VERIFIED_PENDING_CAPTURE, self::CONTRACT_BLOCKED_MISSING_SOURCE, self::CONTRACT_BLOCKED_PERMISSION_UNCLEAR, self::CONTRACT_BLOCKED_BETA_ONLY, self::CONTRACT_BLOCKED_RESPONSE_SHAPE_UNSAFE, self::CONTRACT_BLOCKED_REPO_ADAPTER_MISSING, self::CONTRACT_BLOCKED_IDENTITY_UNSAFE, self::CONTRACT_BLOCKED_REDACTION_UNSAFE, ]; } public function capturable(): bool { return $this->outcome === CaptureOutcome::Captured && is_string($this->contractKey) && $this->contractKey !== '' && is_string($this->sourceEndpoint) && $this->sourceEndpoint !== ''; } }