// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import {Script, console} from "forge-std/Script.sol"; import {ISO4217WToken} from "../../contracts/iso4217w/ISO4217WToken.sol"; import {ComplianceGuard} from "../../contracts/iso4217w/ComplianceGuard.sol"; import {ReserveOracle} from "../../contracts/iso4217w/oracle/ReserveOracle.sol"; import {MintController} from "../../contracts/iso4217w/controllers/MintController.sol"; import {BurnController} from "../../contracts/iso4217w/controllers/BurnController.sol"; import {TokenRegistry} from "../../contracts/iso4217w/registry/TokenRegistry.sol"; import {TokenFactory} from "../../contracts/iso4217w/TokenFactory.sol"; /** * @title DeployWTokenSystem * @notice Deployment script for the complete ISO-4217 W Token System */ contract DeployWTokenSystem is Script { function run() external { uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); address admin = vm.addr(deployerPrivateKey); vm.startBroadcast(deployerPrivateKey); console.log("Deploying ISO-4217 W Token System..."); console.log("Admin:", admin); // 1. Deploy Compliance Guard console.log("\n1. Deploying ComplianceGuard..."); ComplianceGuard complianceGuard = new ComplianceGuard(admin); console.log("ComplianceGuard:", address(complianceGuard)); // 2. Deploy Reserve Oracle console.log("\n2. Deploying ReserveOracle..."); ReserveOracle reserveOracle = new ReserveOracle(admin, 3600, 3); // 1 hour staleness, 3 oracles console.log("ReserveOracle:", address(reserveOracle)); // 3. Deploy Mint Controller console.log("\n3. Deploying MintController..."); MintController mintController = new MintController( admin, address(reserveOracle), address(complianceGuard) ); console.log("MintController:", address(mintController)); // 4. Deploy Burn Controller console.log("\n4. Deploying BurnController..."); BurnController burnController = new BurnController(admin); console.log("BurnController:", address(burnController)); // 5. Deploy Token Registry console.log("\n5. Deploying TokenRegistry..."); TokenRegistry tokenRegistry = new TokenRegistry(admin); console.log("TokenRegistry:", address(tokenRegistry)); // 6. Deploy Token Implementation (for UUPS proxies) console.log("\n6. Deploying Token Implementation..."); ISO4217WToken tokenImpl = new ISO4217WToken(); console.log("ISO4217WToken Implementation:", address(tokenImpl)); // 7. Deploy Token Factory console.log("\n7. Deploying TokenFactory..."); TokenFactory tokenFactory = new TokenFactory( admin, address(tokenImpl), address(tokenRegistry), address(complianceGuard), address(reserveOracle), address(mintController), address(burnController) ); console.log("TokenFactory:", address(tokenFactory)); vm.stopBroadcast(); console.log("\n=== Deployment Complete ==="); console.log("ComplianceGuard:", address(complianceGuard)); console.log("ReserveOracle:", address(reserveOracle)); console.log("MintController:", address(mintController)); console.log("BurnController:", address(burnController)); console.log("TokenRegistry:", address(tokenRegistry)); console.log("TokenFactory:", address(tokenFactory)); console.log("\nNext Steps:"); console.log("1. Add oracles to ReserveOracle"); console.log("2. Configure custodian addresses"); console.log("3. Deploy W tokens via TokenFactory (e.g., USDW, EURW, GBPW)"); } }