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
This commit is contained in:
defiQUG
2026-03-27 19:02:30 -07:00
parent c6e7bad15e
commit 2a4753eb2d
200 changed files with 5987 additions and 913 deletions
+58
View File
@@ -0,0 +1,58 @@
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"description": "Desired-state pool spec for Chain 138 DODO PMM. Scripts should create and register only missing pools from this file, not redeploy contracts.",
"version": "1.0.0",
"updated": "2026-03-26",
"chainId": 138,
"defaults": {
"lpFeeRate": 3,
"initialPrice": "1000000000000000000",
"kFactor": "500000000000000000",
"enableTwap": false
},
"tokens": {
"cUSDT": "0x93E66202A11B1772E55407B32B44e5Cd8eda7f22",
"cUSDC": "0xf22258f57794CC8E06237084b353Ab30fFfa640b",
"cEURC": "0x8085961F9cF02b4d800A3c6d386D31da4B34266a",
"cEURT": "0xdf4b71c61E5912712C1Bdd451416B9aC26949d72",
"cGBPC": "0x003960f16D9d34F2e98d62723B6721Fb92074aD2",
"cGBPT": "0x350f54e4D23795f86A9c03988c7135357CCaD97c",
"cAUDC": "0xD51482e567c03899eecE3CAe8a058161FD56069D",
"cJPYC": "0xEe269e1226a334182aace90056EE4ee5Cc8A6770",
"cCHFC": "0x873990849DDa5117d7C644f0aF24370797C03885",
"cCADC": "0x54dBd40cF05e15906A2C21f600937e96787f5679",
"cXAUC": "0x290E52a8819A4fbD0714E517225429aA2B70EC6b",
"cXAUT": "0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E",
"USDT": "0x004b63A7B5b0E06f6bB6adb4a5F9f590BF3182D1",
"USDC": "0x71D6687F38b93CCad569Fa6352c876eea967201b",
"WETH": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
},
"groups": {
"cStarSymbols": [
"cUSDT",
"cUSDC",
"cEURC",
"cEURT",
"cGBPC",
"cGBPT",
"cAUDC",
"cJPYC",
"cCHFC",
"cCADC",
"cXAUC",
"cXAUT"
],
"officialStableSymbols": [
"USDT",
"USDC"
],
"wethSymbol": "WETH",
"deploy": {
"cStarVsCStar": true,
"cStarVsOfficial": true,
"cStarVsWeth": true,
"officialVsWeth": true
}
},
"explicitPairs": []
}
File diff suppressed because one or more lines are too long
+3 -2
View File
File diff suppressed because one or more lines are too long
@@ -12,6 +12,7 @@ import "./interfaces/IAggregationRouter.sol";
import "./interfaces/IDodoexRouter.sol";
import "./interfaces/IBalancerVault.sol";
import "./interfaces/IWETH.sol";
import "../../liquidity/interfaces/ILiquidityProvider.sol";
/**
* @title EnhancedSwapRouter
@@ -67,6 +68,7 @@ contract EnhancedSwapRouter is AccessControl, ReentrancyGuard {
// Dodoex PMM pool addresses (tokenIn => tokenOut => PMM pool address)
mapping(address => mapping(address => address)) public dodoPoolAddresses;
address public dodoLiquidityProvider;
/// @dev Uniswap V3 Quoter for on-chain quotes; set via setUniswapQuoter when deployed on 138/651940
address public uniswapQuoter;
@@ -91,6 +93,7 @@ contract EnhancedSwapRouter is AccessControl, ReentrancyGuard {
error ProviderDisabled();
error InsufficientOutput();
error InvalidRoutingConfig();
error DodoRouteNotConfigured();
/**
* @notice Constructor
@@ -324,6 +327,15 @@ contract EnhancedSwapRouter is AccessControl, ReentrancyGuard {
dodoPoolAddresses[tokenIn][tokenOut] = poolAddress;
}
/**
* @notice Set DODO liquidity provider implementation for environments that execute
* swaps via a local provider/integration instead of an external Dodoex router.
* @param provider Address of ILiquidityProvider-compatible contract
*/
function setDodoLiquidityProvider(address provider) external onlyRole(ROUTING_MANAGER_ROLE) {
dodoLiquidityProvider = provider;
}
/**
* @notice Set Uniswap V3 Quoter address for on-chain quotes
* @param _quoter Quoter contract address (address(0) to use 0.5% slippage estimate)
@@ -349,9 +361,23 @@ contract EnhancedSwapRouter is AccessControl, ReentrancyGuard {
if (amountIn == 0) revert ZeroAmount();
if (tokenIn == address(0) || tokenOut == address(0)) revert ZeroAddress();
address pool = dodoPoolAddresses[tokenIn][tokenOut];
require(pool != address(0), "EnhancedSwapRouter: Dodoex pool not configured");
if (!_hasDodoRoute(tokenIn, tokenOut, pool)) revert DodoRouteNotConfigured();
IERC20(tokenIn).safeTransferFrom(msg.sender, address(this), amountIn);
if (dodoLiquidityProvider != address(0)) {
IERC20(tokenIn).approve(dodoLiquidityProvider, amountIn);
amountOut = ILiquidityProvider(dodoLiquidityProvider).executeSwap(
tokenIn,
tokenOut,
amountIn,
amountOutMin
);
require(amountOut >= amountOutMin, "EnhancedSwapRouter: insufficient output");
IERC20(tokenOut).safeTransfer(msg.sender, amountOut);
return amountOut;
}
IERC20(tokenIn).approve(dodoexRouter, amountIn);
address[] memory dodoPairs = new address[](1);
@@ -476,7 +502,18 @@ contract EnhancedSwapRouter is AccessControl, ReentrancyGuard {
uint256 amountOutMin
) internal returns (uint256) {
address pool = dodoPoolAddresses[weth][stablecoinToken];
require(pool != address(0), "EnhancedSwapRouter: Dodoex pool not configured");
if (!_hasDodoRoute(weth, stablecoinToken, pool)) revert DodoRouteNotConfigured();
if (dodoLiquidityProvider != address(0)) {
IERC20 wethTokenViaProvider = IERC20(weth);
wethTokenViaProvider.approve(dodoLiquidityProvider, amountIn);
return ILiquidityProvider(dodoLiquidityProvider).executeSwap(
weth,
stablecoinToken,
amountIn,
amountOutMin
);
}
IERC20 wethToken = IERC20(weth);
wethToken.approve(dodoexRouter, amountIn);
@@ -605,9 +642,30 @@ contract EnhancedSwapRouter is AccessControl, ReentrancyGuard {
address stablecoinToken,
uint256 amountIn
) external view returns (uint256) {
if (dodoLiquidityProvider != address(0)) {
if (!ILiquidityProvider(dodoLiquidityProvider).supportsTokenPair(weth, stablecoinToken)) {
return 0;
}
(uint256 amountOut,) = ILiquidityProvider(dodoLiquidityProvider).getQuote(weth, stablecoinToken, amountIn);
return amountOut;
}
if (dodoPoolAddresses[weth][stablecoinToken] == address(0)) {
return 0;
}
return IDodoexRouter(dodoexRouter).getDodoSwapQuote(weth, stablecoinToken, amountIn);
}
function _hasDodoRoute(
address tokenIn,
address tokenOut,
address configuredPool
) internal view returns (bool) {
if (dodoLiquidityProvider != address(0)) {
return ILiquidityProvider(dodoLiquidityProvider).supportsTokenPair(tokenIn, tokenOut);
}
return configuredPool != address(0);
}
/**
* @notice Get Balancer quote (view)
* When poolId configured, would query Balancer. Otherwise estimate for stablecoins.
@@ -686,4 +744,3 @@ contract EnhancedSwapRouter is AccessControl, ReentrancyGuard {
// Allow contract to receive ETH
receive() external payable {}
}
+71 -62
View File
@@ -110,6 +110,12 @@ contract DODOPMMIntegration is AccessControl, ReentrancyGuard {
);
event PoolRemoved(address indexed pool);
event ReserveSystemSet(address indexed reserveSystem);
event PoolImported(
address indexed pool,
address indexed baseToken,
address indexed quoteToken,
address importer
);
constructor(
address admin,
@@ -164,22 +170,7 @@ contract DODOPMMIntegration is AccessControl, ReentrancyGuard {
isOpenTWAP // Enable TWAP
);
// Register pool
pools[compliantUSDT][officialUSDT] = pool;
pools[officialUSDT][compliantUSDT] = pool;
isRegisteredPool[pool] = true;
allPools.push(pool);
poolConfigs[pool] = PoolConfig({
pool: pool,
baseToken: compliantUSDT,
quoteToken: officialUSDT,
lpFeeRate: lpFeeRate,
i: initialPrice,
k: k,
isOpenTWAP: isOpenTWAP,
createdAt: block.timestamp
});
_recordPool(pool, compliantUSDT, officialUSDT, lpFeeRate, initialPrice, k, isOpenTWAP);
emit PoolCreated(pool, compliantUSDT, officialUSDT, msg.sender);
}
@@ -208,21 +199,7 @@ contract DODOPMMIntegration is AccessControl, ReentrancyGuard {
isOpenTWAP
);
pools[compliantUSDC][officialUSDC] = pool;
pools[officialUSDC][compliantUSDC] = pool;
isRegisteredPool[pool] = true;
allPools.push(pool);
poolConfigs[pool] = PoolConfig({
pool: pool,
baseToken: compliantUSDC,
quoteToken: officialUSDC,
lpFeeRate: lpFeeRate,
i: initialPrice,
k: k,
isOpenTWAP: isOpenTWAP,
createdAt: block.timestamp
});
_recordPool(pool, compliantUSDC, officialUSDC, lpFeeRate, initialPrice, k, isOpenTWAP);
emit PoolCreated(pool, compliantUSDC, officialUSDC, msg.sender);
}
@@ -251,21 +228,7 @@ contract DODOPMMIntegration is AccessControl, ReentrancyGuard {
isOpenTWAP
);
pools[compliantUSDT][compliantUSDC] = pool;
pools[compliantUSDC][compliantUSDT] = pool;
isRegisteredPool[pool] = true;
allPools.push(pool);
poolConfigs[pool] = PoolConfig({
pool: pool,
baseToken: compliantUSDT,
quoteToken: compliantUSDC,
lpFeeRate: lpFeeRate,
i: initialPrice,
k: k,
isOpenTWAP: isOpenTWAP,
createdAt: block.timestamp
});
_recordPool(pool, compliantUSDT, compliantUSDC, lpFeeRate, initialPrice, k, isOpenTWAP);
emit PoolCreated(pool, compliantUSDT, compliantUSDC, msg.sender);
}
@@ -301,25 +264,46 @@ contract DODOPMMIntegration is AccessControl, ReentrancyGuard {
isOpenTWAP
);
pools[baseToken][quoteToken] = pool;
pools[quoteToken][baseToken] = pool;
isRegisteredPool[pool] = true;
allPools.push(pool);
poolConfigs[pool] = PoolConfig({
pool: pool,
baseToken: baseToken,
quoteToken: quoteToken,
lpFeeRate: lpFeeRate,
i: initialPrice,
k: k,
isOpenTWAP: isOpenTWAP,
createdAt: block.timestamp
});
_recordPool(pool, baseToken, quoteToken, lpFeeRate, initialPrice, k, isOpenTWAP);
emit PoolCreated(pool, baseToken, quoteToken, msg.sender);
}
/**
* @notice Import an already-deployed DODO PMM pool into integration state.
* @dev Use this when the pool exists at the DODO/provider layer but was not
* recorded in the integration mappings or allPools inventory.
*/
function importExistingPool(
address pool,
address baseToken,
address quoteToken,
uint256 lpFeeRate,
uint256 initialPrice,
uint256 k,
bool isOpenTWAP
) external onlyRole(POOL_MANAGER_ROLE) {
require(pool != address(0), "DODOPMMIntegration: zero pool");
require(baseToken != address(0), "DODOPMMIntegration: zero base");
require(quoteToken != address(0), "DODOPMMIntegration: zero quote");
require(baseToken != quoteToken, "DODOPMMIntegration: same token");
require(pools[baseToken][quoteToken] == address(0), "DODOPMMIntegration: pair already recorded");
require(!isRegisteredPool[pool], "DODOPMMIntegration: pool already registered");
address actualBase = IDODOPMMPool(pool)._BASE_TOKEN_();
address actualQuote = IDODOPMMPool(pool)._QUOTE_TOKEN_();
bool matchesForward = actualBase == baseToken && actualQuote == quoteToken;
bool matchesReverse = actualBase == quoteToken && actualQuote == baseToken;
require(matchesForward || matchesReverse, "DODOPMMIntegration: pool token mismatch");
if (matchesReverse) {
(baseToken, quoteToken) = (quoteToken, baseToken);
}
_recordPool(pool, baseToken, quoteToken, lpFeeRate, initialPrice, k, isOpenTWAP);
emit PoolImported(pool, baseToken, quoteToken, msg.sender);
}
/**
* @notice Add liquidity to a DODO PMM pool
* @param pool Pool address
@@ -595,5 +579,30 @@ contract DODOPMMIntegration is AccessControl, ReentrancyGuard {
emit PoolRemoved(pool);
}
}
function _recordPool(
address pool,
address baseToken,
address quoteToken,
uint256 lpFeeRate,
uint256 initialPrice,
uint256 k,
bool isOpenTWAP
) internal {
pools[baseToken][quoteToken] = pool;
pools[quoteToken][baseToken] = pool;
isRegisteredPool[pool] = true;
allPools.push(pool);
poolConfigs[pool] = PoolConfig({
pool: pool,
baseToken: baseToken,
quoteToken: quoteToken,
lpFeeRate: lpFeeRate,
i: initialPrice,
k: k,
isOpenTWAP: isOpenTWAP,
createdAt: block.timestamp
});
}
}
+2 -2
View File
@@ -20,8 +20,8 @@ contract PriceFeedKeeper is AccessControl, ReentrancyGuard {
address[] public trackedAssets;
mapping(address => bool) public isTracked;
// Update configuration
uint256 public updateInterval = 30; // seconds
// Update configuration (default 6s aligns with PMM mesh automation; admin may set via setUpdateInterval)
uint256 public updateInterval = 6; // seconds
mapping(address => uint256) public lastUpdateTime;
// Keeper configuration
+6
View File
@@ -11,6 +11,12 @@ import "../compliance/LegallyCompliantBase.sol";
* @notice Generic ISO-4217 compliant fiat/commodity token (ERC-20, DEX-ready)
* @dev Use for cEURC, cGBPC, cAUDC, cJPYC, cCHFC, cCADC, cXAUC, cXAUT, etc.
* Full ERC-20 for DEX liquidity pools; inherits LegallyCompliantBase.
*
* XAU (gold) invariant — enforced by policy and integrators, not by ERC-20 math:
* When `currencyCode()` is `"XAU"` (e.g. cXAUC, cXAUT), **one full token** means
* **exactly one troy ounce** of fine gold: balances and `mint`/`transfer` amounts use
* `10 ** decimals()` base units per troy ounce (with 6 decimals, `1_000_000` base = 1 oz).
* Fiat codes (USD, EUR, …) use one full token as one unit of that currency at `decimals`.
*/
contract CompliantFiatToken is ERC20, Pausable, Ownable, LegallyCompliantBase {
bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
@@ -0,0 +1,40 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
/**
* @title OfficialStableMirrorToken
* @notice Lightweight ERC-20 used as the local Chain 138 "official" stable mirror.
* @dev This token exists only to provide a live ERC-20 quote-side asset for local PMM pools.
* It is intentionally separate from the compliant token contracts.
*/
contract OfficialStableMirrorToken is ERC20, Ownable {
uint8 private immutable _decimalsStorage;
constructor(
string memory name_,
string memory symbol_,
uint8 decimals_,
address initialOwner,
uint256 initialSupply
) ERC20(name_, symbol_) Ownable(initialOwner) {
_decimalsStorage = decimals_;
if (initialSupply > 0) {
_mint(msg.sender, initialSupply);
}
}
function decimals() public view override returns (uint8) {
return _decimalsStorage;
}
function mint(address to, uint256 amount) external onlyOwner {
_mint(to, amount);
}
function burn(address from, uint256 amount) external onlyOwner {
_burn(from, amount);
}
}
@@ -157,7 +157,9 @@ forge script script/dex/DeployPrivatePoolRegistryAndPools.s.sol:DeployPrivatePoo
### PMM (Chain 138) completion checklist
1. Set **DODO_VENDING_MACHINE_ADDRESS** in `.env` to the DODO DVM factory address on Chain 138. **Chain 138 is not in DODOs official list** — see [DVM_DEPLOYMENT_CHECK.md](DVM_DEPLOYMENT_CHECK.md). Deploy the factory yourself from [DODOEX](https://github.com/DODOEX) or use an existing deployment if available.
2. Set **OFFICIAL_USDT_ADDRESS** and **OFFICIAL_USDC_ADDRESS** to the official or wrapped USDT/USDC token addresses on Chain 138 (already in .env as reference; replace with Chain 138 addresses if different).
2. Set **OFFICIAL_USDT_ADDRESS** and **OFFICIAL_USDC_ADDRESS** to the live Chain 138 quote-side mirror stables:
- `OFFICIAL_USDT_ADDRESS=0x004b63A7B5b0E06f6bB6adb4a5F9f590BF3182D1`
- `OFFICIAL_USDC_ADDRESS=0x71D6687F38b93CCad569Fa6352c876eea967201b`
3. Run: `bash scripts/deployment/deploy-all-mainnets-with-mapper-oracle-pmm.sh pmm` to deploy DODOPMMIntegration.
4. Set **DODOPMM_INTEGRATION_ADDRESS** (or DODO_PMM_INTEGRATION) in .env from the deploy output, then create pools:
- cUSDT/USDT and cUSDC/USDC: call `createCUSDTUSDTPool` and `createCUSDCUSDCPool` on the integration (see `docs/integration/DODO_PMM_INTEGRATION.md`).
@@ -1,5 +1,7 @@
# Deployed Smart Contracts — Cross-Network Overview
> Historical note (2026-03-26): this overview includes superseded PMM stack references from earlier deployment phases. The current canonical Chain 138 PMM stack is `DODOPMMIntegration=0x5BDc62f1ae7D630c37A8B363a1d49845356Ee72d` and `DODOPMMProvider=0x5CAe6Ce155b7f08D3a956F5Dc82fC9945f29B381`.
**Last updated:** 2026-02-20
**Source:** `smom-dbis-138/.env` and deployment runbooks.
@@ -63,7 +65,7 @@ flowchart TB
| | CCIP Router | `0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817` | CCIP router (on 138) |
| | CCIPTxReporter | `0x3F88b662F04d9B1413BA8d65bFC229e830D7d077` | Report txs to mainnet logger |
| **PMM** | Mock DVM Factory | `0xB16c3D48A111714B1795E58341FeFDd643Ab01ab` | Create mock pools |
| | DODOPMMIntegration | `0x79cdbaFBaA0FdF9F55D26F360F54cddE5c743F7D` | cUSDT/cUSDC pools |
| | DODOPMMIntegration | `0x5BDc62f1ae7D630c37A8B363a1d49845356Ee72d` | Canonical corrected PMM integration |
| **Core eMoney** | Compliance Registry, Token Factory, Bridge Vault, Debt Registry, Policy Manager, Token Impl | (see .env) | Core system |
| **Channels** | Payment Channel Manager, Address Mapper, Mirror Manager | (see .env) | State channels |
| **Oracle** | Oracle Aggregator, Oracle Proxy | (see .env) | Price feeds |
+3 -1
View File
@@ -1,5 +1,7 @@
# Next Steps Completion Summary
> Historical note (2026-03-26): this completion summary preserves an earlier PMM deployment phase. The current canonical Chain 138 PMM stack is `DODOPMMIntegration=0x5BDc62f1ae7D630c37A8B363a1d49845356Ee72d` and `DODOPMMProvider=0x5CAe6Ce155b7f08D3a956F5Dc82fC9945f29B381`.
**Date:** 2026-02-20
This document summarizes what was completed in the "next steps" pass and what remains for the operator.
@@ -19,7 +21,7 @@ This document summarizes what was completed in the "next steps" pass and what re
| **Verify script** | Optional checks (CCIPTxReporter, genesis) are warnings; log_* fallbacks; safe unset-var handling. |
| **Hardhat / Forge** | @emoney/interfaces replaced with relative imports; Hardhat viaIR for 0.8.22; Forge build available. |
| **Docs** | WARNINGS_AND_OPTIONAL_TASKS.md, DVM_DEPLOYMENT_CHECK.md, ALL_MAINNETS_DEPLOYMENT_RUNBOOK (PMM step → DVM doc), TODO_TASK_LIST_MASTER §10b updated. |
| **PMM (Chain 138)** | Mock DVM: deployed `MockDVMFactory` at `0xB16c3D48A111714B1795E58341FeFDd643Ab01ab` and `DODOPMMIntegration` at `0x79cdbaFBaA0FdF9F55D26F360F54cddE5c743F7D`. `DODO_VENDING_MACHINE_ADDRESS` and `DODO_PMM_INTEGRATION` set in .env. `run-pmm-and-pools.sh` fixed (no longer rejects valid 0x… addresses). Pools are mock (see DVM_DEPLOYMENT_CHECK.md option 0). |
| **PMM (Chain 138)** | Earlier Mock DVM phase completed; current canonical PMM integration is `0x5BDc62f1ae7D630c37A8B363a1d49845356Ee72d` and supersedes the initial stack. `DODO_VENDING_MACHINE_ADDRESS` and `DODO_PMM_INTEGRATION` were set in .env during the first deployment phase. |
---
+1 -1
View File
@@ -43,7 +43,7 @@ Complete these **before** running the three operator task scripts.
- DODO does not list Chain 138; use your own deployment or an existing DVM if available.
- **.env:** Set:
- `DODO_VENDING_MACHINE_ADDRESS` — DVM factory on Chain 138.
- `OFFICIAL_USDT_ADDRESS`, `OFFICIAL_USDC_ADDRESS` — official or wrapped USDT/USDC on Chain 138 (already have placeholders).
- `OFFICIAL_USDT_ADDRESS=0x004b63A7B5b0E06f6bB6adb4a5F9f590BF3182D1`, `OFFICIAL_USDC_ADDRESS=0x71D6687F38b93CCad569Fa6352c876eea967201b` — live Chain 138 quote-side mirror stables for PMM pools.
- `COMPLIANT_USDT_ADDRESS`, `COMPLIANT_USDC_ADDRESS` — already set.
- **Script:** `scripts/deployment/run-pmm-and-pools.sh`.
@@ -122,8 +122,9 @@ This guide provides a complete implementation path for making CompliantUSDT (cUS
export DODO_VENDING_MACHINE_ADDRESS=0x...
export COMPLIANT_USDT_ADDRESS=0x...
export COMPLIANT_USDC_ADDRESS=0x...
export OFFICIAL_USDT_ADDRESS=0x...
export OFFICIAL_USDC_ADDRESS=0x...
# On Chain 138, use the live local quote-side mirror stables
export OFFICIAL_USDT_ADDRESS=0x004b63A7B5b0E06f6bB6adb4a5F9f590BF3182D1
export OFFICIAL_USDC_ADDRESS=0x71D6687F38b93CCad569Fa6352c876eea967201b
# Deploy
forge script script/dex/DeployDODOPMMIntegration.s.sol:DeployDODOPMMIntegration \
@@ -383,4 +384,3 @@ For issues or questions:
2. Check troubleshooting section
3. Review contract code comments
4. Contact development team
+6 -7
View File
@@ -41,11 +41,11 @@ The Master Plan specifies four **public** liquidity pool types for user routing
| Pair | Creation method | Notes |
|------|-----------------|--------|
| **cUSDT / cUSDC** | `createCUSDTCUSDCPool(lpFeeRate, initialPrice, k, isOpenTWAP)` | Dedicated function; swap via `swapCUSDTForUSDC` / `swapUSDCForCUSDT`. Register in DODOPMMProvider for getQuote/executeSwap. |
| **cUSDT / XAU** | `createPool(cUSDT, xauTokenAddress, ...)` | Requires XAU token address on Chain 138. Use generic `createPool`. |
| **cUSDT / XAU** | `createPool(cUSDT, xauTokenAddress, ...)` | Use the Chain 138 XAU anchor token address (`cXAUC` or `cXAUT`) and the generic `createPool`. |
| **cUSDC / XAU** | `createPool(cUSDC, xauTokenAddress, ...)` | Same as above. |
| **cEURT / XAU** | `createPool(cEURTAddress, xauTokenAddress, ...)` | Requires cEURT and XAU token addresses on Chain 138. |
| **cEURT / XAU** | `createPool(cEURTAddress, xauTokenAddress, ...)` | Requires `cEURT` and a Chain 138 XAU anchor token (`cXAUC` or `cXAUT`). |
For cUSDT/XAU, cUSDC/XAU, and cEURT/XAU: deploy or obtain token addresses on Chain 138, then call `createPool(baseToken, quoteToken, lpFeeRate, initialPrice, k, isOpenTWAP)` with `POOL_MANAGER_ROLE`. Public pools serve user routing, price discovery, and flash loan access; they do not serve as the primary stabilization engine (see Master Plan private mesh).
For cUSDT/XAU, cUSDC/XAU, and cEURT/XAU: use the deployed Chain 138 XAU anchor token (`cXAUC` at `0x290E52a8819A4fbD0714E517225429aA2B70EC6b` or `cXAUT` at `0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E`), then call `createPool(baseToken, quoteToken, lpFeeRate, initialPrice, k, isOpenTWAP)` with `POOL_MANAGER_ROLE`. **Unit:** 1 full XAU token = **1 troy ounce** of gold (`10^6` base units with 6 decimals). Public pools serve user routing, price discovery, and flash loan access; they do not serve as the primary stabilization engine (see Master Plan private mesh).
---
@@ -101,9 +101,9 @@ RPC_URL=https://...
DODO_VENDING_MACHINE_ADDRESS=0x... # DODO Vending Machine Factory
DODO_APPROVE_ADDRESS=0x... # Optional
# Official tokens
OFFICIAL_USDT_ADDRESS=0xdAC17F958D2ee523a2206206994597C13D831ec7
OFFICIAL_USDC_ADDRESS=0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
# Official tokens on Chain 138 (local quote-side mirror stables)
OFFICIAL_USDT_ADDRESS=0x004b63A7B5b0E06f6bB6adb4a5F9f590BF3182D1
OFFICIAL_USDC_ADDRESS=0x71D6687F38b93CCad569Fa6352c876eea967201b
# Compliant tokens
COMPLIANT_USDT_ADDRESS=0x93E66202A11B1772E55407B32B44e5Cd8eda7f22
@@ -468,4 +468,3 @@ See `scripts/setup-dodo-pools.sh` for automated pool creation and configuration.
3. Seed initial liquidity
4. Enable trading
5. Monitor and optimize
@@ -12,6 +12,8 @@ Set in project `.env` (and in token-aggregation or relay when they consume oracl
|----------|-------------|
| `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). |
@@ -38,10 +40,37 @@ References: [DEPLOYMENT_COMPLETE_GUIDE.md](../deployment/DEPLOYMENT_COMPLETE_GUI
4. **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]`; uses `AGGREGATOR_ADDRESS` and fetches ETH/USD from CoinGecko.
**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.
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):**
1. `PRICE_FEED_KEEPER_ADDRESS` in `smom-dbis-138/.env` (Chain 138: `0xD3AD6831aacB5386B8A25BB8D8176a6C8a026f04` per explorer docs—verify live).
2. `KEEPER_PRIVATE_KEY` optional if same as `PRIVATE_KEY` (must have `KEEPER_ROLE` on the keeper).
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.
6. Start: `nohup ./scripts/reserve/pmm-mesh-6s-automation.sh >> logs/pmm-mesh-automation.log 2>&1 &` (optional: `MESH_CAST_GAS_PRICE=2gwei` for 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)`; then `getPoolPriceOrOracle(pool)` uses ReserveSystem when base/quote are registered.
+3 -3
View File
@@ -37,8 +37,9 @@ export RPC_URL=http://192.168.11.250:8545 # Chain 138
export DODO_VENDING_MACHINE_ADDRESS=0x... # Check DODO docs
export COMPLIANT_USDT_ADDRESS=0x93E66202A11B1772E55407B32B44e5Cd8eda7f22
export COMPLIANT_USDC_ADDRESS=0xf22258f57794CC8E06237084b353Ab30fFfa640b
export OFFICIAL_USDT_ADDRESS=0xdAC17F958D2ee523a2206206994597C13D831ec7
export OFFICIAL_USDC_ADDRESS=0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
# Chain 138 local quote-side mirror stables
export OFFICIAL_USDT_ADDRESS=0x004b63A7B5b0E06f6bB6adb4a5F9f590BF3182D1
export OFFICIAL_USDC_ADDRESS=0x71D6687F38b93CCad569Fa6352c876eea967201b
# Deploy
forge script script/dex/DeployDODOPMMIntegration.s.sol:DeployDODOPMMIntegration \
@@ -147,4 +148,3 @@ cast call $DODO_PMM_INTEGRATION_ADDRESS \
5. Enable trading
See `COMPLETE_INTEGRATION_GUIDE.md` for detailed instructions.
+2 -2
View File
@@ -18,8 +18,8 @@ This document lists GRU-M1 base money, ISO-4217 W tokens, Aave-style asset/debt
| cJPYC | CompliantFiatToken.sol | Specified| 6 | JPY (often 0 or 2 decimals; 6 for uniformity). |
| cCHFC | CompliantFiatToken.sol | Specified| 6 | CHF. |
| cCADC | CompliantFiatToken.sol | Specified| 6 | CAD. |
| cXAUC | CompliantFiatToken.sol | Specified| 6 | XAU-backed. |
| cXAUT | CompliantFiatToken.sol | Specified| 6 | Tether XAU. |
| cXAUC | CompliantFiatToken.sol | Specified| 6 | XAU; **1 token = 1 troy oz Au** (canonical). |
| cXAUT | CompliantFiatToken.sol | Specified| 6 | XAU; **1 token = 1 troy oz Au** (canonical). |
| LiXAU | — | Specified| 6 | XAU-liquidity-adjusted; map or add. |
Properties for all: ISO-4217 aligned naming and decimals, non-interest-bearing, fully redeemable, E-Money safeguards, reserve attestation hooks. Full ERC-20 (transfer, approve, balanceOf) for DEX pools.
+5 -1
View File
@@ -10,9 +10,13 @@ DODO_PMM_PROVIDER_ADDRESS=0x5CAe6Ce155b7f08D3a956F5Dc82fC9945f29B381
# DODO PMM Integration (Chain 138)
DODO_PMM_INTEGRATION_ADDRESS=0x5BDc62f1ae7D630c37A8B363a1d49845356Ee72d
# Local quote-side mirror stables (Chain 138); optional — see deploy runbooks
OFFICIAL_USDT_ADDRESS=0x004b63A7B5b0E06f6bB6adb4a5F9f590BF3182D1
OFFICIAL_USDC_ADDRESS=0x71D6687F38b93CCad569Fa6352c876eea967201b
# PMM pool addresses (optional; RegisterDODOPools reads from integration if unset)
POOL_CUSDTCUSDC=0x9fcB06Aa1FD5215DC0E91Fd098aeff4B62fEa5C8
POOL_CUSDTUSDT=0x6fc60DEDc92a2047062294488539992710b99D71
POOL_CUSDTUSDT=0xa3Ee6091696B28e5497b6F491fA1e99047250c59
POOL_CUSDCUSDC=0x90bd9Bf18Daa26Af3e814ea224032d015db58Ea5
# Token-aggregation (quote API): same integration address so indexer can index DODO pools
+3 -1
View File
@@ -10,6 +10,9 @@ optimizer = true
optimizer_runs = 200
via_ir = true
evm_version = "london"
fs_permissions = [
{ access = "read", path = "./config" }
]
remappings = [
"@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
"@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
@@ -55,4 +58,3 @@ arbitrum = { key = "${ARBISCAN_API_KEY:-${ETHERSCAN_API_KEY}}", url = "https://a
# Cronos mainnet (chain 25). Etherscan-style API; chainid required for v2.
# API key from explorer.cronos.org/register (CRONOSCAN_API_KEY)
cronos = { key = "${CRONOSCAN_API_KEY:-${ETHERSCAN_API_KEY}}", url = "https://explorer-api.cronos.org/mainnet/api?chainid=25" }
+36
View File
@@ -0,0 +1,36 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import {Script, console} from "forge-std/Script.sol";
import {OfficialStableMirrorToken} from "../contracts/tokens/OfficialStableMirrorToken.sol";
/**
* @title DeployOfficialUSDC138
* @notice Deploy the local Chain 138 quote-side USDC mirror used by DODO PMM pools.
*/
contract DeployOfficialUSDC138 is Script {
function run() external {
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
address deployer = vm.addr(deployerPrivateKey);
address owner = vm.envOr("OFFICIAL_USDC_138_OWNER", deployer);
uint256 initialSupply = vm.envOr("OFFICIAL_USDC_138_INITIAL_SUPPLY", uint256(0));
console.log("Deploying Official USDC (Chain 138) with deployer:", vm.toString(deployer));
console.log("Owner:", vm.toString(owner));
console.log("Initial supply:", initialSupply);
vm.startBroadcast(deployerPrivateKey);
OfficialStableMirrorToken token = new OfficialStableMirrorToken(
"USD Coin (Chain 138)",
"USDC",
6,
owner,
initialSupply
);
console.log("Official USDC (Chain 138) deployed at:", vm.toString(address(token)));
vm.stopBroadcast();
}
}
+36
View File
@@ -0,0 +1,36 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import {Script, console} from "forge-std/Script.sol";
import {OfficialStableMirrorToken} from "../contracts/tokens/OfficialStableMirrorToken.sol";
/**
* @title DeployOfficialUSDT138
* @notice Deploy the local Chain 138 quote-side USDT mirror used by DODO PMM pools.
*/
contract DeployOfficialUSDT138 is Script {
function run() external {
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
address deployer = vm.addr(deployerPrivateKey);
address owner = vm.envOr("OFFICIAL_USDT_138_OWNER", deployer);
uint256 initialSupply = vm.envOr("OFFICIAL_USDT_138_INITIAL_SUPPLY", uint256(0));
console.log("Deploying Official USDT (Chain 138) with deployer:", vm.toString(deployer));
console.log("Owner:", vm.toString(owner));
console.log("Initial supply:", initialSupply);
vm.startBroadcast(deployerPrivateKey);
OfficialStableMirrorToken token = new OfficialStableMirrorToken(
"Tether USD (Chain 138)",
"USDT",
6,
owner,
initialSupply
);
console.log("Official USDT (Chain 138) deployed at:", vm.toString(address(token)));
vm.stopBroadcast();
}
}
@@ -10,6 +10,8 @@ import "../../../contracts/bridge/trustless/EnhancedSwapRouter.sol";
* @dev Deploys EnhancedSwapRouter with Uniswap V3, Curve, Dodoex, Balancer, and 1inch
*/
contract DeployEnhancedSwapRouter is Script {
address constant PLACEHOLDER = 0x000000000000000000000000000000000000dEaD;
// Ethereum Mainnet addresses
address constant UNISWAP_V3_ROUTER = 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45;
address constant CURVE_3POOL = 0xbEbc44782C7dB0a1A60Cb6fe97d0b483032FF1C7;
@@ -21,39 +23,77 @@ contract DeployEnhancedSwapRouter is Script {
address constant USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48;
address constant DAI = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
// Chain 138 canonical token addresses
address constant CHAIN138_WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
address constant CHAIN138_USDT = 0x004b63A7B5b0E06f6bB6adb4a5F9f590BF3182D1;
address constant CHAIN138_USDC = 0x71D6687F38b93CCad569Fa6352c876eea967201b;
address constant CHAIN138_DAI_PLACEHOLDER = 0x6B175474E89094C44Da98b954EedeAC495271d0F;
// Chain 138 live DODO pool map (2026-03-26)
address constant CHAIN138_cUSDT = 0x93E66202A11B1772E55407B32B44e5Cd8eda7f22;
address constant CHAIN138_cUSDC = 0xf22258f57794CC8E06237084b353Ab30fFfa640b;
address constant CHAIN138_cEURT = 0xdf4b71c61E5912712C1Bdd451416B9aC26949d72;
address constant CHAIN138_cXAUC = 0x290E52a8819A4fbD0714E517225429aA2B70EC6b;
address constant CHAIN138_POOL_CUSDTCUSDC = 0xff8d3b8fDF7B112759F076B69f4271D4209C0849;
address constant CHAIN138_POOL_CUSDTUSDT = 0x6fc60DEDc92a2047062294488539992710b99D71;
address constant CHAIN138_POOL_CUSDCUSDC = 0x0309178Ae30302D83C76d6DD402a684ef3160eeC;
address constant CHAIN138_POOL_CUSDT_XAU_PUBLIC = 0x1AA55E2001E5651349aFf5a63FD7a7ae44f0f1b0;
address constant CHAIN138_POOL_CUSDC_XAU_PUBLIC = 0xEa9AC6357CaCB42a83b9082B870610363b177CbA;
address constant CHAIN138_POOL_CEURT_XAU_PUBLIC = 0xba99bc1eAac164569d5aca96c806934dDaf970CF;
function run() external {
uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY");
address deployer = vm.addr(deployerPrivateKey);
uint256 chainId = block.chainid;
bool isMainnet = chainId == 1;
bool isChain138 = chainId == 138;
require(isMainnet || isChain138, "DeployEnhancedSwapRouter: supported chains are Ethereum Mainnet and Chain 138");
(
address uniswapV3Router,
address curve3Pool,
address dodoexRouter,
address balancerVault,
address oneInchRouter,
address weth,
address usdt,
address usdc,
address dai
) = _resolveAddresses(chainId);
console.log("=== EnhancedSwapRouter Deployment ===");
console.log("Deployer:", deployer);
console.log("Chain ID:", block.chainid);
require(block.chainid == 1, "DeployEnhancedSwapRouter: Ethereum Mainnet only");
console.log("Chain ID:", chainId);
if (isChain138) {
console.log("Mode: Chain 138 env-driven deployment");
console.log("Note: live DODO pools are stable/stable and stable/XAU.");
console.log("Note: WETH->stable routing remains optional until real WETH routes are configured.");
}
vm.startBroadcast(deployerPrivateKey);
console.log("\n--- Deploying EnhancedSwapRouter ---");
console.log("Uniswap V3 Router:", UNISWAP_V3_ROUTER);
console.log("Curve 3Pool:", CURVE_3POOL);
console.log("Dodoex Router:", DODOEX_ROUTER);
console.log("Balancer Vault:", BALANCER_VAULT);
console.log("1inch Router:", ONEINCH_ROUTER);
console.log("WETH:", WETH);
console.log("USDT:", USDT);
console.log("USDC:", USDC);
console.log("DAI:", DAI);
console.log("Uniswap V3 Router:", uniswapV3Router);
console.log("Curve 3Pool:", curve3Pool);
console.log("Dodoex Router:", dodoexRouter);
console.log("Balancer Vault:", balancerVault);
console.log("1inch Router:", oneInchRouter);
console.log("WETH:", weth);
console.log("USDT:", usdt);
console.log("USDC:", usdc);
console.log("DAI:", dai);
EnhancedSwapRouter router = new EnhancedSwapRouter(
UNISWAP_V3_ROUTER,
CURVE_3POOL,
DODOEX_ROUTER,
BALANCER_VAULT,
ONEINCH_ROUTER,
WETH,
USDT,
USDC,
DAI
uniswapV3Router,
curve3Pool,
dodoexRouter,
balancerVault,
oneInchRouter,
weth,
usdt,
usdc,
dai
);
console.log("\nEnhancedSwapRouter deployed at:", address(router));
@@ -62,7 +102,11 @@ contract DeployEnhancedSwapRouter is Script {
router.grantRole(router.ROUTING_MANAGER_ROLE(), deployer);
// Configure default routing
_configureDefaultRouting(router, deployer);
_configureDefaultRouting(router);
if (isChain138) {
_configureChain138InitialState(router, uniswapV3Router, curve3Pool, dodoexRouter, balancerVault, oneInchRouter);
}
vm.stopBroadcast();
@@ -70,9 +114,13 @@ contract DeployEnhancedSwapRouter is Script {
console.log("EnhancedSwapRouter:", address(router));
console.log("\n=== Export to .env ===");
console.log("export ENHANCED_SWAP_ROUTER=", vm.toString(address(router)));
if (isChain138) {
console.log("export ENHANCED_SWAP_ROUTER_CHAIN138=", vm.toString(address(router)));
console.log("export ENHANCED_SWAP_ROUTER_ADDRESS=", vm.toString(address(router)));
}
}
function _configureDefaultRouting(EnhancedSwapRouter router, address deployer) internal {
function _configureDefaultRouting(EnhancedSwapRouter router) internal {
console.log("\n--- Configuring Default Routing ---");
// Small swaps (< $10k): Uniswap V3, Dodoex
@@ -102,5 +150,110 @@ contract DeployEnhancedSwapRouter is Script {
// after identifying the actual pool addresses
console.log("\nWARNING: Remember to configure Balancer pool IDs after deployment");
}
}
function _configureChain138InitialState(
EnhancedSwapRouter router,
address uniswapV3Router,
address curve3Pool,
address dodoexRouter,
address balancerVault,
address oneInchRouter
) internal {
console.log("\n--- Chain 138 Initial Configuration ---");
address dodoPmmProvider = vm.envOr("DODO_PMM_PROVIDER_ADDRESS", address(0));
if (dodoPmmProvider == address(0)) {
dodoPmmProvider = vm.envOr("DODO_PMM_PROVIDER", address(0));
}
_registerPair(router, CHAIN138_cUSDT, CHAIN138_cUSDC, CHAIN138_POOL_CUSDTCUSDC);
_registerPair(router, CHAIN138_cUSDT, CHAIN138_USDT, CHAIN138_POOL_CUSDTUSDT);
_registerPair(router, CHAIN138_cUSDC, CHAIN138_USDC, CHAIN138_POOL_CUSDCUSDC);
_registerPair(router, CHAIN138_cUSDT, CHAIN138_cXAUC, CHAIN138_POOL_CUSDT_XAU_PUBLIC);
_registerPair(router, CHAIN138_cUSDC, CHAIN138_cXAUC, CHAIN138_POOL_CUSDC_XAU_PUBLIC);
_registerPair(router, CHAIN138_cEURT, CHAIN138_cXAUC, CHAIN138_POOL_CEURT_XAU_PUBLIC);
if (dodoPmmProvider != address(0)) {
router.setDodoLiquidityProvider(dodoPmmProvider);
console.log("Configured DODO PMM provider:", dodoPmmProvider);
}
// Disable providers that are definitely not usable until explicitly configured on Chain 138.
if (curve3Pool == PLACEHOLDER) {
router.setProviderEnabled(EnhancedSwapRouter.SwapProvider.Curve, false);
console.log("Disabled Curve provider (placeholder address)");
}
if (balancerVault == PLACEHOLDER) {
router.setProviderEnabled(EnhancedSwapRouter.SwapProvider.Balancer, false);
console.log("Disabled Balancer provider (placeholder address)");
}
if (oneInchRouter == PLACEHOLDER) {
router.setProviderEnabled(EnhancedSwapRouter.SwapProvider.OneInch, false);
console.log("Disabled 1inch provider (placeholder address)");
}
if (uniswapV3Router == PLACEHOLDER) {
router.setProviderEnabled(EnhancedSwapRouter.SwapProvider.UniswapV3, false);
console.log("Disabled Uniswap V3 provider (placeholder address)");
}
if (dodoexRouter == PLACEHOLDER && dodoPmmProvider == address(0)) {
router.setProviderEnabled(EnhancedSwapRouter.SwapProvider.Dodoex, false);
console.log("Disabled Dodoex provider (no router and no PMM provider configured)");
} else {
console.log("Dodo pool mappings registered for current live Chain 138 pairs.");
}
console.log("WARNING: swapToStablecoin() still needs real WETH->stable routes to be useful on Chain 138.");
console.log("WARNING: current Chain 138 DODO initialization is primarily for token-to-token pair mappings via swapTokenToToken().");
}
function _registerPair(
EnhancedSwapRouter router,
address tokenA,
address tokenB,
address pool
) internal {
router.setDodoPoolAddress(tokenA, tokenB, pool);
router.setDodoPoolAddress(tokenB, tokenA, pool);
console.log("Registered DODO pool:", pool);
}
function _resolveAddresses(
uint256 chainId
)
internal
returns (
address uniswapV3Router,
address curve3Pool,
address dodoexRouter,
address balancerVault,
address oneInchRouter,
address weth,
address usdt,
address usdc,
address dai
)
{
if (chainId == 1) {
uniswapV3Router = vm.envOr("UNISWAP_V3_ROUTER", UNISWAP_V3_ROUTER);
curve3Pool = vm.envOr("CURVE_3POOL", CURVE_3POOL);
dodoexRouter = vm.envOr("DODOEX_ROUTER", DODOEX_ROUTER);
balancerVault = vm.envOr("BALANCER_VAULT", BALANCER_VAULT);
oneInchRouter = vm.envOr("ONEINCH_ROUTER", ONEINCH_ROUTER);
weth = vm.envOr("WETH", WETH);
usdt = vm.envOr("USDT", USDT);
usdc = vm.envOr("USDC", USDC);
dai = vm.envOr("DAI", DAI);
return (uniswapV3Router, curve3Pool, dodoexRouter, balancerVault, oneInchRouter, weth, usdt, usdc, dai);
}
// Chain 138: use canonical token defaults and env-driven protocol addresses.
uniswapV3Router = vm.envOr("UNISWAP_V3_ROUTER", PLACEHOLDER);
curve3Pool = vm.envOr("CURVE_3POOL", PLACEHOLDER);
dodoexRouter = vm.envOr("DODOEX_ROUTER", PLACEHOLDER);
balancerVault = vm.envOr("BALANCER_VAULT", PLACEHOLDER);
oneInchRouter = vm.envOr("ONEINCH_ROUTER", PLACEHOLDER);
weth = vm.envOr("WETH", CHAIN138_WETH);
usdt = vm.envOr("OFFICIAL_USDT_ADDRESS", CHAIN138_USDT);
usdc = vm.envOr("OFFICIAL_USDC_ADDRESS", CHAIN138_USDC);
dai = vm.envOr("DAI", CHAIN138_DAI_PLACEHOLDER);
}
}
@@ -9,10 +9,11 @@ import {CompliantFiatToken} from "../../contracts/tokens/CompliantFiatToken.sol"
* @title DeployCompliantFiatTokens
* @notice Deterministic deployment of CompliantFiatToken (cEURC, cEURT, cGBPC, cGBPT, cAUDC, cJPYC, cCHFC, cCADC, cXAUC, cXAUT; optional cCADT) via CREATE2.
* @dev Use same ADMIN/OWNER and salts per chain for identical addresses. See docs/runbooks and TOKEN_SCOPE_GRU.md.
* cXAUC/cXAUT use currency code XAU: **1 full token = 1 troy oz Au** (see CompliantFiatToken NatSpec).
*/
contract DeployCompliantFiatTokens is Script {
uint256 constant DECIMALS = 6;
uint256 constant INITIAL_SUPPLY = 1_000_000 * 10**6; // 1M tokens
uint256 constant INITIAL_SUPPLY = 1_000_000 * 10**6; // 1M units: fiat = currency units; XAU = troy ounces
function run() external {
uint256 pk = vm.envUint("PRIVATE_KEY");
@@ -17,10 +17,12 @@ import {CompliantFiatToken} from "../../contracts/tokens/CompliantFiatToken.sol"
* OWNER, ADMIN (optional; default deployer)
* DEPLOY_CUSDT=1, DEPLOY_CUSDC=1 (default both 1)
* DEPLOY_CEURC=1, DEPLOY_CEURT=1, ... (optional; deploy extra CompliantFiatToken)
*
* XAU: cXAUC/cXAUT — 1 full token = 1 troy ounce Au (see CompliantFiatToken).
*/
contract DeployCompliantFiatTokensForChain is Script {
uint256 constant DECIMALS = 6;
uint256 constant INITIAL_SUPPLY = 1_000_000 * 10**6; // 1M
uint256 constant INITIAL_SUPPLY = 1_000_000 * 10**6; // 1M units (fiat: currency; XAU: troy oz)
function run() external {
uint256 pk = vm.envUint("PRIVATE_KEY");
@@ -41,9 +41,8 @@ contract AddLiquidityPMMPoolsChain138 is Script {
address usdt = integration.officialUSDT();
address usdc = integration.officialUSDC();
// On Chain 138, DODOPMMIntegration may have been deployed with mainnet official USDT/USDC
// (0xdAC17F958D2ee523a2206206994597C13D831ec7, 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48).
// Those addresses have no code on 138, so skip cUSDT/USDT and cUSDC/USDC to avoid "call to non-contract".
// On Chain 138, cUSDT/USDT and cUSDC/USDC should point at live local mirror quote tokens.
// If the configured quote-side addresses have no code on 138, skip those pools to avoid "call to non-contract".
bool skipOfficialPools = block.chainid == 138 && (
!_isContract(usdt) || !_isContract(usdc)
);
@@ -0,0 +1,89 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import {Script, console} from "forge-std/Script.sol";
import {DODOPMMIntegration} from "../../contracts/dex/DODOPMMIntegration.sol";
/**
* @title CreatePublicXAUPoolsChain138
* @notice Create the public XAU-anchored pools on Chain 138 using the configured cXAU anchor token.
* @dev Env:
* - PRIVATE_KEY
* - DODOPMM_INTEGRATION or DODOPMM_INTEGRATION_ADDRESS
* - XAU_ADDRESS_138 or CXAUC_ADDRESS_138 or CXAUT_ADDRESS_138
* Optional:
* - COMPLIANT_USDT_ADDRESS, COMPLIANT_USDC_ADDRESS, cEURT_ADDRESS_138
* - CREATE_CUSDT_XAU=1, CREATE_CUSDC_XAU=1, CREATE_CEURT_XAU=1
*/
contract CreatePublicXAUPoolsChain138 is Script {
address internal constant CHAIN138_CUSDT = 0x93E66202A11B1772E55407B32B44e5Cd8eda7f22;
address internal constant CHAIN138_CUSDC = 0xf22258f57794CC8E06237084b353Ab30fFfa640b;
address internal constant CHAIN138_CEURT = 0xdf4b71c61E5912712C1Bdd451416B9aC26949d72;
address internal constant CHAIN138_CXAUC = 0x290E52a8819A4fbD0714E517225429aA2B70EC6b;
address internal constant CHAIN138_CXAUT = 0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E;
uint256 internal constant LP_FEE_BPS = 3;
uint256 internal constant INITIAL_PRICE_1E18 = 1e18;
uint256 internal constant K_50PCT = 0.5e18;
bool internal constant USE_TWAP = true;
function run() external {
uint256 pk = vm.envUint("PRIVATE_KEY");
address integrationAddr = vm.envOr("DODOPMM_INTEGRATION", address(0));
if (integrationAddr == address(0)) integrationAddr = vm.envOr("DODOPMM_INTEGRATION_ADDRESS", address(0));
require(integrationAddr != address(0), "DODOPMM_INTEGRATION not set");
address xau = vm.envOr("XAU_ADDRESS_138", address(0));
if (xau == address(0)) xau = vm.envOr("CXAUC_ADDRESS_138", address(0));
if (xau == address(0)) xau = vm.envOr("CXAUT_ADDRESS_138", address(0));
if (xau == address(0) && block.chainid == 138) xau = CHAIN138_CXAUC;
require(xau != address(0), "XAU anchor not set");
address cUSDT = vm.envOr("COMPLIANT_USDT_ADDRESS", address(0));
address cUSDC = vm.envOr("COMPLIANT_USDC_ADDRESS", address(0));
address cEURT = vm.envOr("cEURT_ADDRESS_138", address(0));
if (cUSDT == address(0) && block.chainid == 138) cUSDT = CHAIN138_CUSDT;
if (cUSDC == address(0) && block.chainid == 138) cUSDC = CHAIN138_CUSDC;
if (cEURT == address(0) && block.chainid == 138) cEURT = CHAIN138_CEURT;
bool createCUSDT = vm.envOr("CREATE_CUSDT_XAU", true);
bool createCUSDC = vm.envOr("CREATE_CUSDC_XAU", true);
bool createCEURT = vm.envOr("CREATE_CEURT_XAU", true);
DODOPMMIntegration integration = DODOPMMIntegration(integrationAddr);
vm.startBroadcast(pk);
if (createCUSDT && cUSDT != address(0)) {
_createIfMissing(integration, cUSDT, xau, "cUSDT/XAU");
}
if (createCUSDC && cUSDC != address(0)) {
_createIfMissing(integration, cUSDC, xau, "cUSDC/XAU");
}
if (createCEURT && cEURT != address(0)) {
_createIfMissing(integration, cEURT, xau, "cEURT/XAU");
}
vm.stopBroadcast();
console.log("Public XAU pools checked against anchor:", xau == CHAIN138_CXAUC ? "cXAUC" : (xau == CHAIN138_CXAUT ? "cXAUT" : "custom"));
console.log("Default Chain 138 XAU anchors:", vm.toString(CHAIN138_CXAUC), vm.toString(CHAIN138_CXAUT));
}
function _createIfMissing(
DODOPMMIntegration integration,
address base,
address quote,
string memory label
) internal {
address existing = integration.pools(base, quote);
if (existing != address(0)) {
console.log(label, "already exists at", existing);
return;
}
address pool = integration.createPool(base, quote, LP_FEE_BPS, INITIAL_PRICE_1E18, K_50PCT, USE_TWAP);
console.log(label, "created at", pool);
}
}
+10 -3
View File
@@ -24,8 +24,16 @@ contract DeployDODOPMMIntegration is Script {
address compliantUSDT = vm.envOr("COMPLIANT_USDT_ADDRESS", address(0));
address compliantUSDC = vm.envOr("COMPLIANT_USDC_ADDRESS", address(0));
if (dodoVendingMachine == address(0) || compliantUSDT == address(0) || compliantUSDC == address(0)) {
console.log("Skipping DODO PMM deploy: set DODO_VENDING_MACHINE_ADDRESS, COMPLIANT_USDT_ADDRESS, COMPLIANT_USDC_ADDRESS in .env");
if (
dodoVendingMachine == address(0) ||
officialUSDT == address(0) ||
officialUSDC == address(0) ||
compliantUSDT == address(0) ||
compliantUSDC == address(0)
) {
console.log(
"Skipping DODO PMM deploy: set DODO_VENDING_MACHINE_ADDRESS, OFFICIAL_USDT_ADDRESS, OFFICIAL_USDC_ADDRESS, COMPLIANT_USDT_ADDRESS, COMPLIANT_USDC_ADDRESS in .env"
);
return;
}
@@ -64,4 +72,3 @@ contract DeployDODOPMMIntegration is Script {
console.log("3. Configure pool parameters (lpFeeRate, k, initialPrice)");
}
}
@@ -13,6 +13,8 @@ import {DODOPMMIntegration} from "../../contracts/dex/DODOPMMIntegration.sol";
* Deployer must have POOL_MANAGER_ROLE on DODOPMMIntegration to create pools.
*/
contract DeployPrivatePoolRegistryAndPools is Script {
address internal constant CHAIN138_CXAUC = 0x290E52a8819A4fbD0714E517225429aA2B70EC6b;
address internal constant CHAIN138_CXAUT = 0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E;
uint256 constant LP_FEE_BPS = 3;
uint256 constant INITIAL_PRICE_1E18 = 1e18;
uint256 constant K_50PCT = 0.5e18;
@@ -29,35 +31,37 @@ contract DeployPrivatePoolRegistryAndPools is Script {
console.log("PrivatePoolRegistry deployed at:", vm.toString(address(registry)));
address integrationAddr = vm.envOr("DODOPMM_INTEGRATION_ADDRESS", address(0));
if (integrationAddr == address(0)) integrationAddr = vm.envOr("DODO_PMM_INTEGRATION_ADDRESS", address(0));
if (integrationAddr == address(0)) integrationAddr = vm.envOr("DODOPMM_INTEGRATION", address(0));
if (integrationAddr == address(0)) integrationAddr = vm.envOr("DODO_PMM_INTEGRATION", address(0));
address xau = vm.envOr("XAU_ADDRESS_138", address(0));
if (xau == address(0)) xau = vm.envOr("CXAUC_ADDRESS_138", address(0));
if (xau == address(0)) xau = vm.envOr("CXAUT_ADDRESS_138", address(0));
if (xau == address(0) && block.chainid == 138) xau = CHAIN138_CXAUC;
if (integrationAddr != address(0) && xau != address(0)) {
address cUSDT = vm.envOr("COMPLIANT_USDT_ADDRESS", address(0));
address cUSDC = vm.envOr("COMPLIANT_USDC_ADDRESS", address(0));
address cEURT = vm.envOr("cEURT_ADDRESS_138", address(0));
if (cUSDT == address(0) && block.chainid == 138) cUSDT = 0x93E66202A11B1772E55407B32B44e5Cd8eda7f22;
if (cUSDC == address(0) && block.chainid == 138) cUSDC = 0xf22258f57794CC8E06237084b353Ab30fFfa640b;
if (cEURT == address(0) && block.chainid == 138) cEURT = 0xdf4b71c61E5912712C1Bdd451416B9aC26949d72;
DODOPMMIntegration integration = DODOPMMIntegration(integrationAddr);
if (cUSDT != address(0)) {
try integration.createPool(cUSDT, xau, LP_FEE_BPS, INITIAL_PRICE_1E18, K_50PCT, USE_TWAP) returns (address pool) {
registry.register(cUSDT, xau, pool);
console.log("Created and registered cUSDT/XAU pool:", vm.toString(pool));
} catch {}
_ensureRegistered(registry, integration, cUSDT, xau, "cUSDT/XAU");
}
if (cUSDC != address(0)) {
try integration.createPool(cUSDC, xau, LP_FEE_BPS, INITIAL_PRICE_1E18, K_50PCT, USE_TWAP) returns (address pool) {
registry.register(cUSDC, xau, pool);
console.log("Created and registered cUSDC/XAU pool:", vm.toString(pool));
} catch {}
_ensureRegistered(registry, integration, cUSDC, xau, "cUSDC/XAU");
}
if (cEURT != address(0)) {
try integration.createPool(cEURT, xau, LP_FEE_BPS, INITIAL_PRICE_1E18, K_50PCT, USE_TWAP) returns (address pool) {
registry.register(cEURT, xau, pool);
console.log("Created and registered cEURT/XAU pool:", vm.toString(pool));
} catch {}
_ensureRegistered(registry, integration, cEURT, xau, "cEURT/XAU");
}
} else {
console.log("Skipping pool creation (set DODOPMM_INTEGRATION_ADDRESS and XAU_ADDRESS_138 to create XAU-anchored pools)");
console.log(
"Skipping pool creation (set DODOPMM_INTEGRATION_ADDRESS and XAU_ADDRESS_138/CXAUC_ADDRESS_138/CXAUT_ADDRESS_138 to create XAU-anchored pools)"
);
}
vm.stopBroadcast();
@@ -65,5 +69,30 @@ contract DeployPrivatePoolRegistryAndPools is Script {
console.log("\n=== Deployment Summary ===");
console.log("PrivatePoolRegistry:", vm.toString(address(registry)));
console.log("Admin:", vm.toString(admin));
console.log("Default XAU anchor on Chain 138:", vm.toString(CHAIN138_CXAUC));
console.log("Alternate XAU anchor on Chain 138:", vm.toString(CHAIN138_CXAUT));
}
function _ensureRegistered(
PrivatePoolRegistry registry,
DODOPMMIntegration integration,
address base,
address quote,
string memory label
) internal {
address pool = integration.pools(base, quote);
if (pool == address(0)) {
pool = integration.createPool(base, quote, LP_FEE_BPS, INITIAL_PRICE_1E18, K_50PCT, USE_TWAP);
console.log("Created", label, "pool:", vm.toString(pool));
} else {
console.log(label, "pool already exists:", vm.toString(pool));
}
if (registry.getPrivatePool(base, quote) == address(0)) {
registry.register(base, quote, pool);
console.log("Registered", label, "pool:", vm.toString(pool));
} else {
console.log(label, "already registered:", vm.toString(registry.getPrivatePool(base, quote)));
}
}
}
@@ -0,0 +1,135 @@
// 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);
}
}
+27 -25
View File
@@ -7,10 +7,11 @@ import {DODOPMMIntegration} from "../../contracts/dex/DODOPMMIntegration.sol";
/**
* @title RegisterDODOPools
* @notice Register existing DODO PMM pools with DODOPMMProvider.
* @notice Register all existing DODO PMM pools from DODOPMMIntegration with DODOPMMProvider.
* @dev Set DODO_PMM_PROVIDER_ADDRESS, DODO_PMM_INTEGRATION (or DODO_PMM_INTEGRATION_ADDRESS).
* Pool addresses: POOL_CUSDTCUSDC, POOL_CUSDTUSDT, POOL_CUSDCUSDC (optional).
* Token addresses read from integration if not in env.
* Reads integration.getAllPools() and poolConfigs(pool), then registers both directions
* for every discovered pool so provider.supportsTokenPair() and executeSwap() work
* symmetrically across the current live set and any future c* full-mesh expansion.
*/
contract RegisterDODOPools is Script {
function run() external {
@@ -18,34 +19,35 @@ contract RegisterDODOPools is Script {
address providerAddr = vm.envAddress("DODO_PMM_PROVIDER_ADDRESS");
address integrationAddr = vm.envAddress("DODO_PMM_INTEGRATION");
if (integrationAddr == address(0)) integrationAddr = vm.envAddress("DODO_PMM_INTEGRATION_ADDRESS");
require(providerAddr != address(0), "DODO_PMM_PROVIDER_ADDRESS not set");
require(integrationAddr != address(0), "DODO_PMM_INTEGRATION not set");
DODOPMMIntegration integration = DODOPMMIntegration(integrationAddr);
address cusdt = integration.compliantUSDT();
address cusdc = integration.compliantUSDC();
address usdt = integration.officialUSDT();
address usdc = integration.officialUSDC();
address poolCusdtCusdc = vm.envOr("POOL_CUSDTCUSDC", address(0));
address poolCusdtUsdt = vm.envOr("POOL_CUSDTUSDT", address(0));
address poolCusdcUsdc = vm.envOr("POOL_CUSDCUSDC", address(0));
DODOPMMProvider provider = DODOPMMProvider(providerAddr);
address[] memory pools = integration.getAllPools();
require(pools.length > 0, "No pools found in DODOPMMIntegration");
vm.startBroadcast(pk);
if (poolCusdtCusdc != address(0)) {
provider.registerPool(cusdt, cusdc, poolCusdtCusdc);
console.log("Registered cUSDT/cUSDC pool:", poolCusdtCusdc);
for (uint256 i = 0; i < pools.length; i++) {
try integration.getPoolConfig(pools[i]) returns (DODOPMMIntegration.PoolConfig memory config) {
_registerPair(provider, config.baseToken, config.quoteToken, pools[i]);
} catch {
console.log("Skipping removed or unreadable pool:", pools[i]);
}
}
if (poolCusdtUsdt != address(0)) {
provider.registerPool(cusdt, usdt, poolCusdtUsdt);
console.log("Registered cUSDT/USDT pool:", poolCusdtUsdt);
}
if (poolCusdcUsdc != address(0)) {
provider.registerPool(cusdc, usdc, poolCusdcUsdc);
console.log("Registered cUSDC/USDC pool:", poolCusdcUsdc);
}
vm.stopBroadcast();
}
function _registerPair(
DODOPMMProvider provider,
address tokenA,
address tokenB,
address pool
) internal {
provider.registerPool(tokenA, tokenB, pool);
provider.registerPool(tokenB, tokenA, pool);
console.log("Registered base:", tokenA);
console.log("Registered quote:", tokenB);
console.log("Pool:", pool);
}
}
+85
View File
@@ -0,0 +1,85 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
source "$PROJECT_ROOT/scripts/lib/deployment/dotenv.sh"
load_deployment_env
if [[ -f "$PROJECT_ROOT/services/relay/.env.bsc" ]]; then
set -a
# shellcheck disable=SC1091
source "$PROJECT_ROOT/services/relay/.env.bsc"
set +a
fi
DRY_RUN=0
AMOUNT_WEI=""
while [[ $# -gt 0 ]]; do
case "$1" in
--dry-run)
DRY_RUN=1
shift
;;
*)
if [[ -z "$AMOUNT_WEI" ]]; then
AMOUNT_WEI="$1"
fi
shift
;;
esac
done
RPC_URL="${DEST_RPC_URL:-${BSC_RPC_URL:-${BSC_MAINNET_RPC:-}}}"
BRIDGE_ADDRESS="${DEST_RELAY_BRIDGE:-}"
WETH_ADDRESS="${DEST_WETH9_ADDRESS:-0x2170Ed0880ac9A755fd29B2688956BD959F933F8}"
if [[ -z "${PRIVATE_KEY:-}" ]]; then
echo "Set PRIVATE_KEY in .env" >&2
exit 1
fi
if [[ -z "$RPC_URL" ]]; then
echo "Set BSC_RPC_URL (or BSC_MAINNET_RPC / DEST_RPC_URL) in .env" >&2
exit 1
fi
if [[ -z "$BRIDGE_ADDRESS" ]]; then
echo "Set DEST_RELAY_BRIDGE in services/relay/.env.bsc" >&2
exit 1
fi
DEPLOYER="$(cast wallet address --private-key "$PRIVATE_KEY")"
if [[ -z "$AMOUNT_WEI" ]]; then
AMOUNT_WEI="$(cast call "$WETH_ADDRESS" "balanceOf(address)(uint256)" "$DEPLOYER" --rpc-url "$RPC_URL")"
fi
if [[ -z "$AMOUNT_WEI" || "$AMOUNT_WEI" == "0" ]]; then
if [[ "$DRY_RUN" == "1" ]]; then
AMOUNT_WEI="1000000000000000"
echo "No BSC WETH available; using placeholder amount for dry-run: $AMOUNT_WEI wei"
else
echo "No BSC WETH available to fund the BSC relay bridge." >&2
exit 1
fi
fi
CMD=(cast send "$WETH_ADDRESS" "transfer(address,uint256)" "$BRIDGE_ADDRESS" "$AMOUNT_WEI" --rpc-url "$RPC_URL" --private-key "$PRIVATE_KEY" --legacy)
DRY_CMD=(cast send "$WETH_ADDRESS" "transfer(address,uint256)" "$BRIDGE_ADDRESS" "$AMOUNT_WEI" --rpc-url "$RPC_URL" --private-key "<PRIVATE_KEY>" --legacy)
echo "BSC relay funding"
echo " Deployer: $DEPLOYER"
echo " WETH: $WETH_ADDRESS"
echo " Bridge: $BRIDGE_ADDRESS"
echo " Amount: $AMOUNT_WEI wei"
if [[ "$DRY_RUN" == "1" ]]; then
printf ' [DRY RUN] '
printf '%q ' "${DRY_CMD[@]}"
printf '\n'
exit 0
fi
"${CMD[@]}"
+78
View File
@@ -0,0 +1,78 @@
#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
source "$PROJECT_ROOT/scripts/lib/deployment/dotenv.sh"
load_deployment_env
DRY_RUN=0
AMOUNT_WEI=""
while [[ $# -gt 0 ]]; do
case "$1" in
--dry-run)
DRY_RUN=1
shift
;;
*)
if [[ -z "$AMOUNT_WEI" ]]; then
AMOUNT_WEI="$1"
fi
shift
;;
esac
done
RPC_URL="${RPC_URL_MAINNET:-${ETHEREUM_MAINNET_RPC:-}}"
BRIDGE_ADDRESS="${CCIP_RELAY_BRIDGE_MAINNET:-${RELAY_BRIDGE_MAINNET:-${CW_BRIDGE_MAINNET:-}}}"
WETH_ADDRESS="${WETH9_MAINNET:-0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2}"
if [[ -z "${PRIVATE_KEY:-}" ]]; then
echo "Set PRIVATE_KEY in .env" >&2
exit 1
fi
if [[ -z "$RPC_URL" ]]; then
echo "Set ETHEREUM_MAINNET_RPC (or RPC_URL_MAINNET) in .env" >&2
exit 1
fi
if [[ -z "$BRIDGE_ADDRESS" ]]; then
echo "Set CCIP_RELAY_BRIDGE_MAINNET (or RELAY_BRIDGE_MAINNET / CW_BRIDGE_MAINNET) in .env" >&2
exit 1
fi
DEPLOYER="$(cast wallet address --private-key "$PRIVATE_KEY")"
if [[ -z "$AMOUNT_WEI" ]]; then
AMOUNT_WEI="$(cast call "$WETH_ADDRESS" "balanceOf(address)(uint256)" "$DEPLOYER" --rpc-url "$RPC_URL")"
fi
if [[ -z "$AMOUNT_WEI" || "$AMOUNT_WEI" == "0" ]]; then
if [[ "$DRY_RUN" == "1" ]]; then
AMOUNT_WEI="1000000000000000"
echo "No WETH available; using placeholder amount for dry-run: $AMOUNT_WEI wei"
else
echo "No WETH available to fund the Mainnet relay bridge." >&2
exit 1
fi
fi
CMD=(cast send "$WETH_ADDRESS" "transfer(address,uint256)" "$BRIDGE_ADDRESS" "$AMOUNT_WEI" --rpc-url "$RPC_URL" --private-key "$PRIVATE_KEY" --legacy)
DRY_CMD=(cast send "$WETH_ADDRESS" "transfer(address,uint256)" "$BRIDGE_ADDRESS" "$AMOUNT_WEI" --rpc-url "$RPC_URL" --private-key "<PRIVATE_KEY>" --legacy)
echo "Mainnet relay funding"
echo " Deployer: $DEPLOYER"
echo " WETH: $WETH_ADDRESS"
echo " Bridge: $BRIDGE_ADDRESS"
echo " Amount: $AMOUNT_WEI wei"
if [[ "$DRY_RUN" == "1" ]]; then
printf ' [DRY RUN] '
printf '%q ' "${DRY_CMD[@]}"
printf '\n'
exit 0
fi
"${CMD[@]}"
@@ -20,12 +20,15 @@ log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# Load environment
if [ -f "$PROJECT_ROOT/.env" ]; then
if [[ -f "$PROJECT_ROOT/scripts/lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$PROJECT_ROOT/scripts/lib/deployment/dotenv.sh"
load_deployment_env --repo-root "$PROJECT_ROOT"
elif [ -f "$PROJECT_ROOT/.env" ]; then
source "$PROJECT_ROOT/.env" 2>/dev/null || true
fi
if [ -z "$PRIVATE_KEY" ]; then
if [ -z "${PRIVATE_KEY:-}" ]; then
log_error "PRIVATE_KEY not set in .env"
exit 1
fi
+7 -3
View File
@@ -7,6 +7,7 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT" 2>/dev/null || true
# Colors
RED='\033[0;31m'
@@ -21,12 +22,15 @@ log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# Load environment
if [ -f "$PROJECT_ROOT/.env" ]; then
if [[ -f "$PROJECT_ROOT/scripts/lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$PROJECT_ROOT/scripts/lib/deployment/dotenv.sh"
load_deployment_env --repo-root "$PROJECT_ROOT"
elif [ -f "$PROJECT_ROOT/.env" ]; then
source "$PROJECT_ROOT/.env" 2>/dev/null || true
fi
if [ -z "$PRIVATE_KEY" ]; then
if [ -z "${PRIVATE_KEY:-}" ]; then
log_error "PRIVATE_KEY not set in .env"
exit 1
fi
@@ -1,14 +1,24 @@
#!/usr/bin/env bash
# Full bidirectional bridge configuration (Ethereum mainnet ↔ Chain 138).
# Legacy scripts under scripts/configuration/configure-chain138-* were removed; this delegates to deployment helpers.
# Execute Full Bidirectional Bridge Configuration
# This script attempts to configure both directions using available selector information
set -e
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "$PROJECT_ROOT"
elif [[ -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
fi
# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
@@ -16,54 +26,21 @@ BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
log_info "=== Full Bidirectional Bridge Configuration ==="
log_info ""
log_info "=== Mainnet ↔ Chain 138 (WETH9/WETH10 bridges) ==="
bash "$PROJECT_ROOT/scripts/deployment/execute-bridge-config.sh" || log_warn "execute-bridge-config.sh exited non-zero (review output)."
# Load environment if available
if [ -f "$PROJECT_ROOT/.env" ]; then
source "$PROJECT_ROOT/.env" 2>/dev/null || true
fi
log_info "=== Config-ready chains (Gnosis/Cronos/Celo/Wemix) ==="
log_info "When bridge addresses are in .env, run: scripts/deployment/complete-config-ready-chains.sh"
# Step 1: Configure ChainID 138 → Mainnet (always possible)
log_info "Step 1: Configuring ChainID 138 → Mainnet..."
./scripts/configuration/configure-chain138-to-mainnet.sh
log_info ""
log_info "---"
# Step 2: Try to configure Mainnet → ChainID 138 (if selector available)
log_info "Step 2: Attempting Mainnet → ChainID 138 configuration..."
# Get selector from networks.json if not in env
if [ -z "$CHAIN138_SELECTOR" ] && [ -f "$PROJECT_ROOT/networks.json" ]; then
CHAIN138_SELECTOR=$(python3 -c "import json; data=json.load(open('$PROJECT_ROOT/networks.json')); print(data['networks']['138']['chainSelector'])" 2>/dev/null || echo "")
if [ -n "$CHAIN138_SELECTOR" ]; then
log_info "Using ChainID 138 selector from networks.json: $CHAIN138_SELECTOR"
export CHAIN138_SELECTOR
fi
fi
if [ -n "$CHAIN138_SELECTOR" ]; then
./scripts/configuration/configure-mainnet-to-chain138.sh
log_success "✓ Bidirectional configuration complete!"
log_info "=== Optional verification ==="
if [[ -x "$PROJECT_ROOT/scripts/verify-bridge-setup-checklist.sh" ]]; then
bash "$PROJECT_ROOT/scripts/verify-bridge-setup-checklist.sh" || log_warn "Checklist reported issues (non-fatal)."
else
log_warn "⚠ ChainID 138 selector not available - only ChainID 138 → Mainnet configured"
log_info "To complete bidirectional setup:"
log_info "1. Determine ChainID 138 selector"
log_info "2. Set in .env: CHAIN138_SELECTOR=<selector>"
log_info "3. Run: ./scripts/configuration/configure-mainnet-to-chain138.sh"
log_warn "verify-bridge-setup-checklist.sh not found or not executable."
fi
log_info ""
log_info "---"
# Step 3: Verify configuration
log_info "Step 3: Verifying configuration..."
./scripts/configuration/verify-bridge-configuration.sh
log_info ""
log_success "=== Configuration Process Complete ==="
log_success "=== Done ==="
@@ -19,7 +19,10 @@ log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
# Load environment variables
# Default matches operator LAN Core RPC (see project AGENTS.md / rules).
CHAIN138_RPC="${RPC_URL_138:-http://192.168.11.211:8545}"
CHAIN138_RPC="${CHAIN138_RPC%$'\r'}"
CHAIN138_RPC="${CHAIN138_RPC%$'\n'}"
CCIP_ROUTER_138="${CCIP_ROUTER_138:-0x42DAb7b888Dd382bD5Adcf9E038dBF1fD03b4817}"
log_info "=== Finding ChainID 138 CCIP Selector ==="
@@ -5,6 +5,12 @@
set -euo pipefail
hex_to_addr() {
local value="${1#0x}"
[[ ${#value} -ge 40 ]] || return 1
printf '0x%s\n' "${value: -40}"
}
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
@@ -19,7 +25,11 @@ log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[⚠]${NC} $1"; }
log_error() { echo -e "${RED}[✗]${NC} $1"; }
if [ -f "$PROJECT_ROOT/.env" ]; then
if [[ -f "$SCRIPT_DIR/lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/lib/deployment/dotenv.sh"
load_deployment_env --repo-root "$PROJECT_ROOT"
elif [ -f "$PROJECT_ROOT/.env" ]; then
set -a
source "$PROJECT_ROOT/.env"
set +a
@@ -131,7 +141,7 @@ while true; do
continue
fi
if ! pool_addr=$(cast call "$DODO_PMM_INTEGRATION" "pools(address,address)(address)" "$token_addr" "$QUOTE_TOKEN" --rpc-url "$RPC_URL" 2>/dev/null | cast --to-addr 2>/dev/null); then
if ! pool_addr=$(cast call "$DODO_PMM_INTEGRATION" "pools(address,address)(address)" "$token_addr" "$QUOTE_TOKEN" --rpc-url "$RPC_URL" 2>/dev/null | while read -r raw; do hex_to_addr "$raw" 2>/dev/null || true; done); then
pool_addr=""
fi
if [ -n "$pool_addr" ] && [ "$pool_addr" != "0x0000000000000000000000000000000000000000" ]; then
@@ -153,7 +163,7 @@ while true; do
--private-key "$PRIVATE_KEY" \
--legacy \
-q 2>/dev/null; then
pool_addr=$(cast call "$DODO_PMM_INTEGRATION" "pools(address,address)(address)" "$token_addr" "$QUOTE_TOKEN" --rpc-url "$RPC_URL" | cast --to-addr)
pool_addr=$(cast call "$DODO_PMM_INTEGRATION" "pools(address,address)(address)" "$token_addr" "$QUOTE_TOKEN" --rpc-url "$RPC_URL" | while read -r raw; do hex_to_addr "$raw"; done)
log_success "Pool created: $pool_addr"
if [ -n "$ENHANCED_SWAP_ROUTER" ] && [ "$ENHANCED_SWAP_ROUTER" != "0x0000000000000000000000000000000000000000" ]; then
+3 -121
View File
@@ -1,128 +1,10 @@
#!/usr/bin/env bash
# Create the full PMM pool mesh on Chain 138: all c* vs c* pairs plus c* vs official USDT/USDC.
# Uses DODOPMMIntegration.createPool() and registers each pool with DODOPMMProvider.
# Skip pairs that already have a pool. Requires POOL_MANAGER_ROLE on integration and provider.
#
# Usage:
# ./scripts/create-pmm-full-mesh-chain138.sh # all c* mesh + optional official pairs
# MESH_ONLY_C_STAR=1 ./scripts/create-pmm-full-mesh-chain138.sh # only c* vs c* (no official)
# DRY_RUN=1 ./scripts/create-pmm-full-mesh-chain138.sh # print only, no txs
#
# Requires: PRIVATE_KEY, RPC_URL_138, DODO_PMM_INTEGRATION_ADDRESS, DODO_PMM_PROVIDER_ADDRESS in .env
# Backward-compatible entrypoint for Chain 138 PMM desired-state sync.
# Delegates to JSON-driven sync (config/chain138-pmm-pools.json).
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
cd "$PROJECT_ROOT"
[[ -f .env ]] && set -a && source .env && set +a
RPC="${RPC_URL_138:-${RPC_URL:-http://192.168.11.211:8545}}"
INT="${DODO_PMM_INTEGRATION_ADDRESS:-${DODO_PMM_INTEGRATION:-}}"
PROV="${DODO_PMM_PROVIDER_ADDRESS:-}"
LP_FEE="${LP_FEE_RATE:-3}"
I="${INITIAL_PRICE:-1000000000000000000}"
K="${K_FACTOR:-500000000000000000}"
TWAP="${ENABLE_TWAP:-false}"
DRY_RUN="${DRY_RUN:-0}"
MESH_ONLY_C_STAR="${MESH_ONLY_C_STAR:-0}"
# 12 c* tokens on Chain 138 (symbol:address)
declare -a C_STAR_SYMS=(cUSDT cUSDC cEURC cEURT cGBPC cGBPT cAUDC cJPYC cCHFC cCADC cXAUC cXAUT)
declare -a C_STAR_ADDRS=(
0x93E66202A11B1772E55407B32B44e5Cd8eda7f22
0xf22258f57794CC8E06237084b353Ab30fFfa640b
0x8085961F9cF02b4d800A3c6d386D31da4B34266a
0xdf4b71c61E5912712C1Bdd451416B9aC26949d72
0x003960f16D9d34F2e98d62723B6721Fb92074aD2
0x350f54e4D23795f86A9c03988c7135357CCaD97c
0xD51482e567c03899eecE3CAe8a058161FD56069D
0xEe269e1226a334182aace90056EE4ee5Cc8A6770
0x873990849DDa5117d7C644f0aF24370797C03885
0x54dBd40cF05e15906A2C21f600937e96787f5679
0x290E52a8819A4fbD0714E517225429aA2B70EC6b
0x94e408E26c6FD8F4ee00b54dF19082FDA07dC96E
)
[[ -n "${PRIVATE_KEY:-}" ]] || { echo "PRIVATE_KEY not set"; exit 1; }
[[ -n "$INT" ]] || { echo "DODO_PMM_INTEGRATION_ADDRESS (or DODO_PMM_INTEGRATION) not set"; exit 1; }
[[ -n "$PROV" ]] || { echo "DODO_PMM_PROVIDER_ADDRESS not set"; exit 1; }
# Official USDT/USDC on 138 (from integration if available)
OFFICIAL_USDT="${OFFICIAL_USDT_ADDRESS:-0x004b63A7B5b0E06f6bB6adb4a5F9f590BF3182D1}"
OFFICIAL_USDC="${OFFICIAL_USDC_ADDRESS:-}"
if [[ -z "$OFFICIAL_USDC" ]] && command -v cast &>/dev/null; then
OFFICIAL_USDC=$(cast call "$INT" "officialUSDC()(address)" --rpc-url "$RPC" 2>/dev/null | cast --to-addr 2>/dev/null || true)
fi
[[ -z "$OFFICIAL_USDC" ]] && OFFICIAL_USDC="0x0000000000000000000000000000000000000000"
created=0
skipped=0
failed=0
pool_exists() {
local base="$1" quote="$2"
local addr
addr=$(cast call "$INT" "pools(address,address)(address)" "$base" "$quote" --rpc-url "$RPC" 2>/dev/null | cast --to-addr 2>/dev/null || echo "0x0")
[[ -n "$addr" && "$addr" != "0x0000000000000000000000000000000000000000" ]]
}
create_pool() {
local base="$1" quote="$2" label="$3"
if pool_exists "$base" "$quote"; then
echo " SKIP $label (pool exists)"
((skipped++)) || true
return 0
fi
if [[ "$DRY_RUN" == "1" ]]; then
echo " [DRY] would create $label"
((created++)) || true
return 0
fi
if cast send "$INT" "createPool(address,address,uint256,uint256,uint256,bool)" \
"$base" "$quote" "$LP_FEE" "$I" "$K" "$TWAP" \
--rpc-url "$RPC" --private-key "$PRIVATE_KEY" --legacy --gas-limit 500000 -q 2>/dev/null; then
local pool_addr
pool_addr=$(cast call "$INT" "pools(address,address)(address)" "$base" "$quote" --rpc-url "$RPC" | cast --to-addr)
echo " OK $label -> $pool_addr"
if [[ -n "$PROV" ]]; then
cast send "$PROV" "registerPool(address,address,address)" "$base" "$quote" "$pool_addr" \
--rpc-url "$RPC" --private-key "$PRIVATE_KEY" --legacy --gas-limit 200000 -q 2>/dev/null && echo " registered with provider" || echo " provider register failed"
fi
((created++)) || true
else
echo " FAIL $label"
((failed++)) || true
fi
}
echo "=== PMM full mesh Chain 138 ==="
echo " Integration: $INT Provider: $PROV RPC: $RPC"
echo " Mesh: c* vs c* (+ c* vs official USDT/USDC if MESH_ONLY_C_STAR != 1)"
echo ""
# 1) All c* vs c* pairs (base < quote by address to avoid duplicates)
n=${#C_STAR_ADDRS[@]}
for ((i=0; i<n; i++)); do
for ((j=i+1; j<n; j++)); do
base="${C_STAR_ADDRS[$i]}"
quote="${C_STAR_ADDRS[$j]}"
label="${C_STAR_SYMS[$i]}/${C_STAR_SYMS[$j]}"
create_pool "$base" "$quote" "$label"
done
done
# 2) c* vs official USDT and c* vs official USDC (optional)
if [[ "$MESH_ONLY_C_STAR" != "1" ]] && [[ "$OFFICIAL_USDT" != "0x0000000000000000000000000000000000000000" ]]; then
for ((i=0; i<n; i++)); do
create_pool "${C_STAR_ADDRS[$i]}" "$OFFICIAL_USDT" "${C_STAR_SYMS[$i]}/USDT"
done
fi
if [[ "$MESH_ONLY_C_STAR" != "1" ]] && [[ "$OFFICIAL_USDC" != "0x0000000000000000000000000000000000000000" ]]; then
for ((i=0; i<n; i++)); do
create_pool "${C_STAR_ADDRS[$i]}" "$OFFICIAL_USDC" "${C_STAR_SYMS[$i]}/USDC"
done
fi
echo ""
echo "Done. Created: $created Skipped: $skipped Failed: $failed"
exec "$PROJECT_ROOT/scripts/deployment/sync-chain138-pmm-pools-from-json.sh" "$@"
+16
View File
@@ -8,6 +8,22 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
ENV_FILE="${PROJECT_ROOT}/.env"
log() {
+16
View File
@@ -9,6 +9,22 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Load environment variables
if [ -f "${PROJECT_ROOT}/.env" ]; then
@@ -8,9 +8,24 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Load environment
source .env 2>/dev/null || true
TARGET_WETH9="0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"
TARGET_WETH10="0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9F"
+16
View File
@@ -12,6 +12,22 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
TERRAFORM_DIR="$PROJECT_ROOT/terraform"
REGION="${1:-northeurope}"
@@ -33,13 +33,6 @@ load_deployment_env
parse_deploy_tag "$@"
DO_DEPLOY="${DO_DEPLOY:-0}"
# Load .env (load_deployment_env already did; keep for any vars set after)
if [ -f .env ]; then
set -a
source .env
set +a
fi
# Infura: use Basic Auth URL when INFURA_PROJECT_SECRET is set (fixes "error sending request" from Infura)
SCRIPT_LIB="$SCRIPT_DIR/../lib"
[ -f "${SCRIPT_LIB}/infura.sh" ] && source "${SCRIPT_LIB}/infura.sh"
+16 -1
View File
@@ -6,7 +6,22 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
source .env 2>/dev/null || true
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
RPC="${CRONOS_RPC_URL:-https://evm.cronos.org}"
CONTRACTS=(
@@ -7,6 +7,22 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
RPC="${CRONOS_RPC_URL:-https://evm.cronos.org}"
CONTRACTS=(
+16
View File
@@ -5,6 +5,22 @@
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
ENV_FILE="${1:-$REPO_ROOT/.env}"
get_var() {
@@ -11,6 +11,22 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
log_info "=== Deployment Status Check ==="
+16
View File
@@ -6,6 +6,22 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
ENV_FILE="${PROJECT_ROOT}/.env"
echo "=== .env check (keys only, no values) ==="
@@ -10,7 +10,16 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
[[ -f "$PROJECT_ROOT/.env" ]] && set -a && source "$PROJECT_ROOT/.env" && set +a
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "$PROJECT_ROOT"
elif [[ -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
fi
CHAIN="${1:-all}"
REQUIRED_LINK="20" # 10 per WETH9 bridge + 10 per WETH10 bridge
@@ -21,10 +30,10 @@ LINK_TOKEN_CRONOS="${LINK_TOKEN_CRONOS:-${CCIP_CRONOS_LINK_TOKEN:-0x8c80A01F461f
LINK_TOKEN_CELO="${LINK_TOKEN_CELO:-${CCIP_CELO_LINK_TOKEN:-0xd07294e6E917e07dfDcee882dd1e2565085C2ae0}}"
LINK_TOKEN_WEMIX="${LINK_TOKEN_WEMIX:-${CCIP_WEMIX_LINK_TOKEN:-0x80f1FcdC96B55e459BF52b998aBBE2c364935d69}}"
GNOSIS_RPC="${GNOSIS_RPC:-https://rpc.gnosischain.com}"
CRONOS_RPC="${CRONOS_RPC:-https://evm.cronos.org}"
CELO_RPC="${CELO_RPC:-https://forno.celo.org}"
WEMIX_RPC="${WEMIX_RPC:-https://api.wemix.com}"
GNOSIS_RPC="${GNOSIS_RPC:-${GNOSIS_MAINNET_RPC:-https://rpc.gnosischain.com}}"
CRONOS_RPC="${CRONOS_RPC:-${CRONOS_RPC_URL:-https://evm.cronos.org}}"
CELO_RPC="${CELO_RPC:-${CELO_MAINNET_RPC:-https://forno.celo.org}}"
WEMIX_RPC="${WEMIX_RPC:-${WEMIX_MAINNET_RPC:-https://api.wemix.com}}"
if [[ -z "${PRIVATE_KEY:-}" ]]; then
echo "Error: Set PRIVATE_KEY in .env" >&2
@@ -42,7 +51,7 @@ check_link() {
local name="$1" rpc="$2" link_token="$3"
[[ -z "$rpc" || -z "$link_token" ]] && return 1
local raw
raw=$(cast call "$link_token" "balanceOf(address)(uint256)" "$DEPLOYER" --rpc-url "$rpc" 2>/dev/null || echo "0")
raw=$(cast call "${link_token,,}" "balanceOf(address)(uint256)" "${DEPLOYER,,}" --rpc-url "$rpc" 2>/dev/null || echo "0")
local link_val
link_val=$(echo "scale=4; $raw / 1000000000000000000" | bc 2>/dev/null || echo "0")
if [[ -z "$link_val" || "$link_val" == "0" ]]; then
@@ -7,6 +7,22 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Load environment variables
@@ -7,6 +7,22 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Colors
+16
View File
@@ -11,6 +11,22 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
log_info "=== RPC Endpoint Status Check for Chain ID 138 ==="
+16
View File
@@ -5,6 +5,22 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$REPO_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
FAIL=0
@@ -8,6 +8,22 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Colors
@@ -55,6 +55,22 @@ echo "PHASE 2: STORE NODE SECRETS"
echo "======================================================================"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
bash scripts/key-management/store-nodes-in-keyvault.sh 2>&1 | tee /tmp/store-secrets.log
@@ -11,9 +11,13 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
[[ -f "$SCRIPT_DIR/../lib/init.sh" ]] && source "$SCRIPT_DIR/../lib/init.sh" 2>/dev/null || true
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
if [[ -f "$PROJECT_ROOT/.env" ]]; then
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "$PROJECT_ROOT"
elif [[ -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
fi
@@ -26,11 +30,15 @@ CELO_SELECTOR="${CELO_SELECTOR:-1346049177634351622}"
WEMIX_SELECTOR="${WEMIX_SELECTOR:-5142893604156789321}"
CHAIN138_SELECTOR="${CHAIN138_SELECTOR:-}"
CHAIN138_RPC="${CHAIN138_RPC:-${RPC_URL:-https://rpc-core.d-bis.org}}"
GNOSIS_RPC="${GNOSIS_RPC:-https://rpc.gnosischain.com}"
CRONOS_RPC="${CRONOS_RPC:-https://evm.cronos.org}"
CELO_RPC="${CELO_RPC:-https://forno.celo.org}"
WEMIX_RPC="${WEMIX_RPC:-https://api.wemix.com}"
# Prefer LAN/core RPC for 138 when set (matches fund / deploy scripts).
CHAIN138_RPC="${RPC_URL_138:-${CHAIN138_RPC:-${RPC_URL:-https://rpc-core.d-bis.org}}}"
CHAIN138_RPC="${CHAIN138_RPC//$'\r'/}"
CHAIN138_RPC="${CHAIN138_RPC//$'\n'/}"
# Align with fund-ccip-bridges-with-link.sh / .env.example (MAINNET_RPC aliases).
GNOSIS_RPC="${GNOSIS_RPC:-${GNOSIS_MAINNET_RPC:-https://rpc.gnosischain.com}}"
CRONOS_RPC="${CRONOS_RPC:-${CRONOS_RPC_URL:-https://evm.cronos.org}}"
CELO_RPC="${CELO_RPC:-${CELO_MAINNET_RPC:-https://forno.celo.org}}"
WEMIX_RPC="${WEMIX_RPC:-${WEMIX_MAINNET_RPC:-https://api.wemix.com}}"
PRIVATE_KEY="${PRIVATE_KEY:-}"
if [[ -n "$PRIVATE_KEY" && ! "$PRIVATE_KEY" =~ ^0x ]]; then
@@ -38,18 +46,22 @@ if [[ -n "$PRIVATE_KEY" && ! "$PRIVATE_KEY" =~ ^0x ]]; then
fi
# Chain 138 bridge addresses (required)
WETH9_138=$(grep "CCIPWETH9_BRIDGE_CHAIN138=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "' || echo "${CCIPWETH9_BRIDGE_CHAIN138:-}")
WETH10_138=$(grep "CCIPWETH10_BRIDGE_CHAIN138=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "' || echo "${CCIPWETH10_BRIDGE_CHAIN138:-}")
WETH9_138=$(grep "CCIPWETH9_BRIDGE_CHAIN138=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "\r\n' || echo "${CCIPWETH9_BRIDGE_CHAIN138:-}")
WETH10_138=$(grep "CCIPWETH10_BRIDGE_CHAIN138=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "\r\n' || echo "${CCIPWETH10_BRIDGE_CHAIN138:-}")
# Config-ready chain bridge addresses (optional; if set, we configure them)
WETH9_GNOSIS=$(grep "CCIPWETH9_BRIDGE_GNOSIS=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "' || echo "${CCIPWETH9_BRIDGE_GNOSIS:-}")
WETH10_GNOSIS=$(grep "CCIPWETH10_BRIDGE_GNOSIS=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "' || echo "${CCIPWETH10_BRIDGE_GNOSIS:-}")
WETH9_CRONOS=$(grep "CCIPWETH9_BRIDGE_CRONOS=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "' || echo "${CCIPWETH9_BRIDGE_CRONOS:-}")
WETH10_CRONOS=$(grep "CCIPWETH10_BRIDGE_CRONOS=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "' || echo "${CCIPWETH10_BRIDGE_CRONOS:-}")
WETH9_CELO=$(grep "CCIPWETH9_BRIDGE_CELO=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "' || echo "${CCIPWETH9_BRIDGE_CELO:-}")
WETH10_CELO=$(grep "CCIPWETH10_BRIDGE_CELO=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "' || echo "${CCIPWETH10_BRIDGE_CELO:-}")
WETH9_WEMIX=$(grep "CCIPWETH9_BRIDGE_WEMIX=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "' || echo "${CCIPWETH9_BRIDGE_WEMIX:-}")
WETH10_WEMIX=$(grep "CCIPWETH10_BRIDGE_WEMIX=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "' || echo "${CCIPWETH10_BRIDGE_WEMIX:-}")
WETH9_GNOSIS=$(grep "CCIPWETH9_BRIDGE_GNOSIS=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "\r\n' || echo "${CCIPWETH9_BRIDGE_GNOSIS:-}")
WETH10_GNOSIS=$(grep "CCIPWETH10_BRIDGE_GNOSIS=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "\r\n' || echo "${CCIPWETH10_BRIDGE_GNOSIS:-}")
WETH9_CRONOS=$(grep "CCIPWETH9_BRIDGE_CRONOS=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "\r\n' || echo "${CCIPWETH9_BRIDGE_CRONOS:-}")
WETH10_CRONOS=$(grep "CCIPWETH10_BRIDGE_CRONOS=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "\r\n' || echo "${CCIPWETH10_BRIDGE_CRONOS:-}")
WETH9_CELO=$(grep "CCIPWETH9_BRIDGE_CELO=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "\r\n' || echo "${CCIPWETH9_BRIDGE_CELO:-}")
WETH10_CELO=$(grep "CCIPWETH10_BRIDGE_CELO=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "\r\n' || echo "${CCIPWETH10_BRIDGE_CELO:-}")
WETH9_WEMIX=$(grep "CCIPWETH9_BRIDGE_WEMIX=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "\r\n' || echo "${CCIPWETH9_BRIDGE_WEMIX:-}")
WETH10_WEMIX=$(grep "CCIPWETH10_BRIDGE_WEMIX=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "\r\n' || echo "${CCIPWETH10_BRIDGE_WEMIX:-}")
# Besu eth_call via `cast call` can return -32602; lowercase 20-byte addresses avoids some failures on sends.
WETH9_138="${WETH9_138,,}"
WETH10_138="${WETH10_138,,}"
DRY_RUN="${DRY_RUN:-0}"
@@ -69,10 +81,14 @@ run_or_echo() {
if [[ "$DRY_RUN" = "1" ]]; then
echo " [DRY RUN] $*"
else
if eval "$*" >/dev/null 2>&1; then
# With set -e, _out=$(eval ...) would exit the whole script on failure; use if to absorb it.
local _out
if _out=$(eval "$*" 2>&1); then
log_success " OK"
[[ -n "$_out" ]] && echo " $_out"
else
log_warn " Failed (non-fatal) - run manually to see error"
log_warn " Failed (non-fatal)"
echo " $_out" >&2
fi
fi
}
@@ -90,10 +106,10 @@ configure_chain_138_destination() {
echo " Configuring Chain 138 → $label..."
if [[ -n "$addr9" ]]; then
run_or_echo "cast send $WETH9_138 \"addDestination(uint64,address)\" $selector $addr9 --rpc-url $CHAIN138_RPC --private-key \$PRIVATE_KEY --legacy --gas-limit 200000"
run_or_echo "cast send $WETH9_138 \"addDestination(uint64,address)\" $selector ${addr9,,} --rpc-url $CHAIN138_RPC --private-key \$PRIVATE_KEY --legacy --gas-limit 250000 --gas-price 2000000000"
fi
if [[ -n "$addr10" ]]; then
run_or_echo "cast send $WETH10_138 \"addDestination(uint64,address)\" $selector $addr10 --rpc-url $CHAIN138_RPC --private-key \$PRIVATE_KEY --legacy --gas-limit 200000"
run_or_echo "cast send $WETH10_138 \"addDestination(uint64,address)\" $selector ${addr10,,} --rpc-url $CHAIN138_RPC --private-key \$PRIVATE_KEY --legacy --gas-limit 250000 --gas-price 2000000000"
fi
}
@@ -110,10 +126,10 @@ configure_remote_chain_destination() {
echo " Configuring $label → Chain 138..."
if [[ -n "$addr9" ]]; then
run_or_echo "cast send $addr9 \"addDestination(uint64,address)\" $CHAIN138_SELECTOR $WETH9_138 --rpc-url $rpc --private-key \$PRIVATE_KEY --legacy"
run_or_echo "cast send ${addr9,,} \"addDestination(uint64,address)\" $CHAIN138_SELECTOR $WETH9_138 --rpc-url $rpc --private-key \$PRIVATE_KEY --legacy --gas-limit 400000"
fi
if [[ -n "$addr10" ]]; then
run_or_echo "cast send $addr10 \"addDestination(uint64,address)\" $CHAIN138_SELECTOR $WETH10_138 --rpc-url $rpc --private-key \$PRIVATE_KEY --legacy"
run_or_echo "cast send ${addr10,,} \"addDestination(uint64,address)\" $CHAIN138_SELECTOR $WETH10_138 --rpc-url $rpc --private-key \$PRIVATE_KEY --legacy --gas-limit 400000"
fi
}
+16
View File
@@ -8,6 +8,22 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
log() {
log_success "[✓] $1"
@@ -9,10 +9,20 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
if [[ -f .env ]]; then
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
source .env
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
@@ -25,6 +35,8 @@ CRONOS_SELECTOR="${CRONOS_SELECTOR:-1456215246176062136}"
CHAIN138_SELECTOR="${CHAIN138_SELECTOR:-138}"
CHAIN138_RPC="${RPC_URL_138:-${CHAIN138_RPC:-http://192.168.11.211:8545}}"
CHAIN138_RPC="${CHAIN138_RPC%$'\r'}"
CHAIN138_RPC="${CHAIN138_RPC%$'\n'}"
# Prefer explicit RPC; else Infura (INFURA_PROJECT_ID + optional INFURA_PROJECT_SECRET); else public
_avalanche_infura=$(build_infura_rpc "avalanche-mainnet" 2>/dev/null || true)
_arbitrum_infura=$(build_infura_rpc "arbitrum-mainnet" 2>/dev/null || true)
@@ -41,6 +53,11 @@ WETH10_ARBITRUM="${CCIPWETH10_BRIDGE_ARBITRUM:-}"
WETH9_CRONOS="${CCIPWETH9_BRIDGE_CRONOS:-}"
WETH10_CRONOS="${CCIPWETH10_BRIDGE_CRONOS:-}"
[[ -n "$WETH9_138" ]] && WETH9_138="${WETH9_138,,}"
[[ -n "$WETH10_138" ]] && WETH10_138="${WETH10_138,,}"
_gas138="--legacy --gas-limit 250000 --gas-price 2000000000"
_gas_remote="--legacy --gas-limit 400000"
PRIVATE_KEY="${PRIVATE_KEY:-}"
[[ -n "$PRIVATE_KEY" && ! "$PRIVATE_KEY" =~ ^0x ]] && PRIVATE_KEY="0x$PRIVATE_KEY"
@@ -54,10 +71,13 @@ run_or_echo() {
if [[ "$DRY_RUN" = "1" ]]; then
echo " [DRY RUN] $*"
else
if eval "$*"; then
local _out
if _out=$(eval "$*" 2>&1); then
echo -e " ${GREEN}OK${NC}"
[[ -n "$_out" ]] && echo " $_out"
else
echo -e " ${RED}Failed${NC}"
echo -e " ${RED}Failed${NC}" >&2
echo " $_out" >&2
return 1
fi
fi
@@ -86,20 +106,20 @@ echo ""
# Step A: Chain 138 → Avalanche
if [[ -n "$WETH9_AVALANCHE" || -n "$WETH10_AVALANCHE" ]]; then
echo " Chain 138 → Avalanche:"
[[ -n "$WETH9_AVALANCHE" ]] && run_or_echo "cast send $WETH9_138 'addDestination(uint64,address)' $AVALANCHE_SELECTOR $WETH9_AVALANCHE --rpc-url $CHAIN138_RPC --private-key \$PRIVATE_KEY --legacy" || true
[[ -n "$WETH10_AVALANCHE" ]] && run_or_echo "cast send $WETH10_138 'addDestination(uint64,address)' $AVALANCHE_SELECTOR $WETH10_AVALANCHE --rpc-url $CHAIN138_RPC --private-key \$PRIVATE_KEY --legacy" || true
[[ -n "$WETH9_AVALANCHE" ]] && run_or_echo "cast send $WETH9_138 \"addDestination(uint64,address)\" $AVALANCHE_SELECTOR ${WETH9_AVALANCHE,,} --rpc-url $CHAIN138_RPC --private-key \$PRIVATE_KEY $_gas138" || true
[[ -n "$WETH10_AVALANCHE" && -n "$WETH10_138" ]] && run_or_echo "cast send $WETH10_138 \"addDestination(uint64,address)\" $AVALANCHE_SELECTOR ${WETH10_AVALANCHE,,} --rpc-url $CHAIN138_RPC --private-key \$PRIVATE_KEY $_gas138" || true
fi
# Step A: Chain 138 → Arbitrum
if [[ -n "$WETH9_ARBITRUM" || -n "$WETH10_ARBITRUM" ]]; then
echo " Chain 138 → Arbitrum:"
[[ -n "$WETH9_ARBITRUM" ]] && run_or_echo "cast send $WETH9_138 'addDestination(uint64,address)' $ARBITRUM_SELECTOR $WETH9_ARBITRUM --rpc-url $CHAIN138_RPC --private-key \$PRIVATE_KEY --legacy" || true
[[ -n "$WETH10_ARBITRUM" ]] && run_or_echo "cast send $WETH10_138 'addDestination(uint64,address)' $ARBITRUM_SELECTOR $WETH10_ARBITRUM --rpc-url $CHAIN138_RPC --private-key \$PRIVATE_KEY --legacy" || true
[[ -n "$WETH9_ARBITRUM" ]] && run_or_echo "cast send $WETH9_138 \"addDestination(uint64,address)\" $ARBITRUM_SELECTOR ${WETH9_ARBITRUM,,} --rpc-url $CHAIN138_RPC --private-key \$PRIVATE_KEY $_gas138" || true
[[ -n "$WETH10_ARBITRUM" && -n "$WETH10_138" ]] && run_or_echo "cast send $WETH10_138 \"addDestination(uint64,address)\" $ARBITRUM_SELECTOR ${WETH10_ARBITRUM,,} --rpc-url $CHAIN138_RPC --private-key \$PRIVATE_KEY $_gas138" || true
fi
# Step A: Chain 138 → Cronos
if [[ -n "$WETH9_CRONOS" || -n "$WETH10_CRONOS" ]]; then
echo " Chain 138 → Cronos:"
[[ -n "$WETH9_CRONOS" ]] && run_or_echo "cast send $WETH9_138 'addDestination(uint64,address)' $CRONOS_SELECTOR $WETH9_CRONOS --rpc-url $CHAIN138_RPC --private-key \$PRIVATE_KEY --legacy" || true
[[ -n "$WETH10_CRONOS" ]] && run_or_echo "cast send $WETH10_138 'addDestination(uint64,address)' $CRONOS_SELECTOR $WETH10_CRONOS --rpc-url $CHAIN138_RPC --private-key \$PRIVATE_KEY --legacy" || true
[[ -n "$WETH9_CRONOS" ]] && run_or_echo "cast send $WETH9_138 \"addDestination(uint64,address)\" $CRONOS_SELECTOR ${WETH9_CRONOS,,} --rpc-url $CHAIN138_RPC --private-key \$PRIVATE_KEY $_gas138" || true
[[ -n "$WETH10_CRONOS" && -n "$WETH10_138" ]] && run_or_echo "cast send $WETH10_138 \"addDestination(uint64,address)\" $CRONOS_SELECTOR ${WETH10_CRONOS,,} --rpc-url $CHAIN138_RPC --private-key \$PRIVATE_KEY $_gas138" || true
fi
echo ""
@@ -109,20 +129,20 @@ echo ""
# Step B: Avalanche → Chain 138
if [[ -n "$WETH9_AVALANCHE" || -n "$WETH10_AVALANCHE" ]]; then
echo " Avalanche → Chain 138:"
[[ -n "$WETH9_AVALANCHE" ]] && run_or_echo "cast send $WETH9_AVALANCHE 'addDestination(uint64,address)' $CHAIN138_SELECTOR $WETH9_138 --rpc-url $AVALANCHE_RPC --private-key \$PRIVATE_KEY --legacy" || true
[[ -n "$WETH10_AVALANCHE" ]] && run_or_echo "cast send $WETH10_AVALANCHE 'addDestination(uint64,address)' $CHAIN138_SELECTOR $WETH10_138 --rpc-url $AVALANCHE_RPC --private-key \$PRIVATE_KEY --legacy" || true
[[ -n "$WETH9_AVALANCHE" ]] && run_or_echo "cast send ${WETH9_AVALANCHE,,} \"addDestination(uint64,address)\" $CHAIN138_SELECTOR $WETH9_138 --rpc-url $AVALANCHE_RPC --private-key \$PRIVATE_KEY $_gas_remote" || true
[[ -n "$WETH10_AVALANCHE" && -n "$WETH10_138" ]] && run_or_echo "cast send ${WETH10_AVALANCHE,,} \"addDestination(uint64,address)\" $CHAIN138_SELECTOR $WETH10_138 --rpc-url $AVALANCHE_RPC --private-key \$PRIVATE_KEY $_gas_remote" || true
fi
# Step B: Arbitrum → Chain 138
if [[ -n "$WETH9_ARBITRUM" || -n "$WETH10_ARBITRUM" ]]; then
echo " Arbitrum → Chain 138:"
[[ -n "$WETH9_ARBITRUM" ]] && run_or_echo "cast send $WETH9_ARBITRUM 'addDestination(uint64,address)' $CHAIN138_SELECTOR $WETH9_138 --rpc-url $ARBITRUM_RPC --private-key \$PRIVATE_KEY --legacy" || true
[[ -n "$WETH10_ARBITRUM" ]] && run_or_echo "cast send $WETH10_ARBITRUM 'addDestination(uint64,address)' $CHAIN138_SELECTOR $WETH10_138 --rpc-url $ARBITRUM_RPC --private-key \$PRIVATE_KEY --legacy" || true
[[ -n "$WETH9_ARBITRUM" ]] && run_or_echo "cast send ${WETH9_ARBITRUM,,} \"addDestination(uint64,address)\" $CHAIN138_SELECTOR $WETH9_138 --rpc-url $ARBITRUM_RPC --private-key \$PRIVATE_KEY $_gas_remote" || true
[[ -n "$WETH10_ARBITRUM" && -n "$WETH10_138" ]] && run_or_echo "cast send ${WETH10_ARBITRUM,,} \"addDestination(uint64,address)\" $CHAIN138_SELECTOR $WETH10_138 --rpc-url $ARBITRUM_RPC --private-key \$PRIVATE_KEY $_gas_remote" || true
fi
# Step B: Cronos → Chain 138
if [[ -n "$WETH9_CRONOS" || -n "$WETH10_CRONOS" ]]; then
echo " Cronos → Chain 138:"
[[ -n "$WETH9_CRONOS" ]] && run_or_echo "cast send $WETH9_CRONOS 'addDestination(uint64,address)' $CHAIN138_SELECTOR $WETH9_138 --rpc-url $CRONOS_RPC --private-key \$PRIVATE_KEY --legacy" || true
[[ -n "$WETH10_CRONOS" ]] && run_or_echo "cast send $WETH10_CRONOS 'addDestination(uint64,address)' $CHAIN138_SELECTOR $WETH10_138 --rpc-url $CRONOS_RPC --private-key \$PRIVATE_KEY --legacy" || true
[[ -n "$WETH9_CRONOS" ]] && run_or_echo "cast send ${WETH9_CRONOS,,} \"addDestination(uint64,address)\" $CHAIN138_SELECTOR $WETH9_138 --rpc-url $CRONOS_RPC --private-key \$PRIVATE_KEY $_gas_remote" || true
[[ -n "$WETH10_CRONOS" && -n "$WETH10_138" ]] && run_or_echo "cast send ${WETH10_CRONOS,,} \"addDestination(uint64,address)\" $CHAIN138_SELECTOR $WETH10_138 --rpc-url $CRONOS_RPC --private-key \$PRIVATE_KEY $_gas_remote" || true
fi
echo ""
@@ -1,107 +1,123 @@
#!/bin/bash
#!/usr/bin/env bash
# Configure Chain 138 ↔ Ethereum mainnet CCIP WETH bridge destinations.
# Uses CCIPWETH9Bridge / CCIPWETH10Bridge addDestination(uint64,address) (receiver = peer bridge on the other chain).
# For Gnosis/Cronos/Celo/Wemix, use complete-config-ready-chains.sh instead.
#
# Env: PRIVATE_KEY; bridge addresses (see below); RPC_URL_138; ETHEREUM_MAINNET_RPC or RPC_URL_MAINNET.
#
# shellcheck disable=SC1090
# Configure Bridge Destinations Script
# Configures ChainID 138 ↔ Mainnet bidirectional bridge destinations
set -euo pipefail
set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "$PROJECT_ROOT"
fi
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
NC='\033[0m'
# Configuration
PRIVATE_KEY="${PRIVATE_KEY:-}"
RPC_URL_138="${RPC_URL_138:-http://192.168.11.175:8545}"
RPC_URL_MAINNET="${RPC_URL_MAINNET:-https://eth.llamarpc.com}"
# Chain Selectors
MAINNET_CHAIN_SELECTOR="5009297550715157269"
CHAIN138_CHAIN_SELECTOR="${CHAIN138_CHAIN_SELECTOR:-}" # To be determined
# Contract Addresses (set these after deployment)
WETH9_BRIDGE_138="${WETH9_BRIDGE_138:-}"
WETH10_BRIDGE_138="${WETH10_BRIDGE_138:-}"
WETH9_MAINNET="${WETH9_MAINNET:-0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2}"
WETH10_MAINNET="${WETH10_MAINNET:-0xf4BB2e28688e89fCcE3c0580D37d36A7672E8A9f}"
echo -e "${GREEN}=== Bridge Destination Configuration ===${NC}\n"
# Check prerequisites
if [ -z "$PRIVATE_KEY" ]; then
echo -e "${RED}ERROR: PRIVATE_KEY environment variable not set${NC}"
exit 1
if [[ -n "$PRIVATE_KEY" && ! "$PRIVATE_KEY" =~ ^0x ]]; then
PRIVATE_KEY="0x$PRIVATE_KEY"
fi
if [ -z "$WETH9_BRIDGE_138" ] || [ -z "$WETH10_BRIDGE_138" ]; then
echo -e "${YELLOW}WARNING: Bridge addresses not set. Please set WETH9_BRIDGE_138 and WETH10_BRIDGE_138${NC}"
exit 1
RPC_URL_138="${RPC_URL_138:-http://192.168.11.211:8545}"
RPC_URL_138="${RPC_URL_138%$'\r'}"
RPC_URL_138="${RPC_URL_138%$'\n'}"
RPC_URL_MAINNET="${RPC_URL_MAINNET:-${ETHEREUM_MAINNET_RPC:-https://eth.llamarpc.com}}"
RPC_URL_MAINNET="${RPC_URL_MAINNET%$'\r'}"
RPC_URL_MAINNET="${RPC_URL_MAINNET%$'\n'}"
MAINNET_CHAIN_SELECTOR="${MAINNET_CHAIN_SELECTOR:-5009297550715157269}"
CHAIN138_CHAIN_SELECTOR="${CHAIN138_CHAIN_SELECTOR:-${CHAIN138_SELECTOR:-}}"
# 138-side bridges (aliases match .env CCIP* names)
WETH9_BRIDGE_138="${WETH9_BRIDGE_138:-${CCIPWETH9_BRIDGE_CHAIN138:-}}"
WETH10_BRIDGE_138="${WETH10_BRIDGE_138:-${CCIPWETH10_BRIDGE_CHAIN138:-}}"
# Mainnet peer *bridge* contracts (not WETH token addresses)
WETH9_MAINNET="${WETH9_MAINNET:-${MAINNET_CCIP_WETH9_BRIDGE:-}}"
WETH10_MAINNET="${WETH10_MAINNET:-${MAINNET_CCIP_WETH10_BRIDGE:-}}"
echo -e "${GREEN}=== Bridge destination configuration (138 ↔ Mainnet) ===${NC}\n"
if [[ -z "$PRIVATE_KEY" ]]; then
echo -e "${RED}ERROR: PRIVATE_KEY not set (env or .env)${NC}" >&2
exit 1
fi
if [[ -z "$WETH9_BRIDGE_138" || -z "$WETH10_BRIDGE_138" ]]; then
echo -e "${RED}ERROR: Set WETH9_BRIDGE_138 / WETH10_BRIDGE_138 or CCIPWETH9_BRIDGE_CHAIN138 / CCIPWETH10_BRIDGE_CHAIN138${NC}" >&2
exit 1
fi
if [[ -z "$WETH9_MAINNET" || -z "$WETH10_MAINNET" ]]; then
echo -e "${RED}ERROR: Set mainnet peer bridge addresses: WETH9_MAINNET / WETH10_MAINNET${NC}" >&2
echo -e " (or MAINNET_CCIP_WETH9_BRIDGE / MAINNET_CCIP_WETH10_BRIDGE). These must be the CCIP bridge contracts on Ethereum, not WETH token addresses.${NC}" >&2
exit 1
fi
# Function to add destination
add_destination() {
local bridge_address=$1
local chain_selector=$2
local destination_token=$3
local rpc_url=$4
local network_name=$5
local bridge_address=$1
local chain_selector=$2
local receiver_bridge=$3
local rpc_url=$4
local network_name=$5
echo -e "${GREEN}Adding destination to $network_name bridge...${NC}"
cast send "$bridge_address" \
"addDestination(uint64,address,address)" \
"$chain_selector" \
"$destination_token" \
"0x0000000000000000000000000000000000000000" \
--rpc-url "$rpc_url" \
--private-key "$PRIVATE_KEY" \
--legacy
echo -e "${GREEN}Adding destination on $network_name bridge...${NC}"
cast send "${bridge_address,,}" \
"addDestination(uint64,address)" \
"$chain_selector" \
"${receiver_bridge,,}" \
--rpc-url "$rpc_url" \
--private-key "$PRIVATE_KEY" \
--legacy \
--gas-limit 250000 \
--gas-price 2000000000
echo -e "${GREEN}✓ Destination added${NC}\n"
echo -e "${GREEN}✓ Destination added${NC}\n"
}
# Function to verify destinations
verify_destinations() {
local bridge_address=$1
local rpc_url=$2
local network_name=$3
local bridge_address=$1
local rpc_url=$2
local network_name=$3
echo -e "${GREEN}Verifying destinations on $network_name...${NC}"
local chains=$(cast call "$bridge_address" \
"getDestinationChains()(uint64[])" \
--rpc-url "$rpc_url")
echo -e "${GREEN}Verifying destinations on $network_name...${NC}"
local chains
if chains=$(cast call "${bridge_address,,}" \
"getDestinationChains()(uint64[])" \
--rpc-url "$rpc_url" 2>/dev/null); then
echo -e "${GREEN}Destination chains: $chains${NC}\n"
else
echo -e "${YELLOW}Could not read getDestinationChains (cast/RPC). Try cast rpc eth_call or another RPC.${NC}\n"
fi
}
# Configure ChainID 138 → Mainnet
echo -e "${YELLOW}=== Configuring ChainID 138 → Mainnet ===${NC}\n"
echo -e "${YELLOW}=== Chain 138 → Mainnet ===${NC}\n"
echo -e "${GREEN}1. Configuring WETH9 Bridge (ChainID 138 → Mainnet)${NC}"
add_destination "$WETH9_BRIDGE_138" "$MAINNET_CHAIN_SELECTOR" "$WETH9_MAINNET" "$RPC_URL_138" "ChainID 138"
echo -e "${GREEN}1. WETH9 bridge on 138 → Mainnet peer${NC}"
add_destination "$WETH9_BRIDGE_138" "$MAINNET_CHAIN_SELECTOR" "$WETH9_MAINNET" "$RPC_URL_138" "Chain 138 WETH9"
echo -e "${GREEN}2. Configuring WETH10 Bridge (ChainID 138 → Mainnet)${NC}"
add_destination "$WETH10_BRIDGE_138" "$MAINNET_CHAIN_SELECTOR" "$WETH10_MAINNET" "$RPC_URL_138" "ChainID 138"
echo -e "${GREEN}2. WETH10 bridge on 138 → Mainnet peer${NC}"
add_destination "$WETH10_BRIDGE_138" "$MAINNET_CHAIN_SELECTOR" "$WETH10_MAINNET" "$RPC_URL_138" "Chain 138 WETH10"
# Verify ChainID 138 bridges
echo -e "${YELLOW}=== Verifying ChainID 138 Bridges ===${NC}\n"
echo -e "${YELLOW}=== Verify 138 bridges ===${NC}\n"
verify_destinations "$WETH9_BRIDGE_138" "$RPC_URL_138" "WETH9 Bridge"
verify_destinations "$WETH10_BRIDGE_138" "$RPC_URL_138" "WETH10 Bridge"
# Note: Mainnet → ChainID 138 requires ChainID 138 selector
if [ -z "$CHAIN138_CHAIN_SELECTOR" ]; then
echo -e "${YELLOW}NOTE: ChainID 138 chain selector not set.${NC}"
echo -e "${YELLOW}To configure Mainnet → ChainID 138, first determine the ChainID 138 selector.${NC}"
echo -e "${YELLOW}You can find it using: cast call <CCIP_ROUTER> 'getChainSelector()(uint64)' --rpc-url $RPC_URL_138${NC}\n"
if [[ -z "$CHAIN138_CHAIN_SELECTOR" ]]; then
echo -e "${YELLOW}NOTE: CHAIN138_CHAIN_SELECTOR / CHAIN138_SELECTOR not set.${NC}"
echo -e "${YELLOW}To add Chain 138 as a destination on Mainnet bridges, set the selector then run addDestination on mainnet (see complete-config-ready-chains.sh pattern).${NC}"
echo -e "${YELLOW}Router getChainSelector() may revert on custom routers; see docs/deployment/CHAIN138_SELECTOR_NOTES.md${NC}\n"
else
echo -e "${YELLOW}=== Configuring Mainnet → ChainID 138 ===${NC}\n"
echo -e "${YELLOW}NOTE: This requires deploying bridges on Mainnet first.${NC}\n"
echo -e "${YELLOW}=== Mainnet → Chain 138 ===${NC}"
echo -e "${YELLOW}CHAIN138_CHAIN_SELECTOR=$CHAIN138_CHAIN_SELECTOR — run addDestination on each Mainnet bridge with this selector and the 138 peer bridge address (not automated here).${NC}\n"
fi
echo -e "${GREEN}=== Configuration Complete ===${NC}\n"
echo -e "Next Steps:"
echo -e " 1. Test bidirectional transfers"
echo -e " 2. Monitor bridge activity"
echo -e " 3. Verify LINK token balances for CCIP fees"
echo -e "${GREEN}=== Done ===${NC}\n"
echo -e "Next: fund bridges with LINK; test transfers; monitor fees."
+46 -28
View File
@@ -1,38 +1,56 @@
#!/usr/bin/env bash
# Configure CCIPWETH10Bridge destinations
# Print cast commands to configure CCIPWETH10Bridge (Mainnet ↔ Chain 138).
# For hands-off execution use execute-bridge-config.sh (WETH9 + WETH10).
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
[[ -f "$SCRIPT_DIR/../lib/init.sh" ]] && source "$SCRIPT_DIR/../lib/init.sh" 2>/dev/null || true
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load environment
if [ -f "$PROJECT_ROOT/.env" ]; then
source "$PROJECT_ROOT/.env"
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
fi
MAINNET_RPC="${ETHEREUM_MAINNET_RPC:-https://eth.llamarpc.com}"
CHAIN138_RPC="${RPC_URL:-https://rpc.d-bis.org}"
PRIVATE_KEY="${PRIVATE_KEY}"
if [[ ! "$PRIVATE_KEY" =~ ^0x ]]; then
PRIVATE_KEY="0x$PRIVATE_KEY"
MAINNET_RPC="${MAINNET_RPC%$'\r'}"
MAINNET_RPC="${MAINNET_RPC%$'\n'}"
CHAIN138_RPC="${RPC_URL_138:-${CHAIN138_RPC:-http://192.168.11.211:8545}}"
CHAIN138_RPC="${CHAIN138_RPC%$'\r'}"
CHAIN138_RPC="${CHAIN138_RPC%$'\n'}"
PRIVATE_KEY="${PRIVATE_KEY:-}"
[[ -n "$PRIVATE_KEY" && ! "$PRIVATE_KEY" =~ ^0x ]] && PRIVATE_KEY="0x$PRIVATE_KEY"
WETH10_BRIDGE_MAINNET=$(grep "CCIPWETH10_BRIDGE_MAINNET=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "\r\n' || echo "${CCIPWETH10_BRIDGE_MAINNET:-}")
WETH10_BRIDGE_CHAIN138=$(grep "CCIPWETH10_BRIDGE_CHAIN138=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "\r\n' || echo "${CCIPWETH10_BRIDGE_CHAIN138:-}")
CHAIN138_SELECTOR="${CHAIN138_SELECTOR:-138}"
ETH_SELECTOR="${ETH_MAINNET_SELECTOR:-5009297550715157269}"
WETH10_BRIDGE_MAINNET="${WETH10_BRIDGE_MAINNET,,}"
WETH10_BRIDGE_CHAIN138="${WETH10_BRIDGE_CHAIN138,,}"
if [[ -z "$WETH10_BRIDGE_MAINNET" || -z "$WETH10_BRIDGE_CHAIN138" ]]; then
echo "Error: Set CCIPWETH10_BRIDGE_MAINNET and CCIPWETH10_BRIDGE_CHAIN138 in .env" >&2
exit 1
fi
WETH10_BRIDGE_MAINNET=$(grep "CCIPWETH10_BRIDGE_MAINNET=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "' || echo "")
WETH10_BRIDGE_CHAIN138=$(grep "CCIPWETH10_BRIDGE_CHAIN138=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "' || echo "")
CHAIN138_SELECTOR="${CHAIN138_SELECTOR:-0x000000000000008a}"
ETH_SELECTOR="${ETH_MAINNET_SELECTOR:-0x500147}"
if [ -z "$WETH10_BRIDGE_MAINNET" ] || [ -z "$WETH10_BRIDGE_CHAIN138" ]; then
echo "Error: Bridge addresses not found in .env"
exit 1
fi
echo "Configuring CCIPWETH10Bridge..."
echo " Mainnet Bridge: $WETH10_BRIDGE_MAINNET"
echo " Chain-138 Bridge: $WETH10_BRIDGE_CHAIN138"
echo "To configure, run:"
echo " # On Mainnet:"
echo " cast send $WETH10_BRIDGE_MAINNET \"addDestination(uint64,address)\" $CHAIN138_SELECTOR $WETH10_BRIDGE_CHAIN138 --rpc-url $MAINNET_RPC --private-key $PRIVATE_KEY"
echo " # On Chain-138:"
echo " cast send $WETH10_BRIDGE_CHAIN138 \"addDestination(uint64,address)\" $ETH_SELECTOR $WETH10_BRIDGE_MAINNET --rpc-url $CHAIN138_RPC --private-key $PRIVATE_KEY"
echo "=== CCIPWETH10Bridge — run these cast commands (decimal selectors) ==="
echo ""
echo "# On Ethereum mainnet (add Chain 138 as destination):"
echo "cast send ${WETH10_BRIDGE_MAINNET} \"addDestination(uint64,address)\" ${CHAIN138_SELECTOR} ${WETH10_BRIDGE_CHAIN138} \\"
echo " --rpc-url ${MAINNET_RPC} --private-key \"\$PRIVATE_KEY\" --legacy --gas-limit 400000"
echo ""
echo "# On Chain 138 (add Mainnet as destination):"
echo "cast send ${WETH10_BRIDGE_CHAIN138} \"addDestination(uint64,address)\" ${ETH_SELECTOR} ${WETH10_BRIDGE_MAINNET} \\"
echo " --rpc-url ${CHAIN138_RPC} --private-key \"\$PRIVATE_KEY\" --legacy --gas-limit 250000 --gas-price 2000000000"
echo ""
echo "Or run: ./scripts/deployment/execute-bridge-config.sh"
+46 -28
View File
@@ -1,38 +1,56 @@
#!/usr/bin/env bash
# Configure CCIPWETH9Bridge destinations
# Print cast commands to configure CCIPWETH9Bridge (Mainnet ↔ Chain 138).
# For hands-off execution use execute-bridge-config.sh (WETH9 + WETH10).
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
[[ -f "$SCRIPT_DIR/../lib/init.sh" ]] && source "$SCRIPT_DIR/../lib/init.sh" 2>/dev/null || true
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load environment
if [ -f "$PROJECT_ROOT/.env" ]; then
source "$PROJECT_ROOT/.env"
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
fi
MAINNET_RPC="${ETHEREUM_MAINNET_RPC:-https://eth.llamarpc.com}"
CHAIN138_RPC="${RPC_URL:-https://rpc.d-bis.org}"
PRIVATE_KEY="${PRIVATE_KEY}"
if [[ ! "$PRIVATE_KEY" =~ ^0x ]]; then
PRIVATE_KEY="0x$PRIVATE_KEY"
MAINNET_RPC="${MAINNET_RPC%$'\r'}"
MAINNET_RPC="${MAINNET_RPC%$'\n'}"
CHAIN138_RPC="${RPC_URL_138:-${CHAIN138_RPC:-http://192.168.11.211:8545}}"
CHAIN138_RPC="${CHAIN138_RPC%$'\r'}"
CHAIN138_RPC="${CHAIN138_RPC%$'\n'}"
PRIVATE_KEY="${PRIVATE_KEY:-}"
[[ -n "$PRIVATE_KEY" && ! "$PRIVATE_KEY" =~ ^0x ]] && PRIVATE_KEY="0x$PRIVATE_KEY"
WETH9_BRIDGE_MAINNET=$(grep "CCIPWETH9_BRIDGE_MAINNET=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "\r\n' || echo "${CCIPWETH9_BRIDGE_MAINNET:-}")
WETH9_BRIDGE_CHAIN138=$(grep "CCIPWETH9_BRIDGE_CHAIN138=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "\r\n' || echo "${CCIPWETH9_BRIDGE_CHAIN138:-}")
CHAIN138_SELECTOR="${CHAIN138_SELECTOR:-138}"
ETH_SELECTOR="${ETH_MAINNET_SELECTOR:-5009297550715157269}"
WETH9_BRIDGE_MAINNET="${WETH9_BRIDGE_MAINNET,,}"
WETH9_BRIDGE_CHAIN138="${WETH9_BRIDGE_CHAIN138,,}"
if [[ -z "$WETH9_BRIDGE_MAINNET" || -z "$WETH9_BRIDGE_CHAIN138" ]]; then
echo "Error: Set CCIPWETH9_BRIDGE_MAINNET and CCIPWETH9_BRIDGE_CHAIN138 in .env" >&2
exit 1
fi
WETH9_BRIDGE_MAINNET=$(grep "CCIPWETH9_BRIDGE_MAINNET=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "' || echo "")
WETH9_BRIDGE_CHAIN138=$(grep "CCIPWETH9_BRIDGE_CHAIN138=" "$PROJECT_ROOT/.env" 2>/dev/null | cut -d'=' -f2 | tr -d ' "' || echo "")
CHAIN138_SELECTOR="${CHAIN138_SELECTOR:-0x000000000000008a}"
ETH_SELECTOR="${ETH_MAINNET_SELECTOR:-0x500147}"
if [ -z "$WETH9_BRIDGE_MAINNET" ] || [ -z "$WETH9_BRIDGE_CHAIN138" ]; then
echo "Error: Bridge addresses not found in .env"
exit 1
fi
echo "Configuring CCIPWETH9Bridge..."
echo " Mainnet Bridge: $WETH9_BRIDGE_MAINNET"
echo " Chain-138 Bridge: $WETH9_BRIDGE_CHAIN138"
echo "To configure, run:"
echo " # On Mainnet:"
echo " cast send $WETH9_BRIDGE_MAINNET \"addDestination(uint64,address)\" $CHAIN138_SELECTOR $WETH9_BRIDGE_CHAIN138 --rpc-url $MAINNET_RPC --private-key $PRIVATE_KEY"
echo " # On Chain-138:"
echo " cast send $WETH9_BRIDGE_CHAIN138 \"addDestination(uint64,address)\" $ETH_SELECTOR $WETH9_BRIDGE_MAINNET --rpc-url $CHAIN138_RPC --private-key $PRIVATE_KEY"
echo "=== CCIPWETH9Bridge — run these cast commands (decimal selectors) ==="
echo ""
echo "# On Ethereum mainnet (add Chain 138 as destination):"
echo "cast send ${WETH9_BRIDGE_MAINNET} \"addDestination(uint64,address)\" ${CHAIN138_SELECTOR} ${WETH9_BRIDGE_CHAIN138} \\"
echo " --rpc-url ${MAINNET_RPC} --private-key \"\$PRIVATE_KEY\" --legacy --gas-limit 400000"
echo ""
echo "# On Chain 138 (add Mainnet as destination):"
echo "cast send ${WETH9_BRIDGE_CHAIN138} \"addDestination(uint64,address)\" ${ETH_SELECTOR} ${WETH9_BRIDGE_MAINNET} \\"
echo " --rpc-url ${CHAIN138_RPC} --private-key \"\$PRIVATE_KEY\" --legacy --gas-limit 250000 --gas-price 2000000000"
echo ""
echo "Or run: ./scripts/deployment/execute-bridge-config.sh"
@@ -8,6 +8,22 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
log_info "=== Creating Terraform Backend Storage Account ==="
@@ -10,8 +10,23 @@
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
DOTENV="$REPO_ROOT/.env"
if [[ -f "$DOTENV" ]]; then set -a; source "$DOTENV"; set +a; fi
UNISWAP_V3_FACTORY="${UNISWAP_V3_FACTORY:-0x1F98431c8aD98523631AE4a59f267346ea31F984}"
FEE="${FEE:-500}"
@@ -7,6 +7,22 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
TF_DIR="$PROJECT_ROOT/terraform/well-architected/cloud-sovereignty"
cd "$TF_DIR"
+16 -1
View File
@@ -5,8 +5,23 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
source .env 2>/dev/null || true
RPC_URL="${RPC_URL_138:-http://localhost:8545}"
GAS_PRICE="${GAS_PRICE:-1000000000}"
@@ -7,6 +7,22 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Phase 2 Complete Deployment from Proxy Host"
+16
View File
@@ -8,6 +8,22 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Load environment variables
@@ -8,11 +8,24 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Load .env without strict unset (avoid init.sh pipefail on .env)
set +u
[ -f .env ] && source .env
set -u
[ -f "$SCRIPT_DIR/../lib/infura.sh" ] && source "$SCRIPT_DIR/../lib/infura.sh"
PHASE="${1:-all}"
+16
View File
@@ -11,6 +11,22 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
log_info "=== Deploy All Contracts in Proper Order ==="
+16
View File
@@ -15,6 +15,22 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
if [ -f .env ]; then
set -a
@@ -8,6 +8,22 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Source environment
if [ -f .env ]; then
+16
View File
@@ -9,6 +9,22 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
DEPLOYMENT_LOG="${PROJECT_ROOT}/deployment.log"
CONTRACT_ADDRESSES_FILE="${PROJECT_ROOT}/contracts-deployed.json"
@@ -4,6 +4,22 @@
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
log_info "=== Deploying Bridges on Chain-138 ==="
@@ -14,8 +14,27 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
[[ -f "$PROJECT_ROOT/.env" ]] && set -a && source "$PROJECT_ROOT/.env" && set +a
GNOSIS_RPC="${GNOSIS_RPC:-${GNOSIS_MAINNET_RPC:-}}"
CRONOS_RPC="${CRONOS_RPC:-${CRONOS_RPC_URL:-}}"
CELO_RPC="${CELO_RPC:-${CELO_MAINNET_RPC:-}}"
WEMIX_RPC="${WEMIX_RPC:-${WEMIX_MAINNET_RPC:-}}"
DRY_RUN="${DRY_RUN:-0}"
SIMULATE="${SIMULATE:-0}"
@@ -7,6 +7,22 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Load environment variables
+16
View File
@@ -8,6 +8,22 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Configuration
NAMESPACE="${NAMESPACE:-cacti}"
@@ -9,10 +9,20 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
if [[ -f .env ]]; then
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
source .env
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
+16
View File
@@ -39,6 +39,22 @@ echo "Data Fee Per Byte: $DATA_FEE_PER_BYTE"
# Deploy using Foundry
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
forge script script/DeployCCIPRouter.s.sol \
--rpc-url "$RPC_URL" \
@@ -45,6 +45,22 @@ echo "WETH10 Address: $WETH10_ADDRESS"
echo "Fee Token (LINK): $CCIP_FEE_TOKEN"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Export environment variables for Foundry
export PRIVATE_KEY
@@ -45,6 +45,22 @@ echo "WETH9 Address: $WETH9_ADDRESS"
echo "Fee Token (LINK): $CCIP_FEE_TOKEN"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Export environment variables for Foundry
export PRIVATE_KEY
@@ -7,8 +7,23 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
source .env 2>/dev/null || true
RPC_URL="${RPC_URL:-http://localhost:8545}"
PRIVATE_KEY="${PRIVATE_KEY:-}"
@@ -11,6 +11,22 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Load environment variables
if [ ! -f .env ]; then
@@ -8,6 +8,22 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Load environment variables
if [ ! -f .env ]; then
@@ -8,6 +8,22 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Default values
MODE="${MODE:-ordered}" # ordered or parallel
@@ -8,7 +8,22 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
DOTENV="$REPO_ROOT/.env"
cd "$REPO_ROOT"
if [[ -f "$DOTENV" ]]; then set -a; source "$DOTENV"; set +a; fi
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "$REPO_ROOT"
elif [[ -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
GNOSIS_MAINNET_RPC="${GNOSIS_MAINNET_RPC:-${GNOSIS_RPC:-}}"
CRONOS_RPC_URL="${CRONOS_RPC_URL:-${CRONOS_RPC:-}}"
CELO_MAINNET_RPC="${CELO_MAINNET_RPC:-${CELO_RPC:-}}"
WEMIX_MAINNET_RPC="${WEMIX_MAINNET_RPC:-${WEMIX_RPC:-}}"
# Chain name : chain_id : RPC env var name
CHAINS=(
+16
View File
@@ -8,6 +8,22 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Configuration
NAMESPACE="${NAMESPACE:-firefly}"
@@ -11,10 +11,23 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
set +u
[ -f .env ] && source .env
set -u
[ -f "$SCRIPT_DIR/../lib/infura.sh" ] && source "$SCRIPT_DIR/../lib/infura.sh"
PHASE="${1:-all}"
@@ -5,6 +5,22 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
TERRAFORM_DIR="$PROJECT_ROOT/terraform/well-architected/cloud-sovereignty"
echo "╔════════════════════════════════════════════════════════════════╗"
@@ -8,6 +8,22 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../../" && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Source environment variables
if [ -f .env ]; then
+16
View File
@@ -20,6 +20,22 @@ echo "Deploying Multicall to ChainID 138..."
echo "RPC URL: $RPC_URL"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
forge script script/DeployMulticall.s.sol \
--rpc-url "$RPC_URL" \
+16
View File
@@ -8,6 +8,22 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
RPC_URL="${RPC_URL:-http://localhost:8545}"
PRIVATE_KEY="${PRIVATE_KEY:-}"
@@ -96,6 +96,22 @@ deploy_service() {
fi
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
}
# Main deployment
@@ -7,6 +7,22 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
DODO_DIR="$PROJECT_ROOT/lib/dodo-contractV2"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
if [[ ! -f .env ]]; then
echo "ERROR: .env not found" >&2
@@ -12,6 +12,22 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
if [ -f .env ]; then
set -a
+16
View File
@@ -8,6 +8,22 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
log() {
log_success "[✓] $1"
@@ -8,6 +8,22 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Load environment variables
if [ ! -f .env ]; then
@@ -9,6 +9,22 @@ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Phase 2 Deployment from Proxy Host"
+16
View File
@@ -8,6 +8,22 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
TERRAFORM_DIR="$PROJECT_ROOT/terraform"
log() {
@@ -10,6 +10,22 @@ set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
cd "$PROJECT_ROOT"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Load .env
if [ -f .env ]; then
@@ -8,6 +8,22 @@ set -e
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
# Load .env via dotenv (RPC CR/LF trim). Fallback: raw source.
if [[ -f "$SCRIPT_DIR/../lib/deployment/dotenv.sh" ]]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/../lib/deployment/dotenv.sh"
load_deployment_env --repo-root "${PROJECT_ROOT:-$REPO_ROOT}"
elif [[ -n "${PROJECT_ROOT:-}" && -f "$PROJECT_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$PROJECT_ROOT/.env"
set +a
elif [[ -n "${REPO_ROOT:-}" && -f "$REPO_ROOT/.env" ]]; then
set -a
# shellcheck disable=SC1090
source "$REPO_ROOT/.env"
set +a
fi
# Configuration
NAMESPACE="${NAMESPACE:-besu-network}"

Some files were not shown because too many files have changed in this diff Show More