// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import {Script, console} from "forge-std/Script.sol"; import {VaultFactory} from "../../../contracts/vault/VaultFactory.sol"; /** * @title DeployAcVdcSdcVaultsGRU * @notice Create M1 ac/vdc vault pairs with GRU tier + IBAN + policy profile anchors. */ contract DeployAcVdcSdcVaultsGRU is Script { uint8 constant DECIMALS = 6; bool constant DEBT_TRANSFERABLE = true; uint8 constant GRU_TIER_M1 = 2; struct TokenSpec { string envPrimary; string envAlt; string label; } TokenSpec[] internal tokens; function _initTokens() internal { tokens.push(TokenSpec("CUSDC_ADDRESS_138", "COMPLIANT_USDC_ADDRESS", "USDC")); tokens.push(TokenSpec("CUSDT_ADDRESS_138", "COMPLIANT_USDT_ADDRESS", "USDT")); tokens.push(TokenSpec("cEURC_ADDRESS_138", "", "EURC")); tokens.push(TokenSpec("cEURT_ADDRESS_138", "", "EURT")); tokens.push(TokenSpec("cGBPC_ADDRESS_138", "", "GBPC")); tokens.push(TokenSpec("cGBPT_ADDRESS_138", "", "GBPT")); tokens.push(TokenSpec("cAUDC_ADDRESS_138", "", "AUDC")); tokens.push(TokenSpec("cJPYC_ADDRESS_138", "", "JPYC")); tokens.push(TokenSpec("cCHFC_ADDRESS_138", "", "CHFC")); tokens.push(TokenSpec("cCADC_ADDRESS_138", "", "CADC")); tokens.push(TokenSpec("cXAUC_ADDRESS_138", "", "XAUC")); tokens.push(TokenSpec("cXAUT_ADDRESS_138", "", "XAUT")); } function run() external { _initTokens(); uint256 pk = vm.envUint("PRIVATE_KEY"); address deployer = vm.addr(pk); address owner = vm.envOr("OWNER", deployer); address entity = vm.envOr("ENTITY", vm.envOr("GRU_OMNL_ENTITY_ADDRESS", deployer)); address factoryAddr = vm.envAddress("VAULT_FACTORY_ADDRESS"); VaultFactory factory = VaultFactory(factoryAddr); bytes32 ibanHash = vm.envBytes32("GRU_IBAN_HASH"); bytes32 policyProfileKey = vm.envOr("GRU_POLICY_PROFILE_KEY", bytes32(0)); uint256 startIdx = vm.envOr("GRU_VAULT_START_INDEX", uint256(0)); uint256 endIdx = vm.envOr("GRU_VAULT_END_INDEX", tokens.length); vm.startBroadcast(pk); for (uint256 i = startIdx; i < endIdx && i < tokens.length; i++) { address base = _getToken(tokens[i].envPrimary, tokens[i].envAlt); if (base == address(0)) continue; (address vault, address depositToken, address debtToken) = factory.createVaultWithDecimalsGRU( owner, entity, base, base, DECIMALS, DECIMALS, DEBT_TRANSFERABLE, GRU_TIER_M1, ibanHash, policyProfileKey ); console.log(string.concat(tokens[i].label, " vault:"), vault); console.log(string.concat("ac", tokens[i].label, ":"), depositToken); console.log(string.concat("vdc", tokens[i].label, ":"), debtToken); } vm.stopBroadcast(); } function _getToken(string memory primary, string memory altKey) internal view returns (address) { address a = vm.envOr(primary, address(0)); if (a != address(0)) return a; if (bytes(altKey).length == 0) return address(0); return vm.envOr(altKey, address(0)); } }