// SPDX-License-Identifier: BUSL-1.1 pragma solidity 0.8.24; import {Script, console} from "forge-std/Script.sol"; import {USDR} from "../src/USDR.sol"; import {ReserveManager} from "../src/ReserveManager.sol"; import {SettlementEscrow} from "../src/SettlementEscrow.sol"; import {SolvencyGuard} from "../src/SolvencyGuard.sol"; import {PSM} from "../src/PSM.sol"; import {CDPVault} from "../src/CDPVault.sol"; import {OracleHub} from "../src/OracleHub.sol"; import {LiquidationEngine} from "../src/LiquidationEngine.sol"; import {SurplusBuffer} from "../src/SurplusBuffer.sol"; /// @notice Deploys the full USDR stack on Arbitrum One. /// Env: USDT, USDC, RAIN, TIMELOCK, GUARDIAN, BURN_SINK, MARKET_ADAPTERS (comma-sep, optional) /// After deploy: timelock must configureAsset / configureCollateral / setGroupCeiling, /// then deployer finalizes the guard & escrow adapter sets. contract Deploy is Script { function run() external { address usdtAddr = vm.envAddress("USDT"); address usdcAddr = vm.envAddress("USDC"); address rainAddr = vm.envAddress("RAIN"); address timelock = vm.envAddress("TIMELOCK"); address guardian = vm.envAddress("GUARDIAN"); address burnSink = vm.envAddress("BURN_SINK"); vm.startBroadcast(); USDR usdr = new USDR(); SettlementEscrow escrow = new SettlementEscrow(usdtAddr, usdcAddr); ReserveManager reserve = new ReserveManager(usdtAddr, usdcAddr); SolvencyGuard guard = new SolvencyGuard(); OracleHub oracle = new OracleHub(timelock); PSM psm = new PSM(address(usdr), address(reserve), guardian); CDPVault vault = new CDPVault(address(usdr), address(oracle)); LiquidationEngine engine = new LiquidationEngine(address(vault), address(usdr), address(oracle)); SurplusBuffer buffer = new SurplusBuffer(usdtAddr, rainAddr); usdr.addMinter(address(psm)); usdr.addMinter(address(vault)); usdr.addMinter(address(engine)); usdr.finalizeMinters(); reserve.setup(address(psm), address(escrow), address(guard)); escrow.setup(address(reserve)); guard.setup(address(reserve), address(engine)); vault.setup(timelock, address(engine)); engine.setup(address(guard), address(buffer), timelock); buffer.setup(timelock, address(engine), burnSink); // NOTE: market adapters (live RAIN LMSR/CLOB) must be added to guard+escrow, // then guard.finalize() + escrow.finalize() called, before markets can settle. vm.stopBroadcast(); console.log("USDR:", address(usdr)); console.log("ReserveManager:", address(reserve)); console.log("SettlementEscrow:", address(escrow)); console.log("SolvencyGuard:", address(guard)); console.log("OracleHub:", address(oracle)); console.log("PSM:", address(psm)); console.log("CDPVault:", address(vault)); console.log("LiquidationEngine:", address(engine)); console.log("SurplusBuffer:", address(buffer)); } }