56 lines
2.1 KiB
Solidity
56 lines
2.1 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity ^0.8.19;
|
|
|
|
import "./Greeter.sol";
|
|
import "./interfaces/IGreeter.sol";
|
|
|
|
contract GreeterFactory {
|
|
event GreeterCreated(address indexed greeter, address indexed owner, string initialGreeting);
|
|
event GreeterDestroyed(address indexed greeter, address indexed owner);
|
|
|
|
mapping(address => address[]) private _ownerGreeterInstances;
|
|
mapping(address => bool) private _activeGreeterInstances;
|
|
|
|
function createGreeter(string memory initialGreeting) public returns (address) {
|
|
require(bytes(initialGreeting).length > 0, "Greeting must not be empty");
|
|
|
|
Greeter newGreeter = new Greeter(initialGreeting, msg.sender);
|
|
address greeterAddress = address(newGreeter);
|
|
|
|
_ownerGreeterInstances[msg.sender].push(greeterAddress);
|
|
_activeGreeterInstances[greeterAddress] = true;
|
|
|
|
emit GreeterCreated(greeterAddress, msg.sender, initialGreeting);
|
|
|
|
return greeterAddress;
|
|
}
|
|
|
|
function destroyGreeter(address greeterAddress) public {
|
|
require(_activeGreeterInstances[greeterAddress], "Greeter does not exist or already destroyed");
|
|
|
|
IGreeter greeter = IGreeter(greeterAddress);
|
|
require(greeter.owner() == msg.sender, "Only greeter owner can destroy");
|
|
|
|
delete _activeGreeterInstances[greeterAddress];
|
|
|
|
// Remove from owner's list of greeter instances
|
|
address[] storage ownerGreeteres = _ownerGreeterInstances[msg.sender];
|
|
for (uint i = 0; i < ownerGreeteres.length; i++) {
|
|
if (ownerGreeteres[i] == greeterAddress) {
|
|
ownerGreeteres[i] = ownerGreeteres[ownerGreeteres.length - 1];
|
|
ownerGreeteres.pop();
|
|
break;
|
|
}
|
|
}
|
|
|
|
emit GreeterDestroyed(greeterAddress, msg.sender);
|
|
}
|
|
|
|
function getOwnerGreeterInstances(address owner) public view returns (address[] memory) {
|
|
return _ownerGreeterInstances[owner];
|
|
}
|
|
|
|
function isActiveGreeter(address greeterAddress) public view returns (bool) {
|
|
return _activeGreeterInstances[greeterAddress];
|
|
}
|
|
} |