// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "forge-std/Script.sol"; import "../src/ComplianceRegistry.sol"; import "../src/DebtRegistry.sol"; import "../src/PolicyManager.sol"; import "../src/eMoneyToken.sol"; import "../src/TokenFactory138.sol"; import "../src/BridgeVault138.sol"; import "./helpers/Config.sol"; import "./helpers/Roles.sol"; import "./helpers/EnvValidation.sol"; contract DeployScript is Script { using Config for Config.DeploymentConfig; using EnvValidation for string; function run() external { // Validate environment variables uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); vm.startBroadcast(deployerPrivateKey); address deployer = vm.addr(deployerPrivateKey); console.log("Deployer address:", deployer); console.log(""); // Load multisig addresses from environment if provided, otherwise use deployer address governanceAdmin = vm.envOr("GOVERNANCE_MULTISIG", deployer); address tokenDeployer = vm.envOr("TOKEN_DEPLOYER_MULTISIG", deployer); address policyOperator = vm.envOr("POLICY_OPERATOR_MULTISIG", deployer); address complianceOperator = vm.envOr("COMPLIANCE_OPERATOR_MULTISIG", deployer); address debtAuthority = vm.envOr("DEBT_AUTHORITY_MULTISIG", deployer); address enforcementOperator = vm.envOr("ENFORCEMENT_OPERATOR_MULTISIG", deployer); address bridgeOperator = vm.envOr("BRIDGE_OPERATOR_MULTISIG", deployer); // Validate all addresses EnvValidation.validateAddress(governanceAdmin, "governanceAdmin"); EnvValidation.validateAddress(tokenDeployer, "tokenDeployer"); EnvValidation.validateAddress(policyOperator, "policyOperator"); EnvValidation.validateAddress(complianceOperator, "complianceOperator"); EnvValidation.validateAddress(debtAuthority, "debtAuthority"); EnvValidation.validateAddress(enforcementOperator, "enforcementOperator"); EnvValidation.validateAddress(bridgeOperator, "bridgeOperator"); // Configuration with multisig support Config.DeploymentConfig memory config = Config.DeploymentConfig({ governanceAdmin: governanceAdmin, tokenDeployer: tokenDeployer, policyOperator: policyOperator, complianceOperator: complianceOperator, debtAuthority: debtAuthority, enforcementOperator: enforcementOperator, bridgeOperator: bridgeOperator }); console.log("Configuration:"); console.log(" Governance Admin:", config.governanceAdmin); console.log(" Token Deployer:", config.tokenDeployer); console.log(" Policy Operator:", config.policyOperator); console.log(" Compliance Operator:", config.complianceOperator); console.log(" Debt Authority:", config.debtAuthority); console.log(" Enforcement Operator:", config.enforcementOperator); console.log(" Bridge Operator:", config.bridgeOperator); console.log(""); console.log("Deploying ComplianceRegistry..."); ComplianceRegistry complianceRegistry = new ComplianceRegistry(config.governanceAdmin); console.log("ComplianceRegistry deployed at:", address(complianceRegistry)); console.log("Deploying DebtRegistry..."); DebtRegistry debtRegistry = new DebtRegistry(config.governanceAdmin); console.log("DebtRegistry deployed at:", address(debtRegistry)); console.log("Deploying PolicyManager..."); PolicyManager policyManager = new PolicyManager( config.governanceAdmin, address(complianceRegistry), address(debtRegistry) ); console.log("PolicyManager deployed at:", address(policyManager)); console.log("Deploying eMoneyToken implementation..."); eMoneyToken tokenImplementation = new eMoneyToken(); console.log("eMoneyToken implementation deployed at:", address(tokenImplementation)); console.log("Deploying TokenFactory138..."); TokenFactory138 factory = new TokenFactory138( config.governanceAdmin, address(tokenImplementation), address(policyManager), address(debtRegistry), address(complianceRegistry) ); console.log("TokenFactory138 deployed at:", address(factory)); console.log("Deploying BridgeVault138..."); BridgeVault138 bridgeVault = new BridgeVault138( config.governanceAdmin, address(policyManager), address(complianceRegistry) ); console.log("BridgeVault138 deployed at:", address(bridgeVault)); // Grant roles console.log("Granting roles..."); vm.stopBroadcast(); vm.startBroadcast(deployerPrivateKey); factory.grantRole(factory.TOKEN_DEPLOYER_ROLE(), config.tokenDeployer); policyManager.grantRole(policyManager.POLICY_OPERATOR_ROLE(), config.policyOperator); complianceRegistry.grantRole(complianceRegistry.COMPLIANCE_ROLE(), config.complianceOperator); debtRegistry.grantRole(debtRegistry.DEBT_AUTHORITY_ROLE(), config.debtAuthority); bridgeVault.grantRole(bridgeVault.BRIDGE_OPERATOR_ROLE(), config.bridgeOperator); console.log("Deployment complete!"); console.log(""); console.log("=== Deployment Summary ==="); console.log("ComplianceRegistry:", address(complianceRegistry)); console.log("DebtRegistry:", address(debtRegistry)); console.log("PolicyManager:", address(policyManager)); console.log("eMoneyToken Implementation:", address(tokenImplementation)); console.log("TokenFactory138:", address(factory)); console.log("BridgeVault138:", address(bridgeVault)); console.log(""); // Export addresses for verification script console.log("=== Export these addresses to .env ==="); console.log("export COMPLIANCE_REGISTRY=", vm.toString(address(complianceRegistry))); console.log("export DEBT_REGISTRY=", vm.toString(address(debtRegistry))); console.log("export POLICY_MANAGER=", vm.toString(address(policyManager))); console.log("export TOKEN_IMPLEMENTATION=", vm.toString(address(tokenImplementation))); console.log("export TOKEN_FACTORY=", vm.toString(address(factory))); console.log("export BRIDGE_VAULT=", vm.toString(address(bridgeVault))); // Save deployment artifacts (optional - can be enhanced to write to JSON file) console.log(""); console.log("=== Next Steps ==="); console.log("1. Export the addresses above to your .env file"); console.log("2. Run Configure.s.sol to set up initial compliance statuses"); console.log("3. Run VerifyDeployment.s.sol to verify the deployment"); vm.stopBroadcast(); } }