Skip to content

DF-25025: Remove forwarder EOA fallback#22836

Open
cl-efornaciari wants to merge 2 commits into
developfrom
feature/DF-25025/remove-forwarder-eoa-fallback
Open

DF-25025: Remove forwarder EOA fallback#22836
cl-efornaciari wants to merge 2 commits into
developfrom
feature/DF-25025/remove-forwarder-eoa-fallback

Conversation

@cl-efornaciari

@cl-efornaciari cl-efornaciari commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

Motivation

When forwarding is enabled, the node determines the OCR transmitter by resolving the forwarder contract for the configured EOA via an RPC call at job startup. If that RPC call fails — most commonly because the EVM MultiNode has not selected a live RPC yet during node boot (no live nodes available) — the previous code logged a warning and silently fell back to the EOA.

That fallback is sticky and harmful:

  • The EOA gets baked into the effective transmitter for the lifetime of the process.
  • For Median (ocr2FeedsTransmitter), the tx-time forwarder lookup is gated on slices.Contains(fromAddresses, effectiveTransmitterAddress), so once the EOA is the effective address, forwarding is permanently disabled.
  • The job appears healthy but cannot transmit through the forwarder, and does not recover without a node restart.

This is the DF-25025 reliability issue: an RPC blip at boot leaves forwarding jobs running on the wrong transmitter until they are manually restarted.

Change

Remove the forwarder→EOA fallback so a forwarding-enabled job either uses its forwarder or fails honestly. On forwarder-resolution failure the service now returns the error, which the job spawner records (TryRecordError) and re-attempts on the next boot — when the RPC is warm and the correct forwarder can be resolved.

  • OCR2core/services/ocr2/delegate.go (GetEVMEffectiveTransmitterID): return the GetForwarderForEOA error instead of Warnw + returning the EOA.
  • OCR1core/services/ocr/delegate.go (ServicesForSpec): same treatment for the OCR1 forwarding path.

Behavior change / risk

Forwarding-enabled jobs will now fail to start when the forwarder cannot be resolved at boot (e.g. cold RPC), where they previously started on the EOA. This is intended: an explicit, recorded failure that self-heals on the next boot is preferable to a silent, unrecoverable misconfiguration. This matches the existing "recovers on restart" behavior operators already rely on.

Scope is limited to the boot-time transmitter determination. The tx-time EOA fallbacks in the Median transmitter and broader boot-time RPC resilience (e.g. spawner retry, log-poller RegisterFilter/CodeAt tolerance) are intentionally out of scope.

Note: this does not address the separate failed to check if address ... is a contract: no live nodes available startup log, which originates from log-poller filter registration (RegisterFilterCodeAt) on the OCR aggregator — a different eager-RPC path that warrants its own follow-up.

Testing

  • go build ./core/services/ocr2/ ./core/services/ocr/
  • go test ./core/services/ocr2/ (incl. TestGetEVMEffectiveTransmitterID, updated to assert an error rather than the EOA fallback)
  • go test ./core/services/ocr/

When forwarding is enabled and the forwarder address cannot be resolved
(e.g. RPC unavailable at node boot), GetEVMEffectiveTransmitterID
previously logged a warning and silently fell back to the EOA. That EOA
was then baked into the effective transmitter, permanently disabling
forwarding for the process lifetime so the job could not transmit and did
not recover without a restart.

Return the error instead so a forwarding job either uses its forwarder or
fails honestly (recorded and retried on the next boot once RPC is warm).

DF-25025
@github-actions

Copy link
Copy Markdown
Contributor

👋 cl-efornaciari, thanks for creating this pull request!

To help reviewers, please consider creating future PRs as drafts first. This allows you to self-review and make any final changes before notifying the team.

Once you're ready, you can mark it as "Ready for review" to request feedback. Thanks!

@cl-efornaciari cl-efornaciari changed the title Feature/df 25025/remove forwarder eoa fallback DF-25025: Remove forwarder EOA fallback Jun 12, 2026
@github-actions

Copy link
Copy Markdown
Contributor

✅ No conflicts with other open PRs targeting develop

@github-actions

Copy link
Copy Markdown
Contributor

I see you updated files related to core. Please run make gocs in the root directory to add a changeset as well as in the text include at least one of the following tags:

  • #added For any new functionality added.
  • #breaking_change For any functionality that requires manual action for the node to boot.
  • #bugfix For bug fixes.
  • #changed For any change to the existing functionality.
  • #db_update For any feature that introduces updates to database schema.
  • #deprecation_notice For any upcoming deprecation functionality.
  • #internal For changesets that need to be excluded from the final changelog.
  • #nops For any feature that is NOP facing and needs to be in the official Release Notes for the release.
  • #removed For any functionality/config that is removed.
  • #updated For any functionality that is updated.
  • #wip For any change that is not ready yet and external communication about it should be held off till it is feature complete.

@cl-sonarqube-production

Copy link
Copy Markdown

Quality Gate failed Quality Gate failed

Failed conditions
7.04% Technical Debt Ratio on New Code (required ≤ 4%)
B Maintainability Rating on New Code (required ≥ A)

See analysis details on SonarQube

Catch issues before they fail your Quality Gate with our IDE extension SonarQube IDE SonarQube IDE

@trunk-io

trunk-io Bot commented Jun 12, 2026

Copy link
Copy Markdown

Static BadgeStatic BadgeStatic BadgeStatic Badge

Failed Test Failure Summary Logs
TestWSServer_WSClient_DefaultConfig_Failure The WebSocket server failed to establish a handshake due to a read limit exceeded error, causing the test to fail. Logs ↗︎

View Full Report ↗︎Docs

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants