Skip to content

Fixes on show, send and manualExec for EVM<->SOL#231

Merged
andrevmatos merged 10 commits into
mainfrom
juan/l-send-manualexec-support
Apr 20, 2026
Merged

Fixes on show, send and manualExec for EVM<->SOL#231
andrevmatos merged 10 commits into
mainfrom
juan/l-send-manualexec-support

Conversation

@Farber98
Copy link
Copy Markdown
Contributor

@Farber98 Farber98 commented Apr 19, 2026

Fixes for Solana↔EVM across send, getFee and manualExec

Attestation lookup: normalize hash encoding

The attestation API expects hex-encoded hashes, but Solana messages encode the token's extra data as base64. The fix normalizes to hex before calling the API so both formats work transparently.

EVM→Solana manual execution fixes

  • V0 transaction support for account derivation: The derivation loop used legacy transactions (via Anchor's .view()), which don't support Address Lookup Tables (ALTs). Some TP's requires ALTs, so the legacy tx exceeded Solana's 1232-byte size limit. Switched to V0 transaction simulation which supports ALTs.

  • LBTC attestation encoding : The offchain token data encoder only handled USDC (Borsh-wrapped). Added an LBTC branch that passes the raw attestation bytes directly.

  • Stale buffer cleanup on retry: If a previous manualExec fails mid-way, it leaves a partially-filled buffer PDA on-chain, blocking retries. The fix detects this and automatically closes the stale buffer before retrying.

SOL→EVM send fixes

Applied the same V0 simulation fix to the send path: both getFee() and account derivation (deriveAccountsCcipSend) now use V0 transactions instead of legacy, enabling fee estimation and sends for any token pool that uses ALTs.

SOL→EVM manual execution fix

Fixed invalid BytesLike value error when executing Solana-sourced messages on EVM. Atlas returns an empty string (not 0x) for the data field on messages with no calldata, which broke the ethers ABI encoder. The fix normalizes empty strings to valid hex bytes.

Null-safe value transformation in convertKeysToCamelCase

The convertKeysToCamelCase utility recursively walks API response objects and applies a mapValues callback to transform leaf values (e.g. decoding addresses, casting to BigInt). When the CCIP API returns null for an address field, the null was passed directly to the callback, which called decodeAddress(null)Buffer.from(null) → crash.

The fix short-circuits null/undefined values before they reach the callback, preserving them as-is in the output

@vercel
Copy link
Copy Markdown

vercel Bot commented Apr 19, 2026

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

Project Deployment Actions Updated (UTC)
ccip-tools-ts Ready Ready Preview, Comment Apr 20, 2026 7:50pm

Request Review

@Farber98 Farber98 changed the title Fixes on show and send for EVM->SOL Fixes on show, send and manualExec for EVM<->SOL Apr 19, 2026
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Apr 19, 2026

Coverage Report

ℹ tests 783
ℹ suites 229
ℹ pass 781
ℹ fail 0
ℹ cancelled 0
ℹ skipped 2
ℹ todo 0
ℹ duration_ms 89022.906747

> @chainlink/[email protected] test
> node --test

Verbose mode enabled
▶ getCtx
  ▶ output — always stdout
    ✔ output.write goes to stdout (1.810734ms)
    ✔ output.table goes to stdout (1.135657ms)
  ✔ output — always stdout (4.265238ms)
  ▶ logger — always stderr
    ✔ logger.info goes to stderr (0.558571ms)
    ✔ logger.warn goes to stderr (0.421886ms)
    ✔ logger.error goes to stderr (0.399524ms)
  ✔ logger — always stderr (1.629887ms)
  ▶ verbose mode
    ✔ logger.debug is a no-op when verbose is false (0.530819ms)
    ✔ logger.debug goes to stderr when verbose is true (1.469298ms)
  ✔ verbose mode (2.216631ms)
  ▶ destroy signal
    ✔ returns a working destroy function (11.83383ms)
    ✔ calling destroy twice does not throw (0.634773ms)
  ✔ destroy signal (12.669247ms)
✔ getCtx (21.809449ms)
▶ lane-latency command
  ✔ should output JSON format correctly (5.863666ms)
  ✔ should resolve chain IDs to chain selectors (2.94085ms)
  ✔ should use custom API URL when provided (0.775315ms)
  ✔ should output log format correctly (0.83699ms)
  ✔ should handle chain IDs as input (0.718468ms)
  ✔ should handle chain selectors as input (1.633523ms)
  ✔ should throw CCIPApiClientNotAvailableError when --no-api flag is set (1.247674ms)
  ✔ should work normally when --no-api flag is false (0.706135ms)
  ✔ should forward blockConfirmations to API URL (0.63359ms)
  ✔ should not include numOfBlocks when blockConfirmations is not provided (0.648158ms)
  ▶ CCIP_API environment variable integration
    ✔ should respect CCIP_API=false environment variable (0.63321ms)
  ✔ CCIP_API environment variable integration (0.900829ms)
✔ lane-latency command (19.281228ms)
▶ search messages command
  ✔ should throw CCIPApiClientNotAvailableError when --no-api flag is set (3.427106ms)
  ✔ should output JSON format correctly (13.238959ms)
  ✔ should pass sender filter to API (4.356099ms)
  ✔ should pass receiver filter to API (4.043582ms)
  ✔ should resolve source chain to selector (6.853771ms)
  ✔ should resolve dest chain to selector (2.298322ms)
  ✔ should pass manual-exec-only filter to API (3.298285ms)
  ✔ should treat limit 0 as unlimited (7.713072ms)
  ✔ should respect limit parameter (7.254498ms)
  ✔ should warn when no results found (1.623435ms)
  ✔ should use custom API URL when provided (2.514786ms)
  ✔ should warn on negative limit and fall back to default (1.695852ms)
  ✔ should output log format (2.226279ms)
✔ search messages command (62.643158ms)
▶ e2e command show EVM
  ▶ pretty format (default)
    ✔ should show complete CCIP transaction details EVM to EVM (8423.940868ms)
  ✔ pretty format (default) (8424.932456ms)
  ▶ json format
    ✔ should output a single valid JSON envelope with all expected fields (6267.889314ms)
  ✔ json format (6268.168554ms)
  ▶ log format
    ✔ should output in log format with object assignments (8285.119233ms)
  ✔ log format (8285.400857ms)
  ▶ verbose flag
    ✔ should work with verbose flag enabled (7664.719659ms)
  ✔ verbose flag (7664.941091ms)
  ▶ error handling
    ✔ should handle invalid transaction hash gracefully (5414.753312ms)
    ✔ should require transaction hash argument (1643.948891ms)
  ✔ error handling (7059.002322ms)
  ✔ should show complete CCIP transaction details EVM to Aptos (13119.844592ms)
  ✔ should show complete CCIP transaction details EVM to Solana (6112.612765ms)
✔ e2e command show EVM (56937.172378ms)
▶ e2e command show Solana
  ✔ should show complete CCIP transaction details Solana to EVM (7702.890832ms)
✔ e2e command show Solana (7703.173079ms)
▶ e2e command show Aptos
  ✔ should show complete CCIP transaction details Aptos to EVM (8294.610601ms)
✔ e2e command show Aptos (8294.786199ms)
﹣ e2e command show TON (0.055824ms) # SKIP
▶ formatCCIPError
  ✔ should return null for non-CCIPError instances (1.191029ms)
  ✔ should format CCIPError with code and message (0.41855ms)
  ✔ should include help section with recovery hint (0.154599ms)
  ✔ should include note section for transient errors (0.290421ms)
  ✔ should include retry timing for transient errors with retryAfterMs (0.250367ms)
  ✔ should not include note section for permanent errors (0.16117ms)
  ✔ should format error with structured output (0.244475ms)
  ✔ should include stack trace when verbose is true (0.387031ms)
  ✔ should not include stack trace when verbose is false (0.201756ms)
✔ formatCCIPError (4.809672ms)
ℹ tests 52
ℹ suites 18
ℹ pass 52
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 75194.236151
-------------------------------|---------|----------|---------|---------|---------------------------
File                           | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s         
-------------------------------|---------|----------|---------|---------|---------------------------
All files                      |   74.82 |    76.93 |   60.89 |   74.82 |                           
 ccip-cli/src                  |   88.95 |    61.53 |      75 |   88.95 |                           
  index.ts                     |   88.95 |    61.53 |      75 |   88.95 | ...39-143,149-150,155-160 
 ccip-cli/src/commands         |   51.39 |    72.12 |   52.72 |   51.39 |                           
  index.ts                     |     100 |      100 |     100 |     100 |                           
  lane-latency.ts              |   72.56 |     90.9 |   33.33 |   72.56 | 41-56,63-70,105-111       
  manual-exec.ts               |   26.33 |      100 |       0 |   26.33 | 61-115,122-132,134-260    
  parse.ts                     |   57.14 |      100 |       0 |   57.14 | 46-50,57-64,66-91         
  search.ts                    |   81.25 |      100 |       0 |   81.25 | 24-29                     
  send.ts                      |   15.31 |      100 |       0 |   15.31 | ...73-180,190-219,221-457 
  show.ts                      |   81.53 |    62.12 |   66.66 |   81.53 | ...21-229,233-246,277-278 
  supported-tokens.ts          |   17.77 |      100 |       0 |   17.77 | ...11-249,251-317,319-332 
  token.ts                     |   22.72 |      100 |       0 |   22.72 | 24-53,60-67,69-132        
  types.ts                     |     100 |      100 |     100 |     100 |                           
  utils.ts                     |   85.67 |    73.75 |    92.3 |   85.67 | ...86-596,604-612,622-628 
 ccip-cli/src/commands/search  |   49.39 |    85.29 |   14.28 |   49.39 |                           
  messages.ts                  |   49.39 |    85.29 |   14.28 |   49.39 | ...86-188,190-212,214-249 
 ccip-cli/src/providers        |   51.26 |    75.51 |      16 |   51.26 |                           
  aptos.ts                     |   52.38 |      100 |       0 |   52.38 | ...70,78-85,91-92,101-126 
  evm.ts                       |   39.41 |      100 |       0 |   39.41 | 23,40-50,56-85,97-137     
  index.ts                     |   80.16 |    72.72 |      80 |   80.16 | 51-52,193-237             
  solana.ts                    |   49.23 |      100 |       0 |   49.23 | ...,91-97,101-102,111-130 
  sui.ts                       |   64.28 |      100 |       0 |   64.28 | 10-14                     
  ton.ts                       |   15.06 |      100 |       0 |   15.06 | 23-146                    
 ccip-sdk/src                  |   94.48 |    82.41 |    92.4 |   94.48 |                           
  chain.ts                     |   93.25 |    81.33 |   71.42 |   93.25 | ...18,1667-1668,1701-1702 
  commits.ts                   |     100 |    95.23 |     100 |     100 | 52                        
  execution.ts                 |   92.19 |     92.3 |     100 |   92.19 | 130-137,149-156           
  explorer.ts                  |     100 |      100 |     100 |     100 |                           
  extra-args.ts                |     100 |    86.66 |     100 |     100 | 179,214                   
  gas.ts                       |   89.75 |       40 |     100 |   89.75 | 108-119,147-151           
  http-status.ts               |     100 |      100 |     100 |     100 |                           
  index.ts                     |     100 |      100 |     100 |     100 |                           
  messages.ts                  |   88.48 |    45.09 |     100 |   88.48 | ...19-220,229-230,254-255 
  offchain.ts                  |   94.14 |    79.54 |     100 |   94.14 | ...90,208,223-225,234-235 
  requests.ts                  |   90.61 |    82.07 |     100 |   90.61 | ...81-282,350-363,365-369 
  supported-chains.ts          |     100 |      100 |     100 |     100 |                           
  types.ts                     |     100 |      100 |     100 |     100 |                           
  utils.ts                     |   96.31 |     90.4 |     100 |   96.31 | ...54,770,871-872,879-887 
 ccip-sdk/src/api              |   93.75 |       85 |   94.11 |   93.75 |                           
  index.ts                     |   93.75 |       85 |   94.11 |   93.75 | ...39-744,755-758,761-764 
 ccip-sdk/src/aptos            |   55.76 |    71.53 |   55.73 |   55.76 |                           
  exec.ts                      |   29.31 |      100 |       0 |   29.31 | 18-58                     
  hasher.ts                    |   76.31 |       80 |   66.66 |   76.31 | 19-38,52-58               
  index.ts                     |    56.4 |       75 |   58.13 |    56.4 | ...26-828,832-858,862-873 
  logs.ts                      |   78.87 |    64.15 |      75 |   78.87 | ...90-196,200-233,264-268 
  send.ts                      |    25.2 |      100 |       0 |    25.2 | 10-51,62-79,92-123        
  token.ts                     |   23.75 |       75 |     100 |   23.75 | 35-156                    
  types.ts                     |   65.62 |      100 |       0 |   65.62 | 25-32,64-88               
 ccip-sdk/src/errors           |   87.34 |    75.94 |   47.96 |   87.34 |                           
  CCIPError.ts                 |     100 |      100 |     100 |     100 |                           
  codes.ts                     |     100 |      100 |     100 |     100 |                           
  index.ts                     |     100 |      100 |     100 |     100 |                           
  recovery.ts                  |     100 |      100 |     100 |     100 |                           
  specialized.ts               |   84.59 |    70.88 |   45.29 |   84.59 | ...12,3333-3342,3363-3372 
  utils.ts                     |   94.44 |    81.48 |     100 |   94.44 | 15,17,22,24               
 ccip-sdk/src/evm              |   83.11 |    74.58 |   89.02 |   83.11 |                           
  const.ts                     |     100 |      100 |     100 |     100 |                           
  errors.ts                    |   84.03 |    78.57 |     100 |   84.03 | ...57-164,170-172,219-237 
  extra-args.ts                |   94.44 |    61.66 |     100 |   94.44 | ...83-184,209-210,326-338 
  fork.test.data.ts            |     100 |      100 |     100 |     100 |                           
  gas.ts                       |   97.97 |    53.33 |     100 |   97.97 | 72-73,75                  
  hasher.ts                    |     100 |     92.3 |     100 |     100 | 134                       
  index.ts                     |   80.41 |    75.46 |   90.16 |   80.41 | ...69,2133-2149,2175-2182 
  logs.ts                      |   34.32 |    68.42 |      25 |   34.32 | ...13-214,229-258,275-302 
  messages.ts                  |     100 |      100 |     100 |     100 |                           
  offchain.ts                  |   81.25 |    33.33 |     100 |   81.25 | 11,13-14                  
  types.ts                     |     100 |      100 |     100 |     100 |                           
 ccip-sdk/src/evm/viem         |   77.72 |       92 |   69.23 |   77.72 |                           
  client-adapter.ts            |     100 |     92.3 |     100 |     100 | 48                        
  index.ts                     |     100 |      100 |     100 |     100 |                           
  wallet-adapter.ts            |   63.09 |     90.9 |   55.55 |   63.09 | ...6,53-73,91-124,131-157 
 ccip-sdk/src/hasher           |   94.29 |    78.94 |     100 |   94.29 |                           
  common.ts                    |     100 |      100 |     100 |     100 |                           
  hasher.ts                    |     100 |    66.66 |     100 |     100 | 19                        
  index.ts                     |     100 |      100 |     100 |     100 |                           
  merklemulti.ts               |   93.43 |       78 |     100 |   93.43 | ...59-260,306-307,315-316 
 ccip-sdk/src/shared           |   88.05 |    69.23 |     100 |   88.05 |                           
  bcs-codecs.ts                |   87.87 |    66.66 |     100 |   87.87 | 75-87,104-106             
  constants.ts                 |     100 |      100 |     100 |     100 |                           
 ccip-sdk/src/solana           |   73.15 |    68.13 |   77.01 |   73.15 |                           
  cleanup.ts                   |   26.63 |    66.66 |   33.33 |   26.63 | 43-53,59-101,113-226      
  exec.ts                      |   69.05 |    62.96 |   66.66 |   69.05 | ...61-463,468-472,512-513 
  fork.test.data.ts            |     100 |      100 |     100 |     100 |                           
  hasher.ts                    |   96.58 |    81.81 |     100 |   96.58 | 67-70                     
  index.ts                     |   76.68 |       75 |   78.84 |   76.68 | ...58,1562-1583,1587-1620 
  logs.ts                      |   74.83 |    38.88 |     100 |   74.83 | 38-39,50-51,53-54,56-88   
  offchain.ts                  |     100 |      100 |     100 |     100 |                           
  patchBorsh.ts                |   78.31 |       50 |     100 |   78.31 | 34-35,41-47,65-66,72-78   
  send.ts                      |    77.6 |    33.33 |      80 |    77.6 | ...46-347,352-360,403-442 
  types.ts                     |     100 |      100 |     100 |     100 |                           
  utils.ts                     |   67.41 |    68.96 |   63.63 |   67.41 | ...36-439,442-444,476-491 
 ccip-sdk/src/sui              |   32.62 |    89.47 |   17.24 |   32.62 |                           
  discovery.ts                 |   14.86 |      100 |       0 |   14.86 | 20-36,49-185,188-222      
  events.ts                    |    19.9 |      100 |       0 |    19.9 | ...18-275,280-397,406-427 
  exec.ts                      |   31.29 |      100 |       0 |   31.29 | 31-74,86-131              
  hasher.ts                    |   98.16 |    66.66 |     100 |   98.16 | 33,49                     
  index.ts                     |   40.44 |    93.18 |   17.94 |   40.44 | ...12-813,817-818,822-823 
  objects.ts                   |   18.93 |      100 |       0 |   18.93 | ...04-119,133-184,195-338 
 ccip-sdk/src/sui/manuallyExec |   39.63 |      100 |       0 |   39.63 |                           
  encoder.ts                   |   47.67 |      100 |       0 |   47.67 | 42-86                     
  index.ts                     |   34.35 |      100 |       0 |   34.35 | 46-131                    
 ccip-sdk/src/ton              |   74.98 |    82.01 |   65.27 |   74.98 |                           
  exec.ts                      |     100 |      100 |     100 |     100 |                           
  hasher.ts                    |   77.95 |    77.77 |      75 |   77.95 | 99-107,155-186            
  index.ts                     |   71.45 |    75.83 |   53.33 |   71.45 | ...37,1244-1245,1252-1253 
  logs.ts                      |     100 |    98.43 |     100 |     100 | 56                        
  send.ts                      |   96.49 |    70.83 |     100 |   96.49 | 38-45                     
  types.ts                     |   77.94 |    69.23 |   66.66 |   77.94 | ...-73,91,118-131,133-136 
  utils.ts                     |   60.88 |    83.72 |    87.5 |   60.88 | ...55-261,269-327,329-332 
-------------------------------|---------|----------|---------|---------|---------------------------

@Farber98 Farber98 marked this pull request as ready for review April 20, 2026 16:56
@Farber98 Farber98 requested review from a team, PabloMansanet and aelmanaa as code owners April 20, 2026 16:56
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR fixes multiple Solana↔EVM interoperability issues across send, getFee, and manualExec, focusing on better transaction simulation support (V0/ALTs), attestation encoding/lookup normalization, and safer value transformation for API responses.

Changes:

  • Switch Solana getFee and account derivation paths to V0 simulation (ALT-capable) by simulating .instruction() results instead of using Anchor .view().
  • Normalize/extend offchain token data handling: LBTC attestation lookup now normalizes extraData to hex, and Solana offchain encoding adds an LBTC raw-attestation branch.
  • Harden utilities: treat empty-string bytes as empty, and prevent convertKeysToCamelCase from passing null/undefined into mapValues (with tests).

Reviewed changes

Copilot reviewed 12 out of 12 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
ccip-sdk/src/utils.ts Handle empty-string BytesLike and make convertKeysToCamelCase null-safe before mapValues.
ccip-sdk/src/utils.test.ts Add regression test ensuring mapValues is not called for null/undefined leaves.
ccip-sdk/src/solana/send.ts Use V0 simulation for getFee and deriveAccountsCcipSend, add lookup-table resolution during derivation.
ccip-sdk/src/solana/offchain.ts Add LBTC branch to encode raw attestation bytes without Borsh wrapping.
ccip-sdk/src/solana/offchain.test.ts Add tests for USDC Borsh encoding and LBTC raw-attestation encoding behavior.
ccip-sdk/src/solana/index.ts Add retry branch intended to clear stale buffers when AlreadyContainsChunk occurs.
ccip-sdk/src/solana/exec.ts Switch execution account derivation to V0 simulation and resolve ALTs during the derivation loop.
ccip-sdk/src/offchain.ts Normalize LBTC extraData to hex before calling the attestation API.
ccip-sdk/src/offchain.test.ts Add tests ensuring LBTC base64/hex extraData both result in hex attestation API requests.
ccip-sdk/src/evm/index.ts Normalize empty calldata strings into valid hex bytes for ethers ABI encoding.
ccip-sdk/src/errors/recovery.ts Add a recovery hint for the new simulation “no return data” error code.
ccip-sdk/src/errors/codes.ts Introduce SOLANA_SIMULATION_NO_RETURN_DATA error code.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread ccip-sdk/src/solana/exec.ts Outdated
Comment thread ccip-sdk/src/solana/index.ts
Comment thread ccip-sdk/src/solana/exec.ts Outdated
Comment thread ccip-sdk/src/solana/send.ts Outdated
Comment thread ccip-sdk/src/solana/send.ts Outdated
Comment thread ccip-sdk/src/utils.ts Outdated
Comment thread ccip-sdk/src/utils.ts
Comment on lines +486 to +487
if (obj == null) return obj
if (typeof obj !== 'object') return mapValues ? mapValues(obj, key) : obj
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Why this change? They're equivalent?
Prior to this change, we entered the conditional in either of the branches, but in the former, mapValues is always falsy, which goes directly to the else branch, which is effectively the same action taken by the first if

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Old clause:

if (obj == null || typeof obj !== 'object') return mapValues ? mapValues(obj, key) : obj

When convertKeysToCamelCase({ receiver: null }, mapValues) recurses into the null value:

  • obj == null → true, short-circuits the ||
  • But then checks mapValues ? mapValues(null, key) : null
  • mapValues is truthy → calls mapValues(null, "receiver")→ crashes

New code returns null directly without ever calling mapValues

See this TS Playground example

Copy link
Copy Markdown
Contributor Author

@Farber98 Farber98 Apr 20, 2026

Choose a reason for hiding this comment

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

CI was failing here:

test at src/evm/fork.test.ts:168:5
✖ should return native and token balances for CCIP transfer participants (210.837879ms)
  TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received null
      at Buffer.from (node:buffer:348:9)
      at decodeBase64 (file:///home/runner/work/ccip-tools-ts/ccip-tools-ts/node_modules/ethers/lib.esm/utils/base64.js:27:32)
      at getAddressBytes (file:///home/runner/work/ccip-tools-ts/ccip-tools-ts/ccip-sdk/src/utils.ts:459:25)
      at EVMChain.getAddress (file:///home/runner/work/ccip-tools-ts/ccip-tools-ts/ccip-sdk/src/evm/index.ts:569:18)
      at decodeAddress (file:///home/runner/work/ccip-tools-ts/ccip-tools-ts/ccip-sdk/src/utils.ts:307:16)
      at file:///home/runner/work/ccip-tools-ts/ccip-tools-ts/ccip-sdk/src/requests.ts:92:11
      at convertKeysToCamelCase (file:///home/runner/work/ccip-tools-ts/ccip-tools-ts/ccip-sdk/src/utils.ts:486:66)
      at convertKeysToCamelCase (file:///home/runner/work/ccip-tools-ts/ccip-tools-ts/ccip-sdk/src/utils.ts:493:27)
      at file:///home/runner/work/ccip-tools-ts/ccip-tools-ts/ccip-sdk/src/utils.ts:483:27
      at Array.map (<anonymous>) {
    code: 'ERR_INVALID_ARG_TYPE'
  }

@andrevmatos andrevmatos merged commit dd380fd into main Apr 20, 2026
12 of 13 checks passed
@andrevmatos andrevmatos deleted the juan/l-send-manualexec-support branch April 20, 2026 19:50
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.

3 participants