8.1 KiB
LXC DApp and Dual-Router Coordinator — Completion Gaps
Last Updated: 2026-02-20
Status: Reference for remaining work
This document lists gaps between the LXC DApp VM and Dual-Router BridgeSwap Coordinator plan and the current implementation. Items are ordered by impact (bugs first, then missing features, then nice-to-haves).
Fixed in this pass
- canSwap / getNonce chain:
useReadContractforcanSwapandgetNoncenow passchainId(mainnet and Chain 138 respectively) so the correct chain is queried even when the wallet is on another chain.
Gaps — all addressed (2026-02-20)
The following gaps were completed:
- Lockbox ERC-20: TrustlessBridgeForm now supports deposit type (Native | ERC-20), token selector (WETH, cUSDT, cUSDC with decimals), Approve + Deposit ERC-20.
- CCIP destination: BridgePage has a destination chain dropdown; BridgeButtons receives
destinationChainSelectorfor all 10 chains (Ethereum, BSC, Polygon, Base, Optimism, Arbitrum, Avalanche, Cronos, Gnosis). - Per-chain CCIP config:
bridge.tshasCCIP_DESTINATIONSandgetCcipWeth9BridgeAddress(chainId); CRONOS selector added to CHAIN_SELECTORS. - Admin + TRUSTLESS:
contracts.tsimports TRUSTLESS and exposes mainnet/chain138 trustless addresses; re-exports TRUSTLESS. - Finalize claim: TrustlessBridgeForm section "2b. Finalize claim" with deposit ID, canFinalize read, and finalizeClaim write (ChallengeManager).
- LXC ENV_FILE when PROXMOX_HOST: Script scps ENV_FILE to the Proxmox host then runs
pct pushso the container gets.env. - LXC ip-addresses path: Script tries
IP_CONFIG_PATH, thenSMOM_ROOT/../../config/ip-addresses.conf, thenSCRIPT_DIR/../../../config/ip-addresses.conf. - VITE_ / .env docs:* DAPP_LXC_DEPLOYMENT.md has a "Production build: VITE_* and .env" section and IP_CONFIG_PATH in the table.
Gaps (original list, for reference)
1. Trustless: Lockbox ERC-20 deposit not in UI
Plan: “Lockbox 138 deposit (native + ERC-20: ETH, WETH, cUSDT, cUSDC).”
Current: Only native ETH deposit is implemented in the Trustless Bridge tab.
Gap: No UI for Lockbox depositERC20 (WETH, cUSDT, cUSDC on Chain 138). LOCKBOX_138_ABI already includes depositERC20; the form needs token selector, amount, approve flow, and call to depositERC20(token, amount, recipient, nonce).
2. CCIP: All 10 chains not selectable in Custom Bridge
Plan: “Ensure all 10 chains are selectable for CCIP WETH where applicable.”
Current: The Custom Bridge tab uses BridgeButtons with destinationChainSelector={CHAIN_SELECTORS.ETHEREUM_MAINNET} only (hardcoded in BridgePage.tsx).
Gap: Users cannot choose BSC, Polygon, Base, Optimism, Arbitrum, Avalanche, Cronos, or Gnosis as CCIP destination. CHAIN_SELECTORS in bridge.ts already includes BSC, GNOSIS, etc.; the Bridge page (or BridgeButtons) needs a destination chain selector (e.g. dropdown) and pass the chosen destinationChainSelector into BridgeButtons.
3. CCIP: No centralized per-chain contract config for all 10 chains
Plan: “Contract addresses: Centralize per-chain addresses (CCIP WETH bridges, …) in a config driven by env (e.g. VITE_*) or a small JSON so the DApp works against deployed addresses on all networks.”
Current:
- Trustless: Centralized in
bridge.tsasTRUSTLESS(Chain 138 + mainnet only). - CCIP: Only Chain 138 has
CONTRACTS.WETH9,CONTRACTS.WETH9_BRIDGE, etc. There is no single config (or JSON) that maps chainId → CCIP WETH9 / WETH10 bridge (and related) addresses for BSC, Polygon, Base, Optimism, Arbitrum, Avalanche, Cronos, Gnosis.
Gap: Add a per-chain CCIP config (e.g. chainId → { WETH9_BRIDGE, WETH10_BRIDGE, LINK? }) driven by env or JSON, and wire BridgeButtons (and any CCIP UI) to use it so the DApp can target all 10 chains with the correct contract addresses.
4. Admin panels not wired to shared trustless config
Plan: “Keep existing admin panels (TwoWayBridge, MultiChainAdmin, etc.) and wire them to the same per-chain contract config.”
Current: Admin panels use config/contracts.ts and/or hardcoded addresses; they do not import or use TRUSTLESS from bridge.ts.
Gap: Optional consistency improvement: have TwoWayBridge (and any other trustless-related admin) read Lockbox/Inbox/Coordinator addresses from TRUSTLESS (or a shared module that re-exports them) so there is a single source of truth.
5. Trustless: No “finalize claim” action in DApp
Plan: “Add (or complete) flows for: … finalize claim, and bridgeAndSwap …”
Current: We have “Check canSwap” (read-only) and “Bridge and Swap” (write). There is no button or flow to finalize a claim (e.g. call Inbox or ChallengeManager to finalize).
Gap: If the operator/user is expected to finalize claims from the DApp (rather than only via relay/backend), add a “Finalize claim” action that calls the appropriate mainnet contract (e.g. ChallengeManager finalization) when the challenge window has passed. Depends on product decision: is finalization relay-only or also user-triggered?
6. LXC deploy script: pct push when using PROXMOX_HOST
Current: When PROXMOX_HOST is set (script run from a different machine), ENV_FILE is not pushed into the container because pct push runs on the remote host and the file lives on the runner.
Gap: Either document that the operator must copy .env into the container manually (e.g. scp .env root@proxmox:/tmp/ && ssh root@proxmox 'pct push 5801 /tmp/.env /srv/smom-dbis-138/.env') or add a step that scps ENV_FILE to the Proxmox host into a temp path then runs pct push via SSH so the container gets the file.
7. LXC deploy script: config/ip-addresses.conf path
Current: Script does source "${SMOM_ROOT}/../../config/ip-addresses.conf". That assumes the repo is under proxmox/smom-dbis-138 (so ../../ is proxmox). If the script is run from a clone that only has smom-dbis-138, the path is wrong.
Gap: Make the config path robust: e.g. allow override via IP_CONFIG_PATH, or try both SMOM_ROOT/../../config/ip-addresses.conf and SMOM_ROOT/config/ip-addresses.conf (or a path relative to script), and document expected repo layout.
8. DApp build in LXC: .env for VITE_* when cloning
Current: Build runs npm run build in the container. VITE_* are baked in at build time. If ENV_FILE is not pushed (see gap 6), the build uses no env and falls back to defaults in bridge.ts and networks.ts.
Gap: Document that for production builds with custom contract addresses or RPC URLs, the operator must ensure a .env (or .env.production) with the right VITE_* is present in the container before npm run build, and how to achieve that (e.g. push before build, or inject in CI and rsync into container).
Summary
| # | Area | Gap | Priority / notes |
|---|---|---|---|
| 1 | Trustless UI | Lockbox ERC-20 (WETH, cUSDT, cUSDC) deposit | Feature |
| 2 | CCIP UI | Destination chain selector (all 10 chains) | Feature |
| 3 | Config | Per-chain CCIP contract addresses (10 chains) | Needed for gap 2 and full CCIP use |
| 4 | Admin | Wire admin to TRUSTLESS config | Optional consistency |
| 5 | Trustless UI | “Finalize claim” action (if product wants it) | Product-dependent |
| 6 | LXC script | ENV_FILE push when using PROXMOX_HOST | UX / automation |
| 7 | LXC script | Robust path to ip-addresses.conf | Robustness |
| 8 | DApp/LXC docs | Document VITE_* and .env for production build | Documentation |
Implementing 1–3 would bring the DApp to full “all possible uses” and “all 10 chains” as in the plan; 4–8 are improvements and clarity.