-
Notifications
You must be signed in to change notification settings - Fork 6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat/bridger-cli #370
base: dev
Are you sure you want to change the base?
feat/bridger-cli #370
Conversation
WalkthroughThe pull request introduces significant enhancements to the Changes
Possibly related PRs
Suggested labels
Suggested reviewers
🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
❌ Deploy Preview for veascan failed. Why did it fail? →
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 16
🧹 Outside diff range and nitpick comments (11)
veascan-subgraph-outbox/src/VeaOutbox.ts (2)
Line range hint
29-35
: Fix similar loop decrement issue in handleChallengedThe
handleChallenged
function has the same loop decrement issue. The loop counter isn't being updated correctly.Apply this fix:
for ( let i = ref.totalClaims.minus(BigInt.fromI32(1)); i.ge(BigInt.fromI32(0)); - i.minus(BigInt.fromI32(1)) + i = i.minus(BigInt.fromI32(1)) ) {🧰 Tools
🪛 Biome (1.9.4)
[error] 70-70: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
Line range hint
63-79
: Consider extracting claim lookup logicBoth
handleVerified
andhandleChallenged
perform similar claim lookups by epoch. Consider extracting this into a shared utility function to improve maintainability and reduce code duplication.Here's a suggested implementation:
function findClaimByEpoch(epoch: BigInt): Claim | null { const ref = getRef(); for ( let i = ref.totalClaims.minus(BigInt.fromI32(1)); i.ge(BigInt.fromI32(0)); i = i.minus(BigInt.fromI32(1)) ) { const claim = Claim.load(i.toString()); if (claim && claim.epoch.equals(epoch)) { return claim; } } return null; }This would simplify both event handlers and ensure consistent claim lookup behavior.
🧰 Tools
🪛 Biome (1.9.4)
[error] 70-70: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
bridger-cli/src/utils/graphQueries.ts (2)
1-10
: Add JSDoc documentation and consider more specific typesThe interface looks well-structured, but could benefit from:
- JSDoc documentation explaining the purpose and constraints of each field
- More specific types for blockchain-related fields (e.g.,
stateroot
might be better typed as0x
-prefixed hex string)+/** Interface representing claim data from the subgraph */ interface ClaimData { + /** Unique identifier of the claim */ id: string; + /** Address of the bridger who made the claim */ - bridger: string; + bridger: `0x${string}`; + /** State root hash of the claim */ - stateroot: string; + stateroot: `0x${string}`; timestamp: number; challenged: boolean; - txHash: string; + txHash: `0x${string}`; }
1-87
: Consider architectural improvements for better maintainabilityTo improve the codebase architecture, consider:
Create a centralized GraphQL client configuration:
- Implement a singleton client with proper error handling
- Add retry mechanisms for failed requests
- Include proper timeout handling
Use a type-safe environment configuration:
- Consider using
zod
or similar for runtime validation- Create a centralized config module
Implement proper error handling:
- Create custom error classes
- Add proper error logging strategy
- Consider adding metrics for failed requests
Would you like me to provide example implementations for any of these suggestions?
bridger-cli/src/bridger.ts (1)
80-88
: Replacevar
withlet
orconst
for variable declarationsUsing
var
can lead to unexpected behavior due to function scoping and hoisting. It's recommended to uselet
orconst
for variable declarations to ensure block scoping and prevent potential bugs.Apply this diff to update variable declarations:
- var claim = { + let claim = { stateRoot: claimData.stateroot, claimer: claimData.bridger, timestampClaimed: claimData.timestamp, timestampVerification: 0, blocknumberVerification: 0, honest: 0, challenger: "0x0000000000000000000000000000000000000000", };And similarly for other instances in the code.
Also applies to: 268-276
bridger-cli/src/utils/bridger.test.ts (1)
132-184
: Consider splitting complex test cases into smaller, focused testsThe test case "should make new claim if last claim was challenged" covers multiple scenarios, making it complex and potentially harder to maintain. Splitting it into smaller, focused tests can improve readability and ease debugging.
contracts/docker-compose.yml (2)
75-75
: Consider platform compatibility for host.docker.internal
host.docker.internal
is not supported on all platforms. Consider making this configurable or using alternative networking approaches.Consider using environment variables for the Ethereum node URL:
- ethereum: mainnet:http://host.docker.internal:8546/ + ethereum: mainnet:${ETHEREUM_NODE_URL:-http://host.docker.internal:8546/}
57-57
: Fix trailing whitespaceRemove trailing whitespace from line 57.
- - "8545:8545" + - "8545:8545"🧰 Tools
🪛 yamllint (1.35.1)
[error] 57-57: trailing spaces
(trailing-spaces)
veascan-subgraph-inbox/src/VeaInbox.ts (1)
118-125
: Improve null safety handling and error reportingWhile the null check for
snapshot.epoch
is good, there are a few improvements we can make:
- Use optional chaining for better readability
- Add error handling for when no matching snapshot is found
Consider this improvement:
- if (snapshot && snapshot.epoch) { - if (BigInt.compare(snapshot.epoch as BigInt, epochSent) == 0) { - // Snapshot found, update resolving field and save - snapshot.resolving = true; - snapshot.save(); - fallback.snapshot = snapshotId; - break; - } + if (snapshot?.epoch && BigInt.compare(snapshot.epoch, epochSent) === 0) { + // Snapshot found, update resolving field and save + snapshot.resolving = true; + snapshot.save(); + fallback.snapshot = snapshotId; + break; + } + // Add this after the loop to handle case when no snapshot is found + if (!fallback.snapshot) { + log.warning('No matching snapshot found for epoch {}', [epochSent.toString()]); }🧰 Tools
🪛 Biome (1.9.4)
[error] 118-118: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
contracts/Dockerfile (1)
9-14
: Add .dockerignore and optimize COPY operationsTo prevent unnecessary files from being copied and to maintain clean builds:
- Create a .dockerignore file
- Optimize the COPY operations
Create a
.dockerignore
file with:node_modules .git *.md .env*
Then optimize the COPY operations:
-COPY . . -COPY start-forks.sh /start-forks.sh +COPY --chown=appuser:appgroup . .bridger-cli/src/consts/bridgeRoutes.ts (1)
3-8
: Add JSDoc documentation for the interface and its propertiesThe interface defines critical bridge parameters but lacks documentation explaining the purpose and constraints of each property. Consider adding JSDoc comments to improve maintainability.
+/** + * Interface defining the configuration parameters for a bridge + */ interface IBridge { + /** Duration of an epoch in seconds */ epochPeriod: number; + /** Required deposit amount in wei */ deposit: BigNumber; + /** Minimum period for challenges in seconds */ minChallengePeriod: number; + /** Maximum allowed sequencer delay in seconds */ sequencerDelayLimit: number; }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
⛔ Files ignored due to path filters (1)
yarn.lock
is excluded by!**/yarn.lock
,!**/*.lock
📒 Files selected for processing (15)
bridger-cli/.env.dist
(1 hunks)bridger-cli/package.json
(1 hunks)bridger-cli/src/bridger.ts
(1 hunks)bridger-cli/src/consts/bridgeRoutes.ts
(1 hunks)bridger-cli/src/utils/bridger.test.ts
(1 hunks)bridger-cli/src/utils/ethers.ts
(1 hunks)bridger-cli/src/utils/graphQueries.ts
(1 hunks)bridger-cli/tsconfig.json
(1 hunks)contracts/Dockerfile
(1 hunks)contracts/docker-compose.yml
(1 hunks)contracts/initGraphDB.sql
(1 hunks)contracts/start-forks.sh
(1 hunks)package.json
(1 hunks)veascan-subgraph-inbox/src/VeaInbox.ts
(1 hunks)veascan-subgraph-outbox/src/VeaOutbox.ts
(1 hunks)
✅ Files skipped from review due to trivial changes (4)
- contracts/initGraphDB.sql
- bridger-cli/tsconfig.json
- bridger-cli/.env.dist
- bridger-cli/package.json
🧰 Additional context used
🪛 Biome (1.9.4)
veascan-subgraph-inbox/src/VeaInbox.ts
[error] 118-118: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
veascan-subgraph-outbox/src/VeaOutbox.ts
[error] 70-70: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
🪛 yamllint (1.35.1)
contracts/docker-compose.yml
[error] 57-57: trailing spaces
(trailing-spaces)
🪛 GitHub Check: Scorecard
contracts/Dockerfile
[warning] 1-1: Pinned-Dependencies
score is 7: containerImage not pinned by hash
Remediation tip: pin your Docker image by updating node to node@sha256:97cc66381c956b1df1a6b14f733f882cd0305867ea01dfdb924f0f62585f2904
Click Remediation section below for further remediation help
🔇 Additional comments (5)
veascan-subgraph-outbox/src/VeaOutbox.ts (1)
70-72
: Improved null safety in claim verification
The code now properly checks for claim existence before accessing it, making it more robust against potential runtime errors. The initialization of the Verification entity is also safer.
🧰 Tools
🪛 Biome (1.9.4)
[error] 70-70: Change to an optional chain.
Unsafe fix: Change to an optional chain.
(lint/complexity/useOptionalChain)
bridger-cli/src/utils/ethers.ts (1)
59-72
:
Handle unsupported chainId
in getVeaOutboxDevnetProvider
function
The getVeaOutboxDevnetProvider
function lacks an else
clause to handle unsupported chainId
values. This omission might result in returning undefined
without an error when an unsupported chainId
is provided.
Apply this diff to add error handling for unsupported chainId
:
function getVeaOutboxDevnetProvider(
veaOutboxAddress: string,
privateKey: string,
rpc: JsonRpcProvider,
chainId: number
) {
if (chainId == 11155111) {
return VeaOutboxArbToEthDevnet__factory.connect(veaOutboxAddress, getWalletRPC(privateKey, rpc));
} else if (chainId == 10200) {
return VeaOutboxArbToGnosisDevnet__factory.connect(veaOutboxAddress, getWalletRPC(privateKey, rpc));
+ } else {
+ throw new Error(`Unsupported chainId: ${chainId}`);
}
}
Likely invalid or redundant comment.
package.json (1)
19-19
: LGTM: Workspace addition is properly configured
The addition of "bridger-cli" to the workspaces array is correctly implemented and aligns with the PR objectives.
contracts/Dockerfile (1)
1-17
: Verify the exposed ports configuration
The Dockerfile exposes ports 8545 and 8546, which are typically used for Ethereum JSON-RPC endpoints. Let's verify if these ports align with the Hardhat configuration in the project.
✅ Verification successful
Let me gather more information about the network configuration and fork setup to better understand the port usage.
The exposed ports 8545 and 8546 are correctly configured
The exposed ports in the Dockerfile align perfectly with the project's configuration:
- Port 8545 is used for the Arbitrum Sepolia fork (NETWORK1)
- Port 8546 is used for the Sepolia fork (NETWORK2)
This is confirmed by:
- The
start-forks.sh
script which starts two Hardhat nodes on ports defined by$PORT1
(8545) and$PORT2
(8546) - The usage of these ports in test files (
bridger.test.ts
) - The Hardhat configuration supporting forking functionality
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Search for Hardhat network configurations and port settings
rg -A 5 "hardhat\.config"
rg "8545|8546" --type ts --type js
Length of output: 647
Script:
#!/bin/bash
# Check the start-forks script and any other relevant network configuration
cat contracts/start-forks.sh
rg "fork" --type ts --type js -A 5
Length of output: 1000
🧰 Tools
🪛 GitHub Check: Scorecard
[warning] 1-1: Pinned-Dependencies
score is 7: containerImage not pinned by hash
Remediation tip: pin your Docker image by updating node to node@sha256:97cc66381c956b1df1a6b14f733f882cd0305867ea01dfdb924f0f62585f2904
Click Remediation section below for further remediation help
bridger-cli/src/consts/bridgeRoutes.ts (1)
1-29
: Verify bridge configurations across the system
Let's ensure these bridge configurations are consistent with other parts of the system.
✅ Verification successful
Let me gather more specific information about the configurations in the related files to ensure consistency.
The previous results showed multiple files using similar time periods and chain IDs. Let's verify the exact values to ensure consistency across these critical configurations.
Bridge configurations are consistent across the system
The verification confirms that the bridge configurations in bridger-cli/src/consts/bridgeRoutes.ts
are consistent with other parts of the system:
- Chain IDs (11155111 for Sepolia and 10200 for Chiado) match across bridger-cli, relayer-cli, and deployment configurations
- Epoch periods are consistent:
- Sepolia: 7200 seconds (2 hours)
- Chiado: 3600 seconds (1 hour)
- The deposit amount of 1 ETH (1000000000000000000 wei) is unique to the bridger-cli configuration
- Sequencer delay limit of 86400 seconds (24 hours) is consistently used across deployment configurations
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check for chain IDs usage in environment files and other configurations
echo "Checking chain IDs usage..."
rg -l "11155111|10200" --type-add 'config:*.{json,env,env.dist,yaml,yml}' -tconfig
# Check for time periods usage
echo "Checking time periods usage..."
rg -l "7200|3600|10800|86400" --type-add 'ts:*.ts' -tts
# Check for deposit amount usage
echo "Checking deposit amount..."
rg -l "1000000000000000000" --type-add 'ts:*.ts' -tts
Length of output: 1142
Script:
#!/bin/bash
# Check the specific configuration values in relayer-cli
echo "Checking relayer-cli bridge routes..."
cat relayer-cli/src/consts/bridgeRoutes.ts
# Check the environment variables configuration
echo "Checking environment variables..."
cat bridger-cli/.env.dist
# Check a sample of deployment configurations
echo "Checking deployment configurations..."
cat contracts/deploy/01-outbox/01-chiado-to-arb-sepolia-outbox.ts
Length of output: 7273
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 12
🧹 Outside diff range and nitpick comments (16)
bridger-cli/src/bridger.test.ts (3)
1-1
: Use ES6 import for consistencyReplace
require("dotenv").config();
withimport "dotenv/config";
to maintain consistency with ES6 module syntax.Apply this diff:
- require("dotenv").config(); + import "dotenv/config";
12-12
: Avoid overridingconsole.log
globallyOverriding
console.log
can have unintended side effects on other tests. Consider using Jest's mocking capabilities to suppress console output in this test suite.You can mock
console.log
in your test suite as follows:beforeAll(() => { jest.spyOn(console, 'log').mockImplementation(() => {}); }); afterAll(() => { jest.restoreAllMocks(); });
243-243
: Uselet
orconst
instead ofvar
for variable declarationPrefer using
let
orconst
overvar
to ensure block scope and prevent potential hoisting issues.Apply this diff:
- var claim = { + let claim = {bridger-cli/src/utils/transactionHandler.ts (2)
17-17
: MakerequiredConfirmations
configurableThe
requiredConfirmations
property is hardcoded to12
. Making this value configurable allows flexibility for different network conditions and can be useful during testing or deployment to different environments.
103-129
: Correct variable naming and calculation inverifySnapshot
methodIn the
verifySnapshot
method, the variabletimeLeft
actually represents the time elapsed since the claim relative tominChallengePeriod
, which can be misleading.Consider renaming the variable and adjusting the calculation for clarity:
- const timeLeft = latestBlockTimestamp - this.claim.timestampClaimed - bridgeConfig.minChallengePeriod; + const timeElapsed = latestBlockTimestamp - this.claim.timestampClaimed; + const timeRemaining = bridgeConfig.minChallengePeriod - timeElapsed; console.log("Time remaining for verification: " + timeRemaining);Adjust the condition accordingly:
- if (timeLeft >= 0) { + if (timeRemaining <= 0) {bridger-cli/src/utils/transactionHandler.test.ts (5)
6-7
: Specify types forclaim
andveaOutbox
in testsIn the test setup,
claim
andveaOutbox
are typed asany
. Defining appropriate types or interfaces for these objects will improve type safety and make the tests more robust.
112-139
: Add tests for error handling inmakeClaim
Currently, there are no tests covering scenarios where
makeClaim
encounters errors during gas estimation or transaction execution. Adding such tests will enhance test coverage and verify that error handling behaves as expected.
142-193
: Add tests for error handling instartVerification
Similarly, consider adding tests that simulate exceptions in
startVerification
to ensure that the method handles errors gracefully.
195-246
: Add tests for error handling inverifySnapshot
Including tests for error scenarios in
verifySnapshot
will help ensure that the method's error handling is effective under different conditions.
248-274
: Add tests for error handling inwithdrawClaimDeposit
Testing error handling in
withdrawClaimDeposit
will improve confidence that the method can handle exceptions without causing unhandled rejections.bridger-cli/src/utils/shutdown.ts (1)
2-14
: Improve naming conventions for better readabilityConsider renaming the property and methods for clarity:
- Rename
isShutdownSignal
toshutdownRequested
.- Rename
getIsShutdownSignal()
toisShutdownRequested()
.- Rename
setShutdownSignal()
torequestShutdown()
.This will make the code more intuitive and easier to understand.
Apply this diff to rename the property and methods:
export class ShutdownSignal { - private isShutdownSignal: boolean; + private shutdownRequested: boolean; constructor(initialState: boolean = false) { - this.isShutdownSignal = initialState; + this.shutdownRequested = initialState; } - public getIsShutdownSignal(): boolean { - return this.isShutdownSignal; + public isShutdownRequested(): boolean { + return this.shutdownRequested; } - public setShutdownSignal(): void { - this.isShutdownSignal = true; + public requestShutdown(): void { + this.shutdownRequested = true; } }bridger-cli/src/utils/epochHandler.ts (1)
7-7
: Use strict equality for comparisonIn JavaScript and TypeScript, it's best practice to use strict equality
===
instead of==
to prevent unexpected type coercion.Apply this diff to use strict equality:
if (startEpoch === 0) {bridger-cli/src/utils/epochHandler.test.ts (2)
50-52
: Remove debug console.log statementsThese console.log statements appear to be debugging artifacts and should be removed from the test file.
- console.log(claim); - console.log(mockClaim); expect(claim).toBeDefined();Also applies to: 74-76, 123-125
13-17
: Improve test descriptions for better clarityThe test descriptions could be more specific about the scenarios being tested. Consider adding more context about the test conditions and expected outcomes.
- it("should return a valid claim", async () => { + it("should return a valid claim when no challenger exists", async () => { - it("should return a valid claim with challenger", async () => { + it("should return a valid claim when a challenger address is present", async () => { - it("should return a valid claim with verification", async () => { + it("should return a valid claim with verification timestamps and block numbers", async () => {Also applies to: 59-60, 81-84
bridger-cli/src/utils/claim.test.ts (1)
1-168
: LGTM! Consider adding edge case testsThe test coverage is comprehensive and well-structured. Consider adding edge cases for:
- Invalid state root formats
- Malformed challenger addresses
- Timestamp validation (e.g., verification timestamp before claim timestamp)
bridger-cli/src/bridger.ts (1)
23-23
: Replace magic numbers with named constantsSeveral magic numbers in the code should be replaced with named constants for better maintainability.
Apply this diff:
+ const HONEST_CLAIM_VALUE = 1; + const POLLING_INTERVAL = 10 * 1000; // 10 seconds in milliseconds const transactionHandlers: { [epoch: number]: TransactionHandler } = {}; // ... rest of the code ... - claim.honest = 1; // Assume the claimer is honest + claim.honest = HONEST_CLAIM_VALUE; // Assume the claimer is honest // ... rest of the code ... - await wait(1000 * 10); + await wait(POLLING_INTERVAL);Also applies to: 80-80, 108-108
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (13)
bridger-cli/jest.config.ts
(1 hunks)bridger-cli/package.json
(1 hunks)bridger-cli/src/bridger.test.ts
(1 hunks)bridger-cli/src/bridger.ts
(1 hunks)bridger-cli/src/utils/claim.test.ts
(1 hunks)bridger-cli/src/utils/claim.ts
(1 hunks)bridger-cli/src/utils/epochHandler.test.ts
(1 hunks)bridger-cli/src/utils/epochHandler.ts
(1 hunks)bridger-cli/src/utils/graphQueries.ts
(1 hunks)bridger-cli/src/utils/shutdown.ts
(1 hunks)bridger-cli/src/utils/transactionHandler.test.ts
(1 hunks)bridger-cli/src/utils/transactionHandler.ts
(1 hunks)contracts/Dockerfile
(1 hunks)
✅ Files skipped from review due to trivial changes (1)
- bridger-cli/jest.config.ts
🚧 Files skipped from review as they are similar to previous changes (2)
- contracts/Dockerfile
- bridger-cli/package.json
🧰 Additional context used
📓 Learnings (1)
bridger-cli/src/utils/graphQueries.ts (2)
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/graphQueries.ts:12-34
Timestamp: 2024-12-09T09:03:31.474Z
Learning: In `bridger-cli/src/utils/graphQueries.ts`, within the `getClaimForEpoch` function, returning `result['claims'][0]` is sufficient because it will be `undefined` if `result['claims']` is an empty array, making additional checks unnecessary.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/graphQueries.ts:36-58
Timestamp: 2024-12-09T09:04:04.819Z
Learning: In `bridger-cli/src/utils/graphQueries.ts` (TypeScript), the `getVerificationStatus` function is no longer needed and has been removed.
🔇 Additional comments (3)
bridger-cli/src/utils/transactionHandler.ts (1)
40-62
: Handle potential race conditions in checkTransactionPendingStatus
In checkTransactionPendingStatus
, there could be a race condition if the transaction's status changes between retrieving the receipt and checking confirmations. Ensure appropriate synchronization or additional checks as needed.
bridger-cli/src/utils/graphQueries.ts (1)
36-56
: 🛠️ Refactor suggestion
Add error handling to getLastClaimedEpoch
The getLastClaimedEpoch
function lacks error handling, which can lead to unhandled exceptions if the request fails. Wrap the function body in a try-catch
block to handle potential errors gracefully.
Apply this diff to add error handling:
const getLastClaimedEpoch = async (): Promise<ClaimData | undefined> => {
+ try {
const subgraph = process.env.VEAOUTBOX_SUBGRAPH;
const result = await request(
`${subgraph}`,
`{
claims(first:1, orderBy:timestamp, orderDirection:desc){
id
bridger
stateroot
timestamp
- verification{
- timestamp
- }
challenged
}
}`
);
return result[`claims`][0];
+ } catch (e) {
+ console.log(e);
+ return undefined;
+ }
};
⛔ Skipped due to learnings
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/graphQueries.ts:12-34
Timestamp: 2024-12-09T09:03:31.474Z
Learning: In `bridger-cli/src/utils/graphQueries.ts`, within the `getClaimForEpoch` function, returning `result['claims'][0]` is sufficient because it will be `undefined` if `result['claims']` is an empty array, making additional checks unnecessary.
bridger-cli/src/bridger.ts (1)
25-111
:
Add error handling and timeout mechanism to the main loop
The main loop lacks error handling and could potentially run indefinitely.
The previous review comment about adding error handling is still applicable. Additionally, consider adding a timeout mechanism.
Apply this diff to add timeout and cleanup:
+ const MAX_EXECUTION_TIME = 24 * 60 * 60 * 1000; // 24 hours in milliseconds
+ const startTime = Date.now();
while (!shutDownSignal.getIsShutdownSignal()) {
+ if (Date.now() - startTime > MAX_EXECUTION_TIME) {
+ console.log("Maximum execution time reached, shutting down");
+ break;
+ }
// ... rest of the loop code ...
}
+ // Cleanup
+ Object.values(transactionHandlers).forEach(handler => {
+ // Add cleanup method to TransactionHandler class
+ handler.cleanup?.();
+ });
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 4
🧹 Outside diff range and nitpick comments (2)
bridger-cli/src/bridger.ts (2)
23-23
: Add type safety for transaction handlers mapThe transaction handlers map lacks proper TypeScript type annotations.
- const transactionHandlers: { [epoch: number]: TransactionHandler } = {}; + const transactionHandlers: Record<number, TransactionHandler> = {};
113-113
: Add type annotation to wait functionThe utility function should have proper TypeScript type annotations.
- const wait = (ms) => new Promise((r) => setTimeout(r, ms)); + const wait = (ms: number): Promise<void> => new Promise((r) => setTimeout(r, ms));
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (5)
bridger-cli/.env.dist
(1 hunks)bridger-cli/src/bridger.ts
(1 hunks)bridger-cli/src/utils/claim.test.ts
(1 hunks)bridger-cli/src/utils/claim.ts
(1 hunks)bridger-cli/src/utils/graphQueries.ts
(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (3)
- bridger-cli/src/utils/graphQueries.ts
- bridger-cli/.env.dist
- bridger-cli/src/utils/claim.test.ts
🧰 Additional context used
📓 Learnings (1)
bridger-cli/src/bridger.ts (1)
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/bridger.ts:1-8
Timestamp: 2024-12-09T09:48:37.012Z
Learning: The `bridger-cli` directory contains a `.env.dist` file with environment variables, which will be updated with proper documentation.
🔇 Additional comments (5)
bridger-cli/src/bridger.ts (2)
1-9
: LGTM! Well-organized imports
The imports are logically structured and all imported utilities are used effectively in the code.
18-20
:
Add error handling for contract initialization
The contract initialization could fail if addresses are invalid or network is unreachable.
- const veaInbox = getVeaInbox(veaInboxAddress, PRIVATE_KEY, veaInboxProviderURL, chainId);
- const veaOutbox = getVeaOutbox(veaOutboxAddress, PRIVATE_KEY, veaOutboxProviderURL, chainId);
- const epochs = await setEpochRange(veaOutbox, startEpoch);
+ try {
+ const veaInbox = getVeaInbox(veaInboxAddress, PRIVATE_KEY, veaInboxProviderURL, chainId);
+ const veaOutbox = getVeaOutbox(veaOutboxAddress, PRIVATE_KEY, veaOutboxProviderURL, chainId);
+ const epochs = await setEpochRange(veaOutbox, startEpoch);
+ } catch (error) {
+ console.error('Failed to initialize contracts:', error);
+ throw new Error('Contract initialization failed');
+ }
Likely invalid or redundant comment.
bridger-cli/src/utils/claim.ts (3)
1-12
: LGTM! Well-structured type definition
The ClaimStruct
type is well-defined with appropriate types for blockchain addresses and includes all necessary fields for claim verification.
22-32
:
Unsafe initialization of claimData persists
The current initialization of claimData
as an empty object is unsafe.
Apply this diff to safely initialize the object:
if (claimData === undefined) {
- claimData = {} as ClaimData;
+ claimData = {
+ id: '',
+ bridger: ethers.constants.AddressZero,
+ stateroot: ethers.constants.HashZero,
+ timestamp: 0,
+ challenged: false,
+ txHash: '',
+ };
20-21
: Address the TODO comment about block range RPC dependency
The TODO comment suggests a potential optimization for log querying that should be addressed.
Would you like me to help implement the block range optimization mentioned in the TODO?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Outside diff range and nitpick comments (1)
bridger-cli/src/utils/ethers.ts (1)
50-58
: Consider defining constants forchainId
values for better readabilityUsing constants for
chainId
values enhances code readability and maintainability.Apply this diff to define constants:
+const SEPOLIA_CHAIN_ID = 11155111; +const CHIADO_CHAIN_ID = 10200; function getVeaOutboxDevnet(veaOutboxAddress: string, privateKey: string, web3ProviderURL: string, chainId: number) { - if (chainId == 11155111) { + if (chainId == SEPOLIA_CHAIN_ID) { return VeaOutboxArbToEthDevnet__factory.connect(veaOutboxAddress, getWallet(privateKey, web3ProviderURL)); - } else if (chainId == 10200) { + } else if (chainId == CHIADO_CHAIN_ID) { return VeaOutboxArbToGnosisDevnet__factory.connect(veaOutboxAddress, getWallet(privateKey, web3ProviderURL)); } else { throw new Error(`Unsupported chainId: ${chainId}`); } }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (3)
bridger-cli/src/consts/bridgeRoutes.ts
(1 hunks)bridger-cli/src/utils/claim.test.ts
(1 hunks)bridger-cli/src/utils/ethers.ts
(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
- bridger-cli/src/consts/bridgeRoutes.ts
- bridger-cli/src/utils/claim.test.ts
🧰 Additional context used
📓 Learnings (1)
bridger-cli/src/utils/ethers.ts (2)
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/ethers.ts:31-37
Timestamp: 2024-12-10T04:59:11.283Z
Learning: In the project, `chainId` validation is performed in outer layers, so individual functions like `getVeaInboxProvider` do not need to handle unsupported `chainId`s.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/ethers.ts:20-82
Timestamp: 2024-12-09T10:18:00.133Z
Learning: In `bridger-cli/src/utils/ethers.ts`, prefer to keep the existing `chainId` checks without refactoring to avoid overcomplicating the code with additional conditional logic.
🔇 Additional comments (5)
bridger-cli/src/utils/ethers.ts (5)
13-15
: Function getWallet
implementation is clear and correct
The function correctly initializes a new Wallet
with the provided private key and web3 provider URL.
17-19
: Function getWalletRPC
implementation is clear and correct
The function efficiently creates a new Wallet
with the given private key and JsonRpcProvider
instance.
22-34
: Function getVeaInbox
correctly connects to Vea Inbox contracts
The switch statement appropriately handles different bridge chains and returns the corresponding Vea Inbox contract instance.
36-48
: Function getVeaOutbox
correctly connects to Vea Outbox contracts
The implementation mirrors getVeaInbox
, handling bridge chains consistently.
60-60
: Export statement correctly exports utility functions
The module exports the necessary utility functions for external use.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 5
🧹 Outside diff range and nitpick comments (5)
bridger-cli/src/utils/claim.ts (3)
32-32
: Address the TODO comment about RPC dependency.The comment suggests potential issues with logs block range and RPC dependency. This should be investigated and resolved.
Would you like me to help implement the block range check for RPC optimization?
54-63
: Consider batching RPC calls for better performance.Multiple sequential RPC calls (
queryFilter
) are made for verification and challenge logs. Consider batching these calls using Promise.all() for better performance.- const verifyLogs = await veaOutbox.queryFilter(veaOutbox.filters.VerificationStarted(epoch)); - if (verifyLogs.length > 0) { - const verificationStartBlock = await veaOutbox.provider.getBlock(verifyLogs[0].blockHash); - claim.timestampVerification = verificationStartBlock.timestamp; - claim.blocknumberVerification = verificationStartBlock.number; - } - const challengeLogs = await veaOutbox.queryFilter(veaOutbox.filters.Challenged(epoch)); + const [verifyLogs, challengeLogs] = await Promise.all([ + veaOutbox.queryFilter(veaOutbox.filters.VerificationStarted(epoch)), + veaOutbox.queryFilter(veaOutbox.filters.Challenged(epoch)) + ]); + if (verifyLogs.length > 0) { + const verificationStartBlock = await veaOutbox.provider.getBlock(verifyLogs[0].blockHash); + claim.timestampVerification = verificationStartBlock.timestamp; + claim.blocknumberVerification = verificationStartBlock.number; + }
78-91
: Add type annotation for the claim parameter.While input validation is handled by upper layers, adding type annotation improves code readability and maintainability.
-const hashClaim = (claim) => { +const hashClaim = (claim: ClaimStruct): string => {bridger-cli/src/utils/transactionHandler.ts (2)
31-31
: Make required confirmations configurable per chain.Different chains have different finality requirements. Consider making
requiredConfirmations
configurable through bridge config.- public requiredConfirmations: number = 12; + public requiredConfirmations: number; + + constructor( + chainId: number, + epoch: number, + veaOutbox: any, + claim?: ClaimStruct, + fetchBridgeConfig: typeof getBridgeConfig = getBridgeConfig + ) { + // ... existing initialization + const bridgeConfig = this.getBridgeConfig(this.chainId); + this.requiredConfirmations = bridgeConfig.requiredConfirmations ?? 12; + }
78-158
: Enhance logging for better debugging.While error handling is intentionally omitted, consider adding structured logging with additional context for better debugging.
Example improvement for
makeClaim
:- console.log(`Epoch ${this.epoch} was claimed with trnx hash ${claimTransaction.hash}`); + console.log({ + event: 'claim_submitted', + epoch: this.epoch, + chainId: this.chainId, + txHash: claimTransaction.hash, + gasLimit: estimateGas.toString(), + timestamp: Math.floor(Date.now() / 1000) + });
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (4)
bridger-cli/src/bridger.test.ts
(1 hunks)bridger-cli/src/utils/claim.ts
(1 hunks)bridger-cli/src/utils/epochHandler.ts
(1 hunks)bridger-cli/src/utils/transactionHandler.ts
(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- bridger-cli/src/bridger.test.ts
🧰 Additional context used
📓 Learnings (3)
bridger-cli/src/utils/claim.ts (3)
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/claim.ts:23-32
Timestamp: 2024-12-10T04:59:10.224Z
Learning: In `bridger-cli/src/utils/claim.ts`, within the `fetchClaim` function, when `claimData` is undefined, avoid initializing it with default values, as this can result in incorrect claim values and make issues harder to identify.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/claim.ts:56-69
Timestamp: 2024-12-09T10:54:57.068Z
Learning: In the TypeScript file 'bridger-cli/src/utils/claim.ts', the upper layers handle input validation for the 'hashClaim' function. Therefore, explicit input validation within 'hashClaim' is not necessary.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/claim.ts:42-51
Timestamp: 2024-12-09T10:54:09.943Z
Learning: In the `bridger-cli/src/utils/claim.ts` file, within the `fetchClaim` function, explicit error handling for provider calls and event queries is not required; errors should be allowed to propagate naturally.
bridger-cli/src/utils/epochHandler.ts (1)
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/epochHandler.ts:17-17
Timestamp: 2024-12-09T09:43:28.877Z
Learning: In `bridger-cli/src/utils/epochHandler.ts`, within the `getBlockNumberFromEpoch` function, the block difference used to calculate the average block time is always 1000. Therefore, dividing by 1000 directly is appropriate in this case.
bridger-cli/src/utils/transactionHandler.ts (4)
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/transactionHandler.ts:64-77
Timestamp: 2024-12-09T09:42:34.067Z
Learning: In the `TransactionHandler` class (`bridger-cli/src/utils/transactionHandler.ts`), it's acceptable to let methods like `makeClaim` fail without additional error handling.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/transactionHandler.ts:79-101
Timestamp: 2024-12-09T09:42:51.590Z
Learning: In the `bridger-cli/src/utils/transactionHandler.ts` file, within the `TransactionHandler` class, it's acceptable to let methods like `startVerification` fail without additional error handling.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/transactionHandler.ts:131-144
Timestamp: 2024-12-09T09:40:49.098Z
Learning: In the `TransactionHandler` class, it's acceptable to let methods like `withdrawClaimDeposit` fail without additional error handling.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/transactionHandler.ts:13-13
Timestamp: 2024-12-09T09:40:28.400Z
Learning: In `bridger-cli/src/utils/transactionHandler.ts`, the `veaOutbox` implementations differ for each chain, but a common interface should be defined for type checks to enhance type safety.
🔇 Additional comments (2)
bridger-cli/src/utils/claim.ts (2)
1-12
: LGTM! Well-structured type definition.
The ClaimStruct
type is well-defined with appropriate TypeScript types for all fields.
37-44
: Verify RPC calls for potential rate limiting issues.
Multiple RPC calls are made in sequence which could hit rate limits:
queryFilter
for claim logsgetBlock
for timestamp
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great job! I am happy and impressed with the work you did on the testing side. I left some suggestions, please feel free to tell me if you find them appropriate or not, as I do not have deep understanding of Vea yet
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 4
🧹 Outside diff range and nitpick comments (6)
contracts/.env.example (3)
19-20
: Document port allocation strategyThe comment explains the RPC ports (8545, 8546, 8547) for different forks, but the configured value (8456) doesn't match any of these. This might cause confusion.
Consider updating the comment to include 8456 in the list or adjust the value to match one of the documented ports.
Line range hint
1-7
: Enhance security for example API keysWhile these are example values, consider following these security best practices:
- Use a more obvious example format (e.g.,
<YOUR_PRIVATE_KEY>
orxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
)- Add a comment warning users not to commit their actual keys
-PRIVATE_KEY=0xabc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1 +# WARNING: Never commit real private keys or API keys to version control +PRIVATE_KEY=<YOUR_PRIVATE_KEY> # 64 hex characters REPORT_GAS=true -INFURA_API_KEY=ABC123ABC123ABC123ABC123ABC123ABC1 +INFURA_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
17-17
: Clarify empty router network configurationThe comment "Empty for direct routes" might need more context for new developers.
Consider expanding the comment to explain what "direct routes" means in this context and when it should be left empty vs. configured.
contracts/Dockerfile (2)
7-7
: Consider using--frozen-lockfile
for deterministic buildsWhile
--ignore-scripts
is good for security, consider adding--frozen-lockfile
to ensure dependency versions are locked.-RUN yarn install --ignore-scripts +RUN yarn install --ignore-scripts --frozen-lockfile
17-17
: Consider documenting port usageThe exposed ports should be documented to explain their purpose.
-EXPOSE 8545 8546 8547 +# Expose ports for Hardhat forks (inbox, outbox, router) +EXPOSE 8545 8546 8547contracts/docker-compose.yml (1)
55-55
: Fix trailing whitespaceRemove trailing whitespace after port mappings.
- - "8545:8545" + - "8545:8545" - - "8546:8546" + - "8546:8546" - - "8547:8547" + - "8547:8547"Also applies to: 73-73, 91-91
🧰 Tools
🪛 yamllint (1.35.1)
[error] 55-55: trailing spaces
(trailing-spaces)
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
📒 Files selected for processing (4)
contracts/.env.example
(1 hunks)contracts/Dockerfile
(1 hunks)contracts/docker-compose.yml
(1 hunks)contracts/start-forks.sh
(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
- contracts/start-forks.sh
🧰 Additional context used
🪛 yamllint (1.35.1)
contracts/docker-compose.yml
[error] 55-55: trailing spaces
(trailing-spaces)
[error] 73-73: trailing spaces
(trailing-spaces)
[error] 91-91: trailing spaces
(trailing-spaces)
🔇 Additional comments (3)
contracts/.env.example (1)
14-15
: Verify network name compatibility
The specified networks (arbitrum-sepolia
and sepolia
) should be validated to ensure they match the supported networks in the Infura configuration.
✅ Verification successful
Network names are valid and properly configured
The verification confirms that both arbitrum-sepolia
and sepolia
networks are valid and extensively used throughout the codebase:
- Both networks are properly configured in Hardhat (
contracts/hardhat.config.ts
) - The networks are used in bridge routes and deployment scripts
- The networks are integrated with Infura (sepolia endpoint visible in config)
- Multiple components (bridger-cli, validator-cli, relayer-cli, veascan-web) support these networks
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check if the network names are valid Infura endpoints
# Expected: Network names should be found in the codebase configuration
# Search for network configuration
rg -A 5 "arbitrum-sepolia|sepolia" --type ts
Length of output: 13458
contracts/Dockerfile (1)
1-4
: LGTM: Base image and working directory setup
The setup follows best practices by:
- Using a specific Node.js version
- Setting working directory to
/home/node
which is appropriate for the node user
contracts/docker-compose.yml (1)
109-109
: Verify host.docker.internal accessibility
host.docker.internal
might not work on all platforms. Consider making this configurable.
✅ Verification successful
Let me check if there are any platform-specific configurations or documentation about this setup.
Based on the documentation found in the README files, particularly in the Graph Node Docker setup, I can now provide a final response:
host.docker.internal
configuration is properly documented and handled
The repository already addresses platform-specific concerns for host.docker.internal
:
- For Docker v20.10 and above on Linux, users need to add
extra_hosts
in docker-compose.yml - For Docker versions below v20.10 on Linux, documentation provides clear instructions to replace
host.docker.internal
with the host IP address using provided commands - The setup works by default on macOS and Windows
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Check if there are any platform-specific configurations
rg "host.docker.internal" --type yaml
Length of output: 215
Script:
#!/bin/bash
# Check for any documentation or configuration related to host.docker.internal
fd README -t f -X cat {}
Length of output: 19527
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 4
🧹 Outside diff range and nitpick comments (12)
bridger-cli/src/bridger.ts (4)
14-33
: Add type annotations for environment variables and chain configuration.While the initialization logic is clear, adding TypeScript type annotations would improve maintainability and catch potential type-related issues early.
Apply this diff:
- const chainId = Number(process.env.VEAOUTBOX_CHAIN_ID); - const veaInboxAddress = process.env.VEAINBOX_ADDRESS; - const veaInboxProviderURL = process.env.VEAINBOX_PROVIDER; - const veaOutboxAddress = process.env.VEAOUTBOX_ADDRESS; - const veaOutboxProviderURL = process.env.VEAOUTBOX_PROVIDER; - const PRIVATE_KEY = process.env.PRIVATE_KEY; + const chainId: number = Number(process.env.VEAOUTBOX_CHAIN_ID); + const veaInboxAddress: string = process.env.VEAINBOX_ADDRESS!; + const veaInboxProviderURL: string = process.env.VEAINBOX_PROVIDER!; + const veaOutboxAddress: string = process.env.VEAOUTBOX_ADDRESS!; + const veaOutboxProviderURL: string = process.env.VEAOUTBOX_PROVIDER!; + const PRIVATE_KEY: string = process.env.PRIVATE_KEY!;
34-124
: Add documentation for claim processing states and transitions.While the code logic is sound, adding documentation for the different claim states and their transitions would make the code more maintainable and easier to understand.
Add comments explaining the business logic:
while (!shutDownSignal.getIsShutdownSignal()) { let i = 0; while (i < epochs.length) { + // State 1: Check if epoch can be claimed const activeEpoch = epochs[i]; emitter.emit(BotEvents.CHECKING, activeEpoch); let claimableEpochHash = await veaOutbox.claimHashes(activeEpoch); let outboxStateRoot = await veaOutbox.stateRoot(); const finalizedOutboxBlock = await veaOutbox.provider.getBlock("finalized"); + // State 2: Process unclaimed epoch if (claimableEpochHash == ethers.constants.HashZero && activeEpoch == verifiableEpoch) { // ... existing comments ... } + // State 3: Process claimed epoch else if (claimableEpochHash != ethers.constants.HashZero) { // ... existing comments ... } + // State 4: Skip processed epoch else { // ... existing comments ... }
125-134
: Consider making the wait time configurable.A fixed wait time of 10 seconds might not be optimal for all network conditions or load scenarios.
Consider making it configurable through environment variables:
+ const POLL_INTERVAL = Number(process.env.POLL_INTERVAL_MS) || 10000; - await wait(1000 * 10); + await wait(POLL_INTERVAL);
136-141
: Add type annotation to the wait utility function.The wait function would benefit from TypeScript type annotations for better type safety.
Apply this diff:
-const wait = (ms) => new Promise((r) => setTimeout(r, ms)); +const wait = (ms: number): Promise<void> => new Promise((r) => setTimeout(r, ms));bridger-cli/src/utils/epochHandler.ts (1)
40-52
: Extract magic numbers into named constants.The function uses magic numbers (1000 for block difference and 100 for safety offset) which should be extracted into named constants for better maintainability.
+const BLOCK_SAMPLE_SIZE = 1000; +const SAFETY_BLOCK_OFFSET = 100; + const getBlockNumberFromEpoch = async ( veaOutboxRpc: JsonRpcProvider, epoch: number, epochPeriod: number ): Promise<number> => { const latestBlock = await veaOutboxRpc.getBlock("latest"); - const preBlock = await veaOutboxRpc.getBlock(latestBlock.number - 1000); + const preBlock = await veaOutboxRpc.getBlock(latestBlock.number - BLOCK_SAMPLE_SIZE); const avgBlockTime = (latestBlock.timestamp - preBlock.timestamp) / 1000; const epochInSeconds = epoch * epochPeriod; const epochBlock = Math.floor(latestBlock.number - (latestBlock.timestamp - epochInSeconds) / avgBlockTime); - return epochBlock - 100; + return epochBlock - SAFETY_BLOCK_OFFSET; };bridger-cli/src/utils/claim.ts (2)
33-33
: Convert TODO to a tracked issue.The TODO comment about RPC dependency should be converted to a GitHub issue for better tracking.
Would you like me to help create a GitHub issue for tracking this RPC dependency check?
82-95
: Add type annotation forclaim
parameter.While keeping in mind that upper layers handle input validation, adding type annotation would improve code clarity:
-const hashClaim = (claim) => { +const hashClaim = (claim: ClaimStruct): string => {bridger-cli/src/utils/emitter.ts (1)
7-13
: Enhance type safety of the emit methodConsider improving type safety by:
- Constraining the event parameter to BotEvents
- Using a more specific type for args based on each event's requirements
- emit(event: string | symbol, ...args: any[]): boolean { + emit(event: BotEvents | string | symbol, ...args: unknown[]): boolean {Consider creating an event map type to enforce correct argument types for each event:
type BotEventMap = { [BotEvents.CHECKING]: [epoch: number]; [BotEvents.TXN_MADE]: [transaction: string, epoch: number, state: string]; // ... define for other events } emit<E extends BotEvents>(event: E, ...args: BotEventMap[E]): boolean;bridger-cli/src/utils/logger.ts (2)
15-17
: Remove redundant initialize functionThe
initialize
function is just a wrapper that adds no value. Consider removing it and usingconfigurableInitialize
directly.-export const initialize = (emitter: EventEmitter) => { - return configurableInitialize(emitter); -};
54-70
: Add transaction hash validationThe transaction-related event handlers should validate the transaction hash format before logging.
const isValidTransactionHash = (hash: string): boolean => /^0x([A-Fa-f0-9]{64})$/.test(hash); emitter.on(BotEvents.TXN_MADE, (transaction: string, epoch: number, state: string) => { if (!isValidTransactionHash(transaction)) { console.warn(`Invalid transaction hash format: ${transaction}`); return; } console.log(`${state} transaction for ${epoch} made with hash: ${transaction}`); });bridger-cli/src/utils/transactionHandler.ts (2)
78-84
: Simplify conditional logic by removing unnecessary else clause.The else clause is not needed as the return statement in the first branch already prevents execution of subsequent code.
if (confirmations >= this.requiredConfirmations) { this.emitter.emit(BotEvents.TXN_FINAL, trnxHash, confirmations); return false; - } else { - this.emitter.emit(BotEvents.TXN_NOT_FINAL, trnxHash, confirmations); - return true; } + this.emitter.emit(BotEvents.TXN_NOT_FINAL, trnxHash, confirmations); + return true;
114-117
: Use consistent guard clause pattern across methods.Both
startVerification
andverifySnapshot
methods use time-based checks, but with slightly different patterns. Consider using the same guard clause pattern for consistency:// In startVerification - if (timeOver < 0) { - this.emitter.emit(BotEvents.VERFICATION_CANT_START, -1 * timeOver); - return; - } + const timeLeft = -1 * timeOver; + if (timeLeft > 0) { + this.emitter.emit(BotEvents.VERFICATION_CANT_START, timeLeft); + return; + } // In verifySnapshot (current implementation is good) if (timeLeft < 0) { this.emitter.emit(BotEvents.CANT_VERIFY_SNAPSHOT, -1 * timeLeft); return; }Also applies to: 137-140
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (14)
bridger-cli/src/bridger.test.ts
(1 hunks)bridger-cli/src/bridger.ts
(1 hunks)bridger-cli/src/utils/botEvents.ts
(1 hunks)bridger-cli/src/utils/claim.test.ts
(1 hunks)bridger-cli/src/utils/claim.ts
(1 hunks)bridger-cli/src/utils/emitter.ts
(1 hunks)bridger-cli/src/utils/epochHandler.test.ts
(1 hunks)bridger-cli/src/utils/epochHandler.ts
(1 hunks)bridger-cli/src/utils/errors.ts
(1 hunks)bridger-cli/src/utils/ethers.ts
(1 hunks)bridger-cli/src/utils/logger.ts
(1 hunks)bridger-cli/src/utils/shutdown.ts
(1 hunks)bridger-cli/src/utils/transactionHandler.test.ts
(1 hunks)bridger-cli/src/utils/transactionHandler.ts
(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (4)
- bridger-cli/src/utils/shutdown.ts
- bridger-cli/src/utils/claim.test.ts
- bridger-cli/src/bridger.test.ts
- bridger-cli/src/utils/ethers.ts
🧰 Additional context used
📓 Learnings (6)
bridger-cli/src/utils/transactionHandler.test.ts (1)
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/transactionHandler.ts:64-77
Timestamp: 2024-12-09T09:42:34.067Z
Learning: In the `TransactionHandler` class (`bridger-cli/src/utils/transactionHandler.ts`), it's acceptable to let methods like `makeClaim` fail without additional error handling.
bridger-cli/src/utils/epochHandler.test.ts (2)
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/epochHandler.ts:13-24
Timestamp: 2024-12-10T08:26:12.411Z
Learning: In `bridger-cli/src/utils/epochHandler.ts`, the `setEpochRange` function does not require validation checks for `startEpoch` being non-negative or the epoch range being too large because the upper layer ensures `startEpoch` is always valid and the epoch range is appropriately managed.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/epochHandler.ts:63-68
Timestamp: 2024-12-10T08:27:15.815Z
Learning: In the file `bridger-cli/src/utils/epochHandler.ts`, the calculation within the `checkForNewEpoch` function is correct as implemented and has been tested.
bridger-cli/src/utils/epochHandler.ts (4)
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/epochHandler.ts:13-13
Timestamp: 2024-12-11T08:52:17.062Z
Learning: In `bridger-cli/src/utils/epochHandler.ts`, the `veaOutbox` parameter is intentionally typed as `any` because the script is designed to be agnostic for multiple contracts.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/epochHandler.ts:63-68
Timestamp: 2024-12-10T08:27:15.815Z
Learning: In the file `bridger-cli/src/utils/epochHandler.ts`, the calculation within the `checkForNewEpoch` function is correct as implemented and has been tested.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/epochHandler.ts:13-24
Timestamp: 2024-12-10T08:26:12.411Z
Learning: In `bridger-cli/src/utils/epochHandler.ts`, the `setEpochRange` function does not require validation checks for `startEpoch` being non-negative or the epoch range being too large because the upper layer ensures `startEpoch` is always valid and the epoch range is appropriately managed.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/epochHandler.ts:17-17
Timestamp: 2024-12-09T09:43:28.877Z
Learning: In `bridger-cli/src/utils/epochHandler.ts`, within the `getBlockNumberFromEpoch` function, the block difference used to calculate the average block time is always 1000. Therefore, dividing by 1000 directly is appropriate in this case.
bridger-cli/src/bridger.ts (3)
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/bridger.ts:113-118
Timestamp: 2024-12-10T04:45:36.079Z
Learning: Graceful shutdown handling in `bridger-cli` will be addressed in future PRs.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/bridger.ts:25-109
Timestamp: 2024-12-09T10:53:55.715Z
Learning: In the `bridger-cli/src/bridger.ts` file, refactoring the main loop and adding additional error handling are not needed unless deemed necessary by the developer.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/bridger.ts:1-8
Timestamp: 2024-12-09T09:48:37.012Z
Learning: The `bridger-cli` directory contains a `.env.dist` file with environment variables, which will be updated with proper documentation.
bridger-cli/src/utils/claim.ts (3)
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/claim.ts:23-32
Timestamp: 2024-12-10T04:59:10.224Z
Learning: In `bridger-cli/src/utils/claim.ts`, within the `fetchClaim` function, when `claimData` is undefined, avoid initializing it with default values, as this can result in incorrect claim values and make issues harder to identify.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/claim.ts:56-69
Timestamp: 2024-12-09T10:54:57.068Z
Learning: In the TypeScript file 'bridger-cli/src/utils/claim.ts', the upper layers handle input validation for the 'hashClaim' function. Therefore, explicit input validation within 'hashClaim' is not necessary.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/claim.ts:42-51
Timestamp: 2024-12-09T10:54:09.943Z
Learning: In the `bridger-cli/src/utils/claim.ts` file, within the `fetchClaim` function, explicit error handling for provider calls and event queries is not required; errors should be allowed to propagate naturally.
bridger-cli/src/utils/transactionHandler.ts (4)
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/transactionHandler.ts:64-77
Timestamp: 2024-12-09T09:42:34.067Z
Learning: In the `TransactionHandler` class (`bridger-cli/src/utils/transactionHandler.ts`), it's acceptable to let methods like `makeClaim` fail without additional error handling.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/transactionHandler.ts:131-144
Timestamp: 2024-12-09T09:40:49.098Z
Learning: In the `TransactionHandler` class, it's acceptable to let methods like `withdrawClaimDeposit` fail without additional error handling.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/transactionHandler.ts:13-13
Timestamp: 2024-12-09T09:40:28.400Z
Learning: In `bridger-cli/src/utils/transactionHandler.ts`, the `veaOutbox` implementations differ for each chain, but a common interface should be defined for type checks to enhance type safety.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/transactionHandler.ts:79-101
Timestamp: 2024-12-09T09:42:51.590Z
Learning: In the `bridger-cli/src/utils/transactionHandler.ts` file, within the `TransactionHandler` class, it's acceptable to let methods like `startVerification` fail without additional error handling.
🪛 Biome (1.9.4)
bridger-cli/src/utils/epochHandler.test.ts
[error] 84-84: Don't focus the test.
The 'only' method is often used for debugging or during implementation. It should be removed before deploying to production.
Consider removing 'only' to ensure all tests are executed.
Unsafe fix: Remove focus from test.
(lint/suspicious/noFocusedTests)
🔇 Additional comments (15)
bridger-cli/src/bridger.ts (1)
1-13
: LGTM! Well-organized imports and dependencies.
The code demonstrates good modularity with clear separation of concerns across utility modules.
bridger-cli/src/utils/errors.ts (3)
4-10
: LGTM! Well-structured error class.
The ClaimNotFoundError
class is properly implemented with a descriptive message that includes the epoch number.
12-18
: LGTM! Well-structured error class.
The InvalidStartEpochError
class is properly implemented with a clear message that includes the problematic epoch number.
20-26
: LGTM! Well-structured error class.
The ClaimNotSetError
class is properly implemented with a clear, concise message.
bridger-cli/src/utils/epochHandler.ts (2)
15-26
: LGTM! Well-implemented epoch range calculation.
The function correctly handles epoch range calculation with proper error handling using InvalidStartEpochError
.
66-73
: LGTM! Well-structured with dependency injection.
The function is well-implemented with:
- Default parameters for better testability
- Clear dependency injection pattern
- Clean epoch calculation logic
bridger-cli/src/utils/epochHandler.test.ts (2)
4-37
: LGTM! Comprehensive test coverage for setEpochRange.
The test suite thoroughly covers:
- Success case with valid epoch
- Error case with invalid start epoch
- Default rollback behavior
38-65
: LGTM! Well-structured test for getBlockNumberFromEpoch.
The test effectively:
- Mocks block responses
- Verifies block number calculation
bridger-cli/src/utils/claim.ts (3)
1-13
: LGTM! Well-structured type definition and clean imports.
The ClaimStruct
type is well-defined with proper TypeScript types, and the imports are specific and purposeful.
15-31
: Consider adding a specific type for veaOutbox
parameter.
While the JSDoc is well-documented, the any
type for veaOutbox
reduces type safety. Consider defining an interface for the expected contract shape.
Note: As discussed in previous reviews, if you're using different contract interfaces for each route, you might want to leverage TypeChain-generated types or create a union type to accommodate the variations.
34-44
:
Reconsider empty object initialization for claimData
.
Based on previous learnings, initializing claimData
as an empty object could lead to incorrect claim values that are harder to identify.
Consider throwing an error immediately if required data is not available, rather than initializing an empty object:
- claimData = {} as ClaimData;
+ const claimLogs = await veaOutbox.queryFilter(veaOutbox.filters.Claimed(null, epoch, null));
+ if (claimLogs.length === 0) {
+ throw new ClaimNotFoundError(epoch);
+ }
+ claimData = {
+ bridger: `0x${claimLogs[0].topics[1].slice(26)}`,
+ stateroot: claimLogs[0].data,
+ timestamp: (await veaOutbox.provider.getBlock(claimLogs[0].blockNumber)).timestamp,
+ };
- const claimLogs = await veaOutbox.queryFilter(veaOutbox.filters.Claimed(null, epoch, null));
- if (claimLogs.length === 0) {
- throw new ClaimNotFoundError(epoch);
- }
- claimData.bridger = `0x${claimLogs[0].topics[1].slice(26)}`;
- claimData.stateroot = claimLogs[0].data;
- claimData.timestamp = (await veaOutbox.provider.getBlock(claimLogs[0].blockNumber)).timestamp;
bridger-cli/src/utils/botEvents.ts (1)
1-28
: LGTM! Well-structured event categorization
The events are well-organized into logical categories (Bridger state, Epoch state, Claim state, Transaction state) with clear naming conventions.
bridger-cli/src/utils/emitter.ts (1)
1-14
: LGTM! Clean implementation of test event suppression
The MockEmitter effectively suppresses BotEvents during tests while allowing other events to propagate normally.
bridger-cli/src/utils/transactionHandler.ts (1)
33-33
: 🛠️ Refactor suggestion
Define a specific interface for veaOutbox
.
The veaOutbox
property is typed as any
, which reduces type safety. Consider implementing the previously suggested interface to enhance type checking while maintaining flexibility for different chain implementations.
interface IVeaOutbox {
provider: ethers.providers.Provider;
filters: {
Claimed: (arg0: any, arg1: number, arg2: any) => any;
VerificationStarted: (epoch: number) => any;
Challenged: (epoch: number) => any;
};
estimateGas: {
claim: (epoch: number, stateRoot: string, options: any) => Promise<ethers.BigNumber>;
startVerification: (epoch: number, claim: ClaimStruct) => Promise<ethers.BigNumber>;
verifySnapshot: (epoch: number, claim: ClaimStruct) => Promise<ethers.BigNumber>;
withdrawClaimDeposit: (epoch: number, claim: ClaimStruct) => Promise<ethers.BigNumber>;
};
}
bridger-cli/src/utils/transactionHandler.test.ts (1)
1-280
: Well-structured and comprehensive test coverage!
The test suite effectively covers:
- Constructor initialization
- Transaction status checking
- Claim operations
- Verification workflows
- Deposit withdrawals
- Error cases and edge conditions
Good use of Jest mocks and proper test isolation.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (13)
bridger-cli/src/utils/ethers.ts (2)
12-18
: Add error handling for invalid private keys.The wallet creation functions should validate the private key format to prevent runtime errors.
Apply this diff to add validation:
function getWallet(privateKey: string, web3ProviderURL: string) { + if (!privateKey.match(/^0x[0-9a-fA-F]{64}$/)) { + throw new Error('Invalid private key format'); + } return new Wallet(privateKey, new JsonRpcProvider(web3ProviderURL)); } function getWalletRPC(privateKey: string, rpc: JsonRpcProvider) { + if (!privateKey.match(/^0x[0-9a-fA-F]{64}$/)) { + throw new Error('Invalid private key format'); + } return new Wallet(privateKey, rpc); }
20-52
: Consider standardizing chain ID handling patterns.The three VEA connection functions use different patterns for chain ID handling:
getVeaInbox
: switch without defaultgetVeaOutbox
: bridge config with chain namesgetVeaOutboxDevnet
: if-else conditionsConsider standardizing the approach across all functions for better maintainability.
Suggestion: Use the bridge configuration pattern consistently across all functions, as it provides better abstraction and maintainability:
function getVeaInbox(veaInboxAddress: string, privateKey: string, web3ProviderURL: string, chainId: number) { const bridge = getBridgeConfig(chainId); switch (bridge.chain) { case "sepolia": case "mainnet": return VeaInboxArbToEth__factory.connect(veaInboxAddress, getWallet(privateKey, web3ProviderURL)); case "chiado": case "gnosis": return VeaInboxArbToGnosis__factory.connect(veaInboxAddress, getWallet(privateKey, web3ProviderURL)); default: throw new Error(`Unsupported chainId: ${chainId}`); } }bridger-cli/src/utils/claim.ts (1)
33-33
: Convert TODO to GitHub issueThe TODO comment about checking logs block range and RPC dependency should be tracked properly.
Would you like me to create a GitHub issue to track this TODO item?
bridger-cli/src/bridger.ts (2)
20-122
: Consider future modularization of the watch function.While the current implementation is functional, the complexity suggests it could benefit from being broken down into smaller, focused components in a future refactor. This would improve testability and maintainability.
Consider:
- Extracting epoch processing logic into a separate function
- Creating a dedicated class for epoch state management
- Separating the verification logic into its own module
124-124
: Add type annotation to wait function.The utility function should have proper type annotations for better type safety.
-const wait = (ms) => new Promise((r) => setTimeout(r, ms)); +const wait = (ms: number): Promise<void> => new Promise((r) => setTimeout(r, ms));bridger-cli/src/utils/transactionHandler.ts (1)
69-75
: Simplify conditional logic by removing unnecessary else.The else block can be removed to improve code clarity while maintaining the same functionality.
if (confirmations >= this.requiredConfirmations) { this.emitter.emit(BotEvents.TXN_FINAL, trnxHash, confirmations); return false; -} else { - this.emitter.emit(BotEvents.TXN_NOT_FINAL, trnxHash, confirmations); - return true; } +this.emitter.emit(BotEvents.TXN_NOT_FINAL, trnxHash, confirmations); +return true;bridger-cli/src/utils/claim.test.ts (3)
9-10
: Add type annotations for better type safety.Consider adding explicit type annotations for the test variables to improve type safety and code clarity.
- let mockClaim: ClaimStruct; - let getClaimForEpoch: jest.Mock; - let veaOutbox: any; + let mockClaim: ClaimStruct; + let getClaimForEpoch: jest.Mock<Promise<any>>; + let veaOutbox: { + queryFilter: jest.Mock; + provider: { + getBlock: jest.Mock; + }; + filters: { + VerificationStarted: jest.Mock; + Challenged: jest.Mock; + Claimed: jest.Mock; + }; + };
106-125
: Add assertions for event emission in fallback test.The fallback test should verify that appropriate events are emitted when falling back to logs.
it("should fallback on logs if claimData is undefined", async () => { getClaimForEpoch.mockResolvedValueOnce(undefined); veaOutbox.queryFilter.mockImplementationOnce(() => Promise.resolve([ { blockNumber: 1234, data: mockClaim.stateRoot, topics: [ethers.ZeroAddress, `0x${"0".repeat(24)}${mockClaim.claimer.slice(2)}`], }, ]) ); veaOutbox.queryFilter.mockImplementationOnce(() => Promise.resolve([])); veaOutbox.queryFilter.mockImplementationOnce(() => Promise.resolve([])); + const emitSpy = jest.spyOn(transactionHandler.emitter, 'emit'); const claim = await fetchClaim(veaOutbox, epoch, getClaimForEpoch); expect(claim).toBeDefined(); expect(claim).toEqual(mockClaim); expect(getClaimForEpoch).toHaveBeenCalledWith(epoch); + expect(emitSpy).toHaveBeenCalledWith(BotEvents.FALLBACK_TO_LOGS); });
139-164
: Add edge cases for hashClaim tests.Consider adding test cases for:
- Empty/zero values in claim fields
- Maximum possible values
- Special characters in strings
Example test cases to add:
it("should handle empty values", () => { const emptyMockClaim: ClaimStruct = { ...mockClaim, stateRoot: "0x0000000000000000000000000000000000000000000000000000000000000000", claimer: "0x0000000000000000000000000000000000000000" }; const hash = hashClaim(emptyMockClaim); expect(hash).toBeDefined(); }); it("should handle maximum values", () => { const maxMockClaim: ClaimStruct = { ...mockClaim, timestampClaimed: Number.MAX_SAFE_INTEGER, blocknumberVerification: Number.MAX_SAFE_INTEGER }; const hash = hashClaim(maxMockClaim); expect(hash).toBeDefined(); });bridger-cli/src/utils/transactionHandler.test.ts (4)
9-10
: Add type annotations for better type safety.Consider adding explicit type annotations for the test variables to improve type safety and code clarity.
- let claim: any; - let veaOutbox: any; + let claim: ClaimStruct; + let veaOutbox: { + estimateGas: { + claim: jest.Mock; + verifySnapshot: jest.Mock; + startVerification: jest.Mock; + withdrawClaimDeposit: jest.Mock; + }; + claim: jest.Mock; + verifySnapshot: jest.Mock; + startVerification: jest.Mock; + withdrawClaimDeposit: jest.Mock; + provider: { + getTransactionReceipt: jest.Mock; + getBlock: jest.Mock; + }; + };
42-59
: Add negative test cases for constructor.Consider adding test cases for invalid inputs:
- Invalid chainId
- Negative epoch
- Invalid claim structure
Example test cases to add:
it("should throw error for invalid chainId", () => { expect(() => new TransactionHandler(-1, epoch, veaOutbox)) .toThrow("Invalid chainId"); }); it("should throw error for negative epoch", () => { expect(() => new TransactionHandler(chainId, -1, veaOutbox)) .toThrow("Invalid epoch"); }); it("should throw error for invalid claim structure", () => { const invalidClaim = { ...claim }; delete invalidClaim.stateRoot; expect(() => new TransactionHandler(chainId, epoch, veaOutbox, invalidClaim)) .toThrow("Invalid claim structure"); });
61-110
: Add error handling tests for transaction status checks.Consider adding test cases for provider errors:
- Network errors during receipt retrieval
- Block retrieval failures
Example test cases to add:
it("should handle network error during receipt retrieval", async () => { veaOutbox.provider.getTransactionReceipt.mockRejectedValue( new Error("Network error") ); const emitSpy = jest.spyOn(transactionHandler.emitter, "emit"); await expect( transactionHandler.checkTransactionPendingStatus("0x1234") ).rejects.toThrow("Network error"); expect(emitSpy).toHaveBeenCalledWith( BotEvents.NETWORK_ERROR, "Failed to retrieve transaction receipt" ); }); it("should handle block retrieval failure", async () => { veaOutbox.provider.getBlock.mockRejectedValue( new Error("Block not found") ); const emitSpy = jest.spyOn(transactionHandler.emitter, "emit"); await expect( transactionHandler.checkTransactionPendingStatus("0x1234") ).rejects.toThrow("Block not found"); expect(emitSpy).toHaveBeenCalledWith( BotEvents.BLOCK_RETRIEVAL_ERROR, "Failed to retrieve block" ); });
112-272
: Add gas estimation error tests for transaction methods.Consider adding test cases for gas estimation failures across all transaction methods.
Example test case to add:
describe("gas estimation errors", () => { it("should handle gas estimation failure in makeClaim", async () => { veaOutbox.estimateGas.claim.mockRejectedValue( new Error("Gas estimation failed") ); const transactionHandler = new TransactionHandler( chainId, epoch, veaOutbox, null ); const emitSpy = jest.spyOn(transactionHandler.emitter, "emit"); await transactionHandler.makeClaim(claim.stateRoot); expect(emitSpy).toHaveBeenCalledWith( BotEvents.GAS_ESTIMATION_ERROR, "Failed to estimate gas for claim" ); expect(transactionHandler.pendingTransactions.claim).toBeNull(); }); });
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
⛔ Files ignored due to path filters (1)
yarn.lock
is excluded by!**/yarn.lock
,!**/*.lock
📒 Files selected for processing (8)
bridger-cli/src/bridger.test.ts
(1 hunks)bridger-cli/src/bridger.ts
(1 hunks)bridger-cli/src/consts/bridgeRoutes.ts
(1 hunks)bridger-cli/src/utils/claim.test.ts
(1 hunks)bridger-cli/src/utils/claim.ts
(1 hunks)bridger-cli/src/utils/ethers.ts
(1 hunks)bridger-cli/src/utils/transactionHandler.test.ts
(1 hunks)bridger-cli/src/utils/transactionHandler.ts
(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
- bridger-cli/src/consts/bridgeRoutes.ts
- bridger-cli/src/bridger.test.ts
🧰 Additional context used
📓 Learnings (5)
bridger-cli/src/utils/transactionHandler.test.ts (1)
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/transactionHandler.ts:64-77
Timestamp: 2024-12-09T09:42:34.067Z
Learning: In the `TransactionHandler` class (`bridger-cli/src/utils/transactionHandler.ts`), it's acceptable to let methods like `makeClaim` fail without additional error handling.
bridger-cli/src/bridger.ts (3)
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/bridger.ts:113-118
Timestamp: 2024-12-10T04:45:36.079Z
Learning: Graceful shutdown handling in `bridger-cli` will be addressed in future PRs.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/bridger.ts:25-109
Timestamp: 2024-12-09T10:53:55.715Z
Learning: In the `bridger-cli/src/bridger.ts` file, refactoring the main loop and adding additional error handling are not needed unless deemed necessary by the developer.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/bridger.ts:1-8
Timestamp: 2024-12-09T09:48:37.012Z
Learning: The `bridger-cli` directory contains a `.env.dist` file with environment variables, which will be updated with proper documentation.
bridger-cli/src/utils/claim.ts (3)
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/claim.ts:23-32
Timestamp: 2024-12-10T04:59:10.224Z
Learning: In `bridger-cli/src/utils/claim.ts`, within the `fetchClaim` function, when `claimData` is undefined, avoid initializing it with default values, as this can result in incorrect claim values and make issues harder to identify.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/claim.ts:56-69
Timestamp: 2024-12-09T10:54:57.068Z
Learning: In the TypeScript file 'bridger-cli/src/utils/claim.ts', the upper layers handle input validation for the 'hashClaim' function. Therefore, explicit input validation within 'hashClaim' is not necessary.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/claim.ts:42-51
Timestamp: 2024-12-09T10:54:09.943Z
Learning: In the `bridger-cli/src/utils/claim.ts` file, within the `fetchClaim` function, explicit error handling for provider calls and event queries is not required; errors should be allowed to propagate naturally.
bridger-cli/src/utils/ethers.ts (2)
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/ethers.ts:31-37
Timestamp: 2024-12-10T04:59:11.283Z
Learning: In the project, `chainId` validation is performed in outer layers, so individual functions like `getVeaInboxProvider` do not need to handle unsupported `chainId`s.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/ethers.ts:20-82
Timestamp: 2024-12-09T10:18:00.133Z
Learning: In `bridger-cli/src/utils/ethers.ts`, prefer to keep the existing `chainId` checks without refactoring to avoid overcomplicating the code with additional conditional logic.
bridger-cli/src/utils/transactionHandler.ts (4)
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/transactionHandler.ts:64-77
Timestamp: 2024-12-09T09:42:34.067Z
Learning: In the `TransactionHandler` class (`bridger-cli/src/utils/transactionHandler.ts`), it's acceptable to let methods like `makeClaim` fail without additional error handling.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/transactionHandler.ts:131-144
Timestamp: 2024-12-09T09:40:49.098Z
Learning: In the `TransactionHandler` class, it's acceptable to let methods like `withdrawClaimDeposit` fail without additional error handling.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/transactionHandler.ts:13-13
Timestamp: 2024-12-09T09:40:28.400Z
Learning: In `bridger-cli/src/utils/transactionHandler.ts`, the `veaOutbox` implementations differ for each chain, but a common interface should be defined for type checks to enhance type safety.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/transactionHandler.ts:79-101
Timestamp: 2024-12-09T09:42:51.590Z
Learning: In the `bridger-cli/src/utils/transactionHandler.ts` file, within the `TransactionHandler` class, it's acceptable to let methods like `startVerification` fail without additional error handling.
🔇 Additional comments (9)
bridger-cli/src/utils/ethers.ts (2)
1-10
: LGTM! Well-organized imports.The imports are properly organized and all dependencies are correctly specified.
20-28
: 🛠️ Refactor suggestionHandle potential undefined return in getVeaInbox.
The function might return
undefined
for unsupported chains as there's no default case in the switch statement.Apply this diff to ensure consistent return behavior:
function getVeaInbox(veaInboxAddress: string, privateKey: string, web3ProviderURL: string, chainId: number) { switch (chainId) { case 11155111: return VeaInboxArbToEth__factory.connect(veaInboxAddress, getWallet(privateKey, web3ProviderURL)); case 10200: return VeaInboxArbToGnosis__factory.connect(veaInboxAddress, getWallet(privateKey, web3ProviderURL)); + default: + throw new Error(`Unsupported chainId: ${chainId}`); } }Likely invalid or redundant comment.
bridger-cli/src/utils/claim.ts (4)
1-13
: Well-structured type definition and imports!The
ClaimStruct
type is well-defined with proper TypeScript syntax for Ethereum addresses and includes all necessary fields for claim management.
15-31
: Excellent function documentation!The JSDoc documentation is comprehensive, including parameter descriptions and example usage. The function signature is well-defined with proper types and default values.
34-70
: Robust claim fetching implementation!The implementation correctly handles various claim states and follows the established pattern of not initializing
claimData
with default values to avoid masking potential issues.
72-95
: Clean and efficient hash implementation!The function correctly uses
solidityPackedKeccak256
with proper parameter ordering and types. As per established patterns, input validation is handled by upper layers.bridger-cli/src/bridger.ts (1)
1-19
: Well-organized imports and function declaration!The imports are properly organized, and the watch function is well-designed with appropriate default parameters and event emitter integration.
bridger-cli/src/utils/transactionHandler.ts (2)
1-52
: Well-structured class with clear interface definition!The code demonstrates good organization with a clear interface definition and comprehensive documentation. The class structure is well-designed with proper property initialization.
78-154
: Well-implemented transaction methods!The transaction methods are properly implemented with:
- Consistent event emission
- Proper gas estimation
- Clean transaction handling
- Appropriate status checking
Quality Gate failedFailed conditions |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🧹 Nitpick comments (3)
bridger-cli/src/utils/transactionHandler.ts (3)
26-29
: Fix incorrect example in JSDoc documentationThe example shows a non-existent method
sendTransaction
. Update it to show a real method likemakeClaim
.* @example -* const txHandler = new TransactionHandler(11155111, 240752, veaOutbox, claim); -* txHandler.sendTransaction(txData); +* const txHandler = new TransactionHandler(11155111, 240752, veaOutbox, claim); +* await txHandler.makeClaim(stateRoot);
46-46
: Fix typo in constructor parameter nameThe parameter
emiitter
has a typo (double 'i').-constructor(chainId: number, epoch: number, veaOutbox: any, claim?: ClaimStruct, emiitter?: EventEmitter) { +constructor(chainId: number, epoch: number, veaOutbox: any, claim?: ClaimStruct, emitter?: EventEmitter) {
85-89
: Consider potential gas estimation race conditionsThe pattern of estimating gas and then using it in a subsequent transaction could lead to race conditions if the blockchain state changes between the two calls. Consider adding a buffer to the estimated gas to handle slight variations.
Example for the claim method:
const estimateGas = await this.veaOutbox.estimateGas.claim(this.epoch, stateRoot, { value: deposit }); const claimTransaction = await this.veaOutbox.claim(this.epoch, stateRoot, { value: deposit, - gasLimit: estimateGas, + gasLimit: estimateGas.mul(120).div(100), // Add 20% buffer });Also applies to: 111-113, 135-138, 148-151
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (3)
bridger-cli/src/utils/botEvents.ts
(1 hunks)bridger-cli/src/utils/logger.ts
(1 hunks)bridger-cli/src/utils/transactionHandler.ts
(1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
- bridger-cli/src/utils/botEvents.ts
- bridger-cli/src/utils/logger.ts
🧰 Additional context used
📓 Learnings (1)
bridger-cli/src/utils/transactionHandler.ts (4)
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/transactionHandler.ts:64-77
Timestamp: 2024-12-09T09:42:34.067Z
Learning: In the `TransactionHandler` class (`bridger-cli/src/utils/transactionHandler.ts`), it's acceptable to let methods like `makeClaim` fail without additional error handling.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/transactionHandler.ts:131-144
Timestamp: 2024-12-09T09:40:49.098Z
Learning: In the `TransactionHandler` class, it's acceptable to let methods like `withdrawClaimDeposit` fail without additional error handling.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/transactionHandler.ts:13-13
Timestamp: 2024-12-09T09:40:28.400Z
Learning: In `bridger-cli/src/utils/transactionHandler.ts`, the `veaOutbox` implementations differ for each chain, but a common interface should be defined for type checks to enhance type safety.
Learnt from: mani99brar
PR: kleros/vea#370
File: bridger-cli/src/utils/transactionHandler.ts:79-101
Timestamp: 2024-12-09T09:42:51.590Z
Learning: In the `bridger-cli/src/utils/transactionHandler.ts` file, within the `TransactionHandler` class, it's acceptable to let methods like `startVerification` fail without additional error handling.
🔇 Additional comments (2)
bridger-cli/src/utils/transactionHandler.ts (2)
69-75
: Simplify conditional logic by removing unnecessary else branchThe else branch can be removed as the return statement in the if block already prevents execution of subsequent code.
if (confirmations >= this.requiredConfirmations) { this.emitter.emit(BotEvents.TXN_FINAL, trnxHash, confirmations); return false; -} else { - this.emitter.emit(BotEvents.TXN_NOT_FINAL, trnxHash, confirmations); - return true; } +this.emitter.emit(BotEvents.TXN_NOT_FINAL, trnxHash, confirmations); +return true;
31-155
: Well-structured implementation with good event handlingThe
TransactionHandler
class is well-implemented with consistent patterns across methods, good event emission for observability, and proper handling of blockchain interactions.
PR-Codex overview
This PR focuses on enhancing the
bridger-cli
project by adding new features, improving configurations, and refining the codebase, particularly around transactions, epoch handling, and event logging.Detailed summary
workspaces
topackage.json
.graphnode_db
.bridger-cli
.ShutdownSignal
class for shutdown handling.TransactionHandler
.BotEvents
..env.example
and.env.dist
files for environment variables.fetchClaim
.Summary by CodeRabbit
New Features
bridger-cli
with essential variables.TransactionHandler
class for managing blockchain transactions.Bug Fixes
VeaInbox.ts
andVeaOutbox.ts
.Documentation
Chores