Skip to content
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

add base sepolia #70

Merged
merged 4 commits into from
Nov 27, 2024
Merged

add base sepolia #70

merged 4 commits into from
Nov 27, 2024

Conversation

mehdi-torabiv
Copy link
Collaborator

@mehdi-torabiv mehdi-torabiv commented Nov 26, 2024

Summary by CodeRabbit

Release Notes

  • New Features

    • Introduced dynamic contract address resolution based on the current blockchain network in multiple components.
    • Added a new constant mapping chain IDs to GraphQL endpoint URLs for enhanced API interactions.
  • Bug Fixes

    • Removed unnecessary console logs in various components to streamline the logout process and improve code cleanliness.
  • Refactor

    • Simplified the component structure in App by reducing nested providers, enhancing readability and maintainability.
    • Updated several hooks to accept chainId as a parameter, improving flexibility in data fetching.
    • Enhanced the IAttestation interface with a new optional property for better data handling.

Copy link

coderabbitai bot commented Nov 26, 2024

Walkthrough

The pull request introduces a new dependency, "oci-js-sdk": "^1.5.8", to the package.json file. Additionally, it significantly restructures the App component by removing several providers and simplifying the component hierarchy. Other changes include modifications to various components and hooks to utilize the chainId from the wagmi library for dynamic contract address resolution, as well as updates to error handling and logging practices throughout the codebase.

Changes

File Change Summary
package.json Added new dependency "oci-js-sdk": "^1.5.8" in dependencies.
src/App.tsx Removed imports and providers (LitProvider, WagmiProvider, etc.); simplified component structure.
src/components/layouts/AccountPopover.tsx Removed console.log('User logged out'); from handleLogout function.
src/components/pages/attestations/StepThree.tsx Added useAccount hook; replaced hardcoded contract address with dynamic retrieval based on chainId.
src/components/pages/attestations/StepTwo.tsx Updated useLinkIdentifierMutation to use chainId from useAccount.
src/hooks/LitProvider.tsx Added debug property in LitNodeClient; removed connection status logging.
src/hooks/useAttestations.tsx Updated useGetAttestations to include chainId parameter.
src/hooks/useSessionSigs.tsx Removed debug console.log statements for authSig and sessionSigs.
src/hooks/useSiweAuth.tsx Replaced hardcoded chainId with dynamic retrieval from useAccount.
src/interfaces/index.ts Added optional property key to IAttestation interface.
src/main.tsx Integrated WagmiProvider and updated rendering logic to include it.
src/pages/Identifiers/Identifiers.tsx Added useAccount hook for dynamic contract address resolution.
src/pages/Permissions/Permissions.tsx Updated contract handling to use dynamic imports based on chainId.
src/services/api/eas/index.ts Removed default value for chainId in linkIdentifier function.
src/services/api/eas/query.ts Updated useLinkIdentifierMutation to require chainId as parameter.
src/services/api/index.ts Removed debug console.log from error handling logic.
src/services/eas/index.ts Added chainIdToGraphQLEndpoint constant for mapping chain IDs to GraphQL endpoints.
src/services/eas/query.ts Updated useGetAttestations to include chainId and modified query logic.
src/utils/contracts/app/contracts.ts Introduced appContracts constant with contract definitions.
src/utils/contracts/eas/constants.ts Updated SCHEMA_TYPES and transformed EAS_SCHEMA_ID to an object mapping chain IDs.
src/utils/contracts/eas/contracts.ts Added contracts constant with contract configurations.
src/utils/contracts/oid/contracts.ts Introduced oidContracts constant with contract definitions.
src/components/layouts/AccountPopover.spec.tsx Removed console spy for logout verification in tests.

Possibly related PRs

  • Feat/attest by delegate #45: The addition of multiple new dependencies in package.json could be relevant as it expands the project's capabilities, similar to the addition of "oci-js-sdk" in the main PR.
  • update api call url #51: The modification of the linkIdentifier function in the API service may relate to the overall integration of new functionalities that could involve the newly added dependency in the main PR.
  • decrypt attestations and show list of identifiers #52: The changes in the Identifiers.tsx file enhance the handling of attestations, which could be relevant to the new dependency added in the main PR.
  • fix logout and update graphql query #63: The updates to the GraphQL query and logout functionality may relate to the overall architecture changes that could be influenced by the new dependency in the main PR.
  • Feat/refactor app #66: The refactor of the app may involve structural changes that could be influenced by the new dependency added in the main PR.

🐰 In the code, we hop and play,
New dependencies brighten the way.
With chainId now in our grasp,
Flexibility is ours to clasp.
Simplified paths, no more clutter,
Our app's a joy, like fresh-baked butter! 🥕✨


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 181ff12 and 0617788.

📒 Files selected for processing (2)
  • src/main.tsx (1 hunks)
  • src/services/eas/index.ts (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/services/eas/index.ts
🧰 Additional context used
🪛 Biome (1.9.4)
src/main.tsx

[error] 24-24: Avoid the use of spread (...) syntax on accumulators.

Spread syntax should be avoided on accumulators (like those in .reduce) because it causes a time complexity of O(n^2).
Consider methods such as .splice or .push instead.

(lint/performance/noAccumulatingSpread)

🔇 Additional comments (5)
src/main.tsx (5)

4-4: LGTM: Imports are appropriate and well-organized

The new imports for RainbowKit, chain configurations, and Wagmi are necessary for the functionality being added.

Also applies to: 7-8


12-15: LGTM: Environment variable validation implemented as suggested

The validation for VITE_PROJECT_ID has been implemented correctly, addressing the previous review comment.


17-17: LGTM: Chain configuration is well-structured

The configuration is well-organized with clear separation of concerns:

  • Supported chains are explicitly defined and exported
  • Transport configuration is properly set up for each chain
  • App name is appropriately set for the platform

Regarding the static analysis warning about spread operator in the reducer: while spread operations in reducers can lead to O(n²) complexity, in this specific case it's acceptable because:

  1. SUPPORTED_CHAINS has a fixed small size (currently 2 chains)
  2. The operation happens once during initialization
  3. The current implementation provides better readability

Also applies to: 19-28


33-35: LGTM: Provider setup follows best practices

The WagmiProvider is correctly positioned in the component tree, with proper configuration passed down.


33-35: Verify Wagmi context consumption in App component

Since WagmiProvider is now moved to the root level, we should verify that the App component and its children are properly consuming the Wagmi context.

✅ Verification successful

The initial check shows some Wagmi hooks usage, but let's get a broader view of the Wagmi integration across the codebase to ensure proper context consumption.


Wagmi integration is properly implemented across the application

The codebase shows comprehensive integration of Wagmi:

  • Proper provider setup in main.tsx
  • Multiple components correctly consuming Wagmi hooks (useAccount, usePublicClient, useWalletClient)
  • Authentication integration via useSiweAuth
  • Protected routes utilizing Wagmi context
  • Consistent usage in attestation flow components
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Check for Wagmi hook usage in App and its components
rg "use(Account|Balance|BlockNumber|Chain|Connect|Disconnect|Network|SignMessage|WriteContract)" src/App.tsx src/components/

Length of output: 458


Script:

#!/bin/bash
# Let's check for any other Wagmi-related imports and usage patterns
rg "wagmi" -A 2 src/

Length of output: 2453


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ 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.

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

cloudflare-workers-and-pages bot commented Nov 26, 2024

Deploying identity-on-chain-platform with  Cloudflare Pages  Cloudflare Pages

Latest commit: 0617788
Status: ✅  Deploy successful!
Preview URL: https://7e5a307e.identity-on-chain-platform.pages.dev
Branch Preview URL: https://feat-multi-chain-support.identity-on-chain-platform.pages.dev

View logs

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

🧹 Outside diff range and nitpick comments (18)
src/utils/contracts/eas/constants.ts (2)

1-2: Consider enhancing type safety and documentation

The schema structure could benefit from better documentation and type definitions:

+// Schema for attestations with the following fields:
+// - key: Unique identifier for the attestation (bytes32)
+// - provider: The provider of the attestation (string)
+// - secret: Encrypted secret data (string)
+// - metadata: Additional contextual information (string)
+export interface AttestationSchema {
+  key: string;
+  provider: string;
+  secret: string;
+  metadata: string;
+}
 export const SCHEMA_TYPES =
   'bytes32 key,string provider,string secret,string metadata';

4-8: Add network documentation for chain IDs

The chain IDs would benefit from clear documentation of which networks they represent.

+// Mapping of chain IDs to their respective EAS schema IDs
+// Chain IDs:
+// - 11155420: Optimism Sepolia Testnet
+// - 84532: Base Sepolia Testnet
+export type ChainId = 11155420 | 84532;
-export const EAS_SCHEMA_ID: { [key: string | number]: string } = {
+export const EAS_SCHEMA_ID: Record<ChainId, string> = {
     '0x2c988095892ea57c600e5cc6fb62531502bc0c8d038ac39dc3fab161b6f122db',
 };
src/utils/contracts/eas/contracts.ts (1)

1-16: Add TypeScript types for better type safety

Consider adding TypeScript types for the contract configuration to prevent potential runtime errors and improve code maintainability.

Add these type definitions:

type EASContract = {
  chainId: number;
  easSchemaUUID: string;
  easContractAddress: string;
  abi: any[]; // Replace 'any' with proper ABI type from EAS package
};

export const contracts: EASContract[] = [
  // ... existing contracts
];
src/services/api/eas/index.ts (1)

Line range hint 3-15: Consider making chainId required consistently

Currently, chainId is marked as optional in all interface definitions but the implementation suggests it's required. Consider making it required consistently across all functions by removing the ? from the type definitions.

 export interface LinkIdentifierParams {
   siweJwt: string;
   anyJwt: string;
-  chainId?: number;
+  chainId: number;
 }

 export interface RevokeIdentifierParams {
   uid: string;
   siweJwt: string;
-  chainId?: number;
+  chainId: number;
 }

 export interface DecryptAttestationsSecretParams {
   uid: string;
   siweJwt: string;
-  chainId?: number;
+  chainId: number;
 }
src/services/eas/index.ts (1)

5-19: LGTM! Consider adding documentation for chain selection.

The implementation of chainIdToGraphQLEndpoint is well-structured and correctly maps test networks to their respective EAS GraphQL endpoints. The inclusion of commented-out mainnet endpoints provides good context for future expansion.

Consider adding a comment block above the constant to document:

  • Which networks are currently supported
  • Why certain networks are commented out
  • Any prerequisites for using specific networks
+/**
+ * Maps chain IDs to their corresponding EAS GraphQL endpoints.
+ * Currently supports test networks:
+ * - Sepolia
+ * - Optimism Sepolia
+ * - Base Sepolia
+ * 
+ * Production networks are commented out pending future deployment.
+ */
 export const chainIdToGraphQLEndpoint: { [key: number]: string } = {
src/services/api/eas/query.ts (1)

Line range hint 14-19: Consider including chainId in mutationKey for proper cache management

While the implementation correctly passes chainId to the linkIdentifier function, the mutationKey should include the chainId to prevent cache conflicts across different networks.

Apply this diff to improve cache management:

    mutationFn: async ({ siweJwt, anyJwt }: LinkIdentifierParams) => {
      return linkIdentifier({
        siweJwt,
        anyJwt,
        chainId,
      });
    },
-   mutationKey: ['linkIdentifier'],
+   mutationKey: ['linkIdentifier', chainId],
src/interfaces/index.ts (1)

25-25: Consider using a more descriptive property name.

The generic name key could be ambiguous. Consider renaming it to something more specific that reflects its role in permission verification, such as permissionKey or attestationKey.

Also, consider adding JSDoc comments to document the purpose and expected format of this property.

-  key?: string;
+  /** Unique identifier used for permission verification */
+  permissionKey?: string;
src/hooks/useAttestations.tsx (1)

31-31: Consider adding type safety checks

The type assertions address as '0x${string}' and chainId as number could be unsafe if these values are undefined. Consider adding validation:

-  } = useGetAttestations(address as `0x${string}`, chainId as number);
+  } = useGetAttestations(
+    address ? (address as `0x${string}`) : undefined,
+    chainId ? Number(chainId) : undefined
+  );
src/hooks/useSiweAuth.tsx (1)

Line range hint 44-47: Consider chain-specific JWT management

For multi-chain support, consider storing JWTs with chain context to handle different authentication states per chain. This would prevent authentication conflicts when switching chains.

Example implementation:

// Store JWT with chain context
const storeToken = (jwt: string, chainId: number) => {
  localStorage.setItem(`OCI_TOKEN_${chainId}`, jwt);
}

// Retrieve chain-specific JWT
const getToken = (chainId: number) => {
  return localStorage.getItem(`OCI_TOKEN_${chainId}`);
}
src/components/pages/attestations/StepTwo.tsx (1)

Line range hint 1-93: Consider implementing network-specific configuration management

Since this change is part of adding Sepolia support, consider implementing a centralized network configuration management system to handle different network requirements consistently across components.

This could include:

  1. A network configuration registry
  2. Network-specific contract addresses and parameters
  3. Runtime network validation utilities
  4. Network switching handlers

Would you like assistance in designing this architecture?

src/App.tsx (3)

47-47: Consider making the initial chain configurable

Setting sepolia as the initial chain might limit users who primarily work with other networks. Consider making this configurable based on environment or user preferences.

-        <RainbowKitProvider initialChain={sepolia}>
+        <RainbowKitProvider initialChain={process.env.REACT_APP_INITIAL_CHAIN || sepolia}>

50-78: Consider adding error boundaries and extracting route constants

While the routing structure is solid, consider these improvements for better maintainability and error handling:

  1. Add error boundaries around route components
  2. Extract route paths to constants

Example implementation:

// constants/routes.ts
export const ROUTES = {
  LOGIN: '/auth/login',
  IDENTIFIERS: '/identifiers',
  PERMISSIONS: '/permissions',
  CALLBACK: '/callback',
  ATTESTATION: (provider: string) => `/identifiers/${provider}/attestation`
} as const;

// components/ErrorBoundary.tsx
class RouteErrorBoundary extends React.Component {
  // ... error boundary implementation
}

Then update the routes:

-                path="/auth/login"
+                path={ROUTES.LOGIN}

Base Sepolia integration is properly implemented, but the import in App.tsx needs to be updated

The codebase shows proper Base Sepolia integration in multiple places:

  • Base Sepolia chain is imported and configured in main.tsx
  • EAS GraphQL endpoint for Base Sepolia (chain ID 84532) is configured
  • However, App.tsx still imports from wagmi/chains instead of viem/chains

Please update the import in App.tsx to match the pattern used in main.tsx:

import { sepolia } from 'viem/chains';
🔗 Analysis chain

Line range hint 13-13: Verify complete Base Sepolia integration

The PR title mentions adding Base Sepolia, but only the Sepolia import is visible. Let's verify the complete Base Sepolia integration.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for Base Sepolia configuration
echo "Searching for Base Sepolia chain configuration..."
rg "base.*sepolia|baseSepolia" -A 5

echo "\nSearching for chain configurations..."
rg "chains.*=|chains:|\[.*sepolia" -A 5

Length of output: 1435

src/services/eas.service.ts (1)

Line range hint 155-163: Enhance error handling with structured errors

The current error handling could be improved to provide more detailed and structured error information.

Consider this enhancement:

+interface EASError extends Error {
+  code: string;
+  details: unknown;
+}

+class EASAttestationError extends Error implements EASError {
+  constructor(
+    message: string,
+    public code: string,
+    public details: unknown
+  ) {
+    super(message);
+    this.name = 'EASAttestationError';
+  }
+}

     try {
       const tx = await this.eas.attestByDelegation(attestationRequest);
       await tx.wait();
       console.log('Attestation successful:', tx);
-    } catch (error: any) {
-      console.error('Attestation failed:', error);
-      throw new Error(`Attestation failed: ${error.message}`);
+    } catch (error: unknown) {
+      const errorDetails = error instanceof Error ? error.message : String(error);
+      console.error('Attestation failed:', errorDetails);
+      throw new EASAttestationError(
+        'Failed to create attestation',
+        'ATTESTATION_FAILED',
+        error
+      );
     }

This improves error handling by:

  1. Adding type-safe error handling
  2. Providing structured error information
  3. Making errors more traceable and debuggable
src/utils/contracts/oid/contracts.ts (2)

1-4: Add chain name comments for better readability

Consider adding comments to document the chain names for better clarity. The chain IDs correspond to Optimism Sepolia (11155420) and Base Sepolia (84532) testnets.

 export const oidContracts = [
   {
+    // Optimism Sepolia testnet
     chainId: 11155420,
     address: '0xFcE488b93696Ec5e279b8257E67F074AbFEc59d8',
     ...
   },
   {
+    // Base Sepolia testnet
     chainId: 84532,
     address: '0xF65e300B0e622B1Bc224c7351397ea2FF29f1c3D',
     ...
   },

Also applies to: 162-163


5-159: Extract common ABI to reduce duplication

The ABI definition is identical for both contracts. Consider extracting it into a separate constant to improve maintainability and reduce code duplication.

+const OID_CONTRACT_ABI = [
+  {
+    inputs: [
+      {
+        internalType: 'address',
+        name: 'initialAuthority',
+        type: 'address',
+      },
+      // ... rest of the ABI definition
+    ]
+  }
+];
+
 export const oidContracts = [
   {
     chainId: 11155420,
     address: '0xFcE488b93696Ec5e279b8257E67F074AbFEc59d8',
-    abi: [
-      {
-        inputs: [
-          // ... duplicate ABI
-        ]
-      }
-    ]
+    abi: OID_CONTRACT_ABI,
   },
   {
     chainId: 84532,
     address: '0xF65e300B0e622B1Bc224c7351397ea2FF29f1c3D',
-    abi: [
-      {
-        inputs: [
-          // ... duplicate ABI
-        ]
-      }
-    ]
+    abi: OID_CONTRACT_ABI,
   },
 ];

Also applies to: 164-318

src/utils/contracts/app/contracts.ts (2)

5-234: Consider extracting common ABI to reduce duplication

The ABI definition is identical for both contracts. Consider extracting it into a separate constant to improve maintainability and reduce the risk of inconsistencies when updating.

+const APPLICATION_MANAGER_ABI = [
+  // ... existing ABI definition
+];
+
 export const appContracts = [
   {
     chainId: 11155420,
     address: '0xb250C2b5967FEc8241FD9a26C30145Fbdf347eEC',
-    abi: [
-      // ... duplicate ABI
-    ],
+    abi: APPLICATION_MANAGER_ABI,
   },
   {
     chainId: 84532,
     address: '0x52d0a71B42Dd84532A7B332fdfa059E8a7391092',
-    abi: [
-      // ... duplicate ABI
-    ],
+    abi: APPLICATION_MANAGER_ABI,
   },
 ];

Also applies to: 240-469


131-146: Consider adding input validation for application name

The createApplication function accepts a name parameter without any apparent length or character restrictions. Consider adding input validation at the contract level to prevent potential issues with extremely long names or special characters.

Also applies to: 365-380

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

📥 Commits

Reviewing files that changed from the base of the PR and between 2d2e97d and 469332e.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (23)
  • package.json (1 hunks)
  • src/App.tsx (1 hunks)
  • src/components/layouts/AccountPopover.tsx (0 hunks)
  • src/components/pages/attestations/StepThree.tsx (2 hunks)
  • src/components/pages/attestations/StepTwo.tsx (2 hunks)
  • src/hooks/LitProvider.tsx (0 hunks)
  • src/hooks/useAttestations.tsx (1 hunks)
  • src/hooks/useSessionSigs.tsx (1 hunks)
  • src/hooks/useSiweAuth.tsx (3 hunks)
  • src/interfaces/index.ts (1 hunks)
  • src/main.tsx (1 hunks)
  • src/pages/Identifiers/Identifiers.tsx (4 hunks)
  • src/pages/Permissions/Permissions.tsx (6 hunks)
  • src/services/api/eas/index.ts (1 hunks)
  • src/services/api/eas/query.ts (1 hunks)
  • src/services/api/index.ts (0 hunks)
  • src/services/eas.service.ts (2 hunks)
  • src/services/eas/index.ts (1 hunks)
  • src/services/eas/query.ts (2 hunks)
  • src/utils/contracts/app/contracts.ts (1 hunks)
  • src/utils/contracts/eas/constants.ts (1 hunks)
  • src/utils/contracts/eas/contracts.ts (1 hunks)
  • src/utils/contracts/oid/contracts.ts (1 hunks)
💤 Files with no reviewable changes (3)
  • src/components/layouts/AccountPopover.tsx
  • src/hooks/LitProvider.tsx
  • src/services/api/index.ts
✅ Files skipped from review due to trivial changes (1)
  • src/hooks/useSessionSigs.tsx
🔇 Additional comments (29)
src/utils/contracts/eas/constants.ts (1)

4-8: Verify schema IDs on respective networks

Please ensure that these schema IDs are correctly registered on both Optimism Sepolia and Base Sepolia networks.

✅ Verification successful

Let me generate additional scripts to gather more information about the EAS contract addresses and their relationship with these schema IDs.

This will help us understand:

  1. The EAS contract configurations across different networks
  2. How these schema IDs are used in the codebase
  3. The chain ID mappings to confirm the networks (Optimism Sepolia and Base Sepolia)

Based on the gathered information, I can now generate the final response:

Schema IDs are correctly configured for the respective networks

The schema IDs are properly integrated with their respective networks:

  • Optimism Sepolia (11155420): Schema is used with EAS contract at 0x4200000000000000000000000000000000000021
  • Base Sepolia (84532): Schema is used with EAS contract at 0x4200000000000000000000000000000000000021

Both schemas are being used in the GraphQL queries through EAScan's official endpoints:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Search for any references to these schema IDs in the codebase
# to verify their usage and any related tests

# Search for schema IDs
echo "Searching for schema ID references..."
rg -A 2 "0x2c988095892ea57c600e5cc6fb62531502bc0c8d038ac39dc3fab161b6f122db"
rg -A 2 "0xe8c59f8de4cdf61c8ebefa3ed83d714acc767dda3bbff00623e73f5a8bf5255f"

# Search for test files that might verify these IDs
echo "Searching for related test files..."
fd -g "*test*" -g "*spec*" | xargs rg "EAS_SCHEMA_ID"

Length of output: 1703


Script:

#!/bin/bash
# Search for EAS contract configurations and implementations
echo "Searching for EAS contract configurations..."
rg -A 5 "easContractAddress"

# Search for any schema-related implementations or validations
echo "Searching for schema-related code..."
rg -A 3 "schema" --type ts

# Search for chain ID definitions to understand the networks
echo "Searching for chain ID definitions..."
rg "11155420|84532" --type ts

Length of output: 7174

src/utils/contracts/eas/contracts.ts (2)

4-5: Verify EAS schema UUIDs

The schema UUIDs are different for each network. Let's verify if these are valid EAS schema UUIDs and what type of attestations they represent.

Also applies to: 11-12

✅ Verification successful

Schema UUIDs are correctly configured for test networks

The schema UUIDs are properly configured and match their respective test networks:

  • 0x2c988095892ea57c600e5cc6fb62531502bc0c8d038ac39dc3fab161b6f122db for Optimism Sepolia (chain ID: 11155420)
  • 0xe8c59f8de4cdf61c8ebefa3ed83d714acc767dda3bbff00623e73f5a8bf5255f for Base Sepolia (chain ID: 84532)

The schema type is consistently defined as bytes32 key,string provider,string secret,string metadata across both networks, and the configurations are properly mapped to their respective EAS GraphQL endpoints in the test environment.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Search for schema UUID references and their purposes

# Look for schema UUID references in code and documentation
rg "0x2c988095892ea57c600e5cc6fb62531502bc0c8d038ac39dc3fab161b6f122db"
rg "0xe8c59f8de4cdf61c8ebefa3ed83d714acc767dda3bbff00623e73f5a8bf5255f"

# Look for schema-related documentation
rg -i "schema.*uuid" --type md

Length of output: 629


Script:

#!/bin/bash
# Let's check the context around these UUIDs to understand their purpose and network associations

# Check the constants file content
echo "=== Content of constants.ts ==="
cat src/utils/contracts/eas/constants.ts

# Check the contracts file content
echo -e "\n=== Content of contracts.ts ==="
cat src/utils/contracts/eas/contracts.ts

# Look for any EAS or schema-related configuration files
echo -e "\n=== Looking for EAS config files ==="
fd -e json -e ts -e js -H "eas|schema" --exec grep -l "schema"

Length of output: 1193


Script:

#!/bin/bash
# Let's check the EAS service implementation to understand how these schemas are used
echo "=== Content of EAS service ==="
cat src/services/eas.service.ts

# Let's also check for any network-specific configurations
echo -e "\n=== Looking for network configurations ==="
rg -l "11155420|84532"

Length of output: 5300


Script:

#!/bin/bash
# Let's check the network configurations and chain IDs
echo "=== Content of services/eas/index.ts ==="
cat src/services/eas/index.ts

# Check if these chain IDs correspond to specific networks
echo -e "\n=== Checking chain ID references ==="
rg -C 3 "11155420|84532"

Length of output: 4919


6-6: Verify EAS contract addresses for both networks

Both Optimism Sepolia and Base Sepolia are configured to use the same EAS contract address. Let's verify if this is correct.

Also applies to: 13-13

src/main.tsx (2)

4-4: Verify the test network selection

The addition of baseSepolia and optimismSepolia test networks suggests this is for testing purposes. Please confirm if these are the intended networks for your use case.

Consider:

  1. Adding mainnet configurations for production
  2. Making networks configurable based on environment (development/production)

Also applies to: 7-8


24-26: LGTM! Provider integration looks correct

The WagmiProvider is properly positioned in the component tree, wrapping the App component while maintaining compatibility with StrictMode and BrowserRouter.

src/services/eas/index.ts (1)

6-8: Verify the endpoints' availability and compatibility.

Let's ensure the GraphQL endpoints are accessible and compatible with the application's requirements.

src/services/api/eas/query.ts (2)

12-12: LGTM: Explicit chainId parameter improves network flexibility

The addition of the required chainId parameter aligns well with multi-chain support and removes hard-coded network assumptions.


Line range hint 12-19: Verify consistent chainId usage across mutation hooks

The implementation differs from other mutation hooks in the file where chainId is part of the params object. Consider standardizing the approach across all hooks.

src/interfaces/index.ts (1)

25-25: Verify consistent property usage across components.

Let's verify how this property is used across the codebase, particularly in permission-related components.

✅ Verification successful

Let me gather more context about the usage of this property.


Property usage is consistent and properly implemented

The key optional property is:

  • Correctly defined in the IAttestation interface
  • Used consistently in the Permissions component for attestation verification
  • No conflicting or inconsistent implementations found across the codebase
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check usage of the 'key' property in attestation-related components
# Expected: Find references in permission verification logic

# Search for attestation key usage in permission checks
rg -A 5 "attestation\.key" 

# Search for permission-related components that might use this property
ast-grep --pattern 'const Permissions = $_' 

Length of output: 428


Script:

#!/bin/bash
# Search for key property usage in permission-related files
rg -A 5 "key\?: string" 

# Search for key property usage in components
ast-grep --pattern 'interface $_ {
  $$$
  key?: string;
  $$$
}'

# Search for actual usage of key property
rg -A 5 "\.key\b"

Length of output: 1468

src/hooks/useAttestations.tsx (1)

Line range hint 1-67: Verify chain support implementation

The changes look good and align with the PR objective of adding Sepolia support. However, let's verify the chain support implementation across the codebase.

✅ Verification successful

Based on the shell script results, I can now generate the final response:

Chain support implementation is properly configured across the codebase

The verification confirms comprehensive chain support implementation:

  • Chain-specific configurations are properly defined in dedicated JSON files for each component (app, EAS, OID) under src/utils/contracts/*/sepoliaChain.json
  • GraphQL endpoints are correctly mapped for all supported chains including Sepolia in chainIdToGraphQLEndpoint
  • Contract addresses and ABIs are properly configured for each chain in respective contract files
  • Chain ID handling is consistently implemented across components:
    • EAS attestation queries
    • Authentication flows
    • Contract interactions
    • API requests
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify chain support implementation
# Check for chain-specific configurations and contract addresses

# Look for chain configuration files
echo "Checking for chain configuration files..."
fd -e ts -e js -e json . | rg -i "chain|network|sepolia"

# Check for chainId usage in other files
echo "Checking for chainId usage..."
rg "chainId" -A 3 -B 3

# Look for contract address configurations
echo "Checking for contract configurations..."
ast-grep --pattern 'const $_ = {
  $$$
  sepolia: $_
  $$$
}'

Length of output: 21049

src/hooks/useSiweAuth.tsx (2)

25-28: Breaking change: Verify all createMessage callers

The removal of chainId from function parameters is a breaking change. Ensure all callers have been updated to remove this parameter.


40-41: Verify API endpoint compatibility

The API endpoint now expects a chainId parameter. Ensure the backend API has been updated to handle this new parameter correctly.

src/components/pages/attestations/StepTwo.tsx (2)

Line range hint 31-50: Verify chainId support before proceeding with mutation

The handleGenerateSignedDelegation function should verify that the current chainId is supported before proceeding.

Let's check what networks are supported:

Consider adding network validation:

 const handleGenerateSignedDelegation = async () => {
   const siweJwt = localStorage.getItem('OCI_TOKEN');
-  if (!siweJwt || !provider) return;
+  if (!siweJwt || !provider || !chainId) return;
+  if (!isSupportedNetwork(chainId)) {
+    throw new Error('Unsupported network. Please switch to a supported network.');
+  }

Line range hint 18-20: Verify attestation flow compatibility across steps

The attestation payload handling should be consistent with chainId changes across all steps.

Let's check the attestation flow in other components:

Also applies to: 31-50

✅ Verification successful

Let me gather more information about the attestation flow and chainId usage:


Attestation flow is properly handling chainId across steps

The verification shows the attestation flow is consistent with chainId handling:

  • StepTwo correctly uses chainId from useAccount() for the identifier mutation
  • StepThree properly handles chainId for contract interactions, using it to find the correct EAS contract address
  • The AttestPayload and AttestMessage interfaces are chain-agnostic, containing only the necessary data for attestation without any chain-specific fields
  • The flow maintains consistency by passing the attestation data between steps through props
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for handlePrepareAttestation usage and AttestPayload interface
ast-grep --pattern 'interface AttestPayload {
  $$$
}'

rg -A 10 'handlePrepareAttestation'

Length of output: 3829


Script:

#!/bin/bash
# Check StepThree implementation and chainId usage
ast-grep --pattern 'const StepThree: React.FC<$_> = ($_) => {
  $$$
}'

# Check AttestMessage interface to understand payload structure
ast-grep --pattern 'interface AttestMessage {
  $$$
}'

# Search for chainId usage in attestation components
rg 'chainId' src/components/pages/attestations/

Length of output: 7105

package.json (1)

37-37: Verify the necessity of oci-js-sdk dependency

The addition of the Oracle Cloud Infrastructure SDK seems unrelated to the PR's purpose of adding Base Sepolia support. Base Sepolia is an Ethereum testnet that typically only requires network configuration updates, which are already supported by existing dependencies like wagmi and viem.

Let's verify if this dependency is actually used in the codebase:

If this dependency isn't actively used, consider removing it to keep the dependency tree lean.

src/components/pages/attestations/StepThree.tsx (2)

12-12: LGTM! Imports are properly organized.

The new imports for useAccount and contracts are correctly placed with related dependencies.

Also applies to: 17-17


36-36: ⚠️ Potential issue

Remove unsafe type assertion.

The as Address type assertion could be unsafe if easContractAddress is undefined. This should be handled after implementing the suggested error handling above.

After implementing proper error handling, the type assertion won't be necessary:

- ? new EASService(easContractAddress as Address, signer)
+ ? new EASService(easContractAddress, signer)

Likely invalid or redundant comment.

src/App.tsx (1)

42-83: Verify WagmiProvider configuration

The removal of WagmiProvider from this component suggests it's configured elsewhere. Let's verify this setup to ensure proper blockchain interactions.

✅ Verification successful

Let me check the complete configuration in main.tsx to ensure WagmiProvider is properly set up.


WagmiProvider is correctly configured in main.tsx

The WagmiProvider is properly set up in main.tsx as a wrapper around the App component, with the correct configuration using getDefaultConfig from RainbowKit. The configuration includes the required chains (optimismSepolia, baseSepolia) and project ID. Its removal from App.tsx is correct as it's already present at a higher level in the component tree.

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for WagmiProvider configuration in the codebase
echo "Searching for WagmiProvider configuration..."
rg -l "WagmiProvider" 

echo "\nSearching for wagmi configuration..."
rg "getDefaultConfig|createConfig|configureChains" -A 5

Length of output: 835


Script:

#!/bin/bash
# Get the complete main.tsx content to verify WagmiProvider setup
cat src/main.tsx

Length of output: 771

src/utils/contracts/oid/contracts.ts (1)

4-4: Verify contract deployments on block explorers

Please ensure that the contract deployments are verified on their respective block explorers (Optimism Sepolia and Base Sepolia). This allows users to inspect the contract source code and verify its functionality.

Also applies to: 163-163

✅ Verification successful

Contract deployments are verified on block explorers

The API responses with status "1" confirm that both contracts are verified:

  • Optimism Sepolia contract (0xFcE488b93696Ec5e279b8257E67F074AbFEc59d8)
  • Base Sepolia contract (0xF65e300B0e622B1Bc224c7351397ea2FF29f1c3D)
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check if contracts are verified on block explorers

# Check Optimism Sepolia contract
echo "Checking Optimism Sepolia contract (0xFcE488b93696Ec5e279b8257E67F074AbFEc59d8)..."
curl -s "https://api-sepolia-optimistic.etherscan.io/api?module=contract&action=getabi&address=0xFcE488b93696Ec5e279b8257E67F074AbFEc59d8" | jq .status

# Check Base Sepolia contract
echo "Checking Base Sepolia contract (0xF65e300B0e622B1Bc224c7351397ea2FF29f1c3D)..."
curl -s "https://api-sepolia.basescan.org/api?module=contract&action=getabi&address=0xF65e300B0e622B1Bc224c7351397ea2FF29f1c3D" | jq .status

Length of output: 646

src/pages/Identifiers/Identifiers.tsx (2)

26-26: LGTM: Import changes are well-organized

The new imports are properly organized and necessary for the added functionality.

Also applies to: 36-36


Line range hint 49-68: Verify chainId usage across components

Let's verify that other components using EAS service are also properly handling the dynamic chainId.

✅ Verification successful

Let me analyze the EAS service initialization patterns more thoroughly by checking how the contract addresses are handled in the found locations.


Let me check the contract configurations and imports with a different approach.


Let me check the contract configuration file to ensure the chainId handling is consistent.


Based on the analysis of the codebase, I can now provide the final response:

ChainId handling for EAS service is properly implemented across components

The verification shows that:

  • Both Identifiers.tsx and StepThree.tsx correctly initialize EAS service using chainId-dependent contract addresses
  • The contracts configuration file properly defines contracts for different chains (11155420 and 84532)
  • All components using EAS service (Identifiers.tsx, StepThree.tsx) consistently use the same pattern:
    1. Extract chainId from useAccount
    2. Find the correct contract address using chainId
    3. Initialize EAS service with the found address
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Search for EAS service initialization and chainId usage
echo "Checking EAS service initialization patterns:"
rg -A 2 "new EASService\(" 

echo "\nChecking chainId usage:"
rg "chainId.*useAccount"

echo "\nChecking contract address usage:"
rg "easContractAddress.*contracts\.find"

Length of output: 1398


Script:

#!/bin/bash
# Check the complete chainId and contract address handling in the relevant files
echo "Checking StepThree.tsx contract handling:"
rg -B 2 -A 5 "easContractAddress.*contracts\.find" src/components/pages/attestations/StepThree.tsx

echo "\nChecking contract imports and definitions:"
rg -l "contracts.*from.*config"

echo "\nChecking contract type definitions:"
rg "type.*Contract.*=" 

Length of output: 705


Script:

#!/bin/bash
# Search for contract-related configurations
echo "Checking contract imports:"
rg -l "import.*contracts?"

echo "\nChecking contract configurations:"
fd -e ts -e tsx -e js -e json --exec rg -l "contracts.*=.*\[" {}

echo "\nChecking complete contract usage in both files:"
echo "=== Identifiers.tsx ==="
rg -B 5 -A 5 "easContractAddress" src/pages/Identifiers/Identifiers.tsx

echo "\n=== StepThree.tsx ==="
rg -B 5 -A 5 "easContractAddress" src/components/pages/attestations/StepThree.tsx

Length of output: 1809


Script:

#!/bin/bash
# Check the contract configuration implementation
echo "Checking contracts configuration:"
cat src/utils/contracts/eas/contracts.ts

echo "\nChecking for other EAS service usages:"
rg -B 3 -A 3 "EASService" --type ts --type tsx

echo "\nChecking chainId handling in all files:"
rg -B 2 -A 2 "chainId.*===" --type ts --type tsx

Length of output: 904

src/utils/contracts/app/contracts.ts (3)

37-37: LGTM: Proper reentrancy protection

The contract includes reentrancy protection through the ReentrancyGuardReentrantCall error, which is a good security practice.

Also applies to: 271-271


18-36: LGTM: Comprehensive access control

The contract implements proper access control with:

  • Invalid authority checks
  • Required delay checks
  • Unauthorized caller checks

Also applies to: 252-270


1-4: Verify contract addresses and document chain IDs

Consider adding comments to document that:

  • Chain ID 11155420 corresponds to OP Sepolia
  • Chain ID 84532 corresponds to Base Sepolia

Also, please verify these contract addresses on their respective block explorers:

  • OP Sepolia: 0xb250C2b5967FEc8241FD9a26C30145Fbdf347eEC
  • Base Sepolia: 0x52d0a71B42Dd84532A7B332fdfa059E8a7391092

Also applies to: 236-239

✅ Verification successful

Contract addresses verified, documentation recommended

Both contract addresses are verified on their respective block explorers (status: 1). Consider adding comments to document the chain IDs for better maintainability:

export const appContracts = [
  {
    chainId: 11155420, // OP Sepolia
    address: '0xb250C2b5967FEc8241FD9a26C30145Fbdf347eEC',
  },
  {
    chainId: 84532, // Base Sepolia
    address: '0x52d0a71B42Dd84532A7B332fdfa059E8a7391092',
  }
]
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify contract addresses on block explorers

# Check if the contracts are verified on OP Sepolia
curl -s "https://api-sepolia-optimistic.etherscan.io/api?module=contract&action=getabi&address=0xb250C2b5967FEc8241FD9a26C30145Fbdf347eEC" | jq -r '.status'

# Check if the contracts are verified on Base Sepolia
curl -s "https://api-sepolia.basescan.org/api?module=contract&action=getabi&address=0x52d0a71B42Dd84532A7B332fdfa059E8a7391092" | jq -r '.status'

Length of output: 306

src/pages/Permissions/Permissions.tsx (5)

31-32: Imports are appropriate for dynamic contract handling.

The imports of appContracts and oidContracts enable dynamic selection of contracts based on the chainId, which enhances the flexibility of the application when interacting with different blockchain networks.


36-36: Including chainId from useAccount for network-aware operations.

Retrieving chainId along with address using useAccount allows the component to interact with the correct contracts corresponding to the active blockchain network.


100-106: Safely extracting key from decoded attestation data.

The code correctly searches for the key field within the decoded data and safely assigns it, handling scenarios where keyData might be undefined.


39-44: 🛠️ Refactor suggestion

Ensure handling when contracts for the current chainId are not found.

When searching for contracts matching the current chainId, appContract or oidContract might be undefined if no matching contract is available. Consider adding error handling or fallback logic to address scenarios where contracts are not found to prevent potential runtime errors.

You could implement a check like:

if (!appContract || !oidContract) {
  showSnackbar('No contracts found for the current network.', { severity: 'error' });
  return;
}

60-61: 🛠️ Refactor suggestion

Verify that address and chainId are defined before fetching attestations.

Ensure that both address and chainId are available before calling useGetAttestations. If either is undefined, the hook may not fetch data correctly. Consider adding a condition to handle cases where the user is not connected or the chainId is not yet available.

Example:

if (!address || !chainId) {
  return;
}

src/utils/contracts/eas/contracts.ts Show resolved Hide resolved
src/main.tsx Outdated Show resolved Hide resolved
src/main.tsx Show resolved Hide resolved
src/services/api/eas/index.ts Show resolved Hide resolved
src/hooks/useSiweAuth.tsx Show resolved Hide resolved
src/services/eas/query.ts Show resolved Hide resolved
src/services/eas/query.ts Show resolved Hide resolved
src/pages/Permissions/Permissions.tsx Show resolved Hide resolved
src/pages/Permissions/Permissions.tsx Show resolved Hide resolved
src/pages/Permissions/Permissions.tsx Show resolved Hide resolved
@mehdi-torabiv mehdi-torabiv merged commit e5910a6 into main Nov 27, 2024
7 checks passed
@coderabbitai coderabbitai bot mentioned this pull request Dec 3, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant