Conversation
## Summary - Add CLAUDE.md documentation file to help Claude Code instances work effectively with this codebase - Includes development commands, architecture overview, key directories, data flow, configuration, and testing instructions ## Test plan - [x] Verify file content is accurate and matches codebase structure - [x] Ensure all referenced commands work (`pnpm dev`, `pnpm test`, etc.) 🤖 Generated with [Claude Code](https://claude.ai/code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Added comprehensive developer documentation including setup instructions, configuration guidance, and development workflows for the Hyperlane Warp UI Template. <sub>✏️ Tip: You can customize this high-level summary in your review settings.</sub> <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
5 Skipped Deployments
|
This PR implements a way to allow a default multi collateral route to be set as the default - Rename `getLowestFeeTransferToken` to `getTransferToken` - Add `defaultMultiCollateralRoutes.ts` file where the default routes will be set - Implement `tryGetDefaultOriginToken` which returns a multi collateral token based on the default MCWR object - Update tests and README fixes [ENG-2771](https://linear.app/hyperlane-xyz/issue/ENG-2771/have-nexus-default-exclusively-to-first-party-warp-route) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added support for configurable default multi-collateral routes, allowing users to specify preferred collateral selections for transfers instead of relying solely on fee-based selection. * **Documentation** * Added guidance on customizing default multi-collateral warp route behavior. * **Tests** * Added comprehensive test coverage for default multi-collateral route selection logic and fallback behavior. <sub>✏️ Tip: You can customize this high-level summary in your review settings.</sub> <!-- end of auto-generated comment: release notes by coderabbit.ai --> <!-- greptile_comment --> <h3>Greptile Summary</h3> This PR adds a configuration-driven way to set default multi-collateral warp routes, bypassing the fee-based selection when a preferred route is configured. The implementation renames `getLowestFeeTransferToken` to `getTransferToken` to better reflect its broader purpose. ## What Changed - Introduced `defaultMultiCollateralRoutes.ts` config file pre-populated with first-party USDC routes across 7 chains - Added `tryGetDefaultOriginToken()` function that checks the config before falling back to fee-based selection - Updated `getTransferToken()` to prioritize configured defaults over lowest-fee logic - Added comprehensive test coverage including edge cases for native tokens and fallback behavior - Updated documentation in `CUSTOMIZE.md` to explain the override mechanism ## Implementation Quality The logic properly handles both ERC20 collateral tokens and HypNative tokens (using 'native' as the key), with thorough null checks and early returns throughout the chain. The fee lookup is correctly bypassed when a default route is found, which improves performance for configured routes. Test coverage looks solid with proper mocking and validation of both the happy path and various edge cases. <details><summary><h3>Confidence Score: 5/5</h3></summary> - This PR is safe to merge with minimal risk - The changes are well-structured with proper separation of concerns, comprehensive test coverage (157 lines of new tests), and backward compatibility (defaults are optional and fall back to existing fee-based logic). The function rename from getLowestFeeTransferToken to getTransferToken better reflects the new behavior, and all call sites were correctly updated. - No files require special attention </details> <details><summary><h3>Important Files Changed</h3></summary> | Filename | Overview | |----------|----------| | src/consts/defaultMultiCollateralRoutes.ts | New config file that maps chains to their default multi-collateral routes for USDC across 7 chains | | src/features/tokens/types.ts | Added DefaultMultiCollateralRoutes type definition to support route configuration mapping | | src/features/tokens/utils.ts | Added tryGetDefaultOriginToken function with comprehensive logic for looking up configured default routes | | src/features/transfer/fees.ts | Renamed getLowestFeeTransferToken to getTransferToken, added defaultMultiCollateralRoutes param with priority lookup | </details> </details> <details><summary><h3>Sequence Diagram</h3></summary> ```mermaid sequenceDiagram participant User participant TransferForm as TransferTokenForm participant GetTransfer as getTransferToken participant TryDefault as tryGetDefaultOriginToken participant GetSameCollateral as getTokensWithSameCollateralAddresses participant WarpCore participant DefaultConfig as defaultMultiCollateralRoutes User->>TransferForm: Submit transfer form TransferForm->>GetTransfer: getTransferToken(originToken, destinationToken, defaultMultiCollateralRoutes) GetTransfer->>GetTransfer: isValidMultiCollateralToken? alt Not valid multi-collateral GetTransfer-->>TransferForm: Return originToken (no change) end GetTransfer->>GetSameCollateral: getTokensWithSameCollateralAddresses() GetSameCollateral-->>GetTransfer: List of tokens with same collateral alt Only 1 token found GetTransfer-->>TransferForm: Return originToken end GetTransfer->>TryDefault: tryGetDefaultOriginToken(originToken, destinationToken, config, tokens) TryDefault->>DefaultConfig: Lookup origin chain config TryDefault->>DefaultConfig: Lookup destination chain config TryDefault->>DefaultConfig: Get default warp route addresses alt Default route configured and found TryDefault-->>GetTransfer: Return default token GetTransfer-->>TransferForm: Return default token (bypass fee lookup) else No default configured TryDefault-->>GetTransfer: Return null GetTransfer->>WarpCore: getTokenCollateral() for each token WarpCore-->>GetTransfer: Balance results GetTransfer->>GetTransfer: Filter tokens with sufficient balance GetTransfer->>WarpCore: getInterchainTransferFee() for each token WarpCore-->>GetTransfer: Fee quotes GetTransfer->>GetTransfer: Sort by lowest fee GetTransfer-->>TransferForm: Return lowest fee token end ``` </details> <!-- greptile_other_comments_section --> <!-- /greptile_comment -->
ee1e587 to
cdda26c
Compare
## Automated Dependency Update This PR updates the Hyperlane dependencies to their latest versions. **Updated versions:** - `@hyperlane-xyz/sdk`: `21.0.0` - `@hyperlane-xyz/utils`: `21.0.0` - `@hyperlane-xyz/registry`: `23.11.0` - `@hyperlane-xyz/widgets`: `21.0.0` **Changes include:** - Updated `package.json` with latest Hyperlane package versions - Updated `pnpm-lock.yaml` via `pnpm install` --- 🤖 This PR was automatically generated by the [update-hyperlane-deps workflow](.github/workflows/update-hyperlane-deps.yml) Co-authored-by: hyper-gonk[bot] <246310972+hyper-gonk[bot]@users.noreply.github.com>
cdda26c to
2953068
Compare
This reverts commit ad80b47.
2953068 to
4cfeff2
Compare
Fixes [ENG-3136]( https://linear.app/hyperlane-xyz/issue/ENG-3136/integrate-refiner-for-user-survey) - Setup refiner for user surveys - Update CSP headers to allow refiner - Add `eslint` missing dependencies <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Integrated Refiner survey flow to identify users and display a survey after successful token transfers. * **Chores** * Added Refiner SDK and updated linting/dev tool configuration. * **Bug Fixes / Security** * Updated Content Security Policy to allow Refiner-hosted scripts, images, frames and media. * Reliability fixes: token auto-selection logic, transfer loading sequencing, and safer/cancellable URL fetching in transfer details. <sub>✏️ Tip: You can customize this high-level summary in your review settings.</sub> <!-- end of auto-generated comment: release notes by coderabbit.ai -->
4cfeff2 to
7cc25a0
Compare
Remove link to bounty and update footer with link to support/help
7cc25a0 to
9f671f2
Compare
9f671f2 to
8df6a48
Compare
2b4827a to
a99141a
Compare
## Summary
Major v2 overhaul of the transfer experience — replaces the separate
chain + token selection flows with a unified picker, restructures token
identification around string keys, and adds new chain filtering/sorting
capabilities.
### New: Unified Token/Chain Picker
Replaces the old `ChainSelectModal` + `TokenListModal` with a single
`UnifiedTokenChainModal` where chain selection acts as a filter for
tokens. Users pick a token and chain together in one flow.
- `ChainFilterPanel` side panel with search, protocol/network-type
filters, name/chainId/protocol sort
- `ChainList` with "All Chains" and per-chain buttons
- `MobileChainQuickSelect` horizontal pill selector for mobile
- `ChainEditModal` for editing chain RPCs/block explorers
- Disabled chains support (grayed out, unclickable, sorted to bottom)
### New: Token Identification Refactor (`tokenIndex` → `tokenKey`)
Tokens identified by composite string key (`chain-symbol-address`)
instead of numeric array index. More stable — indices shift when warp
routes change, keys don't.
- `TransferFormValues` changed from `{ origin, destination, tokenIndex
}` to `{ originTokenKey, destinationTokenKey }`
- Origin/destination chains derived from token keys (no separate chain
form fields)
- Pre-computed `tokenByKeyMap` in store for O(1) lookups
- `getTokenKey()` / `getCollateralKey()` with WeakMap caching
### New: Token Deduplication & Store Pre-computation
- `buildTokensArray()` creates unified, deduplicated token array at init
- `groupTokensByCollateral()` pre-computes collateral groups
- Store extended with `tokens[]`, `collateralGroups`, `tokenByKeyMap`
### New: UI Components
- `TransferSection` card with gradient header/shadow
- `TokenChainIcon` composite icon (token + chain badge overlay)
- `WalletDropdown` inline wallet connect per chain
- `RecipientAddressModal`, `SearchInput`, `ModalHeader`, `SwapIcon`,
`ImportTokenButton`
### Adapted from main: Token Balances in Picker
Balance display + USD values already exist on main (#952, #956, #964).
V2 adapts the hook signatures to be more flexible —
`useTokenBalances(tokens, scope, addressOverride?)` instead of
origin/destination-specific. Same underlying multicall3 (EVM) / batched
RPC (Sealevel) / CoinGecko infrastructure.
### Adapted from main: Visual Rebrand
Base rebrand already merged on main (#934). V2 extends it with the new
components above (gradient cards, composite icons, unified modal
layout).
### Carried over unchanged: Fee USD Display
Fee quotes with USD values (#949) carried over as-is.
### Transfer Form Restructured
`TransferTokenForm` significantly restructured around tokenKey model —
two `TokenSelectField`s (origin/dest) each open the unified modal. No
separate `ChainSelectField`. Core transfer execution logic (fees,
validation, `useTokenTransfer`) is similar.
### Removed
- `FloatingButtonStrip`, `ChainSelectField`, `ChainSelectModal`,
`TokenListModal`
- Config flags: `showAddRouteButton`, `showAddChainButton`,
`showDisabledTokens`
- Consolidated `tokens/balances.ts` → `balances/hooks.ts`
---
**61 files changed** — +3,796 / -1,461
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Unified token & chain selection modal/panels, chain edit UI, mobile
quick-select, wallet dropdown, recipient address modal, token import
button, new icons/components, token list/panel and transfer section.
* **Bug Fixes**
* Improved recipient validation/clearing, wallet-connect submit
behavior, route-aware fee and max calculations, more reliable route
detection and balance handling.
* **UI Updates**
* Banner repositioning and rounded styling, TipCard/layout and modal
header refinements, updated token/transfer layouts and compact details.
* **Chores**
* Dependency bump, ESLint rule adjusted, .gitignore updated, removed
legacy wallet adapters/components.
* **Tests**
* Added chain filter/sort and token utilities tests; updated fee-related
tests.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
---------
Co-authored-by: Paul Balaji <10051819+paulbalaji@users.noreply.github.com>
Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
…estination (#992) ## Summary Post-v2 enhancements for token selection UX. ### Default origin/destination tokens - Change default origin and destination token ### Featured tokens always visible - When `featuredTokens` is configured, show all featured + routable tokens without the 50-token cap - Only apply 50-token cap when no featured tokens are defined ### Auto-select destination on origin change - When selecting an origin token, if the current destination has no route, auto-select the first valid destination - Updates URL params accordingly - If no valid destination exists, keeps current selection (Route unavailable UI handles it) ### Route tooltip fix - Widen tooltip from 200px to 280px so longer chain names (e.g. "Binance Smart Chain") aren't cut off 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Intelligent destination auto-selection: when changing the origin token, a compatible destination is chosen automatically if the current destination has no valid route. * **Improvements** * Default token pairs updated from HYPER to USDC. * Token list prioritizes routable tokens and conditionally shows more items when featured tokens exist (better discovery). * Wider tooltips for route-unavailable messages for improved readability. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
- Fixed an issue where picking a `destination` token would send the wrong `originTokenSymbol` in the analytics events - Cleanup analytics function <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Refactor** * Refactored token selection analytics tracking to use Token objects instead of string-based parameters, improving type consistency and data handling in event tracking. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
Track an event where an user select an unsupported route which triggers on destination token selection if the route is not supported
## Summary - Adds a REVIEW.md file to guide Claude Code's automated PR review feature - Defines what reviewers should always flag (XSS, type safety, token math, address handling, wallet security) - Defines what to skip (formatting, style handled by linters) ## Context Claude Code now supports [REVIEW.md files](https://code.claude.com/docs/en/code-review) for review-specific guidance, separate from CLAUDE.md. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Changes affect automated PR review behavior and GitHub Actions configuration, so misconfiguration could reduce/alter review output, but no runtime product code or user data paths are impacted. > > **Overview** > Adds a top-level `REVIEW.md` and updates the `claude-review` skill to use it as the canonical review guidance. > > Reworks the `/inline-pr-comments` skill to submit **one consolidated GitHub review per run** (summary + inline comments) and to fetch prior reviews/comments first to avoid duplicate feedback. > > Adjusts the `claude-code-review.yml` workflow to disable sticky comments and simplify `claude_args` while updating the prompt to run `/claude-review` via agent teams. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 1a6016d. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## Summary - Updates `AGENTS.md` to reference `REVIEW.md` instead of the now-removed `.github/prompts/code-review.md` - Follow-up to #1003 which renamed the review file but left a stale path in AGENTS.md <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Documentation-only change that updates an internal reference; no runtime or behavioral impact. > > **Overview** > Updates `AGENTS.md` to point code review guidance to `REVIEW.md` instead of the stale `.github/prompts/code-review.md` path. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 0052a24. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## Summary - Add comprehensive Playwright E2E test suite (31 tests across 6 suites) - Add CI workflow to run tests on push/PR to main - Add `test:e2e` script and Playwright config with `SLOW_MO` support ## Test Suites | Suite | Tests | What it covers | |-------|-------|----------------| | **Page Load** | 3 | Transfer form defaults, header/footer, tip card | | **Token Selection** | 5 | Open/close modal, search, filter chains, select origin/destination | | **Transfer Form** | 3 | Swap tokens, enter amount, connect wallet prompt | | **Chain Selection** | 7 | Filter by type/protocol, sort chains, edit chain metadata | | **Wallet Connect (EVM)** | 2 | RainbowKit modal for origin/destination | | **Wallet Connect (All Protocols)** | 6 | EVM, Solana, Cosmos, Aleo, Radix, Starknet wallet modals | ## Usage ```bash # Run all E2E tests (chromium) pnpm test:e2e # Run with headed browser pnpm test:e2e --headed # Run with slow motion (2s delay between actions) SLOW_MO=2000 pnpm test:e2e --headed # Run a specific test file pnpm test:e2e tests/wallet-connect/protocol-wallet-modals.spec.ts # Run a single test file with headed browser for debugging SLOW_MO=2000 pnpm test:e2e --headed --workers=1 tests/wallet-connect/protocol-wallet-modals.spec.ts ``` ## Playwright Agents Tests were generated using [Playwright MCP Agents](https://playwright.dev/docs/test-agents) — AI-powered test planning, generation, and healing via the Playwright MCP server. The agents explore the running app, plan test scenarios, and generate robust locators using accessibility snapshots. ## CI The GitHub Actions workflow (`.github/workflows/playwright.yml`) runs on push/PR to main: - Uses `pnpm/action-setup` for proper pnpm support - Installs only chromium (faster CI) - Auto-starts the dev server via `webServer` config - Uploads test report as artifact on failure <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Release Notes * **Tests** * Added comprehensive automated end-to-end test suite covering token selection, transfer form functionality, wallet connections, and chain filtering across multiple browser environments. * **Chores** * Updated CI/CD pipeline to include automated testing workflows and updated project dependencies to support testing infrastructure. * **Documentation** * Added instructions for running end-to-end tests. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…ination-disambiguation fix: disambiguate findRouteToken for multi-collateral routes
## Summary - Restricts e2e test suite to only run on PRs targeting `main`, pushes to `main`, merge group, and manual dispatch - e2e is not a required status check, so this won't block CI on other branches 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Release Notes * **Chores** * Updated end-to-end testing workflow to run conditionally on main branch activities, merge group events, and manual triggers. <!-- end of auto-generated comment: release notes by coderabbit.ai --> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary - Display token/chain combo (`TokenChainIcon`) instead of chain-only logos in transfer modal and sidebar history - Show origin amount/symbol → dest amount/symbol in both modal banner and sidebar items - Set `destTokenAddressOrDenom` from `msg.recipient` for API-sourced transfers - Unify `LocalTransferSummary` and API `TransferSummary` into single component - Gracefully hide arrow path when destination token is unavailable Examples: <img width="383" height="479" alt="image" src="https://github.com/user-attachments/assets/342051a2-5ebd-4bb3-ba88-cffe17c0e157" /> <img width="387" height="471" alt="image" src="https://github.com/user-attachments/assets/acd1301e-335b-4563-8813-0b13a274b533" /> <img width="345" height="151" alt="image" src="https://github.com/user-attachments/assets/5b2061e1-cf2b-420f-a63f-17d212674183" /> 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Display both origin and destination token details in transfer modals and sidebar summaries. * Visual arrow indicator between origin and destination tokens for clearer transfer direction. * **Improvements** * Unified transfer summary rendering for local and API transfers with consistent token/amount presentation. * Enhanced token visuals using chain-aware token icons; removed raw token address/denom from visible details. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary
- The updated `@hyperlane-xyz/widgets` (v27) unconditionally calls Tron
wallet hooks from `@tronweb3/tronwallet-adapter-react-hooks`, which
requires a `WalletProvider` context
- Added `TronWalletContext` provider wrapping the Tron `WalletProvider`
and wired it into the `_app.tsx` provider stack
- Bumps `@hyperlane-xyz/{sdk,utils,widgets}` from 25.5.0 to 27.0.0
🤖 Generated with [Claude Code](https://claude.com/claude-code)
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
* **New Features**
* Added TRON wallet support, enabling users to securely connect and
actively manage their TRON wallets directly within the application.
* **Dependencies**
* Updated three Hyperlane packages (SDK, utilities, and widgets) from
v25.5.0 to v27.0.0 for improved functionality and performance.
* Added TRON wallet adapter dependencies to enable seamless wallet
connectivity and multi-chain support.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
|
Warning Review the following alerts detected in dependencies. According to your organization's Security Policy, it is recommended to resolve "Warn" alerts. Learn more about Socket for GitHub.
|
## Summary - Re-enable the `MessageTimeline` widget in the transfer details modal showing 4 stages: Sent → Finalized → Validated → Relayed - Query single message delivery status from GraphQL (Hasura) when modal is opened, poll every 10s until delivered - Show destination transaction hash with block explorer link once delivered - Show estimated delivery time for pending transfers based on chain metadata (`blocks.confirmations`, `blocks.estimateBlockTime`, `blocks.reorgPeriod`) - Auto-update local transfer status to `Delivered` when API confirms delivery ### Notes - Uses own stage logic instead of widget's `useMessageStage` hook to avoid broken Explorer REST API dependencies (`queryExplorerForBlock`, `/latest-nonce`) - Stage timings hidden from timeline labels (just shows stage names) - `Finalized` and `Validated` stages will be enhanced in a follow-up (requires validator signature tracking via SDK's `BaseMetadataBuilder`) 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Real-time delivery status tracking with timeline in transfer details (background polling for live updates) * Display estimated delivery time (ETA) for cross-chain transfers * Show destination transaction hash when delivery completes * More reliable timestamp handling for message delivery events * **Tests** * Added tests for delivery time estimation and ETA formatting logic <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…#1012) ## Summary - Updated the `code-review` job's prompt to include `/inline-pr-comments` for posting findings as consolidated PR reviews with inline comments - Added `--allowedTools Bash(gh:*)` to `claude_args` to enable the `gh` CLI for posting review comments ## Test plan - [ ] Trigger a claude review on a test PR and verify inline comments are posted as a consolidated PR review 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Workflow-only change; main risk is misconfigured tool permissions/allowed tools causing the review job to fail or post comments unexpectedly. > > **Overview** > Updates the `claude-code-review.yml` workflow so the `code-review` job runs `/inline-pr-comments` after `/claude-review`, posting findings as a consolidated PR review with inline comments. > > Also expands `claude_args` to allow `Bash(gh api:*)`, enabling the workflow to use the GitHub CLI API for creating those review comments. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 45d650d. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Chores** * Enhanced code review workflow to deliver findings as consolidated inline comments on pull requests for improved clarity and visibility. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: Jason Guo <33064781+Xaroz@users.noreply.github.com>
## Automated Dependency Update This PR updates the Hyperlane dependencies to their latest versions. **Updated versions:** - `@hyperlane-xyz/sdk`: `27.1.0` - `@hyperlane-xyz/utils`: `27.1.0` - `@hyperlane-xyz/registry`: `24.1.0` - `@hyperlane-xyz/widgets`: `27.1.0` **Changes include:** - Updated `package.json` with latest Hyperlane package versions - Updated `pnpm-lock.yaml` via `pnpm install` --- 🤖 This PR was automatically generated by the [update-hyperlane-deps workflow](.github/workflows/update-hyperlane-deps.yml) Co-authored-by: hyper-gonk[bot] <246310972+hyper-gonk[bot]@users.noreply.github.com>
## Summary - Adds `useOriginFinality` hook that polls origin chain RPC to check if the transfer tx has reached finality (latest block > origin block + confirmation blocks) - Stores `originBlockNumber` from tx receipt at transfer time (hot path), with GraphQL `origin_block_height` fallback after page refresh (cold path) - Timeline now shows Sent → Finalized → Relayed progression instead of jumping directly from Sent → Relayed - EVM chains only; non-EVM gracefully skips the Finalized stage - Updates Hyperlane deps to v28.0.0 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## Summary - upgrade the repo to TypeScript 6.0.2 - add explicit style module declarations for TS6 side-effect import checking - avoid deprecated TS7 stopgaps like ignoreDeprecations ## Verification - pnpm typecheck - pnpm build <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Compiler upgrades can introduce new type-checking behavior and potentially break `tsc`/build pipelines even without runtime code changes. > > **Overview** > Upgrades the devDependency `typescript` from `5.6.3` to `6.0.2`, aligning the template with the TypeScript 6 toolchain. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 9871fbc. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## Summary
- Adds `/embed` page rendering the transfer form in a chrome-less layout
for iframe embedding
- Theme customization via URL params: `accent`, `bg`, `card`, `text`,
`buttonText`, `border`, `error`, `mode`
- Light and dark mode presets with auto-derived accent variants
- CSS variable theming scoped to `body.embed-mode` (handles portaled
modals)
- Structured postMessage API (`{ type: 'hyperlane-warp-widget', event: {
type, payload } }`)
- CSP `frame-ancestors *` on `/embed` only; all other routes remain
`DENY`
- 14 e2e tests covering rendering, no-chrome, theming, and CSP headers
- README documentation for setup, customization, and CSP troubleshooting
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Automated Dependency Update This PR updates the Hyperlane dependencies to their latest versions. **Updated versions:** - `@hyperlane-xyz/sdk`: `29.0.0` - `@hyperlane-xyz/utils`: `29.0.0` - `@hyperlane-xyz/registry`: `24.1.0` - `@hyperlane-xyz/widgets`: `29.0.0` **Changes include:** - Updated `package.json` with latest Hyperlane package versions - Updated `pnpm-lock.yaml` via `pnpm install` --- 🤖 This PR was automatically generated by the [update-hyperlane-deps workflow](.github/workflows/update-hyperlane-deps.yml) Co-authored-by: hyper-gonk[bot] <246310972+hyper-gonk[bot]@users.noreply.github.com> Co-authored-by: Jamin <57451149+yjamin@users.noreply.github.com>
This has been tested with following warp config:
```yaml
# A list of Warp Route token configs
# These configs will be merged with the warp routes in the configured registry
# The input here is typically the output of the Hyperlane CLI warp deploy command
---
tokens:
- addressOrDenom: '0x00A31B5FA19D16F560c5460531ABA40Cb1072055'
chainName: sepolia
connections:
- token: tron|tronshasta|0x274dd6d8c0e0232d8BEeA1c05BfEAaa8AAab6D91
decimals: 18
name: Ether
standard: EvmHypNative
symbol: ETH
- addressOrDenom: '0x274dd6d8c0e0232d8BEeA1c05BfEAaa8AAab6D91'
chainName: tronshasta
connections:
- token: ethereum|sepolia|0x00A31B5FA19D16F560c5460531ABA40Cb1072055
decimals: 18
name: ETH
standard: TronHypSynthetic
symbol: ETH
options: {}
```
## Summary Adds a dark mode theme system to Warp UI, toggled via header button with system-preference fallback and localStorage persistence. All dark styling is driven by `html[data-theme-mode='dark']` CSS selectors — no runtime style injection. ## Theme infrastructure - **Pre-hydration init** (`public/theme-init.js`) — synchronous script in `<Head>` sets `data-theme-mode` before first paint, eliminating flash-of-wrong-theme - **Source order**: localStorage override → system `prefers-color-scheme` → default - **Toggle**: "Lights on / Lights out" button in header, persists preference - **Instant switch**: `data-theme-switching` attribute suppresses all CSS transitions during toggle ## Dark mode logo variants Convention-based system in `src/utils/imageBrightness.ts`: - Rewrites image URLs to `darkmode-<filename>` in dark mode - Error fallback to original when dark variant doesn't exist - LRU cache (500 entries) remembers missing variants to avoid repeated 404s - `MutationObserver` handles late-loaded widget images (chain edit modal, etc.) ## Dark-styled surfaces Extensive `globals.css` overrides (~985 lines) covering: - App shell, header/nav menu, footer - Transfer form, chain/token fields, text inputs, swap button, max button - Chain picker modal, token picker modal, chain edit modal - Transfer details modal (+ timeline arrow clip-paths) - Fee details modal - Wallet dropdown, wallet protocol modal - Sidebar (connected wallets, transfer history) - Tip card, floating buttons, warning banners ## Component changes - **New**: `WalletProtocolModal` — custom grid-based protocol selector replacing widget's `MultiProtocolWalletModal` - **New**: `src/utils/theme.ts` — `parseUiThemeMode()`, `getSystemUiThemeMode()` helpers - **Modified**: 30+ components to add CSS hook classes (`.transfer-card`, `.sidebar-menu-item`, etc.) enabling dark mode selectors without touching widget internals - **Removed**: Inline background styles from `AppLayout` (moved to CSS custom properties) - **Removed**: `BACKGROUND_COLOR`/`BACKGROUND_IMAGE` constants from `app.ts` ## UI fixes & improvements - **Transfer details layout** — flex → CSS grid (`grid-cols-[1fr_auto_1fr]`) for centered chevrons - **Duplicate token symbol** — suppressed in details modal and sidebar when origin/dest match - **Warning banner clipping** — removed clipping context, responsive spacer (`pb-12 sm:pb-10`) - **Relative timestamps** — sidebar shows `Xs/Xm/Xh ago` for transfers <24h old - **Border-radius unification** — token picker rows `rounded-md`, token button `rounded-[7px]` to match chain fields - **Sidebar wallet rows** — full-width flat rows with dividers instead of padded rounded cards - **Redundant `data-theme-mode`** — removed duplicate attribute from `#app-content` div ## Tests - `src/utils/date.test.ts` — relative timestamp thresholds, boundary cases - `src/utils/imageBrightness.test.ts` — dark URL generation, fallback, cache, container processing ## Validation ``` pnpm prettier && pnpm lint && pnpm typecheck && pnpm test ``` <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Adds a cross-app theming system (pre-hydration script, context provider, large global CSS overrides) that touches many UI surfaces and third-party widget styling, so regressions are possible despite limited business-logic impact. > > **Overview** > Introduces a **light/dark theme system** driven by `html[data-theme-mode]`, with a pre-hydration `/theme-init.js` script (wired in `_document`) to avoid flash, a new `ThemeProvider` (wired in `_app`) to toggle/persist the mode, and a header toggle button. > > Adds a **dark-logo variant pipeline** (`imageBrightness.ts`) that rewrites image URLs to `darkmode-*`, falls back on load errors, caches missing variants, and observes late-loaded widget images; `TokenIcon`, `ChainLogo`, and `ChainEditModal` are updated to apply this behavior. > > Reworks styling to support dark mode by moving app background to CSS variables (removing `BACKGROUND_*` constants/inline styles), adding many targeted class hooks across transfer/token/chain pickers, modals, header/footer, and sidebar, and adding UI tweaks like relative timestamps in transfer history (`relativeTimeTicker` + `formatTransferHistoryTimestamp`) and a new custom `WalletProtocolModal` replacing the widget modal. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 15f9e93. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
…eview-build feat: cross-collateral implementation
## Summary - Upgrade Next.js 15 → 16.2.1, React 18 → 19.2.4, @next/bundle-analyzer → 16.2.1 - Upgrade framer-motion 10 → 12 (React 19 compat) - Replace ESLint + Prettier with oxlint + oxfmt - Migrate webpack → Turbopack - Rename CI `prettier` job → `format` - Update VS Code settings to use `oxc.oxc-vscode` formatter ## Details - oxlint plugins: typescript, import, react, nextjs, jsx-a11y - oxfmt: singleQuote, import sorting, Tailwind class sorting - Removed deprecated `eslint` config from `next.config.js` - No source formatting churn beyond import sorting ## Turbopack migration - Added `turbopack.rules` for yaml-loader (`.yaml`/`.yml`) - Added `turbopack.resolveAlias` for pino SSR noop shim - Added `serverExternalPackages` for `@provablehq/wasm` and `@provablehq/sdk` - Added pnpm patches for `@provablehq/wasm@0.9.18` and `@provablehq/sdk@0.9.15` to guard WASM init and `Metadata.baseUrl()` behind browser-runtime checks (prevents top-level `fetch()` during SSG) - These patches should be upstreamed to ProvableHQ long-term so the local patch files can be removed ## Test plan - [x] `pnpm run lint` — 0 errors (1 pre-existing `exhaustive-deps` warning) - [x] `pnpm run format` — clean - [x] `pnpm run build` — passes (Turbopack) 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **High Risk** > High risk due to major framework upgrades (Next.js 16, React 19), migration from webpack to Turbopack, and patched WASM/SDK dependencies that can affect SSR/SSG behavior and production builds. > > **Overview** > Upgrades core frontend/runtime dependencies to **Next.js 16.2.1 + React 19** (and related updates like `framer-motion`), which may change rendering and build/runtime behavior. > > Replaces **ESLint + Prettier** with **`oxlint` + `oxfmt`**: removes the existing ESLint flat config, adds `.oxlintrc.json`/`.oxfmtrc.json`, updates `package.json` scripts (`lint`/`format`), and updates CI + VS Code settings to run and enforce the new formatter. > > Migrates build configuration from **webpack to Turbopack** in `next.config.js` (YAML loader rules, SSR-safe aliasing) and adds pnpm patches for `@provablehq/wasm` and `@provablehq/sdk` to avoid browser-only initialization during SSR/SSG. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit e4473fc. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Done - added semantic theme CSS variables for app background, surface, text, and border colors in `globals.css` - started writing both `data-theme` and `data-theme-mode`, and switched Tailwind `dark:` variants to the semantic `[data-theme="dark"]` selector - exposed semantic Tailwind color tokens: `background`, `surface`, `text-primary`, `text-secondary`, and `border` - migrated first-party dark-mode styling for header, footer, tip card, transfer form/card controls, token select, wallet dropdown, wallet protocol modal, and sidebar shell off hardcoded dark hex/rgba values and onto those tokens - kept compatibility aliases in `globals.css` for the remaining selector-level/widget dark overrides that still exist ## Not Done - widget-generated/internal `.htw-*` DOM overrides - chain picker and token picker internals - transfer details modal/timeline internals - remaining selector-level SVG/image/filter rules that still depend on nested markup targeting ## Future Work - migrate the remaining dark-mode rules out of `globals.css` and into first-party JSX where possible - add wrapper components or upstream widget theme/class hooks so widget internals can consume semantic tokens without global selectors - replace remaining hardcoded SVG fills / image-filter hacks with `currentColor` or theme-aware assets - add focused dark-mode visual QA/regression coverage across desktop + mobile ## Why That Work Is Not In This PR - the remaining rules mostly target third-party/generated widget markup or nested assets we do not directly control with Tailwind classes today - finishing that migration cleanly requires wrapper components, upstream widget API/theme hooks, or selective widget replacement - that is a broader UI integration pass with more QA surface area across pickers, timeline internals, and icon behavior, so this PR keeps scope on the first-party token layer and the components we can migrate safely now ## Validation - `pnpm typecheck` - `pnpm lint` (same pre-existing warnings in `src/features/balances/hooks.ts`, `src/features/chains/ChainEditModal.tsx`, `src/features/messages/useMessageHistory.ts`, `src/features/messages/useOriginFinality.ts`) - `pnpm build` <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Primarily UI styling changes (Tailwind classes and CSS variables) with minimal logic impact; main risk is visual regressions/inconsistent dark-mode rendering across components and widget overrides. > > **Overview** > Moves first-party dark mode styling toward **semantic theme tokens** by introducing CSS variables for background/surface/text/border in `globals.css` and exposing them as Tailwind colors (`background`, `surface`, `foreground-*`, `edge`). > > Updates multiple UI surfaces (header/footer, tip card, transfer form/modals, token select/import, wallet dropdown/protocol modal, sidebar) to use `dark:` Tailwind variants and the new tokens, while deleting several legacy selector-based dark-mode overrides in `globals.css` and leaving a smaller set of compatibility/widget-specific rules. > > Configures Tailwind `darkMode` to activate via the `[data-theme-mode="dark"]` selector and adds a small safety/logging improvement in `WalletProtocolModal` for missing protocol logo mappings. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 138295b. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Summary - Added `minimumReleaseAge: 10080` (7 days in minutes) to `pnpm-workspace.yaml` - Excludes `@hyperlane-xyz/*` packages so our own releases aren't blocked - pnpm does not honor npm's `min-release-age` from `.npmrc` — requires native config ## Test plan - [ ] Verify `pnpm install` still succeeds 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Low risk config-only change, but may cause `pnpm install` failures if the repo depends on newly published third-party packages. > > **Overview** > Introduces `minimumReleaseAge: 10080` in `pnpm-workspace.yaml` to reject installing packages published within the last 7 days as a supply-chain hardening measure. > > Adds `minimumReleaseAgeExclude` for `@hyperlane-xyz/*` so internal packages aren’t blocked by the new policy. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit acbd531. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## Summary - Remove unsafe symbol fallback in `findRouteToken()` — returns `undefined` instead of silently matching by symbol on misconfiguration - Remove redundant `findRouteToken` + `findConnectedDestinationToken` pre-resolution in `maxAmount.ts` — let `getTransferToken` handle it (matches `validateForm` pattern) - Extract `matchesCollateral` helper to replace nested ternaries in `getTokensWithSameCollateralAddresses` - Remove dead code: `sharesCollateral`, `assembleTokensBySymbolChainMap`, `tokensBySymbolChainMap` state, unused types (`MultiCollateralTokenMap`, `TokenChainMap`, `Tokens`) - Update commit skill to use `pnpm format` (oxfmt) instead of prettier 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
## Summary
- Add balance fetching for Cosmos/CosmosNative tokens via
`bank.allBalances()` — 1 RPC call per chain instead of N individual
queries
- Classify cosmos token standards into bank-batchable (most) vs SDK
fallback (`CwHypNative` only)
- Per-chain bech32 address lookup from connected cosmos wallet
## Token Classification
| Category | Standards | Denom Source |
|----------|-----------|-------------|
| Bank (addressOrDenom) | CosmosNative, CosmosIbc, CosmosIcs20,
CWNative, CW20, CwHypSynthetic | `addressOrDenom` |
| Bank (collateral) | CwHypCollateral, CosmNativeHypCollateral |
`collateralAddressOrDenom` |
| Bank (predictable) | CosmNativeHypSynthetic |
`hyperlane/{addressOrDenom}` |
| SDK fallback | CwHypNative | Dynamic via contract query |
## Drive-by
- Add `resolve-pr-reviews` Claude Code skill for interactive PR review
resolution
🤖 Generated with [Claude Code](https://claude.com/claude-code)
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
# Conflicts: # public/backgrounds/main.svg # src/components/nav/Header.tsx # src/consts/app.ts # src/consts/config.ts # src/consts/warpRouteWhitelist.ts # src/features/transfer/TransferTokenForm.tsx # tailwind.config.js
This PR was automatically created to merge changes from
mainintotrump.