38 lines
1.1 KiB
Solidity
38 lines
1.1 KiB
Solidity
// contracts/MyFactoryAccount.sol
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
pragma solidity ^0.8.20;
|
|
|
|
import {Clones} from "../../../proxy/Clones.sol";
|
|
import {Address} from "../../../utils/Address.sol";
|
|
|
|
/**
|
|
* @dev A factory contract to create accounts on demand.
|
|
*/
|
|
contract MyFactoryAccount {
|
|
using Clones for address;
|
|
using Address for address;
|
|
|
|
address private immutable _impl;
|
|
|
|
constructor(address impl_) {
|
|
require(impl_.code.length > 0);
|
|
_impl = impl_;
|
|
}
|
|
|
|
/// @dev Predict the address of the account
|
|
function predictAddress(bytes calldata callData) public view returns (address) {
|
|
return _impl.predictDeterministicAddress(keccak256(callData), address(this));
|
|
}
|
|
|
|
/// @dev Create clone accounts on demand
|
|
function cloneAndInitialize(bytes calldata callData) public returns (address) {
|
|
address predicted = predictAddress(callData);
|
|
if (predicted.code.length == 0) {
|
|
_impl.cloneDeterministic(keccak256(callData));
|
|
predicted.functionCall(callData);
|
|
}
|
|
return predicted;
|
|
}
|
|
}
|