# DVM (DODO Vending Machine) Deployment Check — Chain 138 **Date:** 2026-04-02 ## Summary **Chain 138 now has a self-deployed official DODO V2 DVM stack, but it is not DODO-listed.** - DODO’s official contract list ([api.dodoex.io/dodo-contract/list?version=v1,v2](https://api.dodoex.io/dodo-contract/list?version=v1,v2)) includes chains such as **1** (Ethereum), **5** (Goerli), **10** (Optimism), **56** (BSC), **133** (Syscoin), **137** (Polygon), **8453** (Base), etc. - **Chain ID 138 is still not in that list**, so there is no DODO-published canonical DVM factory address for Chain 138. - This repo now operates a **self-deployed official DODO V2 DVM stack** on Chain 138: - **DVMFactory:** `0xc93870594C7f83A0aE076c2e30b494Efc526b68E` - **DVMFactoryAdapter / DODO_VENDING_MACHINE_ADDRESS:** `0xb6D9EF3575bc48De3f011C310DC24d87bEC6087C` - **DODOPMMIntegration:** `0x86ADA6Ef91A3B450F89f2b751e93B1b7A3218895` - **DODOPMMProvider:** `0x3f729632E9553EBacCdE2e9b4c8F2B285b014F2e` - **Stable pools (canonical corrected stack):** - `cUSDT/cUSDC`: `0x9e89bAe009adf128782E19e8341996c596ac40dC` - `cUSDT/USDT`: `0x866Cb44b59303d8dc5f4F9E3E7A8e8b0bf238d66` - `cUSDC/USDC`: `0xc39B7D0F40838cbFb54649d327f49a6DAC964062` ## Implications - **`DODO_VENDING_MACHINE_ADDRESS`** in `.env` must point to a Chain 138 factory adapter **you deploy or obtain**; it is not a DODO-listed public address. - The canonical Chain 138 PMM path is now the **official DODO V2 DVMFactoryAdapter** above, not the earlier mock DVM path. ## Options 0. **Use mock DVM (this repo, fallback only)** - A minimal `MockDVMFactory` (and `MockDVMPool`) is provided so PMM can run on Chain 138 without official DODO. Deploy with: - `forge script script/dex/DeployMockDVMFactory.s.sol:DeployMockDVMFactory --rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY" --legacy` - Set `DODO_VENDING_MACHINE_ADDRESS` in `.env` to the deployed address, then run `scripts/deployment/run-pmm-and-pools.sh`. Pools created are mocks (no real AMM); swap views return stubs. - **Do not treat this as canonical anymore** unless you are intentionally testing without the official DVM stack. 1. **Deploy official DODO DVM on Chain 138 (this repo)** - Submodule **lib/dodo-contractV2** (DODOEX/contractV2) is used to deploy the official DVM stack via Truffle. Our **DVMFactoryAdapter** wraps `createDODOVendingMachine` as `createDVM` so `DODOPMMIntegration` works unchanged. - The repo deployment helper now runs the vendored DODO tree in a **DVM-only compile mode** by temporarily hiding unrelated Solidity `0.8.x` contracts during `truffle compile` / `truffle migrate`, then restoring them on exit. That allows the official DVM `0.6.9` stack to compile without forking the upstream repo. - **One-shot:** `scripts/deployment/deploy-official-dvm-chain138.sh` - To verify compile before broadcast: `scripts/deployment/deploy-official-dvm-chain138.sh --compile-only` - Requires `lib/dodo-contractV2` deps: `cd lib/dodo-contractV2 && npm install` (if npm hits a registry/cert error, use `npm install --registry https://registry.npmjs.org/ --no-package-lock`). - **Manual:** 1) In `lib/dodo-contractV2`: set `privKey` and `RPC_URL_138` (e.g. from parent `.env`), then `npx truffle migrate -f 1 --to 1 --network chain138` and `npx truffle migrate -f 9 --to 9 --network chain138`. 2) Set `DODO_DVM_FACTORY` to the deployed DVMFactory address, then from repo root: `forge script script/dex/DeployDVMFactoryAdapter.s.sol:DeployDVMFactoryAdapter --rpc-url "$RPC_URL_138" --broadcast --private-key "$PRIVATE_KEY" --legacy` 3) Set `DODO_VENDING_MACHINE_ADDRESS` in `.env` to the **DVMFactoryAdapter** address (not the DVMFactory address). - Then run `scripts/deployment/run-pmm-and-pools.sh` (you may need to re-deploy DODOPMMIntegration if it was previously deployed with the mock DVM). - **Current live Chain 138 result:** the repo has already deployed this path and currently uses the addresses listed in the Summary section above. - **Stable-pair calibration note:** for equal-reserve stable pairs on the official DODO V2 DVM stack, the current canonical Chain 138 pools use `i = 1e18`, `k = 0`, `lpFeeRate = 10 bps`, `isOpenTWAP = false`. Earlier `k = 0.5e18` pools were removed because they priced above parity. 2. **Deploy DVM factory yourself from DODO source (outside this repo)** - DODO’s contracts are open source: [DODOEX GitHub](https://github.com/DODOEX) (contractV2). - Deploy **DVMFactory** (and dependencies) to Chain 138, then deploy our **DVMFactoryAdapter** pointing at that factory, set `DODO_VENDING_MACHINE_ADDRESS` to the adapter, and run `run-pmm-and-pools.sh`. 3. **Use an existing DVM factory on Chain 138 (if any)** - If someone else has already deployed a DODO-compatible DVM factory on Chain 138, set `DODO_VENDING_MACHINE_ADDRESS` to that address. - We are not aware of any public deployment; you would need to confirm with your network or chain operator. 4. **Leave PMM disabled on Chain 138** - Keep `DODO_VENDING_MACHINE_ADDRESS` unset. - `ensure-prerequisites.sh` will continue to warn; `run-pmm-and-pools.sh` will exit until the variable is set. ## Reference - DODO V1/V2 addresses: [docs.dodoex.io — Contract Addresses](https://docs.dodoex.io/en/developer/contracts/dodo-v1-v2/contracts-address) - DVM product overview: [DODO Vending Machine](https://docs.dodoex.io/en/product/dodo-v2-pools/dodo-vending-machine) - This repo: `DODOPMMIntegration.sol` uses `IDODOVendingMachine.createDVM(...)`; the factory must implement that interface.