Skip to content

Chore/decouple hashi executor#445

Open
mani99brar wants to merge 10 commits intodevfrom
chore/decouple-hashi-executor
Open

Chore/decouple hashi executor#445
mani99brar wants to merge 10 commits intodevfrom
chore/decouple-hashi-executor

Conversation

@mani99brar
Copy link
Copy Markdown
Contributor

@mani99brar mani99brar commented Apr 27, 2026

PR-Codex overview

This PR focuses on enhancing the relayer-cli by updating state management, improving message execution handling, and refining the code structure for better maintainability and clarity.

Detailed summary

  • Added timestamp and nonce fields to various state JSON files.
  • Updated HashiMessageExecutionVars to include timestamp.
  • Introduced new bot events for message failing and indexing.
  • Refactored state file functions to handle pending messages.
  • Improved message execution logic to handle THRESHOLD_NOT_MET status.
  • Simplified state file updates by removing hashiBlockNumber.
  • Enhanced tests to cover new functionalities and edge cases.

✨ Ask PR-Codex anything about this PR by commenting with /codex {your question}

Summary by CodeRabbit

  • New Features

    • Added Arbitrum One → Story bridge route
    • Persistent relayer state and pending-message queuing across runs
  • Improvements

    • More robust batch execution: per-message checks, failing messages excluded and reported
    • Improved indexing with capped ranges and per-message timestamps
    • New events for indexing progress and message failure; improved local logging visibility

@netlify
Copy link
Copy Markdown

netlify Bot commented Apr 27, 2026

Deploy Preview for veascan ready!

Name Link
🔨 Latest commit e6b40e7
🔍 Latest deploy log https://app.netlify.com/projects/veascan/deploys/69f1f5e3799ed90008cd7195
😎 Deploy Preview https://deploy-preview-445--veascan.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Apr 27, 2026

Walkthrough

Integrates lock-backed state files for Hashi runs, adds pending-message queuing with timestamps and time-window logic, moves nonce initialization to non-Hashi path, introduces per-message static-call filtering with a HASHI_MESSAGE_FAILING event, and updates logging/events and related tests/types/state files.

Changes

Cohort / File(s) Summary
Hashi executor core
relayer-cli/src/utils/hashi.ts, relayer-cli/src/utils/hashi.test.ts
Adds state-file start-block lookup, merges indexed and stored pending messages, persists pending state, enqueues THRESHOLD_NOT_MET messages within time window, adds per-message staticCall filtering (emit HASHI_MESSAGE_FAILING), and expands tests for state-file and pending-life-cycle behavior.
State file utilities
relayer-cli/src/utils/hashiHelpers/stateFile.ts, relayer-cli/state/*
New module to claim locks, initialize/read/update per-network/chain JSON state (ts, hashiBlockNumber, hashiMessages), read pending messages, and write updates; adds multiple new state JSON files and updates existing non-Hashi files to drop hashiBlockNumber.
Relayer flow / entry
relayer-cli/src/relayer.ts, relayer-cli/src/utils/relayerHelpers.ts, relayer-cli/src/utils/relayerHelpers.test.ts
Moves nonce initialization into non-Hashi execution path; removes hashiBlockNumber persistence from generic state helpers and adjusts initialize/updateStateFile signatures and tests accordingly.
Events & logging
relayer-cli/src/utils/botEvents.ts, relayer-cli/src/utils/logger.ts
Adds HASHI_MESSAGE_FAILING and INDEXING events; replaces Logtail gating with LOCAL_DEPLOY branch and attaches listeners to emit warn/debug logs for the new events.
Types & bridge config
relayer-cli/src/utils/hashiHelpers/hashiTypes.ts, relayer-cli/src/utils/hashiHelpers/bridgeRoutes.ts
Adds timestamp: number to HashiMessageExecutionVars; adds a bridge entry for chain pair 42161→1514 with RPC and contract addresses.

Sequence Diagram

sequenceDiagram
    participant RC as Relayer (Main Loop)
    participant HE as Hashi Executor
    participant SF as State File
    participant BE as Blockchain RPC
    participant EM as Event Emitter

    RC->>HE: runHashiExecutor(args)
    HE->>SF: getStartBlockNumber(chainId, network)
    SF->>EM: emit(LOCK_CLAIMED)
    SF-->>HE: hashiBlockNumber

    HE->>SF: readPendingMessages(chainId, network)
    SF-->>HE: stored pending messages

    HE->>BE: getAllMessageDispatchedLogs(fromBlock..toBlock)
    EM->>EM: emit(INDEXING)
    BE-->>HE: logs (with timestamps)

    HE->>HE: determine isMessageExecutable for each
    HE->>HE: enqueue THRESHOLD_NOT_MET within MAX_PENDING_TIME
    HE->>HE: merge new + stored pending

    alt no executable messages
        HE->>SF: updateHashiStateFile(...pending...)
        SF->>EM: emit(LOCK_RELEASED)
    else executable messages
        HE->>BE: staticCall per message (pre-filter)
        BE-->>HE: staticCall results
        HE->>EM: emit(HASHI_MESSAGE_FAILING) for failing msgs
        HE->>BE: executeBatchOnHashi(filteredMessages)
        BE-->>HE: tx submitted
        HE->>SF: updateHashiStateFile(...pending...)
        SF->>EM: emit(LOCK_RELEASED)
    end

    HE-->>RC: return result
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • Feat/relayer tests #395: Overlapping changes to event-driven state-file/init/update flow and BotEvents/logger integrations that touch initialize/updateStateFile signatures.

Suggested reviewers

  • alcercu
  • jaybuidl

Poem

🐇 I dug a tiny file in dirt and code,
Tucked timestamps, blocks, and messages in a row,
I sniffed each call and filtered out the bad,
Saved pending friends until they were not sad,
The relayer hops on—forward we go! 🚀

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive The title 'Chore/decouple hashi executor' is somewhat vague and generic. While it mentions 'decouple hashi executor,' the substantial scope of changes includes state file refactoring, pending message queuing, new bot events, logging improvements, and test updates—none of which are clearly reflected in the title. Consider a more descriptive title such as 'Refactor Hashi executor state management and message handling' or 'Decouple Hashi executor with state file integration and pending message queue' to better capture the full scope of changes.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/decouple-hashi-executor

Review rate limit: 4/5 reviews remaining, refill in 12 minutes.

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

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: 6

🧹 Nitpick comments (1)
relayer-cli/state/hashi_10200.json (1)

2-4: Prefer template defaults for committed Hashi state

Line 3 (hashiBlockNumber) and Line 4 (hashiMessages) are runtime progression state. Consider committing a template/default file and keeping live state files git-ignored to avoid environment-coupled replay checkpoints.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@relayer-cli/state/hashi_10200.json` around lines 2 - 4, The committed file
relayer-cli/state/hashi_10200.json contains runtime fields (hashiBlockNumber,
hashiMessages, ts) that should not be committed as live state; replace this with
a template (e.g., relayer-cli/state/hashi_10200.template.json) containing
neutral defaults (null/0/empty array for hashiBlockNumber, hashiMessages and a
placeholder ts) and add the live state path/pattern (relayer-cli/state/*.json or
the specific hashi_10200.json) to .gitignore so runtime updates are not tracked;
update any code or docs that reference the file name to point at the template
for initial values.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@relayer-cli/src/utils/hashi.ts`:
- Around line 175-188: The current loop treats every staticCall failure as a
permanent bad message and swallows transient RPC errors; update the loop around
yaru.executeMessages.staticCall so it distinguishes business-logic reverts from
transient/provider failures: call yaru.executeMessages.staticCall([message])
inside try, on success push to filteredMessages; in catch, inspect the error
(e.g., error.message contains "revert" / "execution reverted" or error.code ===
"CALL_EXCEPTION" / provider-specific revert indicator) and only for those known
revert cases emit BotEvents.HASHI_MESSAGE_FAILING and continue, otherwise
rethrow the error so the cycle aborts and the transient failure can be retried;
keep references to filteredMessages, emitter.emit,
BotEvents.HASHI_MESSAGE_FAILING and yaru.executeMessages.staticCall to locate
the code.
- Around line 71-83: The branch in the loop over txns drops messages with status
THRESHOLD_NOT_MET because isMessageExecutable can return that state but
toExecuteMessage currently only produces EXECUTABLE/EXECUTED, so
threshold-not-met messages never land in pendingMessages; update
toExecuteMessage (and/or isMessageExecutable's mapping) to return a proper
HashiExecutionStatus.THRESHOLD_NOT_MET case and ensure the calling loop (where
executableMessages and pendingMessages are appended) treats THRESHOLD_NOT_MET as
a valid non-executable pending state (respecting MAX_PENDING_TIME_SECONDS) so
those tx objects are pushed into pendingMessages instead of being skipped.
Ensure you reference the same HashiExecutionStatus enum values and the functions
isMessageExecutable and toExecuteMessage so the mapping and loop remain
consistent.
- Around line 291-293: The loop that accumulates logs uses the condition
all.length <= MAX_BATCH_SIZE which allows one extra fetch; change the loop guard
in the function that iterates blocks (the while using start, toBlock, and all)
to use all.length < MAX_BATCH_SIZE and also, when appending fetched logs to all,
trim the appended batch to at most (MAX_BATCH_SIZE - all.length) to guarantee we
never exceed MAX_BATCH_SIZE.

In `@relayer-cli/src/utils/hashiHelpers/stateFile.ts`:
- Around line 33-36: getStartBlockNumber() currently acquires the lock but then
calls syncStateFile() when the state file is missing; syncStateFile() ->
updateHashiStateFile() releases that lock, leaving a race where another executor
can start. Fix by keeping the lock held for the full bootstrap: modify
updateHashiStateFile() (and transitively syncStateFile()) to accept a flag like
retainLock/keepLock (default false) and when calling from getStartBlockNumber()
pass true so the lock is not released until after bootstrap/indexing completes,
or alternatively move the lock release out of updateHashiStateFile() and perform
it only in the caller (getStartBlockNumber()) after syncStateFile() returns;
ensure the same lock variable used by getStartBlockNumber(), syncStateFile(),
and updateHashiStateFile() is respected.
- Around line 74-79: The write of chain_state_file fails because JSON.stringify
on hashiMessages (HashiMessageExecutionVars) contains messageId: bigint; update
the serialization so bigints are converted before writing: either map
hashiMessages to a serializable form (replace messageId with
messageId.toString()) or pass a JSON.stringify replacer that converts bigint to
string, then call fileSystem.writeFileSync with the sanitized JSON; modify the
code around hashiMessages / fileSystem.writeFileSync to perform this
transformation so pending messages don't crash serialization.

In `@relayer-cli/state/testnet_10200.json`:
- Line 3: The committed default state sets the JSON key "nonce" to 12 which can
cause startup nonce drift; update the default value of "nonce" in the testnet
state file from 12 to 0 so fresh setups start with a neutral committed nonce and
let the runtime/environment manage actual nonces.

---

Nitpick comments:
In `@relayer-cli/state/hashi_10200.json`:
- Around line 2-4: The committed file relayer-cli/state/hashi_10200.json
contains runtime fields (hashiBlockNumber, hashiMessages, ts) that should not be
committed as live state; replace this with a template (e.g.,
relayer-cli/state/hashi_10200.template.json) containing neutral defaults
(null/0/empty array for hashiBlockNumber, hashiMessages and a placeholder ts)
and add the live state path/pattern (relayer-cli/state/*.json or the specific
hashi_10200.json) to .gitignore so runtime updates are not tracked; update any
code or docs that reference the file name to point at the template for initial
values.
🪄 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: CHILL

Plan: Pro

Run ID: fb7e97eb-847e-4ab2-b58a-775ab6914c86

📥 Commits

Reviewing files that changed from the base of the PR and between f0be2a1 and 8fee732.

📒 Files selected for processing (20)
  • relayer-cli/src/relayer.ts
  • relayer-cli/src/utils/botEvents.ts
  • relayer-cli/src/utils/hashi.test.ts
  • relayer-cli/src/utils/hashi.ts
  • relayer-cli/src/utils/hashiHelpers/bridgeRoutes.ts
  • relayer-cli/src/utils/hashiHelpers/hashiTypes.ts
  • relayer-cli/src/utils/hashiHelpers/stateFile.ts
  • relayer-cli/src/utils/logger.ts
  • relayer-cli/src/utils/relayerHelpers.test.ts
  • relayer-cli/src/utils/relayerHelpers.ts
  • relayer-cli/state/devnet_10200.json
  • relayer-cli/state/devnet_11155111.json
  • relayer-cli/state/hashi_10200.json
  • relayer-cli/state/hashi_11155111.json
  • relayer-cli/state/hashi_1514.json
  • relayer-cli/state/hashi_42161.json
  • relayer-cli/state/testnet_10200.json
  • relayer-cli/state/testnet_11155111.json
  • relayer-cli/state/testnet_1514.json
  • relayer-cli/state/testnet_42161.json

Comment thread relayer-cli/src/utils/hashi.ts
Comment thread relayer-cli/src/utils/hashi.ts
Comment thread relayer-cli/src/utils/hashi.ts
Comment thread relayer-cli/src/utils/hashiHelpers/stateFile.ts Outdated
Comment thread relayer-cli/src/utils/hashiHelpers/stateFile.ts Outdated
Comment thread relayer-cli/state/testnet_10200.json
coderabbitai[bot]
coderabbitai Bot previously approved these changes Apr 29, 2026
@sonarqubecloud
Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
1 Security Hotspot
0.0% Coverage on New Code (required ≥ 80%)

See analysis details on SonarQube Cloud

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: 1

🧹 Nitpick comments (5)
relayer-cli/src/utils/hashi.ts (1)

104-108: Prefer .at(-1) for accessing the last element.

Per static analysis, using .at(-1) is cleaner and more idiomatic than [length - 1].

Suggested fix
   emitter.emit(
     BotEvents.EXECUTING_HASHI,
     executableMessages[0].nonce,
-    executableMessages[executableMessages.length - 1].nonce
+    executableMessages.at(-1)!.nonce
   );
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@relayer-cli/src/utils/hashi.ts` around lines 104 - 108, Replace the manual
last-element access with .at(-1): in the emitter.emit call that uses
BotEvents.EXECUTING_HASHI and the array executableMessages, change the second
argument from executableMessages[executableMessages.length - 1].nonce to
executableMessages.at(-1).nonce so you access the final message idiomatically;
keep the first argument as executableMessages[0].nonce and leave the event name
emitter.emit(BotEvents.EXECUTING_HASHI, ...) intact.
relayer-cli/src/utils/hashiHelpers/stateFile.ts (4)

74-74: Use path.join for consistent path construction.

Line 32 uses path.join(stateDir, ...) but this line uses string concatenation. This inconsistency could cause issues with trailing slashes or cross-platform path handling.

Suggested fix
-  const chain_state_file = process.env.STATE_DIR + network + "_" + chainId + ".json";
+  const chain_state_file = path.join(stateDir, `${network}_${chainId}.json`);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@relayer-cli/src/utils/hashiHelpers/stateFile.ts` at line 74, The code
constructs chain_state_file using string concatenation which can break on
different OSes; update the assignment for chain_state_file to use path.join
(like the other usage of path.join(stateDir, ...)) by importing/using the path
module and building the filename from STATE_DIR (process.env.STATE_DIR or
stateDir), network and chainId (e.g., path.join(stateDir,
`${network}_${chainId}.json`)) so path handling is consistent across platforms.

40-41: Use bigIntReviver for consistent JSON parsing.

readPendingMessages (Line 109) uses bigIntReviver, but this parse does not. While currently only hashiBlockNumber is read (a regular number), adding the reviver maintains consistency and prevents future bugs if other fields are accessed.

Suggested fix
   const chain_state_raw = fileSystem.readFileSync(stateFile, { encoding: "utf8" });
-  const chain_state = JSON.parse(chain_state_raw);
+  const chain_state = JSON.parse(chain_state_raw, bigIntReviver);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@relayer-cli/src/utils/hashiHelpers/stateFile.ts` around lines 40 - 41, The
JSON.parse call that creates chain_state from chain_state_raw should use the
existing bigIntReviver for consistent bigint handling; update the parse in
stateFile.ts where chain_state and chain_state_raw are defined to call
JSON.parse(chain_state_raw, bigIntReviver) so it matches readPendingMessages and
prevents future bigint parsing issues (refer to the bigIntReviver symbol and the
readPendingMessages usage as the pattern to follow).

1-7: Clean up imports and prefer node: prefix.

Per static analysis:

  • HashiMessage is imported but unused
  • Prefer node:fs, node:path, node:events over bare module names
  • Consider using import 'dotenv/config' instead of require("dotenv").config() for ESM consistency
Suggested fix
-import * as fs from "fs";
-import * as path from "path";
-import { EventEmitter } from "events";
+import * as fs from "node:fs";
+import * as path from "node:path";
+import { EventEmitter } from "node:events";
 import { claimLock, releaseLock } from "../lock";
 import { BotEvents } from "../botEvents";
-import { HashiMessage, HashiMessageExecutionVars } from "./hashiTypes";
-require("dotenv").config();
+import { HashiMessageExecutionVars } from "./hashiTypes";
+import "dotenv/config";
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@relayer-cli/src/utils/hashiHelpers/stateFile.ts` around lines 1 - 7, Remove
the unused HashiMessage import and switch to node-prefixed core imports: replace
"fs" with "node:fs", "path" with "node:path", and "events" with "node:events"
while keeping EventEmitter; keep imports for claimLock, releaseLock, BotEvents
and HashiMessageExecutionVars as needed; and replace require("dotenv").config()
with a top-level ESM import 'dotenv/config' to maintain ESM consistency in
stateFile.ts.

59-69: Consider using an options object to reduce parameter count.

The function has 9 parameters (SonarCloud flags max 7). Grouping optional/DI parameters into an options object improves readability and makes adding new options easier.

Example refactor
interface UpdateStateOptions {
  isIniting?: boolean;
  fileSystem?: typeof fs;
  removeLock?: typeof releaseLock;
}

async function updateHashiStateFile(
  chainId: number,
  createdTimestamp: number,
  hashiBlockNumberFrom: number,
  hashiMessages: HashiMessageExecutionVars[],
  network: string,
  emitter: EventEmitter,
  options: UpdateStateOptions = {}
) {
  const { isIniting = false, fileSystem = fs, removeLock = releaseLock } = options;
  // ...
}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@relayer-cli/src/utils/hashiHelpers/stateFile.ts` around lines 59 - 69, The
updateHashiStateFile function currently accepts nine parameters; refactor it to
accept the required params (chainId, createdTimestamp, hashiBlockNumberFrom,
hashiMessages, network, emitter) and a single options object for the
remaining/DI params (isIniting, fileSystem, removeLock). Change the signature of
updateHashiStateFile to take an options parameter (e.g., UpdateStateOptions)
with defaults for isIniting = false, fileSystem = fs, and removeLock =
releaseLock, then destructure those defaults at the top of the function and
replace usages of the original parameters with the destructured names throughout
the body so callers pass an options object instead of multiple trailing args.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@relayer-cli/src/utils/hashiHelpers/stateFile.ts`:
- Around line 81-84: The code currently emits BotEvents.LOCK_RELEASED regardless
of whether the lock was actually removed; update the logic so that
emitter.emit(BotEvents.LOCK_RELEASED) only runs when the lock is released (i.e.,
inside the same conditional that calls removeLock when isIniting is false).
Locate the isIniting check and removeLock(network, chainId) call and move or add
the emitter.emit(BotEvents.LOCK_RELEASED) into that branch so the event is not
emitted when isIniting is true.

---

Nitpick comments:
In `@relayer-cli/src/utils/hashi.ts`:
- Around line 104-108: Replace the manual last-element access with .at(-1): in
the emitter.emit call that uses BotEvents.EXECUTING_HASHI and the array
executableMessages, change the second argument from
executableMessages[executableMessages.length - 1].nonce to
executableMessages.at(-1).nonce so you access the final message idiomatically;
keep the first argument as executableMessages[0].nonce and leave the event name
emitter.emit(BotEvents.EXECUTING_HASHI, ...) intact.

In `@relayer-cli/src/utils/hashiHelpers/stateFile.ts`:
- Line 74: The code constructs chain_state_file using string concatenation which
can break on different OSes; update the assignment for chain_state_file to use
path.join (like the other usage of path.join(stateDir, ...)) by importing/using
the path module and building the filename from STATE_DIR (process.env.STATE_DIR
or stateDir), network and chainId (e.g., path.join(stateDir,
`${network}_${chainId}.json`)) so path handling is consistent across platforms.
- Around line 40-41: The JSON.parse call that creates chain_state from
chain_state_raw should use the existing bigIntReviver for consistent bigint
handling; update the parse in stateFile.ts where chain_state and chain_state_raw
are defined to call JSON.parse(chain_state_raw, bigIntReviver) so it matches
readPendingMessages and prevents future bigint parsing issues (refer to the
bigIntReviver symbol and the readPendingMessages usage as the pattern to
follow).
- Around line 1-7: Remove the unused HashiMessage import and switch to
node-prefixed core imports: replace "fs" with "node:fs", "path" with
"node:path", and "events" with "node:events" while keeping EventEmitter; keep
imports for claimLock, releaseLock, BotEvents and HashiMessageExecutionVars as
needed; and replace require("dotenv").config() with a top-level ESM import
'dotenv/config' to maintain ESM consistency in stateFile.ts.
- Around line 59-69: The updateHashiStateFile function currently accepts nine
parameters; refactor it to accept the required params (chainId,
createdTimestamp, hashiBlockNumberFrom, hashiMessages, network, emitter) and a
single options object for the remaining/DI params (isIniting, fileSystem,
removeLock). Change the signature of updateHashiStateFile to take an options
parameter (e.g., UpdateStateOptions) with defaults for isIniting = false,
fileSystem = fs, and removeLock = releaseLock, then destructure those defaults
at the top of the function and replace usages of the original parameters with
the destructured names throughout the body so callers pass an options object
instead of multiple trailing args.
🪄 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: CHILL

Plan: Pro

Run ID: dbfd58f8-3100-4ddc-9c5f-d6355a86cfe2

📥 Commits

Reviewing files that changed from the base of the PR and between 8fee732 and e6b40e7.

📒 Files selected for processing (2)
  • relayer-cli/src/utils/hashi.ts
  • relayer-cli/src/utils/hashiHelpers/stateFile.ts

Comment thread relayer-cli/src/utils/hashiHelpers/stateFile.ts
@mani99brar mani99brar marked this pull request as ready for review April 29, 2026 12:42
@mani99brar mani99brar requested a review from jaybuidl as a code owner April 29, 2026 12:42
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