Skip to main content

new创建其他合约的合约

Contract that Creates other Contracts

Contracts can be created by other contracts using the new keyword. Since 0.8.0, new keyword supports create2 feature by specifying salt options.

合约可以由其他合约使用关键字创建new。从0.8.0开始,关键字通过指定选项new支持功能。create2salt

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

contract Car {
address public owner;
string public model;
address public carAddr;

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);
}

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);
}

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);
}
}