// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.13; // --- Script Purpose --- // This script transfers ownership of the deployed PythLazer contract (proxy) to a new owner contract (typically the governance executor contract). // Usage: Run this script after deploying the new executor contract on the target chain. Ensure the executor address is correct and deployed. // Preconditions: // - The LAZER_PROXY_ADDRESS must point to the deployed PythLazer proxy contract. Currently set to 0xACeA761c27A909d4D3895128EBe6370FDE2dF481, which was made using createX. // - The NEW_OWNER must be the deployed executor contract address on this chain. // - The script must be run by the current owner (OLD_OWNER) of the PythLazer contract. // - The DEPLOYER_PRIVATE_KEY environment variable must be set to the current owner's private key. // // Steps: // 1. Log current and new owner addresses, and the proxy address. // 2. Check the current owner matches the expected OLD_OWNER. // 3. Transfer ownership to the NEW_OWNER (executor contract). // 4. Log the new owner for verification. // // Note: This script is intended for use with Foundry (forge-std) tooling. import {Script, console} from "forge-std/Script.sol"; import {PythLazer} from "../src/PythLazer.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import {UUPSUpgradeable} from "@openzeppelin/contracts/proxy/utils/UUPSUpgradeable.sol"; // Main script contract for ownership transfer contract PythLazerChangeOwnership is Script { // Address of the deployed PythLazer proxy contract address public constant LAZER_PROXY_ADDRESS = address(0xACeA761c27A909d4D3895128EBe6370FDE2dF481); // Private key of the current owner, loaded from environment variable uint256 public OLD_OWNER_PRIVATE_KEY = vm.envUint("DEPLOYER_PRIVATE_KEY"); // Current owner address, derived from private key address public OLD_OWNER = vm.addr(OLD_OWNER_PRIVATE_KEY); // Address of the new owner (should be the deployed executor contract) address public NEW_OWNER = vm.envAddress("NEW_OWNER"); // Entry point for the script function run() public { // Log relevant addresses for traceability console.log("Old owner: %s", OLD_OWNER); console.log("New owner: %s", NEW_OWNER); console.log("Lazer proxy address: %s", LAZER_PROXY_ADDRESS); console.log("Lazer owner: %s", PythLazer(LAZER_PROXY_ADDRESS).owner()); console.log("Moving ownership from %s to %s", OLD_OWNER, NEW_OWNER); // Get the PythLazer contract instance at the proxy address PythLazer lazer = PythLazer(LAZER_PROXY_ADDRESS); // Start broadcasting transactions as the old owner vm.startBroadcast(OLD_OWNER_PRIVATE_KEY); // Ensure the current owner matches the expected old owner require(lazer.owner() == OLD_OWNER, "Old owner mismatch"); // Transfer ownership to the new owner (executor contract) lazer.transferOwnership(NEW_OWNER); console.log("Ownership transferred"); // Log the new owner for verification console.log( "New Lazer owner: %s", PythLazer(LAZER_PROXY_ADDRESS).owner() ); // Stop broadcasting vm.stopBroadcast(); } }