Skip to content

feat(cct-sdk): Add lock-release liquidity + rebalancer evm ops - #413

Open
apedrob wants to merge 8 commits into
cct-sdkfrom
feature/DAPP-11354-lockrelease-liquidity
Open

feat(cct-sdk): Add lock-release liquidity + rebalancer evm ops#413
apedrob wants to merge 8 commits into
cct-sdkfrom
feature/DAPP-11354-lockrelease-liquidity

Conversation

@apedrob

@apedrob apedrob commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

What

  • Add the EVM LockRelease liquidity surface to EVMTokenManager:
    • provideLiquidity, withdrawLiquidity, transferLiquidity
    • setRebalancer, getRebalancer
    • approveToken: ERC-20 approve, without it the liquidity flow cannot be completed through the SDK alone; also it matches the solana op of the same name
  • Pool ops target LockRelease 1.5.0 to 1.6.1

Why

  • Closes the liquidity and rebalancer flows needed for setting up cross-chain pools on EVM

Testing

Notes

I suggest reviewing commit by commit to make things easier. I kept everything in the same PR since these ops are tightly coupled and needed for the full flow to work

@apedrob
apedrob requested a review from mervin-link September 8, 2026 14:43
@apedrob
apedrob requested a review from a team as a code owner September 8, 2026 14:43
@vercel

vercel Bot commented Sep 8, 2026

Copy link
Copy Markdown

You must have Developer access to commit code to Chainlink Labs on Vercel. If you contact an administrator and receive Developer access, commit again to see your changes.

Learn more: https://vercel.com/docs/accounts/team-members-and-roles/access-roles#team-level-roles

@apedrob
apedrob requested a review from aelmanaa September 8, 2026 14:50
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown

CI Test Report

1 of 2714 tests did not pass (pass 2707, fail 1, cancelled 0, skipped 6) in 6m 37s

Failed suites: ccip-sdk/src/evm/integration.test.ts

Failed tests
test at ccip-sdk/src/evm/integration.test.ts:364:5
✖ should return fee tokens for a v1.5 OnRamp on base-sepolia (759.956066ms)
  AssertionError [ERR_ASSERTION]: base-sepolia → chiado should be a legacy OnRamp
  + actual - expected
  
  + 'OnRamp'
  - 'EVM2EVMOnRamp'
  
      at TestContext.<anonymous> (file:///home/runner/work/ccip-tools-ts/ccip-tools-ts/ccip-sdk/src/evm/integration.test.ts:370:14)
      at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
      at async Test.run (node:internal/test_runner/test:1404:7)
      at async Suite.processPendingSubtests (node:internal/test_runner/test:969:7) {
    generatedMessage: false,
    code: 'ERR_ASSERTION',
    actual: 'OnRamp',
    expected: 'EVM2EVMOnRamp',
    operator: 'strictEqual',
    diff: 'simple'
  }
---------------------------------------|---------|----------|---------|---------|-------------------

Summary

ℹ tests 2714
ℹ suites 692
ℹ pass 2707
ℹ fail 1
ℹ cancelled 0
ℹ skipped 6
ℹ todo 0
ℹ duration_ms 396679.508201
Coverage report
File                                   | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
---------------------------------------|---------|----------|---------|---------|-------------------
All files                              |   84.63 |    83.14 |   76.92 |   84.63 |                   
 ccip-cli/src                          |   90.42 |    59.25 |      75 |   90.42 |                   
  index.ts                             |   90.42 |    59.25 |      75 |   90.42 | ...73-174,180-185 
 ccip-cli/src/commands                 |   52.71 |    75.87 |    62.9 |   52.71 |                   
  index.ts                             |     100 |      100 |     100 |     100 |                   
  lane-latency.ts                      |   70.76 |    83.33 |   33.33 |   70.76 | ...,76-83,119-128 
  lane.ts                              |   86.98 |    68.42 |     100 |   86.98 | ...41-144,148-150 
  manual-exec.ts                       |   20.34 |      100 |       0 |   20.34 | ...39-149,151-347 
  parse.ts                             |    55.2 |      100 |       0 |    55.2 | 47-51,58-65,67-96 
  search.ts                            |   81.25 |      100 |       0 |   81.25 | 24-29             
  send.ts                              |   14.13 |      100 |       0 |   14.13 | ...09-237,239-552 
  show.ts                              |   75.68 |    63.75 |     100 |   75.68 | ...15-318,399-401 
  supported-tokens.ts                  |   17.93 |      100 |       0 |   17.93 | ...80-353,355-368 
  token.ts                             |   22.72 |      100 |       0 |   22.72 | ...3,60-67,69-132 
  types.ts                             |     100 |      100 |     100 |     100 |                   
  utils.ts                             |   88.13 |     80.1 |   96.66 |   88.13 | ...11-721,729-737 
 ccip-cli/src/commands/search          |   53.89 |    76.19 |    12.5 |   53.89 |                   
  messages.ts                          |   53.89 |    76.19 |    12.5 |   53.89 | ...36-258,260-295 
 ccip-cli/src/providers                |   53.37 |    86.45 |   21.73 |   53.37 |                   
  aptos.ts                             |   51.47 |      100 |       0 |   51.47 | ...,95-96,105-136 
  evm.ts                               |    36.3 |      100 |       0 |    36.3 | ...69-104,116-168 
  index.ts                             |   81.37 |    85.71 |    90.9 |   81.37 | ...20,290,344-392 
  solana.ts                            |   47.44 |      100 |       0 |   47.44 | ...02-103,112-137 
  sui.ts                               |    49.5 |      100 |       0 |    49.5 | ...57-258,267-301 
  ton.ts                               |   15.03 |      100 |       0 |   15.03 | 24-153            
 ccip-cli/src/providers/canton         |    85.4 |    77.89 |      68 |    85.4 |                   
  auth.ts                              |   82.41 |    73.01 |   53.33 |   82.41 | ...17-333,464-469 
  config.ts                            |   80.41 |    81.81 |     100 |   80.41 | 36-43,48-58       
  index.ts                             |     100 |      100 |     100 |     100 |                   
  wallet.ts                            |   92.93 |      100 |   85.71 |   92.93 | 172-184           
 ccip-sdk/src                          |   95.45 |    88.32 |    92.9 |   95.45 |                   
  chain.ts                             |   96.52 |     84.5 |   84.37 |   96.52 | ...2427,2460-2461 
  commits.ts                           |    90.9 |    81.25 |     100 |    90.9 | ...06,115-118,120 
  execution.ts                         |   93.13 |    88.23 |     100 |   93.13 | ...53-159,192-199 
  explorer.ts                          |     100 |      100 |     100 |     100 |                   
  extra-args.ts                        |     100 |    89.47 |     100 |     100 | 225,260,297,312   
  fetch.ts                             |   98.06 |    93.56 |   97.77 |   98.06 | ...-881,1127-1129 
  gas.ts                               |   85.17 |    86.04 |      75 |   85.17 | ...83-294,403-452 
  http-status.ts                       |     100 |      100 |     100 |     100 |                   
  index.ts                             |     100 |      100 |     100 |     100 |                   
  messages.ts                          |    79.2 |    47.16 |      40 |    79.2 | ...99-310,314-327 
  networks.ts                          |     100 |      100 |     100 |     100 |                   
  offchain.ts                          |   84.64 |    76.92 |     100 |   84.64 | ...18-227,236-237 
  requests.ts                          |    95.4 |    90.58 |     100 |    95.4 | ...54-655,680-685 
  supported-chains.ts                  |     100 |      100 |     100 |     100 |                   
  types.ts                             |     100 |      100 |     100 |     100 |                   
  utils.ts                             |    99.2 |    95.97 |     100 |    99.2 | ...12,217-218,220 
 ccip-sdk/src/api                      |   93.22 |    83.44 |   94.73 |   93.22 |                   
  index.ts                             |   93.22 |    83.44 |   94.73 |   93.22 | ...92-895,898-901 
 ccip-sdk/src/aptos                    |   78.76 |    78.03 |   76.19 |   78.76 |                   
  exec.ts                              |   29.31 |      100 |       0 |   29.31 | 18-58             
  hasher.ts                            |   75.89 |       80 |   66.66 |   75.89 | 17-36,50-56       
  index.ts                             |   68.84 |    79.83 |   67.44 |   68.84 | ...1072,1076-1087 
  logs.ts                              |   96.47 |    77.41 |    92.3 |   96.47 | ...1442-1444,1731 
  send.ts                              |    25.6 |      100 |       0 |    25.6 | ...2,63-80,93-125 
  token.ts                             |   23.75 |       75 |     100 |   23.75 | 35-156            
  types.ts                             |   65.97 |      100 |       0 |   65.97 | 26-33,65-89       
 ccip-sdk/src/canton                   |   45.32 |    76.16 |   31.66 |   45.32 |                   
  amount.ts                            |   92.59 |       70 |     100 |   92.59 | 22-23             
  ccv-addresses.ts                     |     100 |    91.07 |     100 |     100 | 13,30,64,67       
  defaults.ts                          |   99.28 |    90.24 |     100 |   99.28 | 93                
  events.ts                            |   45.38 |     52.5 |   23.52 |   45.38 | ...15-527,533-542 
  index.ts                             |   34.89 |    58.82 |   12.82 |   34.89 | ...2614,2617-2619 
  types.ts                             |   95.26 |      100 |      50 |   95.26 | 55-62             
  update-id.ts                         |   98.11 |    88.88 |     100 |   98.11 | 52                
 ccip-sdk/src/canton/authentication    |   93.05 |    79.31 |    92.3 |   93.05 |                   
  authorization-code.ts                |   89.83 |    84.31 |    90.9 |   89.83 | ...58-376,432-443 
  client-credentials.ts                |   91.28 |       75 |     100 |   91.28 | ...92-196,198-202 
  index.ts                             |    96.8 |       75 |     100 |    96.8 | 168-173           
  metadata.ts                          |   81.89 |    44.44 |      50 |   81.89 | ...55,73-78,93-94 
  static.ts                            |     100 |      100 |     100 |     100 |                   
  token-source.ts                      |   98.88 |    77.77 |     100 |   98.88 | 165-166           
  types.ts                             |     100 |      100 |     100 |     100 |                   
 ccip-sdk/src/canton/client            |    57.4 |    60.86 |   22.85 |    57.4 |                   
  client.ts                            |   55.62 |    59.09 |   22.85 |   55.62 | ...37-756,771-791 
  index.ts                             |     100 |      100 |     100 |     100 |                   
 ...dk/src/canton/explicit-disclosures |   74.81 |    69.35 |    55.1 |   74.81 |                   
  acs.ts                               |   87.36 |     69.1 |      90 |   87.36 | ...20,568,606-607 
  eds.ts                               |   54.34 |      100 |       0 |   54.34 | ...86-393,397-402 
 ccip-sdk/src/canton/token-metadata    |   61.37 |      100 |       0 |   61.37 |                   
  client.ts                            |   61.37 |      100 |       0 |   61.37 | 111-178,185-189   
 ...dk/src/canton/transfer-instruction |    52.4 |      100 |       0 |    52.4 |                   
  client.ts                            |    52.4 |      100 |       0 |    52.4 | 104-197,204-208   
 ccip-sdk/src/cct                      |     100 |    96.87 |     100 |     100 |                   
  errors.ts                            |     100 |       96 |     100 |     100 | 203               
  operation.ts                         |     100 |      100 |     100 |     100 |                   
  query.ts                             |     100 |      100 |     100 |     100 |                   
  token-manager.ts                     |     100 |      100 |     100 |     100 |                   
 ccip-sdk/src/cct/evm                  |   96.22 |    96.15 |   54.11 |   96.22 |                   
  index.ts                             |   95.05 |      100 |   36.06 |   95.05 | ...1720,1752-1755 
  operation.ts                         |     100 |      100 |     100 |     100 |                   
  query.ts                             |     100 |      100 |     100 |     100 |                   
  submit.ts                            |     100 |    79.16 |     100 |     100 | 28,52,68-69,87    
  validate.ts                          |     100 |      100 |     100 |     100 |                   
 .../cct/evm/artifacts/bytecode/V2_0_0 |     100 |      100 |     100 |     100 |                   
  burn-from-mint-token-pool.ts         |     100 |      100 |     100 |     100 |                   
  burn-mint-token-pool.ts              |     100 |      100 |     100 |     100 |                   
  burn-with-from-mint-token-pool.ts    |     100 |      100 |     100 |     100 |                   
  cross-chain-token.ts                 |     100 |      100 |     100 |     100 |                   
  erc20-lockbox.ts                     |     100 |      100 |     100 |     100 |                   
  lock-release-token-pool.ts           |     100 |      100 |     100 |     100 |                   
 ccip-sdk/src/cct/evm/lockbox          |     100 |      100 |     100 |     100 |                   
  contracts.ts                         |     100 |      100 |     100 |     100 |                   
 ...sdk/src/cct/evm/lockbox/operations |     100 |      100 |     100 |     100 |                   
  authorize-callers.ts                 |     100 |      100 |     100 |     100 |                   
  deploy-lockbox.ts                    |     100 |      100 |     100 |     100 |                   
 ccip-sdk/src/cct/evm/token            |     100 |     64.7 |     100 |     100 |                   
  contracts.ts                         |     100 |     64.7 |     100 |     100 | ...32-139,178-185 
 ...k/src/cct/evm/token-admin-registry |     100 |      100 |     100 |     100 |                   
  contracts.ts                         |     100 |      100 |     100 |     100 |                   
 ...vm/token-admin-registry/operations |     100 |      100 |     100 |     100 |                   
  accept-admin.ts                      |     100 |      100 |     100 |     100 |                   
  get-supported-tokens.ts              |     100 |      100 |     100 |     100 |                   
  get-token-admin-registry.ts          |     100 |      100 |     100 |     100 |                   
  register-admin.ts                    |     100 |      100 |     100 |     100 |                   
  set-pool.ts                          |     100 |      100 |     100 |     100 |                   
  transfer-admin.ts                    |     100 |      100 |     100 |     100 |                   
 ccip-sdk/src/cct/evm/token-pool       |     100 |      100 |     100 |     100 |                   
  contracts.ts                         |     100 |      100 |     100 |     100 |                   
  rate-limit.ts                        |     100 |      100 |     100 |     100 |                   
  remote-pool.ts                       |     100 |      100 |     100 |     100 |                   
 .../src/cct/evm/token-pool/operations |   99.86 |    98.16 |     100 |   99.86 |                   
  add-remote-pool.ts                   |     100 |      100 |     100 |     100 |                   
  apply-allowlist-updates.ts           |     100 |    96.29 |     100 |     100 | 229               
  apply-chain-updates.ts               |     100 |      100 |     100 |     100 |                   
  deploy-token-pool.ts                 |     100 |    85.71 |     100 |     100 | 83-86             
  get-rebalancer.ts                    |     100 |      100 |     100 |     100 |                   
  get-token-pool-remotes.ts            |     100 |      100 |     100 |     100 |                   
  get-token-pool-state.ts              |   98.61 |       95 |     100 |   98.61 | 282-285           
  provide-liquidity.ts                 |     100 |      100 |     100 |     100 |                   
  remove-remote-pool.ts                |     100 |      100 |     100 |     100 |                   
  set-chain-rate-limiter-configs.ts    |     100 |    97.05 |     100 |     100 | 112               
  set-dynamic-config.ts                |     100 |      100 |     100 |     100 |                   
  set-rate-limit-admin.ts              |     100 |      100 |     100 |     100 |                   
  set-rebalancer.ts                    |     100 |      100 |     100 |     100 |                   
  set-remote-pool.ts                   |     100 |      100 |     100 |     100 |                   
  transfer-liquidity.ts                |     100 |      100 |     100 |     100 |                   
  transfer-ownership.ts                |     100 |      100 |     100 |     100 |                   
  withdraw-liquidity.ts                |     100 |      100 |     100 |     100 |                   
 ccip-sdk/src/cct/evm/token/operations |     100 |      100 |     100 |     100 |                   
  approve-token.ts                     |     100 |      100 |     100 |     100 |                   
  deploy-token.ts                      |     100 |      100 |     100 |     100 |                   
  get-burners.ts                       |     100 |      100 |     100 |     100 |                   
  get-minters.ts                       |     100 |      100 |     100 |     100 |                   
  is-burner.ts                         |     100 |      100 |     100 |     100 |                   
  is-minter.ts                         |     100 |      100 |     100 |     100 |                   
  mint.ts                              |     100 |      100 |     100 |     100 |                   
 ccip-sdk/src/cct/solana               |   99.73 |    96.78 |   97.97 |   99.73 |                   
  index.ts                             |   99.67 |      100 |   97.22 |   99.67 | 258-259,2425-2430 
  operation.ts                         |     100 |      100 |     100 |     100 |                   
  query.ts                             |     100 |      100 |     100 |     100 |                   
  serialize.ts                         |     100 |     92.3 |     100 |     100 | 27                
  submit.ts                            |     100 |    81.81 |     100 |     100 | 31,48,53,72       
  validate.ts                          |     100 |    98.05 |     100 |     100 | 214,321           
 ccip-sdk/src/cct/solana/programs      |     100 |      100 |     100 |     100 |                   
  alt.ts                               |     100 |      100 |     100 |     100 |                   
  fee-quoter.ts                        |     100 |      100 |     100 |     100 |                   
  router.ts                            |     100 |      100 |     100 |     100 |                   
  token-pool.ts                        |     100 |      100 |     100 |     100 |                   
  token.ts                             |     100 |      100 |     100 |     100 |                   
 ccip-sdk/src/cct/solana/token         |     100 |      100 |     100 |     100 |                   
  constants.ts                         |     100 |      100 |     100 |     100 |                   
 ...rc/cct/solana/token-admin-registry |     100 |      100 |     100 |     100 |                   
  constants.ts                         |     100 |      100 |     100 |     100 |                   
 ...na/token-admin-registry/operations |   99.61 |    98.74 |     100 |   99.61 |                   
  accept-admin.ts                      |     100 |      100 |     100 |     100 |                   
  append-to-lookup-table.ts            |     100 |      100 |     100 |     100 |                   
  create-lookup-table.ts               |     100 |      100 |     100 |     100 |                   
  get-supported-tokens.ts              |     100 |      100 |     100 |     100 |                   
  get-token-admin-registry.ts          |     100 |      100 |     100 |     100 |                   
  index.ts                             |     100 |      100 |     100 |     100 |                   
  ...override-pending-administrator.ts |     100 |      100 |     100 |     100 |                   
  register-admin.ts                    |   97.95 |    94.44 |     100 |   97.95 | 212-216           
  set-pool.ts                          |     100 |      100 |     100 |     100 |                   
  transfer-admin.ts                    |     100 |      100 |     100 |     100 |                   
 ...c/cct/solana/token-pool/operations |   99.62 |    98.23 |     100 |   99.62 |                   
  accept-ownership.ts                  |     100 |      100 |     100 |     100 |                   
  append-remote-pool-addresses.ts      |     100 |      100 |     100 |     100 |                   
  apply-chain-updates.ts               |     100 |    98.36 |     100 |     100 | 148               
  configure-allowlist.ts               |     100 |      100 |     100 |     100 |                   
  create-token-multisig.ts             |    95.9 |     92.5 |     100 |    95.9 | ...01-102,104-109 
  delete-chain-remote-config.ts        |     100 |      100 |     100 |     100 |                   
  deploy-token-pool.ts                 |     100 |      100 |     100 |     100 |                   
  edit-chain-remote-config.ts          |     100 |      100 |     100 |     100 |                   
  get-token-pool-remotes.ts            |     100 |      100 |     100 |     100 |                   
  get-token-pool-state.ts              |     100 |      100 |     100 |     100 |                   
  index.ts                             |     100 |      100 |     100 |     100 |                   
  init-chain-remote-config.ts          |     100 |      100 |     100 |     100 |                   
  provide-liquidity.ts                 |     100 |      100 |     100 |     100 |                   
  remove-from-allowlist.ts             |     100 |    94.11 |     100 |     100 | 126               
  set-can-accept-liquidity.ts          |     100 |      100 |     100 |     100 |                   
  set-chain-rate-limit.ts              |   99.11 |    96.15 |     100 |   99.11 | 64-65             
  set-rate-limit-admin.ts              |     100 |      100 |     100 |     100 |                   
  set-rebalancer.ts                    |     100 |      100 |     100 |     100 |                   
  transfer-ownership.ts                |     100 |      100 |     100 |     100 |                   
  withdraw-liquidity.ts                |     100 |      100 |     100 |     100 |                   
 ...dk/src/cct/solana/token/operations |     100 |    98.41 |     100 |     100 |                   
  approve-token.ts                     |     100 |      100 |     100 |     100 |                   
  create-token-account.ts              |     100 |      100 |     100 |     100 |                   
  deploy-token.ts                      |     100 |      100 |     100 |     100 |                   
  get-token-info.ts                    |     100 |       70 |     100 |     100 | 69,80-81          
  index.ts                             |     100 |      100 |     100 |     100 |                   
  mint-tokens.ts                       |     100 |      100 |     100 |     100 |                   
  set-token-authority.ts               |     100 |      100 |     100 |     100 |                   
  update-metadata-authority.ts         |     100 |      100 |     100 |     100 |                   
 ccip-sdk/src/errors                   |   90.42 |    77.16 |   59.55 |   90.42 |                   
  CCIPError.ts                         |     100 |      100 |     100 |     100 |                   
  codes.ts                             |     100 |      100 |     100 |     100 |                   
  index.ts                             |     100 |      100 |     100 |     100 |                   
  pure.ts                              |     100 |       75 |     100 |     100 | 32                
  recovery.ts                          |     100 |      100 |     100 |     100 |                   
  specialized.ts                       |   88.26 |    73.91 |   57.36 |   88.26 | ...3636,3659-3668 
  utils.ts                             |   94.44 |    81.48 |     100 |   94.44 | 15,17,22,24       
 ccip-sdk/src/evm                      |   92.88 |    82.43 |   93.16 |   92.88 |                   
  const.ts                             |   98.66 |    92.85 |     100 |   98.66 | 122-123           
  errors.ts                            |   91.98 |    81.57 |     100 |   91.98 | ...85,239-242,247 
  extra-args.ts                        |    94.5 |    61.01 |     100 |    94.5 | ...11-212,328-340 
  fork.test.data.ts                    |     100 |      100 |     100 |     100 |                   
  gas.ts                               |   98.19 |    63.15 |     100 |   98.19 | 90-91,93          
  hasher.ts                            |     100 |     92.3 |     100 |     100 | 135               
  index.ts                             |   88.32 |    80.57 |    90.9 |   88.32 | ...2716,2871-2902 
  logs.ts                              |   99.16 |    92.02 |      90 |   99.16 | 69-70,75-76       
  messageCodec.ts                      |     100 |      100 |     100 |     100 |                   
  messages.ts                          |     100 |      100 |     100 |     100 |                   
  offchain.ts                          |    87.5 |    71.42 |     100 |    87.5 | 13-14             
  simulate.ts                          |     100 |    94.82 |     100 |     100 | 109-111,425       
  types.ts                             |     100 |      100 |     100 |     100 |                   
 ccip-sdk/src/evm/viem                 |   79.76 |    90.62 |   69.23 |   79.76 |                   
  client-adapter.ts                    |     100 |       90 |     100 |     100 | 48,74             
  index.ts                             |     100 |      100 |     100 |     100 |                   
  wallet-adapter.ts                    |   63.09 |     90.9 |   55.55 |   63.09 | ...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 | ...06-307,315-316 
 ccip-sdk/src/shared                   |   85.32 |    84.33 |   82.35 |   85.32 |                   
  bcs-codecs.ts                        |   79.07 |    60.86 |   66.66 |   79.07 | ...42-252,260-269 
  codec.ts                             |    94.3 |    93.22 |     100 |    94.3 | 139-140,178-186   
  constants.ts                         |     100 |      100 |     100 |     100 |                   
 ccip-sdk/src/solana                   |   79.13 |    75.73 |   84.34 |   79.13 |                   
  cleanup.ts                           |   26.95 |    66.66 |   33.33 |   26.95 | ...59-101,114-227 
  exec.ts                              |   69.11 |    62.96 |   66.66 |   69.11 | ...69-473,513-514 
  extra-args.ts                        |   59.49 |    76.47 |      60 |   59.49 | 86-122,132-190    
  fork.test.data.ts                    |     100 |      100 |     100 |     100 |                   
  gas.ts                               |   92.06 |    68.57 |     100 |   92.06 | ...,81-90,170-171 
  hasher.ts                            |   96.49 |    81.81 |     100 |   96.49 | 64-67             
  index.ts                             |   83.03 |    78.91 |   87.03 |   83.03 | ...2129,2133-2166 
  logs.ts                              |   87.79 |    74.07 |     100 |   87.79 | ...50-151,163-164 
  offchain.ts                          |     100 |      100 |     100 |     100 |                   
  patchBorsh.ts                        |   78.31 |       50 |     100 |   78.31 | ...47,65-66,72-78 
  send.ts                              |    77.6 |    33.33 |      80 |    77.6 | ...52-360,403-442 
  signatures-cache.ts                  |   79.78 |    71.15 |    87.5 |   79.78 | ...51-260,274-275 
  token-admin-registry.ts              |     100 |    96.29 |     100 |     100 | 27                
  types.ts                             |     100 |      100 |     100 |     100 |                   
  utils.ts                             |   81.56 |     77.1 |   83.33 |   81.56 | ...87-588,625-640 
 ccip-sdk/src/sui                      |   73.18 |    70.62 |   81.14 |   73.18 |                   
  discovery.ts                         |   47.37 |    48.27 |      60 |   47.37 | ...34-782,785-819 
  events.ts                            |   89.83 |    72.67 |     100 |   89.83 | ...19-626,685-698 
  exec.ts                              |   30.71 |      100 |       0 |   30.71 | 37-89,101-153     
  hasher.ts                            |   98.19 |    66.66 |     100 |   98.19 | 35,51             
  index.ts                             |   76.12 |    70.39 |   79.68 |   76.12 | ...2314,2330-2331 
  logs.ts                              |   97.89 |    74.02 |     100 |   97.89 | ...62-165,186-187 
  objects.ts                           |    54.6 |    83.33 |   83.33 |    54.6 | ...57-313,324-467 
  types.ts                             |     100 |      100 |     100 |     100 |                   
 ccip-sdk/src/sui/manuallyExec         |   53.36 |       75 |      50 |   53.36 |                   
  encoder.ts                           |    83.9 |    66.66 |     100 |    83.9 | 51-58,73-77,82    
  index.ts                             |   33.82 |      100 |       0 |   33.82 | 47-136            
 ccip-sdk/src/ton                      |      86 |    80.53 |   88.28 |      86 |                   
  exec.ts                              |     100 |      100 |     100 |     100 |                   
  extra-args.ts                        |   98.66 |    72.72 |     100 |   98.66 | 156-157,222       
  hasher.ts                            |   78.07 |    77.77 |      75 |   78.07 | 100-108,156-187   
  index.ts                             |   84.81 |     79.6 |   79.03 |   84.81 | ...2111,2118-2119 
  logs.ts                              |   93.84 |    83.43 |     100 |   93.84 | ...09-616,672-675 
  send.ts                              |   95.52 |    66.66 |     100 |   95.52 | 37-44,188         
  ton-cache.ts                         |     100 |    96.55 |     100 |     100 | 102               
  types.ts                             |   91.24 |    81.25 |     100 |   91.24 | ...61-63,71-74,92 
  utils.ts                             |    63.1 |    77.77 |    90.9 |    63.1 | ...37-395,397-400 
 scripts                               |   88.97 |    66.66 |     100 |   88.97 |                   
  test-endpoints.ts                    |   97.98 |    72.72 |     100 |   97.98 | 137-139           
  useResource.ts                       |   85.04 |    65.62 |     100 |   85.04 | ...81-286,301-302 
---------------------------------------|---------|----------|---------|---------|-------------------

@aelmanaa

aelmanaa commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator

Overview

APPROVE — 0 blockers, 0 correctness/architecture majors. Exceptionally careful: floor-match version dispatch with explicit null-ceiling for removals, rebalancer-vs-owner gates grounded to contracts, pre-flight funding/allowance checks at cross-family parity with Solana, and JSDoc that teaches. Type-safe and green (170/170 tests, tsc clean, oxfmt/oxlint clean).

What it adds: Complete EVM LockRelease liquidity surface:

  • Liquidity ops: provideLiquidity, withdrawLiquidity, transferLiquidity (pool-to-pool migration)
  • Rebalancer ops: setRebalancer, getRebalancer
  • Token op: approveToken (ERC-20 pre-flight, analogous to Solana's includeApproval)

Architecture:

  • Version-gated: targets v1.5.0–v1.6.1, explicitly null at v2.0.0 (uses external ERC20LockBox)
  • Floor-matched versioning (signature stable across 1.5.0/1.5.1/1.6.1)
  • Rebalancer-gated (not owner-gated) — pool checks msg.sender == rebalancer, owner appoints via setRebalancer
  • Pre-flights: rebalancer validation, allowance/balance checks (Solana parity)

Live Sepolia Verification:

  • Type gates: v2.0.0 BurnMintTokenPool rejects all ops with CCTContractTypeInvalidError
  • Version gates: v2.0.0 LockRelease rejects with CCTOperationUnsupportedError
  • approveToken: allowance 0 → 12345 on real token — tx 0x4c1dc3fd…
  • Constraint (honest): Write paths (setRebalancer → approveToken → provideLiquidity → withdrawLiquidity → transferLiquidity) require a v1.5.x pool, which the SDK only deploys at v2.0.0. Those paths are covered by 170 unit tests (mocked, real calldata) + contract grounding. Not a code gap — an ecosystem deploy constraint.

[COMMENT 1/6] 🔴 Medium (DX) — transferLiquidity's from param is a naming footgun for agents

Problem: The public shape is { poolAddress, from, amount, sender? }, where from is the source pool to pull liquidity out of, and sender is the tx signer (destination-pool owner). An agent assembling the call from the type signature can plausibly read from as the sender/origin — the exact inversion that produces this op's most likely failure.

No other EVM CCT op uses a bare from as a non-sender address.

Impact: Agents will misunderstand the parameter direction, resulting in authentication failures or wrong pool targets.

Fix — rename or clarify:

Option A (preferred): Rename to sourcePool or fromPool — matches semantics:

export type TransferLiquidityParams = {
  poolAddress: string          // destination pool
  sourcePool: string           // source pool (the pool withdrawing)
  amount: bigint
  sender?: string              // tx signer (destination owner)
}

Option B: Keep from but lead param doc with a bold disambiguator:

/**
 * from: string
 * **Source pool** (not the tx sender — see `sender`). The pool to withdraw liquidity out of.
 * The withdrawn amount is transferred to the destination pool's rebalancer.
 */

Location: token-pool/operations/transfer-liquidity.ts:47, facade index.ts:855,883.

Recommended: Option A (rename to sourcePool).

@aelmanaa

aelmanaa commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator

[COMMENT 2/6] 🔴 Medium (Doc, Borderline Major) — Stale correctness rationale on readTokenPoolOwner

Problem: The @remarks reason #1 claims getTokenPoolState throws CCTContractTypeInvalidError for a v2.0.0 SiloedLockReleaseTokenPool, calling that a "correctness bug."

At this PR's head, that is falseget-token-pool-state.ts now returns a dedicated siloed-v2.0.0 state shape and does not throw.

Impact: The comment is stale and refutes itself. A maintainer reading it might "simplify" by routing through getTokenPoolState anyway, thinking the bug is still there. The runtime is not broken (owner-gated ops are v1.5.0–v1.6.1-only and never reach v2.0.0), but the false rationale erodes confidence.

Current @remarks (lines 254-267):

/**
 * Reason 1: `getTokenPoolState` throws `CCTContractTypeInvalidError` for v2.0.0 `SiloedLockReleaseTokenPool`.
 * (A correctness bug — see DAPP-11357 comment 5.)
 * 
 * Reason 2: `getTokenPoolState` costs 6–8 eth_call + re-`typeAndVersion` for every op; this is one call.
 */

Fix: Drop reason #1, lead with reason #2 + add the context that owner-gated ops never reach v2:

/**
 * @remarks
 * Direct `owner()` read, not `getTokenPoolState`, saves RPC cost (one eth_call vs 6–8 calls + re-typeAndVersion).
 * Owner-gated ops (provide/withdraw/setRebalancer) are v1.5.0–v1.6.1-only and never resolve to v2.0.0,
 * so routing through `getTokenPoolState` adds cost with no benefit.
 */

Location: token-pool/contracts.ts:254-267.

@aelmanaa

aelmanaa commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator

[COMMENT 3/6] 🟡 Low (DX) — Approve→provide cross-link is one-directional

Problem: approveToken links forward to provideLiquidity and the funding error names approveToken, but neither the provideLiquidity facade method nor its op module links back to approveToken/generateUnsignedApproveToken. This is inconsistent — provideLiquidity links backward to other prerequisites like setRebalancer.

Impact: A developer reading provideLiquidity docs doesn't see the mention of approveToken, making the required approval step less discoverable.

Fix: Add a backward @see link in provideLiquidity:

In facade method index.ts:705-741, change the @remarks:

/**
 * @remarks
 * ...
 * The deposit is a `transferFrom` on the rebalancer, so the tokens must be approved to the pool first.
 * Use {@link generateUnsignedApproveToken} / {@link approveToken} to set the allowance.
 * 
 * @see {@link setRebalancer}
 * @see {@link generateUnsignedApproveToken}
 */

In op file provide-liquidity.ts:8-10:

/**
 * @remarks The deposit is a `transferFrom` on the rebalancer, so the tokens must be **approved to
 * the pool** first with {@link ApproveToken} / its facade method before calling this op.
 */

Location: index.ts:705-741, provide-liquidity.ts:8-10.

@aelmanaa

aelmanaa commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator

[COMMENT 4/6] 🟡 Low (Scope/Doc) — "v1.5.0–v1.6.1" prose overstates coverage for one Siloed edge

Problem: A real SiloedLockReleaseTokenPool 1.6.0 exists on-chain (v1.6.0 shipped Siloed pools + ramps; generic pools skipped 1.6.0), and SiloedLockReleaseTokenPool is a supported TokenPoolType, but 1.6.0 is absent from the (pre-existing) TokenPoolVersion table.

Result: resolveTokenPool on such a pool throws CCTContractVersionUnsupportedError, even though its legacy provideLiquidity/withdrawLiquidity shims exist.

Context: This is a pre-existing table gap that this PR makes newly reachable (by adding liquidity ops that would target it). Not a regression — an intentional design decision being made explicit.

Fix — either option:

Option A: Add a one-line comment in TokenPoolVersion clarifying the deliberate omission:

export enum TokenPoolVersion {
  V1_5_0,
  V1_5_1,
  // Note: v1.6.0 omitted — supported only for Siloed pools, not in this generic ops scope
  V1_6_1,
  V2_0_0,
}

Option B: Narrow the ops' version prose:

/**
 * @remarks Targets LockRelease v1.5.0–v1.6.1 (generic pools only; Siloed 1.6.0 is out of scope).
 */

Recommended: Option A (document the table design decision).

Location: token-pool/contracts.ts:100-106.

@aelmanaa

aelmanaa commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator

[COMMENT 5/6] 🟡 Low (Cross-family Consistency) — Error-class divergence with Solana

Problem: EVM throws different error classes than Solana for the same conditions:

Condition EVM Solana
sender is not rebalancer CCTParamsInvalidError CCTTxFailedError
pool cannot accept liquidity CCTParamsInvalidError CCTTxFailedError
funding / allowance insufficient CCTTxFailedError CCTTxFailedError

Impact: A caller writing one error-handler across families can't catch "sender is not rebalancer" or "pool won't accept it" with a single try/catch. EVM's choice (blame the bad sender param as invalid input) is more defensible than Solana's (blame the tx).

Recommendation: Converge Solana onto EVM's choice (treat bad sender/pool-config as CCTParamsInvalidError). This is a coordination item for the Solana side.

For this PR: No change needed. Raise with the solana/validate.ts owner to align error classes in a follow-up.

Location (reference):

  • EVM: token-pool/contracts.ts:401-407, provide-liquidity.ts:108-112
  • Solana: solana/validate.ts:308-337

Flag to: @smartcontractkit/ccip-team for Solana side alignment in a future PR.

@aelmanaa

aelmanaa commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator

[COMMENT 6/6] 🟡 Nits — @throws, idiom, example imports, error messaging

(a) Missing @throws on op classes

The five pool ops (provideLiquidity, withdrawLiquidity, transferLiquidity, setRebalancer, getRebalancer) have @throws on the facade methods but omit CCTContractVersionUnsupportedError at the op-class level. The facade methods list it — mirror it down for consistency:

/**
 * @throws {@link CCTContractVersionUnsupportedError} if the pool version is not supported
 * @throws {@link CCTContractTypeInvalidError} if the pool is not a LockRelease pool
 * @throws {@link CCTParamsInvalidError} if parameters are invalid
 * @throws {@link CCTTxFailedError} if preflight checks fail
 */

(b) Idiom: as string cast vs resultToObject

contracts.ts:349 uses a raw as string cast:

dynamicConfig[1] as string

The sibling get-token-pool-state.ts handles the same string | Addressable narrowing idiomatically:

getAddress(resultToObject(dynamicConfig[1]))

Preferred idiom in this codebase: use resultToObject + getAddress.

(c) Missing import hint in facade example

The transferLiquidity facade example uses MaxUint256 with no import hint:

/**
 * @example
 * ```ts
 * await cct.transferLiquidity({
 *   poolAddress: destPool,
 *   from: sourcePool,
 *   amount: MaxUint256,  // ← where does this come from?
 *   sender: wallet.address,
 * })
 * ```
 */

Add:

/**
 * @example
 * ```ts
 * import { MaxUint256 } from 'ethers'
 * 
 * await cct.transferLiquidity({
 *   poolAddress: destPool,
 *   from: sourcePool,
 *   amount: MaxUint256,  // Withdraw the entire balance
 *   sender: wallet.address,
 * })
 * ```
 */

Location: index.ts:855-867.

(d) Funding error messaging could clarify approval pre-req

The error in assertLiquidityFunding says the sender doesn't have enough balance or allowance but doesn't mention that the approval must be signed by the same account. Add context:

throw new CCTTxFailedError(
  operation,
  `sender ${sender} holds or has approved the pool for less than ${amount} of token ${token}; use approveToken (signed by this same account) to set the allowance first`
)

And for offline paths, clarify generateUnsignedApproveToken:

// For unsigned (offline) flow:
throw new CCTTxFailedError(
  operation,
  `sender ${sender} holds or has approved the pool for less than ${amount}; use generateUnsignedApproveToken to prepare the approval (must be signed by ${sender})`
)

These are polish items — collectively they improve robustness and DX.

@apedrob
apedrob force-pushed the feature/DAPP-11354-lockrelease-liquidity branch 2 times, most recently from 692e751 to 56d6fee Compare September 9, 2026 16:01
@apedrob

apedrob commented Sep 9, 2026

Copy link
Copy Markdown
Contributor Author
  1. Keeping from param given it's the exact onchain param, where this codebase is mirroring ABI parameters
  2. Confirmed and fixed
  3. Fixed + added backlinks
  4. Already covered by the test at contracts.test.ts:87
  5. Agreed, follow-up on the Solana side
  6. (a) and (c) fixed. (b) and (d) keeping as is

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.

2 participants