// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "forge-std/Script.sol"; import "../../contracts/vault/Ledger.sol"; import "../../contracts/vault/RegulatedEntityRegistry.sol"; import "../../contracts/vault/XAUOracle.sol"; import "../../contracts/vault/RateAccrual.sol"; import "../../contracts/vault/adapters/CollateralAdapter.sol"; import "../../contracts/vault/adapters/eMoneyJoin.sol"; import "../../contracts/vault/VaultFactory.sol"; import "../../contracts/vault/Vault.sol"; import "../../contracts/vault/tokens/DepositToken.sol"; import "../../contracts/vault/tokens/DebtToken.sol"; /** * @title DeployVaultSystem * @notice Deployment script for the complete Vault System */ contract DeployVaultSystem is Script { function run() external { uint256 deployerPrivateKey = vm.envUint("PRIVATE_KEY"); address admin = vm.addr(deployerPrivateKey); vm.startBroadcast(deployerPrivateKey); console.log("Deploying Vault System..."); console.log("Admin:", admin); // 1. Deploy Regulated Entity Registry console.log("\n1. Deploying RegulatedEntityRegistry..."); RegulatedEntityRegistry entityRegistry = new RegulatedEntityRegistry(admin); console.log("RegulatedEntityRegistry:", address(entityRegistry)); // 2. Deploy XAU Oracle (requires existing price feed) console.log("\n2. Deploying XAUOracle..."); XAUOracle xauOracle = new XAUOracle(admin); console.log("XAUOracle:", address(xauOracle)); // Note: Price feeds must be added separately after deployment // 3. Deploy Rate Accrual console.log("\n3. Deploying RateAccrual..."); RateAccrual rateAccrual = new RateAccrual(admin); console.log("RateAccrual:", address(rateAccrual)); // 4. Deploy Ledger console.log("\n4. Deploying Ledger..."); Ledger ledger = new Ledger(admin, address(xauOracle), address(rateAccrual)); console.log("Ledger:", address(ledger)); // 5. Deploy Collateral Adapter console.log("\n5. Deploying CollateralAdapter..."); CollateralAdapter collateralAdapter = new CollateralAdapter(admin, address(ledger)); console.log("CollateralAdapter:", address(collateralAdapter)); // Grant vault role to collateral adapter ledger.grantVaultRole(address(collateralAdapter)); // 6. Deploy eMoney Join Adapter console.log("\n6. Deploying eMoneyJoin..."); eMoneyJoin eMoneyJoinAdapter = new eMoneyJoin(admin); console.log("eMoneyJoin:", address(eMoneyJoinAdapter)); // Grant vault role to eMoney join ledger.grantVaultRole(address(eMoneyJoinAdapter)); // 7. Deploy Token Implementations (for UUPS proxies) console.log("\n7. Deploying Token Implementations..."); DepositToken depositTokenImpl = new DepositToken(); DebtToken debtTokenImpl = new DebtToken(); console.log("DepositToken Implementation:", address(depositTokenImpl)); console.log("DebtToken Implementation:", address(debtTokenImpl)); // 8. Deploy Vault Implementation (if using proxy pattern) console.log("\n8. Deploying Vault Implementation..."); Vault vaultImpl = new Vault( address(0), // Placeholder address(0), // Placeholder address(ledger), address(entityRegistry), address(collateralAdapter), address(eMoneyJoinAdapter) ); console.log("Vault Implementation:", address(vaultImpl)); // 9. Deploy Vault Factory console.log("\n9. Deploying VaultFactory..."); VaultFactory vaultFactory = new VaultFactory( admin, address(vaultImpl), address(depositTokenImpl), address(debtTokenImpl), address(ledger), address(entityRegistry), address(collateralAdapter), address(eMoneyJoinAdapter) ); console.log("VaultFactory:", address(vaultFactory)); // 10. Configure initial settings console.log("\n10. Configuring initial settings..."); // Set risk parameters for ETH (M0 collateral) address eth = address(0); ledger.setRiskParameters( eth, 1_000_000e18, // debt ceiling: 1M ETH 11000, // liquidation ratio: 110% 50000 // credit multiplier: 5x ); console.log("Configured ETH risk parameters"); // Approve ETH in collateral adapter collateralAdapter.approveAsset(eth); console.log("Approved ETH in CollateralAdapter"); vm.stopBroadcast(); console.log("\n=== Deployment Complete ==="); console.log("EntityRegistry:", address(entityRegistry)); console.log("XAUOracle:", address(xauOracle)); console.log("RateAccrual:", address(rateAccrual)); console.log("Ledger:", address(ledger)); console.log("CollateralAdapter:", address(collateralAdapter)); console.log("eMoneyJoin:", address(eMoneyJoinAdapter)); console.log("VaultFactory:", address(vaultFactory)); console.log("\nNext Steps:"); console.log("1. Add price feeds to XAUOracle"); console.log("2. Register entities in RegulatedEntityRegistry"); console.log("3. Approve currencies in eMoneyJoin"); console.log("4. Create vaults via VaultFactory"); } }