Nesse artigo iremos aprender a como implantar qualquer contrato na blockchain utilizando o método Proxy.
Implantar qualquer contrato com Proxy
Você pode implantar qualquer contrato através da chamada da função Proxy.deploy(bytes memory _code)
Por exemplo, você pode obter os bytecodes do contrato chamando Helper.getBytecode1
e Helper.getBytecode2
// SPDX-License-Identifier: MITpragma solidity ^0.8.13;contract Proxy {event Deploy(address);fallback() external payable {}function deploy(bytes memory _code) external payable returns (address addr) {assembly {// create(v, p, n)// v = quantidade de ETH para enviar// p = ponteiro na memória para iniciar o código// n = tamanho do códigoaddr := create(callvalue(), add(_code, 0x20), mload(_code))}// retorna um erro caso o endereço seja 0require(addr != address(0), "implementação falhou");emit Deploy(addr);}function execute(address _target, bytes memory _data) external payable {(bool success, ) = _target.call{value: msg.value}(_data);require(success, "falhou");}}// Primeiro contrato para teste de implementaçãocontract TestContract1 {address public owner = msg.sender;function setOwner(address _owner) public {require(msg.sender == owner, "não é o proprietário");owner = _owner;}}// Segundo contrato para teste de implementaçãocontract TestContract2 {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 Helper {// Função que interage com o primeiro contrato TestContract1function getBytecode1() external pure returns (bytes memory) {bytes memory bytecode = type(TestContract1).creationCode;return bytecode;}// Função que interage com o segundo contrato TestContract2function 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);}}