Skip to content

feat: handle hdwallet BIP44Params - #11617

Merged
gomesalexandre merged 10 commits into
developfrom
feat_gridplus_deriv_path_evm
Jan 12, 2026
Merged

feat: handle hdwallet BIP44Params#11617
gomesalexandre merged 10 commits into
developfrom
feat_gridplus_deriv_path_evm

Conversation

@gomesalexandre

@gomesalexandre gomesalexandre commented Jan 11, 2026

Copy link
Copy Markdown
Contributor

Description

Web fren of shapeshift/hdwallet#781

Uses wallet.ethGetAccountPaths() to get the correct derivation path for each wallet type instead of hardcoding Ledger Live style paths for all wallets.

  • GridPlus/Trezor use correct BIP44 params (m/44'/60'/0'/0/N where address index varies)
  • Ledger/KeepKey/Native continue using Ledger Live params (m/44'/60'/N'/0/0 where account varies)

Path comparison for accounts 0+:

Account Before (Ledger Live for all) After (wallet-native)
GridPlus/Trezor 0 m/44'/60'/0'/0/0 m/44'/60'/0'/0/0 ← Same
GridPlus/Trezor 1 m/44'/60'/1'/0/0 m/44'/60'/0'/0/1
GridPlus/Trezor 2 m/44'/60'/2'/0/0 m/44'/60'/0'/0/2
Ledger/KeepKey 1 m/44'/60'/1'/0/0 m/44'/60'/1'/0/0 ← Unchanged

Note: Account 0 is unaffected. This fix only affects accounts 1+ on EVM chains.

Issue (if applicable)

closes #11593

Risk

High in theory, Medium in reality - changes derivation path logic for hardware wallets.

Rationale of medium:

  1. That's EVM only
  2. We will in effect hit the same as before for all, except Trezor (we were never hitting the right one and that was an actual bug) and Gridplus (following hdwallet ethGetNextAccount() path change to support conventional BIP44)
  3. Only applies to accounts 0+

What protocols, transaction types, wallets or contract interactions might be affected by this PR?

  • GridPlus EVM transactions (accounts 1+)
  • Trezor EVM transactions (accounts 1+)
  • All other wallets unaffected (Ledger, KeepKey, Native use same paths as before)

Testing

Engineering

GridPlus (BIP44 fix):

  1. Connect GridPlus device
  2. Add account 1+ for any EVM chain
  3. Verify address matches what GridPlus shows on-device
  4. Verify address matches Rabby/MetaMask with same seed using BIP44 derivation
  5. Sign a transaction - should succeed

Trezor (BIP44 fix):

  1. Connect Trezor device
  2. Add account 1+ for any EVM chain
  3. Verify BIP44 params are the same as GridPlus if using the same seed
  4. Can be tested by comparing addresses against Trezor Suite UI, or with iancoleman, or with Rabby by importing your seed and choosing BIP44 derivation path
  5. Sign a transaction - should succeed

Native (regression test - Ledger Live params):

  1. Use Native wallet
  2. Verify accounts 0+ still derive correct addresses (same as before)
  3. Sign a transaction - should succeed

Ledger (regression test - Ledger Live params):

  1. Connect Ledger device
  2. Verify accounts 0+ still derive correct addresses (same as before, Ledger Live style)
  3. Addresses should match Ledger Live app
  4. Sign a transaction - should succeed

KeepKey (regression test - Ledger Live params):

  1. Connect KeepKey device
  2. Verify accounts 0+ still derive correct addresses (same as before)
  3. Sign a transaction - should succeed

Operations

  • 🏁 My feature is behind a flag and doesn't require operations testing (yet)

Requires testing GridPlus and Trezor hardware wallets with accounts 1+. Regression testing needed for Ledger, KeepKey, and Native wallets.

Screenshots (if applicable)

GridPlus fix

Screenshot 2026-01-11 at 23 48 18 Screenshot 2026-01-11 at 23 46 23

https://jam.dev/c/71ddb966-d189-4c3a-b282-134683fdc583

Trezor fix

https://jam.dev/c/1f756134-8feb-48b5-8c2b-a408b5854f3a

Native regression test

https://jam.dev/c/7cce1023-300b-4ec0-9da4-e8376448ba85

Summary by CodeRabbit

  • New Features

    • Improved EVM wallet compatibility by honoring wallet-native derivation paths and supporting optional derivation-path overrides.
  • Improvements

    • Bumped hdwallet-related packages to the latest patch versions for integration and stability.
  • Documentation

    • Expanded publish/setup guide with explicit commands, a verification step for registry URL, and clarified that registry configuration is session-scoped.

✏️ Tip: You can customize this high-level summary in your review settings.

gomesalexandre and others added 4 commits January 8, 2026 02:49
Uses wallet.ethGetAccountPaths() to get the correct derivation path
for each wallet type instead of hardcoding Ledger Live style paths.

This fixes GridPlus and Trezor which use BIP44 style m/44'/60'/0'/0/N
instead of Ledger Live style m/44'/60'/N'/0/0.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Updates buildSendApiTransaction and buildCustomApiTx to accept
optional addressNList parameter for wallet-specific derivation paths.

buildSendTransaction and buildCustomTx now compute the correct path
from wallet.ethGetAccountPaths() and pass it to the API builders.

This ensures transaction signing uses the same derivation path as
address derivation for BIP44 wallets like GridPlus and Trezor.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jan 11, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Review was skipped due to path filters

⛔ Files ignored due to path filters (1)
  • yarn.lock is excluded by !**/yarn.lock, !**/*.lock

CodeRabbit blocks several paths by default. You can override this behavior by explicitly including those paths in the path filters. For example, including **/dist/** will override the default block on the dist directory, by removing the pattern from both the lists.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

📝 Walkthrough

Walkthrough

This PR adds wallet-native derivation path support to EVM adapters, threads optional addressNList through transaction APIs, and bumps several @shapeshiftoss/hdwallet deps to 1.62.39. It also clarifies Verdaccio local-publish instructions in SKILL.md.

Changes

Cohort / File(s) Summary
Documentation & Publish Pipeline
.claude/skills/hdwallet-verdaccio-local-publish-pipeline/SKILL.md
Reworked Verdaccio setup flow and clarified that registry configuration is session-scoped; adjusted publish steps and verification command.
Workspace Dependency Bumps
package.json, packages/swapper/package.json, packages/chain-adapters/package.json
Bumped @shapeshiftoss/hdwallet-* packages (e.g., hdwallet-core, hdwallet-ledger) from 1.62.38 → 1.62.39.
Type Definitions
packages/chain-adapters/src/evm/types.ts, packages/chain-adapters/src/types.ts
Added optional addressNList?: number[] to BuildCustomApiTxInput and BuildSendApiTxInput<T> to allow wallet-provided derivation path overrides.
EVM Adapter Logic
packages/chain-adapters/src/evm/EvmBaseAdapter.ts
Prefer wallet-provided paths: resolve addressNList by (1) input override, (2) wallet.ethGetAccountPaths(), (3) fallback to getBip44ParamstoAddressNList; propagate resolved list through send/build/getAddress flows.

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant EvmBaseAdapter
    participant Wallet

    Client->>EvmBaseAdapter: buildSendTransaction(input)
    EvmBaseAdapter->>EvmBaseAdapter: check input.addressNList
    alt input.addressNList present
        EvmBaseAdapter->>EvmBaseAdapter: use provided addressNList
    else
        EvmBaseAdapter->>Wallet: ethGetAccountPaths(request)
        alt Wallet returns native paths
            Wallet-->>EvmBaseAdapter: native address paths
            EvmBaseAdapter->>EvmBaseAdapter: derive addressNList from wallet paths
        else Wallet doesn't support
            EvmBaseAdapter->>EvmBaseAdapter: fallback to getBip44Params() -> toAddressNList()
        end
    end
    EvmBaseAdapter->>EvmBaseAdapter: build/sign tx using resolved addressNList
    EvmBaseAdapter-->>Client: return signed/broadcast result
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • NeOMakinG

Poem

🐰 I hopped through paths both new and old,

Wallet whispers now get told,
BIP44 or Ledger's art,
Each account found its part,
A joyful hop — derivations bold.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The PR title 'feat: handle hdwallet BIP44Params' accurately describes the main change: adding support for wallet-specific BIP44 derivation parameters in the EVM adapter.
Linked Issues check ✅ Passed All coding objectives from issue #11593 are met: wallet.ethGetAccountPaths() is used for derivation paths, addressNList is passed through transaction builders, hdwallet package versions are bumped, and types are updated to support wallet-specific path overrides.
Out of Scope Changes check ✅ Passed All changes are directly related to the stated objective of handling wallet-specific BIP44 derivation paths; no unrelated modifications detected.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat_gridplus_deriv_path_evm

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@gomesalexandre gomesalexandre changed the title feat: honor hdwallet BIP44 params feat: handle hdwallet BIP44Params Jan 11, 2026
@gomesalexandre
gomesalexandre marked this pull request as ready for review January 11, 2026 23:29
@gomesalexandre
gomesalexandre requested a review from a team as a code owner January 11, 2026 23:29
Comment thread packages/chain-adapters/src/evm/EvmBaseAdapter.ts Outdated
Comment thread packages/chain-adapters/src/evm/EvmBaseAdapter.ts Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (2)
.claude/skills/hdwallet-verdaccio-local-publish-pipeline/SKILL.md (1)

24-24: Consider verifying both yarn and npm registry configurations.

Since the setup step configures both yarn (yarn config set npmRegistryServer) and npm (npm set registry), the verification should check both to ensure the configuration succeeded completely.

📋 Proposed enhancement to verification step
-Verify with: `npm config get registry` (should show `http://127.0.0.1:4873`)
+Verify with:
+```bash
+npm config get registry  # should show http://127.0.0.1:4873
+yarn config get npmRegistryServer  # should show http://127.0.0.1:4873
+```
packages/chain-adapters/src/evm/EvmBaseAdapter.ts (1)

371-382: Consider extracting wallet path resolution to a helper.

The IIFE pattern for extracting addressNList from wallet.ethGetAccountPaths is repeated 4 times (here, getAddress, getAddresses, buildCustomTx). Consider extracting to a private helper method for DRYness.

♻️ Optional helper extraction
+  private getWalletAddressNList(wallet: HDWallet, accountNumber: number): number[] | undefined {
+    const paths = (wallet as ETHWallet).ethGetAccountPaths?.({
+      coin: 'Ethereum',
+      accountIdx: accountNumber,
+    })
+    return paths?.[0]?.addressNList
+  }
+
   async buildSendTransaction(input: BuildSendTxInput<T>): Promise<{
     txToSign: SignTx<T>
   }> {
     try {
       this.assertSupportsChain(input.wallet)

       const from = await this.getAddress(input)

-      // Get wallet-native path if available (fixes BIP44 wallets like GridPlus/Trezor)
-      const addressNList = (() => {
-        const paths = input.wallet.ethGetAccountPaths?.({
-          coin: 'Ethereum',
-          accountIdx: input.accountNumber,
-        })
-        if (paths?.[0]?.addressNList) return paths[0].addressNList
-        return undefined
-      })()
+      const addressNList = this.getWalletAddressNList(input.wallet, input.accountNumber)

       const txToSign = await this.buildSendApiTransaction({ ...input, from, addressNList })
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 79bfdd7 and a86f13e.

📒 Files selected for processing (7)
  • .claude/skills/hdwallet-verdaccio-local-publish-pipeline/SKILL.md
  • package.json
  • packages/chain-adapters/package.json
  • packages/chain-adapters/src/evm/EvmBaseAdapter.ts
  • packages/chain-adapters/src/evm/types.ts
  • packages/chain-adapters/src/types.ts
  • packages/swapper/package.json
🧰 Additional context used
📓 Path-based instructions (3)
**/*.{ts,tsx,js,jsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx,js,jsx}: Never assume a library is available - always check imports/package.json first
Prefer composition over inheritance
Write self-documenting code with clear variable and function names
Keep functions small and focused on a single responsibility
Avoid deep nesting - use early returns instead
Prefer procedural and easy to understand code
Never expose, log, or commit secrets, API keys, or credentials
Validate all inputs, especially user inputs
Handle errors gracefully with meaningful messages
Don't silently catch and ignore exceptions
Log errors appropriately for debugging
Provide fallback behavior when possible
Use appropriate data structures for the task
Never add code comments unless explicitly requested
When modifying code, do not add comments that reference previous implementations or explain what changed. Comments should only describe the current logic and functionality.
Use meaningful names for branches, variables, and functions
Always run yarn lint --fix and yarn type-check after making changes
Avoid let variable assignments - prefer const with inline IIFE switch statements or extract to functions for conditional logic

Files:

  • packages/chain-adapters/src/types.ts
  • packages/chain-adapters/src/evm/types.ts
  • packages/chain-adapters/src/evm/EvmBaseAdapter.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx}: Avoid useEffect where practical - use it only when necessary and following best practices
Avoid 'any' types - use specific type annotations instead
For default values with user overrides, use computed values (useMemo) instead of useEffect - pattern: userSelected ?? smartDefault ?? fallback
When function parameters are unused due to interface requirements, refactor the interface or implementation to remove them rather than prefixing with underscore
Sanitize data before displaying to prevent XSS
Memoize aggressively - wrap component variables in useMemo and callbacks in useCallback where possible
For static JSX icon elements (e.g., <TbCopy />) that don't depend on state/props, define them as constants outside the component to avoid re-renders instead of using useMemo
Account for light/dark mode using useColorModeValue hook
Account for responsive mobile designs in all UI components
When applying styles, use the existing standards and conventions of the codebase
Use Chakra UI components and conventions
All copy/text must use translation keys - never hardcode strings
Use the translation hook: useTranslate() from react-polyglot
Use useFeatureFlag('FlagName') hook to access feature flag values in components
Prefer type over interface for type definitions
Use strict typing - avoid any
Use Nominal types for domain identifiers (e.g., WalletId, AccountId)
Import types from @shapeshiftoss/caip for chain/account/asset IDs
Use useAppSelector for Redux state
Use useAppDispatch for Redux actions
Memoize expensive computations with useMemo
Memoize callbacks with useCallback

**/*.{ts,tsx}: Use Result<T, E> pattern for error handling in swappers and APIs; ALWAYS use Ok() and Err() from @sniptt/monads; AVOID throwing within swapper API implementations
ALWAYS use custom error classes from @shapeshiftoss/errors with meaningful error codes for internationalization and relevant details in error objects
ALWAYS wrap async op...

Files:

  • packages/chain-adapters/src/types.ts
  • packages/chain-adapters/src/evm/types.ts
  • packages/chain-adapters/src/evm/EvmBaseAdapter.ts
**/*.{js,jsx,ts,tsx}

📄 CodeRabbit inference engine (.cursor/rules/naming-conventions.mdc)

**/*.{js,jsx,ts,tsx}: Use camelCase for variables, functions, and methods with descriptive names that explain the purpose
Use verb prefixes for functions that perform actions (e.g., fetch, validate, execute, update, calculate)
Use UPPER_SNAKE_CASE for constants and configuration values with descriptive names
Use handle prefix for event handlers with descriptive names in camelCase
Use descriptive boolean variable names with is, has, can, should prefixes
Use named exports for components, functions, and utilities instead of default exports
Use descriptive import names and avoid renaming imports unless necessary
Avoid non-descriptive variable names like data, item, obj, and single-letter variable names except in loops
Avoid abbreviations in names unless they are widely understood
Avoid generic function names like fn, func, or callback

Files:

  • packages/chain-adapters/src/types.ts
  • packages/chain-adapters/src/evm/types.ts
  • packages/chain-adapters/src/evm/EvmBaseAdapter.ts
🧠 Learnings (33)
📓 Common learnings
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 11170
File: patches/@shapeshiftoss+bitcoinjs-lib+7.0.0-shapeshift.0.patch:9-19
Timestamp: 2025-11-25T21:43:10.838Z
Learning: In shapeshift/web, gomesalexandre will not expand PR scope to fix latent bugs in unused API surface (like bitcoinjs-lib patch validation methods) when comprehensive testing proves the actual used code paths work correctly, preferring to avoid costly hdwallet/web verdaccio publish cycles and full regression testing for conceptual issues with zero runtime impact.
Learnt from: CR
Repo: shapeshift/web PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T21:20:04.979Z
Learning: Branch naming: Use descriptive names (e.g., `feat_gridplus`, `fix_wallet_connect`)
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10461
File: src/plugins/walletConnectToDapps/components/modals/EIP712MessageDisplay.tsx:21-24
Timestamp: 2025-09-12T13:16:27.004Z
Learning: gomesalexandre declined to add error boundaries to WalletConnect modals in PR #10461, stating "no error boundaries in this pr ser", consistent with his preference to keep PR scope focused and defer tangential improvements to separate efforts.
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10461
File: src/plugins/walletConnectToDapps/components/modals/SessionProposal.tsx:55-67
Timestamp: 2025-09-13T15:31:38.011Z
Learning: gomesalexandre tested WalletConnect method permissions with MetaMask and WalletConnect's official demo, finding that neither strictly honors method filtering by intersection of requested/supported methods. He prefers aligning with industry standard practices (granting broader EIP-155 method permissions) over theoretical security restrictions when real-world testing shows permissive behavior is the norm.
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10458
File: src/plugins/walletConnectToDapps/components/modals/EIP712MessageDisplay.tsx:46-59
Timestamp: 2025-09-10T15:34:54.593Z
Learning: After extensive testing by gomesalexandre in PR #10458, dApps do not send EIP-712 domain.chainId as hex or bigint values in practice. The simple String(domain.chainId) conversion is sufficient for real-world usage in WalletConnect dApps structured signing.
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10461
File: src/plugins/walletConnectToDapps/components/modals/EIP712MessageDisplay.tsx:133-137
Timestamp: 2025-09-12T10:15:10.389Z
Learning: gomesalexandre has identified that EIP-712 domain chainId should be preferred over request context chainId for accuracy in WalletConnect dApps structured signing flows. The domain chainId from the parsed message is more specific and accurate than the general request context, especially for asset resolution and network-specific operations.
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10461
File: src/plugins/walletConnectToDapps/hooks/useSimulateEvmTransaction.ts:0-0
Timestamp: 2025-09-12T13:44:17.019Z
Learning: gomesalexandre prefers letting chain adapter errors throw naturally in useSimulateEvmTransaction rather than adding explicit error handling for missing adapters, consistent with his fail-fast approach and dismissal of defensive validation as "stale" in WalletConnect transaction simulation flows.
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10857
File: src/plugins/walletConnectToDapps/eventsManager/useWalletConnectEventsHandler.ts:101-104
Timestamp: 2025-10-23T14:27:19.073Z
Learning: In WalletConnect wallet_switchEthereumChain and wallet_addEthereumChain requests, the chainId parameter is always present as per the protocol spec. Type guards checking for missing chainId in these handlers (like `if (!evmNetworkIdHex) return`) are solely for TypeScript compiler satisfaction, not real runtime edge cases.
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 11377
File: src/lib/referral/api.ts:30-57
Timestamp: 2025-12-12T16:20:33.904Z
Learning: In shapeshift/web referral feature, the backend expects an EVM address (0x… viem Address) as the owner identifier, not a CAIP AccountId. Update useReferral to derive the first connected EVM address via fromAccountId + getAddress, and do not URL-encode it in the API path.
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 11012
File: src/context/WalletProvider/Vultisig/components/Connect.tsx:24-59
Timestamp: 2025-11-19T16:59:50.569Z
Learning: In src/context/WalletProvider/*/components/Connect.tsx files across the ShapeShift web codebase, the established pattern for handling null/undefined adapter from getAdapter() is to simply check `if (adapter) { ... }` without an else clause. All wallet Connect components (Coinbase, Keplr, Phantom, Ledger, MetaMask, WalletConnectV2, KeepKey, Vultisig) follow this pattern—they reset loading state after the if block but do not show error messages when adapter is null. This is an intentional design decision and should be maintained for consistency.
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10206
File: src/config.ts:127-128
Timestamp: 2025-08-07T11:20:44.614Z
Learning: gomesalexandre prefers required environment variables without default values in the config file (src/config.ts). They want explicit configuration and fail-fast behavior when environment variables are missing, rather than having fallback defaults.
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10461
File: src/plugins/walletConnectToDapps/components/modals/ContractInteractionBreakdown.tsx:0-0
Timestamp: 2025-09-13T16:45:18.813Z
Learning: gomesalexandre prefers aggressively deleting unused/obsolete code files ("ramboing") rather than fixing technical issues in code that won't be used, demonstrating his preference for keeping codebases clean and PR scope focused.
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10458
File: src/plugins/walletConnectToDapps/types.ts:7-7
Timestamp: 2025-09-10T15:34:29.604Z
Learning: gomesalexandre is comfortable relying on transitive dependencies (like abitype through ethers/viem) rather than explicitly declaring them in package.json, preferring to avoid package.json bloat when the transitive dependency approach works reliably in practice.
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10503
File: .env:56-56
Timestamp: 2025-09-16T13:17:02.938Z
Learning: gomesalexandre prefers to enable feature flags globally in the base .env file when the intent is to activate features everywhere, even when there are known issues like crashes, demonstrating his preference for intentional global feature rollouts over cautious per-environment enablement.
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10249
File: src/pages/ThorChainLP/components/ReusableLpStatus/TransactionRow.tsx:447-503
Timestamp: 2025-08-13T17:07:10.763Z
Learning: gomesalexandre prefers relying on TypeScript's type system for validation rather than adding defensive runtime null checks when types are properly defined. They favor a TypeScript-first approach over defensive programming with runtime validations.
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10276
File: src/hooks/useActionCenterSubscribers/useThorchainLpDepositActionSubscriber.tsx:61-66
Timestamp: 2025-08-14T17:51:47.556Z
Learning: gomesalexandre is not concerned about structured logging and prefers to keep console.error usage as-is rather than implementing structured logging patterns, even when project guidelines suggest otherwise.
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10413
File: src/components/Modals/FiatRamps/fiatRampProviders/onramper/utils.ts:29-55
Timestamp: 2025-09-02T14:26:19.028Z
Learning: gomesalexandre prefers to keep preparatory/reference code simple until it's actively consumed, rather than implementing comprehensive error handling, validation, and robustness improvements upfront. They prefer to add these improvements when the code is actually being used in production.
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10276
File: src/pages/ThorChainLP/components/ReusableLpStatus/TransactionRow.tsx:396-402
Timestamp: 2025-08-14T17:55:57.490Z
Learning: gomesalexandre is comfortable with functions/variables that return undefined or true (tri-state) when only the truthy case matters, preferring to rely on JavaScript's truthy/falsy behavior rather than explicitly returning boolean values.
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10783
File: src/context/ModalStackProvider/useModalRegistration.ts:30-41
Timestamp: 2025-10-16T11:14:40.657Z
Learning: gomesalexandre prefers to add lint rules (like typescript-eslint/strict-boolean-expressions for truthiness checks on numbers) to catch common issues project-wide rather than relying on code review to catch them.
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10206
File: src/lib/moralis.ts:47-85
Timestamp: 2025-08-07T11:22:16.983Z
Learning: gomesalexandre prefers console.error over structured logging for Moralis API integration debugging, as they find it more conventional and prefer to examine XHR requests directly rather than rely on structured logs for troubleshooting.
📚 Learning: 2025-11-19T22:20:25.661Z
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10767
File: package.json:324-324
Timestamp: 2025-11-19T22:20:25.661Z
Learning: In shapeshift/web package.json, the resolution "gridplus-sdk/bs58check": "2.1.2" is intentional and must not be removed. It forces gridplus-sdk's transitive bs58check dependency from 4.0.0 down to 2.1.2 because bs58check 4.0.0 breaks legacy address validation (due to bs58 v6.0.0 and noble/hash vs 2.1.2's bs58 v4.0.0 and create-hash).

Applied to files:

  • packages/chain-adapters/package.json
  • packages/swapper/package.json
  • package.json
📚 Learning: 2025-08-08T20:16:12.898Z
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10222
File: package.json:202-202
Timestamp: 2025-08-08T20:16:12.898Z
Learning: In shapeshift/web, the semver package must be included in dependencies (not devDependencies) because hdwallet packages have transient dependencies that require semver but don't ship it themselves. This ensures semver is available at runtime for hdwallet functionality.

Applied to files:

  • packages/chain-adapters/package.json
  • packages/swapper/package.json
  • package.json
📚 Learning: 2025-08-08T20:27:02.203Z
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10222
File: package.json:202-202
Timestamp: 2025-08-08T20:27:02.203Z
Learning: In shapeshift/web, while gomesalexandre generally prefers pinned dependencies for security, semver with a caret range (^7.7.2) is acceptable as an exception since it's already a transient dependency of many packages and is being made explicit for hdwallet support.

Applied to files:

  • packages/chain-adapters/package.json
  • packages/swapper/package.json
  • package.json
📚 Learning: 2025-12-04T22:57:50.850Z
Learnt from: kaladinlight
Repo: shapeshift/web PR: 11290
File: packages/chain-adapters/src/utxo/zcash/ZcashChainAdapter.ts:48-51
Timestamp: 2025-12-04T22:57:50.850Z
Learning: In packages/chain-adapters/src/**/*ChainAdapter.ts files, the getName() method uses the pattern `const enumIndex = Object.values(ChainAdapterDisplayName).indexOf(ChainAdapterDisplayName.XXX); return Object.keys(ChainAdapterDisplayName)[enumIndex]` to reverse-lookup the enum key from its value. This is the established pattern used consistently across almost all chain adapters (Bitcoin, Ethereum, Litecoin, Dogecoin, Polygon, Arbitrum, Cosmos, etc.) and should be preserved for consistency when adding new chain adapters.

Applied to files:

  • packages/chain-adapters/package.json
  • packages/chain-adapters/src/types.ts
  • packages/chain-adapters/src/evm/types.ts
  • package.json
  • packages/chain-adapters/src/evm/EvmBaseAdapter.ts
📚 Learning: 2026-01-05T23:24:54.841Z
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 11569
File: packages/chain-adapters/src/evm/katana/KatanaChainAdapter.ts:44-46
Timestamp: 2026-01-05T23:24:54.841Z
Learning: In packages/chain-adapters/src/evm/**/[chain]ChainAdapter.ts files, second-class EVM chain adapters (those extending SecondClassEvmAdapter, such as Monad, Plasma, HyperEVM, and Katana) use hardcoded strings in their getName() method (e.g., `return 'Monad'`), NOT the enum reverse-lookup pattern. The enum reverse-lookup pattern (`Object.values(ChainAdapterDisplayName).indexOf(...)`) only applies to first-class chain adapters.

Applied to files:

  • packages/chain-adapters/package.json
  • packages/chain-adapters/src/evm/EvmBaseAdapter.ts
📚 Learning: 2025-12-09T21:07:22.474Z
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 11335
File: packages/swapper/src/swappers/CetusSwapper/utils/helpers.ts:3-3
Timestamp: 2025-12-09T21:07:22.474Z
Learning: In packages/swapper/src/swappers/CetusSwapper, mysten/sui types (SuiClient, Transaction) must be imported from the nested path within cetusprotocol/aggregator-sdk (e.g., 'cetusprotocol/aggregator-sdk/node_modules/mysten/sui/client') because the aggregator SDK bundles its own version of mysten/sui. Direct imports from 'mysten/sui' break at runtime even when specified in package.json.

Applied to files:

  • packages/chain-adapters/package.json
  • packages/swapper/package.json
  • package.json
📚 Learning: 2025-11-20T12:00:45.005Z
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 11078
File: src/setupVitest.ts:11-15
Timestamp: 2025-11-20T12:00:45.005Z
Learning: In shapeshift/web, src/setupVitest.ts must redirect 'ethers' to 'ethers5' for shapeshiftoss/hdwallet-trezor (and -trezor-connect), same as ledger and shapeshift-multichain. Removing 'trezor' from the regex causes CI/Vitest failures due to ethers v6 vs v5 API differences.

Applied to files:

  • packages/chain-adapters/package.json
  • packages/swapper/package.json
  • packages/chain-adapters/src/evm/types.ts
  • package.json
  • packages/chain-adapters/src/evm/EvmBaseAdapter.ts
📚 Learning: 2025-08-29T18:09:45.982Z
Learnt from: kaladinlight
Repo: shapeshift/web PR: 10376
File: vite.config.mts:136-137
Timestamp: 2025-08-29T18:09:45.982Z
Learning: In the ShapeShift web repository vite.config.mts, the commonjsOptions.exclude configuration using bare package name strings like ['shapeshiftoss/caip', 'shapeshiftoss/types'] works correctly for excluding specific packages from CommonJS transformation, despite theoretical concerns about module ID matching patterns.

Applied to files:

  • packages/chain-adapters/package.json
  • packages/swapper/package.json
  • package.json
📚 Learning: 2025-11-24T21:20:04.979Z
Learnt from: CR
Repo: shapeshift/web PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T21:20:04.979Z
Learning: Applies to **/*.{ts,tsx} : Import types from `shapeshiftoss/caip` for chain/account/asset IDs

Applied to files:

  • packages/chain-adapters/package.json
  • packages/chain-adapters/src/types.ts
  • packages/swapper/package.json
  • packages/chain-adapters/src/evm/types.ts
📚 Learning: 2026-01-03T15:12:57.968Z
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 11537
File: packages/caip/src/adapters/coincap/generate.ts:7-7
Timestamp: 2026-01-03T15:12:57.968Z
Learning: In shapeshift/web, when scripts in packages/caip run via `yarn workspace shapeshiftoss/caip generate`, the working directory is `packages/caip`, so dotenv paths should use `../../.env` to reach the monorepo root .env file, not `.env`. The `-T` flag only affects which node_modules is used (root's), not the working directory.

Applied to files:

  • packages/chain-adapters/package.json
📚 Learning: 2025-11-25T21:43:10.838Z
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 11170
File: patches/@shapeshiftoss+bitcoinjs-lib+7.0.0-shapeshift.0.patch:9-19
Timestamp: 2025-11-25T21:43:10.838Z
Learning: In shapeshift/web, gomesalexandre will not expand PR scope to fix latent bugs in unused API surface (like bitcoinjs-lib patch validation methods) when comprehensive testing proves the actual used code paths work correctly, preferring to avoid costly hdwallet/web verdaccio publish cycles and full regression testing for conceptual issues with zero runtime impact.

Applied to files:

  • packages/chain-adapters/package.json
  • package.json
📚 Learning: 2025-11-24T21:20:57.909Z
Learnt from: CR
Repo: shapeshift/web PR: 0
File: .cursor/rules/swapper.mdc:0-0
Timestamp: 2025-11-24T21:20:57.909Z
Learning: Applies to packages/swapper/**/*.ts : Use TypeScript with explicit types (e.g., SupportedChainIds) for all code in the Swapper system

Applied to files:

  • packages/chain-adapters/src/types.ts
  • packages/swapper/package.json
  • packages/chain-adapters/src/evm/types.ts
📚 Learning: 2025-12-17T14:50:01.629Z
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 11449
File: packages/chain-adapters/src/tron/TronChainAdapter.ts:570-596
Timestamp: 2025-12-17T14:50:01.629Z
Learning: In packages/chain-adapters/src/tron/TronChainAdapter.ts, the parseTx method uses `unknown` type for the txHashOrTx parameter intentionally. TRON is a "second-class chain" that works differently from other chains - it accepts either a string hash (to fetch TronTx via unchained client) or a TronTx object directly. The base chain-adapter interface is strongly typed and doesn't accommodate this flexible signature, so `unknown` is used as an appropriate escape hatch rather than a type safety issue.

Applied to files:

  • packages/chain-adapters/src/types.ts
  • packages/chain-adapters/src/evm/types.ts
📚 Learning: 2025-11-24T21:20:57.909Z
Learnt from: CR
Repo: shapeshift/web PR: 0
File: .cursor/rules/swapper.mdc:0-0
Timestamp: 2025-11-24T21:20:57.909Z
Learning: Applies to packages/swapper/src/swappers/*/utils/constants.ts : Define supported chain IDs for each swapper in utils/constants.ts with both 'sell' and 'buy' properties following the pattern: SupportedChainIds type

Applied to files:

  • packages/chain-adapters/src/types.ts
  • packages/chain-adapters/src/evm/types.ts
📚 Learning: 2025-08-13T15:52:25.116Z
Learnt from: NeOMakinG
Repo: shapeshift/web PR: 10272
File: src/context/WalletProvider/MobileWallet/mobileMessageHandlers.ts:61-0
Timestamp: 2025-08-13T15:52:25.116Z
Learning: In the ShapeShift web codebase, specifically in src/context/WalletProvider/MobileWallet/mobileMessageHandlers.ts, message variants in the Message union type do not include inline comments documenting their expected return types. The codebase follows a pattern of keeping these type definitions clean without such documentation comments.

Applied to files:

  • packages/chain-adapters/src/types.ts
  • packages/chain-adapters/src/evm/types.ts
📚 Learning: 2025-11-24T21:20:04.979Z
Learnt from: CR
Repo: shapeshift/web PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T21:20:04.979Z
Learning: Applies to **/*.{ts,tsx} : Use `Nominal` types for domain identifiers (e.g., `WalletId`, `AccountId`)

Applied to files:

  • packages/chain-adapters/src/types.ts
📚 Learning: 2025-11-24T21:20:57.909Z
Learnt from: CR
Repo: shapeshift/web PR: 0
File: .cursor/rules/swapper.mdc:0-0
Timestamp: 2025-11-24T21:20:57.909Z
Learning: Applies to packages/swapper/src/swappers/**/*.ts : Avoid side effects in swap logic; ensure swap methods are deterministic and stateless

Applied to files:

  • packages/swapper/package.json
📚 Learning: 2025-11-24T21:20:57.909Z
Learnt from: CR
Repo: shapeshift/web PR: 0
File: .cursor/rules/swapper.mdc:0-0
Timestamp: 2025-11-24T21:20:57.909Z
Learning: Applies to packages/swapper/**/*.ts : Use camelCase for variable and function names in the Swapper system

Applied to files:

  • packages/swapper/package.json
📚 Learning: 2025-11-24T21:20:57.909Z
Learnt from: CR
Repo: shapeshift/web PR: 0
File: .cursor/rules/swapper.mdc:0-0
Timestamp: 2025-11-24T21:20:57.909Z
Learning: Applies to packages/swapper/src/swappers/*/endpoints.ts : Reuse checkEvmSwapStatus utility for checking EVM swap status instead of implementing custom status checks

Applied to files:

  • packages/swapper/package.json
📚 Learning: 2025-11-24T21:20:57.909Z
Learnt from: CR
Repo: shapeshift/web PR: 0
File: .cursor/rules/swapper.mdc:0-0
Timestamp: 2025-11-24T21:20:57.909Z
Learning: Applies to packages/swapper/src/swappers/*/*.ts : Reuse executeEvmTransaction utility for EVM-based swappers instead of implementing custom transaction execution

Applied to files:

  • packages/swapper/package.json
  • packages/chain-adapters/src/evm/EvmBaseAdapter.ts
📚 Learning: 2025-11-12T12:49:17.895Z
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 11016
File: packages/swapper/src/swappers/NearIntentsSwapper/swapperApi/getTradeQuote.ts:109-125
Timestamp: 2025-11-12T12:49:17.895Z
Learning: In packages/chain-adapters/src/evm/utils.ts, the getErc20Data function already includes a guard that returns an empty string when contractAddress is undefined (line 8: `if (!contractAddress) return ''`). This built-in handling means callers don't need to conditionally invoke getErc20Data—it safely handles both ERC20 tokens and native assets.

Applied to files:

  • packages/chain-adapters/src/evm/types.ts
  • packages/chain-adapters/src/evm/EvmBaseAdapter.ts
📚 Learning: 2025-10-23T14:27:19.073Z
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10857
File: src/plugins/walletConnectToDapps/eventsManager/useWalletConnectEventsHandler.ts:101-104
Timestamp: 2025-10-23T14:27:19.073Z
Learning: In WalletConnect wallet_switchEthereumChain and wallet_addEthereumChain requests, the chainId parameter is always present as per the protocol spec. Type guards checking for missing chainId in these handlers (like `if (!evmNetworkIdHex) return`) are solely for TypeScript compiler satisfaction, not real runtime edge cases.

Applied to files:

  • packages/chain-adapters/src/evm/types.ts
  • packages/chain-adapters/src/evm/EvmBaseAdapter.ts
📚 Learning: 2025-12-12T16:20:33.904Z
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 11377
File: src/lib/referral/api.ts:30-57
Timestamp: 2025-12-12T16:20:33.904Z
Learning: In shapeshift/web referral feature, the backend expects an EVM address (0x… viem Address) as the owner identifier, not a CAIP AccountId. Update useReferral to derive the first connected EVM address via fromAccountId + getAddress, and do not URL-encode it in the API path.

Applied to files:

  • packages/chain-adapters/src/evm/types.ts
  • packages/chain-adapters/src/evm/EvmBaseAdapter.ts
📚 Learning: 2025-08-27T13:49:48.668Z
Learnt from: NeOMakinG
Repo: shapeshift/web PR: 10375
File: src/state/migrations/index.ts:214-215
Timestamp: 2025-08-27T13:49:48.668Z
Learning: The ShapeShift web app uses an automated versioning system for Redux Persist migrations. The version is calculated as `Math.max(...Object.keys(clearAssetsMigrations).map(Number))`, which automatically uses the highest migration number as the version. This eliminates the need to manually update persistConfig versions when adding new migrations - the system automatically bumps the version when new migration numbers are added to the migration objects.

Applied to files:

  • package.json
📚 Learning: 2025-08-27T09:47:06.275Z
Learnt from: NeOMakinG
Repo: shapeshift/web PR: 10323
File: src/components/ButtonWalletPredicate/ButtonWalletPredicate.tsx:7-7
Timestamp: 2025-08-27T09:47:06.275Z
Learning: In shapeshift/web project, NeOMakinG consistently prefers to defer UI/UX improvements and refactoring work (like the Drawer.Close hack fix in ButtonWalletPredicate.tsx) to follow-up PRs rather than expanding the scope of feature PRs, even when the improvements would enhance robustness.

Applied to files:

  • package.json
📚 Learning: 2025-11-19T16:59:50.569Z
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 11012
File: src/context/WalletProvider/Vultisig/components/Connect.tsx:24-59
Timestamp: 2025-11-19T16:59:50.569Z
Learning: In src/context/WalletProvider/*/components/Connect.tsx files across the ShapeShift web codebase, the established pattern for handling null/undefined adapter from getAdapter() is to simply check `if (adapter) { ... }` without an else clause. All wallet Connect components (Coinbase, Keplr, Phantom, Ledger, MetaMask, WalletConnectV2, KeepKey, Vultisig) follow this pattern—they reset loading state after the if block but do not show error messages when adapter is null. This is an intentional design decision and should be maintained for consistency.

Applied to files:

  • package.json
  • packages/chain-adapters/src/evm/EvmBaseAdapter.ts
📚 Learning: 2025-09-12T13:44:17.019Z
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10461
File: src/plugins/walletConnectToDapps/hooks/useSimulateEvmTransaction.ts:0-0
Timestamp: 2025-09-12T13:44:17.019Z
Learning: gomesalexandre prefers letting chain adapter errors throw naturally in useSimulateEvmTransaction rather than adding explicit error handling for missing adapters, consistent with his fail-fast approach and dismissal of defensive validation as "stale" in WalletConnect transaction simulation flows.

Applied to files:

  • packages/chain-adapters/src/evm/EvmBaseAdapter.ts
📚 Learning: 2025-09-18T23:47:14.810Z
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10566
File: src/hooks/useWalletSupportsChain/useWalletSupportsChain.ts:55-66
Timestamp: 2025-09-18T23:47:14.810Z
Learning: In the useWalletSupportsChain architecture, checkWalletHasRuntimeSupport() determines if the app has runtime capability to interact with a chain type (not actual signing capabilities), while walletSupportsChain() does the actual capabilities detection by checking account IDs. For Ledger read-only mode, checkWalletHasRuntimeSupport should return true since the app can display balances/addresses, with KeyManager being the source of truth rather than wallet instance.

Applied to files:

  • packages/chain-adapters/src/evm/EvmBaseAdapter.ts
📚 Learning: 2025-11-24T21:20:04.979Z
Learnt from: CR
Repo: shapeshift/web PR: 0
File: CLAUDE.md:0-0
Timestamp: 2025-11-24T21:20:04.979Z
Learning: Each wallet has unique `walletId` (e.g., `metamask:0x123`, `ledger:ABC`)

Applied to files:

  • packages/chain-adapters/src/evm/EvmBaseAdapter.ts
📚 Learning: 2025-10-01T07:42:40.195Z
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10596
File: src/components/Layout/Header/NavBar/WalletConnectedMenu.tsx:77-99
Timestamp: 2025-10-01T07:42:40.195Z
Learning: In WalletConnectedMenu.tsx's handleReconnectWallet handler, gomesalexandre prefers throwing an error for unsupported wallet types in the default case rather than gracefully handling with a fallback. His reasoning: "if we have a problem here, we have bigger problems" - only supported wallets (KeepKey, Ledger, MetaMask, Coinbase, Phantom) should reach the reconnect flow when disconnected/locked, so encountering an unsupported type indicates a larger architectural issue that should be surfaced explicitly rather than masked with graceful degradation.

Applied to files:

  • packages/chain-adapters/src/evm/EvmBaseAdapter.ts
📚 Learning: 2025-09-12T10:21:26.693Z
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10461
File: src/plugins/walletConnectToDapps/components/modals/EIP712MessageDisplay.tsx:0-0
Timestamp: 2025-09-12T10:21:26.693Z
Learning: gomesalexandre explained that in WalletConnect V2, the request context chainId comes from params?.chainId following CAIP2 standards, making both the request params chainId and EIP-712 domain chainId equally reliable sources. He considers both approaches trustworthy ("both gucci") for WalletConnect dApps integration.

Applied to files:

  • packages/chain-adapters/src/evm/EvmBaseAdapter.ts
📚 Learning: 2025-09-12T10:15:10.389Z
Learnt from: gomesalexandre
Repo: shapeshift/web PR: 10461
File: src/plugins/walletConnectToDapps/components/modals/EIP712MessageDisplay.tsx:133-137
Timestamp: 2025-09-12T10:15:10.389Z
Learning: gomesalexandre has identified that EIP-712 domain chainId should be preferred over request context chainId for accuracy in WalletConnect dApps structured signing flows. The domain chainId from the parsed message is more specific and accurate than the general request context, especially for asset resolution and network-specific operations.

Applied to files:

  • packages/chain-adapters/src/evm/EvmBaseAdapter.ts
🧬 Code graph analysis (1)
packages/chain-adapters/src/evm/EvmBaseAdapter.ts (1)
packages/chain-adapters/src/utils/bip44.ts (1)
  • toAddressNList (42-44)
🔇 Additional comments (10)
packages/swapper/package.json (1)

43-43: LGTM!

Dependency bump to hdwallet-core 1.62.39 aligns with the coordinated update across the monorepo to support wallet-native derivation paths.

packages/chain-adapters/package.json (1)

38-39: LGTM!

Coordinated bump of hdwallet-core and hdwallet-ledger to 1.62.39 ensures compatibility with the new wallet-native derivation path support.

package.json (1)

107-124: LGTM!

Comprehensive update of all hdwallet packages to 1.62.39 ensures consistent derivation path handling across all supported wallet types (GridPlus, Trezor, Ledger, KeepKey, Native, etc.).

packages/chain-adapters/src/types.ts (1)

214-218: LGTM!

Clean type extension with clear documentation. The optional addressNList field provides the necessary hook for wallet-specific derivation paths while maintaining backward compatibility.

packages/chain-adapters/src/evm/EvmBaseAdapter.ts (5)

346-346: LGTM!

Correct use of nullish coalescing to prefer the caller-provided addressNList while falling back to standard BIP44 derivation when not provided.


601-611: LGTM!

Correct implementation. The inline fallback to toAddressNList is appropriate here since ethGetAddress requires a valid addressNList. The comment clearly explains the distinction between BIP44 (GridPlus/Trezor) and Ledger Live style paths.


635-648: LGTM!

Consistent with the getAddress implementation. Per-account path resolution within the map ensures each account gets the correct derivation path.


728-728: LGTM!

Consistent with buildSendApiTransaction - correctly uses the provided addressNList or falls back to standard BIP44 derivation.


753-764: LGTM!

Consistent with buildSendTransaction pattern. The wallet-native path extraction is correctly handled, with fallback delegated to buildCustomApiTx.

packages/chain-adapters/src/evm/types.ts (1)

29-33: LGTM!

The optional addressNList field is correctly typed as number[] (standard for BIP44 paths in hdwallet) and appropriately optional since the derivation path can be derived from the wallet when not explicitly provided. This additive change cleanly supports the wallet-specific derivation path handling described in the PR objectives.

gomesalexandre and others added 3 commits January 12, 2026 00:33
…ining

Replace verbose IIFE patterns with concise optional chaining for
wallet-native path extraction.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>

@NeOMakinG NeOMakinG left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Trezor Shapeshift
https://jam.dev/c/8539987b-8544-47d2-aff9-89085011ea21

Trezor compare
image
image

Native this branch
image

Native prod
image

Seems to be the same derivation path as before, trying to sign now:
Signed properly using native on addy #1 :
image

Trezor:
image

I don't have a keepkey and ledger under my hands so, quite hard to test something else, but looks good so far!

@gomesalexandre
gomesalexandre merged commit ea5f769 into develop Jan 12, 2026
4 checks passed
@gomesalexandre
gomesalexandre deleted the feat_gridplus_deriv_path_evm branch January 12, 2026 17:28
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.

Gridplus - Honour legacy BIP44 path for multi-account

2 participants