-
Notifications
You must be signed in to change notification settings - Fork 58
add morph pay and morph rails #65
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Conversation
WalkthroughThis 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
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
Estimated code review effort🎯 4 (Complex) | ⏱️ ~40 minutes Poem
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.jsNote 🔌 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 unit tests
🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
🔭 Outside diff range comments (2)
sidebars.js (1)
48-90: Broken sidebar syntax: partially-commented category leaves orphaned items and missing commaLines 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:
- A comma-less transition between the preceding element (Line 47
}) and the first orphan object (Line 52{), causing a real JS syntax error.- 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 lineWithout 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.svgdiffers from the leading-slash paths (/img/cards/...). Relative paths resolve differently once the file is nested underdocs/. 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-LHeading at Line 23 reads “OKX Walllet”. Drop one “l” to keep docs polished.
32-39: Heading punctuation flagged by markdownlintLines 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 MD034Convert 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 grammarSentence 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 readersConsider 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.
should include descriptive alt text for accessibility and SEO.- +
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.
fails basic accessibility checks. Provide a meaningful description such as “Morph roadmap overview image”.- +
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 Scopedocs/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-4844docs/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
⛔ Files ignored due to path filters (2)
assets/docs/about/roadmap/roadmap1.jpgis excluded by!**/*.jpgassets/docs/about/userpage1.jpegis 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 accuracyMorph 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 footnoteRegulators 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. | ||
|
|
||
|  |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fix the repeated “Sequqencer” spelling error in image alt-text.
-
+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.
|  | |
|  |
🤖 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? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
| ## 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.
| - 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 | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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 scratchCommittable 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
left a comment
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
reviewed
Deploying morph-doc with
|
| Latest commit: |
6ce3c54
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://2d2d3a77.morph-doc.pages.dev |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🔭 Outside diff range comments (1)
docs/about-morph/0-user-navigation-page.md (1)
49-59: Incorrect links duplicated three times
All three cards point towallet-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 indescriptionfront-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/.- +
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 (./imgvs/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
📒 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 insidebars.js. Verify that these pages remain reachable; otherwise users will land on 404s.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
♻️ Duplicate comments (1)
docs/about-morph/2-the-technology-behind-morph.md (1)
36-37: Fix “Sequqencer” typo in image alt-textSame issue was flagged previously and is still present.
- + … - +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 MD026Markdown-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 ScopeAlso applies to: 72-75, 77-80, 82-85
28-29: Eliminate double space in paragraphThere 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 consistencySurrounding 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 flowThree 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
📒 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
| ### Modular Rollup Design | ||
|
|
||
| Consensus, execution, and data availability are separated. This allows developers to build and scale without disrupting the network. | ||
|
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ 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.
| ### 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.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 0
🔭 Outside diff range comments (1)
docs/about-morph/0-user-navigation-page.md (1)
49-59: Broken navigation: all three cards point towallet-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.- +
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 (./imgvs/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 Platinumis a peer product, not a sub-section ofMorph 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
📒 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>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 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 sourceThe 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 bundlesSame 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 positivesSame MDX pattern; please exclude build/** in Biome/eslint.
build/assets/js/3f6197d4.3649865e.js (1)
1-1: Accessibility nit: improve image alt textAlt="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 classUnder “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 bundlesSame 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"anddecoding="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 versionsOptional 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 versionAnd 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!- +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 positivesThese 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_CONTRACYshould beROLLUP_CONTRACT.- Snapshot setup mixes
${NODE_DATA_DIR}in prose but uses${MORPH_HOME}/node-datain commands. Pick one and document it consistently, or defineNODE_DATA_DIRexplicitly.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=0x759894ced0e6af42c26668076ffa84d02e3cef60And 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-descriptiveAlt 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” typoI see “cost0efficient” (zero) in shared descriptions. Replace with “cost‑efficient”.
- cost0efficient + cost-efficientbuild/assets/js/2f19d5d4.fa2f851a.js (2)
1-1: Typos and minor correctness in examples
- “cost0efficient” → “cost‑efficient”.
- Etherscan config:
apiURLhas a trailing space afterapi?. 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 historyDocs instruct creating
.envwithPRIVATE_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 copyThe
descriptionstring readscost0efficient; replace withcost-efficient.build/assets/js/39f485e7.e4d15ea7.js (1)
1-1: Repeated “cost0efficient” typoFix the zero → hyphen.
build/assets/js/578ca001.54e90cd3.js (1)
1-1: Several small content issues•
cost0efficient→cost-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 fixesInside the text:
• “Biconomy offer a full-stack solution” → “Biconomy offers …”MakefileEks.mk (2)
13-15: Spelling / loggingThe log message prints “starting ngnix…”, but the binary invoked is
nginx. Tiny nit, but worth correcting for grepping logs.
8-21: Add.PHONYtargets & fail-fastConsider marking the new targets
.PHONYand prefix the build steps withset -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:
- +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 throttleThe 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 fallbackThe 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"> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ 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.
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.
| <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 | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
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 | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 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 | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ 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) || trueLength 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
docsand/orthemeMDX 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 | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
| "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 | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ 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 | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
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 | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ 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 | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ 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-
+
-
+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 | |||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 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/**"
]
}
}
EXAMPLELength of output: 61137
🏁 Script executed:
#!/bin/bash
# Check biome.json for ignore settings
cat biome.jsonLength 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.
| "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.
Summary by CodeRabbit
New Features
Bug Fixes
Chores
Refactor
Style
Revert