chore: merge main into injective#857
Draft
hyper-gonk[bot] wants to merge 181 commits into
Draft
Conversation
This PR bump registry to v16. The goal is to enable REZ (uniswap) but also update import to use BaseRegistry
This PR bumps registry to 16.1
uppercase `warpRouteIds` and `whiteList` ids to fix discrepancy --------- Co-authored-by: Le Yu <6251863+ltyu@users.noreply.github.com>
- Bump hyperlane packages to v13.2.1 - Bump registry to v17.0.0 - Bump ethers to ^5.8.0 Tested transfers with Metamask signing: https://explorer.hyperlane.xyz/message/0x36a5e56722f8d9d9b31a2a9e1e35a61bcc9c2fbcc74d5fa0a46743fc423cec60 https://explorer.hyperlane.xyz/message/0x77b53a16cd59d0a120234d0c61711872df3af5ff7ca404505e25c082008ff54e
This PR features an initial setup for Multi-Collateral tokens for transfers fixes [ENG-1683](https://linear.app/hyperlane-xyz/issue/ENG-1683/warp-ui-should-handle-multiple-available-routes-for-a) - Filter out tokens with the same collateral address in origin and destination and only show one of them - A map containing the collateral address of origin and destination with an array of the same tokens is added, but not used yet - When submitting, it will check for the same logic and then return the highest balance token represented by the state `routeOverrideToken` - Transfers will be done with this state otherwise uses the one in the form - Tests for `isValidMultiCollateralToken` You can test this by using `Arbitrum` <> `Optimism` with `USDC` and easy way to test this is by navigating to the development server and using the temporal warp route, ex: http://localhost:3000/?origin=arbitrum&destination=optimism&token=0x296B0c551c65CB83452f10EA3922824E7b9b3F4C
<!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **Chores** - Updated the "@hyperlane-xyz/registry" dependency to version 17.4.0. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
This PR Bumps registry to 17.6.0
Bump registry to 17.7.0
- This PR change the warp ui from using `PartialRegistry` to `GithubRegistry` - Now will fetch warp routes and chain metadata if `config.registryUrl` is defined - Fix token image size scaling This means that if an update is done to main, then it will also reflect for the warp UI closes [ENG-1740](https://linear.app/hyperlane-xyz/issue/ENG-1740/use-githubregistry-in-warp-ui) related [registry PR](hyperlane-xyz/hyperlane-registry#903) <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **Style** - Improved layout and responsiveness of token icons by updating image sizing to use CSS classes instead of fixed attributes. - **Chores** - Enhanced debug log messages for chain metadata loading for greater clarity. - Updated registry implementation to use a GitHub-backed registry with configurable parameters, affecting how data is sourced and initialized. - Improved error handling and fallback logic when loading warp route configurations, with clearer debug messages. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
…637) Now instead of only relying on published warp routes, it will first attempt to fetch warp routes from the registry for the warp route white list test
This PR adds limit to certain multi-collateral routes fixes [ENG-1699](https://linear.app/hyperlane-xyz/issue/ENG-1699/limit-transfer-size-of-a-route-on-the-ui) - Sets limit to multi-collateral tokens that matches symbol, origin and destination with the array `multiCollateralTokenLimits` - Create tests for this - Form validation now includes a message if this limit is exceeded - Pressing Max button will instead now set the given limits if it exists and exceeds the account current balance - Move mocks creation functions to its own file You can currently test this by sending USDC from Arbitrum <> Optimism, the max transfer amount is 1 USDC as a test, will remove before merging <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Introduced multi-collateral transfer limits for certain tokens (e.g., USDC) on supported chains, preventing transfers that exceed these limits. - **Bug Fixes** - Improved validation to block transfers exceeding multi-collateral limits directly in the transfer form. - **Refactor** - Updated internal logic to consistently enforce multi-collateral limits when calculating maximum transferable amounts. - Enhanced token validation to support multiple token standards for collateralized tokens. - **Tests** - Added comprehensive tests for multi-collateral limit utilities. - Centralized and reused token mock utilities in test files for consistency. - **Chores** - Added new test utilities for creating mock tokens and token connections. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
Registry to v18 and other hyperlane packages to v14
Remove disabled chains from being selectable when `shouldDisableChains` flag is on - Now disabled chain will not show as default even when set in url params - Disabled chains will not show up for unsupported route tokens
This enables users to connect Starknet wallets and parse Hyperlane message IDs Important: Merging available after adding at lease one starknet chain to registry! <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **New Features** - Added support for Starknet wallets and protocols, enabling users to interact with Starknet alongside existing wallet options. - Introduced dynamic support for multiple Starknet chains and wallet connectors (Braavos and Argent X). - Enabled batch sending of multiple transactions for Starknet transfers, improving transfer efficiency. - **Enhancements** - Upgraded key dependencies to their latest versions for improved stability and compatibility. - Added a new wallet protocol to the configuration to expand supported networks. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: -f <kunalarora1729@gmail.com> Co-authored-by: Xaroz <jasonguo2013jg@gmail.com> Co-authored-by: Troy Kessler <43882936+troykessler@users.noreply.github.com> Co-authored-by: Jason Guo <33064781+Xaroz@users.noreply.github.com>
- Add keplr, metamask snap and OKX wallet connectors to starknet - Include `https://snaps.consensys.io` to script src - Add `WalletConnectionWarning`
Now shows Ready Wallet (formerly Argent) properly with the patch update for starknekit <img width="445" height="492" alt="image" src="https://github.com/user-attachments/assets/def840ec-4062-48f9-ac48-25d1a2b327fe" /> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Chores** * Updated dependency versions for Hyperlane packages. * Integrated a patched version of "starknetkit" for improved stability. * **New Features** * Added a new icon for the Ready Wallet (formerly Argent) to enhance wallet identification. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
Now at review step user will be shown a received amount if the tokens have scaling fixes [ENG-1946](https://linear.app/hyperlane-xyz/issue/ENG-1946/include-scaled-token-amount-to-warp-ui) <img width="585" height="648" alt="Screenshot 2025-07-16 at 1 17 56 PM" src="https://github.com/user-attachments/assets/c4e1ae3c-a625-4ea5-8950-b25990c6b71b" /> <img width="583" height="760" alt="Screenshot 2025-07-16 at 1 17 39 PM" src="https://github.com/user-attachments/assets/f730bf87-00e9-4818-85c1-fea2aa0eeb8d" /> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Added a display of the received token amount adjusted for differing token scales during transfer review, providing clearer information when origin and destination token scales differ. * **Style** * Improved alignment of transaction detail labels for better readability. * **Chores** * Updated several dependencies to their latest versions. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
Bump registry to 19.4.0
- Update sdk, utils and widgets to 16.0.0 - Update registry to 20.0.0 WIth the new update limits checks are included for `EvmHypCollateralFiat` tokens
- Wrap `listRegistryContent` in a try catch for `GithubRegistry` - When `listRegistryContent` fails, it will use `PartialRegistry` instead - Now if warp routes are empty it will use published routes
fixes [ENG-1965](https://linear.app/hyperlane-xyz/issue/ENG-1965/add-token-to-wallet-button) Implement feature to request to add a token/asset to an user wallet. Currently only works for EVM - New button under chains to add token - Wallet must be connected or be a supported protocol (currently only EVM) for the button to show <img width="552" height="351" alt="image" src="https://github.com/user-attachments/assets/01941829-52c7-4adf-a79d-b277be8ba4a4" /> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Summary by CodeRabbit * **New Features** * Added support for users to add tokens directly from the chain selection interface when supported by the protocol and account readiness. * Introduced a new "Add token" button in the chain selection UI for eligible tokens. * Users can now add assets to their wallet for supported protocols (Ethereum) via an integrated workflow. * **Chores** * Updated several dependencies to newer versions for improved stability and compatibility. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
Remove tokens that have no connections from the warp core config tokens, with these chains with no connection will not be shown from `assembleChainMetadata` <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Improved token list by removing tokens without any connections, ensuring only connected tokens are displayed. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
This PR addresses an issue where users are automatically prompted to switch to the Base Mainnet when connecting with their wallet on the Hyperlane Warp bridge UI. ## 📋 Context When attempting to connect a wallet, users were forced to switch to the Base network regardless of the chain selected, or the previous chain selected in their wallet. This is due to the fact that the code of the Hyperlane UI fetches the list of available warp routes, and pass the first origin chain of the first warp route as initial chain to rainbow kit configuration in the wallet connector. Although Metamask performs the chain switch in the background in the wallet, this still causes confusion for users expecting to use the origin chain from the selected dropdown. For instance when using the Universal Profile browser extension, the user gets automatically prompted to switch network, which leads to confusion. <img width="3012" height="1646" alt="image" src="https://github.com/user-attachments/assets/b5f95982-8df3-4df1-ad51-620f847ef692" /> https://github.com/user-attachments/assets/114d703d-1cd3-4316-bab8-b51027970a0a ## ✅ Fix Removed the logic that enforced a network switch to Base on wallet connection. The code now does not provide an initial chain to switch to when connecting. The last network selected in the wallet is now used. Wallets now connect without triggering an automatic network change <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Refactor** * Removed logic related to deriving and passing an initial chain based on Ethereum protocol tokens in wallet context setup. No visible changes to the user experience. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
Bump `@types/nodes` because of upcoming Vercel node v18 deprecation
## Automated Dependency Update This PR updates the Hyperlane dependencies to their latest versions. **Updated versions:** - `@hyperlane-xyz/sdk`: `31.0.1` - `@hyperlane-xyz/utils`: `31.0.1` - `@hyperlane-xyz/registry`: `24.3.0` - `@hyperlane-xyz/widgets`: `31.0.1` **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
- Remove the `touched` guard from `ConnectAwareSubmitButton` error
display
- Form-level validation errors (e.g. "Insufficient ETH for interchain
gas") were silently swallowed because the `touched` object didn't
contain matching field keys
- Since Formik is configured with `validateOnChange={false}` and
`validateOnBlur={false}`, validation only runs on submit — the `touched`
guard was redundant and just hiding legitimate errors
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
chore: update Hyperlane deps
## Automated Dependency Update This PR updates the Hyperlane dependencies to their latest versions. **Updated versions:** - `@hyperlane-xyz/sdk`: `31.2.0` - `@hyperlane-xyz/utils`: `31.2.0` - `@hyperlane-xyz/registry`: `24.3.0` - `@hyperlane-xyz/widgets`: `31.2.0` **Changes include:** - Updated `package.json` with latest Hyperlane package versions - Updated `pnpm-lock.yaml` via `pnpm install` --- ## Fix: Scale/decimals display bugs for mixed-decimal warp routes Uses the new SDK scale helpers (`messageAmountFromLocal`, `localAmountFromMessage`, `scalesEqual`) from hyperlane-xyz/hyperlane-monorepo#8594 to fix incorrect amount display for warp routes with different scales/decimals (e.g., BSC USDT 18-dec with scale-down). ### Bugs fixed | Bug | Description | Fix | |-----|-------------|-----| | Wrong dest amount in review | `convertToScaledAmount` + `fromWei(originDecimals)` produced wrong values | Replaced with `messageAmountFromLocal` → `localAmountFromMessage` → `fromWei(destDecimals)` | | `===` on scale objects | Always false for `{numerator, denominator}` objects, skipping scale computation | Use `scalesEqual()` from SDK | | One-sided scale ignored | Only showed scaled amount when both tokens had scale | Show when either side has scale | | API amounts formatted wrong | Message-space amounts formatted with local decimals (e.g., `1e-16` for BSC USDT) | Use `localAmountFromMessage` to convert message → local before formatting | | Modal dest amount | Always repeated origin amount for dest side | Shows computed dest amount when scales differ | | Sidebar dest amount | Always repeated origin amount for dest side | Shows computed dest amount when scales differ | ### Files changed - **`scaleUtils.ts`** (new) — `computeDestAmount()` utility using SDK helpers - **`scaleUtils.test.ts`** (new) — 9 tests covering all scale configurations - **`TransferTokenForm.tsx`** — Replaced `convertToScaledAmount` with `computeDestAmount`, fixed dest symbol - **`TransfersDetailsModal.tsx`** — Dest side shows `destAmount || amount` - **`SideBarMenu.tsx`** — Computes `destAmount`, fixed API transfer amount formatting - **`useMergedTransferHistory.ts`** — Fixed API transfer amount formatting with `localAmountFromMessage` ### Related - SDK changes: hyperlane-xyz/hyperlane-monorepo#8594 --- 🤖 Dependency update was automatically generated by the [update-hyperlane-deps workflow](.github/workflows/update-hyperlane-deps.yml). Scale fixes generated with [Claude Code](https://claude.com/claude-code). --------- Co-authored-by: hyper-gonk[bot] <246310972+hyper-gonk[bot]@users.noreply.github.com> Co-authored-by: Xaroz <jasonguo2013jg@gmail.com>
## Summary - Renames `src/middleware.ts` → `src/proxy.ts` and `middleware()` → `proxy()` per Next.js 16's deprecated "middleware" file convention - No logic changes — same geolocation-based sanctions blocking ## Test plan - [ ] Verify no "middleware is deprecated" warning on `pnpm dev` - [ ] Verify geo-blocking still works on Vercel preview 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Pure rename/entrypoint change with no logic changes; main risk is misconfiguration causing the handler not to run if Next.js expects a different export/file name. > > **Overview** > Renames the Next.js edge entrypoint by moving `src/middleware.ts` to `src/proxy.ts` and changing the exported handler from `middleware()` to `proxy()` to align with the updated Next.js 16 convention. > > No behavioral changes were made to the geolocation-based redirects; only the exported function name/entrypoint is updated. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit e492f42. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> 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`: `31.2.1`
- `@hyperlane-xyz/utils`: `31.2.1`
- `@hyperlane-xyz/registry`: `24.3.0`
- `@hyperlane-xyz/widgets`: `31.2.1`
**Changes include:**
- Updated `package.json` with latest Hyperlane package versions
- Updated `pnpm-lock.yaml` via `pnpm install`
### Manual fixes for SDK 31.2.1 breaking changes
SDK 31.2.1 changed `scale` from `number` to `ScaleInput` (number or
`{numerator, denominator}`).
- **`warpCoreConfig.ts`**: Added type assertion on `combinedTokens` to
work around Zod's `z.infer` widening `{numerator: bigint}` to
`{numerator: string | bigint}` when spreading token arrays
- **`scaleUtils.test.ts`**: Added tests for bigint `{numerator,
denominator}` scale values and numeric scale in `formatMessageAmount`
(14 tests total)
---
🤖 This PR was automatically generated by the [update-hyperlane-deps
workflow](.github/workflows/update-hyperlane-deps.yml), with manual
fixes applied.
---------
Co-authored-by: hyper-gonk[bot] <246310972+hyper-gonk[bot]@users.noreply.github.com>
Co-authored-by: pbio <10051819+paulbalaji@users.noreply.github.com>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Fixed the cycling through different wallets and only open TronLink
## Automated Dependency Update This PR updates the Hyperlane dependencies to their latest versions. **Updated versions:** - `@hyperlane-xyz/sdk`: `32.0.0` - `@hyperlane-xyz/utils`: `32.0.0` - `@hyperlane-xyz/registry`: `24.3.0` - `@hyperlane-xyz/widgets`: `32.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>
Updates `CLAUDE_OPUS_MODEL` from `claude-opus-4-6` to `claude-opus-4-7`. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Workflow-only configuration change that just switches model identifiers; minimal impact beyond AI review behavior/outputs. > > **Overview** > Updates the GitHub Actions workflow `.github/workflows/claude-code-review.yml` to use newer Claude model versions by bumping `CLAUDE_OPUS_MODEL` to `claude-opus-4-7` and `CLAUDE_SONNET_MODEL` to `claude-sonnet-4-6`. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit cc04120. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
## Summary
Pins `@ledgerhq/errors` to `6.31.0` via `pnpm.overrides` to avoid an ESM
resolution bug introduced in `6.32.0`.
## The bug
When the monorepo-linked dev flow pulls in `@ledgerhq/errors@6.32.0`,
Next.js (on the server) throws at runtime:
```
Failed to load external module @solana/wallet-adapter-wallets-...:
Error [ERR_MODULE_NOT_FOUND]: Cannot find module
'.../@ledgerhq/errors/lib-es/helpers' imported from
'.../@ledgerhq/errors/lib-es/index.js'
```
The broken import is in `lib-es/index.js`:
```js
import { ... } from "./helpers"; // no .js extension
```
## Root cause
The extensionless import exists in **both 6.31.0 and 6.32.0** — the
string is identical. What changed is how Node resolves it:
- **6.31.0**: no `exports` field → Node uses legacy `main`/`module`
resolution, which tolerates extensionless relative specifiers.
- **6.32.0**: LedgerHQ PR #15316 added an `exports` map (to expose an
`@ledgerhq/source` condition for IDEs). Once `exports` is present, Node
switches to strict conditional-exports resolution, which requires
explicit file extensions under ESM → `ERR_MODULE_NOT_FOUND`.
The upstream fix would require switching the `@ledgerhq/*` TS build to
`moduleResolution: "NodeNext"` so `.js` extensions are emitted. Not on
LedgerHQ's radar yet.
## Why this only surfaced with `link:monorepo`
Published `@hyperlane-xyz/*` packages resolve `@ledgerhq/errors` to
`6.31.0` through their dep graph. The monorepo tarballs resolve to
`6.32.0`. Same project, different dep tree → different version →
different resolution path.
## Why pin to 6.31.0 instead of patching
`6.32.0` only adds five new error classes: `InvalidTransactionError`
(for `coin-tron` expired-tx handling) and four `Concordium*` errors.
None of them are referenced anywhere in this project's dep graph —
verified across `@ledgerhq/hw-transport`, `@ledgerhq/devices`,
`@ledgerhq/hw-transport-webhid`, `@solana/wallet-adapter-ledger`,
`@tronweb3/tronwallet-adapter-ledger`, and `@ledgerhq/hw-app-*`. The
only consumers are `@ledgerhq/coin-evm|tron|concordium` and Ledger Live
apps — none of which we depend on. The pin is safe until upstream fixes
the build.
## Alternatives considered
- **Patch `lib-es/index.js`** to append `.js` — works, but
version-specific and brittle.
- **`transpilePackages: ['@ledgerhq/errors']`** in `next.config.js` —
forces Next to bundle it (bundler resolver tolerates extensionless
imports). Heavier-handed and depends on Next internals.
One-line override is the simplest fix with the smallest blast radius.
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
…1063) ## Summary Clicking WalletConnect in the EVM wallet list crashed before the QR modal could render. Nothing in the UI surfaced — just an unhandled rejection in the console: ``` Uncaught (in promise) TypeError: Cannot read properties of undefined (reading 'values') at new BaseChunkLogger (...) at new ChunkLoggerController (...) at Core (...) at Client.init (...) at UniversalProvider.initialize (...) ``` ## Root cause `next.config.js` aliases `pino` to `src/utils/pino-noop.js` under Turbopack. That shim was added when we migrated to Turbopack to avoid pino's transport/worker resolution blowing up during SSR — but the alias applied to every bundling context, including the browser. `@walletconnect/logger` does `import { levels } from 'pino'` and, inside its `BaseChunkLogger` constructor, reads `levels.values[this.level]`. Our shim didn't export `levels`, so the named import was `undefined` and the first access to `.values` threw. That constructor runs synchronously during `UniversalProvider.init()`, which runs when the user picks WalletConnect, which is why the QR modal never appeared. ## Fix Scope the pino alias by resolution condition: - **browser** → `pino/browser.js` (pino's own browser build, which exports `levels` with the expected `{ values, labels }` shape). - **default (SSR/Node)** → the existing `pino-noop.js` shim, so the original transport resolution issue stays fixed. No application code needed to be touched. The WalletConnect logger gets the real `levels` export in the browser, the server still avoids pino's transport code path, and we don't carry a forked `levels` table in our shim that would need to stay in sync with pino's. Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
## Automated Dependency Update This PR updates the Hyperlane dependencies to their latest versions. **Updated versions:** - `@hyperlane-xyz/sdk`: `33.0.0` - `@hyperlane-xyz/utils`: `33.0.0` - `@hyperlane-xyz/registry`: `24.3.0` - `@hyperlane-xyz/widgets`: `33.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>
## Automated Dependency Update This PR updates the Hyperlane dependencies to their latest versions. **Updated versions:** - `@hyperlane-xyz/sdk`: `33.0.2` - `@hyperlane-xyz/utils`: `33.0.2` - `@hyperlane-xyz/registry`: `24.3.0` - `@hyperlane-xyz/widgets`: `33.0.2` **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 Several e2e tests hardcoded main-branch values (app name, default tokens, tip-card copy, specific chain names, aleo route IDs) and failed when run against production branches like `nexus`. This PR refactors them to derive values from app constants/config so they work across branches. ## Changes - **`tests/page-load/transfer-form-visible.spec.ts`** — uses `APP_NAME` for page title; derives default origin/destination token buttons from `config.defaultOriginToken`/`defaultDestinationToken` - **`tests/page-load/tip-card.spec.ts`** — skips when `!config.showTipBox`; asserts only the `.tip-card` container + `Hide tip` button (heading copy is customized per branch) - **`tests/embed/routes-param.spec.ts`** — new `resolveTestRoutes()` helper picks `warpRouteWhitelist[0]`/`[1]` on prod branches, falls back to `USDC/aleo`/`ETH/aleo` on main, skips on empty whitelist - **`tests/chain-selection/filter-by-type.spec.ts`** — derives mainnet chain from `config.defaultOriginToken`; scopes assertions to `.token-picker-chain-row` (avoids matching token rows); verifies filter behavior via row count rather than specific chain names - **`tests/helpers/constants.ts`** (new) — shared test helpers importing from `src/consts` ## Verification Ran all 9 previously-failing chromium tests on both `main` and `nexus`: - main: 9 passed (24.4s) - nexus: 9 passed (24.4s) --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
fix: include EvmM0Portal to dedupe tokens
fix: M0Portal token dedup and route resolution
## Summary Rebased `#1061` onto current `main`, on top of [#1064](#1064), and repurposed it away from the closed `#1030` stack. This PR now does 2 things on current Warp UI: 1. adds a wallet-connected Playwright E2E harness behind `?_e2e=1` 2. adds narrow regression tests for route/history and router-address correctness No production URL behavior changes. All mock-wallet wiring stays behind the explicit runtime E2E gate. ## What Changed ### E2E wallet harness - adds deterministic mock wallet wiring for: - EVM - Solana - Cosmos - Starknet - Tron - Radix - initializes `window.__WARP_E2E__` from the app so tests can: - wait for runtime readiness - inspect runtime token snapshots - capture tx payloads from mocked wallets/providers - adds Playwright coverage under `tests/e2e-wallet/` for: - smoke gating - EVM autoconnect / balance / approval / tx payload / same-symbol / destination-router / invalid-submit - Solana autoconnect / balance / same-symbol / destination-router - Cosmos autoconnect / same-symbol - Starknet autoconnect - Tron autoconnect - Radix autoconnect ### Wallet-side E2E mocks - adds app-local E2E mocks and auto-connect helpers under `src/features/wallet/_e2e/` - wallet contexts switch to deterministic mock-only connectors/adapters when `?_e2e=1` is present - current `main` wallet/provider structure is preserved; this PR only adds the E2E gate path ### Regression tests - [useMergedTransferHistory.test.ts](https://github.com/hyperlane-xyz/hyperlane-warp-ui-template/blob/pbio/warp-runtime-correctness-tests/src/features/messages/useMergedTransferHistory.test.ts) - same-symbol transfer history resolves the concrete route token rather than the wrong duplicate - [routerAddresses.test.ts](https://github.com/hyperlane-xyz/hyperlane-warp-ui-template/blob/pbio/warp-runtime-correctness-tests/src/features/routerAddresses.test.ts) - router-address normalization stays protocol-aware - mock wallet unit coverage for: - Cosmos - Starknet - Tron ### CI - adds a PR smoke workflow for the wallet harness - adds a fuller wallet E2E workflow - updates the main CI wiring to include the new test entrypoints ## Coverage Matrix Kind of coverage per VM, deliberately distinguishing adapter smoke from UI autoconnect from transfer-path so the matrix does not overstate confidence. | Protocol | Mock adapter | Adapter smoke test | UI autoconnect (Playwright) | Same-symbol dedup | Dest router correctness | Balance (mocked RPC) | Tx payload capture | Invalid submit blocked | |----------|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:| | EVM | ✅ | — | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | | Solana | ✅ | — | ✅ | ✅ | ✅ | ✅ | ⏳¹ | ⏳ | | Cosmos | ✅ | ✅ | ✅ | ✅ | ⏳ | ⏳ | ⏳² | ⏳ | | Starknet | ✅ | ✅ | ✅ | ⏳ | ⏳ | ⏳ | ⏳³ | ⏳ | | Tron | ✅ | ✅ | ✅ | ⏳ | ⏳ | ⏳ | ⏳³ | ⏳ | | Radix |⚠️ ⁴ | ⏳ | ✅ | ⏳ | ⏳ | ⏳ | ⏳ | ⏳ | | Aleo | — | — | — | — | — | — | — | — | Legend: - ✅ covered -⚠️ partial - ⏳ deferred - — not scoped Column meanings: - Mock adapter: test-only wallet/connector/client exists and is gated into the wallet context - Adapter smoke test: unit test proves deterministic address + basic contract - UI autoconnect: browser test proves the mock auto-connects end-to-end - Same-symbol / Dest router / Balance / Tx payload / Invalid submit: real flow assertions from the original ask Footnotes: 1. Solana tx payload capture is still deferred. The current harness covers route identity and balance display, but review/send payload capture would need a larger Solana fee/validation mock surface. 2. Cosmos tx payload capture is wired at the mock signer but the browser flow does not reach it yet; that would need deeper cosmos validation/network mocking. 3. Starknet/Tron payload capture would need fuller provider stubs. Current coverage is connector-level plus UI autoconnect. 4. Radix has no adapter class in the same sense; current coverage is state-seeder plus UI smoke. ## Why Warp UI still needs browser-level confidence on wallet-connected flows, duplicate-token selection, and route identity. The current unit coverage is not enough for that. This PR keeps that work compatible with current `main` instead of the now-closed `#1030` stack, and reuses the resilience improvements already merged in [#1064](#1064). ## Validation ```bash pnpm test src/features/messages/useMergedTransferHistory.test.ts \ src/features/routerAddresses.test.ts \ src/features/wallet/_e2e/MockCosmosWallet.test.ts \ src/features/wallet/_e2e/MockStarknetConnector.test.ts \ src/features/wallet/_e2e/MockTronAdapter.test.ts --run pnpm typecheck pnpm build pnpm exec playwright test tests/e2e-wallet --project=chromium ``` Latest result on this rebased branch: - unit tests: pass - `pnpm typecheck`: pass - `pnpm build`: pass - wallet Playwright suite: `21 passed` <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Medium risk: adds new CI workflows and modifies wallet provider initialization paths (though mock wiring is gated to localhost + `?_e2e=1`), so failures would primarily impact test/CI stability rather than production behavior. > > **Overview** > Adds a **wallet-connected Playwright E2E harness** behind `?_e2e=1` (localhost-only) by introducing deterministic mock wallets/connectors for EVM, Solana, Cosmos, Starknet, Tron, and Radix, plus a `window.__WARP_E2E__` global for runtime readiness, token snapshots, and tx capture. > > Updates wallet contexts to switch to mock-only adapters/connectors in E2E mode, tweaks Playwright/Next dev behavior to reduce flakes (disable Next dev indicators and adjust dev/prod server selection/timeouts), and adds extensive `tests/e2e-wallet/*` coverage with helper RPC mocks. > > Adds targeted **unit regressions** for same-symbol route/history and protocol-aware router-address normalization (exports `getRouterAddressesByChain` for testing), updates deps/scripts, and wires new CI jobs: a PR-gating `e2e-smoke` plus a main/merge-group `e2e-wallet-full` cross-browser matrix with Slack failure notification. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 265900a. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Jason Guo <33064781+Xaroz@users.noreply.github.com>
## Summary - reorganize `tests/e2e-wallet/` by feature instead of by VM - keep the actual test coverage/content unchanged - update the wallet smoke script to the new paths ## Why Follow-up to #1061. Xaroz asked for the wallet e2e suite to be grouped by feature so it is easier to see what behavior is being tested, instead of scattering that coverage across protocol folders. This is intentionally folder-only/test-discovery-only cleanup. No wallet harness logic changed. ## Layout - `tests/e2e-wallet/autoconnect/*` - `tests/e2e-wallet/balance-display/*` - `tests/e2e-wallet/destination-router/*` - `tests/e2e-wallet/same-symbol-dedup/*` - `tests/e2e-wallet/approval/*` - `tests/e2e-wallet/invalid-route/*` - `tests/e2e-wallet/tx-payload/*` - `tests/e2e-wallet/smoke/*` ## Validation - `pnpm typecheck` - `pnpm build` - `CI=1 pnpm exec playwright test tests/e2e-wallet --project=chromium` - `21 passed` <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Low risk: updates Playwright test entrypoints/import paths to match a folder reorganization, with no production code or wallet logic changes. > > **Overview** > Updates the `test:e2e:wallet:smoke` Playwright script to point at the new feature-grouped wallet E2E spec locations. > > Moves the wallet smoke gate spec under `tests/e2e-wallet/smoke/` and fixes its helper imports to the new relative paths. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 1f7a9de. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
…p-webkit test: fix firefox e2e race, drop webkit from matrix
## Summary Fix flaky Firefox e2e: [run 24893767726](https://github.com/hyperlane-xyz/hyperlane-warp-ui-template/actions/runs/24893767726/job/72892996462). The test `Base and Arbitrum destinations resolve distinct non-empty remote-token addresses` runs two full capture flows in sequence — each calls `waitForWarpRuntime` (20s budget) + token-picker modal waits (30s budget each) + review-panel wait (30s). Under Firefox on CI the whole sequence regularly blows the default 30s test timeout, producing cascading "modal not hidden / not visible / waitForWarpRuntime timeout" errors across the initial run and both retries. Bump the per-test timeout to 180s to match the existing pattern used in `approval/evm.spec.ts` and `tx-payload/evm.spec.ts`, which also chain multi-step picker flows. ## Test plan - [ ] e2e-wallet (firefox) CI job passes on this branch - [ ] No regression in chromium e2e-wallet 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
## Summary Same root cause + fix as [hyperlane-explorer#323](hyperlane-xyz/hyperlane-explorer#323), applied to the display side of the warp-ui. `formatMessageAmount` fell back to per-route `wireDecimals = max(decimals)` when a token had no `scale` field. On-chain routers (`TokenRouter` for EVM, `HyperlaneToken` for SVM) default to identity scale when unset, so the wire amount is always in the token's native-decimal space — no implicit max-decimals normalization to invert. ### The bug this fixes USDT route: BSC has `decimals: 18, scale: {1, 1e12}` (compresses to 6-dec wire). The Eclipse and Solana entries have **no `scale`** in the registry, so `Math.max(decimals) = 18` was used to interpret a 6-dec wire amount → `fromWei(1_000_000, 18)` ≈ 0 → sidebar showed **"USDT 0"** for SVM → Tron transfers (and would for any other route where the origin chain isn't the max-decimal chain). Tron → SVM works because Tron has `scale: {1, 1}` set, hitting the scaled branch. The on-chain transfer itself is correct in both directions — only the display was off, masked by localStorage cache between page changes. ### What changes - `src/features/transfer/scaleUtils.ts` — `formatMessageAmount` now uses `token.decimals` directly. Drops the `routerAddressesByChainMap` and `chainName` params. - `src/features/messages/useMergedTransferHistory.ts` — `messageToTransferContext` no longer takes `routerAddressesByChainMap`. - `src/features/wallet/SideBarMenu.tsx` — call sites updated; the `routerAddressesByChainMap` prop drilled into `TransferSummary` is removed (the sub-component no longer needs it). - `src/features/transfer/TransferTokenForm.tsx` — recipient validation switches from `obj?.[addr]` to `set.has(addr)`. - `src/features/store.ts`: - `RouterAddressInfo` interface deleted (was just `{ wireDecimals: number }`). - `routerAddressesByChainMap` collapses to `Record<ChainName, Set<string>>` — remaining consumers only need membership checks (recipient validation) and key iteration (warp-route filter for message history). - `getRouterAddressesByChain` drops the `wireDecimalsMap` param and returns the new shape. - `src/features/warpCore/warpCoreConfig.ts` — `buildWireDecimalsMap` and `WireDecimalsMap` deleted; `assembleWarpCoreConfig` no longer returns a wireDecimalsMap. - Tests updated. ### Why `wireDecimals` doesn't reflect on-chain reality (verified) - **EVM `TokenRouter`** applies `messageAmount = localAmount * scaleNumerator / scaleDenominator`, with the constructor enforcing `scale > 0` — defaulting to `{1, 1}` (identity) when unset. - **SVM `HyperlaneToken`** stores `decimals` and `remote_decimals` and applies `convert_decimals(amount, decimals, remote_decimals)` — identity when both are equal (the SVM equivalent of `scale: {1, 1}`). There is no implicit "normalize to max(decimals) of route" anywhere in the contracts. `wireDecimals = Math.max(decimals)` was a heuristic that only ever produced the right number when the origin chain happened to be the max-decimal chain in the route. The SDK's transfer-side helper (`messageAmountFromLocal`) already defaults `scale: undefined → {1, 1}`, so this PR aligns the display path with the transfer path. ## Test plan - [x] `pnpm run typecheck` — clean - [x] `pnpm run lint` — 3 pre-existing warnings in untouched files, 0 errors - [x] `pnpm run format` - [x] `pnpm exec vitest run src/features/transfer/scaleUtils.test.ts src/features/messages/useMergedTransferHistory.test.ts src/features/routerAddresses.test.ts` — 15/15 pass - [ ] Smoke-test in dev: SVM → Tron USDT message in the sidebar TransactionHistory should show the correct amount (after a fresh page load that bypasses localStorage cache) - [ ] Recipient validation still rejects warp-route addresses (TransferTokenForm) - [ ] Message history filtering still picks up local transfers (SideBarMenu warpRouteAddresses) Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
## Summary - Adds attestation fetching from the Nexus UI for warp routes with a `PredicateRouterWrapper` configured - Server-side proxy (`/api/predicate/attestation`) keeps `PREDICATE_API_KEY` off the client and prevents SSRF via HTTPS enforcement and domain allowlist - Attestation is fetched before fee estimation and transfer execution; errors surface as user-facing toasts rather than silent fallbacks - Transfer status tracks a `FetchingAttestation` stage so users see progress ## How it works 1. On fee estimation and transfer, `fetchPredicateAttestation` calls `warpCore.isPredicateSupported(token, destination)` to detect predicate routes on-chain (traverses the hook tree for a `PredicateRouterWrapper`) 2. If required, a temp transaction is built to obtain calldata, which is posted to the Predicate API via the Next.js proxy to get an attestation 3. The attestation is passed to `getTransferRemoteTxs` / `estimateTransferRemoteFees`, which routes through `transferRemoteWithAttestation` on the wrapper ## Configuration ``` PREDICATE_API_KEY=your_predicate_api_key_here # server-side only PREDICATE_API_URL=https://api.predicate.io/v2/attestation # optional override ``` ## Notes - Draft: depends on the SDK predicate implementation being merged (`warpCore.isPredicateSupported` is guarded with a typeof check for older SDKs) - Non-predicate routes are unaffected — `isPredicateSupported` returns `false` and the existing flow runs unchanged --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: pbio <10051819+paulbalaji@users.noreply.github.com>
Fixes the main input field to not change the values on scrolling anymore (often happened to me when scrolling down) and disallowing negative values
chore: update CODEOWNERS file
…1086) ## Summary Mirrors the existing `chainMetadata` flow for chain contract addresses, with two related upsides: 1. **Single source of truth** — `chainAddresses` is loaded once at warp context init and exposed via the Zustand store. Consumers read it synchronously instead of awaiting `registry.getAddresses()`. 2. **Filesystem override pattern** — adds `src/consts/chainAddresses.yaml` and `chainAddresses.ts` parallel to `chains.yaml` / `chains.ts`. Useful for local dev / forks that want to extend the registry without patching the store. While restructuring, also lazy-loads the published `chainAddresses` and `chainMetadata` constants from `@hyperlane-xyz/registry` so they're shed from the initial bundle. ## Changes ### Address resolution mirrors metadata - `src/features/chains/addresses.ts` — new helper `assembleChainAddresses(chainsInTokens, registry)`. Spreads `{...chainAddressesYaml, ...chainAddressesTS}`, validates with `ChainAddressesSchema`, fetches from registry (or falls back to the published constant), filters to chains referenced by warp routes, and merges filesystem on top of registry per key. - `src/features/store.ts` — adds `chainAddresses: ChainMap<ChainAddresses>` to `WarpContext` / `AppState`, populated alongside `chainMetadata` via `Promise.all` in `initWarpContext`. - `src/consts/chainAddresses.yaml` + `src/consts/chainAddresses.ts` — empty templates (commented examples). ### Existing consumers migrated to the store - `src/features/balances/evm.ts` — `fetchChainBalances` and `getBatchAddress` now accept `ChainMap<ChainAddresses>` as a parameter. - `src/features/balances/hooks.ts` — reads `chainAddresses` from the store and passes to `fetchChainBalances`. ### Bundle: lazy-load the published registry constants - The published `chainAddresses` (~420 KB raw / ~80 KB gz) and `chainMetadata` (~384 KB raw / ~80 KB gz) constants from `@hyperlane-xyz/registry` are no longer statically imported. They're resolved via dynamic `import('@hyperlane-xyz/registry')` only on: - registry fetch failure in `assembleChainMetadata` / `assembleChainAddresses` - `listRegistryContent` failure in `initWarpContext` (PartialRegistry fallback path) - the no-`NEXT_PUBLIC_REGISTRY_URL` branch in `assembleChainMetadata` (rare path used when no custom registry is configured) - Webpack/Turbopack emits one shared async chunk for the registry package; both lazy imports dedupe. ## Side effects worth flagging - **Cold-start regression for deployments without `NEXT_PUBLIC_REGISTRY_URL`**: bounded by one chunk fetch on first load (~100–300ms), then cached. Production deployments that set the env var only hit the lazy paths on registry-failure (already an error path). - API of `assembleChainMetadata` / `getBatchAddress` / `fetchChainBalances` changed (additive param). Internal only. ## Verification - `pnpm format`, `pnpm lint`, `pnpm typecheck` clean. - `pnpm test` — 22 files, 231 tests pass. --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Implements the relay api and calls it only if the message originates from a cctp v2 route. The new env variable NEXT_PUBLIC_RELAY_API_URL has been already added to vercel
## Summary - Integrate offchain fee quoting service from hyperlane-xyz/hyperlane-monorepo#8404 - Add Next.js API route proxy (`/api/quote`) to keep `FEE_QUOTING_API_KEY` server-side - Add `useQuotedCalls` hook for offchain fee quoting via `QuotedCalls` contract - Thread `QuotedCallsParams` from fee display through to `warpCore.getTransferRemoteTxs({ quotedCalls })` - Falls back to existing onchain fee estimation when not configured or for non-EVM chains ## Test plan - [ ] Set `NEXT_PUBLIC_FEE_QUOTING_URL` and `FEE_QUOTING_API_KEY`, verify offchain quotes fetched - [ ] Verify QuotedCalls.execute() tx sent instead of direct transferRemote - [ ] Without env vars: verify existing onchain flow unchanged - [ ] Non-EVM chains fall back to onchain quoting 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com> Co-authored-by: Xaroz <jasonguo2013jg@gmail.com>
Reenable phantom and backpack adapter in solana context so there is a suggestion to download those adapters when they are not installed
## Summary Fixes route availability labeling in the token picker. When selecting an origin token, the picker now treats a token as available if it can route to any listed destination, because origin selection can auto-switch the destination. Destination selection remains strict against the current origin. ## Root Cause The picker reused strict current-pair route checking for both selection modes. That made routable tokens like Fluent BLEND/USDnr appear as "Route unavailable" when the current default destination was Base USDC, even though selecting those origin tokens can move the user onto a valid route. ## Validation - `pnpm vitest src/features/tokens/utils.test.ts --run` - `pnpm typecheck` - `pnpm lint` (passes with existing no-console warnings outside this change) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Changes the token picker's route-availability computation and React effect dependencies, which can affect which tokens appear selectable/disabled and how lists are sorted; main risk is UI logic regressions or stale route state. > > **Overview** > Fixes token picker route availability so **origin selection** marks a token routable if it can reach *any* listed destination (since the destination may auto-switch), while **destination selection** remains strict to the current origin. > > This introduces `checkTokenPickerHasRoute`, `checkTokenPairHasRoute`, and `getDefaultTokens` in `utils.ts`, updates `TokenList` to maintain separate strict-vs-picker route maps (with a masked dependency to avoid unnecessary recomputation in origin mode), and adjusts the route-unavailable tooltip copy/layout. Adds targeted unit tests covering the new routability semantics and default-token gating. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit c01e2a8. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
# Conflicts: # .github/workflows/ci.yml # .prettierignore # next-env.d.ts # next.config.js # package.json # pnpm-lock.yaml # public/android-chrome-192x192.png # public/android-chrome-512x512.png # public/apple-touch-icon.png # public/favicon-16x16.png # public/favicon-32x32.png # public/favicon.png # public/logo.png # public/mstile-150x150.png # src/components/buttons/ConnectAwareSubmitButton.tsx # src/components/icons/TokenIcon.tsx # src/components/layout/AppLayout.tsx # src/components/nav/Footer.tsx # src/components/nav/Header.tsx # src/components/tip/TipCard.tsx # src/consts/app.ts # src/consts/chains.ts # src/consts/config.ts # src/consts/links.ts # src/consts/warpRouteWhitelist.test.ts # src/consts/warpRouteWhitelist.ts # src/features/analytics/types.ts # src/features/analytics/useWalletConnectionTracking.tsx # src/features/analytics/utils.ts # src/features/chains/ChainSelectField.tsx # src/features/chains/metadata.ts # src/features/chains/utils.ts # src/features/limits/utils.test.ts # src/features/limits/utils.ts # src/features/store.ts # src/features/tokens/TokenListModal.tsx # src/features/tokens/TokenSelectField.tsx # src/features/tokens/hooks.ts # src/features/tokens/types.ts # src/features/tokens/useTokenPrice.tsx # src/features/tokens/utils.test.ts # src/features/tokens/utils.ts # src/features/transfer/FeeSectionButton.tsx # src/features/transfer/TransferFeeModal.tsx # src/features/transfer/TransferTokenForm.tsx # src/features/transfer/fees.test.ts # src/features/transfer/fees.ts # src/features/transfer/maxAmount.ts # src/features/transfer/useFeeQuotes.ts # src/features/transfer/useTokenTransfer.ts # src/features/transfer/utils.ts # src/features/wallet/WalletConnectionWarning.tsx # src/features/wallet/context/EvmWalletContext.tsx # src/features/wallet/context/RadixWalletContext.tsx # src/features/wallet/context/StarknetWalletContext.tsx # src/features/warpCore/warpCoreConfig.ts # src/images/logos/app-logo.svg # src/images/logos/app-name.svg # src/pages/_app.tsx
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR was automatically created to merge changes from
mainintoinjective.