# Pre-Deployment Recommendations and Suggestions

Use this checklist and recommendations before deploying PaymentChannelManager to Mainnet or Chain-138.

---

## 1. Security

| Recommendation | Details |
|----------------|--------|
| **Admin = multisig** | Set `CHANNEL_ADMIN` to a Gnosis Safe (or other multisig). Avoid EOA for production. |
| **Challenge window** | 24h (86400s) is a reasonable default. Shorter (e.g. 1h) increases griefing risk for honest offline users; longer increases exposure to stale-state attacks. Document the tradeoff for operators. |
| **Reentrancy** | Current design: state updates then external transfers. Consider adding a simple reentrancy guard (e.g. OpenZeppelin `ReentrancyGuard`) on `closeChannelCooperative`, `finalizeClose`, and any other entry that does `_transfer`. |
| **Signature replay** | State is bound to `(channelId, nonce, balanceA, balanceB)`. No cross-chain replay if each chain has its own contract. Same-chain replay is prevented by nonce and status (channel closed). |
| **ecrecover edge cases** | Contract uses `ecrecover` without checking for zero address or signature malleability. For maximum safety, consider EIP-2 malleability check (reject `s > secp256k1n/2`) or use a library (e.g. OpenZeppelin ECDSA). |

---

## 2. Operational

| Recommendation | Details |
|----------------|--------|
| **Deploy order** | Deploy to testnet (or Mainnet fork + Chain-138 testnet) first. Run full e2e tests (see test/e2e/PaymentChannelsE2E.t.sol). |
| **Verification** | Verify on block explorer after deploy (`--verify` in Forge script). Ensures users can read the contract. |
| **Frontend config** | After deploy, set `CONTRACT_ADDRESSES.mainnet.PAYMENT_CHANNEL_MANAGER` and/or `CONTRACT_ADDRESSES.chain138.PAYMENT_CHANNEL_MANAGER` in the dApp. |
| **Monitoring** | Monitor `ChannelOpened`, `ChannelClosed`, `ChallengeSubmitted`. Alert on unexpected pause or admin change. |
| **Watchtower** | If users may be offline during the challenge window, document or run a watchtower (see WATCHTOWER_AND_INDEXER.md). |

---

## 3. Testing

| Recommendation | Details |
|----------------|--------|
| **Unit tests** | Already in `test/channels/PaymentChannelManager.t.sol`. Run before every deploy: `forge test --match-path test/channels/`. |
| **E2E tests** | Run full e2e: `forge test --match-path test/e2e/PaymentChannelsE2E.t.sol`. Covers happy path, unilateral close, challenge, and edge cases. |
| **Fork / testnet** | Run e2e on a fork of the target chain (and Chain-138 testnet if available) to catch env-specific issues. |
| **Gas snapshot** | See [GAS_REPORT.md](GAS_REPORT.md). Run `forge test --gas-report --match-path test/channels/` and e2e paths to refresh. |

---

## 4. Contract behavior and limits

| Item | Current behavior | Suggestion |
|------|------------------|------------|
| **ETH only** | v1 holds only ETH. | If you need ERC20 later, add a separate PaymentChannelManagerERC20 or extend with a token parameter and safe transfer. |
| **No upgradeability** | Contract is not proxy-based. | If you expect to change logic, consider deploying behind a transparent proxy and an initial implementation; otherwise keep immutable for simplicity. |
| **Unbounded channel list** | `_channelIds.length` grows with channels. | `getChannelCount` and enumeration are O(1) and O(n) per read; acceptable for moderate channel counts. For very high volume, an indexer is recommended. |
| **Pause** | Pause blocks only `openChannel` and `fundChannel`; `closeChannelCooperative`, `submitClose`, `challengeClose`, and `finalizeClose` are allowed when paused. | In-flight channels can always settle; new channels are disabled when paused. |

---

## 5. Documentation and runbooks

| Recommendation | Details |
|----------------|--------|
| **Runbook** | Keep [PAYMENT_CHANNELS_DEPLOYMENT.md](../deployment/PAYMENT_CHANNELS_DEPLOYMENT.md) updated with actual deployed addresses and any chain-specific steps. |
| **Incident response** | Document: how to pause (admin), how to unpause, how to replace admin (multisig), and when to use each. |
| **User-facing docs** | Explain challenge window and liveness (must respond or run watchtower before deadline). Link Connext (or other) for cross-chain from the Channels UI. |

---

## 6. Optional improvements (post-MVP)

- **ReentrancyGuard** on close/finalize paths.
- **ECDSA** (or equivalent) for signatures to avoid malleability and zero-address edge cases.
- **Events** for admin changes and challenge-window updates (already present).
- **Indexer** for “my channels” and filtering by participant (see WATCHTOWER_AND_INDEXER.md).
- **Watchtower** service for users who may be offline during disputes.

---

## 7. Deployment checklist (summary)

- [ ] Unit tests pass: `forge test --match-path test/channels/`
- [ ] E2E tests pass: `forge test --match-path test/e2e/PaymentChannelsE2E.t.sol` and `test/e2e/GenericStateChannelsE2E.t.sol`
- [ ] Admin set to multisig address
- [ ] Challenge window chosen and documented
- [ ] Deploy to testnet (or fork) and re-run e2e
- [ ] Deploy to target chain (Mainnet / Chain-138)
- [ ] Verify contract on block explorer
- [ ] Update frontend config with manager address(es)
- [ ] Document addresses and any chain-specific notes in deployment doc
