// SPDX-License-Identifier: GPL-3.0
//通过合约部署合约,通过代理合约去部署,
pragma solidity ^0.8.3;
contract TestContract1 {
address public owner = msg.sender;
function setOwner(address _owner) public {//外部可见方法
require(msg.sender == owner, "not owner");
owner = _owner;
}
}
contract TestContract2 {//合约2包含构造函数
address public owner = msg.sender;
uint public value = msg.value;
uint public x;
uint public y;
constructor(uint _x, uint _y) payable {
x = _x;
y = _y;
}
}
contract Proxy {
event Deploy(address);//声明一个事件,通过事件向链外汇报新部署合约地址
function deploy(bytes memory _code) external payable returns (address addr) {//使用部署方法,参数中传入部署合约的机器码,同时可以发送主币的方法和返回新部署合约的新地址
//合约部署的方法,希望部署其他合约时不用重新部署整个合约,现在功能可以把合约的源码机器码输入进来之后就可以部署合约
assembly {//内联汇编
// create(v,p,n)
// v = amount of ETH to send //v代表以太坊中发送主币的数量
// p = pointer in memory to start of code //p代表内存中机器码开始的位置
//n = size of code //n 内存中机器码的大小
addr := create(callvalue(), add(_code, 0x20), mload(_code))//0x20 代表跳过这个位置,callvalue()方法代表这次发送的主币,mload()获取大小,addr去获取返回的地址
}
// returns 写了addr的名字就可以使用隐式返回
require(add! = address(0), "deploy failed";//确认返回地址部署不是0地址,0地址是部署失败
emit Deploy(addr);//触发事件,加上函数事件名和参数就可以触发
new TestContract1();
}
}