Skip to content

chore: merge main into trump#867

Draft
hyper-gonk[bot] wants to merge 74 commits intotrumpfrom
main-to-trump
Draft

chore: merge main into trump#867
hyper-gonk[bot] wants to merge 74 commits intotrumpfrom
main-to-trump

Conversation

@hyper-gonk
Copy link
Copy Markdown
Contributor

@hyper-gonk hyper-gonk bot commented Dec 17, 2025

This PR was automatically created to merge changes from main into trump.

## 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>
@vercel
Copy link
Copy Markdown

vercel bot commented Dec 17, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
hyperlane-warp-template Error Error Apr 9, 2026 3:28pm
5 Skipped Deployments
Project Deployment Actions Updated (UTC)
analytics-test Ignored Ignored Apr 9, 2026 3:28pm
injective-bridge Ignored Ignored Apr 9, 2026 3:28pm
nexus-bridge Ignored Ignored Apr 9, 2026 3:28pm
ousdt-bridge Ignored Ignored Apr 9, 2026 3:28pm
trump-bridge Ignored Ignored Apr 9, 2026 3:28pm

Request Review

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 -->
## 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>
troykessler and others added 6 commits January 16, 2026 17:25
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 -->
@socket-security
Copy link
Copy Markdown

socket-security bot commented Jan 19, 2026

Xaroz and others added 11 commits March 4, 2026 15:55
## 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>
@socket-security
Copy link
Copy Markdown

socket-security bot commented Mar 12, 2026

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.

Action Severity Alert  (click "▶" to expand/collapse)
Warn High
Obfuscated code: npm entities is 91.0% likely obfuscated

Confidence: 0.91

Location: Package overview

From: pnpm-lock.yamlnpm/entities@6.0.1

ℹ Read more on: This package | This alert | What is obfuscated code?

Next steps: Take a moment to review the security alert above. Review the linked package source code to understand the potential risk. Ensure the package is not malicious before proceeding. If you're unsure how to proceed, reach out to your security team or ask the Socket team for help at support@socket.dev.

Suggestion: Packages should not obfuscate their code. Consider not using packages with obfuscated code.

Mark the package as acceptable risk. To ignore this alert only in this pull request, reply with the comment @SocketSecurity ignore npm/entities@6.0.1. You can also ignore all packages with @SocketSecurity ignore-all. To ignore an alert for all future pull requests, use Socket's Dashboard to change the triage state of this alert.

View full report

Xaroz and others added 16 commits March 12, 2026 13:53
## 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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants