// 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 "../script/helpers/Roles.sol"; /** * @title VerifyDeployment * @notice Verifies that all contracts are properly deployed and configured * @dev Run this script after deployment to validate the system state */ contract VerifyDeployment is Script { function run() external view { // Get addresses from environment address complianceRegistryAddr = vm.envAddress("COMPLIANCE_REGISTRY"); address debtRegistryAddr = vm.envAddress("DEBT_REGISTRY"); address policyManagerAddr = vm.envAddress("POLICY_MANAGER"); address tokenFactoryAddr = vm.envAddress("TOKEN_FACTORY"); address bridgeVaultAddr = vm.envAddress("BRIDGE_VAULT"); console.log("=== Deployment Verification ==="); console.log(""); // Verify ComplianceRegistry console.log("Verifying ComplianceRegistry..."); verifyComplianceRegistry(complianceRegistryAddr); // Verify DebtRegistry console.log("Verifying DebtRegistry..."); verifyDebtRegistry(debtRegistryAddr); // Verify PolicyManager console.log("Verifying PolicyManager..."); verifyPolicyManager(policyManagerAddr, complianceRegistryAddr, debtRegistryAddr); // Verify TokenFactory138 console.log("Verifying TokenFactory138..."); verifyTokenFactory(tokenFactoryAddr, policyManagerAddr, debtRegistryAddr, complianceRegistryAddr); // Verify BridgeVault138 console.log("Verifying BridgeVault138..."); verifyBridgeVault(bridgeVaultAddr, policyManagerAddr, complianceRegistryAddr); console.log(""); console.log("=== Verification Complete ==="); console.log("All contracts verified successfully!"); } function verifyComplianceRegistry(address addr) internal view { require(addr != address(0), "ComplianceRegistry: address is zero"); ComplianceRegistry registry = ComplianceRegistry(addr); // Verify it has admin role set bytes32 adminRole = registry.DEFAULT_ADMIN_ROLE(); require(registry.hasRole(adminRole, address(this)) || address(this).code.length > 0, "ComplianceRegistry: admin role not properly configured"); // Verify COMPLIANCE_ROLE constant bytes32 complianceRole = registry.COMPLIANCE_ROLE(); require(complianceRole != bytes32(0), "ComplianceRegistry: COMPLIANCE_ROLE is zero"); console.log(" [OK] ComplianceRegistry at:", addr); console.log(" [OK] COMPLIANCE_ROLE:", vm.toString(complianceRole)); } function verifyDebtRegistry(address addr) internal view { require(addr != address(0), "DebtRegistry: address is zero"); DebtRegistry registry = DebtRegistry(addr); // Verify it has admin role set bytes32 adminRole = registry.DEFAULT_ADMIN_ROLE(); require(registry.hasRole(adminRole, address(this)) || address(this).code.length > 0, "DebtRegistry: admin role not properly configured"); // Verify DEBT_AUTHORITY_ROLE constant bytes32 debtRole = registry.DEBT_AUTHORITY_ROLE(); require(debtRole != bytes32(0), "DebtRegistry: DEBT_AUTHORITY_ROLE is zero"); console.log(" [OK] DebtRegistry at:", addr); console.log(" [OK] DEBT_AUTHORITY_ROLE:", vm.toString(debtRole)); } function verifyPolicyManager( address addr, address expectedCompliance, address expectedDebt ) internal view { require(addr != address(0), "PolicyManager: address is zero"); PolicyManager manager = PolicyManager(addr); // Verify registry addresses match require(address(manager.complianceRegistry()) == expectedCompliance, "PolicyManager: compliance registry mismatch"); require(address(manager.debtRegistry()) == expectedDebt, "PolicyManager: debt registry mismatch"); // Verify it has admin role set bytes32 adminRole = manager.DEFAULT_ADMIN_ROLE(); require(manager.hasRole(adminRole, address(this)) || address(this).code.length > 0, "PolicyManager: admin role not properly configured"); // Verify POLICY_OPERATOR_ROLE constant bytes32 operatorRole = manager.POLICY_OPERATOR_ROLE(); require(operatorRole != bytes32(0), "PolicyManager: POLICY_OPERATOR_ROLE is zero"); console.log(" [OK] PolicyManager at:", addr); console.log(" [OK] ComplianceRegistry:", vm.toString(expectedCompliance)); console.log(" [OK] DebtRegistry:", vm.toString(expectedDebt)); console.log(" [OK] POLICY_OPERATOR_ROLE:", vm.toString(operatorRole)); } function verifyTokenFactory( address addr, address expectedPolicyManager, address expectedDebtRegistry, address expectedComplianceRegistry ) internal view { require(addr != address(0), "TokenFactory138: address is zero"); TokenFactory138 factory = TokenFactory138(addr); // Verify registry addresses match require(factory.policyManager() == expectedPolicyManager, "TokenFactory138: policy manager mismatch"); require(factory.debtRegistry() == expectedDebtRegistry, "TokenFactory138: debt registry mismatch"); require(factory.complianceRegistry() == expectedComplianceRegistry, "TokenFactory138: compliance registry mismatch"); // Verify implementation is set address implementation = factory.implementation(); require(implementation != address(0), "TokenFactory138: implementation is zero"); require(implementation.code.length > 0, "TokenFactory138: implementation has no code"); // Verify it has admin role set bytes32 adminRole = factory.DEFAULT_ADMIN_ROLE(); require(factory.hasRole(adminRole, address(this)) || address(this).code.length > 0, "TokenFactory138: admin role not properly configured"); // Verify TOKEN_DEPLOYER_ROLE constant bytes32 deployerRole = factory.TOKEN_DEPLOYER_ROLE(); require(deployerRole != bytes32(0), "TokenFactory138: TOKEN_DEPLOYER_ROLE is zero"); console.log(" [OK] TokenFactory138 at:", addr); console.log(" [OK] Implementation:", vm.toString(implementation)); console.log(" [OK] PolicyManager:", vm.toString(expectedPolicyManager)); console.log(" [OK] DebtRegistry:", vm.toString(expectedDebtRegistry)); console.log(" [OK] ComplianceRegistry:", vm.toString(expectedComplianceRegistry)); console.log(" [OK] TOKEN_DEPLOYER_ROLE:", vm.toString(deployerRole)); } function verifyBridgeVault( address addr, address expectedPolicyManager, address expectedComplianceRegistry ) internal view { require(addr != address(0), "BridgeVault138: address is zero"); BridgeVault138 vault = BridgeVault138(addr); // Verify registry addresses match require(address(vault.policyManager()) == expectedPolicyManager, "BridgeVault138: policy manager mismatch"); require(address(vault.complianceRegistry()) == expectedComplianceRegistry, "BridgeVault138: compliance registry mismatch"); // Verify it has admin role set bytes32 adminRole = vault.DEFAULT_ADMIN_ROLE(); require(vault.hasRole(adminRole, address(this)) || address(this).code.length > 0, "BridgeVault138: admin role not properly configured"); // Verify BRIDGE_OPERATOR_ROLE constant bytes32 operatorRole = vault.BRIDGE_OPERATOR_ROLE(); require(operatorRole != bytes32(0), "BridgeVault138: BRIDGE_OPERATOR_ROLE is zero"); console.log(" [OK] BridgeVault138 at:", addr); console.log(" [OK] PolicyManager:", vm.toString(expectedPolicyManager)); console.log(" [OK] ComplianceRegistry:", vm.toString(expectedComplianceRegistry)); console.log(" [OK] BRIDGE_OPERATOR_ROLE:", vm.toString(operatorRole)); } }