Skip to content

Onchain event handler preconditions#1843

Merged
tk-o merged 14 commits intomainfrom
feat/onchain-event-handler-preconditions
Apr 2, 2026
Merged

Onchain event handler preconditions#1843
tk-o merged 14 commits intomainfrom
feat/onchain-event-handler-preconditions

Conversation

@tk-o
Copy link
Copy Markdown
Contributor

@tk-o tk-o commented Mar 30, 2026

Lite PR

Tip: Review docs on the ENSNode PR process

Summary

  • Created ensRainbowClient singleton for modules in the ENSIndexer app to use.
    • See apps/ensindexer/src/lib/ensrainbow/singleton.ts
  • Implemented waitForEnsRainbowToBeReady function to enable waiting with certain code execution untli the ENSRainbow instance is ready to serve traffic.
    • See apps/ensindexer/src/lib/ensrainbow/singleton.ts
  • Implemented eventHandlerPrecondtions function to prevent indexing onchain events before waitForEnsRainbowToBeReady resolves. Please note how processing "setup" events is unaffected.
    • See apps/ensindexer/src/lib/indexing-engines/ponder.ts

Why


Testing

  • I ran static code checks, and exteded testing suite.
  • I ran ENSIndexer instance locally, with the ENSRainbow instance being unavailable. Then, after serveral retries, I started the ENSRainbow instance and observed how ENSIndexer was able to begin indexing right after detecting that ENSRainbow was ready to serve HTTP traffic.
    • Running this test required modifying the ENSDb Writer Worker implementation to avoid ENSIndexer app crashing while trying to build the ENSIndexer Public Config object with no ensRainbowPublicConfig object available.
Test logs from ENSIndexer
Running database migrations for ENSNode Schema in ENSDb.
09:41:39.839 INFO  Created HTTP server port=42069 (13ms)
09:41:39.839 INFO  Started returning 200 responses endpoint=/health
Database migrations for ENSNode Schema in ENSDb completed successfully.
[EnsDbWriterWorker]: Upserting ENSDb version into ENSDb...
[EnsDbWriterWorker]: ENSDb version upserted successfully: 1.9.0
[EnsDbWriterWorker]: Upserting ENSIndexer Public Config into ENSDb...
[EnsDbWriterWorker]: ENSIndexer Public Config upserted successfully
09:41:40.079 INFO  Started backfill indexing chain=421614 block_range=[123142726,254959863]
09:41:40.079 INFO  Started backfill indexing chain=11155420 block_range=[23770766,41526949]
09:41:40.079 INFO  Started backfill indexing chain=11155111 block_range=[3702721,10552128]
09:41:40.079 INFO  Started backfill indexing chain=534351 block_range=[8175276,17482817]
09:41:40.079 INFO  Started backfill indexing chain=84532 block_range=[13012458,39544075]
09:41:40.079 INFO  Started backfill indexing chain=59141 block_range=[2395094,27904262]
09:41:40.080 INFO  Started fetching backfill JSON-RPC data chain=421614 cached_block=254959811 cache_rate=100%
09:41:40.080 INFO  Started fetching backfill JSON-RPC data chain=11155420 cached_block=41526942 cache_rate=100%
09:41:40.080 INFO  Started fetching backfill JSON-RPC data chain=11155111 cached_block=10552126 cache_rate=100%
09:41:40.080 INFO  Started fetching backfill JSON-RPC data chain=534351 cached_block=17482815 cache_rate=100%
09:41:40.080 INFO  Started fetching backfill JSON-RPC data chain=84532 cached_block=39544015 cache_rate=100%
09:41:40.080 INFO  Skipped fetching backfill JSON-RPC data (cache contains all required data) chain=59141 cached_block=27904262 cache_rate=100%
09:41:40.274 INFO  Finished fetching backfill JSON-RPC data chain=11155420 (195ms)
09:41:40.295 INFO  Finished fetching backfill JSON-RPC data chain=534351 (215ms)
Waiting for ENSRainbow instance to be ready at 'http://localhost:3223/'...
ENSRainbow health check attempt 1 failed (fetch failed). 12 retries left.
09:41:40.368 INFO  Finished fetching backfill JSON-RPC data chain=421614 (289ms)
09:41:40.369 INFO  Finished fetching backfill JSON-RPC data chain=11155111 (290ms)
09:41:41.100 INFO  Finished fetching backfill JSON-RPC data chain=84532 (1s)
ENSRainbow health check attempt 2 failed (fetch failed). 11 retries left.
09:41:45.079 INFO  Updated backfill indexing progress progress=0.0%
ENSRainbow health check attempt 3 failed (fetch failed). 10 retries left.
ENSRainbow health check attempt 4 failed (fetch failed). 9 retries left.
09:41:50.078 INFO  Updated backfill indexing progress progress=0.0%
09:41:55.078 INFO  Updated backfill indexing progress progress=0.0%
ENSRainbow instance is ready at 'http://localhost:3223/'.
09:41:58.671 INFO  Indexed block range chain=11155111 event_count=2872 block_range=[3702721,4095260] (18s)
09:41:59.200 INFO  Indexed block range chain=11155111 event_count=2892 block_range=[4095261,4212765] (526ms)
09:41:59.836 INFO  Indexed block range chain=11155111 event_count=2758 block_range=[4212766,4282224] (633ms)
09:42:00.079 INFO  Updated backfill indexing progress progress=9.3%

Notes for Reviewer (Optional)


Pre-Review Checklist (Blocking)

  • This PR does not introduce significant changes and is low-risk to review quickly.
    • The change is small, but significant in consequences. We're adding a way to execute some logic before each event handler. This is a great responsibility not to introduce any logic that may extend indexing
  • Relevant changesets are included (or are not required)

Copilot AI review requested due to automatic review settings March 30, 2026 08:08
@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Mar 30, 2026

🦋 Changeset detected

Latest commit: b78f2ce

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 23 packages
Name Type
ensindexer Major
ensadmin Major
ensrainbow Major
ensapi Major
fallback-ensapi Major
enssdk Major
enscli Major
enskit Major
ensskills Major
@ensnode/datasources Major
@ensnode/ensrainbow-sdk Major
@ensnode/ensdb-sdk Major
@ensnode/ensnode-react Major
@ensnode/ensnode-sdk Major
@ensnode/ponder-sdk Major
@ensnode/ponder-subgraph Major
@ensnode/shared-configs Major
@docs/ensnode Major
@docs/ensrainbow Major
@docs/mintlify Major
@namehash/ens-referrals Major
@namehash/namehash-ui Major
@ensnode/integration-test-env Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel
Copy link
Copy Markdown
Contributor

vercel bot commented Mar 30, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

3 Skipped Deployments
Project Deployment Actions Updated (UTC)
admin.ensnode.io Skipped Skipped Apr 2, 2026 3:21pm
ensnode.io Skipped Skipped Apr 2, 2026 3:21pm
ensrainbow.io Skipped Skipped Apr 2, 2026 3:21pm

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Mar 30, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Centralized the ENSRainbow API client into a process-wide singleton, removed the factory, added a memoized readiness check with retries, and made onchain event handlers await ENSRainbow readiness (setup events bypass wait). Tests updated to mock and assert the new async precondition behavior.

Changes

Cohort / File(s) Summary
Changeset
\.changeset/sharp-moons-shave.md
Added a changeset marking a minor release and noting event-handler preconditions.
Factory removal
apps/ensindexer/src/lib/ensraibow-api-client.ts
Deleted the exported getENSRainbowApiClient() factory function.
Singleton & readiness
apps/ensindexer/src/lib/ensrainbow/singleton.ts
Added ensRainbowClient singleton and waitForEnsRainbowToBeReady() with memoized Promise, p-retry health checks (12 attempts), startup warning when using default endpoint, and wrapped error on final failure.
Client adoption
apps/ensindexer/src/lib/graphnode-helpers.ts, apps/ensindexer/src/lib/public-config-builder/singleton.ts
Replaced local client creation with the shared ensRainbowClient; updated calls (e.g., heal) and endpoint references to use the singleton.
Event preconditions & async handlers
apps/ensindexer/src/lib/indexing-engines/ponder.ts
Classified events (:setup vs onchain) and added eventHandlerPreconditions that await waitForEnsRainbowToBeReady() for onchain events; ponder.on callbacks made async to defer handler invocation.
Tests: preconditions & async handlers
apps/ensindexer/src/lib/indexing-engines/ponder.test.ts
Mocked waitForEnsRainbowToBeReady, converted tests to async (await callbacks / mockResolvedValue), adjusted assertions to rejects.toThrow, added coverage for precondition behavior and event-type distinctions.

Sequence Diagram(s)

sequenceDiagram
    participant Ponder as Ponder Event System
    participant Precond as Event Preconditions
    participant ENS as ENSRainbow Client
    participant Retry as p-retry
    participant Handler as Registered Event Handler

    Ponder->>Precond: eventHandlerPreconditions(eventName)
    alt Setup Event (ends with :setup)
        Precond->>Handler: invoke handler immediately
        Handler-->>Precond: result
    else Onchain Event
        Precond->>ENS: waitForEnsRainbowToBeReady()
        ENS->>Retry: perform health() with retries (up to 12)
        loop retry attempts
            Retry->>ENS: client.health()
            ENS-->>Retry: success / error
            Retry-->>Retry: log & decide retry
        end
        alt Ready
            Precond->>Handler: invoke handler
            Handler-->>Precond: result
        else Exhausted
            Retry-->>Precond: reject with Error (cause)
            Precond-->>Ponder: promise rejects (handler not invoked)
        end
    end
    Precond-->>Ponder: precondition resolved/rejected
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~50 minutes

Possibly related PRs

Poem

🐇 I hopped the code at break of dawn,
Found a singleton snug on the lawn.
"Wait for Rainbow," I softly say,
Retry the health till break of day.
Handlers cheer when the checks are gone. 🌈

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly and concisely summarizes the main change: introducing preconditions for onchain event handlers before they execute.
Description check ✅ Passed The description follows the template with all required sections complete: Summary (3 bullets with file references), Why (links to issue #1417), Testing (local integration test with logs), Notes (commit-by-commit review), and Pre-Review Checklist marked.
Docstring Coverage ✅ Passed Docstring coverage is 90.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/onchain-event-handler-preconditions

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@tk-o
Copy link
Copy Markdown
Contributor Author

tk-o commented Mar 30, 2026

@greptile review

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds an ENSRainbow client singleton and introduces an indexing “precondition” layer so onchain Ponder handlers wait for ENSRainbow readiness before executing, improving resiliency when ENSRainbow is temporarily unavailable.

Changes:

  • Introduced ensRainbowClient singleton + waitForEnsRainbowToBeReady() with shared retry/backoff.
  • Added event-handler preconditions in the Ponder indexing wrapper to block onchain handlers until ENSRainbow is ready (setup handlers bypass this).
  • Updated ENSRainbow client call sites and expanded unit tests to cover precondition behavior.

Reviewed changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 4 comments.

Show a summary per file
File Description
apps/ensindexer/src/lib/public-config-builder/singleton.ts Switches to the shared ENSRainbow singleton for public config construction.
apps/ensindexer/src/lib/indexing-engines/ponder.ts Adds event-type detection + precondition gating before handler execution.
apps/ensindexer/src/lib/indexing-engines/ponder.test.ts Updates tests for async callback behavior and adds precondition coverage.
apps/ensindexer/src/lib/graphnode-helpers.ts Migrates heal calls to the ENSRainbow singleton client.
apps/ensindexer/src/lib/ensrainbow/singleton.ts New singleton module with readiness-wait helper and retry logging.
apps/ensindexer/src/lib/ensraibow-api-client.ts Removes the old ENSRainbow client factory.
.changeset/sharp-moons-shave.md Declares a minor version bump for the resiliency change.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps bot commented Mar 30, 2026

Greptile Summary

This PR introduces a precondition gate that blocks onchain event handlers from executing until the ENSRainbow service is confirmed healthy, advancing the fix for issue #1417. It consolidates ENSRainbow client construction into a new apps/ensindexer/src/lib/ensrainbow/singleton.ts module (replacing the deleted ensraibow-api-client.ts) and wires waitForEnsRainbowToBeReady into addOnchainEventListener via the new eventHandlerPreconditions helper in ponder.ts.

Key aspects of the implementation:

  • Singleton client: ensRainbowClient is created once at module load; the default-endpoint warning is also emitted once, at import time.
  • Health polling: waitForEnsRainbowToBeReady uses pRetry with 60 retries at a fixed 60-second interval (~1 hour total window), appropriate for ENSRainbow cold-start scenarios.
  • Concurrent-safe caching: Both waitForEnsRainbowToBeReadyPromise (in singleton.ts) and indexingActivationPromise (in ponder.ts) cache the in-flight promise. A previous concern about concurrent onchain callbacks bypassing the wait has been resolved in this version: the switch statement's Onchain branch always reaches return await indexingActivationPromise, so every concurrent caller blocks on the same promise.
  • Setup events unaffected: Events whose name ends in :setup are routed to initializeIndexingSetup (currently empty, intentionally) and never await the ENSRainbow health check, preserving Ponder's startup metric population.
  • Test coverage: New test cases explicitly cover concurrent gating, setup-event bypass, error propagation, and event-type detection via vi.resetModules() isolation.

Confidence Score: 5/5

  • Safe to merge — all previously identified P1 concerns are resolved and no new blocking issues found.
  • The concurrent-handler bypass that was flagged in a prior round is definitively fixed: the Onchain branch of eventHandlerPreconditions always terminates with return await indexingActivationPromise, so every concurrent callback blocks on the same in-flight promise. All other prior concerns (redundant async, incomplete JSDoc, dynamic import) are also addressed. The one acknowledged trade-off (cached rejected promise relying on Ponder error propagation for process termination) is intentional and documented. Remaining findings are P2 comment-level nits that do not affect correctness.
  • No files require special attention; apps/ensindexer/src/lib/ensrainbow/singleton.ts has a very minor comment inaccuracy ("over 1 hour" should be "up to 1 hour") but is otherwise sound.

Important Files Changed

Filename Overview
apps/ensindexer/src/lib/ensrainbow/singleton.ts New singleton module: exports ensRainbowClient and waitForEnsRainbowToBeReady with pRetry-backed health polling (60 retries × 60 s ≈ 1 hour). Cached promise pattern is correct; the comment claiming "over 1 hour" is very slightly inaccurate (it's exactly ~60 min). Previously flagged concerns (redundant async, incomplete JSDoc, dynamic import) are resolved in this version.
apps/ensindexer/src/lib/indexing-engines/ponder.ts Adds EventTypeIds, eventHandlerPreconditions, and module-level promise caches. The concurrent-handler bypass issue raised in a prior review is now correctly fixed: both branches of the Onchain switch case terminate with return await indexingActivationPromise, so a second concurrent callback always awaits the in-flight promise rather than skipping it.
apps/ensindexer/src/lib/indexing-engines/ponder.test.ts Comprehensive test suite covering registration, context transformation, error propagation, ENSRainbow precondition gating, concurrent callback idempotency, setup-event bypass, and event-type detection. Tests use vi.resetModules() correctly to isolate module-level state between cases.
apps/ensindexer/src/lib/graphnode-helpers.ts Refactored to use the new ensRainbowClient singleton import instead of calling getENSRainbowApiClient(); also narrows response type to EnsRainbow.HealResponse. Existing pRetry usage is unchanged and functional.
apps/ensindexer/src/lib/public-config-builder/singleton.ts Trivial import swap: getENSRainbowApiClient()ensRainbowClient singleton; removes the local const ensRainbowClient alias.
apps/ensindexer/src/lib/ensraibow-api-client.ts File deleted; its responsibilities (client construction, default-endpoint warning) are now handled by the new ensrainbow/singleton.ts module-level code.

Sequence Diagram

sequenceDiagram
    participant Ponder
    participant addOnchainEventListener
    participant eventHandlerPreconditions
    participant initializeIndexingActivation
    participant waitForEnsRainbowToBeReady
    participant ENSRainbow

    Note over Ponder: Startup — setup events fire first
    Ponder->>addOnchainEventListener: Registry:setup event
    addOnchainEventListener->>eventHandlerPreconditions: Setup type
    eventHandlerPreconditions->>eventHandlerPreconditions: indexingSetupPromise === null → set & await (resolves immediately)
    eventHandlerPreconditions-->>addOnchainEventListener: resolved
    addOnchainEventListener->>addOnchainEventListener: run setup handler

    Note over Ponder: First onchain event — ENSRainbow may not be ready
    Ponder->>addOnchainEventListener: Resolver:AddrChanged (event A)
    addOnchainEventListener->>eventHandlerPreconditions: Onchain type
    eventHandlerPreconditions->>initializeIndexingActivation: indexingActivationPromise === null → initiate
    initializeIndexingActivation->>waitForEnsRainbowToBeReady: first call → start pRetry loop
    waitForEnsRainbowToBeReady->>ENSRainbow: health() attempt 1 — fails
    waitForEnsRainbowToBeReady->>ENSRainbow: health() attempt 2 — fails
    Note over waitForEnsRainbowToBeReady,ENSRainbow: … retries every 60s up to 60 times …

    Note over Ponder: Concurrent onchain event arrives while waiting
    Ponder->>addOnchainEventListener: Registry:Transfer (event B)
    addOnchainEventListener->>eventHandlerPreconditions: Onchain type
    eventHandlerPreconditions->>eventHandlerPreconditions: indexingActivationPromise !== null → await same promise (blocks)

    ENSRainbow-->>waitForEnsRainbowToBeReady: health() succeeds
    waitForEnsRainbowToBeReady-->>initializeIndexingActivation: resolved
    initializeIndexingActivation-->>eventHandlerPreconditions: resolved (both A & B unblock)
    eventHandlerPreconditions-->>addOnchainEventListener: resolved (event A)
    eventHandlerPreconditions-->>addOnchainEventListener: resolved (event B)
    addOnchainEventListener->>addOnchainEventListener: run handler A
    addOnchainEventListener->>addOnchainEventListener: run handler B

    Note over Ponder: All subsequent onchain events — indexingActivationPromise already resolved
    Ponder->>addOnchainEventListener: any onchain event
    addOnchainEventListener->>eventHandlerPreconditions: Onchain type
    eventHandlerPreconditions->>eventHandlerPreconditions: await cached resolved promise (fast path)
    eventHandlerPreconditions-->>addOnchainEventListener: resolved immediately
    addOnchainEventListener->>addOnchainEventListener: run handler
Loading

Reviews (5): Last reviewed commit: "Apply AI PR feedback" | Re-trigger Greptile

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@apps/ensindexer/src/lib/ensrainbow/singleton.ts`:
- Around line 50-58: The health check currently treats any fulfilled
ensRainbowClient.health() response as success; change the pRetry callback used
for waitForEnsRainbowToBeReadyPromise to parse and validate the response body
and throw unless it exactly matches { status: "ok" } (so pRetry will retry on
unexpected payloads); add import { z } from "zod" near the top or perform an
explicit equality check, validate the response inside the async function that
calls ensRainbowClient.health(), and only resolve/allow the .then() readiness
log when the validation passes (use the identifiers
waitForEnsRainbowToBeReadyPromise, pRetry, ensRainbowClient.health(), and
ensRainbowUrl to locate the code).

In `@apps/ensindexer/src/lib/indexing-engines/ponder.test.ts`:
- Around line 254-256: The test currently asserts await expect(callback({
context: mockContext, event: mockEvent })).resolves.not.toThrow(); but the
callback resolves to void; change the assertion to await expect(callback({
context: mockContext, event: mockEvent })).resolves.toBeUndefined() so the test
explicitly verifies the promise resolves to undefined; update the line using
mockPonderOn.mock.calls[0] and the extracted callback to use
resolves.toBeUndefined() when invoking callback with mockContext and mockEvent
(ENSRainbow-related behavior remains unchanged).
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 17de5765-4835-4c7e-b972-b4df11823062

📥 Commits

Reviewing files that changed from the base of the PR and between 495eca2 and 9ff175e.

📒 Files selected for processing (7)
  • .changeset/sharp-moons-shave.md
  • apps/ensindexer/src/lib/ensraibow-api-client.ts
  • apps/ensindexer/src/lib/ensrainbow/singleton.ts
  • apps/ensindexer/src/lib/graphnode-helpers.ts
  • apps/ensindexer/src/lib/indexing-engines/ponder.test.ts
  • apps/ensindexer/src/lib/indexing-engines/ponder.ts
  • apps/ensindexer/src/lib/public-config-builder/singleton.ts
💤 Files with no reviewable changes (1)
  • apps/ensindexer/src/lib/ensraibow-api-client.ts

tk-o added 4 commits March 30, 2026 10:33
This function will enbale ENSIndexer modules to wait for when the ENSRainbow instance is ready to serve traffic.
Allows to wait with indexing onchain events until ENSRainbow instance is ready.
@tk-o tk-o force-pushed the feat/onchain-event-handler-preconditions branch from 9ff175e to 911035a Compare March 30, 2026 08:39
@tk-o
Copy link
Copy Markdown
Contributor Author

tk-o commented Mar 30, 2026

@greptile review

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 7 changed files in this pull request and generated 1 comment.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copilot AI review requested due to automatic review settings March 31, 2026 10:12
@vercel vercel bot temporarily deployed to Preview – ensrainbow.io March 31, 2026 10:12 Inactive
@vercel vercel bot temporarily deployed to Preview – ensnode.io March 31, 2026 10:12 Inactive
@vercel vercel bot temporarily deployed to Preview – admin.ensnode.io March 31, 2026 10:12 Inactive
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 7 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Copy link
Copy Markdown
Member

@lightwalker-eth lightwalker-eth left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@tk-o Thanks for updates. Shared a few more suggestions 👍

@tk-o
Copy link
Copy Markdown
Contributor Author

tk-o commented Apr 2, 2026

@greptile revew

Copilot AI review requested due to automatic review settings April 2, 2026 15:20
@vercel vercel bot temporarily deployed to Preview – ensrainbow.io April 2, 2026 15:20 Inactive
@vercel vercel bot temporarily deployed to Preview – admin.ensnode.io April 2, 2026 15:20 Inactive
@vercel vercel bot temporarily deployed to Preview – ensnode.io April 2, 2026 15:20 Inactive
@tk-o
Copy link
Copy Markdown
Contributor Author

tk-o commented Apr 2, 2026

@greptile review

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 7 out of 7 changed files in this pull request and generated 2 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@tk-o tk-o merged commit 61d76b5 into main Apr 2, 2026
22 checks passed
@tk-o tk-o deleted the feat/onchain-event-handler-preconditions branch April 2, 2026 15:32
@github-actions github-actions bot mentioned this pull request Apr 2, 2026
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.

3 participants