| `ORACLE_PRICE_FEED` | **OraclePriceFeed** wired to **PriceFeedKeeper** and **ReserveSystem** — not the same as `ORACLE_PROXY_ADDRESS`. |
| `CHAIN138_WETH_MOCK_PRICE_FEED` | Optional **MockPriceFeed** for WETH on the keeper path when Besu block time lags the public aggregator `updatedAt`. Sync: `scripts/reserve/sync-weth-mock-price.sh`. |
ReserveSystem receives prices from OraclePriceFeed. Ensure assets used by PMM pairs (e.g. cUSDT, cUSDC, USDT, USDC) have aggregators set in OraclePriceFeed and are updated on schedule.
See: [PRICE_FEED_SETUP.md](PRICE_FEED_SETUP.md).
2.**Keeper (on-chain / off-chain)**
- **PriceFeedKeeper** and scripts: `script/reserve/DeployKeeper.s.sol`, `scripts/reserve/keeper-service.js`, `scripts/reserve/keeper-service.sh`.
**CoinGecko Demo keys** (`CG-…`): use `https://api.coingecko.com` with header `x-cg-demo-api-key` (not `pro-api.coingecko.com` with `x-cg-pro-api-key`). Paid Pro uses the pro host and pro header; the script tries demo first, then pro, then unauthenticated public.
**Policy:** Run off-chain ticks every **6 seconds** so oracle pushes, `PriceFeedKeeper` upkeep, and PMM/WETH read paths stay warm—supporting peg alignment with `DODOPMMIntegration` / optional `ReserveSystem`.
| `PriceFeedKeeper.updateInterval` | Default on **new** deployments is **6s** (`PriceFeedKeeper.sol`). **Existing** keepers: run `scripts/reserve/set-price-feed-keeper-interval.sh 6` as admin. |
| `KEEPER_PRIVATE_KEY` | Wallet with **KEEPER_ROLE** on `PriceFeedKeeper` for `performUpkeep` txs. |
| `MESH_WETH_WRAP_WEI` | Optional tiny `WETH.deposit{value}` on a throttled cadence (`MESH_WETH_WRAP_EVERY_N`); costs gas—default **0** (off). |
3.`./scripts/reserve/set-price-feed-keeper-interval.sh 6` once if the keeper still used a 30s interval.
4. Oracle: `scripts/update-oracle-price.sh` needs Besu-safe paths (eth_call + explicit `--gas-limit`); set `AGGREGATOR_ADDRESS` / transmitter as deployed.
5. If the keeper uses a **WETH MockPriceFeed** (`CHAIN138_WETH_MOCK_PRICE_FEED`), run `scripts/reserve/sync-weth-mock-price.sh` on a schedule (or from the same cron as the mesh) so ReserveSystem WETH tracks the market.
**Note:** On-chain PMM curves still move on **swaps**; this loop **does not** replace liquidity. It **feeds** oracles/keeper and **observes** PMM/WETH state on a fixed cadence.
- **DODOPMMIntegration**: Optional `setReserveSystem(address)`; **`getPoolPriceOrOracle`** uses ReserveSystem **`getPrice`** (quote per base) when both asset feeds exist. On live Chain 138, **`ReserveConversionPriceAdapter`** (`0xA740EFF8C1339ea46833A6A968F24f3183a503C4`) is wired on Stack A — deploy with **`FOUNDRY_PROFILE=chain138`** (Paris EVM). See [CHAIN138_PRICING_FEEDS_LIVE.md](../../../docs/04-configuration/CHAIN138_PRICING_FEEDS_LIVE.md).
- **Official USDT/USDC** must be wired on **OraclePriceFeed** (`RefreshChain138UsdFeedsAndWireUsdc.s.sol`) so WETH/USDT and WETH/USDC oracle paths do not fall back to DVM **`getMidPrice()`** (~$1).
- **Token-aggregation**: Set `CHAIN_138_DODO_PMM_INTEGRATION=0x86ADA6Ef91A3B450F89f2b751e93B1b7A3218895` so the pool indexer ingests PMM pools; report API then includes them in `/report/all`, `/report/coingecko`, `/report/cross-chain`.
Validate keeper deploy wiring without broadcasting transactions or mutating `.env`.
```bash
cd smom-dbis-138
DRY_RUN=1 bash scripts/reserve/deploy-all.sh
# or
bash scripts/reserve/deploy-all.sh --dry-run
```
Dry-run behavior:
- Prints each deployment step and the `PRICE_FEED_KEEPER_ADDRESS` read from `.env` (must match `0xD3AD6831aacB5386B8A25BB8D8176a6C8a026f04` for Chain 138).
- Skips `forge script``--broadcast` / `--verify` and does not append addresses to `.env`.
- When `DEPLOY_CHAINLINK=true` or `DEPLOY_GELATO=true`, prints the optional Chainlink/Gelato forge commands and follow-up setup scripts that would run.
Live deploy (no `DRY_RUN`): same script without dry-run flags; requires `PRIVATE_KEY` and uses `RPC_URL_138` (default `https://rpc.d-bis.org`).