Files
smom-dbis-138/script/liquidity/ImportProviderPoolsToIntegration.s.sol
defiQUG 2a4753eb2d feat: restore operator WIP — PMM JSON sync entrypoint, dotenv RPC trim + secrets, pool env alignment
- 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
2026-03-27 19:02:30 -07:00

136 lines
6.2 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import {Script, stdJson, console} from "forge-std/Script.sol";
import {DODOPMMIntegration} from "../../contracts/dex/DODOPMMIntegration.sol";
import {DODOPMMProvider} from "../../contracts/liquidity/providers/DODOPMMProvider.sol";
/**
* @title ImportProviderPoolsToIntegration
* @notice Import provider-known pools into DODOPMMIntegration using the desired-state JSON.
* @dev This is the migration path for stale provider-only pools that already exist as DODO pool
* contracts but are missing from integration.pools / allPools / poolConfigs.
*
* Required env:
* - PRIVATE_KEY
* - DODO_PMM_INTEGRATION_ADDRESS (or DODO_PMM_INTEGRATION)
* - DODO_PMM_PROVIDER_ADDRESS (or DODO_PMM_PROVIDER) for target provider compatibility
*
* Optional env:
* - DODO_PMM_PROVIDER_SOURCE_ADDRESS (or DODO_PMM_PROVIDER_SOURCE) to read from an existing provider
* - POOL_CONFIG_JSON (defaults to smom-dbis-138/config/chain138-pmm-pools.json)
* - LP_FEE_RATE / INITIAL_PRICE / K_FACTOR / ENABLE_TWAP to override JSON defaults
*/
contract ImportProviderPoolsToIntegration is Script {
using stdJson for string;
string internal constant DEFAULT_CONFIG_PATH = "config/chain138-pmm-pools.json";
function run() external {
uint256 pk = vm.envUint("PRIVATE_KEY");
address integrationAddr = vm.envAddress("DODO_PMM_INTEGRATION_ADDRESS");
if (integrationAddr == address(0)) integrationAddr = vm.envAddress("DODO_PMM_INTEGRATION");
address providerAddr = vm.envAddress("DODO_PMM_PROVIDER_ADDRESS");
if (providerAddr == address(0)) providerAddr = vm.envAddress("DODO_PMM_PROVIDER");
address providerSourceAddr = vm.envOr("DODO_PMM_PROVIDER_SOURCE_ADDRESS", address(0));
if (providerSourceAddr == address(0)) providerSourceAddr = vm.envOr("DODO_PMM_PROVIDER_SOURCE", address(0));
if (providerSourceAddr == address(0)) providerSourceAddr = providerAddr;
require(integrationAddr != address(0), "DODO_PMM_INTEGRATION_ADDRESS not set");
require(providerAddr != address(0), "DODO_PMM_PROVIDER_ADDRESS not set");
string memory path = vm.envOr("POOL_CONFIG_JSON", string(DEFAULT_CONFIG_PATH));
string memory json = vm.readFile(path);
DODOPMMIntegration integration = DODOPMMIntegration(integrationAddr);
DODOPMMProvider providerSource = DODOPMMProvider(providerSourceAddr);
uint256 lpFeeRate = vm.envOr("LP_FEE_RATE", json.readUint(".defaults.lpFeeRate"));
uint256 initialPrice = vm.envOr("INITIAL_PRICE", json.readUint(".defaults.initialPrice"));
uint256 kFactor = vm.envOr("K_FACTOR", json.readUint(".defaults.kFactor"));
bool enableTwap = vm.envOr("ENABLE_TWAP", json.readBool(".defaults.enableTwap"));
string[] memory cStars = json.readStringArray(".groups.cStarSymbols");
string[] memory officials = json.readStringArray(".groups.officialStableSymbols");
string memory wethSymbol = json.readString(".groups.wethSymbol");
bool deployCStarVsCStar = json.readBool(".groups.deploy.cStarVsCStar");
bool deployCStarVsOfficial = json.readBool(".groups.deploy.cStarVsOfficial");
bool deployCStarVsWeth = json.readBool(".groups.deploy.cStarVsWeth");
bool deployOfficialVsWeth = json.readBool(".groups.deploy.officialVsWeth");
vm.startBroadcast(pk);
if (deployCStarVsCStar) {
for (uint256 i = 0; i < cStars.length; i++) {
for (uint256 j = i + 1; j < cStars.length; j++) {
_importIfNeeded(json, providerSource, integration, cStars[i], cStars[j], lpFeeRate, initialPrice, kFactor, enableTwap);
}
}
}
if (deployCStarVsOfficial) {
for (uint256 i = 0; i < cStars.length; i++) {
for (uint256 j = 0; j < officials.length; j++) {
_importIfNeeded(json, providerSource, integration, cStars[i], officials[j], lpFeeRate, initialPrice, kFactor, enableTwap);
}
}
}
if (deployCStarVsWeth) {
for (uint256 i = 0; i < cStars.length; i++) {
_importIfNeeded(json, providerSource, integration, cStars[i], wethSymbol, lpFeeRate, initialPrice, kFactor, enableTwap);
}
}
if (deployOfficialVsWeth) {
for (uint256 i = 0; i < officials.length; i++) {
_importIfNeeded(json, providerSource, integration, officials[i], wethSymbol, lpFeeRate, initialPrice, kFactor, enableTwap);
}
}
for (uint256 i = 0; json.keyExists(string.concat(".explicitPairs[", vm.toString(i), "]")); i++) {
string memory baseKey = string.concat(".explicitPairs[", vm.toString(i), "].baseSymbol");
string memory quoteKey = string.concat(".explicitPairs[", vm.toString(i), "].quoteSymbol");
string memory explicitBase = json.readString(baseKey);
string memory explicitQuote = json.readString(quoteKey);
_importIfNeeded(json, providerSource, integration, explicitBase, explicitQuote, lpFeeRate, initialPrice, kFactor, enableTwap);
}
vm.stopBroadcast();
}
function _importIfNeeded(
string memory json,
DODOPMMProvider provider,
DODOPMMIntegration integration,
string memory baseSymbol,
string memory quoteSymbol,
uint256 lpFeeRate,
uint256 initialPrice,
uint256 kFactor,
bool enableTwap
) internal {
address base = json.readAddress(string.concat(".tokens.", baseSymbol));
address quote = json.readAddress(string.concat(".tokens.", quoteSymbol));
if (base == address(0) || quote == address(0) || base == quote) return;
address integrationPool = integration.pools(base, quote);
if (integrationPool != address(0)) return;
address providerPool = provider.pools(base, quote);
if (providerPool == address(0)) return;
integration.importExistingPool(
providerPool,
base,
quote,
lpFeeRate,
initialPrice,
kFactor,
enableTwap
);
console.log("Imported:", baseSymbol, "/", quoteSymbol);
console.log("Pool:", providerPool);
}
}