Criar um contrato através de outro contrato

porMatheusem24/05/2022

Nesse artigo iremos abordar sobre como criar um novo contrato através do seu contrato inteligente.

Como criar outro contrato?

Os contratos podem ser criados por outros contratos usando a palavra-chave new. Desde a versão 0.8.0, a palavra-chave new suporta recursos create2 especificando as opções salt.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract Car {
address public owner;
string public model;
address public carAddr;
// Definição do construtor pagável do contrato Car
constructor(address _owner, string memory _model) payable {
owner = _owner;
model = _model;
carAddr = address(this);
}
}
contract CarFactory {
Car[] public cars;
function create(address _owner, string memory _model) public {
Car car = new Car(_owner, _model);
cars.push(car);
}
// Nessa função pagável, além de nós criar um novo
// contrato Car e adicionarmos na matriz cars, também
// enviamos algum ether para o contrato CarFactory
function createAndSendEther(address _owner, string memory _model) public payable {
Car car = (new Car){value: msg.value}(_owner, _model);
cars.push(car);
}
function create2(
address _owner,
string memory _model,
bytes32 _salt
) public {
Car car = (new Car){salt: _salt}(_owner, _model);
cars.push(car);
}
function create2AndSendEther(
address _owner,
string memory _model,
bytes32 _salt
) public payable {
Car car = (new Car){value: msg.value, salt: _salt}(_owner, _model);
cars.push(car);
}
// Função que retorna as informações de um carro
// através do index da matriz
function getCar(uint _index)
public
view
returns (
address owner,
string memory model,
address carAddr,
uint balance
)
{
Car car = cars[_index];
return (car.owner(), car.model(), car.carAddr(), address(car).balance);
}
}

Testar no Remix