@@ -5,6 +5,7 @@ pragma solidity ^0.8.11;
55import "@openzeppelin/contracts/utils/Create2.sol " ;
66import "@openzeppelin/contracts/proxy/Clones.sol " ;
77import "@openzeppelin/contracts/utils/Address.sol " ;
8+ import "@openzeppelin/contracts/utils/Multicall.sol " ;
89import "@openzeppelin/contracts/access/AccessControlEnumerable.sol " ;
910import "@openzeppelin/contracts/metatx/ERC2771Context.sol " ;
1011
@@ -13,7 +14,7 @@ import { IByocFactory } from "./interfaces/IByocFactory.sol";
1314import { TWRegistry } from "./TWRegistry.sol " ;
1415import "./ThirdwebContract.sol " ;
1516
16- contract ByocFactory is IByocFactory , ERC2771Context , AccessControlEnumerable {
17+ contract ByocFactory is IByocFactory , ERC2771Context , Multicall , AccessControlEnumerable {
1718 /*///////////////////////////////////////////////////////////////
1819 State variables
1920 //////////////////////////////////////////////////////////////*/
@@ -24,8 +25,8 @@ contract ByocFactory is IByocFactory, ERC2771Context, AccessControlEnumerable {
2425 /// @dev Whether the registry is paused.
2526 bool public isPaused;
2627
27- /// @dev Empty var used in deployment.
28- address public deployer ;
28+ /// @dev contract address deployed through the factory => deployer
29+ mapping ( address => address ) public getContractDeployer ;
2930
3031 /*///////////////////////////////////////////////////////////////
3132 Constructor + modifiers
@@ -56,12 +57,15 @@ contract ByocFactory is IByocFactory, ERC2771Context, AccessControlEnumerable {
5657 uint256 _value ,
5758 string memory publishMetadataUri
5859 ) external onlyUnpausedOrAdmin returns (address deployedAddress ) {
59- deployer = _msgSender ();
60-
6160 require (bytes (publishMetadataUri).length > 0 , "No publish metadata " );
6261
6362 bytes memory contractBytecode = abi.encodePacked (_contractBytecode, _constructorArgs);
64- bytes32 salt = _salt == "" ? keccak256 (abi.encodePacked (_msgSender (), block .number )) : _salt;
63+ bytes32 salt = _salt == ""
64+ ? keccak256 (abi.encodePacked (_msgSender (), block .number , keccak256 (contractBytecode)))
65+ : keccak256 (abi.encodePacked (_msgSender (), _salt));
66+
67+ address computedContractAddress = Create2.computeAddress (salt, keccak256 (contractBytecode), address (this ));
68+ getContractDeployer[computedContractAddress] = _msgSender ();
6569
6670 deployedAddress = Create2.deploy (_value, salt, contractBytecode);
6771
@@ -74,8 +78,6 @@ contract ByocFactory is IByocFactory, ERC2771Context, AccessControlEnumerable {
7478
7579 registry.add (_publisher, deployedAddress);
7680
77- delete deployer;
78-
7981 emit ContractDeployed (_msgSender (), _publisher, deployedAddress);
8082 }
8183
@@ -88,7 +90,13 @@ contract ByocFactory is IByocFactory, ERC2771Context, AccessControlEnumerable {
8890 uint256 _value ,
8991 string memory publishMetadataUri
9092 ) external onlyUnpausedOrAdmin returns (address deployedAddress ) {
91- bytes32 salt = _salt == "" ? keccak256 (abi.encodePacked (_msgSender (), block .number )) : _salt;
93+ bytes32 salt = _salt == ""
94+ ? keccak256 (abi.encodePacked (_msgSender (), block .number , _implementation, _initializeData))
95+ : keccak256 (abi.encodePacked (_msgSender (), _salt));
96+
97+ address computedContractAddress = Clones.predictDeterministicAddress (_implementation, salt, address (this ));
98+ getContractDeployer[computedContractAddress] = _msgSender ();
99+
92100 deployedAddress = Clones.cloneDeterministic (_implementation, salt);
93101
94102 ThirdwebContract (deployedAddress).setPublishMetadataUri (publishMetadataUri);
0 commit comments