12345678910111213141516171819202122232425262728293031323334353637 |
- // 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;
- }
- }
|