- Resolve stash: merge load_deployment_env path with secure-secrets and CR/LF RPC strip - create-pmm-full-mesh-chain138.sh delegates to sync-chain138-pmm-pools-from-json.sh - env.additions.example: canonical PMM pool defaults (cUSDT/USDT per crosscheck) - Include Chain138 scripts, official mirror deploy scaffolding, and prior staged changes Made-with: Cursor
5.5 KiB
Chain 138 Oracle and Keeper Reference
Purpose: ORACLE_AGGREGATOR / ORACLE_PROXY for Chain 138 and keeper/price-update flows so PMM and reporting stay aligned with oracle data.
Environment Variables (Chain 138)
Set in project .env (and in token-aggregation or relay when they consume oracle):
| Variable | Description |
|---|---|
ORACLE_AGGREGATOR_ADDRESS |
Oracle aggregator contract on Chain 138 (e.g. from deployment). Used by CCIP and other consumers. |
ORACLE_PROXY_ADDRESS |
Oracle proxy contract on Chain 138 when applicable. |
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. |
RESERVE_SYSTEM |
ReserveSystem address (Chain 138). Required for DODOPMMIntegration oracle-backed mid price. |
RPC_URL_138 / RPC_URL |
RPC endpoint for Chain 138 (keeper and scripts). |
References: DEPLOYMENT_COMPLETE_GUIDE.md, DEPLOYMENT_CHECKLIST.md, PARALLEL_COMPLETION_TASK_LIST.md.
Keeper and Price Feed Updates
-
OraclePriceFeed → ReserveSystem
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. -
Keeper (on-chain / off-chain)
- PriceFeedKeeper and scripts:
script/reserve/DeployKeeper.s.sol,scripts/reserve/keeper-service.js,scripts/reserve/keeper-service.sh. - Check/perform upkeep:
PerformUpkeep.s.sol,CheckUpkeep.s.sol.
See: KEEPER_COMPLETE.md, KEEPER_SETUP.md (if present).
- PriceFeedKeeper and scripts:
-
Oracle publisher (off-chain)
Service that pushes external prices (e.g. CoinGecko) into the system:services/oracle-publisher/(e.g.oracle_publisher.py,oracle_publisher_optimized.py).
Use for assets that do not have a Chainlink-style aggregator on Chain 138.
-
Update oracle price script
One-off or cron-driven update of oracle/oracle proxy with current price:scripts/update-oracle-price.sh— usage:[rpc-url] [oracle-address] [private-key]; usesAGGREGATOR_ADDRESSand fetches ETH/USD from CoinGecko.
CoinGecko Demo keys (CG-…): usehttps://api.coingecko.comwith headerx-cg-demo-api-key(notpro-api.coingecko.comwithx-cg-pro-api-key). Paid Pro uses the pro host and pro header; the script tries demo first, then pro, then unauthenticated public.
Schedule this (or the keeper service) so PMM oracle-backed prices and reporting stay fresh.
PMM mesh automation (6-second tick)
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.
| Component | Role |
|---|---|
scripts/reserve/pmm-mesh-6s-automation.sh |
Loop: getPoolPriceOrOracle on PMM_MESH_POLL_POOLS, WETH9/WETH10 totalSupply reads, conditional performUpkeep, update-oracle-price.sh. |
PMM_MESH_INTERVAL_SEC |
Default 6. |
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). |
systemd: config/systemd/chain138-pmm-mesh-automation.service.example in the Proxmox repo—copy, fix paths, enable --now.
Bring-up checklist (operator):
PRICE_FEED_KEEPER_ADDRESSinsmom-dbis-138/.env(Chain 138:0xD3AD6831aacB5386B8A25BB8D8176a6C8a026f04per explorer docs—verify live).KEEPER_PRIVATE_KEYoptional if same asPRIVATE_KEY(must haveKEEPER_ROLEon the keeper)../scripts/reserve/set-price-feed-keeper-interval.sh 6once if the keeper still used a 30s interval.- Oracle:
scripts/update-oracle-price.shneeds Besu-safe paths (eth_call + explicit--gas-limit); setAGGREGATOR_ADDRESS/ transmitter as deployed. - If the keeper uses a WETH MockPriceFeed (
CHAIN138_WETH_MOCK_PRICE_FEED), runscripts/reserve/sync-weth-mock-price.shon a schedule (or from the same cron as the mesh) so ReserveSystem WETH tracks the market. - Start:
nohup ./scripts/reserve/pmm-mesh-6s-automation.sh >> logs/pmm-mesh-automation.log 2>&1 &(optional:MESH_CAST_GAS_PRICE=2gweifor Besu)
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.
PMM and Reporting
- DODOPMMIntegration: Optional
setReserveSystem(ReserveSystem); thengetPoolPriceOrOracle(pool)uses ReserveSystem when base/quote are registered. - Token-aggregation: Set
CHAIN_138_DODO_PMM_INTEGRATIONso the pool indexer ingests PMM pools; report API then includes them in/report/all,/report/coingecko,/report/cross-chain.
See: DODO_PMM_INTEGRATION.md.