Como implantar qualquer contrato com Proxy

porMatheusem08/06/2022

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: MIT
pragma 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ódigo
addr := create(callvalue(), add(_code, 0x20), mload(_code))
}
// retorna um erro caso o endereço seja 0
require(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ção
contract 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ção
contract 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 TestContract1
function getBytecode1() external pure returns (bytes memory) {
bytes memory bytecode = type(TestContract1).creationCode;
return bytecode;
}
// Função que interage com o segundo contrato TestContract2
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);
}
}

Testar no Remix