代理合约部署合约

对于已部署的合约,需要做到灵活的调用,应该怎么使用?

对于这种问题,应该使用代理合约实现

// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.30;

contract TestContract1{
    address public owner = msg.sender;

    function setOwner(address _owner) public{
        require(msg.sender == owner, "not owner");
        owner = _owner;
    }
}

contract TestContract2{
    address public owner = msg.sender;
    uint public value = msg.value;
    uint public x;
    uint public y;

    constructor(uint _x, uint _y){
        x = _x;
        y = _y;
    }
}

contract Proxy{

    event Deploy(address);

    fallback() external payable{}

    function deploy(bytes memory _code) external payable returns(address){
        address addr;
        assembly{
            // create(v,p,n)
            // v: amount of ETH to send
            // p: pointer in memory to start of code
            // n: size of code
            // bytecode 数据的实际位置(Solidity 中的字节数组前 32 字节用于存储长度信息)。
            addr := create(
                callvalue(), // v
                add(_code, 0x20), // p
                mload(_code) // n  mload 获取大小
            )
        }
        require(addr != address(0), "deploy failed");
        emit Deploy(addr);
        return addr;
    }

    function execute(address _target, bytes memory _data) external payable{
        (bool success, ) = _target.call{value: msg.value}(_data);
        require(success, "call failed");
    }
}

contract Helper {
    function getBytecode1() external pure returns(bytes memory){
        bytes memory bytecode = type(TestContract1).creationCode;
        return bytecode;
    }

    // 获取字节码
    function getBytecode2(uint _x, uint _y) external pure returns(bytes memory){
        bytes memory bytecode = type(TestContract2).creationCode;
        return abi.encodePacked(bytecode, abi.encode(_x,_y));
    }

    // 获取
    function getCalldata(address _owner) external pure returns(bytes memory){
        return abi.encodeWithSignature("setOwner(address)", _owner);
    }
}