Skip to content

Support for Gated Dispute Kits and other improvements #2050

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 17 commits into from
Jul 28, 2025

Conversation

jaybuidl
Copy link
Member

@jaybuidl jaybuidl commented Jul 22, 2025

This is a follow-up on #2045.

Changes

  • Support for Gated and GatedShutter dispute kits
  • Dispute Kit selection: when a court supports only 1 DK, select it by default.
  • DisputeKits matching by address
  • Future-proof DK-specific extraData encoding
  • Cursor focus on the input fields in the Resolver form

PR-Codex overview

This PR introduces support for gated dispute kits, enhancing the dispute management system with new functionalities and adjustments across various components.

Detailed summary

  • Added address field to disputeKit in useDisputeDetailsQuery.
  • Included disputeKitDispute with extraData in useRoundDetailsQuery.
  • Updated SubmitDisputeButton and SubmitBatchDisputesButton to handle disputeKitData.
  • Modified extractDisputeKitIDFromExtraData function to adjust byte extraction.
  • Introduced IDisputeKitData, IGatedDisputeData, and ISomeFutureDisputeData types in NewDisputeContext.
  • Enhanced various components to include isGated prop and functionality for gated dispute kits.
  • Implemented extraDataToTokenInfo utility to decode token information.
  • Added new dispute kit types and updated the subgraph configuration for DisputeKitGated and DisputeKitGatedShutter.
  • Adjusted prepareArbitratorExtradata to handle optional dispute kit data.
  • Updated voting and funding components to support gated dispute kits.

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

Summary by CodeRabbit

Summary by CodeRabbit

  • New Features

    • Added support for "gated" dispute kits with token gating parameters during dispute creation.
    • Introduced hooks to fetch dispute kit names and addresses based on blockchain data.
    • Enhanced court and dispute kit selection UI to handle gated dispute kits and related inputs.
  • Improvements

    • Dispute kit identification updated to use blockchain addresses with exact name matching.
    • Extradata preparation now supports extensible encoding for additional dispute kit data types.
    • Added new subgraph data sources for gated dispute kits to improve event tracking.
    • Updated dispute-related queries to include additional dispute kit data fields.
  • User Experience

    • Multiple input fields across forms now auto-focus on mount for improved usability.
    • Appeal and voting components updated to support gated dispute kits seamlessly.
  • Bug Fixes

    • Enhanced accuracy and reliability in dispute kit name resolution and selection logic.

Copy link

netlify bot commented Jul 22, 2025

Deploy Preview for kleros-v2-testnet ready!

Name Link
🔨 Latest commit b5fff19
🔍 Latest deploy log https://app.netlify.com/projects/kleros-v2-testnet/deploys/6880ccda32474d000842026b
😎 Deploy Preview https://deploy-preview-2050--kleros-v2-testnet.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

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

Copy link

netlify bot commented Jul 22, 2025

Deploy Preview for kleros-v2-testnet-devtools ready!

Name Link
🔨 Latest commit b5fff19
🔍 Latest deploy log https://app.netlify.com/projects/kleros-v2-testnet-devtools/deploys/6880ccda5bd74600088e7601
😎 Deploy Preview https://deploy-preview-2050--kleros-v2-testnet-devtools.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.

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

Copy link

netlify bot commented Jul 22, 2025

Deploy Preview for kleros-v2-neo failed. Why did it fail? →

Name Link
🔨 Latest commit b5fff19
🔍 Latest deploy log https://app.netlify.com/projects/kleros-v2-neo/deploys/6880ccdab1587c0008bc4372

Copy link
Contributor

coderabbitai bot commented Jul 22, 2025

"""

Walkthrough

The changes replace ID- and environment-based dispute kit identification with a static enum and address-based logic. New hooks and types support dispute kit data, including gated kits. Several components are refactored to use address-based dispute kit resolution and to handle extra data for gated kits. UI enhancements enable auto-focusing and gated kit parameter entry.

Changes

File(s) Change Summary
web/src/consts/index.ts Removed environment/ID-based getDisputeKitName function; introduced static DisputeKits enum.
web/src/context/NewDisputeContext.tsx Extended IDisputeData with optional disputeKitData (union type for gated/future); added new interfaces/types for dispute kit data.
web/src/hooks/queries/useDisputeDetailsQuery.ts, web/src/hooks/queries/useSupportedDisputeKits.ts Updated GraphQL queries to include dispute kit address field in results.
web/src/hooks/useDisputeKitAddresses.ts Added new hooks: useDisputeKitAddresses and useDisputeKitAddressesAll for resolving dispute kit names from addresses.
web/src/pages/Cases/CaseDetails/Appeal/index.tsx, web/src/pages/Cases/CaseDetails/Voting/index.tsx Refactored to use address-based dispute kit identification via hooks and enum; removed substring checks and old function.
web/src/pages/Resolver/Briefing/Description.tsx, web/src/pages/Resolver/Briefing/Title.tsx, web/src/pages/Resolver/Parameters/Category.tsx, web/src/pages/Resolver/Parameters/VotingOptions/index.tsx Added logic to auto-focus textarea/input fields on mount using refs and effects.
web/src/pages/Resolver/NavigationButtons/SubmitBatchDisputesButton.tsx, web/src/pages/Resolver/NavigationButtons/SubmitDisputeButton.tsx Modified contract call argument: now includes disputeKitData in extradata preparation.
web/src/pages/Resolver/Parameters/Court.tsx Major refactor: supports gated dispute kits with new UI fields, state, handlers, and uses address-based kit selection; adds styled components.
web/src/utils/prepareArbitratorExtradata.ts Refactored to ABI-encode parameters; supports extensible, type-specific encoding for dispute kit data (gated/future); updated function signature.
web/src/hooks/queries/useRoundDetailsQuery.ts Extended query to fetch extraData from ClassicDispute under disputeKitDispute.
web/src/pages/Resolver/Landing/index.tsx Added memoized extraction of gated token info from dispute data extraData to update disputeKitData state.
web/src/utils/extradataToTokenInfo.ts Added utility to decode gated token info (tokenGate, isERC1155, tokenId) from extraData hex string.
subgraph/core/src/utils.ts Modified extraction of dispute kit ID from fixed slice of extraData bytes instead of from end slice.
subgraph/core/subgraph.template.yaml, subgraph/core/subgraph.yaml Added new data sources for DisputeKitGated and DisputeKitGatedShutter with event handlers and ABIs.
web/src/pages/Cases/CaseDetails/Appeal/Classic/Fund.tsx, web/src/pages/Cases/CaseDetails/Appeal/Shutter/Fund.tsx Extended appeal funding hooks and components to support gated dispute kits with conditional logic and props.
web/src/pages/Cases/CaseDetails/Appeal/Classic/index.tsx, web/src/pages/Cases/CaseDetails/Appeal/Shutter/index.tsx Added isGated prop to appeal components and passed it to child components.
web/src/pages/Cases/CaseDetails/Voting/Classic/Commit.tsx, web/src/pages/Cases/CaseDetails/Voting/Classic/Reveal.tsx Added isGated prop and conditional logic to select appropriate simulation hooks for gated dispute kits.
web/src/pages/Cases/CaseDetails/Voting/Classic/index.tsx Added isGated prop and passed it to Commit and Reveal components.
web/src/pages/Cases/CaseDetails/Voting/Shutter/Commit.tsx, web/src/pages/Cases/CaseDetails/Voting/Shutter/index.tsx Added isGated prop and conditional logic for gated dispute kits in commit component and parent.
web/src/pages/Cases/CaseDetails/Voting/Shutter/Reveal.tsx Added isGated prop and conditional logic for gated dispute kits in reveal component.
web/src/utils/shutter.ts Removed unused error parameters in catch blocks; refined return type of encrypt function.
web/src/pages/Cases/CaseDetails/MaintenanceButtons/DrawButton.tsx Changed draw iterations calculation to min(100, 4 * numberOfVotes) for draw simulation hook argument.
web/src/pages/Resolver/Parameters/Jurors.tsx Changed argument passed to prepareArbitratorExtradata from empty string to "0" when numberOfJurors is undefined.

Sequence Diagram(s)

sequenceDiagram
    participant UI_Component
    participant useDisputeKitAddresses
    participant ContractsJSON
    participant DisputeKitsEnum

    UI_Component->>useDisputeKitAddresses: Provide disputeKitAddress
    useDisputeKitAddresses->>ContractsJSON: Load contract addresses for current chain
    useDisputeKitAddresses->>DisputeKitsEnum: Match address to enum value
    useDisputeKitAddresses-->>UI_Component: Return {disputeKitName, isLoading, error}
Loading
sequenceDiagram
    participant CourtComponent
    participant User
    participant State
    participant prepareArbitratorExtradata

    User->>CourtComponent: Select dispute kit (possibly gated)
    CourtComponent->>State: Update isGatedDisputeKit, disputeKitData
    User->>CourtComponent: Enter token address/ID if gated
    CourtComponent->>prepareArbitratorExtradata: Prepare extradata with disputeKitData
Loading

Estimated code review effort

4 (~90 minutes)

Possibly related PRs

Suggested reviewers

  • jaybuidl
  • alcercu

Poem

A bunny hopped through fields of code,
Swapping IDs for enums in a static mode.
Now addresses lead the way,
With gates for tokens—hip hooray!
The UI’s sharper, the logic’s neat—
This rabbit’s work just can’t be beat! 🐇✨
"""


📜 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 ce63962 and b5fff19.

📒 Files selected for processing (2)
  • web/src/pages/Cases/CaseDetails/Voting/Shutter/Reveal.tsx (4 hunks)
  • web/src/pages/Cases/CaseDetails/Voting/Shutter/index.tsx (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • web/src/pages/Cases/CaseDetails/Voting/Shutter/Reveal.tsx
  • web/src/pages/Cases/CaseDetails/Voting/Shutter/index.tsx
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (14)
  • GitHub Check: Redirect rules - kleros-v2-university
  • GitHub Check: Redirect rules - kleros-v2-testnet-devtools
  • GitHub Check: Header rules - kleros-v2-university
  • GitHub Check: Header rules - kleros-v2-testnet-devtools
  • GitHub Check: Redirect rules - kleros-v2-testnet
  • GitHub Check: Pages changed - kleros-v2-university
  • GitHub Check: Redirect rules - kleros-v2-testnet
  • GitHub Check: Analyze (javascript)
  • GitHub Check: Pages changed - kleros-v2-testnet-devtools
  • GitHub Check: contracts-testing
  • GitHub Check: Header rules - kleros-v2-testnet
  • GitHub Check: Header rules - kleros-v2-testnet
  • GitHub Check: Pages changed - kleros-v2-testnet
  • GitHub Check: Pages changed - kleros-v2-testnet
✨ Finishing Touches
  • 📝 Generate Docstrings

🪧 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.
    • Explain this complex logic.
    • 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 explain this code block.
    • @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 explain its main purpose.
    • @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 or @coderabbitai title 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

netlify bot commented Jul 22, 2025

Deploy Preview for kleros-v2-university failed. Why did it fail? →

Name Link
🔨 Latest commit b5fff19
🔍 Latest deploy log https://app.netlify.com/projects/kleros-v2-university/deploys/6880ccdabd085e0008bdb266

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 10

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between f4ed9a0 and f5c1d67.

📒 Files selected for processing (15)
  • web/src/consts/index.ts (1 hunks)
  • web/src/context/NewDisputeContext.tsx (1 hunks)
  • web/src/hooks/queries/useDisputeDetailsQuery.ts (1 hunks)
  • web/src/hooks/queries/useSupportedDisputeKits.ts (2 hunks)
  • web/src/hooks/useDisputeKitAddresses.ts (1 hunks)
  • web/src/pages/Cases/CaseDetails/Appeal/index.tsx (2 hunks)
  • web/src/pages/Cases/CaseDetails/Voting/index.tsx (3 hunks)
  • web/src/pages/Resolver/Briefing/Description.tsx (4 hunks)
  • web/src/pages/Resolver/Briefing/Title.tsx (3 hunks)
  • web/src/pages/Resolver/NavigationButtons/SubmitBatchDisputesButton.tsx (1 hunks)
  • web/src/pages/Resolver/NavigationButtons/SubmitDisputeButton.tsx (1 hunks)
  • web/src/pages/Resolver/Parameters/Category.tsx (3 hunks)
  • web/src/pages/Resolver/Parameters/Court.tsx (2 hunks)
  • web/src/pages/Resolver/Parameters/VotingOptions/index.tsx (3 hunks)
  • web/src/utils/prepareArbitratorExtradata.ts (1 hunks)
🧠 Learnings (16)
📓 Common learnings
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.
Learnt from: tractorss
PR: kleros/kleros-v2#1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass `dispute?.dispute?.arbitrated.id as 0x${string}` to `usePopulatedDisputeData` without additional null checks because the hook internally handles undefined parameters through its `isEnabled` flag and won't execute the query unless all required data is available.
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In `web/src/hooks/queries/usePopulatedDisputeData.ts`, the query and subsequent logic only execute when `disputeData.dispute?.arbitrableChainId` and `disputeData.dispute?.externalDisputeId` are defined, so `initialContext` properties based on these values are safe to use without additional null checks.
web/src/hooks/queries/useDisputeDetailsQuery.ts (12)

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1755
File: kleros-app/src/lib/atlas/providers/AtlasProvider.tsx:130-144
Timestamp: 2024-11-21T05:47:08.973Z
Learning: In kleros-app/src/lib/atlas/providers/AtlasProvider.tsx, it is acceptable to pass queryClient as a positional parameter to the useQuery hook.

Learnt from: Harman-singh-waraich
PR: #1727
File: web/src/utils/atlas/updateEmail.ts:34-37
Timestamp: 2024-10-28T12:20:19.884Z
Learning: In web/src/utils/atlas/updateEmail.ts, the error coming from the GraphQLError array already has the necessary structure, so additional specificity in error handling is unnecessary.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-10-08T16:23:56.290Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-07-25T11:58:27.058Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: kemuru
PR: #1702
File: web/src/pages/Home/TopJurors/JurorCard/index.tsx:10-11
Timestamp: 2024-10-08T16:23:56.291Z
Learning: In the kleros-v2 codebase, the property totalResolvedDisputes should remain and should not be renamed to totalResolvedVotes.

Learnt from: kemuru
PR: #1702
File: web/src/pages/Home/TopJurors/JurorCard/index.tsx:10-11
Timestamp: 2024-10-07T06:18:23.427Z
Learning: In the kleros-v2 codebase, the property totalResolvedDisputes should remain and should not be renamed to totalResolvedVotes.

web/src/pages/Resolver/NavigationButtons/SubmitBatchDisputesButton.tsx (10)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-10-08T16:23:56.290Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-07-25T11:58:27.058Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/dataMappings/utils/actionTypes.ts:25-25
Timestamp: 2024-10-22T09:35:14.098Z
Learning: In kleros-sdk/src/dataMappings/utils/actionTypes.ts, for the AbiCallMapping type, it's acceptable to use args: any[] since args can be anything.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:43-43
Timestamp: 2024-10-14T15:29:32.954Z
Learning: In the Kleros SDK, when using the populateTemplate function in kleros-sdk/src/utils/getDispute.ts, missing variables in Mustache templates are acceptable. Mustache fills in blanks, and it's preferable to return the partially populated template without throwing errors, as it's still helpful for the consumer.

Learnt from: Harman-singh-waraich
PR: #1727
File: web/src/context/AtlasProvider.tsx:159-171
Timestamp: 2024-10-29T06:46:13.522Z
Learning: Both SubmitEvidenceModal.tsx and Policy/index.tsx use the uploadFile function from AtlasProvider, which includes the fetchWithAuthErrorHandling error handling utility.

web/src/pages/Resolver/Briefing/Title.tsx (12)

Learnt from: kemuru
PR: #1764
File: web/src/components/ScrollTop.tsx:12-28
Timestamp: 2024-12-03T13:58:53.597Z
Learning: In the React component ScrollTop (web/src/components/ScrollTop.tsx), the effect hook is intentionally designed to execute only once, so dependencies are not added to the dependency array.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:0-0
Timestamp: 2025-05-15T06:50:45.650Z
Learning: In the Kleros V2 codebase, it's acceptable to use ESLint disable comments for dependency arrays in useEffect hooks when including certain dependencies (like state that is being updated within the effect) would cause infinite loops.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: Harman-singh-waraich
PR: #1694
File: web-devtools/package.json:33-35
Timestamp: 2024-09-27T10:07:54.013Z
Learning: react-toastify is used in the web-devtools project, particularly in layout.tsx, and should not be flagged as unused.

Learnt from: Harman-singh-waraich
PR: #1694
File: web-devtools/package.json:33-35
Timestamp: 2024-10-08T16:23:56.291Z
Learning: react-toastify is used in the web-devtools project, particularly in layout.tsx, and should not be flagged as unused.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

web/src/pages/Resolver/Briefing/Description.tsx (13)

Learnt from: kemuru
PR: #1764
File: web/src/components/ScrollTop.tsx:12-28
Timestamp: 2024-12-03T13:58:53.597Z
Learning: In the React component ScrollTop (web/src/components/ScrollTop.tsx), the effect hook is intentionally designed to execute only once, so dependencies are not added to the dependency array.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:0-0
Timestamp: 2025-05-15T06:50:45.650Z
Learning: In the Kleros V2 codebase, it's acceptable to use ESLint disable comments for dependency arrays in useEffect hooks when including certain dependencies (like state that is being updated within the effect) would cause infinite loops.

Learnt from: Harman-singh-waraich
PR: #1694
File: web-devtools/package.json:33-35
Timestamp: 2024-09-27T10:07:54.013Z
Learning: react-toastify is used in the web-devtools project, particularly in layout.tsx, and should not be flagged as unused.

Learnt from: Harman-singh-waraich
PR: #1694
File: web-devtools/package.json:33-35
Timestamp: 2024-10-08T16:23:56.291Z
Learning: react-toastify is used in the web-devtools project, particularly in layout.tsx, and should not be flagged as unused.

Learnt from: alcercu
PR: #1582
File: web-devtools/src/context/RulerContext.tsx:50-59
Timestamp: 2024-10-14T10:25:48.452Z
Learning: In React, setter functions returned by useState are stable between renders and don't need to be included in the dependency array of useEffect hooks.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In this project, JSDoc documentation is considered unnecessary for React components.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

web/src/hooks/queries/useSupportedDisputeKits.ts (12)

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1755
File: kleros-app/src/lib/atlas/providers/AtlasProvider.tsx:130-144
Timestamp: 2024-11-21T05:47:08.973Z
Learning: In kleros-app/src/lib/atlas/providers/AtlasProvider.tsx, it is acceptable to pass queryClient as a positional parameter to the useQuery hook.

Learnt from: Harman-singh-waraich
PR: #1850
File: web/src/context/GraphqlBatcher.tsx:25-41
Timestamp: 2025-01-27T11:25:08.246Z
Learning: In GraphQL batch operations using Promise.all, individual request errors should be caught and handled (e.g., returning {data: {}}) rather than thrown, to prevent a single failure from causing the entire batch to fail.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/requests/fetchDisputeDetails.ts:14-27
Timestamp: 2024-10-23T14:05:15.987Z
Learning: Avoid using graphql-request in built libraries as it behaves unexpectedly.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/requests/gqlClient.ts:18-18
Timestamp: 2024-10-24T08:16:02.749Z
Learning: In this TypeScript project, when a file (such as kleros-sdk/src/requests/gqlClient.ts) exports only a single entity, it's acceptable to use default exports instead of named exports.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: jaybuidl
PR: #1746
File: contracts/config/courts.v2.mainnet-neo.json:3-17
Timestamp: 2024-11-19T16:09:41.467Z
Learning: In contracts/config/courts.v2.mainnet-neo.json, the General Court (ID: 1) can have its parent ID set to itself ("parent": 1), as there is no parent court with ID 0 currently.

web/src/pages/Resolver/Parameters/VotingOptions/index.tsx (14)

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: kemuru
PR: #1764
File: web/src/components/ScrollTop.tsx:12-28
Timestamp: 2024-12-03T13:58:53.597Z
Learning: In the React component ScrollTop (web/src/components/ScrollTop.tsx), the effect hook is intentionally designed to execute only once, so dependencies are not added to the dependency array.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:98-103
Timestamp: 2024-10-09T10:23:39.325Z
Learning: In SelectArbitrable.tsx of the web-devtools project (React/TypeScript), direct DOM manipulation using child.click() is acceptable when considered reasonably safe.

Learnt from: Harman-singh-waraich
PR: #1739
File: web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx:22-26
Timestamp: 2024-11-07T10:48:16.774Z
Learning: In the Coherency component (web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx), totalResolvedVotes is always greater than or equal to totalCoherentVotes. When both are zero, 0/0 results in NaN, which is acceptable in this context.

Learnt from: Harman-singh-waraich
PR: #1694
File: web-devtools/package.json:33-35
Timestamp: 2024-09-27T10:07:54.013Z
Learning: react-toastify is used in the web-devtools project, particularly in layout.tsx, and should not be flagged as unused.

Learnt from: Harman-singh-waraich
PR: #1694
File: web-devtools/package.json:33-35
Timestamp: 2024-10-08T16:23:56.291Z
Learning: react-toastify is used in the web-devtools project, particularly in layout.tsx, and should not be flagged as unused.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:0-0
Timestamp: 2025-05-15T06:50:45.650Z
Learning: In the Kleros V2 codebase, it's acceptable to use ESLint disable comments for dependency arrays in useEffect hooks when including certain dependencies (like state that is being updated within the effect) would cause infinite loops.

Learnt from: Harman-singh-waraich
PR: #1759
File: web/src/pages/Cases/CaseDetails/Appeal/Classic/Fund.tsx:140-143
Timestamp: 2024-11-26T10:50:23.399Z
Learning: In the Kleros-v2 React project, errors are handled by the wrapWithToast function, which displays error messages to users via toast notifications.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

web/src/pages/Resolver/Parameters/Category.tsx (11)

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: kemuru
PR: #1764
File: web/src/components/ScrollTop.tsx:12-28
Timestamp: 2024-12-03T13:58:53.597Z
Learning: In the React component ScrollTop (web/src/components/ScrollTop.tsx), the effect hook is intentionally designed to execute only once, so dependencies are not added to the dependency array.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:0-0
Timestamp: 2025-05-15T06:50:45.650Z
Learning: In the Kleros V2 codebase, it's acceptable to use ESLint disable comments for dependency arrays in useEffect hooks when including certain dependencies (like state that is being updated within the effect) would cause infinite loops.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: Harman-singh-waraich
PR: #1694
File: web-devtools/package.json:33-35
Timestamp: 2024-09-27T10:07:54.013Z
Learning: react-toastify is used in the web-devtools project, particularly in layout.tsx, and should not be flagged as unused.

Learnt from: Harman-singh-waraich
PR: #1694
File: web-devtools/package.json:33-35
Timestamp: 2024-10-08T16:23:56.291Z
Learning: react-toastify is used in the web-devtools project, particularly in layout.tsx, and should not be flagged as unused.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

web/src/pages/Resolver/NavigationButtons/SubmitDisputeButton.tsx (10)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-10-08T16:23:56.290Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-07-25T11:58:27.058Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:43-43
Timestamp: 2024-10-14T15:29:32.954Z
Learning: In the Kleros SDK, when using the populateTemplate function in kleros-sdk/src/utils/getDispute.ts, missing variables in Mustache templates are acceptable. Mustache fills in blanks, and it's preferable to return the partially populated template without throwing errors, as it's still helpful for the consumer.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:98-103
Timestamp: 2024-10-09T10:23:39.325Z
Learning: In SelectArbitrable.tsx of the web-devtools project (React/TypeScript), direct DOM manipulation using child.click() is acceptable when considered reasonably safe.

web/src/pages/Cases/CaseDetails/Appeal/index.tsx (12)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/RulingModes.tsx:233-233
Timestamp: 2024-10-09T10:19:11.816Z
Learning: In 'web-devtools/src/app/(main)/ruler/RulingModes.tsx', the label 'Random Preset' is correct and should not be changed to 'Automatic Random'.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:69-69
Timestamp: 2024-10-29T10:13:04.524Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when the button is disabled, the associated logic won't be reached, and certain code paths may exist for TypeScript purposes.

Learnt from: kemuru
PR: #1764
File: web/src/components/ScrollTop.tsx:12-28
Timestamp: 2024-12-03T13:58:53.597Z
Learning: In the React component ScrollTop (web/src/components/ScrollTop.tsx), the effect hook is intentionally designed to execute only once, so dependencies are not added to the dependency array.

web/src/pages/Cases/CaseDetails/Voting/index.tsx (15)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: kemuru
PR: #1702
File: web/src/pages/Home/TopJurors/JurorCard/index.tsx:10-11
Timestamp: 2024-10-08T16:23:56.291Z
Learning: In the kleros-v2 codebase, the property totalResolvedDisputes should remain and should not be renamed to totalResolvedVotes.

Learnt from: kemuru
PR: #1702
File: web/src/pages/Home/TopJurors/JurorCard/index.tsx:10-11
Timestamp: 2024-10-07T06:18:23.427Z
Learning: In the kleros-v2 codebase, the property totalResolvedDisputes should remain and should not be renamed to totalResolvedVotes.

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

Learnt from: Harman-singh-waraich
PR: #1739
File: web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx:22-26
Timestamp: 2024-11-07T10:48:16.774Z
Learning: In the Coherency component (web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx), totalResolvedVotes is always greater than or equal to totalCoherentVotes. When both are zero, 0/0 results in NaN, which is acceptable in this context.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1755
File: kleros-app/src/lib/atlas/providers/AtlasProvider.tsx:130-144
Timestamp: 2024-11-21T05:47:08.973Z
Learning: In kleros-app/src/lib/atlas/providers/AtlasProvider.tsx, it is acceptable to pass queryClient as a positional parameter to the useQuery hook.

Learnt from: kemuru
PR: #1994
File: web/vite.config.js:26-33
Timestamp: 2025-05-23T17:47:39.947Z
Learning: The viteStaticCopy plugin configuration in web/vite.config.js correctly copies Shutter SDK files from the installed node_modules location. The path resolve(__dirname, "../node_modules/@shutter-network/shutter-sdk/dist/*") works when dependencies are properly installed, despite initial analysis suggesting otherwise due to sandbox environment limitations.

web/src/consts/index.ts (11)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-07-25T11:58:27.058Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-10-08T16:23:56.290Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: kemuru
PR: #1702
File: web/src/pages/Home/TopJurors/JurorCard/index.tsx:10-11
Timestamp: 2024-10-08T16:23:56.291Z
Learning: In the kleros-v2 codebase, the property totalResolvedDisputes should remain and should not be renamed to totalResolvedVotes.

Learnt from: kemuru
PR: #1702
File: web/src/pages/Home/TopJurors/JurorCard/index.tsx:10-11
Timestamp: 2024-10-07T06:18:23.427Z
Learning: In the kleros-v2 codebase, the property totalResolvedDisputes should remain and should not be renamed to totalResolvedVotes.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/requests/gqlClient.ts:18-18
Timestamp: 2024-10-24T08:16:02.749Z
Learning: In this TypeScript project, when a file (such as kleros-sdk/src/requests/gqlClient.ts) exports only a single entity, it's acceptable to use default exports instead of named exports.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/sdk.ts:1-3
Timestamp: 2024-10-22T10:23:15.789Z
Learning: In kleros-sdk/src/sdk.ts, the PublicClient type is used and should not be flagged as unused.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

web/src/context/NewDisputeContext.tsx (7)

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-07-25T11:58:27.058Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-10-08T16:23:56.290Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

web/src/utils/prepareArbitratorExtradata.ts (6)

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/dataMappings/utils/actionTypes.ts:22-22
Timestamp: 2024-10-22T09:34:54.761Z
Learning: In kleros-sdk/src/dataMappings/utils/actionTypes.ts, the abi field in AbiCallMapping is intentionally typed as string because it is parsed later in the action functions.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/dataMappings/utils/actionTypes.ts:29-29
Timestamp: 2024-10-22T09:36:10.478Z
Learning: In kleros-sdk/src/dataMappings/utils/actionTypes.ts, the abi field in AbiEventMapping is intentionally typed as string because it is parsed later in the action functions.

web/src/hooks/useDisputeKitAddresses.ts (11)

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-10-08T16:23:56.290Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-07-25T11:58:27.058Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: Harman-singh-waraich
PR: #1762
File: web/src/utils/parseWagmiError.ts:10-17
Timestamp: 2024-11-29T06:23:15.955Z
Learning: In the web/src/utils/parseWagmiError.ts file and throughout the codebase, prefer using optional chaining to handle undefined or null values, including optional arrays, without adding explicit existence or length checks.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

web/src/pages/Resolver/Parameters/Court.tsx (12)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:98-103
Timestamp: 2024-10-09T10:23:39.325Z
Learning: In SelectArbitrable.tsx of the web-devtools project (React/TypeScript), direct DOM manipulation using child.click() is acceptable when considered reasonably safe.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:69-69
Timestamp: 2024-10-29T10:13:04.524Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when the button is disabled, the associated logic won't be reached, and certain code paths may exist for TypeScript purposes.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:0-0
Timestamp: 2025-05-15T06:50:45.650Z
Learning: In the Kleros V2 codebase, it's acceptable to use ESLint disable comments for dependency arrays in useEffect hooks when including certain dependencies (like state that is being updated within the effect) would cause infinite loops.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

🧰 Additional context used
🧠 Learnings (16)
📓 Common learnings
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.
Learnt from: tractorss
PR: kleros/kleros-v2#1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass `dispute?.dispute?.arbitrated.id as 0x${string}` to `usePopulatedDisputeData` without additional null checks because the hook internally handles undefined parameters through its `isEnabled` flag and won't execute the query unless all required data is available.
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In `web/src/hooks/queries/usePopulatedDisputeData.ts`, the query and subsequent logic only execute when `disputeData.dispute?.arbitrableChainId` and `disputeData.dispute?.externalDisputeId` are defined, so `initialContext` properties based on these values are safe to use without additional null checks.
web/src/hooks/queries/useDisputeDetailsQuery.ts (12)

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1755
File: kleros-app/src/lib/atlas/providers/AtlasProvider.tsx:130-144
Timestamp: 2024-11-21T05:47:08.973Z
Learning: In kleros-app/src/lib/atlas/providers/AtlasProvider.tsx, it is acceptable to pass queryClient as a positional parameter to the useQuery hook.

Learnt from: Harman-singh-waraich
PR: #1727
File: web/src/utils/atlas/updateEmail.ts:34-37
Timestamp: 2024-10-28T12:20:19.884Z
Learning: In web/src/utils/atlas/updateEmail.ts, the error coming from the GraphQLError array already has the necessary structure, so additional specificity in error handling is unnecessary.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-10-08T16:23:56.290Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-07-25T11:58:27.058Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: kemuru
PR: #1702
File: web/src/pages/Home/TopJurors/JurorCard/index.tsx:10-11
Timestamp: 2024-10-08T16:23:56.291Z
Learning: In the kleros-v2 codebase, the property totalResolvedDisputes should remain and should not be renamed to totalResolvedVotes.

Learnt from: kemuru
PR: #1702
File: web/src/pages/Home/TopJurors/JurorCard/index.tsx:10-11
Timestamp: 2024-10-07T06:18:23.427Z
Learning: In the kleros-v2 codebase, the property totalResolvedDisputes should remain and should not be renamed to totalResolvedVotes.

web/src/pages/Resolver/NavigationButtons/SubmitBatchDisputesButton.tsx (10)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-10-08T16:23:56.290Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-07-25T11:58:27.058Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/dataMappings/utils/actionTypes.ts:25-25
Timestamp: 2024-10-22T09:35:14.098Z
Learning: In kleros-sdk/src/dataMappings/utils/actionTypes.ts, for the AbiCallMapping type, it's acceptable to use args: any[] since args can be anything.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:43-43
Timestamp: 2024-10-14T15:29:32.954Z
Learning: In the Kleros SDK, when using the populateTemplate function in kleros-sdk/src/utils/getDispute.ts, missing variables in Mustache templates are acceptable. Mustache fills in blanks, and it's preferable to return the partially populated template without throwing errors, as it's still helpful for the consumer.

Learnt from: Harman-singh-waraich
PR: #1727
File: web/src/context/AtlasProvider.tsx:159-171
Timestamp: 2024-10-29T06:46:13.522Z
Learning: Both SubmitEvidenceModal.tsx and Policy/index.tsx use the uploadFile function from AtlasProvider, which includes the fetchWithAuthErrorHandling error handling utility.

web/src/pages/Resolver/Briefing/Title.tsx (12)

Learnt from: kemuru
PR: #1764
File: web/src/components/ScrollTop.tsx:12-28
Timestamp: 2024-12-03T13:58:53.597Z
Learning: In the React component ScrollTop (web/src/components/ScrollTop.tsx), the effect hook is intentionally designed to execute only once, so dependencies are not added to the dependency array.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:0-0
Timestamp: 2025-05-15T06:50:45.650Z
Learning: In the Kleros V2 codebase, it's acceptable to use ESLint disable comments for dependency arrays in useEffect hooks when including certain dependencies (like state that is being updated within the effect) would cause infinite loops.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: Harman-singh-waraich
PR: #1694
File: web-devtools/package.json:33-35
Timestamp: 2024-09-27T10:07:54.013Z
Learning: react-toastify is used in the web-devtools project, particularly in layout.tsx, and should not be flagged as unused.

Learnt from: Harman-singh-waraich
PR: #1694
File: web-devtools/package.json:33-35
Timestamp: 2024-10-08T16:23:56.291Z
Learning: react-toastify is used in the web-devtools project, particularly in layout.tsx, and should not be flagged as unused.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

web/src/pages/Resolver/Briefing/Description.tsx (13)

Learnt from: kemuru
PR: #1764
File: web/src/components/ScrollTop.tsx:12-28
Timestamp: 2024-12-03T13:58:53.597Z
Learning: In the React component ScrollTop (web/src/components/ScrollTop.tsx), the effect hook is intentionally designed to execute only once, so dependencies are not added to the dependency array.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:0-0
Timestamp: 2025-05-15T06:50:45.650Z
Learning: In the Kleros V2 codebase, it's acceptable to use ESLint disable comments for dependency arrays in useEffect hooks when including certain dependencies (like state that is being updated within the effect) would cause infinite loops.

Learnt from: Harman-singh-waraich
PR: #1694
File: web-devtools/package.json:33-35
Timestamp: 2024-09-27T10:07:54.013Z
Learning: react-toastify is used in the web-devtools project, particularly in layout.tsx, and should not be flagged as unused.

Learnt from: Harman-singh-waraich
PR: #1694
File: web-devtools/package.json:33-35
Timestamp: 2024-10-08T16:23:56.291Z
Learning: react-toastify is used in the web-devtools project, particularly in layout.tsx, and should not be flagged as unused.

Learnt from: alcercu
PR: #1582
File: web-devtools/src/context/RulerContext.tsx:50-59
Timestamp: 2024-10-14T10:25:48.452Z
Learning: In React, setter functions returned by useState are stable between renders and don't need to be included in the dependency array of useEffect hooks.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In this project, JSDoc documentation is considered unnecessary for React components.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

web/src/hooks/queries/useSupportedDisputeKits.ts (12)

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1755
File: kleros-app/src/lib/atlas/providers/AtlasProvider.tsx:130-144
Timestamp: 2024-11-21T05:47:08.973Z
Learning: In kleros-app/src/lib/atlas/providers/AtlasProvider.tsx, it is acceptable to pass queryClient as a positional parameter to the useQuery hook.

Learnt from: Harman-singh-waraich
PR: #1850
File: web/src/context/GraphqlBatcher.tsx:25-41
Timestamp: 2025-01-27T11:25:08.246Z
Learning: In GraphQL batch operations using Promise.all, individual request errors should be caught and handled (e.g., returning {data: {}}) rather than thrown, to prevent a single failure from causing the entire batch to fail.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/requests/fetchDisputeDetails.ts:14-27
Timestamp: 2024-10-23T14:05:15.987Z
Learning: Avoid using graphql-request in built libraries as it behaves unexpectedly.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/requests/gqlClient.ts:18-18
Timestamp: 2024-10-24T08:16:02.749Z
Learning: In this TypeScript project, when a file (such as kleros-sdk/src/requests/gqlClient.ts) exports only a single entity, it's acceptable to use default exports instead of named exports.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: jaybuidl
PR: #1746
File: contracts/config/courts.v2.mainnet-neo.json:3-17
Timestamp: 2024-11-19T16:09:41.467Z
Learning: In contracts/config/courts.v2.mainnet-neo.json, the General Court (ID: 1) can have its parent ID set to itself ("parent": 1), as there is no parent court with ID 0 currently.

web/src/pages/Resolver/Parameters/VotingOptions/index.tsx (14)

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: kemuru
PR: #1764
File: web/src/components/ScrollTop.tsx:12-28
Timestamp: 2024-12-03T13:58:53.597Z
Learning: In the React component ScrollTop (web/src/components/ScrollTop.tsx), the effect hook is intentionally designed to execute only once, so dependencies are not added to the dependency array.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:98-103
Timestamp: 2024-10-09T10:23:39.325Z
Learning: In SelectArbitrable.tsx of the web-devtools project (React/TypeScript), direct DOM manipulation using child.click() is acceptable when considered reasonably safe.

Learnt from: Harman-singh-waraich
PR: #1739
File: web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx:22-26
Timestamp: 2024-11-07T10:48:16.774Z
Learning: In the Coherency component (web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx), totalResolvedVotes is always greater than or equal to totalCoherentVotes. When both are zero, 0/0 results in NaN, which is acceptable in this context.

Learnt from: Harman-singh-waraich
PR: #1694
File: web-devtools/package.json:33-35
Timestamp: 2024-09-27T10:07:54.013Z
Learning: react-toastify is used in the web-devtools project, particularly in layout.tsx, and should not be flagged as unused.

Learnt from: Harman-singh-waraich
PR: #1694
File: web-devtools/package.json:33-35
Timestamp: 2024-10-08T16:23:56.291Z
Learning: react-toastify is used in the web-devtools project, particularly in layout.tsx, and should not be flagged as unused.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:0-0
Timestamp: 2025-05-15T06:50:45.650Z
Learning: In the Kleros V2 codebase, it's acceptable to use ESLint disable comments for dependency arrays in useEffect hooks when including certain dependencies (like state that is being updated within the effect) would cause infinite loops.

Learnt from: Harman-singh-waraich
PR: #1759
File: web/src/pages/Cases/CaseDetails/Appeal/Classic/Fund.tsx:140-143
Timestamp: 2024-11-26T10:50:23.399Z
Learning: In the Kleros-v2 React project, errors are handled by the wrapWithToast function, which displays error messages to users via toast notifications.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

web/src/pages/Resolver/Parameters/Category.tsx (11)

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: kemuru
PR: #1764
File: web/src/components/ScrollTop.tsx:12-28
Timestamp: 2024-12-03T13:58:53.597Z
Learning: In the React component ScrollTop (web/src/components/ScrollTop.tsx), the effect hook is intentionally designed to execute only once, so dependencies are not added to the dependency array.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:0-0
Timestamp: 2025-05-15T06:50:45.650Z
Learning: In the Kleros V2 codebase, it's acceptable to use ESLint disable comments for dependency arrays in useEffect hooks when including certain dependencies (like state that is being updated within the effect) would cause infinite loops.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: Harman-singh-waraich
PR: #1694
File: web-devtools/package.json:33-35
Timestamp: 2024-09-27T10:07:54.013Z
Learning: react-toastify is used in the web-devtools project, particularly in layout.tsx, and should not be flagged as unused.

Learnt from: Harman-singh-waraich
PR: #1694
File: web-devtools/package.json:33-35
Timestamp: 2024-10-08T16:23:56.291Z
Learning: react-toastify is used in the web-devtools project, particularly in layout.tsx, and should not be flagged as unused.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

web/src/pages/Resolver/NavigationButtons/SubmitDisputeButton.tsx (10)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-10-08T16:23:56.290Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-07-25T11:58:27.058Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:43-43
Timestamp: 2024-10-14T15:29:32.954Z
Learning: In the Kleros SDK, when using the populateTemplate function in kleros-sdk/src/utils/getDispute.ts, missing variables in Mustache templates are acceptable. Mustache fills in blanks, and it's preferable to return the partially populated template without throwing errors, as it's still helpful for the consumer.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:98-103
Timestamp: 2024-10-09T10:23:39.325Z
Learning: In SelectArbitrable.tsx of the web-devtools project (React/TypeScript), direct DOM manipulation using child.click() is acceptable when considered reasonably safe.

web/src/pages/Cases/CaseDetails/Appeal/index.tsx (12)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/RulingModes.tsx:233-233
Timestamp: 2024-10-09T10:19:11.816Z
Learning: In 'web-devtools/src/app/(main)/ruler/RulingModes.tsx', the label 'Random Preset' is correct and should not be changed to 'Automatic Random'.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:69-69
Timestamp: 2024-10-29T10:13:04.524Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when the button is disabled, the associated logic won't be reached, and certain code paths may exist for TypeScript purposes.

Learnt from: kemuru
PR: #1764
File: web/src/components/ScrollTop.tsx:12-28
Timestamp: 2024-12-03T13:58:53.597Z
Learning: In the React component ScrollTop (web/src/components/ScrollTop.tsx), the effect hook is intentionally designed to execute only once, so dependencies are not added to the dependency array.

web/src/pages/Cases/CaseDetails/Voting/index.tsx (15)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: kemuru
PR: #1702
File: web/src/pages/Home/TopJurors/JurorCard/index.tsx:10-11
Timestamp: 2024-10-08T16:23:56.291Z
Learning: In the kleros-v2 codebase, the property totalResolvedDisputes should remain and should not be renamed to totalResolvedVotes.

Learnt from: kemuru
PR: #1702
File: web/src/pages/Home/TopJurors/JurorCard/index.tsx:10-11
Timestamp: 2024-10-07T06:18:23.427Z
Learning: In the kleros-v2 codebase, the property totalResolvedDisputes should remain and should not be renamed to totalResolvedVotes.

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

Learnt from: Harman-singh-waraich
PR: #1739
File: web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx:22-26
Timestamp: 2024-11-07T10:48:16.774Z
Learning: In the Coherency component (web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx), totalResolvedVotes is always greater than or equal to totalCoherentVotes. When both are zero, 0/0 results in NaN, which is acceptable in this context.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1755
File: kleros-app/src/lib/atlas/providers/AtlasProvider.tsx:130-144
Timestamp: 2024-11-21T05:47:08.973Z
Learning: In kleros-app/src/lib/atlas/providers/AtlasProvider.tsx, it is acceptable to pass queryClient as a positional parameter to the useQuery hook.

Learnt from: kemuru
PR: #1994
File: web/vite.config.js:26-33
Timestamp: 2025-05-23T17:47:39.947Z
Learning: The viteStaticCopy plugin configuration in web/vite.config.js correctly copies Shutter SDK files from the installed node_modules location. The path resolve(__dirname, "../node_modules/@shutter-network/shutter-sdk/dist/*") works when dependencies are properly installed, despite initial analysis suggesting otherwise due to sandbox environment limitations.

web/src/consts/index.ts (11)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-07-25T11:58:27.058Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-10-08T16:23:56.290Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: kemuru
PR: #1702
File: web/src/pages/Home/TopJurors/JurorCard/index.tsx:10-11
Timestamp: 2024-10-08T16:23:56.291Z
Learning: In the kleros-v2 codebase, the property totalResolvedDisputes should remain and should not be renamed to totalResolvedVotes.

Learnt from: kemuru
PR: #1702
File: web/src/pages/Home/TopJurors/JurorCard/index.tsx:10-11
Timestamp: 2024-10-07T06:18:23.427Z
Learning: In the kleros-v2 codebase, the property totalResolvedDisputes should remain and should not be renamed to totalResolvedVotes.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/requests/gqlClient.ts:18-18
Timestamp: 2024-10-24T08:16:02.749Z
Learning: In this TypeScript project, when a file (such as kleros-sdk/src/requests/gqlClient.ts) exports only a single entity, it's acceptable to use default exports instead of named exports.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/sdk.ts:1-3
Timestamp: 2024-10-22T10:23:15.789Z
Learning: In kleros-sdk/src/sdk.ts, the PublicClient type is used and should not be flagged as unused.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

web/src/context/NewDisputeContext.tsx (7)

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-07-25T11:58:27.058Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-10-08T16:23:56.290Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

web/src/utils/prepareArbitratorExtradata.ts (6)

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/dataMappings/utils/actionTypes.ts:22-22
Timestamp: 2024-10-22T09:34:54.761Z
Learning: In kleros-sdk/src/dataMappings/utils/actionTypes.ts, the abi field in AbiCallMapping is intentionally typed as string because it is parsed later in the action functions.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/dataMappings/utils/actionTypes.ts:29-29
Timestamp: 2024-10-22T09:36:10.478Z
Learning: In kleros-sdk/src/dataMappings/utils/actionTypes.ts, the abi field in AbiEventMapping is intentionally typed as string because it is parsed later in the action functions.

web/src/hooks/useDisputeKitAddresses.ts (11)

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-10-08T16:23:56.290Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-07-25T11:58:27.058Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: Harman-singh-waraich
PR: #1762
File: web/src/utils/parseWagmiError.ts:10-17
Timestamp: 2024-11-29T06:23:15.955Z
Learning: In the web/src/utils/parseWagmiError.ts file and throughout the codebase, prefer using optional chaining to handle undefined or null values, including optional arrays, without adding explicit existence or length checks.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

web/src/pages/Resolver/Parameters/Court.tsx (12)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:98-103
Timestamp: 2024-10-09T10:23:39.325Z
Learning: In SelectArbitrable.tsx of the web-devtools project (React/TypeScript), direct DOM manipulation using child.click() is acceptable when considered reasonably safe.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:69-69
Timestamp: 2024-10-29T10:13:04.524Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when the button is disabled, the associated logic won't be reached, and certain code paths may exist for TypeScript purposes.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:0-0
Timestamp: 2025-05-15T06:50:45.650Z
Learning: In the Kleros V2 codebase, it's acceptable to use ESLint disable comments for dependency arrays in useEffect hooks when including certain dependencies (like state that is being updated within the effect) would cause infinite loops.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (14)
  • GitHub Check: Redirect rules - kleros-v2-testnet-devtools
  • GitHub Check: Redirect rules - kleros-v2-neo
  • GitHub Check: Redirect rules - kleros-v2-testnet
  • GitHub Check: Redirect rules - kleros-v2-testnet
  • GitHub Check: Header rules - kleros-v2-testnet-devtools
  • GitHub Check: Header rules - kleros-v2-neo
  • GitHub Check: Header rules - kleros-v2-testnet
  • GitHub Check: Header rules - kleros-v2-testnet
  • GitHub Check: Pages changed - kleros-v2-neo
  • GitHub Check: Pages changed - kleros-v2-testnet-devtools
  • GitHub Check: Pages changed - kleros-v2-testnet
  • GitHub Check: Pages changed - kleros-v2-testnet
  • GitHub Check: contracts-testing
  • GitHub Check: Analyze (javascript)
🔇 Additional comments (13)
web/src/consts/index.ts (1)

46-51: LGTM! Excellent architectural improvement.

The replacement of dynamic ID-based dispute kit identification with a static enum is a solid design choice that centralizes naming, improves predictability, and supports the new address-based identification approach. The addition of Gated and GatedShutter dispute kits aligns perfectly with the PR objectives.

web/src/hooks/queries/useDisputeDetailsQuery.ts (1)

33-33: LGTM! Essential addition for address-based dispute kit handling.

Adding the address field to the GraphQL query enables the new address-based dispute kit identification approach, which is a key component of this PR's improvements.

web/src/pages/Resolver/NavigationButtons/SubmitBatchDisputesButton.tsx (1)

55-56: LGTM! Correctly implements support for gated dispute kit data.

The addition of disputeData.disputeKitData as the fourth parameter enables encoding of dispute kit-specific data, which is essential for supporting gated dispute kits. The change aligns well with the updated prepareArbitratorExtradata function signature.

web/src/hooks/queries/useSupportedDisputeKits.ts (1)

13-13: LGTM! Consistent with the address-based dispute kit approach.

Adding the address field to the supportedDisputeKits query complements the similar change in useDisputeDetailsQuery and enables comprehensive address-based dispute kit identification across the application.

web/src/pages/Resolver/Briefing/Description.tsx (1)

1-1: LGTM! Well-implemented UX enhancement.

The auto-focus functionality is cleanly implemented using React best practices. The useEffect with empty dependency array runs once on mount, safely queries for the textarea element, and focuses it appropriately. This improves the user experience during dispute resolution setup.

Also applies to: 33-33, 39-46, 49-49

web/src/pages/Resolver/Briefing/Title.tsx (1)

1-1: LGTM! Clean auto-focus implementation.

The automatic focus functionality is well-implemented using standard React patterns. The useRef hook provides DOM access, and the useEffect with an empty dependency array ensures the focus happens only once on mount. This enhances accessibility and user experience.

Also applies to: 39-39, 45-52, 55-55

web/src/pages/Resolver/Parameters/VotingOptions/index.tsx (1)

1-1: LGTM! Consistent auto-focus implementation.

The auto-focus implementation follows the same clean pattern as other resolver components, improving user experience by automatically focusing the primary input field on component mount.

Also applies to: 42-42, 48-55, 58-58

web/src/pages/Resolver/NavigationButtons/SubmitDisputeButton.tsx (1)

58-60: LGTM! Proper integration of dispute kit data.

The addition of disputeData.disputeKitData as a fourth parameter to prepareArbitratorExtradata correctly supports the enhanced dispute kit functionality, including gated dispute kits as mentioned in the PR objectives.

web/src/pages/Resolver/Parameters/Category.tsx (1)

1-1: LGTM! Consistent auto-focus pattern maintained.

The auto-focus implementation is consistent with other resolver parameter components, maintaining a unified user experience across the dispute resolution workflow.

Also applies to: 43-43, 49-56, 59-59

web/src/pages/Cases/CaseDetails/Appeal/index.tsx (1)

7-7: LGTM! Improved dispute kit identification approach.

The refactor from ID-based substring matching to address-based exact matching with enum constants is a significant improvement:

  • More precise matching eliminates potential edge cases from substring checks
  • Better type safety using DisputeKits enum constants
  • Address-based identification aligns with the PR's architectural changes
  • Cleaner, more maintainable code structure

This change supports the PR's objective of enabling better dispute kit handling and identification.

Also applies to: 9-9, 54-57

web/src/pages/Cases/CaseDetails/Voting/index.tsx (1)

73-76: LGTM! Clean refactor to address-based dispute kit identification

The change from ID-based to address-based dispute kit identification is well-implemented. The code properly handles the optional dispute kit address and uses the new hook to get the human-readable name.

web/src/context/NewDisputeContext.tsx (1)

57-70: Well-structured type definitions for dispute kit data

The introduction of the IDisputeKitData union type and specific interfaces for gated and future dispute kits provides good extensibility. The gated dispute kit data structure properly captures token gating requirements.

web/src/pages/Resolver/Parameters/Court.tsx (1)

110-118: Dispute kit auto-selection is safe and doesn’t override any user-stored preference
The selectedDisputeKitId is derived from disputeData.disputeKitId (on-chain data), and there’s no client-side persistence (e.g. localStorage) for a user’s dispute kit choice in the codebase. You can ignore this warning.

Likely an incorrect or invalid review comment.

Comment on lines +1 to +163
const contractAddress = addressMapping[chainId as keyof typeof addressMapping] as string;
if (
contractAddress &&
typeof contractAddress === "string" &&
contractAddress.toLowerCase() === disputeKitAddress.toLowerCase()
) {
setDisputeKitName(humanName as DisputeKits);
return;
}
}
}

// If no address matches, return undefined
setDisputeKitName(undefined);
} catch {
// If we can't import generated contracts, return undefined
setDisputeKitName(undefined);
}
} catch (err) {
console.error("Failed to determine dispute kit name:", err);
setError("Failed to determine dispute kit type");
setDisputeKitName(undefined);
} finally {
setIsLoading(false);
}
};

loadDisputeKitName();
}, [chainId, disputeKitAddress]);

return {
disputeKitName,
isLoading,
error,
};
};

/**
* Hook to get all dispute kit addresses for the current chain
* @returns All dispute kit addresses, loading state, and error state
*/
export const useDisputeKitAddressesAll = (): UseDisputeKitAddressesAllReturn => {
const chainId = useChainId();
const [availableDisputeKits, setAvailableDisputeKits] = useState<Record<string, DisputeKits>>({});
const [isLoading, setIsLoading] = useState(true);
const [error, setError] = useState<string | null>(null);

useEffect(() => {
const loadAllDisputeKitAddresses = async () => {
try {
setIsLoading(true);
setError(null);

// If no chainId, we can't look up from generated contracts
if (!chainId) {
setAvailableDisputeKits({});
setIsLoading(false);
return;
}

// Dynamic import to handle cases where generated contracts might not be available
try {
const generatedContracts = await import("hooks/contracts/generated");
const newAvailableDisputeKits: Record<string, DisputeKits> = {};

// Iterate through all dispute kits and get their addresses
for (const [humanName, contractKey] of Object.entries(DISPUTE_KIT_CONFIG)) {
const addressMapping = generatedContracts[contractKey as keyof typeof generatedContracts];

if (addressMapping && typeof addressMapping === "object" && chainId in addressMapping) {
const contractAddress = addressMapping[chainId as keyof typeof addressMapping] as string;
if (contractAddress && typeof contractAddress === "string") {
newAvailableDisputeKits[contractAddress.toLowerCase()] = humanName as DisputeKits;
}
}
}

setAvailableDisputeKits(newAvailableDisputeKits);
} catch {
// If we can't import generated contracts, return empty object
setAvailableDisputeKits({});
}
} catch (err) {
console.error("Failed to load dispute kit addresses:", err);
setError("Failed to load dispute kit addresses");
setAvailableDisputeKits({});
} finally {
setIsLoading(false);
}
};

loadAllDisputeKitAddresses();
}, [chainId]);

return {
availableDisputeKits,
isLoading,
error,
};
};
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Consider adding unit tests for the new hooks

These hooks contain critical logic for dispute kit identification and would benefit from comprehensive unit tests to ensure reliability.

Would you like me to generate unit tests for these hooks or open an issue to track this task?

🤖 Prompt for AI Agents
In web/src/hooks/useDisputeKitAddresses.ts from lines 1 to 163, the new hooks
useDisputeKitAddresses and useDisputeKitAddressesAll lack unit tests. To fix
this, create comprehensive unit tests covering various scenarios such as valid
and invalid dispute kit addresses, missing chainId, and error handling during
dynamic imports. Use a testing framework like Jest with React Testing Library to
mock dependencies like useChainId and the dynamic import of generated contracts,
ensuring the hooks behave correctly and handle loading and error states as
expected.

Comment on lines +78 to +81
} catch {
// If we can't import generated contracts, return undefined
setDisputeKitName(undefined);
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Empty catch block suppresses errors silently

The empty catch block could hide important errors during development.

Log the error for debugging purposes:

-        } catch {
+        } catch (importError) {
+          console.warn('Failed to import generated contracts:', importError);
           // If we can't import generated contracts, return undefined
           setDisputeKitName(undefined);
         }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
} catch {
// If we can't import generated contracts, return undefined
setDisputeKitName(undefined);
}
} catch (importError) {
console.warn('Failed to import generated contracts:', importError);
// If we can't import generated contracts, return undefined
setDisputeKitName(undefined);
}
🤖 Prompt for AI Agents
In web/src/hooks/useDisputeKitAddresses.ts around lines 78 to 81, the catch
block is empty and silently suppresses errors. Modify the catch block to accept
the error object and log it using console.error or a similar logging method to
ensure errors are visible during development and debugging.

Comment on lines +142 to +145
} catch {
// If we can't import generated contracts, return empty object
setAvailableDisputeKits({});
}
Copy link
Contributor

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Empty catch block suppresses errors silently

The empty catch block could hide important errors during development.

Log the error for debugging purposes:

-        } catch {
+        } catch (importError) {
+          console.warn('Failed to import generated contracts:', importError);
           // If we can't import generated contracts, return empty object
           setAvailableDisputeKits({});
         }
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
} catch {
// If we can't import generated contracts, return empty object
setAvailableDisputeKits({});
}
} catch (importError) {
console.warn('Failed to import generated contracts:', importError);
// If we can't import generated contracts, return empty object
setAvailableDisputeKits({});
}
🤖 Prompt for AI Agents
In web/src/hooks/useDisputeKitAddresses.ts around lines 142 to 145, the catch
block is empty and silently suppresses errors, which can hide important issues
during development. Modify the catch block to log the caught error before
setting available dispute kits to an empty object. This will help in debugging
by making the error visible in the console or logs.

import { landscapeStyle } from "styles/landscapeStyle";
import { responsiveSize } from "styles/responsiveSize";
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Unused import detected

The responsiveSize import is not used anywhere in this file.

Remove the unused import:

-import { responsiveSize } from "styles/responsiveSize";
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
import { responsiveSize } from "styles/responsiveSize";
🤖 Prompt for AI Agents
In web/src/pages/Cases/CaseDetails/Voting/index.tsx at line 23, the import
statement for responsiveSize is unused. Remove the entire line importing
responsiveSize to clean up the code and avoid unnecessary imports.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (2)
web/src/pages/Resolver/Parameters/Court.tsx (2)

143-165: Add type guards for safe type assertions.

The type assertions to IGatedDisputeData should include runtime type validation to prevent potential runtime errors.

Add type guard validation before casting:

  const handleTokenAddressChange = (event: React.ChangeEvent<HTMLInputElement>) => {
+   if (disputeData.disputeKitData?.type !== 'gated') return;
    const currentData = disputeData.disputeKitData as IGatedDisputeData;

Apply similar checks to handleERC1155TokenChange and handleTokenIdChange.


173-173: Address the non-null assertion operator usage.

The use of the non-null assertion operator (!) can lead to runtime errors if the assumption is incorrect.

Use safer extraction:

-  onSelect={(path: string | number) => typeof path === "string" && handleCourtChange(path.split("/").pop()!)}
+  onSelect={(path: string | number) => {
+    if (typeof path === "string") {
+      const courtId = path.split("/").pop();
+      if (courtId) handleCourtChange(courtId);
+    }
+  }}
🧹 Nitpick comments (1)
web/src/utils/extradataToTokenInfo.ts (1)

25-31: Consider adding constants for magic numbers.

The byte offsets (96, 128, 160) are magic numbers that could benefit from named constants for better maintainability and documentation.

+// Smart contract storage slot offsets
+const PACKED_TOKEN_GATE_OFFSET = 96;
+const PACKED_TOKEN_GATE_END = 128;
+const TOKEN_ID_OFFSET = 128;
+const TOKEN_ID_END = 160;
+const MIN_EXTRADATA_LENGTH = 160;

-  if (extraDataBytes.length < 160) {
+  if (extraDataBytes.length < MIN_EXTRADATA_LENGTH) {
-  const packedBytes = extraDataBytes.slice(96, 128);
+  const packedBytes = extraDataBytes.slice(PACKED_TOKEN_GATE_OFFSET, PACKED_TOKEN_GATE_END);
-  const tokenIdBytes = extraDataBytes.slice(128, 160);
+  const tokenIdBytes = extraDataBytes.slice(TOKEN_ID_OFFSET, TOKEN_ID_END);
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 8818c80 and 4d0c513.

📒 Files selected for processing (5)
  • web/src/hooks/queries/useRoundDetailsQuery.ts (1 hunks)
  • web/src/pages/Resolver/Landing/index.tsx (3 hunks)
  • web/src/pages/Resolver/Parameters/Court.tsx (2 hunks)
  • web/src/utils/extradataToTokenInfo.ts (1 hunks)
  • web/src/utils/prepareArbitratorExtradata.ts (1 hunks)
🧠 Learnings (4)
📓 Common learnings
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.
Learnt from: tractorss
PR: kleros/kleros-v2#1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass `dispute?.dispute?.arbitrated.id as 0x${string}` to `usePopulatedDisputeData` without additional null checks because the hook internally handles undefined parameters through its `isEnabled` flag and won't execute the query unless all required data is available.
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In `web/src/hooks/queries/usePopulatedDisputeData.ts`, the query and subsequent logic only execute when `disputeData.dispute?.arbitrableChainId` and `disputeData.dispute?.externalDisputeId` are defined, so `initialContext` properties based on these values are safe to use without additional null checks.
web/src/hooks/queries/useRoundDetailsQuery.ts (4)

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1755
File: kleros-app/src/lib/atlas/providers/AtlasProvider.tsx:130-144
Timestamp: 2024-11-21T05:47:08.973Z
Learning: In kleros-app/src/lib/atlas/providers/AtlasProvider.tsx, it is acceptable to pass queryClient as a positional parameter to the useQuery hook.

web/src/pages/Resolver/Landing/index.tsx (14)

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: Harman-singh-waraich
PR: #1739
File: web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx:22-26
Timestamp: 2024-11-07T10:48:16.774Z
Learning: In the Coherency component (web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx), totalResolvedVotes is always greater than or equal to totalCoherentVotes. When both are zero, 0/0 results in NaN, which is acceptable in this context.

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-10-08T16:23:56.290Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-07-25T11:58:27.058Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: Harman-singh-waraich
PR: #1755
File: kleros-app/src/lib/atlas/providers/AtlasProvider.tsx:130-144
Timestamp: 2024-11-21T05:47:08.973Z
Learning: In kleros-app/src/lib/atlas/providers/AtlasProvider.tsx, it is acceptable to pass queryClient as a positional parameter to the useQuery hook.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:43-43
Timestamp: 2024-10-14T15:29:32.954Z
Learning: In the Kleros SDK, when using the populateTemplate function in kleros-sdk/src/utils/getDispute.ts, missing variables in Mustache templates are acceptable. Mustache fills in blanks, and it's preferable to return the partially populated template without throwing errors, as it's still helpful for the consumer.

web/src/pages/Resolver/Parameters/Court.tsx (24)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: jaybuidl
PR: #1746
File: contracts/config/courts.v2.mainnet-neo.json:3-5
Timestamp: 2024-11-19T17:18:39.007Z
Learning: In contracts/config/courts.v2.mainnet-neo.json, the General Court (id: 1) intentionally references itself as its parent ("parent": 1). This self-reference is acceptable and should not be flagged as an issue in future reviews.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:98-103
Timestamp: 2024-10-09T10:23:39.325Z
Learning: In SelectArbitrable.tsx of the web-devtools project (React/TypeScript), direct DOM manipulation using child.click() is acceptable when considered reasonably safe.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:69-69
Timestamp: 2024-10-29T10:13:04.524Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when the button is disabled, the associated logic won't be reached, and certain code paths may exist for TypeScript purposes.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:125-127
Timestamp: 2024-10-29T10:14:52.512Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when isEmailUpdateable is false, user?.emailUpdateableAt is always defined. Therefore, using the non-null assertion ! with user?.emailUpdateableAt! is acceptable because TypeScript may not infer its definiteness.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/dispute-template/page.tsx:324-360
Timestamp: 2024-10-09T10:17:37.935Z
Learning: In this codebase, prefer using the ?? (nullish coalescing operator) over || when handling default values for optional properties in React components.

Learnt from: Harman-singh-waraich
PR: #1762
File: web/src/utils/parseWagmiError.ts:10-17
Timestamp: 2024-11-29T06:23:15.955Z
Learning: In the web/src/utils/parseWagmiError.ts file and throughout the codebase, prefer using optional chaining to handle undefined or null values, including optional arrays, without adding explicit existence or length checks.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/RulingModes.tsx:179-199
Timestamp: 2024-10-09T10:18:51.089Z
Learning: In web-devtools/src/app/(main)/ruler/RulingModes.tsx, the handleUpdate function already handles errors via wrapWithToast, so additional error handling is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/dataMappings/utils/actionTypeValidators.ts:12-0
Timestamp: 2024-10-22T10:09:13.280Z
Learning: The validateMapping function in actionTypeValidators.ts already checks for required fields and throws an InvalidMappingError if they are missing, so adding type checks before casting to specific mapping types is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:43-43
Timestamp: 2024-10-14T15:29:32.954Z
Learning: Variable validation occurs dynamically within the executeActions function in kleros-sdk/src/dataMappings/executeActions.ts. If variables are missing, executeActions will throw errors to prompt the consumer to provide the missing variables.

Learnt from: Harman-singh-waraich
PR: #1755
File: kleros-app/src/lib/atlas/hooks/useSessionStorage.ts:3-12
Timestamp: 2024-11-21T05:38:11.576Z
Learning: In the useSessionStorage hook in kleros-app/src/lib/atlas/hooks/useSessionStorage.ts, the error handling in the catch block covers cases where window is undefined or sessionStorage throws an exception, so additional checks are unnecessary.

Learnt from: Harman-singh-waraich
PR: #1654
File: web/src/pages/Settings/EmailConfirmation/index.tsx:93-119
Timestamp: 2024-10-03T12:15:55.043Z
Learning: In the email confirmation component, an invalid link message is already displayed when the address is invalid or the token is missing. The useEffect should simply avoid making the call when the address is invalid or missing.

Learnt from: Harman-singh-waraich
PR: #1654
File: web/src/pages/Settings/EmailConfirmation/index.tsx:93-119
Timestamp: 2024-10-08T16:23:56.291Z
Learning: In the email confirmation component, an invalid link message is already displayed when the address is invalid or the token is missing. The useEffect should simply avoid making the call when the address is invalid or missing.

Learnt from: Harman-singh-waraich
PR: #1755
File: kleros-app/src/lib/atlas/utils/addUser.ts:18-37
Timestamp: 2024-11-21T06:14:26.307Z
Learning: In the kleros-app/src/lib/atlas/utils/addUser.ts file, email format validation is performed by the server in the addUser function. The library does not include client-side email validation, and it's the responsibility of the library consumers to perform any pre-checks if desired.

Learnt from: jaybuidl
PR: #1620
File: contracts/test/arbitration/draw.ts:84-84
Timestamp: 2024-11-05T11:32:11.238Z
Learning: In TypeScript code using ethers.js version 6, contract.target should be used instead of contract.address to access a contract's address.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:0-0
Timestamp: 2025-05-15T06:50:45.650Z
Learning: In the Kleros V2 codebase, it's acceptable to use ESLint disable comments for dependency arrays in useEffect hooks when including certain dependencies (like state that is being updated within the effect) would cause infinite loops.

Learnt from: Harman-singh-waraich
PR: #1759
File: web/src/pages/Cases/CaseDetails/Appeal/Classic/Fund.tsx:140-143
Timestamp: 2024-11-26T10:50:23.399Z
Learning: In the Kleros-v2 React project, errors are handled by the wrapWithToast function, which displays error messages to users via toast notifications.

Learnt from: jaybuidl
PR: #1746
File: contracts/config/courts.v2.mainnet-neo.json:3-17
Timestamp: 2024-11-19T16:09:41.467Z
Learning: In contracts/config/courts.v2.mainnet-neo.json, the General Court (ID: 1) can have its parent ID set to itself ("parent": 1), as there is no parent court with ID 0 currently.

🧬 Code Graph Analysis (1)
web/src/pages/Resolver/Landing/index.tsx (1)
web/src/utils/extradataToTokenInfo.ts (1)
  • extraDataToTokenInfo (14-45)
🚧 Files skipped from review as they are similar to previous changes (1)
  • web/src/utils/prepareArbitratorExtradata.ts
🧰 Additional context used
🧠 Learnings (4)
📓 Common learnings
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.
Learnt from: tractorss
PR: kleros/kleros-v2#1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass `dispute?.dispute?.arbitrated.id as 0x${string}` to `usePopulatedDisputeData` without additional null checks because the hook internally handles undefined parameters through its `isEnabled` flag and won't execute the query unless all required data is available.
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In `web/src/hooks/queries/usePopulatedDisputeData.ts`, the query and subsequent logic only execute when `disputeData.dispute?.arbitrableChainId` and `disputeData.dispute?.externalDisputeId` are defined, so `initialContext` properties based on these values are safe to use without additional null checks.
web/src/hooks/queries/useRoundDetailsQuery.ts (4)

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1755
File: kleros-app/src/lib/atlas/providers/AtlasProvider.tsx:130-144
Timestamp: 2024-11-21T05:47:08.973Z
Learning: In kleros-app/src/lib/atlas/providers/AtlasProvider.tsx, it is acceptable to pass queryClient as a positional parameter to the useQuery hook.

web/src/pages/Resolver/Landing/index.tsx (14)

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: Harman-singh-waraich
PR: #1739
File: web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx:22-26
Timestamp: 2024-11-07T10:48:16.774Z
Learning: In the Coherency component (web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx), totalResolvedVotes is always greater than or equal to totalCoherentVotes. When both are zero, 0/0 results in NaN, which is acceptable in this context.

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-10-08T16:23:56.290Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-07-25T11:58:27.058Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: Harman-singh-waraich
PR: #1755
File: kleros-app/src/lib/atlas/providers/AtlasProvider.tsx:130-144
Timestamp: 2024-11-21T05:47:08.973Z
Learning: In kleros-app/src/lib/atlas/providers/AtlasProvider.tsx, it is acceptable to pass queryClient as a positional parameter to the useQuery hook.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:43-43
Timestamp: 2024-10-14T15:29:32.954Z
Learning: In the Kleros SDK, when using the populateTemplate function in kleros-sdk/src/utils/getDispute.ts, missing variables in Mustache templates are acceptable. Mustache fills in blanks, and it's preferable to return the partially populated template without throwing errors, as it's still helpful for the consumer.

web/src/pages/Resolver/Parameters/Court.tsx (24)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: jaybuidl
PR: #1746
File: contracts/config/courts.v2.mainnet-neo.json:3-5
Timestamp: 2024-11-19T17:18:39.007Z
Learning: In contracts/config/courts.v2.mainnet-neo.json, the General Court (id: 1) intentionally references itself as its parent ("parent": 1). This self-reference is acceptable and should not be flagged as an issue in future reviews.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:98-103
Timestamp: 2024-10-09T10:23:39.325Z
Learning: In SelectArbitrable.tsx of the web-devtools project (React/TypeScript), direct DOM manipulation using child.click() is acceptable when considered reasonably safe.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:69-69
Timestamp: 2024-10-29T10:13:04.524Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when the button is disabled, the associated logic won't be reached, and certain code paths may exist for TypeScript purposes.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:125-127
Timestamp: 2024-10-29T10:14:52.512Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when isEmailUpdateable is false, user?.emailUpdateableAt is always defined. Therefore, using the non-null assertion ! with user?.emailUpdateableAt! is acceptable because TypeScript may not infer its definiteness.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/dispute-template/page.tsx:324-360
Timestamp: 2024-10-09T10:17:37.935Z
Learning: In this codebase, prefer using the ?? (nullish coalescing operator) over || when handling default values for optional properties in React components.

Learnt from: Harman-singh-waraich
PR: #1762
File: web/src/utils/parseWagmiError.ts:10-17
Timestamp: 2024-11-29T06:23:15.955Z
Learning: In the web/src/utils/parseWagmiError.ts file and throughout the codebase, prefer using optional chaining to handle undefined or null values, including optional arrays, without adding explicit existence or length checks.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/RulingModes.tsx:179-199
Timestamp: 2024-10-09T10:18:51.089Z
Learning: In web-devtools/src/app/(main)/ruler/RulingModes.tsx, the handleUpdate function already handles errors via wrapWithToast, so additional error handling is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/dataMappings/utils/actionTypeValidators.ts:12-0
Timestamp: 2024-10-22T10:09:13.280Z
Learning: The validateMapping function in actionTypeValidators.ts already checks for required fields and throws an InvalidMappingError if they are missing, so adding type checks before casting to specific mapping types is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:43-43
Timestamp: 2024-10-14T15:29:32.954Z
Learning: Variable validation occurs dynamically within the executeActions function in kleros-sdk/src/dataMappings/executeActions.ts. If variables are missing, executeActions will throw errors to prompt the consumer to provide the missing variables.

Learnt from: Harman-singh-waraich
PR: #1755
File: kleros-app/src/lib/atlas/hooks/useSessionStorage.ts:3-12
Timestamp: 2024-11-21T05:38:11.576Z
Learning: In the useSessionStorage hook in kleros-app/src/lib/atlas/hooks/useSessionStorage.ts, the error handling in the catch block covers cases where window is undefined or sessionStorage throws an exception, so additional checks are unnecessary.

Learnt from: Harman-singh-waraich
PR: #1654
File: web/src/pages/Settings/EmailConfirmation/index.tsx:93-119
Timestamp: 2024-10-03T12:15:55.043Z
Learning: In the email confirmation component, an invalid link message is already displayed when the address is invalid or the token is missing. The useEffect should simply avoid making the call when the address is invalid or missing.

Learnt from: Harman-singh-waraich
PR: #1654
File: web/src/pages/Settings/EmailConfirmation/index.tsx:93-119
Timestamp: 2024-10-08T16:23:56.291Z
Learning: In the email confirmation component, an invalid link message is already displayed when the address is invalid or the token is missing. The useEffect should simply avoid making the call when the address is invalid or missing.

Learnt from: Harman-singh-waraich
PR: #1755
File: kleros-app/src/lib/atlas/utils/addUser.ts:18-37
Timestamp: 2024-11-21T06:14:26.307Z
Learning: In the kleros-app/src/lib/atlas/utils/addUser.ts file, email format validation is performed by the server in the addUser function. The library does not include client-side email validation, and it's the responsibility of the library consumers to perform any pre-checks if desired.

Learnt from: jaybuidl
PR: #1620
File: contracts/test/arbitration/draw.ts:84-84
Timestamp: 2024-11-05T11:32:11.238Z
Learning: In TypeScript code using ethers.js version 6, contract.target should be used instead of contract.address to access a contract's address.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:0-0
Timestamp: 2025-05-15T06:50:45.650Z
Learning: In the Kleros V2 codebase, it's acceptable to use ESLint disable comments for dependency arrays in useEffect hooks when including certain dependencies (like state that is being updated within the effect) would cause infinite loops.

Learnt from: Harman-singh-waraich
PR: #1759
File: web/src/pages/Cases/CaseDetails/Appeal/Classic/Fund.tsx:140-143
Timestamp: 2024-11-26T10:50:23.399Z
Learning: In the Kleros-v2 React project, errors are handled by the wrapWithToast function, which displays error messages to users via toast notifications.

Learnt from: jaybuidl
PR: #1746
File: contracts/config/courts.v2.mainnet-neo.json:3-17
Timestamp: 2024-11-19T16:09:41.467Z
Learning: In contracts/config/courts.v2.mainnet-neo.json, the General Court (ID: 1) can have its parent ID set to itself ("parent": 1), as there is no parent court with ID 0 currently.

🧬 Code Graph Analysis (1)
web/src/pages/Resolver/Landing/index.tsx (1)
web/src/utils/extradataToTokenInfo.ts (1)
  • extraDataToTokenInfo (14-45)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (15)
  • GitHub Check: Redirect rules - kleros-v2-university
  • GitHub Check: Redirect rules - kleros-v2-testnet
  • GitHub Check: Redirect rules - kleros-v2-neo
  • GitHub Check: Redirect rules - kleros-v2-testnet
  • GitHub Check: Header rules - kleros-v2-testnet
  • GitHub Check: Header rules - kleros-v2-testnet
  • GitHub Check: Header rules - kleros-v2-neo
  • GitHub Check: Header rules - kleros-v2-university
  • GitHub Check: Pages changed - kleros-v2-testnet
  • GitHub Check: Pages changed - kleros-v2-testnet
  • GitHub Check: Pages changed - kleros-v2-neo
  • GitHub Check: Pages changed - kleros-v2-university
  • GitHub Check: contracts-testing
  • GitHub Check: Analyze (javascript)
  • GitHub Check: Mend Security Check
🔇 Additional comments (8)
web/src/hooks/queries/useRoundDetailsQuery.ts (1)

20-26: LGTM! Clean GraphQL query extension.

The nested query structure correctly fetches extraData from ClassicDispute fragments, which integrates well with the gated dispute kit functionality implemented in other components.

web/src/pages/Resolver/Landing/index.tsx (2)

72-77: LGTM! Proper memoization of gated token info extraction.

The useMemo hook correctly extracts and processes extraData from the round query results, with appropriate null checks and proper dependency management.


125-125: LGTM! Clean conditional integration of gated dispute kit data.

The disputeKitData is properly set with the type: "gated" field when gated token info is available, maintaining type safety and data structure consistency.

web/src/utils/extradataToTokenInfo.ts (3)

17-23: LGTM! Proper error handling for insufficient data.

The early return with default values when extraDataBytes.length < 160 provides good fallback behavior for malformed or incomplete data.


33-38: LGTM! Correct bit manipulation for token data extraction.

The bitwise operations properly extract the token gate address (lower 160 bits) and ERC1155 flag (bit 160) from the packed data, with appropriate masking and padding.


27-27: Ensure Buffer compatibility in browser builds

We’ve confirmed that:

  • buffer is declared in package.json,
  • Buffer.from(...) is used twice in web/src/utils/extradataToTokenInfo.ts (for packedBytes and tokenIdBytes).

Please verify that your bundler (Webpack, Vite, etc.) is configured to polyfill Node’s Buffer at runtime. If not, you can either:

  • Add a fallback for Buffer in your build config, or
  • Replace both Buffer usages with viem’s toHex (no polyfill needed):
import { toHex } from 'viem'

// Slot 4 (bytes 96–127)
const packedHex = toHex(packedBytes, { pad: 0 })  // returns '0x...?'
const packed = BigInt(packedHex)

// Slot 5 (bytes 128–159)
const tokenIdHex = toHex(tokenIdBytes, { pad: 0 })
const tokenId = BigInt(tokenIdHex)

Locations to update:

  • web/src/utils/extradataToTokenInfo.ts – line with Buffer.from(packedBytes).toString("hex")
  • web/src/utils/extradataToTokenInfo.ts – line with Buffer.from(tokenIdBytes).toString("hex")
web/src/pages/Resolver/Parameters/Court.tsx (2)

96-107: LGTM! Clean dispute kit options mapping with gated support.

The logic properly maps supported dispute kits to options with gated flags, using the DisputeKits enum for consistent identification of gated dispute kit types.


109-116: LGTM! Smart default selection logic.

The automatic selection of the single available dispute kit improves user experience while maintaining flexibility for multiple options.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 4d0c513 and 434e608.

📒 Files selected for processing (16)
  • subgraph/core/src/utils.ts (1 hunks)
  • subgraph/core/subgraph.template.yaml (1 hunks)
  • subgraph/core/subgraph.yaml (1 hunks)
  • web/src/pages/Cases/CaseDetails/Appeal/Classic/Fund.tsx (4 hunks)
  • web/src/pages/Cases/CaseDetails/Appeal/Classic/index.tsx (2 hunks)
  • web/src/pages/Cases/CaseDetails/Appeal/Shutter/Fund.tsx (3 hunks)
  • web/src/pages/Cases/CaseDetails/Appeal/Shutter/index.tsx (2 hunks)
  • web/src/pages/Cases/CaseDetails/Appeal/index.tsx (2 hunks)
  • web/src/pages/Cases/CaseDetails/Voting/Classic/Commit.tsx (4 hunks)
  • web/src/pages/Cases/CaseDetails/Voting/Classic/Reveal.tsx (4 hunks)
  • web/src/pages/Cases/CaseDetails/Voting/Classic/index.tsx (2 hunks)
  • web/src/pages/Cases/CaseDetails/Voting/Shutter/Commit.tsx (5 hunks)
  • web/src/pages/Cases/CaseDetails/Voting/Shutter/Reveal.tsx (1 hunks)
  • web/src/pages/Cases/CaseDetails/Voting/Shutter/index.tsx (2 hunks)
  • web/src/pages/Cases/CaseDetails/Voting/index.tsx (4 hunks)
  • web/src/utils/shutter.ts (3 hunks)
🧠 Learnings (13)
📓 Common learnings
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.
Learnt from: tractorss
PR: kleros/kleros-v2#1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass `dispute?.dispute?.arbitrated.id as 0x${string}` to `usePopulatedDisputeData` without additional null checks because the hook internally handles undefined parameters through its `isEnabled` flag and won't execute the query unless all required data is available.
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In `web/src/hooks/queries/usePopulatedDisputeData.ts`, the query and subsequent logic only execute when `disputeData.dispute?.arbitrableChainId` and `disputeData.dispute?.externalDisputeId` are defined, so `initialContext` properties based on these values are safe to use without additional null checks.
web/src/pages/Cases/CaseDetails/Appeal/Shutter/index.tsx (6)

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:69-69
Timestamp: 2024-10-29T10:13:04.524Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when the button is disabled, the associated logic won't be reached, and certain code paths may exist for TypeScript purposes.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:125-127
Timestamp: 2024-10-29T10:14:52.512Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when isEmailUpdateable is false, user?.emailUpdateableAt is always defined. Therefore, using the non-null assertion ! with user?.emailUpdateableAt! is acceptable because TypeScript may not infer its definiteness.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: kemuru
PR: #1764
File: web/src/components/ScrollTop.tsx:12-28
Timestamp: 2024-12-03T13:58:53.597Z
Learning: In the React component ScrollTop (web/src/components/ScrollTop.tsx), the effect hook is intentionally designed to execute only once, so dependencies are not added to the dependency array.

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

web/src/pages/Cases/CaseDetails/Appeal/Classic/index.tsx (7)

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:69-69
Timestamp: 2024-10-29T10:13:04.524Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when the button is disabled, the associated logic won't be reached, and certain code paths may exist for TypeScript purposes.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:125-127
Timestamp: 2024-10-29T10:14:52.512Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when isEmailUpdateable is false, user?.emailUpdateableAt is always defined. Therefore, using the non-null assertion ! with user?.emailUpdateableAt! is acceptable because TypeScript may not infer its definiteness.

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

web/src/pages/Cases/CaseDetails/Voting/Classic/index.tsx (6)

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:69-69
Timestamp: 2024-10-29T10:13:04.524Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when the button is disabled, the associated logic won't be reached, and certain code paths may exist for TypeScript purposes.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:98-103
Timestamp: 2024-10-09T10:23:39.325Z
Learning: In SelectArbitrable.tsx of the web-devtools project (React/TypeScript), direct DOM manipulation using child.click() is acceptable when considered reasonably safe.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

web/src/pages/Cases/CaseDetails/Voting/Classic/Commit.tsx (8)

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1739
File: web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx:22-26
Timestamp: 2024-11-07T10:48:16.774Z
Learning: In the Coherency component (web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx), totalResolvedVotes is always greater than or equal to totalCoherentVotes. When both are zero, 0/0 results in NaN, which is acceptable in this context.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:98-103
Timestamp: 2024-10-09T10:23:39.325Z
Learning: In SelectArbitrable.tsx of the web-devtools project (React/TypeScript), direct DOM manipulation using child.click() is acceptable when considered reasonably safe.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/sdk.ts:1-3
Timestamp: 2024-10-22T10:23:15.789Z
Learning: In kleros-sdk/src/sdk.ts, the PublicClient type is used and should not be flagged as unused.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

web/src/pages/Cases/CaseDetails/Voting/Shutter/Commit.tsx (12)

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1739
File: web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx:22-26
Timestamp: 2024-11-07T10:48:16.774Z
Learning: In the Coherency component (web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx), totalResolvedVotes is always greater than or equal to totalCoherentVotes. When both are zero, 0/0 results in NaN, which is acceptable in this context.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: Harman-singh-waraich
PR: #1755
File: kleros-app/src/lib/atlas/providers/AtlasProvider.tsx:130-144
Timestamp: 2024-11-21T05:47:08.973Z
Learning: In kleros-app/src/lib/atlas/providers/AtlasProvider.tsx, it is acceptable to pass queryClient as a positional parameter to the useQuery hook.

web/src/pages/Cases/CaseDetails/Voting/Shutter/index.tsx (12)

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:69-69
Timestamp: 2024-10-29T10:13:04.524Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when the button is disabled, the associated logic won't be reached, and certain code paths may exist for TypeScript purposes.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:125-127
Timestamp: 2024-10-29T10:14:52.512Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when isEmailUpdateable is false, user?.emailUpdateableAt is always defined. Therefore, using the non-null assertion ! with user?.emailUpdateableAt! is acceptable because TypeScript may not infer its definiteness.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:98-103
Timestamp: 2024-10-09T10:23:39.325Z
Learning: In SelectArbitrable.tsx of the web-devtools project (React/TypeScript), direct DOM manipulation using child.click() is acceptable when considered reasonably safe.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

Learnt from: kemuru
PR: #1764
File: web/src/components/ScrollTop.tsx:12-28
Timestamp: 2024-12-03T13:58:53.597Z
Learning: In the React component ScrollTop (web/src/components/ScrollTop.tsx), the effect hook is intentionally designed to execute only once, so dependencies are not added to the dependency array.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

subgraph/core/subgraph.yaml (3)

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/dataMappings/utils/actionTypes.ts:29-29
Timestamp: 2024-10-22T09:36:10.478Z
Learning: In kleros-sdk/src/dataMappings/utils/actionTypes.ts, the abi field in AbiEventMapping is intentionally typed as string because it is parsed later in the action functions.

subgraph/core/subgraph.template.yaml (3)

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/dataMappings/utils/actionTypes.ts:29-29
Timestamp: 2024-10-22T09:36:10.478Z
Learning: In kleros-sdk/src/dataMappings/utils/actionTypes.ts, the abi field in AbiEventMapping is intentionally typed as string because it is parsed later in the action functions.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/requests/gqlClient.ts:18-18
Timestamp: 2024-10-24T08:16:02.749Z
Learning: In this TypeScript project, when a file (such as kleros-sdk/src/requests/gqlClient.ts) exports only a single entity, it's acceptable to use default exports instead of named exports.

subgraph/core/src/utils.ts (6)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-10-08T16:23:56.290Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-07-25T11:58:27.058Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

web/src/pages/Cases/CaseDetails/Appeal/Shutter/Fund.tsx (11)

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:0-0
Timestamp: 2025-05-15T06:50:45.650Z
Learning: In the Kleros V2 codebase, it's acceptable to use ESLint disable comments for dependency arrays in useEffect hooks when including certain dependencies (like state that is being updated within the effect) would cause infinite loops.

Learnt from: Harman-singh-waraich
PR: #1759
File: web/src/pages/Cases/CaseDetails/Appeal/Classic/Fund.tsx:140-143
Timestamp: 2024-11-26T10:50:23.399Z
Learning: In the Kleros-v2 React project, errors are handled by the wrapWithToast function, which displays error messages to users via toast notifications.

web/src/pages/Cases/CaseDetails/Voting/Classic/Reveal.tsx (14)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:98-103
Timestamp: 2024-10-09T10:23:39.325Z
Learning: In SelectArbitrable.tsx of the web-devtools project (React/TypeScript), direct DOM manipulation using child.click() is acceptable when considered reasonably safe.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1739
File: web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx:22-26
Timestamp: 2024-11-07T10:48:16.774Z
Learning: In the Coherency component (web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx), totalResolvedVotes is always greater than or equal to totalCoherentVotes. When both are zero, 0/0 results in NaN, which is acceptable in this context.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/sdk.ts:1-3
Timestamp: 2024-10-22T10:23:15.789Z
Learning: In kleros-sdk/src/sdk.ts, the PublicClient type is used and should not be flagged as unused.

Learnt from: Harman-singh-waraich
PR: #1759
File: web/src/pages/Cases/CaseDetails/Appeal/Classic/Fund.tsx:140-143
Timestamp: 2024-11-26T10:50:23.399Z
Learning: In the Kleros-v2 React project, errors are handled by the wrapWithToast function, which displays error messages to users via toast notifications.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/requests/gqlClient.ts:5-16
Timestamp: 2024-10-24T08:18:13.218Z
Learning: In the getClient function in kleros-sdk/src/requests/gqlClient.ts, the consumer is responsible for validating the endpoint, and the Client handles invalid endpoints by throwing appropriate errors.

Learnt from: Harman-singh-waraich
PR: #1755
File: kleros-app/src/lib/atlas/providers/AtlasProvider.tsx:130-144
Timestamp: 2024-11-21T05:47:08.973Z
Learning: In kleros-app/src/lib/atlas/providers/AtlasProvider.tsx, it is acceptable to pass queryClient as a positional parameter to the useQuery hook.

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/sdk.ts:13-17
Timestamp: 2024-10-22T10:07:21.327Z
Learning: In the SDK, getPublicClient() handles the scenario where publicClient is undefined by throwing SdkNotConfiguredError, so additional error handling in functions that call getPublicClient() is not necessary.

web/src/pages/Cases/CaseDetails/Appeal/Classic/Fund.tsx (11)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:0-0
Timestamp: 2025-05-15T06:50:45.650Z
Learning: In the Kleros V2 codebase, it's acceptable to use ESLint disable comments for dependency arrays in useEffect hooks when including certain dependencies (like state that is being updated within the effect) would cause infinite loops.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:69-69
Timestamp: 2024-10-29T10:13:04.524Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when the button is disabled, the associated logic won't be reached, and certain code paths may exist for TypeScript purposes.

🧬 Code Graph Analysis (3)
web/src/pages/Cases/CaseDetails/Voting/Shutter/Commit.tsx (1)
web/src/utils/shutter.ts (1)
  • encrypt (151-175)
web/src/pages/Cases/CaseDetails/Appeal/Shutter/Fund.tsx (1)
web/src/hooks/useClassicAppealContext.tsx (1)
  • useSelectedOptionContext (119-119)
web/src/pages/Cases/CaseDetails/Voting/Classic/Reveal.tsx (1)
web/src/utils/wrapWithToast.ts (1)
  • catchShortMessage (49-51)
✅ Files skipped from review due to trivial changes (2)
  • web/src/utils/shutter.ts
  • web/src/pages/Cases/CaseDetails/Voting/Shutter/Reveal.tsx
🚧 Files skipped from review as they are similar to previous changes (2)
  • web/src/pages/Cases/CaseDetails/Voting/index.tsx
  • web/src/pages/Cases/CaseDetails/Appeal/index.tsx
🧰 Additional context used
🧠 Learnings (13)
📓 Common learnings
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.
Learnt from: tractorss
PR: kleros/kleros-v2#1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass `dispute?.dispute?.arbitrated.id as 0x${string}` to `usePopulatedDisputeData` without additional null checks because the hook internally handles undefined parameters through its `isEnabled` flag and won't execute the query unless all required data is available.
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In `web/src/hooks/queries/usePopulatedDisputeData.ts`, the query and subsequent logic only execute when `disputeData.dispute?.arbitrableChainId` and `disputeData.dispute?.externalDisputeId` are defined, so `initialContext` properties based on these values are safe to use without additional null checks.
web/src/pages/Cases/CaseDetails/Appeal/Shutter/index.tsx (6)

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:69-69
Timestamp: 2024-10-29T10:13:04.524Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when the button is disabled, the associated logic won't be reached, and certain code paths may exist for TypeScript purposes.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:125-127
Timestamp: 2024-10-29T10:14:52.512Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when isEmailUpdateable is false, user?.emailUpdateableAt is always defined. Therefore, using the non-null assertion ! with user?.emailUpdateableAt! is acceptable because TypeScript may not infer its definiteness.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: kemuru
PR: #1764
File: web/src/components/ScrollTop.tsx:12-28
Timestamp: 2024-12-03T13:58:53.597Z
Learning: In the React component ScrollTop (web/src/components/ScrollTop.tsx), the effect hook is intentionally designed to execute only once, so dependencies are not added to the dependency array.

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

web/src/pages/Cases/CaseDetails/Appeal/Classic/index.tsx (7)

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:69-69
Timestamp: 2024-10-29T10:13:04.524Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when the button is disabled, the associated logic won't be reached, and certain code paths may exist for TypeScript purposes.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:125-127
Timestamp: 2024-10-29T10:14:52.512Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when isEmailUpdateable is false, user?.emailUpdateableAt is always defined. Therefore, using the non-null assertion ! with user?.emailUpdateableAt! is acceptable because TypeScript may not infer its definiteness.

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

web/src/pages/Cases/CaseDetails/Voting/Classic/index.tsx (6)

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:69-69
Timestamp: 2024-10-29T10:13:04.524Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when the button is disabled, the associated logic won't be reached, and certain code paths may exist for TypeScript purposes.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:98-103
Timestamp: 2024-10-09T10:23:39.325Z
Learning: In SelectArbitrable.tsx of the web-devtools project (React/TypeScript), direct DOM manipulation using child.click() is acceptable when considered reasonably safe.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

web/src/pages/Cases/CaseDetails/Voting/Classic/Commit.tsx (8)

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1739
File: web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx:22-26
Timestamp: 2024-11-07T10:48:16.774Z
Learning: In the Coherency component (web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx), totalResolvedVotes is always greater than or equal to totalCoherentVotes. When both are zero, 0/0 results in NaN, which is acceptable in this context.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:98-103
Timestamp: 2024-10-09T10:23:39.325Z
Learning: In SelectArbitrable.tsx of the web-devtools project (React/TypeScript), direct DOM manipulation using child.click() is acceptable when considered reasonably safe.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/sdk.ts:1-3
Timestamp: 2024-10-22T10:23:15.789Z
Learning: In kleros-sdk/src/sdk.ts, the PublicClient type is used and should not be flagged as unused.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

web/src/pages/Cases/CaseDetails/Voting/Shutter/Commit.tsx (12)

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1739
File: web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx:22-26
Timestamp: 2024-11-07T10:48:16.774Z
Learning: In the Coherency component (web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx), totalResolvedVotes is always greater than or equal to totalCoherentVotes. When both are zero, 0/0 results in NaN, which is acceptable in this context.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: Harman-singh-waraich
PR: #1755
File: kleros-app/src/lib/atlas/providers/AtlasProvider.tsx:130-144
Timestamp: 2024-11-21T05:47:08.973Z
Learning: In kleros-app/src/lib/atlas/providers/AtlasProvider.tsx, it is acceptable to pass queryClient as a positional parameter to the useQuery hook.

web/src/pages/Cases/CaseDetails/Voting/Shutter/index.tsx (12)

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:69-69
Timestamp: 2024-10-29T10:13:04.524Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when the button is disabled, the associated logic won't be reached, and certain code paths may exist for TypeScript purposes.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:125-127
Timestamp: 2024-10-29T10:14:52.512Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when isEmailUpdateable is false, user?.emailUpdateableAt is always defined. Therefore, using the non-null assertion ! with user?.emailUpdateableAt! is acceptable because TypeScript may not infer its definiteness.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:98-103
Timestamp: 2024-10-09T10:23:39.325Z
Learning: In SelectArbitrable.tsx of the web-devtools project (React/TypeScript), direct DOM manipulation using child.click() is acceptable when considered reasonably safe.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

Learnt from: kemuru
PR: #1764
File: web/src/components/ScrollTop.tsx:12-28
Timestamp: 2024-12-03T13:58:53.597Z
Learning: In the React component ScrollTop (web/src/components/ScrollTop.tsx), the effect hook is intentionally designed to execute only once, so dependencies are not added to the dependency array.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

subgraph/core/subgraph.yaml (3)

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/dataMappings/utils/actionTypes.ts:29-29
Timestamp: 2024-10-22T09:36:10.478Z
Learning: In kleros-sdk/src/dataMappings/utils/actionTypes.ts, the abi field in AbiEventMapping is intentionally typed as string because it is parsed later in the action functions.

subgraph/core/subgraph.template.yaml (3)

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/dataMappings/utils/actionTypes.ts:29-29
Timestamp: 2024-10-22T09:36:10.478Z
Learning: In kleros-sdk/src/dataMappings/utils/actionTypes.ts, the abi field in AbiEventMapping is intentionally typed as string because it is parsed later in the action functions.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/requests/gqlClient.ts:18-18
Timestamp: 2024-10-24T08:16:02.749Z
Learning: In this TypeScript project, when a file (such as kleros-sdk/src/requests/gqlClient.ts) exports only a single entity, it's acceptable to use default exports instead of named exports.

subgraph/core/src/utils.ts (6)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-10-08T16:23:56.290Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-07-25T11:58:27.058Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

web/src/pages/Cases/CaseDetails/Appeal/Shutter/Fund.tsx (11)

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:0-0
Timestamp: 2025-05-15T06:50:45.650Z
Learning: In the Kleros V2 codebase, it's acceptable to use ESLint disable comments for dependency arrays in useEffect hooks when including certain dependencies (like state that is being updated within the effect) would cause infinite loops.

Learnt from: Harman-singh-waraich
PR: #1759
File: web/src/pages/Cases/CaseDetails/Appeal/Classic/Fund.tsx:140-143
Timestamp: 2024-11-26T10:50:23.399Z
Learning: In the Kleros-v2 React project, errors are handled by the wrapWithToast function, which displays error messages to users via toast notifications.

web/src/pages/Cases/CaseDetails/Voting/Classic/Reveal.tsx (14)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:98-103
Timestamp: 2024-10-09T10:23:39.325Z
Learning: In SelectArbitrable.tsx of the web-devtools project (React/TypeScript), direct DOM manipulation using child.click() is acceptable when considered reasonably safe.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1739
File: web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx:22-26
Timestamp: 2024-11-07T10:48:16.774Z
Learning: In the Coherency component (web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx), totalResolvedVotes is always greater than or equal to totalCoherentVotes. When both are zero, 0/0 results in NaN, which is acceptable in this context.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/sdk.ts:1-3
Timestamp: 2024-10-22T10:23:15.789Z
Learning: In kleros-sdk/src/sdk.ts, the PublicClient type is used and should not be flagged as unused.

Learnt from: Harman-singh-waraich
PR: #1759
File: web/src/pages/Cases/CaseDetails/Appeal/Classic/Fund.tsx:140-143
Timestamp: 2024-11-26T10:50:23.399Z
Learning: In the Kleros-v2 React project, errors are handled by the wrapWithToast function, which displays error messages to users via toast notifications.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/requests/gqlClient.ts:5-16
Timestamp: 2024-10-24T08:18:13.218Z
Learning: In the getClient function in kleros-sdk/src/requests/gqlClient.ts, the consumer is responsible for validating the endpoint, and the Client handles invalid endpoints by throwing appropriate errors.

Learnt from: Harman-singh-waraich
PR: #1755
File: kleros-app/src/lib/atlas/providers/AtlasProvider.tsx:130-144
Timestamp: 2024-11-21T05:47:08.973Z
Learning: In kleros-app/src/lib/atlas/providers/AtlasProvider.tsx, it is acceptable to pass queryClient as a positional parameter to the useQuery hook.

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/sdk.ts:13-17
Timestamp: 2024-10-22T10:07:21.327Z
Learning: In the SDK, getPublicClient() handles the scenario where publicClient is undefined by throwing SdkNotConfiguredError, so additional error handling in functions that call getPublicClient() is not necessary.

web/src/pages/Cases/CaseDetails/Appeal/Classic/Fund.tsx (11)

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Parameters/NotablePersons/PersonFields.tsx:64-0
Timestamp: 2025-05-09T13:39:15.086Z
Learning: In PersonFields.tsx, the useEffect hook for address validation intentionally uses an empty dependency array to run only once on component mount. This is specifically designed for the dispute duplication flow when aliasesArray is already populated with addresses that need initial validation.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:0-0
Timestamp: 2025-05-15T06:50:45.650Z
Learning: In the Kleros V2 codebase, it's acceptable to use ESLint disable comments for dependency arrays in useEffect hooks when including certain dependencies (like state that is being updated within the effect) would cause infinite loops.

Learnt from: Harman-singh-waraich
PR: #1729
File: web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx:69-69
Timestamp: 2024-10-29T10:13:04.524Z
Learning: In web/src/layout/Header/navbar/Menu/Settings/Notifications/FormContactDetails/index.tsx, when the button is disabled, the associated logic won't be reached, and certain code paths may exist for TypeScript purposes.

🧬 Code Graph Analysis (3)
web/src/pages/Cases/CaseDetails/Voting/Shutter/Commit.tsx (1)
web/src/utils/shutter.ts (1)
  • encrypt (151-175)
web/src/pages/Cases/CaseDetails/Appeal/Shutter/Fund.tsx (1)
web/src/hooks/useClassicAppealContext.tsx (1)
  • useSelectedOptionContext (119-119)
web/src/pages/Cases/CaseDetails/Voting/Classic/Reveal.tsx (1)
web/src/utils/wrapWithToast.ts (1)
  • catchShortMessage (49-51)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (15)
  • GitHub Check: Redirect rules - kleros-v2-testnet
  • GitHub Check: Redirect rules - kleros-v2-testnet
  • GitHub Check: Header rules - kleros-v2-testnet
  • GitHub Check: Header rules - kleros-v2-testnet
  • GitHub Check: Pages changed - kleros-v2-testnet
  • GitHub Check: Pages changed - kleros-v2-testnet
  • GitHub Check: Redirect rules - kleros-v2-university
  • GitHub Check: Header rules - kleros-v2-university
  • GitHub Check: Pages changed - kleros-v2-university
  • GitHub Check: Redirect rules - kleros-v2-testnet-devtools
  • GitHub Check: Header rules - kleros-v2-testnet-devtools
  • GitHub Check: Pages changed - kleros-v2-testnet-devtools
  • GitHub Check: Analyze (javascript)
  • GitHub Check: contracts-testing
  • GitHub Check: Mend Security Check
🔇 Additional comments (26)
web/src/pages/Cases/CaseDetails/Voting/Classic/index.tsx (2)

18-21: LGTM! Clean addition of gated dispute kit support.

The isGated prop is properly added to the interface and component signature, maintaining type safety and consistency with the broader gated dispute kit implementation.


31-34: Consistent prop propagation to child components.

The isGated flag is correctly passed down to both Commit and Reveal components, enabling them to conditionally handle gated dispute kit logic.

web/src/pages/Cases/CaseDetails/Appeal/Classic/index.tsx (2)

20-23: LGTM! Proper interface extension for gated dispute kits.

The isGated prop is correctly added to the interface and component signature, maintaining consistency with the gated dispute kit implementation pattern.


51-51: Clean prop propagation using object spread syntax.

The isGated prop is properly passed to the Fund component using object spread syntax, which is a clean approach for passing additional props.

subgraph/core/src/utils.ts (1)

7-7: DisputeKitID extraction offset verified as correct

The disputeKitID is always encoded as the third uint256 in extraData (bytes 64–96) for both Classic and Gated dispute kits—additional gating data is appended after byte 96. This fixed‐position slicing matches the ABI encoding in prepareArbitratorExtradata.ts and does not break existing functionality.

Key locations:

  • subgraph/core/src/utils.ts – extractDisputeKitIDFromExtraData uses extraData.subarray(64, 96)
  • web/src/utils/prepareArbitratorExtradata.ts – ABI encodes [subcourtID, noOfVotes, disputeKit] into the first three 32-byte slots
  • web/src/utils/extradataToTokenInfo.ts – gating fields begin at slot 4 (bytes 96–128), so disputeKitID extraction remains unaffected
web/src/pages/Cases/CaseDetails/Appeal/Shutter/index.tsx (2)

19-22: LGTM! Consistent gated dispute kit support addition.

The isGated prop is properly added following the same pattern as other components, maintaining consistency across the appeal component family.


50-50: Proper prop propagation to Fund component.

The isGated prop is correctly passed to the Fund component using object spread syntax, enabling gated dispute kit funding logic.

web/src/pages/Cases/CaseDetails/Voting/Shutter/index.tsx (2)

19-22: LGTM! Proper interface extension for Shutter voting.

The isGated prop is correctly added to the interface and component signature, maintaining consistency with the voting component family.


30-30: Appropriate prop propagation to ShutterCommit.

The isGated prop is passed to the ShutterCommit component during the commit period, which is the appropriate place for gated dispute kit logic in the Shutter voting flow.

web/src/pages/Cases/CaseDetails/Voting/Classic/Commit.tsx (3)

9-9: LGTM: Import for gated dispute kit support added correctly.

The addition of simulateDisputeKitGatedCastCommit import enables support for gated dispute kits alongside the existing classic functionality.


28-28: LGTM: Props interface and component signature updated correctly.

The isGated boolean prop is properly typed in the interface and correctly destructured in the component signature to support conditional dispute kit selection.

Also applies to: 31-31


63-67: LGTM: Conditional dispute kit selection implemented correctly.

The conditional logic properly selects between gated and classic simulation functions based on the isGated flag, and the dependency is correctly added to the useCallback array to ensure proper re-evaluation when the gating status changes.

Also applies to: 87-87

web/src/pages/Cases/CaseDetails/Voting/Shutter/Commit.tsx (2)

9-12: LGTM: Gated dispute kit support added correctly.

The component properly supports both gated and classic Shutter dispute kits through conditional simulation function selection. The interface, imports, and component signature are all correctly updated.

Also applies to: 36-36, 60-68


109-117: LGTM: Conditional simulation function selection implemented correctly.

The logic properly switches between gated and classic Shutter simulation functions based on the isGated flag, and the dependency is correctly included in the useCallback array.

Also applies to: 140-140

subgraph/core/subgraph.yaml (2)

164-201: LGTM: DisputeKitGated data source configured correctly.

The data source configuration follows the established pattern with appropriate contract address, start block, event handlers, and ABI references. The reuse of existing event handlers and entities is appropriate since gated dispute kits share the same event structure as classic ones.


202-239: LGTM: DisputeKitGatedShutter data source configured correctly.

The configuration is consistent with other dispute kit data sources and properly includes all necessary ABIs, event handlers, and entities for indexing gated Shutter dispute kit events.

subgraph/core/subgraph.template.yaml (2)

163-200: LGTM: DisputeKitGated template data source added correctly.

The template follows the established pattern with appropriate placeholders for network-specific deployment values. The configuration is consistent with existing dispute kit data sources.


201-238: LGTM: DisputeKitGatedShutter template data source added correctly.

The template configuration is properly structured and will generate correct subgraph manifests for gated Shutter dispute kits across different network deployments.

web/src/pages/Cases/CaseDetails/Voting/Classic/Reveal.tsx (3)

13-13: LGTM: Interface and imports updated correctly for gated dispute kit support.

The component properly supports gated dispute kits with the addition of the simulation function import, optional arbitrable prop, and required isGated boolean prop. The component signature is correctly updated.

Also applies to: 45-45, 50-50, 53-53


75-75: LGTM: Defensive programming for potentially undefined answers.

The nullish coalescing operator ensures getSaltAndChoice receives an empty array instead of undefined, preventing potential runtime errors when dispute details are not yet available.


79-84: LGTM: Conditional simulation function selection implemented correctly.

The logic properly selects between gated and classic vote reveal simulation functions based on the isGated flag. The dependency is correctly added to the useCallback array to ensure proper re-evaluation.

Also applies to: 105-105

web/src/pages/Cases/CaseDetails/Appeal/Shutter/Fund.tsx (2)

68-101: Well-structured conditional logic for gated dispute kit support.

The implementation correctly:

  • Adds mutually exclusive enabling conditions for classic vs gated simulations
  • Uses consistent argument structure for both simulation hooks
  • Returns the appropriate simulation data and write function based on the isGated flag

However, verify that line 91 should use useWriteDisputeKitShutterFundAppeal for the gated flow rather than a gated-specific write hook.


103-127: Clean integration of gated flag into component interface.

The interface and component correctly:

  • Add the isGated boolean prop to the interface
  • Update the component signature to receive the prop
  • Pass the isGated parameter to the useFundAppeal hook
web/src/pages/Cases/CaseDetails/Appeal/Classic/Fund.tsx (3)

11-16: Complete import structure for gated dispute kit support.

The imports correctly include both classic and gated simulation/write hooks, providing proper separation of functionality for each dispute kit type.


70-107: Excellent implementation of dual dispute kit support.

The useFundAppeal hook correctly implements support for both classic and gated dispute kits with:

  • Proper separation of simulation and write hooks for each type
  • Mutually exclusive enabling conditions
  • Consistent argument structure and return interface
  • Dedicated gated write hook usage (unlike the Shutter version)

109-141: Consistent interface integration for gated support.

The interface and component changes properly integrate the isGated flag with correct typing and parameter passing to the hook.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
web/src/pages/Cases/CaseDetails/MaintenanceButtons/DrawButton.tsx (1)

59-59: Good performance optimization with memoization.

The memoized drawIterations calculation prevents unnecessary recalculations and includes a sensible upper bound. Consider adding a comment to explain the magic numbers (4 for the multiplier and 100 for the maximum).

+ // Calculate draw iterations: numberOfVotes * 4, capped at 100 for performance
  const drawIterations = useMemo(() => Math.min(100, Number(numberOfVotes ?? 0) * 4), [numberOfVotes]);
📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 168740b and 6eb5bc6.

📒 Files selected for processing (1)
  • web/src/pages/Cases/CaseDetails/MaintenanceButtons/DrawButton.tsx (2 hunks)
🧠 Learnings (2)
📓 Common learnings
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.
Learnt from: tractorss
PR: kleros/kleros-v2#1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass `dispute?.dispute?.arbitrated.id as 0x${string}` to `usePopulatedDisputeData` without additional null checks because the hook internally handles undefined parameters through its `isEnabled` flag and won't execute the query unless all required data is available.
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In `web/src/hooks/queries/usePopulatedDisputeData.ts`, the query and subsequent logic only execute when `disputeData.dispute?.arbitrableChainId` and `disputeData.dispute?.externalDisputeId` are defined, so `initialContext` properties based on these values are safe to use without additional null checks.
web/src/pages/Cases/CaseDetails/MaintenanceButtons/DrawButton.tsx (9)

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: Harman-singh-waraich
PR: #1739
File: web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx:22-26
Timestamp: 2024-11-07T10:48:16.774Z
Learning: In the Coherency component (web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx), totalResolvedVotes is always greater than or equal to totalCoherentVotes. When both are zero, 0/0 results in NaN, which is acceptable in this context.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/RulingModes.tsx:233-233
Timestamp: 2024-10-09T10:19:11.816Z
Learning: In 'web-devtools/src/app/(main)/ruler/RulingModes.tsx', the label 'Random Preset' is correct and should not be changed to 'Automatic Random'.

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:98-103
Timestamp: 2024-10-09T10:23:39.325Z
Learning: In SelectArbitrable.tsx of the web-devtools project (React/TypeScript), direct DOM manipulation using child.click() is acceptable when considered reasonably safe.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.
Learnt from: tractorss
PR: kleros/kleros-v2#1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass `dispute?.dispute?.arbitrated.id as 0x${string}` to `usePopulatedDisputeData` without additional null checks because the hook internally handles undefined parameters through its `isEnabled` flag and won't execute the query unless all required data is available.
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In `web/src/hooks/queries/usePopulatedDisputeData.ts`, the query and subsequent logic only execute when `disputeData.dispute?.arbitrableChainId` and `disputeData.dispute?.externalDisputeId` are defined, so `initialContext` properties based on these values are safe to use without additional null checks.
web/src/pages/Cases/CaseDetails/MaintenanceButtons/DrawButton.tsx (9)

Learnt from: Harman-singh-waraich
PR: #1794
File: web/src/hooks/useStarredCases.tsx:13-18
Timestamp: 2024-12-16T17:17:32.359Z
Learning: In useStarredCases.tsx, when handling the starredCases Map from local storage, direct mutation is acceptable to prevent the overhead of copying, provided it doesn't adversely affect React's render cycle.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: Harman-singh-waraich
PR: #1739
File: web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx:22-26
Timestamp: 2024-11-07T10:48:16.774Z
Learning: In the Coherency component (web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx), totalResolvedVotes is always greater than or equal to totalCoherentVotes. When both are zero, 0/0 results in NaN, which is acceptable in this context.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/RulingModes.tsx:233-233
Timestamp: 2024-10-09T10:19:11.816Z
Learning: In 'web-devtools/src/app/(main)/ruler/RulingModes.tsx', the label 'Random Preset' is correct and should not be changed to 'Automatic Random'.

Learnt from: Harman-singh-waraich
PR: #1775
File: web/src/pages/Courts/CourtDetails/StakePanel/StakeWithdrawButton.tsx:0-0
Timestamp: 2024-12-09T12:36:59.441Z
Learning: In the StakeWithdrawButton component, the transaction flow logic is tightly linked to component updates, so extracting it into a custom hook does not provide significant benefits.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:98-103
Timestamp: 2024-10-09T10:23:39.325Z
Learning: In SelectArbitrable.tsx of the web-devtools project (React/TypeScript), direct DOM manipulation using child.click() is acceptable when considered reasonably safe.

Learnt from: nikhilverma360
PR: #1632
File: web/src/components/DisputeView/DisputeInfo/DisputeInfoList.tsx:37-42
Timestamp: 2024-06-27T10:11:54.861Z
Learning: useMemo is used in DisputeInfoList to optimize the rendering of FieldItems based on changes in fieldItems, ensuring that the mapping and truncation operation are only performed when necessary.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (10)
  • GitHub Check: Redirect rules - kleros-v2-neo
  • GitHub Check: Header rules - kleros-v2-neo
  • GitHub Check: Pages changed - kleros-v2-neo
  • GitHub Check: Redirect rules - kleros-v2-testnet-devtools
  • GitHub Check: Redirect rules - kleros-v2-testnet
  • GitHub Check: Header rules - kleros-v2-testnet-devtools
  • GitHub Check: Header rules - kleros-v2-testnet
  • GitHub Check: Pages changed - kleros-v2-testnet
  • GitHub Check: Pages changed - kleros-v2-testnet-devtools
  • GitHub Check: contracts-testing
🔇 Additional comments (1)
web/src/pages/Cases/CaseDetails/MaintenanceButtons/DrawButton.tsx (1)

76-76: I’ve confirmed in DrawButton.tsx that for “university” cases you pass the user‐entered drawJuror nonce (an address‐encoded BigInt) and for all other dispute kits you compute drawIterations as min(100, votes × 4) to ensure the simulated draw covers all potential jurors. Since every kit’s draw(_disputeID, _nonce) signature accepts a flat iteration count, this change remains compatible with both classic and shutter (and future) dispute kits without additional per‐kit branching. No code changes are required.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between fa2520c and c6b51c1.

📒 Files selected for processing (3)
  • web/src/pages/Cases/CaseDetails/Appeal/Shutter/Fund.tsx (3 hunks)
  • web/src/pages/Cases/CaseDetails/Voting/Shutter/Commit.tsx (5 hunks)
  • web/src/pages/Resolver/Parameters/Jurors.tsx (2 hunks)
🧠 Learnings (2)
📓 Common learnings
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.
Learnt from: tractorss
PR: kleros/kleros-v2#1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass `dispute?.dispute?.arbitrated.id as 0x${string}` to `usePopulatedDisputeData` without additional null checks because the hook internally handles undefined parameters through its `isEnabled` flag and won't execute the query unless all required data is available.
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In `web/src/hooks/queries/usePopulatedDisputeData.ts`, the query and subsequent logic only execute when `disputeData.dispute?.arbitrableChainId` and `disputeData.dispute?.externalDisputeId` are defined, so `initialContext` properties based on these values are safe to use without additional null checks.
web/src/pages/Resolver/Parameters/Jurors.tsx (13)

Learnt from: Harman-singh-waraich
PR: #1739
File: web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx:22-26
Timestamp: 2024-11-07T10:48:16.774Z
Learning: In the Coherency component (web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx), totalResolvedVotes is always greater than or equal to totalCoherentVotes. When both are zero, 0/0 results in NaN, which is acceptable in this context.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: Harman-singh-waraich
PR: #1687
File: web/src/context/AtlasProvider.tsx:225-244
Timestamp: 2024-10-15T16:18:32.543Z
Learning: In web/src/context/AtlasProvider.tsx, the atlasUri variable comes from environment variables and does not change, so it does not need to be included in dependency arrays.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/sdk.ts:1-3
Timestamp: 2024-10-22T10:23:15.789Z
Learning: In kleros-sdk/src/sdk.ts, the PublicClient type is used and should not be flagged as unused.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/requests/gqlClient.ts:18-18
Timestamp: 2024-10-24T08:16:02.749Z
Learning: In this TypeScript project, when a file (such as kleros-sdk/src/requests/gqlClient.ts) exports only a single entity, it's acceptable to use default exports instead of named exports.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-10-08T16:23:56.290Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-07-25T11:58:27.058Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.

🧬 Code Graph Analysis (1)
web/src/pages/Resolver/Parameters/Jurors.tsx (1)
web/src/utils/prepareArbitratorExtradata.ts (1)
  • prepareArbitratorExtradata (48-68)
🚧 Files skipped from review as they are similar to previous changes (2)
  • web/src/pages/Cases/CaseDetails/Voting/Shutter/Commit.tsx
  • web/src/pages/Cases/CaseDetails/Appeal/Shutter/Fund.tsx
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.
Learnt from: tractorss
PR: kleros/kleros-v2#1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass `dispute?.dispute?.arbitrated.id as 0x${string}` to `usePopulatedDisputeData` without additional null checks because the hook internally handles undefined parameters through its `isEnabled` flag and won't execute the query unless all required data is available.
Learnt from: Harman-singh-waraich
PR: kleros/kleros-v2#1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In `web/src/hooks/queries/usePopulatedDisputeData.ts`, the query and subsequent logic only execute when `disputeData.dispute?.arbitrableChainId` and `disputeData.dispute?.externalDisputeId` are defined, so `initialContext` properties based on these values are safe to use without additional null checks.
web/src/pages/Resolver/Parameters/Jurors.tsx (13)

Learnt from: Harman-singh-waraich
PR: #1739
File: web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx:22-26
Timestamp: 2024-11-07T10:48:16.774Z
Learning: In the Coherency component (web/src/pages/Home/TopJurors/JurorCard/Coherency.tsx), totalResolvedVotes is always greater than or equal to totalCoherentVotes. When both are zero, 0/0 results in NaN, which is acceptable in this context.

Learnt from: Harman-singh-waraich
PR: #1716
File: web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx:29-42
Timestamp: 2024-10-28T05:55:12.728Z
Learning: In the CustomContextInputs component located at web-devtools/src/app/(main)/dispute-template/CustomContextInputs.tsx, the DisputeRequestParams array is used to exclude certain variables from the custom input since they are already provided in a preceding component. Therefore, converting it to a type is unnecessary.

Learnt from: kemuru
PR: #1774
File: web/src/components/CasesDisplay/index.tsx:61-61
Timestamp: 2024-12-06T13:04:50.495Z
Learning: In web/src/components/CasesDisplay/index.tsx, the variables numberDisputes and numberClosedDisputes can sometimes be NaN, and should default to 0 using logical OR (||) to prevent display issues in the StatsAndFilters component.

Learnt from: Harman-singh-waraich
PR: #1703
File: web/src/hooks/queries/usePopulatedDisputeData.ts:58-61
Timestamp: 2024-10-14T13:58:25.708Z
Learning: In web/src/hooks/queries/usePopulatedDisputeData.ts, the query and subsequent logic only execute when disputeData.dispute?.arbitrableChainId and disputeData.dispute?.externalDisputeId are defined, so initialContext properties based on these values are safe to use without additional null checks.

Learnt from: Harman-singh-waraich
PR: #1687
File: web/src/context/AtlasProvider.tsx:225-244
Timestamp: 2024-10-15T16:18:32.543Z
Learning: In web/src/context/AtlasProvider.tsx, the atlasUri variable comes from environment variables and does not change, so it does not need to be included in dependency arrays.

Learnt from: jaybuidl
PR: #1582
File: web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx:88-90
Timestamp: 2024-10-09T10:22:41.474Z
Learning: Next.js recommends using the useEffect hook to set isClient and using suppressHydrationWarning as a workaround for handling hydration inconsistencies, especially when dealing with data like knownArbitrables that may differ between server-side and client-side rendering. This approach is acceptable in TypeScript/React applications, such as in web-devtools/src/app/(main)/ruler/SelectArbitrable.tsx.

Learnt from: Harman-singh-waraich
PR: #1744
File: web/src/hooks/useGenesisBlock.ts:9-31
Timestamp: 2024-11-19T05:31:48.701Z
Learning: In useGenesisBlock.ts, within the useEffect hook, the conditions (isKlerosUniversity, isKlerosNeo, isTestnetDeployment) are mutually exclusive, so multiple imports won't execute simultaneously, and race conditions are not a concern.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/sdk.ts:1-3
Timestamp: 2024-10-22T10:23:15.789Z
Learning: In kleros-sdk/src/sdk.ts, the PublicClient type is used and should not be flagged as unused.

Learnt from: tractorss
PR: #1982
File: web/src/pages/Resolver/Landing/index.tsx:62-62
Timestamp: 2025-05-15T06:50:40.859Z
Learning: In the Landing component, it's safe to pass dispute?.dispute?.arbitrated.id as 0x${string} to usePopulatedDisputeData without additional null checks because the hook internally handles undefined parameters through its isEnabled flag and won't execute the query unless all required data is available.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/requests/gqlClient.ts:18-18
Timestamp: 2024-10-24T08:16:02.749Z
Learning: In this TypeScript project, when a file (such as kleros-sdk/src/requests/gqlClient.ts) exports only a single entity, it's acceptable to use default exports instead of named exports.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-10-08T16:23:56.290Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: jaybuidl
PR: #1647
File: web/src/context/NewDisputeContext.tsx:0-0
Timestamp: 2024-07-25T11:58:27.058Z
Learning: The delete operator is used in the constructDisputeTemplate function in web/src/context/NewDisputeContext.tsx to remove the policyURI field if it is an empty string.

Learnt from: Harman-singh-waraich
PR: #1703
File: kleros-sdk/src/utils/getDispute.ts:38-40
Timestamp: 2024-10-21T10:32:16.970Z
Learning: The variables 'arbitrableChainID' and 'externalDisputeID' are required by the context to have uppercase 'ID', so they should remain unchanged even if the corresponding source properties use 'Id'.

🧬 Code Graph Analysis (1)
web/src/pages/Resolver/Parameters/Jurors.tsx (1)
web/src/utils/prepareArbitratorExtradata.ts (1)
  • prepareArbitratorExtradata (48-68)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (14)
  • GitHub Check: Redirect rules - kleros-v2-university
  • GitHub Check: Header rules - kleros-v2-university
  • GitHub Check: Redirect rules - kleros-v2-testnet-devtools
  • GitHub Check: Redirect rules - kleros-v2-testnet
  • GitHub Check: Pages changed - kleros-v2-university
  • GitHub Check: Redirect rules - kleros-v2-testnet
  • GitHub Check: Header rules - kleros-v2-testnet-devtools
  • GitHub Check: Header rules - kleros-v2-testnet
  • GitHub Check: Header rules - kleros-v2-testnet
  • GitHub Check: Pages changed - kleros-v2-testnet-devtools
  • GitHub Check: Pages changed - kleros-v2-testnet
  • GitHub Check: Pages changed - kleros-v2-testnet
  • GitHub Check: Analyze (javascript)
  • GitHub Check: contracts-testing
🔇 Additional comments (1)
web/src/pages/Resolver/Parameters/Jurors.tsx (1)

9-9: LGTM: Import reordering

The import statement reordering improves code organization without affecting functionality.

Also applies to: 17-17

@@ -58,7 +58,7 @@ const Jurors: React.FC = () => {
enabled: !isUndefined(disputeData.numberOfJurors) && !Number.isNaN(disputeData.numberOfJurors),
refetchInterval: REFETCH_INTERVAL,
},
args: [prepareArbitratorExtradata(disputeData.courtId ?? "", disputeData.numberOfJurors ?? "")],
args: [prepareArbitratorExtradata(disputeData.courtId ?? "", disputeData.numberOfJurors ?? "0")],
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Fix type mismatch: Use numeric 0 instead of string "0"

The prepareArbitratorExtradata function expects noOfVotes as a number, but the fallback value "0" is a string. This could cause type errors or unexpected behavior in the ABI encoding.

-    args: [prepareArbitratorExtradata(disputeData.courtId ?? "", disputeData.numberOfJurors ?? "0")],
+    args: [prepareArbitratorExtradata(disputeData.courtId ?? "", disputeData.numberOfJurors ?? 0)],
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
args: [prepareArbitratorExtradata(disputeData.courtId ?? "", disputeData.numberOfJurors ?? "0")],
args: [prepareArbitratorExtradata(disputeData.courtId ?? "", disputeData.numberOfJurors ?? 0)],
🤖 Prompt for AI Agents
In web/src/pages/Resolver/Parameters/Jurors.tsx at line 61, the fallback value
for numberOfJurors is incorrectly provided as a string "0" instead of a numeric
0. Change the fallback from the string "0" to the number 0 to match the expected
number type for the prepareArbitratorExtradata function and avoid type mismatch
issues.

Copy link

@jaybuidl jaybuidl marked this pull request as ready for review July 28, 2025 15:54
@jaybuidl jaybuidl requested a review from a team as a code owner July 28, 2025 15:54
@jaybuidl jaybuidl merged commit bff4f10 into dev Jul 28, 2025
17 of 25 checks passed
@jaybuidl jaybuidl deleted the web/dk-support-improvement branch July 28, 2025 15:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants