Files
smom-dbis-138/test/integration/UniversalBridge.t.sol
2026-03-02 12:14:09 -08:00

136 lines
4.8 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "forge-std/Test.sol";
import "../../contracts/registry/UniversalAssetRegistry.sol";
import "../../contracts/bridge/UniversalCCIPBridge.sol";
import "../../contracts/bridge/BridgeOrchestrator.sol";
import "../../contracts/governance/GovernanceController.sol";
import "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol";
/**
* @title UniversalBridge Integration Tests
* @notice Comprehensive tests for all asset types through full bridge flow.
* @dev Uses ERC1967Proxy for upgradeable contracts (registry, governance, bridge, orchestrator).
*/
contract UniversalBridgeTest is Test {
UniversalAssetRegistry public registry;
UniversalCCIPBridge public bridge;
BridgeOrchestrator public orchestrator;
GovernanceController public governance;
address public admin;
address public user1;
address public user2;
address public mockCCIPRouter;
function setUp() public {
admin = makeAddr("admin");
user1 = makeAddr("user1");
user2 = makeAddr("user2");
mockCCIPRouter = makeAddr("ccipRouter");
vm.startPrank(admin);
// Deploy upgradeable contracts via proxy (implementations use _disableInitializers())
UniversalAssetRegistry registryImpl = new UniversalAssetRegistry();
bytes memory registryInit = abi.encodeCall(UniversalAssetRegistry.initialize, (admin));
ERC1967Proxy registryProxy = new ERC1967Proxy(address(registryImpl), registryInit);
registry = UniversalAssetRegistry(address(registryProxy));
GovernanceController governanceImpl = new GovernanceController();
bytes memory governanceInit = abi.encodeCall(GovernanceController.initialize, (address(registry), admin));
ERC1967Proxy governanceProxy = new ERC1967Proxy(address(governanceImpl), governanceInit);
governance = GovernanceController(address(governanceProxy));
UniversalCCIPBridge bridgeImpl = new UniversalCCIPBridge();
bytes memory bridgeInit = abi.encodeCall(UniversalCCIPBridge.initialize, (address(registry), mockCCIPRouter, admin));
ERC1967Proxy bridgeProxy = new ERC1967Proxy(address(bridgeImpl), bridgeInit);
bridge = UniversalCCIPBridge(payable(address(bridgeProxy)));
BridgeOrchestrator orchestratorImpl = new BridgeOrchestrator();
bytes memory orchestratorInit = abi.encodeCall(BridgeOrchestrator.initialize, (address(registry), address(bridge), admin));
ERC1967Proxy orchestratorProxy = new ERC1967Proxy(address(orchestratorImpl), orchestratorInit);
orchestrator = BridgeOrchestrator(address(orchestratorProxy));
vm.stopPrank();
}
function testRegisterStandardERC20() public {
vm.startPrank(admin);
address mockToken = makeAddr("mockToken");
vm.etch(mockToken, hex"00"); // Give it code
bytes32 proposalId = registry.proposeAsset(
mockToken,
UniversalAssetRegistry.AssetType.ERC20Standard,
UniversalAssetRegistry.ComplianceLevel.Public,
"Test Token",
"TEST",
18,
"US",
50, // Medium volatility
1e15,
1000000e18
);
assertTrue(proposalId != bytes32(0), "Proposal should be non-zero");
vm.stopPrank();
}
function testGovernanceFlow() public {
vm.startPrank(admin);
// Add validator
registry.addValidator(user1);
// Create proposal
address mockToken = makeAddr("mockToken2");
vm.etch(mockToken, hex"00");
bytes32 proposalId = registry.proposeAsset(
mockToken,
UniversalAssetRegistry.AssetType.Stablecoin,
UniversalAssetRegistry.ComplianceLevel.Public,
"Stablecoin",
"STBL",
6,
"US",
10,
100e6,
10000000e6
);
vm.stopPrank();
// Vote on proposal
vm.prank(user1);
registry.voteOnProposal(proposalId, true);
// Fast forward time
vm.warp(block.timestamp + 2 days);
// Execute proposal
vm.prank(admin);
registry.executeProposal(proposalId);
// Verify asset registered
assertTrue(registry.isAssetActive(mockToken), "Asset should be active");
}
function testBridgeExecution() public {
// Test would bridge a token through the full flow
// This requires mock CCIP router and token contracts
}
function testPMMIntegration() public {
// Test PMM liquidity provision during bridge
}
function testComplianceChecks() public {
// Test compliance verification for different asset types
}
}