# 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:** `useReadContract` for `canSwap` and `getNonce` now pass `chainId` (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: 1. **Lockbox ERC-20:** TrustlessBridgeForm now supports deposit type (Native | ERC-20), token selector (WETH, cUSDT, cUSDC with decimals), Approve + Deposit ERC-20. 2. **CCIP destination:** BridgePage has a destination chain dropdown; BridgeButtons receives `destinationChainSelector` for all 10 chains (Ethereum, BSC, Polygon, Base, Optimism, Arbitrum, Avalanche, Cronos, Gnosis). 3. **Per-chain CCIP config:** `bridge.ts` has `CCIP_DESTINATIONS` and `getCcipWeth9BridgeAddress(chainId)`; CRONOS selector added to CHAIN_SELECTORS. 4. **Admin + TRUSTLESS:** `contracts.ts` imports TRUSTLESS and exposes mainnet/chain138 trustless addresses; re-exports TRUSTLESS. 5. **Finalize claim:** TrustlessBridgeForm section "2b. Finalize claim" with deposit ID, canFinalize read, and finalizeClaim write (ChallengeManager). 6. **LXC ENV_FILE when PROXMOX_HOST:** Script scps ENV_FILE to the Proxmox host then runs `pct push` so the container gets `.env`. 7. **LXC ip-addresses path:** Script tries `IP_CONFIG_PATH`, then `SMOM_ROOT/../../config/ip-addresses.conf`, then `SCRIPT_DIR/../../../config/ip-addresses.conf`. 8. **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.ts` as `TRUSTLESS` (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.