// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import {Script, console2} from "forge-std/Script.sol"; import {GRUVaultIndex} from "../../../contracts/vault/GRUVaultIndex.sol"; interface IGRUVaultIndexLegacy { function allVaults(uint256 index) external view returns (address); function vaults(address vault) external view returns ( address entity, address baseToken, address depositToken, address debtToken, uint8 gruTier, bytes32 ibanHash, bytes32 policyProfileKey, uint256 recordedAt, bool active ); } /// @notice Import one legacy vault record into new GRUVaultIndex (use GRU_MIGRATE_INDEX). contract ImportGruVaultRecord138 is Script { function run() external { uint256 pk = vm.envUint("PRIVATE_KEY"); address oldIndex = vm.envAddress("OLD_GRU_VAULT_INDEX"); address newIndex = vm.envAddress("NEW_GRU_VAULT_INDEX"); bytes32 policyKey = vm.envBytes32("GRU_POLICY_PROFILE_KEY"); uint256 idx = vm.envUint("GRU_MIGRATE_INDEX"); IGRUVaultIndexLegacy legacy = IGRUVaultIndexLegacy(oldIndex); GRUVaultIndex target = GRUVaultIndex(newIndex); address vault; try legacy.allVaults(idx) returns (address v) { vault = v; } catch { revert("ImportGruVaultRecord138: index out of range"); } ( address entity, address baseToken, address depositToken, address debtToken, uint8 gruTier, bytes32 ibanHash, bytes32 existingKey, uint256 recordedAt, bool active ) = legacy.vaults(vault); require(active, "ImportGruVaultRecord138: inactive"); bytes32 key = existingKey == bytes32(0) ? policyKey : existingKey; vm.startBroadcast(pk); target.importVault( vault, entity, baseToken, depositToken, debtToken, gruTier, ibanHash, key, recordedAt ); vm.stopBroadcast(); console2.log("Imported", vault, "policy", vm.toString(key)); } }