Skip to content

feat: thorchain solana lp integration#12037

Merged
gomesalexandre merged 13 commits intodevelopfrom
feat/thorchain-solana-lp
Mar 9, 2026
Merged

feat: thorchain solana lp integration#12037
gomesalexandre merged 13 commits intodevelopfrom
feat/thorchain-solana-lp

Conversation

@gomesalexandre
Copy link
Contributor

@gomesalexandre gomesalexandre commented Feb 25, 2026

Description

Adds SOL.SOL LP (add/remove liquidity) support to the THORChain LP page. Builds on #12036 (swapper integration).

What this enables:

  • Users can add liquidity to the SOL.SOL THORChain pool (asym or sym)
  • Users can remove liquidity from the SOL.SOL position
  • Fee estimation includes the SPL Memo Program compute budget for accurate gas

How it works:

THORChain LP transactions are native SOL sends to vault + SPL Memo Program instruction. The useSendThorTx hook handles all LP tx execution via the 'Send' path. Two surgical changes:

  1. getThorchainTransactionType — add solanaChainId to the 'Send' return condition (Solana routes the same way as UTXO/Tron: direct vault send)

  2. Send/utils.ts — add Memo Program instruction support to both:

    • estimateFees Solana case: when memo is present, builds a TransactionInstruction (web3.js) and includes it in getFeeData so compute budget reflects the memo instruction
    • handleSend Solana case: when memo is present, builds a SolanaTxInstruction (hdwallet) and includes it in buildSendTransaction.chainSpecific.instructions

No UI changes needed — Solana already appears in the pool list, walletSupportsChain already handles it.

Issue (if applicable)

closes #12035

Risk

Low — Solana LP path is additive; only changes are in well-contained Send utils and one helper function. Existing Solana send flows (Jupiter, direct SOL/SPL sends) unaffected since memo instruction is only added when memo is non-null.

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

THORChain SOL LP add/remove transactions. Inbound vault: GWYXY7c6SVMkuhmDq2LT1Hj6qGkDFCqmdZWJdCeHUgEN.

Testing

Engineering

Must merge #12036 first (this PR targets that branch).

# dev test (connect a Phantom/Backpack wallet with SOL)
# 1. Navigate to Earn -> THORChain LP
# 2. Confirm SOL.SOL pool appears in available pools
# 3. Click Add Liquidity for SOL.SOL
# 4. Enter SOL amount (asym)
# 5. Verify fee estimate is non-zero and includes compute budget
# 6. Confirm -> verify tx goes to vault GWYXY7c6SVMkuhmDq2LT1Hj6qGkDFCqmdZWJdCeHUgEN with +:SOL.SOL memo
# 7. Remove liquidity -> verify tx goes to vault with -:SOL.SOL:<bps> memo

Manual test checklist:

  • SOL.SOL pool appears in available pools
  • Asym add liquidity (SOL side): fee estimate non-null, tx has Memo instruction
  • Sym add liquidity (SOL + RUNE): SOL tx has Memo instruction, RUNE tx uses MsgDeposit
  • Remove liquidity: tx has Memo instruction with -:SOL.SOL:
  • Existing Solana Jupiter swaps unaffected (no memo = no instruction)
  • Existing UTXO/Tron LP flows unaffected

Operations

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

SOL.SOL pool is live. Operations can test add/remove liquidity with a small SOL amount.

Screenshots (if applicable)

Summary by CodeRabbit

  • New Features

    • Added Solana transaction memo support for fee estimation and sending workflows
    • Improved Solana transaction type recognition in Thorchain swap processing
  • Tests

    • Added test identifiers to ThorChain liquidity provider interface components for enhanced test coverage

gomesalexandre and others added 7 commits February 25, 2026 23:25
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
getThorTxData, getUnsignedSolanaTransaction, getSolanaTransactionFees.
Follows tron/ pattern: vault lookup + SPL Memo Program instruction for
fee estimation, hdwallet SolanaTxInstruction for buildSendApiTransaction.
SPL token support forward-compat via tokenId passthrough.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replaces the hard-reject stub with a full Memo Program fee estimation
case. Uses TransactionInstruction (web3.js) for getFeeData, returns
ThorUtxoOrCosmosTradeRateOrQuote routes. Also exports solana from
thorchain-utils/index.ts.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds getUnsignedSolanaTransaction, getSolanaTransactionFees to endpoints.ts
and executeSolanaTransaction to ThorchainSwapper.ts.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Detects SPL Memo Program instruction, base58-decodes data to UTF-8,
delegates to shared thormaya.Parser. Adds bs58 dependency.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds solanaChainId to getThorchainTransactionType (returns 'Send')
so the LP correctly routes SOL through the Send tx path.

Adds SPL Memo Program instruction handling in Send/utils.ts:
- estimateFees: builds TransactionInstruction (web3.js) when memo
  present, includes in getFeeData for accurate compute budget
- handleSend: builds SolanaTxInstruction (hdwallet) when memo
  present, includes in buildSendTransaction chainSpecific

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Feb 25, 2026

📝 Walkthrough

Walkthrough

The PR adds Solana native token support to THORChain LP operations by implementing memo-based transaction instructions, extends transaction type detection to include Solana chains, refines asset lookups with case-insensitive mapping, and adds test identifiers to LP UI components.

Changes

Cohort / File(s) Summary
Asset Lookup Optimization
packages/swapper/src/swappers/ThorchainSwapper/utils/poolAssetHelpers/poolAssetHelpers.ts
Introduces lower-cased lookup map for case-insensitive asset ID resolution; converts assetIdToThorPoolAssetIdMap to explicit Record typing and updates lookup logic to use toLowerCase().
Solana Constants
packages/swapper/src/thorchain-utils/solana/constants.ts
New module exports MEMO_PROGRAM_ID constant referencing Solana Memo Program v2 address.
Solana Transaction Memo Support
src/components/Modals/Send/utils.ts
Adds memo instruction handling for Solana fee estimation and transaction building; constructs memoInstruction when memo is present and adjusts compute budget logic accordingly for both estimation and actual SOL transfers.
THORChain Transaction Type Detection
src/lib/utils/thorchain/index.ts
Extends getThorchainTransactionType to classify Solana transactions as Send path alongside UTXO, Cosmos, and Tron chains.
LP UI Testing Enhancements
src/pages/ThorChainLP/components/AddLiquidityInput.tsx, src/pages/ThorChainLP/components/LpType.tsx
Adds data-testid attributes to deposit button and LP type radio selectors; wires data-testid prop through TypeRadio component to root label element for improved test coverage.

Sequence Diagram

sequenceDiagram
    participant User as User/Client
    participant FeeEst as Fee Estimator
    participant TxBuilder as Solana Tx Builder
    participant MemoProg as Memo Program
    participant Vault as THORChain Vault
    
    User->>FeeEst: Request LP fee estimate with memo
    alt Memo present
        FeeEst->>TxBuilder: Build memoInstruction from memo
        TxBuilder->>TxBuilder: Create Memo Program instruction
    end
    FeeEst->>FeeEst: Adjust estimationInstructions with memo
    FeeEst-->>User: Return fee estimate
    
    User->>TxBuilder: Send LP transaction (SOL + memo)
    TxBuilder->>TxBuilder: Build memoInstruction
    TxBuilder->>TxBuilder: Determine compute budget need
    alt Should add compute budget
        TxBuilder->>TxBuilder: Set computeUnitLimit & computeUnitPrice
        TxBuilder->>TxBuilder: Add memo to chainSpecific instructions
    end
    TxBuilder->>MemoProg: Include Memo Program instruction
    MemoProg-->>Vault: Memo data (+:SOL.SOL for add liquidity)
    TxBuilder-->>Vault: Send native SOL
    Vault-->>User: LP position confirmed
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~22 minutes

Poem

🐰✨ A Solana seed takes root so deep,
With memos whispered, promises to keep,
The vault receives our gleaming SOL,
Liquidity pooled, transactions whole—
THORChain bridges, test IDs aligned,
A rabbit's leap to riches refined! 🌙💫

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title 'feat: thorchain solana lp integration' accurately describes the main objective of adding Solana support for THORChain LP add/remove liquidity, which is the primary focus of the changeset.
Linked Issues check ✅ Passed All key objectives from #12035 are met: Solana added to getThorchainTransactionType for routing, Memo Program instruction handling integrated into Send/utils.ts fee estimation and execution, and data-testids added for LP UI testing.
Out of Scope Changes check ✅ Passed All changes are directly scoped to the linked issue objectives: Thorchain Solana routing, memo instruction support, and LP UI testing identifiers; no unrelated modifications detected.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

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

✨ Finishing Touches
  • 📝 Generate docstrings (stacked PR)
  • 📝 Generate docstrings (commit on current branch)
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/thorchain-solana-lp

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.

Base automatically changed from feat/thorchain-solana to develop March 2, 2026 10:45
gomes-bot and others added 3 commits March 4, 2026 19:18
…develop

# Conflicts:
#	packages/swapper/src/thorchain-utils/getL1RateOrQuote.ts
#	packages/swapper/src/thorchain-utils/solana/getSolanaTransactionFees.ts
#	packages/swapper/src/thorchain-utils/solana/getUnsignedSolanaTransaction.ts
#	packages/swapper/src/thorchain-utils/solana/index.ts
#	packages/unchained-client/src/solana/parser/thorchain.ts
#	yarn.lock
Copy link
Collaborator

@NeOMakinG NeOMakinG left a comment

Choose a reason for hiding this comment

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

Code Review ✅

Reviewed by: QABot (automated)

Summary

Clean, focused PR adding THORChain Solana LP support. Changes are minimal and well-targeted.

Changes Reviewed:

  1. poolAssetHelpers.ts - Case-insensitive asset ID mapping for Solana base58 addresses ✅
  2. solana/constants.ts - New Memo Program ID constant, well-documented ✅
  3. Send/utils.ts - Memo instruction support for fee estimation and transactions ✅
  4. thorchain/index.ts - Adds Solana to Send transaction type ✅

Assessment:

  • Type safety: ✅ Proper imports and usage (SolanaTxInstruction, PublicKey, etc.)
  • Error handling: ✅ Follows existing patterns (optional memo, conditional creation)
  • Code patterns: ✅ Consistent with codebase conventions
  • No obvious bugs:

Minor Note:

SOLANA_MEMO_PROGRAM_ID is defined in both swapper/solana/constants.ts and Send/utils.ts. This appears intentional to avoid cross-package dependencies, which is acceptable.


QABot testing skipped due to RAM constraints - code review only

gomes-bot and others added 3 commits March 7, 2026 12:00
The assetIdToThorPoolAssetIdMap was lowercasing its keys (AssetIds) which broke
Solana's base58 chain reference (case-sensitive). constants.ts iterated these
lowercased keys through fromAssetId() which threw, crashing the entire app.

Keep original-case keys in the exported map (used by constants.ts for chainId
extraction) and use a separate lowercased map for case-insensitive lookups.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@gomesalexandre gomesalexandre marked this pull request as ready for review March 7, 2026 12:07
@gomesalexandre gomesalexandre requested a review from a team as a code owner March 7, 2026 12:07
@gomesalexandre
Copy link
Contributor Author

QA Testing

Tested with agent-browser (no qabot run - agent-browser session directly):

What was tested:

  • SOL pool visible on /pools page with green status + APY
  • Navigated to Add Liquidity for SOL.SOL pool
  • LP type selector works (SOL only / SOL+RUNE / RUNE only) via data-testid
  • Entered 0.006 SOL (~$0.50) asymmetric SOL deposit
  • Quote loaded successfully (RUNE per SOL: 199.25, Share of Pool: 0.02%, Slippage: $0.000211)
  • Clicked through lockup warning ("I understand")
  • Confirmation screen showed correct details (0.006 SOL, Gas Fee: 0.00000513 SOL)
  • Signed transaction - broadcast in progress (Solana tx was submitted to THORChain inbound 2Mm8k9sEwE6vUmhc8RF2EHStUNacVJjVQbNBEhoKsLNz)

Key fix in this PR:

  • poolAssetHelpers.ts was lowercasing all AssetId keys in assetIdToThorPoolAssetIdMap, which corrupted Solana's case-sensitive base58 chain reference (5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp5eykt4usfv8p8njdtrepy1vzqkqzvdp). This caused fromAssetId() to throw in constants.ts, white-screening the entire app.
  • Fix: keep original-case keys for iteration, use a separate lowercased map only for lookups.

Also added:

  • data-testid="lp-type-asset", data-testid="lp-type-sym", data-testid="lp-type-rune" on LP type radio cards
  • data-testid="lp-type-selector" on the radio group container
  • data-testid="lp-deposit-button" on the Add Liquidity button

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (1)
packages/swapper/src/thorchain-utils/solana/constants.ts (1)

1-3: Update dependent files to import from the new constants file.

This constant is defined in six locations across the codebase. The new packages/swapper/src/thorchain-utils/solana/constants.ts file exports MEMO_PROGRAM_ID, but the other files define their own local copies instead of importing it:

  • packages/swapper/src/thorchain-utils/solana/getUnsignedSolanaTransaction.ts (line 10)
  • packages/swapper/src/thorchain-utils/solana/getSolanaTransactionFees.ts (line 9)
  • packages/swapper/src/thorchain-utils/getL1RateOrQuote.ts (line 62, as SOLANA_MEMO_PROGRAM_ID)
  • src/components/Modals/Send/utils.ts (line 63, as SOLANA_MEMO_PROGRAM_ID)
  • packages/unchained-client/src/solana/parser/thorchain.ts (line 6)

Consider updating these files to import from the new constants file to reduce duplication and improve maintainability.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/swapper/src/thorchain-utils/solana/constants.ts` around lines 1 - 3,
Multiple copies of the Solana memo program ID are defined locally; replace those
local constants (e.g. SOLANA_MEMO_PROGRAM_ID or hardcoded 'MemoSq4gq...') with a
single import of MEMO_PROGRAM_ID from the new constants file. Update callers in
getUnsignedSolanaTransaction, getSolanaTransactionFees, getL1RateOrQuote, the
Send modal utils, and the Solana parser (thorchain) to import MEMO_PROGRAM_ID
and remove the duplicated local constant definitions so all modules use the
exported MEMO_PROGRAM_ID.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@packages/swapper/src/thorchain-utils/solana/constants.ts`:
- Around line 1-3: Multiple copies of the Solana memo program ID are defined
locally; replace those local constants (e.g. SOLANA_MEMO_PROGRAM_ID or hardcoded
'MemoSq4gq...') with a single import of MEMO_PROGRAM_ID from the new constants
file. Update callers in getUnsignedSolanaTransaction, getSolanaTransactionFees,
getL1RateOrQuote, the Send modal utils, and the Solana parser (thorchain) to
import MEMO_PROGRAM_ID and remove the duplicated local constant definitions so
all modules use the exported MEMO_PROGRAM_ID.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 3f41a7ec-42f4-47c5-8967-852405c6b98b

📥 Commits

Reviewing files that changed from the base of the PR and between 702ba59 and 2b79137.

📒 Files selected for processing (6)
  • packages/swapper/src/swappers/ThorchainSwapper/utils/poolAssetHelpers/poolAssetHelpers.ts
  • packages/swapper/src/thorchain-utils/solana/constants.ts
  • src/components/Modals/Send/utils.ts
  • src/lib/utils/thorchain/index.ts
  • src/pages/ThorChainLP/components/AddLiquidity/AddLiquidityInput.tsx
  • src/pages/ThorChainLP/components/LpType.tsx

@gomesalexandre gomesalexandre merged commit ff51d45 into develop Mar 9, 2026
4 checks passed
@gomesalexandre gomesalexandre deleted the feat/thorchain-solana-lp branch March 9, 2026 10:27
0xApotheosis added a commit that referenced this pull request Mar 10, 2026
* fix: copy patches dir in public-api Dockerfile for pnpm install

pnpm requires the patches directory during install (not just scripts)
because patched dependencies are referenced in the lockfile. The
--ignore-scripts flag alone doesn't prevent pnpm from reading patch
files during dependency resolution.

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

* fix: add .railwayignore to reduce snapshot size for public-api deploys

Railway's "Failed to snapshot repository" error is caused by the repo
being too large (~74MB tracked files). This excludes frontend source,
images, tests, and other files not needed for the public-api Dockerfile
build from Railway's pre-build snapshot.

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

* Revert "fix: add .railwayignore to reduce snapshot size for public-api deploys"

This reverts commit 473f2d3.

* Revert "fix: copy patches dir in public-api Dockerfile for pnpm install"

This reverts commit a0618c1.

* fix: unrug Railway CI - copy patches dir and add .railwayignore (#12099)

* fix: unrug public-api Railway CI - copy patches dir and add .railwayignore

Two fixes for Railway deployment failures:

1. Copy patches/ directory in Dockerfile before pnpm install - pnpm
   requires patch files during install even with --ignore-scripts because
   patched dependencies are referenced in the lockfile.

2. Add .railwayignore to reduce repo snapshot size - Railway's "Failed to
   snapshot repository" error was caused by the repo being ~74MB of tracked
   files. Excludes frontend source, images, tests, and other files not
   needed for the public-api Docker build.

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

* fix: add patches dir to swap-widget Dockerfile and update .railwayignore

The swap-widget Dockerfile had the same missing patches/ dir bug as
public-api — pnpm install fails with ENOENT for patched dependencies.
Also add swap-widget *.md exception to .railwayignore.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix: use copy package-import-method in Docker to avoid pnpm ENOENT (#12100)

* fix: use copy package-import-method in Docker to avoid pnpm ENOENT

pnpm's default hard-link strategy fails intermittently on Docker's
overlay filesystem with "ENOENT: rename _tmp -> secp256k1". Setting
package-import-method=copy via env var (Docker-only, doesn't affect
local dev .npmrc) fixes the atomic rename race condition.

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

* fix: add retry loop for pnpm install in Docker builds

The ENOENT rename failure persists even with package-import-method=copy
because pnpm's hoisting/linking phase still does atomic renames that
race on Docker's overlay filesystem. Since it's intermittent and all
packages are cached in the store after the first attempt, a retry with
clean node_modules is fast and reliable.

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

* fix: restrict swap-widget tsconfig types to prevent auto-discovery

Without an explicit `types` field, TypeScript auto-discovers all
@types/* packages hoisted to root node_modules. The deprecated stub
@types/ethereumjs-util (from hdwallet-ledger devDeps) has no .d.ts
files, causing TS2688 during Docker builds. Restricting to
["vite/client"] matches the pattern used by the root tsconfig.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* feat: speed up stuck btc transactions via rbf (#11885)

* fix: railway build with pnpm (#12107)

* feat: thorchain solana lp integration (#12037)

* fix: narrow YieldExplainers action prop type to remove unused claim variant (#12073)

* fix: always refresh account balances after swap completion (#12106)

* chore: unify claude and codex instruction entrypoints (#12119)

* feat: idempotent release script state machine (#12110)

* feat: bebop solana swapper take 2 (#12111)

* chore: remove unused @chainflip/rpc and @chainflip/extrinsics deps (#12109)

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: gomes-bot <contact@0xgom.es>
Co-authored-by: kevin <35275952+kaladinlight@users.noreply.github.com>
Co-authored-by: gomes <17035424+gomesalexandre@users.noreply.github.com>
Co-authored-by: NeOMakinG <14963751+NeOMakinG@users.noreply.github.com>
0xApotheosis added a commit that referenced this pull request Mar 12, 2026
* chore: prerelease v1.1016.0 (#12127)

* fix: copy patches dir in public-api Dockerfile for pnpm install

pnpm requires the patches directory during install (not just scripts)
because patched dependencies are referenced in the lockfile. The
--ignore-scripts flag alone doesn't prevent pnpm from reading patch
files during dependency resolution.

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

* fix: add .railwayignore to reduce snapshot size for public-api deploys

Railway's "Failed to snapshot repository" error is caused by the repo
being too large (~74MB tracked files). This excludes frontend source,
images, tests, and other files not needed for the public-api Dockerfile
build from Railway's pre-build snapshot.

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

* Revert "fix: add .railwayignore to reduce snapshot size for public-api deploys"

This reverts commit 473f2d3.

* Revert "fix: copy patches dir in public-api Dockerfile for pnpm install"

This reverts commit a0618c1.

* fix: unrug Railway CI - copy patches dir and add .railwayignore (#12099)

* fix: unrug public-api Railway CI - copy patches dir and add .railwayignore

Two fixes for Railway deployment failures:

1. Copy patches/ directory in Dockerfile before pnpm install - pnpm
   requires patch files during install even with --ignore-scripts because
   patched dependencies are referenced in the lockfile.

2. Add .railwayignore to reduce repo snapshot size - Railway's "Failed to
   snapshot repository" error was caused by the repo being ~74MB of tracked
   files. Excludes frontend source, images, tests, and other files not
   needed for the public-api Docker build.

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

* fix: add patches dir to swap-widget Dockerfile and update .railwayignore

The swap-widget Dockerfile had the same missing patches/ dir bug as
public-api — pnpm install fails with ENOENT for patched dependencies.
Also add swap-widget *.md exception to .railwayignore.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* fix: use copy package-import-method in Docker to avoid pnpm ENOENT (#12100)

* fix: use copy package-import-method in Docker to avoid pnpm ENOENT

pnpm's default hard-link strategy fails intermittently on Docker's
overlay filesystem with "ENOENT: rename _tmp -> secp256k1". Setting
package-import-method=copy via env var (Docker-only, doesn't affect
local dev .npmrc) fixes the atomic rename race condition.

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

* fix: add retry loop for pnpm install in Docker builds

The ENOENT rename failure persists even with package-import-method=copy
because pnpm's hoisting/linking phase still does atomic renames that
race on Docker's overlay filesystem. Since it's intermittent and all
packages are cached in the store after the first attempt, a retry with
clean node_modules is fast and reliable.

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

* fix: restrict swap-widget tsconfig types to prevent auto-discovery

Without an explicit `types` field, TypeScript auto-discovers all
@types/* packages hoisted to root node_modules. The deprecated stub
@types/ethereumjs-util (from hdwallet-ledger devDeps) has no .d.ts
files, causing TS2688 during Docker builds. Restricting to
["vite/client"] matches the pattern used by the root tsconfig.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>

* feat: speed up stuck btc transactions via rbf (#11885)

* fix: railway build with pnpm (#12107)

* feat: thorchain solana lp integration (#12037)

* fix: narrow YieldExplainers action prop type to remove unused claim variant (#12073)

* fix: always refresh account balances after swap completion (#12106)

* chore: unify claude and codex instruction entrypoints (#12119)

* feat: idempotent release script state machine (#12110)

* feat: bebop solana swapper take 2 (#12111)

* chore: remove unused @chainflip/rpc and @chainflip/extrinsics deps (#12109)

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: gomes-bot <contact@0xgom.es>
Co-authored-by: kevin <35275952+kaladinlight@users.noreply.github.com>
Co-authored-by: gomes <17035424+gomesalexandre@users.noreply.github.com>
Co-authored-by: NeOMakinG <14963751+NeOMakinG@users.noreply.github.com>

* fix: bebop solana signing + thorchain solana lp compute budget (#12132)

* fix: bebop solana signing + reject amm-routed quotes (#12147)

* fix: cherry-pick #12148 - bebop solana ghost tx + malformed amm routes (#12151)

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: gomes-bot <contact@0xgom.es>
Co-authored-by: kevin <35275952+kaladinlight@users.noreply.github.com>
Co-authored-by: gomes <17035424+gomesalexandre@users.noreply.github.com>
Co-authored-by: NeOMakinG <14963751+NeOMakinG@users.noreply.github.com>
0xApotheosis added a commit that referenced this pull request Mar 12, 2026
chore: release v1.1016.0 (#12128)

* chore: prerelease v1.1016.0 (#12127)

* fix: copy patches dir in public-api Dockerfile for pnpm install

pnpm requires the patches directory during install (not just scripts)
because patched dependencies are referenced in the lockfile. The
--ignore-scripts flag alone doesn't prevent pnpm from reading patch
files during dependency resolution.



* fix: add .railwayignore to reduce snapshot size for public-api deploys

Railway's "Failed to snapshot repository" error is caused by the repo
being too large (~74MB tracked files). This excludes frontend source,
images, tests, and other files not needed for the public-api Dockerfile
build from Railway's pre-build snapshot.



* Revert "fix: add .railwayignore to reduce snapshot size for public-api deploys"

This reverts commit 473f2d3.

* Revert "fix: copy patches dir in public-api Dockerfile for pnpm install"

This reverts commit a0618c1.

* fix: unrug Railway CI - copy patches dir and add .railwayignore (#12099)

* fix: unrug public-api Railway CI - copy patches dir and add .railwayignore

Two fixes for Railway deployment failures:

1. Copy patches/ directory in Dockerfile before pnpm install - pnpm
   requires patch files during install even with --ignore-scripts because
   patched dependencies are referenced in the lockfile.

2. Add .railwayignore to reduce repo snapshot size - Railway's "Failed to
   snapshot repository" error was caused by the repo being ~74MB of tracked
   files. Excludes frontend source, images, tests, and other files not
   needed for the public-api Docker build.



* fix: add patches dir to swap-widget Dockerfile and update .railwayignore

The swap-widget Dockerfile had the same missing patches/ dir bug as
public-api — pnpm install fails with ENOENT for patched dependencies.
Also add swap-widget *.md exception to .railwayignore.



---------



* fix: use copy package-import-method in Docker to avoid pnpm ENOENT (#12100)

* fix: use copy package-import-method in Docker to avoid pnpm ENOENT

pnpm's default hard-link strategy fails intermittently on Docker's
overlay filesystem with "ENOENT: rename _tmp -> secp256k1". Setting
package-import-method=copy via env var (Docker-only, doesn't affect
local dev .npmrc) fixes the atomic rename race condition.



* fix: add retry loop for pnpm install in Docker builds

The ENOENT rename failure persists even with package-import-method=copy
because pnpm's hoisting/linking phase still does atomic renames that
race on Docker's overlay filesystem. Since it's intermittent and all
packages are cached in the store after the first attempt, a retry with
clean node_modules is fast and reliable.



* fix: restrict swap-widget tsconfig types to prevent auto-discovery

Without an explicit `types` field, TypeScript auto-discovers all
@types/* packages hoisted to root node_modules. The deprecated stub
@types/ethereumjs-util (from hdwallet-ledger devDeps) has no .d.ts
files, causing TS2688 during Docker builds. Restricting to
["vite/client"] matches the pattern used by the root tsconfig.



---------



* feat: speed up stuck btc transactions via rbf (#11885)

* fix: railway build with pnpm (#12107)

* feat: thorchain solana lp integration (#12037)

* fix: narrow YieldExplainers action prop type to remove unused claim variant (#12073)

* fix: always refresh account balances after swap completion (#12106)

* chore: unify claude and codex instruction entrypoints (#12119)

* feat: idempotent release script state machine (#12110)

* feat: bebop solana swapper take 2 (#12111)

* chore: remove unused @chainflip/rpc and @chainflip/extrinsics deps (#12109)

---------







* fix: bebop solana signing + thorchain solana lp compute budget (#12132)

* fix: bebop solana signing + reject amm-routed quotes (#12147)

* fix: cherry-pick #12148 - bebop solana ghost tx + malformed amm routes (#12151)

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
Co-authored-by: gomes-bot <contact@0xgom.es>
Co-authored-by: kevin <35275952+kaladinlight@users.noreply.github.com>
Co-authored-by: gomes <17035424+gomesalexandre@users.noreply.github.com>
Co-authored-by: NeOMakinG <14963751+NeOMakinG@users.noreply.github.com>
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.

feat: thorchain solana lp integration

2 participants