Skip to content

Custom_Chain #63

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

Merged
merged 2 commits into from
May 7, 2025
Merged

Custom_Chain #63

merged 2 commits into from
May 7, 2025

Conversation

vignesha22
Copy link
Contributor

@vignesha22 vignesha22 commented May 6, 2025

Description

  • Added ability to use custom chain and custom factory addresses of bootstrap, validator and wallet factory

Types of changes

What types of changes does your code introduce?

  • Bugfix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to not work as expected)
  • Documentation Update
  • Code style update (formatting, renaming)
  • Refactoring (no functional changes, no api changes)
  • Build related changes
  • Other (please describe):

Further comments (optional)

Summary by CodeRabbit

  • New Features

    • Added support for configuring and using custom blockchain networks within the SDK and wallet options.
    • Introduced a new example script demonstrating how to interact with a custom chain.
  • Bug Fixes

    • Improved fallback mechanisms for contract address resolution in wallet and account APIs.
  • Documentation

    • Updated the changelog to reflect new features and fixes in version 5.1.2.
  • Chores

    • Bumped package version to 5.1.2.

Copy link

coderabbitai bot commented May 6, 2025

Walkthrough

This update introduces support for custom blockchain networks by allowing users to specify custom chain configurations throughout the SDK. New optional parameters for custom chain, bootstrap, and validator addresses are added to configuration interfaces and constructors. A usage example is provided, and internal logic is adjusted to prioritize user-supplied chain data over defaults.

Changes

File(s) Change Summary
CHANGELOG.md, package.json Added changelog entry for v5.1.2 (2025-05-07) describing the new custom chain support. Updated package version from 5.1.1 to 5.1.2.
examples/basics/custom-chain.ts Added a new example script demonstrating how to configure and use a custom blockchain network with the SDK, including wallet operations and transaction handling.
src/sdk/interfaces.ts, src/sdk/wallet/interfaces.ts Extended SdkOptions and WalletOptions interfaces to include optional chain (type Chain), bootstrapAddress, and multipleOwnerECDSAValidatorAddress properties for custom network support.
src/sdk/common/utils/viem-utils.ts Added new exported function getPublicClientByChain to create a public client using a provided Chain object and transport, bypassing chain ID lookup.
src/sdk/sdk.ts Updated ModularSdk constructor to use getPublicClientByChain with user-supplied chain if chainId is not found in defaults, throwing if chain is missing. Otherwise, uses existing logic.
src/sdk/base/BaseAccountAPI.ts Modified constructor to extract chain from options and pass it to WalletService. Adjusted validator address resolution to include multipleOwnerECDSAValidatorAddress from options as a fallback.
src/sdk/base/EtherspotWalletAPI.ts Enhanced bootstrap address resolution in constructor to include bootstrapAddress from options as a fallback before defaulting.
src/sdk/wallet/providers/key.wallet-provider.ts Updated KeyWalletProvider constructor to accept an optional chain parameter, using it as a fallback if not found in defaults.
src/sdk/wallet/wallet.service.ts Added chainObject property initialized from options. Updated wallet provider switching to pass chainObject to KeyWalletProvider for custom network support.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant ExampleScript
    participant ModularSdk
    participant WalletService
    participant KeyWalletProvider
    participant CustomChain

    User->>ExampleScript: Run custom-chain.ts
    ExampleScript->>ModularSdk: Initialize with custom chain config
    ModularSdk->>WalletService: Pass custom chain in options
    WalletService->>KeyWalletProvider: Instantiate with custom chain
    KeyWalletProvider->>CustomChain: Use chain parameters for client
    ExampleScript->>ModularSdk: Perform wallet and transaction operations
    ModularSdk->>CustomChain: Interact using custom configuration
Loading

Suggested reviewers

  • ch4r10t33r
  • kanthgithub

Poem

A custom chain hops in, what a lovely feat,
SDK now listens to networks bespoke and neat.
With chain and contracts you define,
Transactions flow, the stars align.
Rabbits cheer for code so spry—
New chains to chase, oh my, oh my!
🐇✨

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

examples/basics/custom-chain.ts

Oops! Something went wrong! :(

ESLint: 8.28.0

Error [ERR_REQUIRE_ESM]: require() of ES Module /.eslintrc.js from /node_modules/.pnpm/@eslint[email protected]/node_modules/@eslint/eslintrc/dist/eslintrc.cjs not supported.
.eslintrc.js is treated as an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which declares all .js files in that package scope as ES modules.
Instead either rename .eslintrc.js to end in .cjs, change the requiring code to use dynamic import() which is available in all CommonJS modules, or change "type": "module" to "type": "commonjs" in /package.json to treat all .js files as CommonJS (using .mjs for all ES modules instead).

at TracingChannel.traceSync (node:diagnostics_channel:315:14)
at module.exports [as default] (/node_modules/.pnpm/[email protected]/node_modules/import-fresh/index.js:33:91)
at loadJSConfigFile (/node_modules/.pnpm/@[email protected]/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2562:47)
at loadConfigFile (/node_modules/.pnpm/@[email protected]/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2646:20)
at ConfigArrayFactory.loadInDirectory (/node_modules/.pnpm/@[email protected]/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2856:34)
src/sdk/base/BaseAccountAPI.ts

Oops! Something went wrong! :(

ESLint: 8.28.0

Error [ERR_REQUIRE_ESM]: require() of ES Module /.eslintrc.js from /node_modules/.pnpm/@eslint[email protected]/node_modules/@eslint/eslintrc/dist/eslintrc.cjs not supported.
.eslintrc.js is treated as an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which declares all .js files in that package scope as ES modules.
Instead either rename .eslintrc.js to end in .cjs, change the requiring code to use dynamic import() which is available in all CommonJS modules, or change "type": "module" to "type": "commonjs" in /package.json to treat all .js files as CommonJS (using .mjs for all ES modules instead).

at TracingChannel.traceSync (node:diagnostics_channel:315:14)
at module.exports [as default] (/node_modules/.pnpm/[email protected]/node_modules/import-fresh/index.js:33:91)
at loadJSConfigFile (/node_modules/.pnpm/@[email protected]/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2562:47)
at loadConfigFile (/node_modules/.pnpm/@[email protected]/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2646:20)
at ConfigArrayFactory.loadInDirectory (/node_modules/.pnpm/@[email protected]/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2856:34)
src/sdk/base/EtherspotWalletAPI.ts

Oops! Something went wrong! :(

ESLint: 8.28.0

Error [ERR_REQUIRE_ESM]: require() of ES Module /.eslintrc.js from /node_modules/.pnpm/@eslint[email protected]/node_modules/@eslint/eslintrc/dist/eslintrc.cjs not supported.
.eslintrc.js is treated as an ES module file as it is a .js file whose nearest parent package.json contains "type": "module" which declares all .js files in that package scope as ES modules.
Instead either rename .eslintrc.js to end in .cjs, change the requiring code to use dynamic import() which is available in all CommonJS modules, or change "type": "module" to "type": "commonjs" in /package.json to treat all .js files as CommonJS (using .mjs for all ES modules instead).

at TracingChannel.traceSync (node:diagnostics_channel:315:14)
at module.exports [as default] (/node_modules/.pnpm/[email protected]/node_modules/import-fresh/index.js:33:91)
at loadJSConfigFile (/node_modules/.pnpm/@[email protected]/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2562:47)
at loadConfigFile (/node_modules/.pnpm/@[email protected]/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2646:20)
at ConfigArrayFactory.loadInDirectory (/node_modules/.pnpm/@[email protected]/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2856:34)
  • 1 others

📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a2dc93e and 11ee15d.

📒 Files selected for processing (4)
  • examples/basics/custom-chain.ts (1 hunks)
  • src/sdk/base/BaseAccountAPI.ts (3 hunks)
  • src/sdk/base/EtherspotWalletAPI.ts (1 hunks)
  • src/sdk/interfaces.ts (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (4)
  • src/sdk/interfaces.ts
  • src/sdk/base/BaseAccountAPI.ts
  • src/sdk/base/EtherspotWalletAPI.ts
  • examples/basics/custom-chain.ts
✨ Finishing Touches
  • 📝 Generate Docstrings

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

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

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)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

@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)
CHANGELOG.md (1)

2-4: Consider categorizing this as "Feature" instead of "Fix"

The addition of custom chain support is a new capability rather than a bug fix. For clarity and consistency, consider changing the category from "Fix" to "Feature" or "Enhancement".

-### Fix
+### Feature
 - Added ability to use custom chain
src/sdk/common/utils/viem-utils.ts (1)

29-35: Good implementation of public client creation for custom chains

The new utility function properly creates a public client directly from a Chain object, enabling support for custom chains beyond the predefined Networks.

However, consider adding some error handling for when a null or invalid chain is provided:

 export const getPublicClientByChain = ({ chain, transport }: { chain: Chain, transport: Transport }) => {
+  if (!chain) {
+    throw new Error('Chain is required for creating a public client');
+  }
   const publicClient = createPublicClient({
     chain: chain,
     transport: transport
   });
   return publicClient;
 }
src/sdk/sdk.ts (1)

77-94: Improve error message clarity for custom chain requirement.

The conditional logic for handling custom chains is well-implemented, but the error message could be more informative.

-        throw new Exception('chain needs to be set when chainId is not in default Networks'); 
+        throw new Exception('Custom chain object must be provided when using a chainId not found in default Networks. Use the defineChain function from viem to create a custom chain.'); 
examples/basics/custom-chain.ts (2)

9-17: Consider using environment variables for configuration.

Hardcoded values for addresses and URLs would be better placed in environment variables for flexibility and security, similar to how you're handling the private key.

- const recipient = '0x80a1874E1046B1cc5deFdf4D3153838B72fF94Ac'; // recipient wallet address
- const value = '0.0000001'; // transfer value
- const bundlerApiKey = 'etherspot_public_key';
- const bundlerUrl = 'https://testnet-rpc.etherspot.io/v2/84532'; // bundler url
- const chainId = 84532; // chain id
- const entryPointAddress = '0x0000000071727De22E5E9d8BAf0edAc6f37da032'; // entry point address
- const walletFactoryAddress = '0x2A40091f044e48DEB5C0FCbc442E443F3341B451'; // wallet factory address
- const bootstrapAddress = '0x0D5154d7751b6e2fDaa06F0cC9B400549394C8AA'; // bootstrap address
- const multiECDSAValidatorAddress = '0x0740Ed7c11b9da33d9C80Bd76b826e4E90CC1906'; // multi owner ECDSA validator factory address
+ const recipient = process.env.RECIPIENT_ADDRESS || '0x80a1874E1046B1cc5deFdf4D3153838B72fF94Ac'; // recipient wallet address
+ const value = process.env.TRANSFER_VALUE || '0.0000001'; // transfer value
+ const bundlerApiKey = process.env.BUNDLER_API_KEY || 'etherspot_public_key';
+ const bundlerUrl = process.env.BUNDLER_URL || 'https://testnet-rpc.etherspot.io/v2/84532'; // bundler url
+ const chainId = Number(process.env.CHAIN_ID || 84532); // chain id
+ const entryPointAddress = process.env.ENTRY_POINT_ADDRESS || '0x0000000071727De22E5E9d8BAf0edAc6f37da032'; // entry point address
+ const walletFactoryAddress = process.env.WALLET_FACTORY_ADDRESS || '0x2A40091f044e48DEB5C0FCbc442E443F3341B451'; // wallet factory address
+ const bootstrapAddress = process.env.BOOTSTRAP_ADDRESS || '0x0D5154d7751b6e2fDaa06F0cC9B400549394C8AA'; // bootstrap address
+ const multiECDSAValidatorAddress = process.env.VALIDATOR_ADDRESS || '0x0740Ed7c11b9da33d9C80Bd76b826e4E90CC1906'; // multi owner ECDSA validator factory address

79-79: Correct the timeout comment.

The timeout is set to 1,200,000 ms which is 20 minutes, not 1 minute as the comment suggests.

- const timeout = Date.now() + 1200000; // 1 minute timeout
+ const timeout = Date.now() + 1200000; // 20 minutes timeout
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 797a8bd and a2dc93e.

📒 Files selected for processing (11)
  • CHANGELOG.md (1 hunks)
  • examples/basics/custom-chain.ts (1 hunks)
  • package.json (1 hunks)
  • src/sdk/base/BaseAccountAPI.ts (3 hunks)
  • src/sdk/base/EtherspotWalletAPI.ts (1 hunks)
  • src/sdk/common/utils/viem-utils.ts (1 hunks)
  • src/sdk/interfaces.ts (2 hunks)
  • src/sdk/sdk.ts (3 hunks)
  • src/sdk/wallet/interfaces.ts (1 hunks)
  • src/sdk/wallet/providers/key.wallet-provider.ts (2 hunks)
  • src/sdk/wallet/wallet.service.ts (4 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (4)
src/sdk/wallet/providers/key.wallet-provider.ts (1)
src/sdk/network/constants.ts (1)
  • Networks (90-540)
src/sdk/base/EtherspotWalletAPI.ts (1)
src/sdk/network/constants.ts (2)
  • Networks (90-540)
  • DEFAULT_BOOTSTRAP_ADDRESS (543-543)
src/sdk/wallet/wallet.service.ts (1)
src/sdk/wallet/providers/key.wallet-provider.ts (1)
  • KeyWalletProvider (6-110)
src/sdk/base/BaseAccountAPI.ts (1)
src/sdk/network/constants.ts (2)
  • Networks (90-540)
  • DEFAULT_MULTIPLE_OWNER_ECDSA_VALIDATOR_ADDRESS (544-544)
🔇 Additional comments (21)
package.json (1)

3-3: Version bump looks good

The version increment from 5.1.1 to 5.1.2 is appropriate for this feature addition that maintains backward compatibility.

src/sdk/wallet/interfaces.ts (2)

1-1: Proper import for Chain type

The import for the Chain type from viem is correctly added to support the interface extension.


10-10: Well-designed interface extension

The optional chain property is correctly added to the WalletOptions interface, maintaining backward compatibility while enabling the new custom chain functionality.

src/sdk/common/utils/viem-utils.ts (1)

29-35:

✅ Verification successful

Verify custom chain usage across the SDK

This utility function is part of a broader feature for custom chains. Ensure that all related components (SDK constructors, wallet providers, etc.) consistently use this function when dealing with custom chains.


🏁 Script executed:

#!/bin/bash
# Search for usages of getPublicClientByChain across the codebase
echo "Checking for usages of getPublicClientByChain:"
rg "getPublicClientByChain" --type ts

# Check if custom chain property is consistently passed through in key files
echo "Checking if custom chain is properly propagated in SDK constructor:"
rg -A 10 -B 5 "export class ModularSdk" --type ts

echo "Checking wallet provider implementation for custom chain support:"
rg -A 10 "WalletProvider.*chain" --type ts

echo "Checking for custom chain examples:"
fd "custom-chain" --type ts

Length of output: 2760


🏁 Script executed:

#!/bin/bash
echo "Searching for direct createPublicClient usage excluding viem-utils.ts:"
rg -n "createPublicClient" --type ts | grep -v "viem-utils.ts" || echo "No direct createPublicClient calls found outside viem-utils.ts"

echo
echo "Inspecting sdk.ts usage snippet around getPublicClientByChain:"
rg -n -A5 -B5 "getPublicClientByChain" src/sdk/sdk.ts

echo
echo "Inspecting imports in wallet.service.ts:"
sed -n '1,30p' src/sdk/wallet/wallet.service.ts

echo
echo "Locating KeyWalletProvider implementation:"
rg -l "class KeyWalletProvider" --type ts

echo
echo "Snippet around KeyWalletProvider definition:"
rg -n -A5 -B5 "class KeyWalletProvider" --type ts

Length of output: 3746


Custom chain support verified—no changes needed

I checked that:

  • src/sdk/sdk.ts uses getPublicClientByChain when falling back to a custom chain.
  • Wallet providers (e.g. KeyWalletProvider) accept the optional chainObject and pass it into Viem’s createWalletClient, so custom chains are handled there as well.
  • No direct calls to Viem’s createPublicClient remain in the SDK (only in example scripts).

Everything is already wired to support custom chains correctly. You can disregard the earlier verification request.

src/sdk/interfaces.ts (3)

1-1: Import of Chain from 'viem' is correctly added.

The import statement appropriately includes the Chain type from the 'viem' package, which is needed for the new optional property.


15-15: Good addition of optional chain property.

This new optional property allows users to specify a custom blockchain network, which aligns with the PR objective to support custom chains.


23-24: Appropriate addition of address customization options.

These optional properties enable users to specify custom addresses for bootstrap and validator components, directly supporting the PR's objective to allow custom factory addresses.

src/sdk/base/BaseAccountAPI.ts (3)

71-71: Correctly extracts chain property from options.

The extraction of the chain property from optionsLike is implemented properly, making it available for use within the constructor.


82-82: Properly passes chain to WalletService constructor.

This change ensures the custom chain configuration is propagated to the wallet service, enabling consistent chain context throughout the SDK.


98-98: Well-implemented validator address resolution.

The code now implements a clear fallback mechanism for validator address resolution:

  1. First tries to use the address from the predefined Networks configuration
  2. Then falls back to the user-provided custom address
  3. Finally uses the default address as a last resort

This approach maintains backward compatibility while enabling customization.

src/sdk/wallet/providers/key.wallet-provider.ts (3)

1-1: Appropriate import of Chain type.

The Chain type is correctly imported from 'viem' to support the new parameter.


13-13: Constructor parameter properly updated.

The constructor signature is correctly enhanced to accept an optional chain parameter without breaking existing functionality.


16-16: Effective chain resolution strategy implemented.

The implementation tries to use the chain from the Networks object first, then falls back to the custom chain if provided. This maintains backward compatibility while enabling custom chain support.

src/sdk/base/EtherspotWalletAPI.ts (1)

57-57: Enhanced bootstrap address resolution implemented.

The code now implements a clear fallback mechanism for the bootstrap address:

  1. First tries to use the address from the predefined Networks configuration
  2. Then falls back to the user-provided custom address
  3. Finally uses the default address as a last resort

This change is consistent with the other modifications in this PR and properly supports custom chain configurations.

src/sdk/wallet/wallet.service.ts (2)

4-4: LGTM! Clean implementation of custom chain support.

The addition of Chain import and chainObject property aligns perfectly with the PR objective to support custom chains.

Also applies to: 18-18, 31-31


83-83: Correctly passes chainObject to KeyWalletProvider.

The implementation properly propagates the custom chain configuration to the wallet provider, ensuring consistent chain context throughout the SDK.

Also applies to: 91-91

src/sdk/sdk.ts (2)

6-7: LGTM! Necessary imports added.

Added import for getPublicClientByChain to support custom chain configuration.


56-56: LGTM! Chain parameter added to options.

Correctly extracting the chain parameter from options to support custom chains.

examples/basics/custom-chain.ts (3)

38-38: Verify private key existence before SDK initialization.

You should validate that the private key is present in the environment variables to prevent runtime errors.

+ if (!process.env.WALLET_PRIVATE_KEY) {
+   throw new Error('WALLET_PRIVATE_KEY environment variable is required');
+ }
  const modularSdk = new ModularSdk(
    process.env.WALLET_PRIVATE_KEY as string,

22-35: LGTM! Well-defined custom chain.

The custom chain definition is clear and comprehensive, including all required properties.


40-48: LGTM! Properly configured SDK with custom chain.

The SDK initialization correctly demonstrates the use of the new custom chain feature along with all necessary addresses.

@etherspot etherspot deleted a comment from coderabbitai bot May 7, 2025
Copy link
Contributor

@nikhilkumar1612 nikhilkumar1612 left a comment

Choose a reason for hiding this comment

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

minor changes for naming conventions and changes to use addresses provided by user.

@vignesha22 vignesha22 requested a review from nikhilkumar1612 May 7, 2025 09:01
Copy link
Contributor

@nikhilkumar1612 nikhilkumar1612 left a comment

Choose a reason for hiding this comment

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

💯 lgtm 💯

@vignesha22 vignesha22 merged commit cd151d9 into master May 7, 2025
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Development

Successfully merging this pull request may close these issues.

2 participants