Skip to content

Conversation

@MarvelFisher
Copy link
Collaborator

@MarvelFisher MarvelFisher commented Aug 6, 2025

Summary by CodeRabbit

  • New Features

    • Added and updated documentation pages, including topics such as "Bridge," "Account Abstraction," "Run a validator with docker," "Deploy Contracts on Morph," "Upgrade node running from docker," "Artificial Intelligence," "Optimistic zkEVM," "Prune State," "Block Explorer," "FAQs," and "Roadmap."
  • Bug Fixes

    • Corrected and standardized social media and contact links across documentation and footer.
  • Chores

    • Updated internal build and configuration scripts for environment-specific handling.
    • Updated asset references and improved static site metadata.
  • Refactor

    • Reorganized and refreshed documentation modules for improved structure and maintainability.
  • Style

    • Updated branding elements, including favicons and social media URLs.
  • Revert

    • Restored or replaced several documentation and static content pages to previous or improved versions.

@MarvelFisher MarvelFisher requested a review from a team as a code owner August 6, 2025 19:42
@MarvelFisher MarvelFisher requested a review from twcctop August 6, 2025 19:42
@coderabbitai
Copy link

coderabbitai bot commented Aug 6, 2025

Walkthrough

This update primarily involves a large-scale regeneration and restructuring of documentation assets for a Morph blockchain project. Numerous documentation pages, React-based content modules, and static assets were removed and replaced with new or updated versions. Several social and contact links were corrected, and build system targets were refined for environment-specific deployment. The changes also include significant rebundling of JavaScript assets, updates to module IDs, and the introduction or removal of various documentation content and UI components.

Changes

Cohort / File(s) Change Summary
Makefile and Build Targets
MakefileEks.mk
Added environment-specific build/start/healthcheck targets for a test environment; refined production build/start to use specific scripts and nginx configs.
Static Content and Social Links
README.md, build/404.html
Updated social/contact links (Twitter→X, Telegram, Discord), fixed typos, updated favicon, Algolia config, and copyright year.
Core Documentation Asset Rebundling
build/assets/js/*.js (majority of files)
Replaced or updated most documentation JS chunks: module IDs, import paths, and asset hashes changed; numerous content modules removed and replaced with new versions; context and component utilities updated; no semantic changes for most, but some textual and link corrections.
Documentation Page Additions
build/assets/js/1f2dc99a.676c8cca.js, build/assets/js/4f7a49ab.68e103c7.js, build/assets/js/3250a443.4576d738.js, build/assets/js/5d313dc3.562fab67.js, build/assets/js/6a8ddb26.a8d54b20.js, build/assets/js/46618904.0e02e9d8.js, build/assets/js/578ca001.54e90cd3.js, build/assets/js/60479fa4.69d66973.js, build/assets/js/6f5ac92b.3d93dd47.js, build/assets/js/405a8a84.afa08ab0.js, build/assets/js/39f485e7.e4d15ea7.js, build/assets/js/25bec567.8e13158b.js, build/assets/js/1a1587e1.d312ff53.js, build/assets/js/2f19d5d4.fa2f851a.js, build/assets/js/5081.08af33ec.js, build/assets/js/5e95c892.9856b0c7.js
Added or regenerated documentation pages and React components for various topics (AI, validator setup, node upgrade, pruning, SDK types/functions, bridge, introduction, FAQ, etc.).
Documentation Page Removals
build/assets/js/1965.a43f3b33.js, build/assets/js/1a1587e1.a03807dd.js, build/assets/js/25bec567.812fc80e.js, build/assets/js/2ef0e7db.f26526ea.js, build/assets/js/2f19d5d4.440e58b9.js, build/assets/js/3d947c8b.f16157a9.js, build/assets/js/405a8a84.e1de3e69.js, build/assets/js/46618904.aa956f14.js, build/assets/js/4cbe5783.9ebc7cfc.js, build/assets/js/5c242b2e.9bf0dbba.js, build/assets/js/6a8ddb26.bb20b217.js, build/assets/js/6f5ac92b.7c64324c.js, build/assets/js/60479fa4.b4988a59.js, build/assets/js/578ca001.4379dd90.js, build/assets/js/3250a443.c7e60e11.js, build/assets/js/39f485e7.b6b5a1c7.js, build/assets/js/4cbe5783.9ebc7cfc.js, ...
Removed numerous documentation content modules and their associated React component exports, reflecting content restructuring or replacement.
Algolia Search Asset Update
build/assets/js/1a4e3797.20b16744.js, build/assets/js/1a4e3797.dc00afb6.js, build/assets/js/1a4e3797.20b16744.js.LICENSE.txt, build/assets/js/1a4e3797.dc00afb6.js.LICENSE.txt
Algolia search integration code and license updated to a new version; old bundle and license removed, new bundle and license added.
Documentation UI Component Suite
build/assets/js/17896441.59246166.js, build/assets/js/17896441.26f2d090.js
Removed an entire React documentation UI suite and replaced with a new version; includes context providers, navigation, banners, TOC, code blocks, admonitions, breadcrumbs, and more.
Minor Asset/Module Updates
build/assets/js/31699625.8d77373b.js, build/assets/js/5e95c892.f83fa08e.js
Removed minor or redundant module registration assets.
Module Rebundling/Refactoring
Most other build/assets/js/*.js
Updated module IDs, import paths, and context utilities; no semantic changes to content or exports.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant DocsSite
    participant ReactComponents
    participant Search (Algolia)
    User->>DocsSite: Requests documentation page
    DocsSite->>ReactComponents: Loads page module (content, metadata)
    ReactComponents-->>DocsSite: Renders content (with TOC, banners, code blocks, etc.)
    User->>Search: Uses search bar
    Search->>Algolia: Sends search query
    Algolia-->>Search: Returns results
    Search-->>User: Displays search results
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~40 minutes

Poem

🐇✨
In burrows deep, I hop and write,
Docs renewed in morning light.
Out with the old, in with the new,
Links corrected, code blocks too!
Search now faster, pages bright—
A garden of docs, all fresh and right.
Hippity-hop, what a delight!

Warning

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

🔧 ast-grep (0.38.6)
build/assets/js/1a4e3797.dc00afb6.js

Note

🔌 MCP (Model Context Protocol) integration is now available in Early Access!

Pro users can now connect to remote MCP servers under the Integrations page to get reviews and chat conversations that understand additional development context.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/payandrails

🪧 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.
  • 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.

Support

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

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 generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

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

CodeRabbit Configuration File (.coderabbit.yaml)

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

Documentation and Community

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

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🔭 Outside diff range comments (2)
sidebars.js (1)

48-90: Broken sidebar syntax: partially-commented category leaves orphaned items and missing comma

Lines 48–50 comment out the opening of the “Introductory Concepts” category, and lines 89–90 comment out its closing, but the inner doc items (52-88) remain active. This leaves:

  1. A comma-less transition between the preceding element (Line 47 }) and the first orphan object (Line 52 {), causing a real JS syntax error.
  2. Dozens of top-level entries you probably did not intend to expose.

Fix either by fully commenting the block or by restoring the category wrapper and adding a comma after Line 47.

47   },
-// {
-//   type:'category',
-//   label:'Introductory Concepts',
-//   items:[
+{
+  type:'category',
+  label:'Introductory Concepts',
+  items:[
@@
-//   ]
-// },
+  ]
+},

—or—

// 52-88: prepend `//` to comment out each inner line

Without this fix Docusaurus will fail to compile.

docs/about-morph/0-user-navigation-page.md (1)

53-55: Inconsistent icon path breaks the build.

./img/cards/faucet.svg differs from the leading-slash paths (/img/cards/...). Relative paths resolve differently once the file is nested under docs/. Use the same absolute path to prevent broken images on production.

-  <Card 
-    href="/docs/quick-start/wallet-setup"
-    icon="./img/cards/faucet.svg"
+  <Card 
+    href="/docs/quick-start/wallet-setup"
+    icon="/img/cards/faucet.svg"
🧹 Nitpick comments (24)
docs/quick-start/2-wallet-setup.md (3)

23-25: Spelling: “OKX Walllet” has a triple-L

Heading at Line 23 reads “OKX Walllet”. Drop one “l” to keep docs polished.


32-39: Heading punctuation flagged by markdownlint

Lines 37–38 end with a colon inside the heading “Using Ethereum Holesky Testnet”. MD026 warns on trailing punctuation; remove the colon for lint-clean merges.


59-59: Bare Chainlist URL triggers MD034

Convert the raw link to Markdown to satisfy markdownlint:

-You can also visit [chainlist](https://chainlist.org/?chain=11155111&search=morph&testnets=true) to add Morph to your wallet.
+You can also visit <https://chainlist.org/?chain=11155111&search=morph&testnets=true> to add Morph to your wallet.
docs/quick-start/3-faucet.md (2)

14-18: Heading has trailing punctuation (“:” )

Line 15 “## Our Faucet is Live” is clean, but MD026 flags similar cases elsewhere (e.g., Line 57 “Currently, each Discord user…”)—scan headings for stray colons/periods before merging.


45-48: Minor grammar

Sentence starts with “Using the /morph_eth command…”. Prepend “Use” for clarity:

-Using the */morph_eth* command followed by your wallet address to receive 0.01 Morph Holesky ETH.
+Use the */morph_eth* command followed by your wallet address to receive 0.01 Morph Holesky ETH.
docs/build-on-morph/0-developer-navigation-page.md (1)

108-111: Accessibility: stylised “𝕏” may hinder screen readers

Consider using plain text “X (Twitter)” or “Twitter (𝕏)” to keep the link discoverable by assistive technology and search.

docs/about-morph/5-morphs-vision-and-mission.md (2)

8-8: Prefer “on-chain” over “onchain”.

Industry writing consistently hyphenates the term (“on-chain consumer finance”). Small polish that improves readability and aligns with other Morph docs.


29-35: Keep bullet-point punctuation consistent.

The bullets under “Our Commitments” end without periods, whereas earlier lists do. Pick one style (with / without terminal punctuation) and use it throughout to avoid visual noise.

docs/about-morph/0-user-navigation-page.md (2)

10-10: Missing alt-text on decorative image.

![userpage](../../assets/docs/about/userpage1.jpeg) should include descriptive alt text for accessibility and SEO.

-![userpage](../../assets/docs/about/userpage1.jpeg)
+![Illustration of Morph user landing page](../../assets/docs/about/userpage1.jpeg)

19-22: Hyphenate “on-chain” & fix spelling flagged by LanguageTool.

Replace “onchain consumer finance” with “on-chain consumer finance” for consistency, and ensure “low-cost” carries a hyphen.

docs/about-morph/6-roadmap.md (2)

9-9: Image alt text is non-descriptive.

![1](...) fails basic accessibility checks. Provide a meaningful description such as “Morph roadmap overview image”.

-![1](../../assets/docs/about/roadmap/roadmap1.jpg)
+![Morph roadmap overview](../../assets/docs/about/roadmap/roadmap1.jpg)

14-55: End-punctuation inconsistent across bullet lists.

Some items end with periods, others don’t (e.g., Q3 list vs Q4 list). Adopt one style to improve polish.

docs/quick-start/4-bridge.md (3)

15-18: Use Markdown link instead of bare URL.

MD034 flags https://bridge-holesky.morphl2.io. Convert to an inline link for lint compliance.

-1. Go to the Morph Holesky Bridge: https://bridge-holesky.morphl2.io
+1. Go to the [Morph Holesky Bridge](https://bridge-holesky.morphl2.io)

57-77: Strip colons from headings to satisfy MD026.

The headings “## Steps:”, “## Batch Submission:”, “## Verification Challenge Period:”, “## Explorer Check:”, “## Claim the Withdrawal:” all violate markdown-lint rule MD026 (no trailing punctuation).

-## Steps:
+## Steps
...
-## Batch Submission:
+## Batch Submission
...
-## Verification Challenge Period:
+## Verification Challenge Period
...
-## Explorer Check:
+## Explorer Check
...
-## Claim the Withdrawal:
+## Claim the Withdrawal

36-46: Hard-coded time range may become outdated.

“8–14 minutes” is network-dependent. Add “approximately” or reference live status to avoid stale docs.

docs/about-morph/4-morphs-architecture.md (2)

13-16: Sentence starts with “Layer 1 blockchains” → plural subject but next verb “has”.

Change to “have traditionally embraced” for grammatical agreement.

-Layer 1 blockchains have traditionally embraced modularity by separating execution, consensus, and data availability. Morph extends this approach across the entire stack, building our platform on the same principle.  
+Layer 1 blockchains have traditionally embraced modularity by separating execution, consensus, and data availability. Morph extends this approach across the entire stack, building our platform on the same principle.  

67-82: Remove trailing colons from H3 headings (MD026).

Headings with colons break markdown-lint and produce awkward anchors.

-### Open-Source Codebase:
+### Open-Source Codebase
-### Sherlock Open-Source Audit Report:
+### Sherlock Open-Source Audit Report
-### Trail of Bits Audit Report:
+### Trail of Bits Audit Report
-### Audit Scope:
+### Audit Scope
docs/about-morph/2-the-technology-behind-morph.md (2)

5-5: Correct the “cost0efficient” typo in the front-matter.

The description uses the digit “0” instead of the letter “o” in “cost-efficient”, which will surface in SEO snippets and looks unprofessional.

-description: Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!
+description: Upgrade your blockchain experience with Morph – the secure, decentralized, cost-efficient, and high-performing optimistic zk-rollup solution. Try it now!

38-51: Remove the duplicated “Visit Morph’s Modular Design” call-to-action.

The same link is shown twice within ~15 lines, which is noisy.

-Visit [Morph’s Modular Design](../how-morph-works/2-morph-modular-design.md) for a more comprehensive article. 
...
-Visit [Morph’s Modular Design](../how-morph-works/2-morph-modular-design.md) for a more comprehensive article. 

Keep only one instance (preferably the one after the diagram).

docs/about-morph/8-key-concepts.md (2)

5-5: Fix “cost0efficient” typo in description.

Same typo appears here – replace the zero with the letter “o”.


50-50: Unify “EIP-4844” spelling.

The conventional form omits the spaces: EIP-4844. Consistency aids searchability.

-## EIP - 4844
+## EIP-4844
docs/about-morph/1-overview-of-morph.md (1)

5-5: Correct the metadata typo “cost0efficient”.

Same fix as in the other docs.

docs/about-morph/morph-rails.md (1)

5-5: Improve the meta description for SEO and clarity.

Current description is too terse.

-description: Morph Rails. Try it now!
+description: Morph Rails – an open, self-custodial payment infrastructure for developers, merchants, and service providers building on Morph.
docs/about-morph/7-faqs.md (1)

5-5: Fix “cost0efficient” typo in description.

Apply the same correction as in the other files.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 585c260 and bb1edd6.

⛔ Files ignored due to path filters (2)
  • assets/docs/about/roadmap/roadmap1.jpg is excluded by !**/*.jpg
  • assets/docs/about/userpage1.jpeg is excluded by !**/*.jpeg
📒 Files selected for processing (15)
  • docs/about-morph/0-user-navigation-page.md (4 hunks)
  • docs/about-morph/1-overview-of-morph.md (1 hunks)
  • docs/about-morph/2-the-technology-behind-morph.md (1 hunks)
  • docs/about-morph/4-morphs-architecture.md (1 hunks)
  • docs/about-morph/5-morphs-vision-and-mission.md (1 hunks)
  • docs/about-morph/6-roadmap.md (1 hunks)
  • docs/about-morph/7-faqs.md (1 hunks)
  • docs/about-morph/8-key-concepts.md (1 hunks)
  • docs/about-morph/morph-pay.md (1 hunks)
  • docs/about-morph/morph-rails.md (1 hunks)
  • docs/build-on-morph/0-developer-navigation-page.md (5 hunks)
  • docs/quick-start/2-wallet-setup.md (2 hunks)
  • docs/quick-start/3-faucet.md (4 hunks)
  • docs/quick-start/4-bridge.md (1 hunks)
  • sidebars.js (3 hunks)
🧰 Additional context used
🪛 LanguageTool
docs/about-morph/4-morphs-architecture.md

[style] ~60-~60: Consider a different adjective to strengthen your wording.
Context: ...less operation of the network. For a deeper understanding of Morph’s architecture, ...

(DEEP_PROFOUND)

docs/about-morph/0-user-navigation-page.md

[grammar] ~19-~19: Ensure spelling is correct
Context: ...designed to power the next generation of onchain consumer finance. It is the consumer ...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

docs/about-morph/2-the-technology-behind-morph.md

[style] ~23-~23: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ng blockchain transactions on Morph. Optimistic rollups assume all transactions are val...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)

🪛 markdownlint-cli2 (0.17.2)
docs/about-morph/4-morphs-architecture.md

67-67: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


72-72: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


77-77: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


82-82: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)

docs/quick-start/3-faucet.md

15-15: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


17-17: Bare URL used

(MD034, no-bare-urls)


57-57: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


64-64: Trailing punctuation in heading
Punctuation: '.'

(MD026, no-trailing-punctuation)


66-66: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)

docs/quick-start/4-bridge.md

15-15: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


17-17: Bare URL used

(MD034, no-bare-urls)


57-57: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


64-64: Trailing punctuation in heading
Punctuation: '.'

(MD026, no-trailing-punctuation)


66-66: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


72-72: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


77-77: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)

🔇 Additional comments (4)
docs/quick-start/2-wallet-setup.md (1)

50-57: Chain IDs table: please confirm accuracy

Morph Mainnet shows Chain ID 2818 and Morph Holesky Testnet shows 2810. Previous public material used 2710/2718; if an intentional change, ignore—otherwise update before users copy-paste wrong RPC data.

docs/about-morph/morph-pay.md (1)

60-65: Marketing claim: “up to 30 % APY”—add source or footnote

Regulators are sensitive to yield advertising. Either cite the strategy/provider or add a footnote clarifying that rates are variable and not guaranteed.

docs/about-morph/0-user-navigation-page.md (1)

80-97: Heading hierarchy skips a level.

#### Morph Black (H4) is followed by ##### Morph Platinum (H5) without an H4 parent. Either promote “Morph Platinum” to H4 or demote “Morph Black”’s content to bullet text to keep semantic outline valid.

docs/about-morph/7-faqs.md (1)

24-27: Potential inconsistency on withdrawal timelines – please verify.

Earlier docs (e.g., “Technology Behind Morph”, Lines 30-34) state RVP shortens the challenge period to 1–3 days, yet the FAQ still cites a 48-hour (2 day) window. Ensure both documents remain synchronized if the window changes again.


- **Reduced costs**: ZK proofs are only generated when needed. When there are no challenges, the cost of ZK proof submission and verification is avoided, making RVP more cost-effective than both pure optimistic and pure ZK rollups.

![Sequqencer Network](../../assets/docs/about/overview/opzk.png)
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Fix the repeated “Sequqencer” spelling error in image alt-text.

-![Sequqencer Network](../../assets/docs/about/overview/opzk.png)
+![Sequencer Network](../../assets/docs/about/overview/opzk.png)

Replicate the change for the similar image at Line 48.

📝 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
![Sequqencer Network](../../assets/docs/about/overview/opzk.png)
![Sequencer Network](../../assets/docs/about/overview/opzk.png)
🤖 Prompt for AI Agents
In docs/about-morph/2-the-technology-behind-morph.md at line 36, correct the
spelling error in the image alt-text from "Sequqencer Network" to "Sequencer
Network". Also, locate the similar image at line 48 and apply the same spelling
correction to its alt-text to maintain consistency.



## Commitment to Our Community​
## Why Morph?​
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Hidden zero-width space in heading slug.

The heading text ## Why Morph?​ contains a U+200B zero-width character after the question mark. This can break autogenerated anchors (e.g., links will resolve to #why-morph vs #why-morph-).
Remove the invisible character to avoid broken intra-doc links.

-## Why Morph?​
+## Why Morph?
📝 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
## Why Morph?
## Why Morph?
🤖 Prompt for AI Agents
In docs/about-morph/5-morphs-vision-and-mission.md at line 24, the heading "##
Why Morph?​" contains a hidden zero-width space character after the question
mark. Remove this invisible U+200B character to ensure the autogenerated anchor
links work correctly and avoid broken intra-document navigation.

Comment on lines +79 to +83
- Merchants can accept stablecoin payments that settle instantly to a self-custodial wallet

- Wallets and fintechs can integrate ready-made modules for payments, FX, and compliance
DeFi protocols can add native payments, invoicing, and reward distribution without building from scratch

Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Restore list formatting – missing “-” breaks the bullet list.

- Wallets and fintechs can integrate ready-made modules for payments, FX, and compliance
-DeFi protocols can add native payments, invoicing, and reward distribution without building from scratch
+- Wallets and fintechs can integrate ready-made modules for payments, FX, and compliance
+- DeFi protocols can add native payments, invoicing, and reward distribution without building from scratch

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In docs/about-morph/morph-rails.md around lines 79 to 83, the bullet list
formatting is broken because the dash "-" is missing at the start of the last
line. Add the missing "-" before "DeFi protocols can add native payments,
invoicing, and reward distribution without building from scratch" to restore
proper bullet list formatting.

@EnderCrypto EnderCrypto self-requested a review August 7, 2025 02:08
EnderCrypto
EnderCrypto previously approved these changes Aug 7, 2025
Copy link
Contributor

@EnderCrypto EnderCrypto left a comment

Choose a reason for hiding this comment

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

reviewed

@cloudflare-workers-and-pages
Copy link

cloudflare-workers-and-pages bot commented Aug 7, 2025

Deploying morph-doc with  Cloudflare Pages  Cloudflare Pages

Latest commit: 6ce3c54
Status: ✅  Deploy successful!
Preview URL: https://2d2d3a77.morph-doc.pages.dev

View logs

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🔭 Outside diff range comments (1)
docs/about-morph/0-user-navigation-page.md (1)

49-59: Incorrect links duplicated three times
All three cards point to wallet-setup; the Faucet and Bridge cards should link to their dedicated docs. Readers following these links will get the wrong content.

-  <Card
-    href="/docs/quick-start/wallet-setup"
+  <Card
+    href="/docs/quick-start/wallet-setup"
     icon="/img/cards/wallet.svg"
     text="Wallet Setup" />
   <Card 
-    href="/docs/quick-start/wallet-setup"
+    href="/docs/quick-start/faucet"
     icon="./img/cards/faucet.svg"
     text="Faucet" />
   <Card
-    href="/docs/quick-start/wallet-setup"
+    href="/docs/quick-start/bridge"
     icon="/img/cards/bridge.svg"
     text="Bridge" />
🧹 Nitpick comments (4)
docs/about-morph/0-user-navigation-page.md (4)

4-5: Fix typos and punctuation in description front-matter
“cost0efficient” should be “cost-efficient”, and the comma after “secure decentralized” is missing a space. These mistakes leak into SEO metadata.

-description: Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!
+description: Upgrade your blockchain experience with Morph – the secure, decentralized, cost-efficient, and high-performing optimistic zk-rollup solution. Try it now!

10-10: Add meaningful alt-text and verify image path
The image renders with no alternative text, which hurts accessibility and SEO. Also confirm that the relative path resolves from /docs/about-morph/.

-![userpage](../../assets/docs/about/userpage1.jpeg)
+![Screenshot of the Morph user navigation page](../../assets/docs/about/userpage1.jpeg)

19-22: Grammar: use “on-chain” instead of “onchain”
The hyphenated form is the accepted spelling in crypto documentation.

-It is the consumer finance layer for the digital economy, enabling fast, low-cost, and secure transactions for people who live, earn, and transact online.
+It is the consumer finance layer for the digital economy, enabling fast, low-cost, and secure transactions for people who live, earn, and transact online.

65-76: Inconsistent icon paths (./img vs /img)
Mixed usage may break builds depending on asset-pipeline rules. Pick one convention (the repo mostly uses absolute /img/...).

-    icon="./img/cards/bridge.svg"
+    icon="/img/cards/bridge.svg"

Apply the same fix to the Faucet icon two lines below.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between bb1edd6 and 25a8dfb.

📒 Files selected for processing (1)
  • docs/about-morph/0-user-navigation-page.md (4 hunks)
🧰 Additional context used
🪛 LanguageTool
docs/about-morph/0-user-navigation-page.md

[grammar] ~19-~19: Ensure spelling is correct
Context: ...designed to power the next generation of onchain consumer finance. It is the consumer ...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

🔇 Additional comments (1)
docs/about-morph/0-user-navigation-page.md (1)

28-28: Heading may clash with sidebar removal
The “Introductory Concepts” block is still surfaced even though that category was commented out in sidebars.js. Verify that these pages remain reachable; otherwise users will land on 404s.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

♻️ Duplicate comments (1)
docs/about-morph/2-the-technology-behind-morph.md (1)

36-37: Fix “Sequqencer” typo in image alt-text

Same issue was flagged previously and is still present.

-![Sequqencer Network](../../assets/docs/about/overview/opzk.png)
+![Sequencer Network](../../assets/docs/about/overview/opzk.png)-![Sequqencer Network](../../assets/docs/about/overview/modu.png)
+![Sequencer Network](../../assets/docs/about/overview/modu.png)

Also applies to: 48-49

🧹 Nitpick comments (4)
docs/about-morph/4-morphs-architecture.md (3)

67-70: Remove trailing colons from headings to satisfy MD026

Markdown-lint flags headings that end with punctuation. The four sub-headings here all end with “:”.
Removing the colon keeps the headings semantic and silences the linter.

-### Open-Source Codebase:
+### Open-Source Codebase-### Sherlock Open-Source Audit Report:
+### Sherlock Open-Source Audit Report-### Trail of Bits Audit Report:
+### Trail of Bits Audit Report-### Audit Scope:
+### Audit Scope

Also applies to: 72-75, 77-80, 82-85


28-29: Eliminate double space in paragraph

There is an extra space between “Layer” and “transactions”.

- Sequencers coordinate, process, and finalize Morph Layer  transactions.
+ Sequencers coordinate, process, and finalize Morph Layer transactions.

39-41: Drop quotation marks around Rollup Process for consistency

Surrounding Rollup with single quotes is stylistically inconsistent with the other bullet labels.

- **Data Availability through 'Rollup' Process**:  
+ **Data Availability through Rollup Process**  
docs/about-morph/2-the-technology-behind-morph.md (1)

22-28: Vary sentence openings for better flow

Three consecutive sentences start with the pattern “Optimistic …”, “ZK …”, “Morph …”.
Consider restructuring one of them to improve readability.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 25a8dfb and e29f380.

📒 Files selected for processing (4)
  • docs/about-morph/1-overview-of-morph.md (1 hunks)
  • docs/about-morph/2-the-technology-behind-morph.md (1 hunks)
  • docs/about-morph/4-morphs-architecture.md (1 hunks)
  • docs/about-morph/5-morphs-vision-and-mission.md (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • docs/about-morph/5-morphs-vision-and-mission.md
🧰 Additional context used
🪛 LanguageTool
docs/about-morph/2-the-technology-behind-morph.md

[style] ~23-~23: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...ng blockchain transactions on Morph. Optimistic rollups assume all transactions are val...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)

docs/about-morph/4-morphs-architecture.md

[style] ~60-~60: Consider a different adjective to strengthen your wording.
Context: ...less operation of the network. For a deeper understanding of Morph’s architecture, ...

(DEEP_PROFOUND)

🪛 markdownlint-cli2 (0.17.2)
docs/about-morph/4-morphs-architecture.md

67-67: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


72-72: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


77-77: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)


82-82: Trailing punctuation in heading
Punctuation: ':'

(MD026, no-trailing-punctuation)

⏰ 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). (1)
  • GitHub Check: Cloudflare Pages

Comment on lines +28 to 31
### Modular Rollup Design

Consensus, execution, and data availability are separated. This allows developers to build and scale without disrupting the network.

Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Heading level inconsistent within “Core Infrastructure” block

Inside the Core Infrastructure section every sub-heading uses ####, but Modular Rollup Design is declared with ###.
Downgrade it to keep a uniform hierarchy.

-### Modular Rollup Design
+#### Modular Rollup Design
📝 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
### Modular Rollup Design
Consensus, execution, and data availability are separated. This allows developers to build and scale without disrupting the network.
#### Modular Rollup Design
Consensus, execution, and data availability are separated. This allows developers to build and scale without disrupting the network.
🤖 Prompt for AI Agents
In docs/about-morph/1-overview-of-morph.md around lines 28 to 31, the heading
"Modular Rollup Design" is marked with ### while other sub-headings in the "Core
Infrastructure" section use ####. Change the heading level of "Modular Rollup
Design" from ### to #### to maintain consistent heading hierarchy within the
section.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🔭 Outside diff range comments (1)
docs/about-morph/0-user-navigation-page.md (1)

49-59: Broken navigation: all three cards point to wallet-setup
Links for Faucet and Bridge are incorrect and lead to the wallet setup page. This will frustrate new users.

-  <Card 
-    href="/docs/quick-start/wallet-setup"
-    icon="./img/cards/faucet.svg"
-    text="Faucet" />
+  <Card 
+    href="/docs/quick-start/3-faucet"
+    icon="/img/cards/faucet.svg"
+    text="Faucet" />
   <Card
-    href="/docs/quick-start/wallet-setup"
+    href="/docs/quick-start/4-bridge"
     icon="/img/cards/bridge.svg"
     text="Bridge" />
🧹 Nitpick comments (5)
docs/about-morph/0-user-navigation-page.md (5)

4-5: Typo & metadata drift in front-matter
“cost0efficient” (Line 5) has a zero instead of a hyphen and is not a recognised word.
While you’re touching the line, consider updating the keywords/description to match the new “consumer-finance blockchain” positioning (they still reference “optimistic zk-rollup”).

-description: Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!
+description: Upgrade your blockchain experience with Morph – a secure, decentralised, cost-efficient, high-performance consumer-finance blockchain. Try it now!

10-10: Non-descriptive alt text on hero image
The current alt text “userpage” does not convey any meaning to screen-reader users. Provide a short, descriptive sentence.

-![userpage](../../assets/docs/about/userpage1.jpeg)
+![Illustration of the Morph user dashboard](../../assets/docs/about/userpage1.jpeg)

19-20: Spelling: “onchain” should be hyphenated
Standard docs style is “on-chain”.

-designed to power the next generation of onchain consumer finance.
+designed to power the next generation of on-chain consumer finance.

54-75: Inconsistent icon paths (./img vs /img)
Mixing relative and absolute paths can break asset resolution when the page is moved. Prefer root-relative /img/... for all icons.


94-96: Header depth inconsistency
Morph Platinum is a peer product, not a sub-section of Morph Black; demote/​promote as appropriate (e.g., make it #### Morph Platinum) to keep a flat list.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between e29f380 and ae195bc.

📒 Files selected for processing (1)
  • docs/about-morph/0-user-navigation-page.md (4 hunks)
🧰 Additional context used
🪛 LanguageTool
docs/about-morph/0-user-navigation-page.md

[grammar] ~19-~19: Ensure spelling is correct
Context: ...designed to power the next generation of onchain consumer finance. It is the consumer ...

(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)

* fix: deploy shell

* fix: appId

* fix: appId

* fix: appId

* fix: add nginx

* fix: nginx

* fix: nginx

* fix: deploy

* fix: deploy

* fix: doc

* fix: doc

* fix: cookbook ai

* fix: doc

* fix: doc

* fix: doc

* deploy

* deploy

* fix: doc

* fix: doc

* fix: git

* deploy: build

* deploy: build

* merge: doc

* fix: social link

* fix: style

* fix: style

---------

Co-authored-by: Danny Fu <danny.fu@bitget.com>
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 30

♻️ Duplicate comments (6)
build/assets/js/1483841d.c7695c94.js (1)

1-1: Same conditional-hook pattern in built chunk; see root guidance.

This chunk embeds the same MDX provider code that triggers Biome’s hook rule. Treat as a build artifact and exclude from lint, as noted in 5aa3c257.869d8531.js.

build/assets/js/028d32dc.b0c0048b.js (1)

1-1: Same conditional-hook pattern in built chunk; see root guidance.

Exclude build artifacts from lint to suppress the hook-order false positive.

build/assets/js/52171187.077ab897.js (1)

1-1: Same conditional-hook pattern in built chunk; see root guidance.

Treat as build artifact and exclude from lint.

build/assets/js/69301e8b.f3c5089c.js (1)

1-1: Same conditional-hook pattern in built chunk; see root guidance.

Exclude build outputs from lint to avoid false positives.

build/assets/js/6f5ac92b.3d93dd47.js (1)

1-1: Same MDX rules-of-hooks issue as noted in the Prune State chunk.

The MDX context provider calls a hook indirectly and conditionally. Please apply the same fix described in the previous comment.

build/assets/js/1a1587e1.d312ff53.js (1)

1-1: Same MDX rules-of-hooks issue present (module 1582).

Apply the same unconditional-hook refactor across all MDX chunks.

🧹 Nitpick comments (53)
README.md (2)

23-23: Wrap the bare URL to satisfy MD034 (no-bare-urls).

Switch to a Markdown link to quiet lint and improve readability.

- Twitter: https://x.com/MorphLayer
+ Twitter: [@MorphLayer](https://x.com/MorphLayer)

27-27: Wrap the bare URL to satisfy MD034 (no-bare-urls).

Also, please confirm this is the canonical Telegram handle for Morph.

- Telegram: https://t.me/MorphL2official
+ Telegram: [t.me/MorphL2official](https://t.me/MorphL2official)
build/assets/js/24734b3e.528e753c.js (1)

1-1: Ignore hook-order lint errors on minified bundles; add build/ to linter ignore.**

This is generated output; hook diagnostics from Biome on compiled code are not actionable. Exclude build assets from linting to keep signal high.

If Biome is used, add or confirm this ignore pattern:

  • build/**
  • dist/**

Same applies to ESLint if present.

build/assets/js/5a91095f.bc5d777d.js (1)

1-1: Bundled file; exclude from static analysis.

The content is produced by the docs bundler; hook warnings are expected on compiled output. Recommend ignoring build/** in lint configs and PR quality checks.

I can open a follow-up PR to:

  • Add/adjust Biome ignore for build/**
  • Ensure CI lints only source (docs/, src/)
build/assets/js/44bbd017.f25bc314.js (1)

1-1: Rebundled asset; treat as generated and exclude from lint/review.

No semantic changes here—just new module IDs. Suppress Biome hook warnings by excluding build/** from lint.

If desired, move built assets to a deployment branch (e.g., gh-pages) to keep main PRs source-only.

build/assets/js/57c15217.beeb4523.js (1)

1-1: Heading structure and terminology nits (source docs).

  • H1 “Decentralize Batch Submitter” appears mid-page; keep one H1 per page and use H2/H3 for subsections.
  • Consistency/clarity: “Blockinfo :” → “Block info:”, “lastBlocknumber” → “lastBlockNumber”, “SubmitterContract” responsibilities: sentence case and consistent colon spacing, etc.

Would you like me to open a small PR to clean up headings/terms in docs/how-morph-works/general-protocol-design/1-rollup.md?

build/assets/js/2a31694d.6b99dbda.js (1)

1-1: Ignore hook-rule lint errors for compiled MDX chunks; exclude build/ from linting.

Biome flags a conditional hook call within the compiled MDX provider shim (module 1582). This code is generated from the MDX runtime and safe in this context; we shouldn’t lint build artifacts.

  • Action: exclude build/** (and similar) from Biome/ESLint to avoid false positives.

Add/adjust your Biome config (example):

{
  "$schema": "https://biomejs.dev/schemas/2.1.2/schema.json",
  "linter": { "enabled": true },
  "files": {
    "ignore": [
      "build/**",
      "static/**",
      "node_modules/**"
    ]
  }
}
build/assets/js/066c1628.ef013ffd.js (1)

1-1: Suppress lint on compiled output; conditional hook call warning is from generated MDX provider code.

This is the same MDX provider shim pattern (module 1582). It’s compiled output and not hand-authored; don’t lint it.

Confirm Biome ignores build/** to prevent noisy CI failures.

build/assets/js/4a269d4a.a94aba76.js (1)

1-1: False-positive “hooks at top level” warning in compiled MDX provider.

This chunk is compiled; the conditional hook call originates from upstream MDX runtime. Exclude build/** from lints.

Would you like me to open a PR to update the repository lint config accordingly?

build/assets/js/465c0bc5.e3b956eb.js (1)

1-1: Exclude compiled bundles from lint; MDX provider shim triggers hook-rule warnings.

Nothing to change in this file; adjust lint configuration to ignore build/**.

I can add/update .biome.json/.eslintignore to ignore build/** if you want.

build/assets/js/22a82985.bcaadd20.js (1)

1-1: Ignore hook-rule lint errors for compiled MDX bundles and exclude build/

Same MDX provider shim (module 1582) produces a conditional hook warning. Don’t lint compiled output.

Run these checks to locate and fix curly quotes and mismatches in source docs:

build/assets/js/5aa3c257.869d8531.js (3)

1-1: Resolve hook rule lint errors in built chunk (prefer excluding build/ from lint).

Biome flags a conditional hook call (MDX provider uses a hook via a conditional ternary). This chunk is a compiled artifact; do not refactor it. Instead, exclude build artifacts from lint to avoid false positives and CI noise.

Two options:

  • Preferred: exclude build outputs from the linter.
  • Alternative (source-level): ensure the MDX provider calls the merging hook unconditionally and choose the value afterwards.

Add a Biome ignore for build outputs:

{
  "$schema": "https://biomejs.dev/schemas/1.5.3/schema.json",
  "files": {
    "ignore": [
      "build/**",
      "static/**",
      "dist/**"
    ]
  }
}

If you control the MDX provider source, refactor like:

function MDXProvider(props) {
  const merged = useMDXComponents(props.components); // unconditional hook
  const value = props.disableParentContext
    ? (typeof props.components === 'function'
        ? props.components({})
        : props.components || {})
    : merged;

  return <MDXContext.Provider value={value}>{props.children}</MDXContext.Provider>;
}

1-1: Typo: “cost0efficient” → “cost‑efficient”.

The description string uses zero “0” instead of the letter “o” in “cost‑efficient.” Please fix this in the source markdown front matter so future builds inherit the correction.

You can update:

  • docs/how-morph-works/general-protocol-design/2-communicate-between-morph-and-ethereum.md (front matter)

Example front matter change:

-description: "Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!"
+description: "Upgrade your blockchain experience with Morph - the secure, decentralized, cost‑efficient, and high‑performing optimistic zk‑rollup solution. Try it now!"

1-1: Terminology consistency: “Withdraw” vs “Withdrawal”.

Headings and text mix “Withdraw” (verb) and “Withdrawal” (noun). Standardize for clarity (e.g., “Withdrawal (L2 → L1 message)”, “Withdraw tree” → “Withdrawal tree”).

build/assets/js/52171187.077ab897.js (1)

1-1: Typo: “cost0efficient” → “cost‑efficient”.

Fix in the source markdown front matter (docs/about-morph/3-where-should-i-start.md) so the correction persists across builds.

Example change:

-description: "Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!"
+description: "Upgrade your blockchain experience with Morph - the secure, decentralized, cost‑efficient, and high‑performing optimistic zk‑rollup solution. Try it now!"
build/assets/js/08b9f613.2292ec97.js (1)

1-1: Biome rule-of-hooks errors are from compiled MDX, not source

The flagged pattern originates from MDX’s context helpers inside compiled bundles (conditional call path to a function that uses hooks). Linting compiled assets will keep producing false positives.

Recommend excluding build artifacts from lint:

  • Add build/ (and similar output dirs) to your Biome/eslint ignore.

Example Biome config fragment:

{
  "files": {
    "ignore": ["build/**", "dist/**", "node_modules/**"]
  }
}
build/assets/js/6ba36391.bdee8d58.js (1)

1-1: Suppress rule-of-hooks linting for compiled bundles

Same MDX provider pattern as other chunks; false positives from Biome on compiled code.

Consider ignoring build/** in lint configuration to avoid noise.

build/assets/js/61b1ff91.01109030.js (1)

1-1: Ignore compiled assets in lint to eliminate rule-of-hooks false positives

Same MDX pattern; please exclude build/** in Biome/eslint.

build/assets/js/3f6197d4.3649865e.js (1)

1-1: Accessibility nit: improve image alt text

Alt="devintro" is non-descriptive. Consider a meaningful alt (e.g., “Developer onboarding overview illustration”) in the source MDX.

build/assets/js/59db22f4.9c92db8f.js (2)

1-1: Doc text inconsistency: constructor description references the wrong class

Under “new ETHBridgeAdapter()” the sentence says “Creates a StandardBridgeAdapter instance.” It should reference ETHBridgeAdapter.

Please correct in the source markdown/TypeDoc comments, not the compiled file.


1-1: Suppress rule-of-hooks lint for compiled MDX bundles

Same MDX provider pattern; Biome’s rule-of-hooks error is a false positive on built code.

Exclude build/** (and similar) from linting.

build/assets/js/405a8a84.afa08ab0.js (2)

1-1: Capitalize “SocialScan” heading for brand consistency.

Change the H3 heading text from “Socialscan” to “SocialScan” in the source markdown; the body already uses “SocialScan Explorer.”


1-1: Improve image loading performance.

Add loading="lazy" and decoding="async" to the SocialScan image in the source MD/MDX.

Example in MDX/MD:

- <img alt="socialscan" src="/assets/images/socialscan.png" width="2830" height="1250" />
+ <img alt="socialscan" src="/assets/images/socialscan.png" width="2830" height="1250" loading="lazy" decoding="async" />
build/assets/js/3250a443.4576d738.js (3)

1-1: Use bash code fences for shell/make commands (not JavaScript).

The block showing make commands is tagged as language-js, which breaks syntax highlighting and confuses readers. Change to bash.

Proposed change in docs/build-on-morph/developer-resources/node-operation/upgrade-node/2-upgrade-node-docker.md:

-```js
+```bash
 // stop the docker containers
 make stop-node

 // start the docker container, it will automatically pull the updated docker images
 make run-node

---

`1-1`: **Fix heading grammar and improve clarity.**

“Step1:  Update docker images version” → “Step 1: Update Docker image versions”.



Proposed edit in docs/build-on-morph/developer-resources/node-operation/upgrade-node/2-upgrade-node-docker.md:

```diff
-#### Step1:  Update docker images version
+#### Step 1: Update Docker image versions

Optional clarity for placeholders:

-    image: ghcr.io/morph-l2/go-ethereum:{update_version} ## Specify the Geth image version
+    image: ghcr.io/morph-l2/go-ethereum:${UPDATE_VERSION} ## Specify the Geth image version
...
-    image: ghcr.io/morph-l2/node:{update_version} ## Specify the Node image version
+    image: ghcr.io/morph-l2/node:${UPDATE_VERSION} ## Specify the Node image version

And add a brief note below the YAML block:

+> Note: Replace ${UPDATE_VERSION} with the exact tag (e.g., v0.5.1).

1-1: Ignore lints for generated build artifacts.

Biome’s “useHookAtTopLevel” errors are false positives on compiled MDX bundles. Exclude build/** from linting.

Example Biome config snippet:

{
  "files": {
    "ignore": ["build/**", "dist/**", "node_modules/**"]
  }
}
build/assets/js/6a8ddb26.a8d54b20.js (1)

1-1: Suppress lints on generated bundles.

Hook-rule errors from Biome on this file are from compiled MDX internals. Exclude build/** from lints to reduce noise.

build/assets/js/38e6cd8b.aaca03cd.js (1)

1-1: Exclude build/ from linting to avoid hook-rule false positives.**

These errors come from compiled MDX internals rather than author code.

build/assets/js/33e57971.f01254b2.js (2)

1-1: Fix typos and improve alt text.

  • “cost0efficient” → “cost-efficient”.
  • “Sequqencer” → “Sequencer” (alt text appears multiple times).

Proposed edits in docs/about-morph/2-the-technology-behind-morph.md:

-Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!
+Upgrade your blockchain experience with Morph — the secure, decentralized, cost-efficient, and high-performing optimistic zk-rollup solution. Try it now!
-![Sequqencer Network](...)
+![Sequencer Network](...)

Apply the “Sequencer” spelling to all image alt occurrences in this page.


1-1: Exclude generated bundles from linting.

Biome hook-rule errors are false positives on compiled MDX. Add build/** to linter ignore.

build/assets/js/6f037fd7.be4f334b.js (1)

1-1: Ignore lints for build outputs.

Hook-rule errors are from compiled MDX internals. Exclude build/** from Biome/ESLint.

build/assets/js/4cbe5783.3425072e.js (1)

1-1: Generated bundle should be excluded from linting to avoid false positives

These are build artifacts. If your CI lints build/assets/**, exclude this path to reduce noise (e.g., in Biome/ESLint ignore). Keep linting on source MDX/TSX instead.

build/assets/js/4f7a49ab.68e103c7.js (1)

1-1: Typos in env variables and inconsistent paths will confuse operators

  • In the sample .env, ROLLUP_CONTRACY should be ROLLUP_CONTRACT.
  • Snapshot setup mixes ${NODE_DATA_DIR} in prose but uses ${MORPH_HOME}/node-data in commands. Pick one and document it consistently, or define NODE_DATA_DIR explicitly.

Proposed text edits (apply in the source MD file at docs/build-on-morph/developer-resources/node-operation/validator-node/1-run-in-docker.md and re-build):

- ROLLUP_CONTRACY=0x759894ced0e6af42c26668076ffa84d02e3cef60
+ ROLLUP_CONTRACT=0x759894ced0e6af42c26668076ffa84d02e3cef60

And align the directory variable:

- move the contents from `snapshot-20241218-1/data` to the `${NODE_DATA_DIR}/data` directory.
+ move the contents from `snapshot-20241218-1/data` to the `${MORPH_HOME}/node-data/data` directory.
build/assets/js/5bc5b9ce.f3bc9251.js (2)

1-1: Improve accessibility: image alt text is non-descriptive

Alt values like “tokenlist1/2/3/4” don’t describe the images. Use meaningful alt text (e.g., “Select token on Morph Bridge – token list dialog”).

- <img alt="tokenlist1" .../>
+ <img alt="Morph Bridge token list dialog" .../>

- <img alt="tokenlist2" .../>
+ <img alt="Enter custom L1 token address in Morph Bridge" .../>

- <img alt="tokenlist3" .../>
+ <img alt="Confirm L2 token address derived by Morph Bridge" .../>

- <img alt="tokenlist4" .../>
+ <img alt="Token successfully added to Morph Bridge" .../>

1-1: Minor copy tweak: “official bridge” -> “canonical bridge” is good; also fix recurring “cost0efficient” typo

I see “cost0efficient” (zero) in shared descriptions. Replace with “cost‑efficient”.

- cost0efficient
+ cost-efficient
build/assets/js/2f19d5d4.fa2f851a.js (2)

1-1: Typos and minor correctness in examples

  • “cost0efficient” → “cost‑efficient”.
  • Etherscan config: apiURL has a trailing space after api?. Remove it.
  • Copy: “Once succeed, …” → “Once succeeded, …”.
- description:"Upgrade your blockchain experience ... cost0efficient ...",
+ description:"Upgrade your blockchain experience ... cost-efficient ...",

- apiURL: 'https://explorer-api-holesky.morphl2.io/api? ',
+ apiURL: 'https://explorer-api-holesky.morphl2.io/api?',

- Once succeed, you can check your contract
+ Once succeeded, you can check your contract

1-1: Security note: avoid leaking private keys in history

Docs instruct creating .env with PRIVATE_KEY. Add a prominent warning not to commit .env, and recommend using a dedicated deployer key with minimal funds.

+ > Warning: Never commit your `.env` or private keys. Use a dedicated, low-balance deployer key and a secrets manager for CI.
build/assets/js/1f2dc99a.676c8cca.js (1)

1-1: Minor copy and accessibility nits

  • “ORA empower developers” → “ORA empowers developers”.
  • “contract addresses to our AI Oracle” → “contract addresses for our AI Oracle”.
  • Consider a more descriptive alt text than just “ORA” (e.g., “ORA logo” or the specific diagram name).
- ORA empower developers with the tools necessary
+ ORA empowers developers with the tools necessary

- find the contract addresses to our AI Oracle
+ find the contract addresses for our AI Oracle

- <img alt="ORA" .../>
+ <img alt="ORA logo" .../>
build/assets/js/60479fa4.69d66973.js (1)

1-1: Typo in marketing copy

The description string reads cost0efficient; replace with cost-efficient.

build/assets/js/39f485e7.e4d15ea7.js (1)

1-1: Repeated “cost0efficient” typo

Fix the zero → hyphen.

build/assets/js/578ca001.54e90cd3.js (1)

1-1: Several small content issues

cost0efficientcost-efficient
• Double full-stop at “…the integrity of the system..”
• The KaTeX fragment renders literal mathml/HTML; check that the Markdown source isn’t mangled.

build/assets/js/5c242b2e.a21dcfac.js (1)

1-1: Minor wording fixes

Inside the text:
• “Biconomy offer a full-stack solution” → “Biconomy offers …”

MakefileEks.mk (2)

13-15: Spelling / logging

The log message prints “starting ngnix…”, but the binary invoked is nginx. Tiny nit, but worth correcting for grepping logs.


8-21: Add .PHONY targets & fail-fast

Consider marking the new targets .PHONY and prefix the build steps with set -e (or rely on Make’s -e) to stop on the first failure. This prevents half-built images from being deployed.

Also applies to: 23-31

build/assets/js/5d313dc3.562fab67.js (2)

1-1: Tighten language and fix small typos in the doc copy.

  • “fullnode” → “full node”
  • Consider clearer phrasing for pruning guidance.

Patch the source at docs/build-on-morph/developer-resources/node-operation/1-prune-state.md:

-The performance of a full node will degrade when the storage size reaches a high volume. We suggest that the fullnode always keep light storage by pruning the storage.
+The performance of a full node degrades as the database grows. We recommend periodically pruning the state to keep disk usage low.

1-1: Clarify the prune command and prerequisites.

Recommend making the command more robust and documenting env var usage and logging:

Patch in the same Markdown:

-Run `nohup geth snapshot prune-zk-state --datadir "$GETH_DB_DIR" > prune.log &`. It will take 5~7 hours to finish.
+Export your data directory and run pruning in the background with logs:
+
+```bash
+export GETH_DB_DIR=/path/to/geth/datadir
+nohup geth snapshot prune-zk-state --datadir "$GETH_DB_DIR" > prune.log 2>&1 &
+```
+Depending on hardware, pruning can take several hours.

Also consider noting the required geth version and that SSD performance requirements are critical for acceptable duration.

build/assets/js/6f5ac92b.3d93dd47.js (1)

1-1: Fix typo in front matter description (“cost0efficient”).

Front matter uses “cost0efficient” (with a zero). Use “cost‑efficient”.

Patch in docs/quick-start/4-bridge.md:

-description: "Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!"
+description: "Upgrade your blockchain experience with Morph — the secure, decentralized, cost‑efficient, and high‑performing optimistic zk‑rollup solution. Try it now!"
build/assets/js/1a1587e1.d312ff53.js (2)

1-1: Fix repeated typo in front matter description (“cost0efficient”).

Same typo as other pages. Please update the source front matter.

Patch in docs/about-morph/6-roadmap.md:

-description: "Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!"
+description: "Upgrade your blockchain experience with Morph — the secure, decentralized, cost‑efficient, and high‑performing optimistic zk‑rollup solution. Try it now!"

1-1: Improve image alt text for accessibility.

The roadmap image alt is set to “1”. Replace with a descriptive alt, e.g., “Morph roadmap overview”.

Patch in docs/about-morph/6-roadmap.md:

-![1](./roadmap.png)
+![Morph roadmap overview (2024–2025)](./roadmap.png)
build/assets/js/1a4e3797.dc00afb6.js (1)

1-1: Exclude built vendor bundles from static analysis.

Biome flags “noUnsafeFinally” and “used before declaration” in this compiled vendor bundle. These aren’t actionable and will keep failing on minified code. Exclude build outputs from linters.

Add a Biome config (or update existing) to ignore build artifacts:

{
  "$schema": "https://biomejs.dev/schemas/1.5.4/schema.json",
  "files": {
    "ignore": [
      "build/**",
      "static/**",
      "dist/**",
      "node_modules/**"
    ]
  }
}

If using ESLint too, add the same patterns to .eslintignore.

build/assets/js/17896441.26f2d090.js (3)

1-1: Scroll/resize listeners run frequent DOM queries — consider IntersectionObserver or rAF throttle

The TOC highlighter attaches scroll/resize listeners and queries headings and links each time. It’s acceptable, but you can reduce work:

  • Use requestAnimationFrame to coalesce scroll events.
  • Use IntersectionObserver to track heading visibility.
  • Mark scroll listener as passive for smoother scrolling.

Example sketch (in source, not in build):

// inside useEffect
let raf = 0;
const onScroll = () => {
  if (raf) return;
  raf = requestAnimationFrame(() => {
    raf = 0;
    // compute active heading here
  });
};
document.addEventListener('scroll', onScroll, { passive: true });
window.addEventListener('resize', onScroll); // resize: passive has no effect
return () => {
  document.removeEventListener('scroll', onScroll);
  window.removeEventListener('resize', onScroll);
  if (raf) cancelAnimationFrame(raf);
};

1-1: Modernize copy-to-clipboard with navigator.clipboard; keep execCommand as fallback

The current copy logic uses document.execCommand('copy'), which works but is deprecated in favor of the async Clipboard API.

Example (in source):

async function copyText(text) {
  try {
    if (navigator.clipboard?.writeText) {
      await navigator.clipboard.writeText(text);
    } else {
      // fallback to execCommand path you already have
      legacyCopy(text);
    }
  } catch (e) {
    legacyCopy(text);
  }
}

1-1: Mermaid rendering is disabled (mermaid: () => null)

If your Morph Pay/Rails docs include Mermaid diagrams, they won’t render. If desired, enable Mermaid in Docusaurus.

Steps (in source):

  • npm i -D @docusaurus/theme-mermaid
  • docusaurus.config.js:
module.exports = {
  markdown: { mermaid: true },
  themes: ['@docusaurus/theme-mermaid'],
};

I can open a follow-up PR to wire this end-to-end.

<script src="/assets/js/runtime~main.467872be.js" defer="defer"></script>
<script src="/assets/js/main.16291c43.js" defer="defer"></script>
</head>
<body class="navigation-with-keyboard">
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Add rel="noopener noreferrer" to external links with target=_blank.

Prevent tab-napping and improve security. Apply to all social icons in this footer column.

Example:

- <a href="https://x.com/MorphLayer" target="_blank" class="hidden bg-[#ffffff1a] rounded-full social-link flex justify-center items-center">
+ <a href="https://x.com/MorphLayer" target="_blank" rel="noopener noreferrer" class="hidden bg-[#ffffff1a] rounded-full social-link flex justify-center items-center">

- <a href="https://discord.com/invite/MorphLayer" target="_blank" class="hidden bg-[#ffffff1a] rounded-full social-link flex justify-center items-center">
+ <a href="https://discord.com/invite/MorphLayer" target="_blank" rel="noopener noreferrer" class="hidden bg-[#ffffff1a] rounded-full social-link flex justify-center items-center">

- <a href="https://blog.morphl2.io/" target="_blank" class="hidden bg-[#ffffff1a] rounded-full social-link flex justify-center items-center">
+ <a href="https://blog.morphl2.io/" target="_blank" rel="noopener noreferrer" class="hidden bg-[#ffffff1a] rounded-full social-link flex justify-center items-center">

- <a href="https://t.me/MorphL2official" target="_blank" class="hidden bg-[#ffffff1a] rounded-full social-link flex justify-center items-center">
+ <a href="https://t.me/MorphL2official" target="_blank" rel="noopener noreferrer" class="hidden bg-[#ffffff1a] rounded-full social-link flex justify-center items-center">

- <a href="https://www.linkedin.com/company/morphl2" target="_blank" class="hidden bg-[#ffffff1a] rounded-full social-link flex justify-center items-center">
+ <a href="https://www.linkedin.com/company/morphl2" target="_blank" rel="noopener noreferrer" class="hidden bg-[#ffffff1a] rounded-full social-link flex justify-center items-center">

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 ast-grep (0.38.6)

[warning] 14-14: "This link points to a plaintext HTTP URL. Prefer an encrypted HTTPS URL if possible."
Context: LinkedIn
Note: [CWE-319] Authentication Bypass by Primary Weakness [REFERENCES]
- https://cwe.mitre.org/data/definitions/319.html

(plaintext-http-link-html)

🤖 Prompt for AI Agents
In build/404.html at line 14, the external links with target="_blank" in the
footer column do not have rel="noopener noreferrer" attributes. To fix this,
locate all social icon links in the footer that open in a new tab and add
rel="noopener noreferrer" to each anchor tag to prevent tab-napping and enhance
security.

⚠️ Potential issue

Use HTTPS for LinkedIn URL.

Replace plaintext HTTP with HTTPS.

- <a href="http://www.linkedin.com/company/morphl2" target="_blank" class="hidden bg-[#ffffff1a] rounded-full social-link flex justify-center items-center">
+ <a href="https://www.linkedin.com/company/morphl2" target="_blank" class="hidden bg-[#ffffff1a] rounded-full social-link flex justify-center items-center">
📝 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
<body class="navigation-with-keyboard">
- <a href="http://www.linkedin.com/company/morphl2" target="_blank" class="hidden bg-[#ffffff1a] rounded-full social-link flex justify-center items-center">
+ <a href="https://www.linkedin.com/company/morphl2" target="_blank" class="hidden bg-[#ffffff1a] rounded-full social-link flex justify-center items-center">
🧰 Tools
🪛 ast-grep (0.38.6)

[warning] 14-14: "This link points to a plaintext HTTP URL. Prefer an encrypted HTTPS URL if possible."
Context: LinkedIn
Note: [CWE-319] Authentication Bypass by Primary Weakness [REFERENCES]
- https://cwe.mitre.org/data/definitions/319.html

(plaintext-http-link-html)

🤖 Prompt for AI Agents
In build/404.html at line 14, the LinkedIn URL uses plaintext HTTP instead of
HTTPS. Update the LinkedIn URL to use HTTPS to ensure secure connections.

@@ -1 +1 @@
"use strict";(self.webpackChunkmorph_doc=self.webpackChunkmorph_doc||[]).push([[9849],{4735:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>t,metadata:()=>d,toc:()=>i});var o=n(3274),r=n(2333);const t={},c="Variable: DEFAULT_L1_CONTRACT_ADDRESSES",d={id:"build-on-morph/sdk/variables/DEFAULT_L1_CONTRACT_ADDRESSES",title:"DEFAULT_L1_CONTRACT_ADDRESSES",description:"@morph-l2/sdk \u2022 Docs",source:"@site/docs/build-on-morph/sdk/variables/DEFAULT_L1_CONTRACT_ADDRESSES.md",sourceDirName:"build-on-morph/sdk/variables",slug:"/build-on-morph/sdk/variables/DEFAULT_L1_CONTRACT_ADDRESSES",permalink:"/docs/build-on-morph/sdk/variables/DEFAULT_L1_CONTRACT_ADDRESSES",draft:!1,unlisted:!1,editUrl:"https://github.com/morph-l2/morph-doc/tree/main/docs/build-on-morph/sdk/variables/DEFAULT_L1_CONTRACT_ADDRESSES.md",tags:[],version:"current",frontMatter:{}},l={},i=[{value:"Source",id:"source",level:2}];function a(e){const s={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",hr:"hr",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.a,{href:"/docs/build-on-morph/sdk/globals",children:(0,o.jsx)(s.strong,{children:"@morph-l2/sdk"})})," \u2022 ",(0,o.jsx)(s.strong,{children:"Docs"})]}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.a,{href:"/docs/build-on-morph/sdk/globals",children:"@morph-l2/sdk"})," / DEFAULT_L1_CONTRACT_ADDRESSES"]}),"\n",(0,o.jsx)(s.h1,{id:"variable-default_l1_contract_addresses",children:"Variable: DEFAULT_L1_CONTRACT_ADDRESSES"}),"\n",(0,o.jsxs)(s.blockquote,{children:["\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"const"})," ",(0,o.jsx)(s.strong,{children:"DEFAULT_L1_CONTRACT_ADDRESSES"}),": ",(0,o.jsx)(s.a,{href:"/docs/build-on-morph/sdk/type-aliases/OEL1ContractsLike",children:(0,o.jsx)(s.code,{children:"OEL1ContractsLike"})})]}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:"Full list of default L1 contract addresses."}),"\n",(0,o.jsx)(s.h2,{id:"source",children:"Source"}),"\n",(0,o.jsx)(s.p,{children:"src/utils/chain-constants.ts:61"})]})}function h(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},2333:(e,s,n)=>{n.d(s,{R:()=>c,x:()=>d});var o=n(9474);const r={},t=o.createContext(r);function c(e){const s=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function d(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),o.createElement(t.Provider,{value:s},e.children)}}}]); No newline at end of file
"use strict";(self.webpackChunkmorph_doc=self.webpackChunkmorph_doc||[]).push([[9849],{1545:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>l,contentTitle:()=>c,default:()=>h,frontMatter:()=>t,metadata:()=>d,toc:()=>i});var o=n(6070),r=n(1582);const t={},c="Variable: DEFAULT_L1_CONTRACT_ADDRESSES",d={id:"build-on-morph/sdk/variables/DEFAULT_L1_CONTRACT_ADDRESSES",title:"DEFAULT_L1_CONTRACT_ADDRESSES",description:"@morph-l2/sdk \u2022 Docs",source:"@site/docs/build-on-morph/sdk/variables/DEFAULT_L1_CONTRACT_ADDRESSES.md",sourceDirName:"build-on-morph/sdk/variables",slug:"/build-on-morph/sdk/variables/DEFAULT_L1_CONTRACT_ADDRESSES",permalink:"/docs/build-on-morph/sdk/variables/DEFAULT_L1_CONTRACT_ADDRESSES",draft:!1,unlisted:!1,editUrl:"https://github.com/morph-l2/morph-doc/tree/main/docs/build-on-morph/sdk/variables/DEFAULT_L1_CONTRACT_ADDRESSES.md",tags:[],version:"current",frontMatter:{}},l={},i=[{value:"Source",id:"source",level:2}];function a(e){const s={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",hr:"hr",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.a,{href:"/docs/build-on-morph/sdk/globals",children:(0,o.jsx)(s.strong,{children:"@morph-l2/sdk"})})," \u2022 ",(0,o.jsx)(s.strong,{children:"Docs"})]}),"\n",(0,o.jsx)(s.hr,{}),"\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.a,{href:"/docs/build-on-morph/sdk/globals",children:"@morph-l2/sdk"})," / DEFAULT_L1_CONTRACT_ADDRESSES"]}),"\n",(0,o.jsx)(s.h1,{id:"variable-default_l1_contract_addresses",children:"Variable: DEFAULT_L1_CONTRACT_ADDRESSES"}),"\n",(0,o.jsxs)(s.blockquote,{children:["\n",(0,o.jsxs)(s.p,{children:[(0,o.jsx)(s.code,{children:"const"})," ",(0,o.jsx)(s.strong,{children:"DEFAULT_L1_CONTRACT_ADDRESSES"}),": ",(0,o.jsx)(s.a,{href:"/docs/build-on-morph/sdk/type-aliases/OEL1ContractsLike",children:(0,o.jsx)(s.code,{children:"OEL1ContractsLike"})})]}),"\n"]}),"\n",(0,o.jsx)(s.p,{children:"Full list of default L1 contract addresses."}),"\n",(0,o.jsx)(s.h2,{id:"source",children:"Source"}),"\n",(0,o.jsx)(s.p,{children:"src/utils/chain-constants.ts:61"})]})}function h(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},1582:(e,s,n)=>{n.d(s,{R:()=>c,x:()=>d});var o=n(758);const r={},t=o.createContext(r);function c(e){const s=o.useContext(t);return o.useMemo((function(){return"function"==typeof e?e(s):{...s,...e}}),[s,e])}function d(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),o.createElement(t.Provider,{value:s},e.children)}}}]); No newline at end of file
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

⚠️ Potential issue

Fix rule-of-hooks violation in MDX provider helper (module 1582).

Refactor the conditional hook invocation as noted in other files.

🧰 Tools
🪛 Biome (2.1.2)

[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)


[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)

🤖 Prompt for AI Agents
In build/assets/js/02a35c22.cf697fb9.js at module 1582, the function c
conditionally calls a hook inside a ternary expression, causing a rule-of-hooks
violation. Refactor the code to ensure hooks are called unconditionally at the
top level by separating the hook call from the conditional logic. First, call
the hook to get the context, then apply the conditional logic to merge or
override components without calling hooks conditionally.

@@ -1 +1 @@
"use strict";(self.webpackChunkmorph_doc=self.webpackChunkmorph_doc||[]).push([[2736],{9052:(e,o,i)=>{i.r(o),i.d(o,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var n=i(3274),t=i(2333);const r={title:"Overview",lang:"en-US",keywords:["morph","layer2","validity proof","optimistic zk-rollup"],description:"Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!"},s=void 0,a={id:"about-morph/overview-of-morph",title:"Overview",description:"Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!",source:"@site/docs/about-morph/1-overview-of-morph.md",sourceDirName:"about-morph",slug:"/about-morph/overview-of-morph",permalink:"/docs/about-morph/overview-of-morph",draft:!1,unlisted:!1,editUrl:"https://github.com/morph-l2/morph-doc/tree/main/docs/about-morph/1-overview-of-morph.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Overview",lang:"en-US",keywords:["morph","layer2","validity proof","optimistic zk-rollup"],description:"Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!"},sidebar:"DeveloperSidebar",previous:{title:"Welcome to Morph",permalink:"/docs/about-morph/user-navigation-page"},next:{title:"The Technology Behind Morph",permalink:"/docs/about-morph/the-technology-behind-morph"}},c={},l=[{value:"What Makes Morph Special",id:"what-makes-morph-special",level:2},{value:"Decentralized Sequencer Network",id:"decentralized-sequencer-network",level:3},{value:"Optimistic zkEVM Integration",id:"optimistic-zkevm-integration",level:3},{value:"Modular Design",id:"modular-design",level:3}];function h(e){const o={a:"a",h2:"h2",h3:"h3",p:"p",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.p,{children:"Welcome to Morph, a blockchain for consumers. At the core of Morph is a revolutionary approach to Ethereum Layer 2 scalability, harnessing the power of rollup technology."}),"\n",(0,n.jsx)(o.p,{children:"Our platform is uniquely designed to enhance the blockchain experience, making it more accessible, efficient, and user-friendly for both developers and consumers. We achieve these innovations through a unique combination of cutting-edge technologies."}),"\n",(0,n.jsx)(o.h2,{id:"what-makes-morph-special",children:"What Makes Morph Special"}),"\n",(0,n.jsx)(o.p,{children:"Given that our platform is built on the philosophy of consumer-centric innovation, we believe blockchain technology has the transformative power to enhance users\u2019 daily lives. To accomplish this vision, our infrastructure has three core technological components that function as the foundation of a consumer blockchain."}),"\n",(0,n.jsx)(o.h3,{id:"decentralized-sequencer-network",children:"Decentralized Sequencer Network"}),"\n",(0,n.jsx)(o.p,{children:"Morph\u2019s distribution of the sequencing role eliminates single points of failure, reduces transaction censorship, and prevents monopolies over Miner Extractable Value (MEV). Building on Morph means guaranteed high availability, resilience, and fairness in transaction processing."}),"\n",(0,n.jsx)(o.h3,{id:"optimistic-zkevm-integration",children:"Optimistic zkEVM Integration"}),"\n",(0,n.jsx)(o.p,{children:"Morph\u2019s Optimistic zkEVM Integration combines the efficiency of optimistic rollups with the security of zero-knowledge proofs, using a novel method called Responsive Validity Proof (RVP). RVP reduces costs and shortens withdrawal periods while maintaining high security, enabling robust applications that don\u2019t compromise on performance or security."}),"\n",(0,n.jsx)(o.h3,{id:"modular-design",children:"Modular Design"}),"\n",(0,n.jsx)(o.p,{children:"Morph's architecture is divided into three modules: Sequencer Network for consensus and execution, Optimistic zkEVM for state verification, and Rollup for data availability. Developers can build and maintain applications more efficiently, ensuring each component can be upgraded independently without disrupting the entire system."}),"\n",(0,n.jsxs)(o.p,{children:["Before you dive into a deeper exploration of our technology, understanding our ",(0,n.jsx)(o.a,{href:"/docs/about-morph/morphs-vision-and-mission",children:"Vision and Mission"})," will offer a better idea of why Morph stands out in the industry."]})]})}function p(e={}){const{wrapper:o}={...(0,t.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},2333:(e,o,i)=>{i.d(o,{R:()=>s,x:()=>a});var n=i(9474);const t={},r=n.createContext(t);function s(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); No newline at end of file
"use strict";(self.webpackChunkmorph_doc=self.webpackChunkmorph_doc||[]).push([[2736],{5270:(e,o,i)=>{i.r(o),i.d(o,{assets:()=>c,contentTitle:()=>s,default:()=>p,frontMatter:()=>r,metadata:()=>a,toc:()=>l});var n=i(6070),t=i(1582);const r={title:"Overview",lang:"en-US",keywords:["morph","layer2","validity proof","optimistic zk-rollup"],description:"Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!"},s=void 0,a={id:"about-morph/overview-of-morph",title:"Overview",description:"Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!",source:"@site/docs/about-morph/1-overview-of-morph.md",sourceDirName:"about-morph",slug:"/about-morph/overview-of-morph",permalink:"/docs/about-morph/overview-of-morph",draft:!1,unlisted:!1,editUrl:"https://github.com/morph-l2/morph-doc/tree/main/docs/about-morph/1-overview-of-morph.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Overview",lang:"en-US",keywords:["morph","layer2","validity proof","optimistic zk-rollup"],description:"Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!"},sidebar:"DeveloperSidebar",previous:{title:"Welcome to Morph",permalink:"/docs/about-morph/user-navigation-page"},next:{title:"The Technology Behind Morph",permalink:"/docs/about-morph/the-technology-behind-morph"}},c={},l=[{value:"What Makes Morph Special",id:"what-makes-morph-special",level:2},{value:"Decentralized Sequencer Network",id:"decentralized-sequencer-network",level:3},{value:"Optimistic zkEVM Integration",id:"optimistic-zkevm-integration",level:3},{value:"Modular Design",id:"modular-design",level:3}];function h(e){const o={a:"a",h2:"h2",h3:"h3",p:"p",...(0,t.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.p,{children:"Welcome to Morph, a blockchain for consumers. At the core of Morph is a revolutionary approach to Ethereum Layer 2 scalability, harnessing the power of rollup technology."}),"\n",(0,n.jsx)(o.p,{children:"Our platform is uniquely designed to enhance the blockchain experience, making it more accessible, efficient, and user-friendly for both developers and consumers. We achieve these innovations through a unique combination of cutting-edge technologies."}),"\n",(0,n.jsx)(o.h2,{id:"what-makes-morph-special",children:"What Makes Morph Special"}),"\n",(0,n.jsx)(o.p,{children:"Given that our platform is built on the philosophy of consumer-centric innovation, we believe blockchain technology has the transformative power to enhance users\u2019 daily lives. To accomplish this vision, our infrastructure has three core technological components that function as the foundation of a consumer blockchain."}),"\n",(0,n.jsx)(o.h3,{id:"decentralized-sequencer-network",children:"Decentralized Sequencer Network"}),"\n",(0,n.jsx)(o.p,{children:"Morph\u2019s distribution of the sequencing role eliminates single points of failure, reduces transaction censorship, and prevents monopolies over Miner Extractable Value (MEV). Building on Morph means guaranteed high availability, resilience, and fairness in transaction processing."}),"\n",(0,n.jsx)(o.h3,{id:"optimistic-zkevm-integration",children:"Optimistic zkEVM Integration"}),"\n",(0,n.jsx)(o.p,{children:"Morph\u2019s Optimistic zkEVM Integration combines the efficiency of optimistic rollups with the security of zero-knowledge proofs, using a novel method called Responsive Validity Proof (RVP). RVP reduces costs and shortens withdrawal periods while maintaining high security, enabling robust applications that don\u2019t compromise on performance or security."}),"\n",(0,n.jsx)(o.h3,{id:"modular-design",children:"Modular Design"}),"\n",(0,n.jsx)(o.p,{children:"Morph's architecture is divided into three modules: Sequencer Network for consensus and execution, Optimistic zkEVM for state verification, and Rollup for data availability. Developers can build and maintain applications more efficiently, ensuring each component can be upgraded independently without disrupting the entire system."}),"\n",(0,n.jsxs)(o.p,{children:["Before you dive into a deeper exploration of our technology, understanding our ",(0,n.jsx)(o.a,{href:"/docs/about-morph/morphs-vision-and-mission",children:"Vision and Mission"})," will offer a better idea of why Morph stands out in the industry."]})]})}function p(e={}){const{wrapper:o}={...(0,t.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(h,{...e})}):h(e)}},1582:(e,o,i)=>{i.d(o,{R:()=>s,x:()=>a});var n=i(758);const t={},r=n.createContext(t);function s(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function a(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:s(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); No newline at end of file
Copy link

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Typo in description: “cost0efficient”

Appears to be a “0” instead of a hyphen. Please fix in the source MD file (metadata.description/frontmatter), not the compiled asset, e.g., change to “cost‑efficient”.

To find and fix all occurrences in sources:


🏁 Script executed:

#!/bin/bash
# Find typos in source docs (exclude build artifacts)
rg -n --no-ignore -S "cost0efficient" --glob "!:build" --glob "!:node_modules"

Length of output: 299318


Typo fix: replace “cost0efficient” with “cost-efficient” in all source Markdown frontmatter

The typo appears in the description field of your Markdown sources (not just the compiled asset). We found dozens of .md files under docs/ and static/ containing:

description: "... cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!"

Please update each to:

description: "... cost-efficient, and high-performing optimistic zk-rollup solution. Try it now!"

Affected source directories (non-exhaustive):

  • docs/about-morph/*.md
  • docs/quick-start/*.md
  • docs/how-morph-works/**/*.md
  • docs/build-on-morph/**/*.md
  • static/2-morph-staking-system-design.md

You can batch-replace with, for example:

# Find and replace typo in all source Markdown
rg -l "cost0efficient" --glob "*.md" --glob "docs/**/*.md" --glob "static/**/*.md" \
| xargs sed -i 's/cost0efficient/cost-efficient/g'

Afterwards, verify each frontmatter description has the hyphenated form.

🧰 Tools
🪛 Biome (2.1.2)

[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)


[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)

🤖 Prompt for AI Agents
In build/assets/js/08b9f613.2292ec97.js line 1, the compiled asset shows a typo
"cost0efficient" in the description field of the Markdown frontmatter. This typo
exists in the original Markdown source files under docs/ and static/
directories. To fix, batch search all .md files in these directories for
"cost0efficient" and replace it with "cost-efficient" in the frontmatter
description field. Use a command like ripgrep and sed to automate this, then
verify all descriptions have the corrected hyphenated form.

@@ -0,0 +1 @@
(self.webpackChunkmorph_doc=self.webpackChunkmorph_doc||[]).push([[8401],{5948:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>Xt});var s=n(758),a=n(926),o=n(3991),i=n(6070);const l=s.createContext(null);function c(e){let{children:t,content:n}=e;const a=function(e){return(0,s.useMemo)((()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc})),[e])}(n);return(0,i.jsx)(l.Provider,{value:a,children:t})}function r(){const e=(0,s.useContext)(l);if(null===e)throw new o.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:t,assets:n}=r();return(0,i.jsx)(a.be,{title:e.title,description:e.description,keywords:t.keywords,image:n.image??t.image})}var u=n(3526),m=n(8080),h=n(7260),p=n(6601);function f(e){const{permalink:t,title:n,subLabel:s,isNext:a}=e;return(0,i.jsxs)(p.A,{className:(0,u.A)("pagination-nav__link",a?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[s&&(0,i.jsx)("div",{className:"pagination-nav__sublabel",children:s}),(0,i.jsx)("div",{className:"pagination-nav__label",children:n})]})}function x(e){const{previous:t,next:n}=e;return(0,i.jsxs)("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,h.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[t&&(0,i.jsx)(f,{...t,subLabel:(0,i.jsx)(h.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,i.jsx)(f,{...n,subLabel:(0,i.jsx)(h.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function b(){const{metadata:e}=r();return(0,i.jsx)(x,{previous:e.previous,next:e.next})}var g=n(6869),j=n(9612),v=n(7998),N=n(3636),A=n(4451);const C={unreleased:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,i.jsx)(h.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:t,versionLabel:(0,i.jsx)("b",{children:n.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function(e){let{siteTitle:t,versionMetadata:n}=e;return(0,i.jsx)(h.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:t,versionLabel:(0,i.jsx)("b",{children:n.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function y(e){const t=C[e.versionMetadata.banner];return(0,i.jsx)(t,{...e})}function k(e){let{versionLabel:t,to:n,onClick:s}=e;return(0,i.jsx)(h.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:t,latestVersionLink:(0,i.jsx)("b",{children:(0,i.jsx)(p.A,{to:n,onClick:s,children:(0,i.jsx)(h.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function L(e){let{className:t,versionMetadata:n}=e;const{siteConfig:{title:s}}=(0,g.A)(),{pluginId:a}=(0,j.vT)({failfast:!0}),{savePreferredVersionName:o}=(0,N.g1)(a),{latestDocSuggestion:l,latestVersionSuggestion:c}=(0,j.HW)(a),r=l??(d=c).docs.find((e=>e.id===d.mainDocId));var d;return(0,i.jsxs)("div",{className:(0,u.A)(t,v.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,i.jsx)("div",{children:(0,i.jsx)(y,{siteTitle:s,versionMetadata:n})}),(0,i.jsx)("div",{className:"margin-top--md",children:(0,i.jsx)(k,{versionLabel:c.label,to:r.path,onClick:()=>o(c.name)})})]})}function _(e){let{className:t}=e;const n=(0,A.r)();return n.banner?(0,i.jsx)(L,{className:t,versionMetadata:n}):null}function B(e){let{className:t}=e;const n=(0,A.r)();return n.badge?(0,i.jsx)("span",{className:(0,u.A)(t,v.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,i.jsx)(h.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:n.label},children:"Version: {versionLabel}"})}):null}function w(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n}=e;return(0,i.jsx)(h.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,i.jsx)("b",{children:(0,i.jsx)("time",{dateTime:new Date(1e3*t).toISOString(),children:n})})},children:" on {date}"})}function T(e){let{lastUpdatedBy:t}=e;return(0,i.jsx)(h.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,i.jsx)("b",{children:t})},children:" by {user}"})}function E(e){let{lastUpdatedAt:t,formattedLastUpdatedAt:n,lastUpdatedBy:s}=e;return(0,i.jsxs)("span",{className:v.G.common.lastUpdated,children:[(0,i.jsx)(h.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t&&n?(0,i.jsx)(w,{lastUpdatedAt:t,formattedLastUpdatedAt:n}):"",byUser:s?(0,i.jsx)(T,{lastUpdatedBy:s}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const H={iconEdit:"iconEdit_hqvt"};function M(e){let{className:t,...n}=e;return(0,i.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,u.A)(H.iconEdit,t),"aria-hidden":"true",...n,children:(0,i.jsx)("g",{children:(0,i.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function U(e){let{editUrl:t}=e;return(0,i.jsxs)(p.A,{to:t,className:v.G.common.editThisPage,children:[(0,i.jsx)(M,{}),(0,i.jsx)(h.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}const I={tag:"tag_G9wi",tagRegular:"tagRegular_ZX_1",tagWithCount:"tagWithCount_xGB6"};function S(e){let{permalink:t,label:n,count:s}=e;return(0,i.jsxs)(p.A,{href:t,className:(0,u.A)(I.tag,s?I.tagWithCount:I.tagRegular),children:[n,s&&(0,i.jsx)("span",{children:s})]})}const R={tags:"tags_NPqp",tag:"tag_WyCo"};function z(e){let{tags:t}=e;return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("b",{children:(0,i.jsx)(h.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,i.jsx)("ul",{className:(0,u.A)(R.tags,"padding--none","margin-left--sm"),children:t.map((e=>{let{label:t,permalink:n}=e;return(0,i.jsx)("li",{className:R.tag,children:(0,i.jsx)(S,{label:t,permalink:n})},n)}))})]})}const V={lastUpdated:"lastUpdated_rVBC"};function O(e){return(0,i.jsx)("div",{className:(0,u.A)(v.G.docs.docFooterTagsRow,"row margin-bottom--sm"),children:(0,i.jsx)("div",{className:"col",children:(0,i.jsx)(z,{...e})})})}function P(e){let{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:s,formattedLastUpdatedAt:a}=e;return(0,i.jsxs)("div",{className:(0,u.A)(v.G.docs.docFooterEditMetaRow,"row"),children:[(0,i.jsx)("div",{className:"col",children:t&&(0,i.jsx)(U,{editUrl:t})}),(0,i.jsx)("div",{className:(0,u.A)("col",V.lastUpdated),children:(n||s)&&(0,i.jsx)(E,{lastUpdatedAt:n,formattedLastUpdatedAt:a,lastUpdatedBy:s})})]})}function G(){const{metadata:e}=r(),{editUrl:t,lastUpdatedAt:n,formattedLastUpdatedAt:s,lastUpdatedBy:a,tags:o}=e,l=o.length>0,c=!!(t||n||a);return l||c?(0,i.jsxs)("footer",{className:(0,u.A)(v.G.docs.docFooter,"docusaurus-mt-lg"),children:[l&&(0,i.jsx)(O,{tags:o}),c&&(0,i.jsx)(P,{editUrl:t,lastUpdatedAt:n,lastUpdatedBy:a,formattedLastUpdatedAt:s})]}):null}var D=n(1069),$=n(5349);function F(e){const t=e.map((e=>({...e,parentIndex:-1,children:[]}))),n=Array(7).fill(-1);t.forEach(((e,t)=>{const s=n.slice(2,e.level);e.parentIndex=Math.max(...s),n[e.level]=t}));const s=[];return t.forEach((e=>{const{parentIndex:n,...a}=e;n>=0?t[n].children.push(a):s.push(a)})),s}function W(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:s}=e;return t.flatMap((e=>{const t=W({toc:e.children,minHeadingLevel:n,maxHeadingLevel:s});return function(e){return e.level>=n&&e.level<=s}(e)?[{...e,children:t}]:t}))}function q(e){const t=e.getBoundingClientRect();return t.top===t.bottom?q(e.parentNode):t}function Z(e,t){let{anchorTopOffset:n}=t;const s=e.find((e=>q(e).top>=n));if(s){return function(e){return e.top>0&&e.bottom<window.innerHeight/2}(q(s))?s:e[e.indexOf(s)-1]??null}return e[e.length-1]??null}function Y(){const e=(0,s.useRef)(0),{navbar:{hideOnScroll:t}}=(0,$.p)();return(0,s.useEffect)((()=>{e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}function J(e){const t=(0,s.useRef)(void 0),n=Y();(0,s.useEffect)((()=>{if(!e)return()=>{};const{linkClassName:s,linkActiveClassName:a,minHeadingLevel:o,maxHeadingLevel:i}=e;function l(){const e=function(e){return Array.from(document.getElementsByClassName(e))}(s),l=function(e){let{minHeadingLevel:t,maxHeadingLevel:n}=e;const s=[];for(let a=t;a<=n;a+=1)s.push(`h${a}.anchor`);return Array.from(document.querySelectorAll(s.join()))}({minHeadingLevel:o,maxHeadingLevel:i}),c=Z(l,{anchorTopOffset:n.current}),r=e.find((e=>c&&c.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)));e.forEach((e=>{!function(e,n){n?(t.current&&t.current!==e&&t.current.classList.remove(a),e.classList.add(a),t.current=e):e.classList.remove(a)}(e,e===r)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),()=>{document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,n])}function K(e){let{toc:t,className:n,linkClassName:s,isChild:a}=e;return t.length?(0,i.jsx)("ul",{className:a?void 0:n,children:t.map((e=>(0,i.jsxs)("li",{children:[(0,i.jsx)(p.A,{to:`#${e.id}`,className:s??void 0,dangerouslySetInnerHTML:{__html:e.value}}),(0,i.jsx)(K,{isChild:!0,toc:e.children,className:n,linkClassName:s})]},e.id)))}):null}const Q=s.memo(K);function X(e){let{toc:t,className:n="table-of-contents table-of-contents__left-border",linkClassName:a="table-of-contents__link",linkActiveClassName:o,minHeadingLevel:l,maxHeadingLevel:c,...r}=e;const d=(0,$.p)(),u=l??d.tableOfContents.minHeadingLevel,m=c??d.tableOfContents.maxHeadingLevel,h=function(e){let{toc:t,minHeadingLevel:n,maxHeadingLevel:a}=e;return(0,s.useMemo)((()=>W({toc:F(t),minHeadingLevel:n,maxHeadingLevel:a})),[t,n,a])}({toc:t,minHeadingLevel:u,maxHeadingLevel:m});return J((0,s.useMemo)((()=>{if(a&&o)return{linkClassName:a,linkActiveClassName:o,minHeadingLevel:u,maxHeadingLevel:m}}),[a,o,u,m])),(0,i.jsx)(Q,{toc:h,className:n,linkClassName:a,...r})}const ee={tocCollapsibleButton:"tocCollapsibleButton_fvqu",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_gSY7"};function te(e){let{collapsed:t,...n}=e;return(0,i.jsx)("button",{type:"button",...n,className:(0,u.A)("clean-btn",ee.tocCollapsibleButton,!t&&ee.tocCollapsibleButtonExpanded,n.className),children:(0,i.jsx)(h.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const ne={tocCollapsible:"tocCollapsible_HBdG",tocCollapsibleContent:"tocCollapsibleContent_ZtRw",tocCollapsibleExpanded:"tocCollapsibleExpanded_Kmy0"};function se(e){let{toc:t,className:n,minHeadingLevel:s,maxHeadingLevel:a}=e;const{collapsed:o,toggleCollapsed:l}=(0,D.u)({initialState:!0});return(0,i.jsxs)("div",{className:(0,u.A)(ne.tocCollapsible,!o&&ne.tocCollapsibleExpanded,n),children:[(0,i.jsx)(te,{collapsed:o,onClick:l}),(0,i.jsx)(D.N,{lazy:!0,className:ne.tocCollapsibleContent,collapsed:o,children:(0,i.jsx)(X,{toc:t,minHeadingLevel:s,maxHeadingLevel:a})})]})}const ae={tocMobile:"tocMobile_z_cF"};function oe(){const{toc:e,frontMatter:t}=r();return(0,i.jsx)(se,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,u.A)(v.G.docs.docTocMobile,ae.tocMobile)})}const ie={tableOfContents:"tableOfContents_Kj3J",docItemContainer:"docItemContainer_rccO"},le="table-of-contents__link toc-highlight",ce="table-of-contents__link--active";function re(e){let{className:t,...n}=e;return(0,i.jsx)("div",{className:(0,u.A)(ie.tableOfContents,"thin-scrollbar",t),children:(0,i.jsx)(X,{...n,linkClassName:le,linkActiveClassName:ce})})}function de(){const{toc:e,frontMatter:t}=r();return(0,i.jsx)(re,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:v.G.docs.docTocDesktop})}var ue=n(2406),me=n(1582),he=n(7471),pe=n(600),fe=n(1478);function xe(){const{prism:e}=(0,$.p)(),{colorMode:t}=(0,fe.G)(),n=e.theme,s=e.darkTheme||n;return"dark"===t?s:n}var be=n(4809),ge=n.n(be);const je=/title=(?<quote>["'])(?<title>.*?)\1/,ve=/\{(?<range>[\d,-]+)\}/,Ne={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},Ae={...Ne,lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""},vb:{start:"['\u2018\u2019]",end:""},vbnet:{start:"(?:_\\s*)?['\u2018\u2019]",end:""},rem:{start:"[Rr][Ee][Mm]\\b",end:""},f90:{start:"!",end:""},ml:{start:"\\(\\*",end:"\\*\\)"},cobol:{start:"\\*>",end:""}},Ce=Object.keys(Ne);function ye(e,t){const n=e.map((e=>{const{start:n,end:s}=Ae[e];return`(?:${n}\\s*(${t.flatMap((e=>[e.line,e.block?.start,e.block?.end].filter(Boolean))).join("|")})\\s*${s})`})).join("|");return new RegExp(`^\\s*(?:${n})\\s*$`)}function ke(e,t){let n=e.replace(/\n$/,"");const{language:s,magicComments:a,metastring:o}=t;if(o&&ve.test(o)){const e=o.match(ve).groups.range;if(0===a.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${o}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const t=a[0].className,s=ge()(e).filter((e=>e>0)).map((e=>[e-1,[t]]));return{lineClassNames:Object.fromEntries(s),code:n}}if(void 0===s)return{lineClassNames:{},code:n};const i=function(e,t){switch(e){case"js":case"javascript":case"ts":case"typescript":return ye(["js","jsBlock"],t);case"jsx":case"tsx":return ye(["js","jsBlock","jsx"],t);case"html":return ye(["js","jsBlock","html"],t);case"python":case"py":case"bash":return ye(["bash"],t);case"markdown":case"md":return ye(["html","jsx","bash"],t);case"tex":case"latex":case"matlab":return ye(["tex"],t);case"lua":case"haskell":case"sql":return ye(["lua"],t);case"wasm":return ye(["wasm"],t);case"vb":case"vba":case"visual-basic":return ye(["vb","rem"],t);case"vbnet":return ye(["vbnet","rem"],t);case"batch":return ye(["rem"],t);case"basic":return ye(["rem","f90"],t);case"fsharp":return ye(["js","ml"],t);case"ocaml":case"sml":return ye(["ml"],t);case"fortran":return ye(["f90"],t);case"cobol":return ye(["cobol"],t);default:return ye(Ce,t)}}(s,a),l=n.split("\n"),c=Object.fromEntries(a.map((e=>[e.className,{start:0,range:""}]))),r=Object.fromEntries(a.filter((e=>e.line)).map((e=>{let{className:t,line:n}=e;return[n,t]}))),d=Object.fromEntries(a.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.start,t]}))),u=Object.fromEntries(a.filter((e=>e.block)).map((e=>{let{className:t,block:n}=e;return[n.end,t]})));for(let h=0;h<l.length;){const e=l[h].match(i);if(!e){h+=1;continue}const t=e.slice(1).find((e=>void 0!==e));r[t]?c[r[t]].range+=`${h},`:d[t]?c[d[t]].start=h:u[t]&&(c[u[t]].range+=`${c[u[t]].start}-${h-1},`),l.splice(h,1)}n=l.join("\n");const m={};return Object.entries(c).forEach((e=>{let[t,{range:n}]=e;ge()(n).forEach((e=>{m[e]??=[],m[e].push(t)}))})),{lineClassNames:m,code:n}}const Le="codeBlockContainer_jasU";function _e(e){let{as:t,...n}=e;const s=function(e){const t={color:"--prism-color",backgroundColor:"--prism-background-color"},n={};return Object.entries(e.plain).forEach((e=>{let[s,a]=e;const o=t[s];o&&"string"==typeof a&&(n[o]=a)})),n}(xe());return(0,i.jsx)(t,{...n,style:s,className:(0,u.A)(n.className,Le,v.G.common.codeBlock)})}const Be={codeBlockContent:"codeBlockContent_TEEh",codeBlockTitle:"codeBlockTitle_e8pP",codeBlock:"codeBlock_Bkgn",codeBlockStandalone:"codeBlockStandalone__C0n",codeBlockLines:"codeBlockLines_lDP1",codeBlockLinesWithNumbering:"codeBlockLinesWithNumbering_y7ta",buttonGroup:"buttonGroup_QYpy"};function we(e){let{children:t,className:n}=e;return(0,i.jsx)(_e,{as:"pre",tabIndex:0,className:(0,u.A)(Be.codeBlockStandalone,"thin-scrollbar",n),children:(0,i.jsx)("code",{className:Be.codeBlockLines,children:t})})}const Te={attributes:!0,characterData:!0,childList:!0,subtree:!0};function Ee(e,t){const[n,a]=(0,s.useState)(),i=(0,s.useCallback)((()=>{a(e.current?.closest("[role=tabpanel][hidden]"))}),[e,a]);(0,s.useEffect)((()=>{i()}),[i]),function(e,t,n){void 0===n&&(n=Te);const a=(0,o._q)(t),i=(0,o.Be)(n);(0,s.useEffect)((()=>{const t=new MutationObserver(a);return e&&t.observe(e,i),()=>t.disconnect()}),[e,a,i])}(n,(e=>{e.forEach((e=>{"attributes"===e.type&&"hidden"===e.attributeName&&(t(),i())}))}),{attributes:!0,characterData:!1,childList:!1,subtree:!1})}var He=n(5371);const Me="codeLine_qib8",Ue="codeLineNumber_dbgI",Ie="codeLineContent_h2yX";function Se(e){let{line:t,classNames:n,showLineNumbers:s,getLineProps:a,getTokenProps:o}=e;1===t.length&&"\n"===t[0].content&&(t[0].content="");const l=a({line:t,className:(0,u.A)(n,s&&Me)}),c=t.map(((e,t)=>(0,i.jsx)("span",{...o({token:e,key:t})},t)));return(0,i.jsxs)("span",{...l,children:[s?(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)("span",{className:Ue}),(0,i.jsx)("span",{className:Ie,children:c})]}):c,(0,i.jsx)("br",{})]})}function Re(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function ze(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const Ve={copyButtonCopied:"copyButtonCopied_yinF",copyButtonIcons:"copyButtonIcons_SHCV",copyButtonIcon:"copyButtonIcon_rwkz",copyButtonSuccessIcon:"copyButtonSuccessIcon_B2xf"};function Oe(e){let{code:t,className:n}=e;const[a,o]=(0,s.useState)(!1),l=(0,s.useRef)(void 0),c=(0,s.useCallback)((()=>{!function(e,t){let{target:n=document.body}=void 0===t?{}:t;if("string"!=typeof e)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof e}\`.`);const s=document.createElement("textarea"),a=document.activeElement;s.value=e,s.setAttribute("readonly",""),s.style.contain="strict",s.style.position="absolute",s.style.left="-9999px",s.style.fontSize="12pt";const o=document.getSelection(),i=o.rangeCount>0&&o.getRangeAt(0);n.append(s),s.select(),s.selectionStart=0,s.selectionEnd=e.length;let l=!1;try{l=document.execCommand("copy")}catch{}s.remove(),i&&(o.removeAllRanges(),o.addRange(i)),a&&a.focus()}(t),o(!0),l.current=window.setTimeout((()=>{o(!1)}),1e3)}),[t]);return(0,s.useEffect)((()=>()=>window.clearTimeout(l.current)),[]),(0,i.jsx)("button",{type:"button","aria-label":a?(0,h.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,h.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"}),title:(0,h.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,u.A)("clean-btn",n,Ve.copyButton,a&&Ve.copyButtonCopied),onClick:c,children:(0,i.jsxs)("span",{className:Ve.copyButtonIcons,"aria-hidden":"true",children:[(0,i.jsx)(Re,{className:Ve.copyButtonIcon}),(0,i.jsx)(ze,{className:Ve.copyButtonSuccessIcon})]})})}function Pe(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}const Ge="wordWrapButtonIcon_KMHO",De="wordWrapButtonEnabled_Eugp";function $e(e){let{className:t,onClick:n,isEnabled:s}=e;const a=(0,h.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,i.jsx)("button",{type:"button",onClick:n,className:(0,u.A)("clean-btn",t,s&&De),"aria-label":a,title:a,children:(0,i.jsx)(Pe,{className:Ge,"aria-hidden":"true"})})}function Fe(e){let{children:t,className:n="",metastring:a,title:o,showLineNumbers:l,language:c}=e;const{prism:{defaultLanguage:r,magicComments:d}}=(0,$.p)(),m=function(e){return e?.toLowerCase()}(c??function(e){const t=e.split(" ").find((e=>e.startsWith("language-")));return t?.replace(/language-/,"")}(n)??r),h=xe(),p=function(){const[e,t]=(0,s.useState)(!1),[n,a]=(0,s.useState)(!1),o=(0,s.useRef)(null),i=(0,s.useCallback)((()=>{const n=o.current.querySelector("code");e?n.removeAttribute("style"):(n.style.whiteSpace="pre-wrap",n.style.overflowWrap="anywhere"),t((e=>!e))}),[o,e]),l=(0,s.useCallback)((()=>{const{scrollWidth:e,clientWidth:t}=o.current,n=e>t||o.current.querySelector("code").hasAttribute("style");a(n)}),[o]);return Ee(o,l),(0,s.useEffect)((()=>{l()}),[e,l]),(0,s.useEffect)((()=>(window.addEventListener("resize",l,{passive:!0}),()=>{window.removeEventListener("resize",l)})),[l]),{codeBlockRef:o,isEnabled:e,isCodeScrollable:n,toggle:i}}(),f=function(e){return e?.match(je)?.groups.title??""}(a)||o,{lineClassNames:x,code:b}=ke(t,{metastring:a,language:m,magicComments:d}),g=l??function(e){return Boolean(e?.includes("showLineNumbers"))}(a);return(0,i.jsxs)(_e,{as:"div",className:(0,u.A)(n,m&&!n.includes(`language-${m}`)&&`language-${m}`),children:[f&&(0,i.jsx)("div",{className:Be.codeBlockTitle,children:f}),(0,i.jsxs)("div",{className:Be.codeBlockContent,children:[(0,i.jsx)(He.f4,{theme:h,code:b,language:m??"text",children:e=>{let{className:t,style:n,tokens:s,getLineProps:a,getTokenProps:o}=e;return(0,i.jsx)("pre",{tabIndex:0,ref:p.codeBlockRef,className:(0,u.A)(t,Be.codeBlock,"thin-scrollbar"),style:n,children:(0,i.jsx)("code",{className:(0,u.A)(Be.codeBlockLines,g&&Be.codeBlockLinesWithNumbering),children:s.map(((e,t)=>(0,i.jsx)(Se,{line:e,getLineProps:a,getTokenProps:o,classNames:x[t],showLineNumbers:g},t)))})})}}),(0,i.jsxs)("div",{className:Be.buttonGroup,children:[(p.isEnabled||p.isCodeScrollable)&&(0,i.jsx)($e,{className:Be.codeButton,onClick:()=>p.toggle(),isEnabled:p.isEnabled}),(0,i.jsx)(Oe,{className:Be.codeButton,code:b})]})]})]})}function We(e){let{children:t,...n}=e;const a=(0,pe.A)(),o=function(e){return s.Children.toArray(e).some((e=>(0,s.isValidElement)(e)))?e:Array.isArray(e)?e.join(""):e}(t),l="string"==typeof o?Fe:we;return(0,i.jsx)(l,{...n,children:o},String(a))}function qe(e){return(0,i.jsx)("code",{...e})}var Ze=n(2146);const Ye="details_NQJP",Je="isBrowser_nVDU",Ke="collapsibleContent_MmFW";function Qe(e){return!!e&&("SUMMARY"===e.tagName||Qe(e.parentElement))}function Xe(e,t){return!!e&&(e===t||Xe(e.parentElement,t))}function et(e){let{summary:t,children:n,...a}=e;(0,Ze.A)().collectAnchor(a.id);const o=(0,pe.A)(),l=(0,s.useRef)(null),{collapsed:c,setCollapsed:r}=(0,D.u)({initialState:!a.open}),[d,m]=(0,s.useState)(a.open),h=s.isValidElement(t)?t:(0,i.jsx)("summary",{children:t??"Details"});return(0,i.jsxs)("details",{...a,ref:l,open:d,"data-collapsed":c,className:(0,u.A)(Ye,o&&Je,a.className),onMouseDown:e=>{Qe(e.target)&&e.detail>1&&e.preventDefault()},onClick:e=>{e.stopPropagation();const t=e.target;Qe(t)&&Xe(t,l.current)&&(e.preventDefault(),c?(r(!1),m(!0)):r(!0))},children:[h,(0,i.jsx)(D.N,{lazy:!1,collapsed:c,disableSSRStyle:!0,onCollapseTransitionEnd:e=>{r(e),m(!e)},children:(0,i.jsx)("div",{className:Ke,children:n})})]})}const tt="details_v4Yj";function nt(e){let{...t}=e;return(0,i.jsx)(et,{...t,className:(0,u.A)("alert alert--info",tt,t.className)})}function st(e){const t=s.Children.toArray(e.children),n=t.find((e=>s.isValidElement(e)&&"summary"===e.type)),a=(0,i.jsx)(i.Fragment,{children:t.filter((e=>e!==n))});return(0,i.jsx)(nt,{...e,summary:n,children:a})}function at(e){return(0,i.jsx)(ue.A,{...e})}const ot="containsTaskList_j67I";function it(e){if(void 0!==e)return(0,u.A)(e,e?.includes("contains-task-list")&&ot)}const lt="img_ce0i";function ct(e){const{mdxAdmonitionTitle:t,rest:n}=function(e){const t=s.Children.toArray(e),n=t.find((e=>s.isValidElement(e)&&"mdxAdmonitionTitle"===e.type)),a=t.filter((e=>e!==n)),o=n?.props.children;return{mdxAdmonitionTitle:o,rest:a.length>0?(0,i.jsx)(i.Fragment,{children:a}):null}}(e.children),a=e.title??t;return{...e,...a&&{title:a},children:n}}const rt="admonition_qJAF",dt="admonitionHeading_WmUu",ut="admonitionIcon_FLlS",mt="admonitionContent_Lm9s";function ht(e){let{type:t,className:n,children:s}=e;return(0,i.jsx)("div",{className:(0,u.A)(v.G.common.admonition,v.G.common.admonitionType(t),rt,n),children:s})}function pt(e){let{icon:t,title:n}=e;return(0,i.jsxs)("div",{className:dt,children:[(0,i.jsx)("span",{className:ut,children:t}),n]})}function ft(e){let{children:t}=e;return t?(0,i.jsx)("div",{className:mt,children:t}):null}function xt(e){const{type:t,icon:n,title:s,children:a,className:o}=e;return(0,i.jsxs)(ht,{type:t,className:o,children:[(0,i.jsx)(pt,{title:s,icon:n}),(0,i.jsx)(ft,{children:a})]})}function bt(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const gt={icon:(0,i.jsx)(bt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function jt(e){return(0,i.jsx)(xt,{...gt,...e,className:(0,u.A)("alert alert--secondary",e.className),children:e.children})}function vt(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const Nt={icon:(0,i.jsx)(vt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function At(e){return(0,i.jsx)(xt,{...Nt,...e,className:(0,u.A)("alert alert--success",e.className),children:e.children})}function Ct(e){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const yt={icon:(0,i.jsx)(Ct,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function kt(e){return(0,i.jsx)(xt,{...yt,...e,className:(0,u.A)("alert alert--info",e.className),children:e.children})}function Lt(e){return(0,i.jsx)("svg",{viewBox:"0 0 16 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const _t={icon:(0,i.jsx)(Lt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function Bt(e){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...e,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const wt={icon:(0,i.jsx)(Bt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const Tt={icon:(0,i.jsx)(Lt,{}),title:(0,i.jsx)(h.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const Et={...{note:jt,tip:At,info:kt,warning:function(e){return(0,i.jsx)(xt,{..._t,...e,className:(0,u.A)("alert alert--warning",e.className),children:e.children})},danger:function(e){return(0,i.jsx)(xt,{...wt,...e,className:(0,u.A)("alert alert--danger",e.className),children:e.children})}},...{secondary:e=>(0,i.jsx)(jt,{title:"secondary",...e}),important:e=>(0,i.jsx)(kt,{title:"important",...e}),success:e=>(0,i.jsx)(At,{title:"success",...e}),caution:function(e){return(0,i.jsx)(xt,{...Tt,...e,className:(0,u.A)("alert alert--warning",e.className),children:e.children})}}};function Ht(e){const t=ct(e),n=(s=t.type,Et[s]||(console.warn(`No admonition component found for admonition type "${s}". Using Info as fallback.`),Et.info));var s;return(0,i.jsx)(n,{...t})}const Mt={Head:he.A,details:st,Details:st,code:function(e){return function(e){return void 0!==e.children&&s.Children.toArray(e.children).every((e=>"string"==typeof e&&!e.includes("\n")))}(e)?(0,i.jsx)(qe,{...e}):(0,i.jsx)(We,{...e})},a:function(e){return(0,i.jsx)(p.A,{...e})},pre:function(e){return(0,i.jsx)(i.Fragment,{children:e.children})},ul:function(e){return(0,i.jsx)("ul",{...e,className:it(e.className)})},li:function(e){return(0,Ze.A)().collectAnchor(e.id),(0,i.jsx)("li",{...e})},img:function(e){return(0,i.jsx)("img",{decoding:"async",loading:"lazy",...e,className:(t=e.className,(0,u.A)(t,lt))});var t},h1:e=>(0,i.jsx)(at,{as:"h1",...e}),h2:e=>(0,i.jsx)(at,{as:"h2",...e}),h3:e=>(0,i.jsx)(at,{as:"h3",...e}),h4:e=>(0,i.jsx)(at,{as:"h4",...e}),h5:e=>(0,i.jsx)(at,{as:"h5",...e}),h6:e=>(0,i.jsx)(at,{as:"h6",...e}),admonition:Ht,mermaid:()=>null};function Ut(e){let{children:t}=e;return(0,i.jsx)(me.x,{components:Mt,children:t})}function It(e){let{children:t}=e;const n=function(){const{metadata:e,frontMatter:t,contentTitle:n}=r();return t.hide_title||void 0!==n?null:e.title}();return(0,i.jsxs)("div",{className:(0,u.A)(v.G.docs.docMarkdown,"markdown"),children:[n&&(0,i.jsx)("header",{children:(0,i.jsx)(ue.A,{as:"h1",children:n})}),(0,i.jsx)(Ut,{children:t})]})}var St=n(3745),Rt=n(8492),zt=n(7838);function Vt(e){return(0,i.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,i.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const Ot={breadcrumbHomeIcon:"breadcrumbHomeIcon_eIF0"};function Pt(){const e=(0,zt.A)("/");return(0,i.jsx)("li",{className:"breadcrumbs__item",children:(0,i.jsx)(p.A,{"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,i.jsx)(Vt,{className:Ot.breadcrumbHomeIcon})})})}const Gt={breadcrumbsContainer:"breadcrumbsContainer_y6NL"};function Dt(e){let{children:t,href:n,isLast:s}=e;const a="breadcrumbs__link";return s?(0,i.jsx)("span",{className:a,itemProp:"name",children:t}):n?(0,i.jsx)(p.A,{className:a,href:n,itemProp:"item",children:(0,i.jsx)("span",{itemProp:"name",children:t})}):(0,i.jsx)("span",{className:a,children:t})}function $t(e){let{children:t,active:n,index:s,addMicrodata:a}=e;return(0,i.jsxs)("li",{...a&&{itemScope:!0,itemProp:"itemListElement",itemType:"https://schema.org/ListItem"},className:(0,u.A)("breadcrumbs__item",{"breadcrumbs__item--active":n}),children:[t,(0,i.jsx)("meta",{itemProp:"position",content:String(s+1)})]})}function Ft(){const e=(0,St.OF)(),t=(0,Rt.Dt)();return e?(0,i.jsx)("nav",{className:(0,u.A)(v.G.docs.docBreadcrumbs,Gt.breadcrumbsContainer),"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,i.jsxs)("ul",{className:"breadcrumbs",itemScope:!0,itemType:"https://schema.org/BreadcrumbList",children:[t&&(0,i.jsx)(Pt,{}),e.map(((t,n)=>{const s=n===e.length-1,a="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,i.jsx)($t,{active:s,index:n,addMicrodata:!!a,children:(0,i.jsx)(Dt,{href:a,isLast:s,children:t.label})},n)}))]})}):null}function Wt(){return(0,i.jsx)(h.A,{id:"theme.unlistedContent.title",description:"The unlisted content banner title",children:"Unlisted page"})}function qt(){return(0,i.jsx)(h.A,{id:"theme.unlistedContent.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function Zt(){return(0,i.jsx)(he.A,{children:(0,i.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function Yt(e){let{className:t}=e;return(0,i.jsx)(Ht,{type:"caution",title:(0,i.jsx)(Wt,{}),className:(0,u.A)(t,v.G.common.unlistedBanner),children:(0,i.jsx)(qt,{})})}function Jt(e){return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsx)(Zt,{}),(0,i.jsx)(Yt,{...e})]})}const Kt={docItemContainer:"docItemContainer_AUwr",docItemCol:"docItemCol_dvZ9"};function Qt(e){let{children:t}=e;const n=function(){const{frontMatter:e,toc:t}=r(),n=(0,m.l)(),s=e.hide_table_of_contents,a=!s&&t.length>0;return{hidden:s,mobile:a?(0,i.jsx)(oe,{}):void 0,desktop:!a||"desktop"!==n&&"ssr"!==n?void 0:(0,i.jsx)(de,{})}}(),{metadata:{unlisted:s}}=r();return(0,i.jsxs)("div",{className:"row",children:[(0,i.jsxs)("div",{className:(0,u.A)("col",!n.hidden&&Kt.docItemCol),children:[s&&(0,i.jsx)(Jt,{}),(0,i.jsx)(_,{}),(0,i.jsxs)("div",{className:Kt.docItemContainer,children:[(0,i.jsxs)("article",{children:[(0,i.jsx)(Ft,{}),(0,i.jsx)(B,{}),n.mobile,(0,i.jsx)(It,{children:t}),(0,i.jsx)(G,{})]}),(0,i.jsx)(b,{})]})]}),n.desktop&&(0,i.jsx)("div",{className:"col col--3",children:n.desktop})]})}function Xt(e){const t=`docs-doc-id-${e.content.metadata.id}`,n=e.content;return(0,i.jsx)(c,{content:e.content,children:(0,i.jsxs)(a.e3,{className:t,children:[(0,i.jsx)(d,{}),(0,i.jsx)(Qt,{children:(0,i.jsx)(n,{})})]})})}},4809:(e,t)=>{function n(e){let t,n=[];for(let s of e.split(",").map((e=>e.trim())))if(/^-?\d+$/.test(s))n.push(parseInt(s,10));else if(t=s.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[e,s,a,o]=t;if(s&&o){s=parseInt(s),o=parseInt(o);const e=s<o?1:-1;"-"!==a&&".."!==a&&"\u2025"!==a||(o+=e);for(let t=s;t!==o;t+=e)n.push(t)}}return n}t.default=n,e.exports=n},1582:(e,t,n)=>{"use strict";n.d(t,{R:()=>i,x:()=>l});var s=n(758);const a={},o=s.createContext(a);function i(e){const t=s.useContext(o);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); No newline at end of file
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Avoid reviewing/committing build artifacts; exclude from linters

This is a minified build chunk. Lint findings like “use before declaration” and “hooks not at top level” are false positives on bundles. Recommend:

  • Don’t commit build/ to VCS (or publish it from a deploy branch only).
  • Exclude build/** from static analysis to reduce noise.

You can add ignores like:

  • .eslintignore
build/
dist/
node_modules/
  • biome.json
{
  "files": { "ignore": ["build/**", "dist/**", "node_modules/**"] },
  "linter": { "enabled": true }
}
🧰 Tools
🪛 Biome (2.1.2)

[error] 1-1: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


[error] 1-1: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


[error] 1-1: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


[error] 1-1: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


[error] 1-1: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


[error] 1-1: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)


[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)

🤖 Prompt for AI Agents
In build/assets/js/17896441.26f2d090.js at line 1, the file is a minified build
artifact which should not be reviewed or committed directly as it causes false
positives in linting such as "use before declaration" and "hooks not at top
level". To fix this, exclude the build/ directory from version control and
static analysis tools by adding it to .eslintignore or biome.json ignore
settings, preventing these files from being linted or committed.

💡 Verification agent

🧩 Analysis chain

Static analysis hints here are expected false positives on bundles

Biome’s “noInvalidUseBeforeDeclaration” and “useHookAtTopLevel” errors are caused by minification/obfuscation. Hooks are actually called inside components in source; bundle symbol renaming (e.g., J) breaks heuristic detection. Exclude build/** from Biome/ESLint to avoid these.

Run to confirm your toolchain is ignoring build outputs:


🏁 Script executed:

#!/bin/bash
set -euo pipefail
echo "Biome config files:"
fd -H -a -t f -E node_modules -E build 'biome.json|biome.jsonc|.biome.json' || true
echo
echo "ESLint ignore/config files:"
fd -H -a -t f -E node_modules -E build '.eslintignore|.eslintrc|.eslintrc.*' || true
echo
echo "Check if build/ is ignored:"
{ rg -n "build/?[*]?\*?" .eslintignore || true; } && \
{ rg -n '"ignore"\s*:\s*\[.*build/?.*?\]' -U $(fd -H -a -t f 'biome.json*' || echo) || true; }

Length of output: 614


Exclude build artifacts from linting configurations
I verified that neither your Biome config nor any ESLint ignore files exclude the build/** directory. Without these ignores, minified bundles will continue to trigger false positives for rules like noInvalidUseBeforeDeclaration and useHookAtTopLevel.

Please update your configs accordingly:

  • In biome.json, add an ignore entry:
    {
      //
      "ignore": [
        "build/**",
        // other patterns…
      ]
    }
  • Create (or update) .eslintignore in the project root with:
    build/**
    

These changes will ensure your bundled code is skipped by both Biome and ESLint, eliminating those false positives.

🧰 Tools
🪛 Biome (2.1.2)

[error] 1-1: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


[error] 1-1: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


[error] 1-1: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


[error] 1-1: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


[error] 1-1: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


[error] 1-1: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)


[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)

🤖 Prompt for AI Agents
In build/assets/js/17896441.26f2d090.js at line 1, the build directory is not
excluded from linting, causing false positives on minified bundles. To fix this,
update biome.json to add "build/**" to the ignore array, and create or update
the .eslintignore file in the project root to include "build/**". This will
prevent both Biome and ESLint from linting the build artifacts.

💡 Verification agent

🧩 Analysis chain

dangerouslySetInnerHTML used for TOC headings — verify sanitization

TOC renders headings with dangerouslySetInnerHTML ({__html: e.value}). That’s fine if upstream MDX pipeline sanitizes heading HTML. Please ensure raw HTML in headings can’t introduce XSS.

Run to locate config and check for sanitization:

If sanitization is not explicit and you allow raw HTML in MDX, consider adding rehype-sanitize or restricting HTML in headings.


🏁 Script executed:

#!/bin/bash
set -euo pipefail
# Find Docusaurus config
fd -H -a -t f -E node_modules -E build 'docusaurus.config.*'
# Inspect remark/rehype plugins or sanitization
rg -n "rehype|remark|sanitize|allowDangerousHtml|mdx|markdown" $(fd -H -a -t f -E node_modules -E build 'docusaurus.config.*' || echo) || true

Length of output: 554


Ensure MDX HTML is sanitized before using dangerouslySetInnerHTML

Our audit of docusaurus.config.js shows only math/Katex plugins—no rehype-sanitize (or equivalent) is enabled. Since your TOC uses

dangerouslySetInnerHTML={{ __html: e.value }}

any raw HTML in headings will be injected without sanitization, opening a potential XSS vector.

Locations to update:

  • docusaurus.config.js (inside your docs and/or theme MDX options around lines 88–98)

Suggested fix:
• Add a sanitization plugin in your MDX pipeline, for example:

// docusaurus.config.js
const rehypeSanitize = require('rehype-sanitize');
// …
presets: [
  [
    '@docusaurus/preset-classic',
    {
      docs: {
        remarkPlugins: [remarkMath],
        rehypePlugins: [
          rehypeKatex,
          [rehypeSanitize, {/* optional schema overrides */}],
        ],
      },
      // ... similarly for blog, pages, etc.
    },
  ],
],

• Alternatively, disable raw HTML in MDX or strip HTML in headings before rendering.

This will ensure that any HTML in your TOC entries is properly cleaned before being injected.

🧰 Tools
🪛 Biome (2.1.2)

[error] 1-1: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


[error] 1-1: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


[error] 1-1: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


[error] 1-1: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


[error] 1-1: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


[error] 1-1: This variable is used before its declaration.

The variable is declared here:

(lint/correctness/noInvalidUseBeforeDeclaration)


[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)


[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)

🤖 Prompt for AI Agents
In build/assets/js/17896441.26f2d090.js at line 1, the code uses
dangerouslySetInnerHTML to inject TOC heading HTML without sanitization, risking
XSS vulnerabilities. To fix this, update docusaurus.config.js around lines 88–98
by adding a rehype-sanitize plugin to the MDX pipeline in the docs and theme
options. Import rehype-sanitize and include it in the rehypePlugins array
alongside existing plugins like rehypeKatex to sanitize any raw HTML before
rendering. Alternatively, disable raw HTML in MDX or strip HTML from headings
before rendering to ensure safe content injection.

@@ -0,0 +1 @@
"use strict";(self.webpackChunkmorph_doc=self.webpackChunkmorph_doc||[]).push([[8170],{3306:(e,o,r)=>{r.r(o),r.d(o,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var t=r(6070),n=r(1582);const s={title:"Artificial Intelligence",lang:"en-US"},i=void 0,c={id:"build-on-morph/developer-resources/use-ecosystem-developer-tools/artificial-intelligence",title:"Artificial Intelligence",description:"ORA",source:"@site/docs/build-on-morph/developer-resources/use-ecosystem-developer-tools/7-artificial-intelligence.md",sourceDirName:"build-on-morph/developer-resources/use-ecosystem-developer-tools",slug:"/build-on-morph/developer-resources/use-ecosystem-developer-tools/artificial-intelligence",permalink:"/docs/build-on-morph/developer-resources/use-ecosystem-developer-tools/artificial-intelligence",draft:!1,unlisted:!1,editUrl:"https://github.com/morph-l2/morph-doc/tree/main/docs/build-on-morph/developer-resources/use-ecosystem-developer-tools/7-artificial-intelligence.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"Artificial Intelligence",lang:"en-US"},sidebar:"DeveloperSidebar",previous:{title:"Block Explorer",permalink:"/docs/build-on-morph/developer-resources/use-ecosystem-developer-tools/block-explorer"},next:{title:"Decentralized Naming Services",permalink:"/docs/build-on-morph/developer-resources/use-ecosystem-developer-tools/decentralized-naming-services"}},l={},a=[{value:"ORA",id:"ora",level:3}];function d(e){const o={a:"a",h3:"h3",img:"img",p:"p",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.h3,{id:"ora",children:"ORA"}),"\n",(0,t.jsx)(o.p,{children:(0,t.jsx)(o.img,{alt:"ORA",src:r(1078).A+"",width:"2880",height:"1476"})}),"\n",(0,t.jsx)(o.p,{children:"ORA provides chain-agnostic infrastructure that bridges the gap between AI and blockchain."}),"\n",(0,t.jsx)(o.p,{children:"ORA empower developers with the tools necessary to build end-to-end trustless and decentralized applications enhanced by verifiable AI."}),"\n",(0,t.jsxs)(o.p,{children:["You can find the contract addresses to our AI Oracle on Morph ",(0,t.jsx)(o.a,{href:"https://docs.ora.io/doc/ai-oracle/ai-oracle/references#morph-mainnet",children:"here"})]})]})}function p(e={}){const{wrapper:o}={...(0,n.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1078:(e,o,r)=>{r.d(o,{A:()=>t});const t=r.p+"assets/images/biconomy-837b6cf4a7c94f3bf1da46a565cc25e6.png"},1582:(e,o,r)=>{r.d(o,{R:()=>i,x:()=>c});var t=r(758);const n={},s=t.createContext(n);function i(e){const o=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),t.createElement(s.Provider,{value:o},e.children)}}}]); No newline at end of file
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Fix conditional React hook usage in context utility (Rules of Hooks violation)

Same issue in this chunk’s 1582 helper. Apply the unconditional hook refactor as in previous comments.

-const n={},s=t.createContext(n);
-function i(e){const o=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}
-function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),t.createElement(s.Provider,{value:o},e.children)}
+const n={},s=t.createContext(n);
+function i(e){const o=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}
+function c(e){
+  const parent = t.useContext(s);
+  const base = e.disableParentContext ? n : parent;
+  const value = t.useMemo(() => (
+    typeof e.components === "function" ? e.components(base) : {...base, ...(e.components || n)}
+  ), [base, e.components]);
+  return t.createElement(s.Provider,{value},e.children)
+}
📝 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
"use strict";(self.webpackChunkmorph_doc=self.webpackChunkmorph_doc||[]).push([[8170],{3306:(e,o,r)=>{r.r(o),r.d(o,{assets:()=>l,contentTitle:()=>i,default:()=>p,frontMatter:()=>s,metadata:()=>c,toc:()=>a});var t=r(6070),n=r(1582);const s={title:"Artificial Intelligence",lang:"en-US"},i=void 0,c={id:"build-on-morph/developer-resources/use-ecosystem-developer-tools/artificial-intelligence",title:"Artificial Intelligence",description:"ORA",source:"@site/docs/build-on-morph/developer-resources/use-ecosystem-developer-tools/7-artificial-intelligence.md",sourceDirName:"build-on-morph/developer-resources/use-ecosystem-developer-tools",slug:"/build-on-morph/developer-resources/use-ecosystem-developer-tools/artificial-intelligence",permalink:"/docs/build-on-morph/developer-resources/use-ecosystem-developer-tools/artificial-intelligence",draft:!1,unlisted:!1,editUrl:"https://github.com/morph-l2/morph-doc/tree/main/docs/build-on-morph/developer-resources/use-ecosystem-developer-tools/7-artificial-intelligence.md",tags:[],version:"current",sidebarPosition:7,frontMatter:{title:"Artificial Intelligence",lang:"en-US"},sidebar:"DeveloperSidebar",previous:{title:"Block Explorer",permalink:"/docs/build-on-morph/developer-resources/use-ecosystem-developer-tools/block-explorer"},next:{title:"Decentralized Naming Services",permalink:"/docs/build-on-morph/developer-resources/use-ecosystem-developer-tools/decentralized-naming-services"}},l={},a=[{value:"ORA",id:"ora",level:3}];function d(e){const o={a:"a",h3:"h3",img:"img",p:"p",...(0,n.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.h3,{id:"ora",children:"ORA"}),"\n",(0,t.jsx)(o.p,{children:(0,t.jsx)(o.img,{alt:"ORA",src:r(1078).A+"",width:"2880",height:"1476"})}),"\n",(0,t.jsx)(o.p,{children:"ORA provides chain-agnostic infrastructure that bridges the gap between AI and blockchain."}),"\n",(0,t.jsx)(o.p,{children:"ORA empower developers with the tools necessary to build end-to-end trustless and decentralized applications enhanced by verifiable AI."}),"\n",(0,t.jsxs)(o.p,{children:["You can find the contract addresses to our AI Oracle on Morph ",(0,t.jsx)(o.a,{href:"https://docs.ora.io/doc/ai-oracle/ai-oracle/references#morph-mainnet",children:"here"})]})]})}function p(e={}){const{wrapper:o}={...(0,n.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(d,{...e})}):d(e)}},1078:(e,o,r)=>{r.d(o,{A:()=>t});const t=r.p+"assets/images/biconomy-837b6cf4a7c94f3bf1da46a565cc25e6.png"},1582:(e,o,r)=>{r.d(o,{R:()=>i,x:()=>c});var t=r(758);const n={},s=t.createContext(n);function i(e){const o=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function c(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:i(e.components),t.createElement(s.Provider,{value:o},e.children)}}}]);
// In build/assets/js/1f2dc99a.676c8cca.js, module 1582, replace the old `i`/`c` definitions with:
1582:(e,o,r)=>{
r.d(o,{R:()=>i,x:()=>c});
var t = r(758);
const n = {}, s = t.createContext(n);
function i(e) {
const o = t.useContext(s);
return t.useMemo(
() => (typeof e === "function" ? e(o) : { ...o, ...e }),
[o, e]
);
}
function c(e) {
// Always call hooks in the same order:
const parent = t.useContext(s);
const base = e.disableParentContext ? n : parent;
const value = t.useMemo(
() =>
typeof e.components === "function"
? e.components(base)
: { ...base, ...(e.components || n) },
[base, e.components]
);
return t.createElement(s.Provider, { value }, e.children);
}
}
🧰 Tools
🪛 Biome (2.1.2)

[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)


[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)

🤖 Prompt for AI Agents
In build/assets/js/1f2dc99a.676c8cca.js at lines around 1582, the React hook
useContext is used conditionally inside the function i, which violates the Rules
of Hooks. Refactor the function to call useContext unconditionally at the top
level, then apply any conditional logic or merging of components afterward
without calling hooks conditionally. This ensures hooks are always called in the
same order.

@@ -0,0 +1 @@
"use strict";(self.webpackChunkmorph_doc=self.webpackChunkmorph_doc||[]).push([[1394],{7216:(e,o,t)=>{t.r(o),t.d(o,{assets:()=>l,contentTitle:()=>c,default:()=>d,frontMatter:()=>r,metadata:()=>i,toc:()=>a});var n=t(6070),s=t(1582);const r={title:"Account Abstraction",lang:"en-US"},c=void 0,i={id:"build-on-morph/developer-resources/use-ecosystem-developer-tools/account-abstraction",title:"Account Abstraction",description:"Biconomy",source:"@site/docs/build-on-morph/developer-resources/use-ecosystem-developer-tools/3-account-abstraction.md",sourceDirName:"build-on-morph/developer-resources/use-ecosystem-developer-tools",slug:"/build-on-morph/developer-resources/use-ecosystem-developer-tools/account-abstraction",permalink:"/docs/build-on-morph/developer-resources/use-ecosystem-developer-tools/account-abstraction",draft:!1,unlisted:!1,editUrl:"https://github.com/morph-l2/morph-doc/tree/main/docs/build-on-morph/developer-resources/use-ecosystem-developer-tools/3-account-abstraction.md",tags:[],version:"current",sidebarPosition:3,frontMatter:{title:"Account Abstraction",lang:"en-US"},sidebar:"DeveloperSidebar",previous:{title:"RPC Services",permalink:"/docs/build-on-morph/developer-resources/use-ecosystem-developer-tools/rpc-services"},next:{title:"Blockchain Indexing Services",permalink:"/docs/build-on-morph/developer-resources/use-ecosystem-developer-tools/blockchain-indexing-services"}},l={},a=[{value:"Biconomy",id:"biconomy",level:3}];function u(e){const o={a:"a",h3:"h3",img:"img",p:"p",...(0,s.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(o.h3,{id:"biconomy",children:"Biconomy"}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.img,{alt:"biconomy",src:t(1078).A+"",width:"2880",height:"1476"})}),"\n",(0,n.jsx)(o.p,{children:"The Biconomy SDK is an Account Abstraction toolkit that enables the simplest UX on your dApp, wallet, or appchain. Built on top of ERC 4337, Biconomy offer a full-stack solution for tapping into the power of our Smart Accounts Platform, Paymasters, and Bundlers."}),"\n",(0,n.jsx)(o.p,{children:"Biconomy is live on Morph Mainnet."}),"\n",(0,n.jsx)(o.p,{children:(0,n.jsx)(o.a,{href:"https://docs.biconomy.io/smartAccountsV2/quickstart-react",children:"Integration Documentation"})})]})}function d(e={}){const{wrapper:o}={...(0,s.R)(),...e.components};return o?(0,n.jsx)(o,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},1078:(e,o,t)=>{t.d(o,{A:()=>n});const n=t.p+"assets/images/biconomy-837b6cf4a7c94f3bf1da46a565cc25e6.png"},1582:(e,o,t)=>{t.d(o,{R:()=>c,x:()=>i});var n=t(758);const s={},r=n.createContext(s);function c(e){const o=n.useContext(r);return n.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function i(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),n.createElement(r.Provider,{value:o},e.children)}}}]); No newline at end of file
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Generated artefact checked in

Same concern: exclude build output from Git.

🧰 Tools
🪛 Biome (2.1.2)

[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)


[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)

🤖 Prompt for AI Agents
In build/assets/js/5c242b2e.a21dcfac.js at line 1, the generated build output
file is included in the Git repository, which should be avoided. To fix this,
add the appropriate build output directory or file pattern (such as
build/assets/js/*.js) to the .gitignore file to prevent committing generated
artifacts. Then remove this file from the repository history if already
committed.

@@ -0,0 +1 @@
"use strict";(self.webpackChunkmorph_doc=self.webpackChunkmorph_doc||[]).push([[3147],{365:(e,o,n)=>{n.r(o),n.d(o,{assets:()=>a,contentTitle:()=>i,default:()=>h,frontMatter:()=>s,metadata:()=>d,toc:()=>l});var t=n(6070),r=n(1582);const s={title:"Prune State",lang:"en-US"},i=void 0,d={id:"build-on-morph/developer-resources/node-operation/prune-state",title:"Prune State",description:"The performance of a full node will degrade when the storage size reaches a high volume. We suggest that the fullnode always keep light storage by pruning the storage.",source:"@site/docs/build-on-morph/developer-resources/node-operation/1-prune-state.md",sourceDirName:"build-on-morph/developer-resources/node-operation",slug:"/build-on-morph/developer-resources/node-operation/prune-state",permalink:"/docs/build-on-morph/developer-resources/node-operation/prune-state",draft:!1,unlisted:!1,editUrl:"https://github.com/morph-l2/morph-doc/tree/main/docs/build-on-morph/developer-resources/node-operation/1-prune-state.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Prune State",lang:"en-US"},sidebar:"DeveloperSidebar",previous:{title:"Upgrade node running on the host",permalink:"/docs/build-on-morph/developer-resources/node-operation/upgrade-node/upgrade-node-host"},next:{title:"Contract Addresses",permalink:"/docs/build-on-morph/developer-resources/contracts"}},a={},l=[{value:"How to Prune",id:"how-to-prune",level:3}];function u(e){const o={admonition:"admonition",code:"code",h3:"h3",li:"li",ol:"ol",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.p,{children:"The performance of a full node will degrade when the storage size reaches a high volume. We suggest that the fullnode always keep light storage by pruning the storage."}),"\n",(0,t.jsx)(o.h3,{id:"how-to-prune",children:"How to Prune"}),"\n",(0,t.jsxs)(o.ol,{children:["\n",(0,t.jsx)(o.li,{children:"Stop the node, including the consensus client(morphnode) and the execution client(geth)"}),"\n",(0,t.jsxs)(o.li,{children:["Run ",(0,t.jsx)(o.code,{children:'nohup geth snapshot prune-zk-state --datadir "$GETH_DB_DIR" > prune.log &'}),". It will take 5~7 hours to finish."]}),"\n",(0,t.jsx)(o.li,{children:"Start the node once it is done."}),"\n"]}),"\n",(0,t.jsxs)(o.p,{children:["The hardware is important, ",(0,t.jsx)(o.strong,{children:"make sure the SSD meets: solid-state drive(SSD), 8k IOPS, 500 MB/S throughput, read latency < 1ms."})]}),"\n",(0,t.jsx)(o.admonition,{type:"note",children:(0,t.jsx)(o.p,{children:"To prune a Geth node at least 200 GB of free disk space is recommended. This means pruning cannot be used to save a hard drive that has been completely filled. A good rule of thumb is to prune before the node fills ~80% of the available disk space."})})]})}function h(e={}){const{wrapper:o}={...(0,r.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(u,{...e})}):u(e)}},1582:(e,o,n)=>{n.d(o,{R:()=>i,x:()=>d});var t=n(758);const r={},s=t.createContext(r);function i(e){const o=t.useContext(s);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function d(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(s.Provider,{value:o},e.children)}}}]); No newline at end of file
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

⚠️ Potential issue

Fix conditional hook invocation in MDX context provider (rules-of-hooks violation).

Static analysis is correct: the MDX context helper (module 1582) conditionally calls a function that uses React hooks (useContext/useMemo). Hooks must be invoked unconditionally on every render. Refactor so the hook is always called, and move the conditional merge inside the memo.

Example (apply in the source MDX context utility, not in the compiled asset):

// BEFORE (simplified)
function useMDXComponents(components) {
  const parent = React.useContext(Context);
  return React.useMemo(() => typeof components === 'function' ? components(parent) : { ...parent, ...components }, [parent, components]);
}
function MDXProvider(props) {
  let value;
  if (props.disableParentContext) {
    value = typeof props.components === 'function' ? props.components({}) : (props.components || {});
  } else {
    value = useMDXComponents(props.components); // Hook called conditionally
  }
  return <Context.Provider value={value}>{props.children}</Context.Provider>;
}

// AFTER (hooks always called)
function useResolvedComponents(props) {
  const parent = React.useContext(Context); // always called
  return React.useMemo(() => {
    const incoming = typeof props.components === 'function' ? props.components({}) : (props.components || {});
    return props.disableParentContext ? incoming : { ...parent, ...incoming };
  }, [parent, props.components, props.disableParentContext]);
}
function MDXProvider(props) {
  const value = useResolvedComponents(props); // unconditionally calls hook
  return <Context.Provider value={value}>{props.children}</Context.Provider>;
}
🧰 Tools
🪛 Biome (2.1.2)

[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)


[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)

🤖 Prompt for AI Agents
In build/assets/js/5d313dc3.562fab67.js at lines 1 to 1, the MDX context
provider conditionally calls a hook, violating React's rules of hooks. Refactor
the MDX context utility so that the hook (useContext and useMemo) is always
called unconditionally on every render. Move the conditional logic that merges
or replaces components inside the memoized function, ensuring hooks are never
called conditionally.

@@ -0,0 +1 @@
"use strict";(self.webpackChunkmorph_doc=self.webpackChunkmorph_doc||[]).push([[44],{3264:(e,o,r)=>{r.r(o),r.d(o,{assets:()=>l,contentTitle:()=>c,default:()=>d,frontMatter:()=>n,metadata:()=>s,toc:()=>p});var t=r(6070),i=r(1582);const n={title:"Introduction",lang:"en-US",keywords:["morph","ethereum","rollup","layer2","validity proof","optimistic zk-rollup"],description:"Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!"},c=void 0,s={id:"how-morph-works/intro",title:"Introduction",description:"Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!",source:"@site/docs/how-morph-works/1-intro.md",sourceDirName:"how-morph-works",slug:"/how-morph-works/intro",permalink:"/docs/how-morph-works/intro",draft:!1,unlisted:!1,editUrl:"https://github.com/morph-l2/morph-doc/tree/main/docs/how-morph-works/1-intro.md",tags:[],version:"current",sidebarPosition:1,frontMatter:{title:"Introduction",lang:"en-US",keywords:["morph","ethereum","rollup","layer2","validity proof","optimistic zk-rollup"],description:"Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!"}},l={},p=[];function h(e){const o={li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(o.p,{children:"This section provides an overview of Morph\u2019s protocol architecture, including:"}),"\n",(0,t.jsxs)(o.ul,{children:["\n",(0,t.jsx)(o.li,{children:"The Decentralized Sequencer Network"}),"\n",(0,t.jsx)(o.li,{children:"Optimistic zkEVM & Responsive Validity Proof (RVP)"}),"\n",(0,t.jsx)(o.li,{children:"Morph's Modular Architecture"}),"\n",(0,t.jsx)(o.li,{children:"General Protocol Design"}),"\n"]})]})}function d(e={}){const{wrapper:o}={...(0,i.R)(),...e.components};return o?(0,t.jsx)(o,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},1582:(e,o,r)=>{r.d(o,{R:()=>c,x:()=>s});var t=r(758);const i={},n=t.createContext(i);function c(e){const o=t.useContext(n);return t.useMemo((function(){return"function"==typeof e?e(o):{...o,...e}}),[o,e])}function s(e){let o;return o=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:c(e.components),t.createElement(n.Provider,{value:o},e.children)}}}]); No newline at end of file
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Please drop compiled bundles from the repo

build/assets/js/** contains Webpack output. Committing generated artefacts bloats the diff, makes reviews meaningless (minified code), and frequently causes merge-conflicts. Publish them with your CI/CD pipeline instead and keep the repository source-only.

🧰 Tools
🪛 Biome (2.1.2)

[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)


[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)

🤖 Prompt for AI Agents
In build/assets/js/60479fa4.69d66973.js at line 1, the file is a compiled
Webpack bundle which should not be committed to the repository. Remove this
generated file from the repo and add the build/assets/js/ directory or relevant
patterns to the .gitignore file to prevent committing compiled bundles. Instead,
configure your CI/CD pipeline to generate and publish these assets during
deployment.

@@ -0,0 +1 @@
"use strict";(self.webpackChunkmorph_doc=self.webpackChunkmorph_doc||[]).push([[7049],{96:(e,t,i)=>{i.r(t),i.d(t,{assets:()=>c,contentTitle:()=>a,default:()=>h,frontMatter:()=>r,metadata:()=>o,toc:()=>l});var s=i(6070),n=i(1582);const r={title:"Bridge",lang:"en-US",keywords:["morph","ethereum","rollup","layer2","validity proof","optimistic zk-rollup"],description:"Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!"},a=void 0,o={id:"quick-start/bridge",title:"Bridge",description:"Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!",source:"@site/docs/quick-start/4-bridge.md",sourceDirName:"quick-start",slug:"/quick-start/bridge",permalink:"/docs/quick-start/bridge",draft:!1,unlisted:!1,editUrl:"https://github.com/morph-l2/morph-doc/tree/main/docs/quick-start/4-bridge.md",tags:[],version:"current",sidebarPosition:4,frontMatter:{title:"Bridge",lang:"en-US",keywords:["morph","ethereum","rollup","layer2","validity proof","optimistic zk-rollup"],description:"Upgrade your blockchain experience with Morph - the secure decentralized, cost0efficient, and high-performing optimistic zk-rollup solution. Try it now!"},sidebar:"DeveloperSidebar",previous:{title:"Faucet",permalink:"/docs/quick-start/faucet"},next:{title:"Build on Morph",permalink:"/docs/build-on-morph/developer-navigation-page"}},c={},l=[{value:"Deposit from Ethereum to Morph Mainnet",id:"deposit-from-ethereum-to-morph-mainnet",level:2},{value:"Instructions:",id:"instructions",level:2},{value:"How long does it take for a token to arrive to Morph Testnet ?",id:"how-long-does-it-take-for-a-token-to-arrive-to-morph-testnet-",level:2},{value:"Initiate withdrawal",id:"initiate-withdrawal",level:2},{value:"Waiting for the verification challenge period",id:"waiting-for-the-verification-challenge-period",level:2},{value:"Claim the Withdrawal",id:"claim-the-withdrawal",level:2}];function d(e){const t={a:"a",admonition:"admonition",em:"em",h1:"h1",h2:"h2",img:"img",li:"li",ol:"ol",p:"p",strong:"strong",...(0,n.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(t.h2,{id:"deposit-from-ethereum-to-morph-mainnet",children:"Deposit from Ethereum to Morph Mainnet"}),"\n",(0,s.jsxs)(t.p,{children:["Please refer to the ",(0,s.jsx)(t.a,{href:"https://morph.ghost.io/how-to-bridge-eth-to-morph-official-bridge/",children:"Morph Season 2 - Bridge Guide."})]}),"\n",(0,s.jsx)(t.h1,{id:"deposit-from-ethereum-holesky-to-morph-testnet",children:"Deposit from Ethereum Holesky to Morph Testnet"}),"\n",(0,s.jsx)(t.h2,{id:"instructions",children:"Instructions:"}),"\n",(0,s.jsx)(t.admonition,{title:"Use the bridge here",type:"tip",children:(0,s.jsx)(t.p,{children:(0,s.jsx)(t.a,{href:"https://bridge-holesky.morphl2.io",children:"https://bridge-holesky.morphl2.io"})})}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["Open your MetaMask wallet and switch to the ",(0,s.jsx)(t.strong,{children:"Holesky"})," network."]}),"\n"]}),"\n",(0,s.jsxs)(t.p,{children:[(0,s.jsx)(t.img,{alt:"image1",src:i(8280).A+"",width:"2556",height:"1052"}),"\n",(0,s.jsx)(t.img,{alt:"image1",src:i(2771).A+"",width:"1830",height:"1278"})]}),"\n",(0,s.jsxs)(t.ol,{start:"2",children:["\n",(0,s.jsxs)(t.li,{children:["Within Morph\u2019s Bridge app, click ",(0,s.jsx)(t.strong,{children:"Connect wallet"}),", select MetaMask, and approve the connection if prompted."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image2",src:i(7562).A+"",width:"2588",height:"1288"})}),"\n",(0,s.jsxs)(t.ol,{start:"3",children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsxs)(t.p,{children:["Make sure that ",(0,s.jsx)(t.strong,{children:"Holesky"}),' is selected under \u2018From\u2019 and Morph L2 under \u2018To\u2019. If not, click the "\u2193" button to switch their positions.']}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Select the token that you want to transfer."}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Click the Send button to initiate the deposit."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.admonition,{type:"tip",children:(0,s.jsxs)(t.p,{children:["If this is your first time transferring an ERC20 token, you need to approve the ",(0,s.jsx)(t.strong,{children:"Holesky"})," Bridge contract to access your ERC20 token."]})}),"\n",(0,s.jsxs)(t.ol,{start:"6",children:["\n",(0,s.jsxs)(t.li,{children:["A window will pop up asking for confirmation of the transfer transaction, click ",(0,s.jsx)(t.strong,{children:"Deposit"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image3",src:i(2229).A+"",width:"1302",height:"1268"})}),"\n",(0,s.jsxs)(t.ol,{start:"7",children:["\n",(0,s.jsxs)(t.li,{children:["Click the Confirm button in MetaMask. Once the transfer transaction is finalized, the token will be deducted from your ",(0,s.jsx)(t.strong,{children:"Holesky"})," wallet address."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image5",src:i(9164).A+"",width:"1964",height:"1312"})}),"\n",(0,s.jsxs)(t.ol,{start:"8",children:["\n",(0,s.jsx)(t.li,{children:"While you wait, you can check status of your transactions by clicking on the transactions button."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image6",src:i(3447).A+"",width:"1386",height:"1132"})}),"\n",(0,s.jsx)(t.h2,{id:"how-long-does-it-take-for-a-token-to-arrive-to-morph-testnet-",children:"How long does it take for a token to arrive to Morph Testnet ?"}),"\n",(0,s.jsxs)(t.p,{children:["A token transfer from ",(0,s.jsx)(t.strong,{children:"Holesky"})," to Morph Testnet may take 8 to 14 minutes (time for block to become Safe on ",(0,s.jsx)(t.strong,{children:"Holesky"}),") before it appears in your Morph wallet. To check the progress of your deposit transactions, follow these steps:"]}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Click your wallet address at the top-right corner of the Bridge web app."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image6",src:i(430).A+"",width:"2580",height:"1072"})}),"\n",(0,s.jsxs)(t.ol,{start:"2",children:["\n",(0,s.jsx)(t.li,{children:"Click on Transactions. A pop-up panel will display your recent transactions."}),"\n"]}),"\n",(0,s.jsx)(t.admonition,{type:"tip",children:(0,s.jsxs)(t.p,{children:["Note: For deposit transactions (L1 -> L2), once your transaction is confirmed as Safe on ",(0,s.jsx)(t.strong,{children:"Holesky"})," (8 to 14 minutes), you will see a ",(0,s.jsx)(t.strong,{children:"Success"})," status. Your funds will then be relayed to L2."]})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image8",src:i(9817).A+"",width:"1712",height:"1258"})}),"\n",(0,s.jsxs)(t.ol,{start:"3",children:["\n",(0,s.jsxs)(t.li,{children:["Click on the most recent ",(0,s.jsx)(t.strong,{children:"Holesky"})," transaction hash."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image9",src:i(2912).A+"",width:"1674",height:"1202"})}),"\n",(0,s.jsxs)(t.ol,{start:"4",children:["\n",(0,s.jsxs)(t.li,{children:["You will be taken to a Transaction Details page in the Explorer. Verify your transaction status (this transaction is confirmed on ",(0,s.jsx)(t.strong,{children:"Holesky"}),")."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image10",src:i(8697).A+"",width:"2808",height:"1340"})}),"\n",(0,s.jsxs)(t.ol,{start:"5",children:["\n",(0,s.jsxs)(t.li,{children:["Once your transaction status shows ",(0,s.jsx)(t.em,{children:"success"})," on L2, return to the Bridge app to see a transaction hash and funds in your Morph L2 wallet."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image11",src:i(95).A+"",width:"1602",height:"1216"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image12",src:i(5604).A+"",width:"2578",height:"1316"})}),"\n",(0,s.jsx)(t.h1,{id:"withdraw-from-morph-testnet-to-holesky",children:"Withdraw from Morph Testnet to Holesky"}),"\n",(0,s.jsx)(t.p,{children:"To withdraw funds from Morph Testnet, follow these steps:"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsx)(t.li,{children:"Initiate the withdrawal on Morph Testnet."}),"\n",(0,s.jsxs)(t.li,{children:["Wait for the withdrawal root to be published on L1 (",(0,s.jsx)(t.strong,{children:"Holesky"}),"). This usually takes a few minutes, but it may take longer during outages."]}),"\n",(0,s.jsx)(t.li,{children:"Prove withdrawal."}),"\n",(0,s.jsxs)(t.li,{children:["Wait for the verification challenge period, which lasts seven days from the time the withdrawal is proven on L1 (",(0,s.jsx)(t.strong,{children:"Holesky"}),")."]}),"\n",(0,s.jsx)(t.li,{children:"Claim your withdrawal."}),"\n"]}),"\n",(0,s.jsx)(t.h2,{id:"initiate-withdrawal",children:"Initiate withdrawal"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Click Connect Wallet and select MetaMask. If prompted, approve the connection in your wallet."}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Select Withdraw. Choose the asset and amount you wish to withdraw."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image13",src:i(2285).A+"",width:"2616",height:"1382"})}),"\n",(0,s.jsxs)(t.ol,{start:"3",children:["\n",(0,s.jsxs)(t.li,{children:["Click Send ETH to ",(0,s.jsx)(t.strong,{children:"Holesky"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image14",src:i(4386).A+"",width:"2642",height:"1350"})}),"\n",(0,s.jsxs)(t.ol,{start:"4",children:["\n",(0,s.jsxs)(t.li,{children:["Click Initiate withdrawal, wait for a few minutes to confirm. After it is finished, you need to switch the network in your wallet and then prove the withdrawal on ",(0,s.jsx)(t.strong,{children:"Holesky"}),"."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image15",src:i(5515).A+"",width:"1372",height:"1356"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image16",src:i(7872).A+"",width:"1976",height:"1388"})}),"\n",(0,s.jsxs)(t.ol,{start:"5",children:["\n",(0,s.jsx)(t.li,{children:"Waiting for the batch submission to be completed."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image17",src:i(4121).A+"",width:"1678",height:"1348"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image18",src:i(8558).A+"",width:"2380",height:"1342"})}),"\n",(0,s.jsx)(t.h2,{id:"waiting-for-the-verification-challenge-period",children:"Waiting for the verification challenge period"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Click your address in the top right corner."}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Click Transactions and then Withdrawals. This will display a list of your recent withdrawals and their status. Or you can find a notice in the top area, by clicking the button View Account (see the pic below)."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image19",src:i(7783).A+"",width:"2640",height:"1332"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image20",src:i(4631).A+"",width:"1880",height:"1354"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image21",src:i(5134).A+"",width:"1852",height:"996"})}),"\n",(0,s.jsxs)(t.ol,{start:"3",children:["\n",(0,s.jsx)(t.li,{children:"You can search for the transaction hash on Morph Explorer."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image22",src:i(5346).A+"",width:"1796",height:"1282"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image23",src:i(7052).A+"",width:"2768",height:"1366"})}),"\n",(0,s.jsxs)(t.ol,{start:"4",children:["\n",(0,s.jsxs)(t.li,{children:["Click the L1 State Root Submission Tx to see when the transaction was written to L1 (",(0,s.jsx)(t.strong,{children:"Holesky"}),")."]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image24",src:i(6832).A+"",width:"1436",height:"1360"})}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image25",src:i(2538).A+"",width:"2804",height:"1358"})}),"\n",(0,s.jsx)(t.h2,{id:"claim-the-withdrawal",children:"Claim the Withdrawal"}),"\n",(0,s.jsxs)(t.ol,{children:["\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Once the challenge period is over, the status will change to Claim."}),"\n"]}),"\n",(0,s.jsxs)(t.li,{children:["\n",(0,s.jsx)(t.p,{children:"Click Claim withdrawal."}),"\n"]}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image26",src:i(9969).A+"",width:"2206",height:"1354"})}),"\n",(0,s.jsxs)(t.ol,{start:"3",children:["\n",(0,s.jsx)(t.li,{children:"Confirm the withdrawal in the wallet."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image27",src:i(2488).A+"",width:"2264",height:"1348"})}),"\n",(0,s.jsxs)(t.ol,{start:"4",children:["\n",(0,s.jsx)(t.li,{children:"Wait until the withdrawal is completed."}),"\n"]}),"\n",(0,s.jsx)(t.p,{children:(0,s.jsx)(t.img,{alt:"image28",src:i(3647).A+"",width:"1642",height:"1198"})})]})}function h(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},8280:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/01-27c2bb7d636a043d7e9859ebb561ba98.png"},2771:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/02-a0499364bd8da9980f211fea46b17ec1.png"},7562:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/03-c1219d2dc11ccb23f6043454dce9a2a1.png"},2229:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/04-40bfbd2ff4078468d5c5de03ce00125a.png"},9164:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/05-5906b94018c7589aa9c344af312053a6.png"},3447:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/06-32a22c9b9717a8dbbb8f80d04883e82c.png"},430:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/07-c39cf238bd5f1deaa6b66c55c3232c3e.png"},9817:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/08-2b75b7405e667c0a4ed326be801fdcbe.png"},2912:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/09-8820ab91b63c915f3d5988102715c995.png"},8697:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/10-22bdf9fc91c5cf629702a9b651d92b72.png"},95:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/11-4ed536df5ccab515473817e33da2ffb5.png"},5604:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/12-689f052e4e05db6cd8619f0a89b59bec.png"},2285:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/13-dfc7aa5bd7cc571ffed44adadfed733e.png"},4386:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/14-073db2dbe7b98001dd879cf588200ab2.png"},5515:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/15-d71cb25489e0f745d61b4d0572448e53.png"},7872:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/16-8d5a6c2144ac9e120f115e876ca15585.png"},4121:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/17-bdc095149fa2ee4c57adca17afe51ca2.png"},8558:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/18-34ab2ce5edad2dd1d8e8dbedbe8f7e46.png"},7783:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/19-48a3d1813850255cd74a906d9f1c91a3.png"},4631:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/20-1f256a3865f337d6c591d0014665770d.png"},5134:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/21-aa2ebc001ed51cd738a38ed8c7cbe1ed.png"},5346:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/22-0c7c91c0d8518e4c85479aa7c0a3a5b5.png"},7052:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/23-173e326fab8effac22e791dfeeefa625.png"},6832:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/24-2e2eeb94c0330ccd9a2afb58ac75b8e9.png"},2538:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/25-e2de55a3cc831069b95f71de2478a8d8.png"},9969:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/26-9ab4dc9cf17d1b6cc93d11743824f3c9.png"},2488:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/27-1832e352f87b6354eaa7ad6830abefea.png"},3647:(e,t,i)=>{i.d(t,{A:()=>s});const s=i.p+"assets/images/28-ca053a5f739981b7b18302d6db12669d.png"},1582:(e,t,i)=>{i.d(t,{R:()=>a,x:()=>o});var s=i(758);const n={},r=s.createContext(n);function a(e){const t=s.useContext(r);return s.useMemo((function(){return"function"==typeof e?e(t):{...t,...e}}),[t,e])}function o(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:a(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); No newline at end of file
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Fix heading hierarchy and improve image accessibility.

  • The page goes from an h2 to an h1 (“Deposit from Ethereum Holesky to Morph Testnet”), which breaks semantic heading order and harms a11y. Use h2+h3 sequence instead (or make both sections h2).
  • Image alt texts like “image1”, “image2” are not descriptive. Replace with meaningful alt text.

Suggested edits in docs/quick-start/4-bridge.md:

-## Deposit from Ethereum to Morph Mainnet
-# Deposit from Ethereum Holesky to Morph Testnet
+## Deposit from Ethereum to Morph Mainnet
+## Deposit from Ethereum Holesky to Morph Testnet
-![image1](...01.png)
+![MetaMask network selector showing Holesky selected](...01.png)
-![image2](...02.png)
+![Morph Bridge connect wallet dialog with MetaMask option](...02.png)

Committable suggestion skipped: line range outside the PR's diff.

🧰 Tools
🪛 Biome (2.1.2)

[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)


[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)

🤖 Prompt for AI Agents
In build/assets/js/6f5ac92b.3d93dd47.js at line 1, fix the heading hierarchy by
changing the h1 heading "Deposit from Ethereum Holesky to Morph Testnet" to an
h3 or h2 to maintain proper semantic order after the preceding h2. Also, update
all image alt attributes from generic texts like "image1", "image2" to
descriptive, meaningful alt texts that accurately describe the image content for
better accessibility.

@@ -1 +1 @@
"use strict";(self.webpackChunkmorph_doc=self.webpackChunkmorph_doc||[]).push([[5130],{9215:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>a,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var r=s(3274),t=s(2333);const o={},c="Interface: OEContractsLike",i={id:"build-on-morph/sdk/interfaces/OEContractsLike",title:"OEContractsLike",description:"@morph-l2/sdk \u2022 Docs",source:"@site/docs/build-on-morph/sdk/interfaces/OEContractsLike.md",sourceDirName:"build-on-morph/sdk/interfaces",slug:"/build-on-morph/sdk/interfaces/OEContractsLike",permalink:"/docs/build-on-morph/sdk/interfaces/OEContractsLike",draft:!1,unlisted:!1,editUrl:"https://github.com/morph-l2/morph-doc/tree/main/docs/build-on-morph/sdk/interfaces/OEContractsLike.md",tags:[],version:"current",frontMatter:{}},l={},d=[{value:"Properties",id:"properties",level:2},{value:"l1",id:"l1",level:3},{value:"Source",id:"source",level:4},{value:"l2",id:"l2",level:3},{value:"Source",id:"source-1",level:4}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",hr:"hr",p:"p",strong:"strong",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/docs/build-on-morph/sdk/globals",children:(0,r.jsx)(n.strong,{children:"@morph-l2/sdk"})})," \u2022 ",(0,r.jsx)(n.strong,{children:"Docs"})]}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/docs/build-on-morph/sdk/globals",children:"@morph-l2/sdk"})," / OEContractsLike"]}),"\n",(0,r.jsx)(n.h1,{id:"interface-oecontractslike",children:"Interface: OEContractsLike"}),"\n",(0,r.jsx)(n.p,{children:"Convenience type for something that looks like the OE contract interface but could be\naddresses instead of actual contract objects."}),"\n",(0,r.jsx)(n.h2,{id:"properties",children:"Properties"}),"\n",(0,r.jsx)(n.h3,{id:"l1",children:"l1"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"l1"}),": ",(0,r.jsx)(n.a,{href:"/docs/build-on-morph/sdk/type-aliases/OEL1ContractsLike",children:(0,r.jsx)(n.code,{children:"OEL1ContractsLike"})})]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"source",children:"Source"}),"\n",(0,r.jsx)(n.p,{children:"src/interfaces/types.ts:146"}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsx)(n.h3,{id:"l2",children:"l2"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"l2"}),": ",(0,r.jsx)(n.a,{href:"/docs/build-on-morph/sdk/type-aliases/OEL2ContractsLike",children:(0,r.jsx)(n.code,{children:"OEL2ContractsLike"})})]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"source-1",children:"Source"}),"\n",(0,r.jsx)(n.p,{children:"src/interfaces/types.ts:147"})]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},2333:(e,n,s)=>{s.d(n,{R:()=>c,x:()=>i});var r=s(9474);const t={},o=r.createContext(t);function c(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); No newline at end of file
"use strict";(self.webpackChunkmorph_doc=self.webpackChunkmorph_doc||[]).push([[5130],{2205:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>a,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var r=s(6070),t=s(1582);const o={},c="Interface: OEContractsLike",i={id:"build-on-morph/sdk/interfaces/OEContractsLike",title:"OEContractsLike",description:"@morph-l2/sdk \u2022 Docs",source:"@site/docs/build-on-morph/sdk/interfaces/OEContractsLike.md",sourceDirName:"build-on-morph/sdk/interfaces",slug:"/build-on-morph/sdk/interfaces/OEContractsLike",permalink:"/docs/build-on-morph/sdk/interfaces/OEContractsLike",draft:!1,unlisted:!1,editUrl:"https://github.com/morph-l2/morph-doc/tree/main/docs/build-on-morph/sdk/interfaces/OEContractsLike.md",tags:[],version:"current",frontMatter:{}},l={},d=[{value:"Properties",id:"properties",level:2},{value:"l1",id:"l1",level:3},{value:"Source",id:"source",level:4},{value:"l2",id:"l2",level:3},{value:"Source",id:"source-1",level:4}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",hr:"hr",p:"p",strong:"strong",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/docs/build-on-morph/sdk/globals",children:(0,r.jsx)(n.strong,{children:"@morph-l2/sdk"})})," \u2022 ",(0,r.jsx)(n.strong,{children:"Docs"})]}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/docs/build-on-morph/sdk/globals",children:"@morph-l2/sdk"})," / OEContractsLike"]}),"\n",(0,r.jsx)(n.h1,{id:"interface-oecontractslike",children:"Interface: OEContractsLike"}),"\n",(0,r.jsx)(n.p,{children:"Convenience type for something that looks like the OE contract interface but could be\naddresses instead of actual contract objects."}),"\n",(0,r.jsx)(n.h2,{id:"properties",children:"Properties"}),"\n",(0,r.jsx)(n.h3,{id:"l1",children:"l1"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"l1"}),": ",(0,r.jsx)(n.a,{href:"/docs/build-on-morph/sdk/type-aliases/OEL1ContractsLike",children:(0,r.jsx)(n.code,{children:"OEL1ContractsLike"})})]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"source",children:"Source"}),"\n",(0,r.jsx)(n.p,{children:"src/interfaces/types.ts:146"}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsx)(n.h3,{id:"l2",children:"l2"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"l2"}),": ",(0,r.jsx)(n.a,{href:"/docs/build-on-morph/sdk/type-aliases/OEL2ContractsLike",children:(0,r.jsx)(n.code,{children:"OEL2ContractsLike"})})]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"source-1",children:"Source"}),"\n",(0,r.jsx)(n.p,{children:"src/interfaces/types.ts:147"})]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},1582:(e,n,s)=>{s.d(n,{R:()=>c,x:()=>i});var r=s(758);const t={},o=r.createContext(t);function c(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]); No newline at end of file
Copy link

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Biome hook warnings are false positives on bundled/minified output; exclude build artifacts from linting.

This file is a compiled bundle (minified MDX/React). Hook-order checks don’t apply here. Recommend excluding build/** from linters and code review to avoid noise.

Run to see if Biome/Eslint already ignore build artifacts, and where to add ignores if not:


🏁 Script executed:

#!/bin/bash
set -euo pipefail

echo "Looking for Biome config..."
fd -a -HI 'biome.*' || true
fd -a -HI '.biome.*' || true

echo "Looking for ESLint config..."
fd -a -HI '.eslintrc*' || true

echo "Looking for package.json scripts referencing biome/eslint..."
if [ -f package.json ]; then
  cat package.json | jq '.scripts'
fi

echo "Search for ignore patterns mentioning build/"
rg -n --hidden --no-ignore-global 'build/' || true

echo "If Biome is used, consider adding to its config (example):"
cat <<'EXAMPLE'
{
  "$schema": "https://biomejs.dev/schemas/1.7.0/schema.json",
  "linter": { "enabled": true },
  "files": {
    "ignore": [
      "build/**",
      "dist/**"
    ]
  }
}
EXAMPLE

Length of output: 61137


🏁 Script executed:

#!/bin/bash
# Check biome.json for ignore settings
cat biome.json

Length of output: 1791


Exclude compiled bundles from Biome linting

The build/** directory contains minified MDX/React bundles that trigger spurious hook-order warnings. Since Biome doesn’t yet ignore these files, please update your config to silence noise:

• File: biome.json
Add an ignore section so the linter skips build/ (and dist/ if used).

Suggested diff:

 {
   "$schema": "https://biomejs.dev/schemas/2.1.2/schema.json",
   "formatter": { "enabled": false },
   "linter": { /* …existing rules… */ },
+  "files": {
+    "ignore": [
+      "build/**",
+      "dist/**"
+    ]
+  },
   "css": { /* … */ },
   "javascript": { /* … */ }
 }

If you prefer a standalone ignore file, you can also create .biomeignore at repo root with:

build/
dist/
📝 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
"use strict";(self.webpackChunkmorph_doc=self.webpackChunkmorph_doc||[]).push([[5130],{2205:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>a,frontMatter:()=>o,metadata:()=>i,toc:()=>d});var r=s(6070),t=s(1582);const o={},c="Interface: OEContractsLike",i={id:"build-on-morph/sdk/interfaces/OEContractsLike",title:"OEContractsLike",description:"@morph-l2/sdk \u2022 Docs",source:"@site/docs/build-on-morph/sdk/interfaces/OEContractsLike.md",sourceDirName:"build-on-morph/sdk/interfaces",slug:"/build-on-morph/sdk/interfaces/OEContractsLike",permalink:"/docs/build-on-morph/sdk/interfaces/OEContractsLike",draft:!1,unlisted:!1,editUrl:"https://github.com/morph-l2/morph-doc/tree/main/docs/build-on-morph/sdk/interfaces/OEContractsLike.md",tags:[],version:"current",frontMatter:{}},l={},d=[{value:"Properties",id:"properties",level:2},{value:"l1",id:"l1",level:3},{value:"Source",id:"source",level:4},{value:"l2",id:"l2",level:3},{value:"Source",id:"source-1",level:4}];function h(e){const n={a:"a",blockquote:"blockquote",code:"code",h1:"h1",h2:"h2",h3:"h3",h4:"h4",hr:"hr",p:"p",strong:"strong",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/docs/build-on-morph/sdk/globals",children:(0,r.jsx)(n.strong,{children:"@morph-l2/sdk"})})," \u2022 ",(0,r.jsx)(n.strong,{children:"Docs"})]}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.a,{href:"/docs/build-on-morph/sdk/globals",children:"@morph-l2/sdk"})," / OEContractsLike"]}),"\n",(0,r.jsx)(n.h1,{id:"interface-oecontractslike",children:"Interface: OEContractsLike"}),"\n",(0,r.jsx)(n.p,{children:"Convenience type for something that looks like the OE contract interface but could be\naddresses instead of actual contract objects."}),"\n",(0,r.jsx)(n.h2,{id:"properties",children:"Properties"}),"\n",(0,r.jsx)(n.h3,{id:"l1",children:"l1"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"l1"}),": ",(0,r.jsx)(n.a,{href:"/docs/build-on-morph/sdk/type-aliases/OEL1ContractsLike",children:(0,r.jsx)(n.code,{children:"OEL1ContractsLike"})})]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"source",children:"Source"}),"\n",(0,r.jsx)(n.p,{children:"src/interfaces/types.ts:146"}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsx)(n.h3,{id:"l2",children:"l2"}),"\n",(0,r.jsxs)(n.blockquote,{children:["\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"l2"}),": ",(0,r.jsx)(n.a,{href:"/docs/build-on-morph/sdk/type-aliases/OEL2ContractsLike",children:(0,r.jsx)(n.code,{children:"OEL2ContractsLike"})})]}),"\n"]}),"\n",(0,r.jsx)(n.h4,{id:"source-1",children:"Source"}),"\n",(0,r.jsx)(n.p,{children:"src/interfaces/types.ts:147"})]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},1582:(e,n,s)=>{s.d(n,{R:()=>c,x:()=>i});var r=s(758);const t={},o=r.createContext(t);function c(e){const n=r.useContext(o);return r.useMemo((function(){return"function"==typeof e?e(n):{...n,...e}}),[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),r.createElement(o.Provider,{value:n},e.children)}}}]);
{
"$schema": "https://biomejs.dev/schemas/2.1.2/schema.json",
"formatter": { "enabled": false },
"linter": { /* …existing rules… */ },
"files": {
"ignore": [
"build/**",
"dist/**"
]
},
"css": { /* … */ },
"javascript": { /* … */ }
}
🧰 Tools
🪛 Biome (2.1.2)

[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)


[error] 1-1: This hook is being called indirectly and conditionally, but all hooks must be called in the exact same order in every component render.

This is the call path until the hook.

For React to preserve state between calls, hooks needs to be called unconditionally and always in the same order.
See https://reactjs.org/docs/hooks-rules.html#only-call-hooks-at-the-top-level

(lint/correctness/useHookAtTopLevel)

🤖 Prompt for AI Agents
In build/assets/js/70e8639a.a7b63da5.js at line 1, the compiled bundles in the
build/ directory cause Biome linter to report false hook-order warnings. To fix
this, update the biome.json configuration file to add an ignore section that
excludes the build/ directory (and dist/ if applicable) from linting.
Alternatively, create a .biomeignore file at the repository root listing build/
and dist/ to prevent Biome from linting these compiled bundles.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants