123 lines
8.1 KiB
Markdown
123 lines
8.1 KiB
Markdown
|
|
# 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.
|