@@ -8,8 +8,8 @@ import {IPoolAddressesProvider} from "@aave-v3-core/interfaces/IPoolAddressesPro
88import {SafeERC20} from "@openzeppelin/token/ERC20/utils/SafeERC20.sol " ;
99import {ATokenVaultRevenueSplitterOwner} from "./ATokenVaultRevenueSplitterOwner.sol " ;
1010import {ImmutableATokenVault} from "./ImmutableATokenVault.sol " ;
11- import {CREATE3} from "@solmate/utils/CREATE3.sol " ;
1211import {SSTORE2} from "@solmate/utils/SSTORE2.sol " ;
12+ import {Create2} from "@openzeppelin//utils/Create2.sol " ;
1313
1414/**
1515 * @dev Struct containing constructor parameters for vault deployment
@@ -62,7 +62,7 @@ contract ATokenVaultFactory {
6262 ATokenVaultRevenueSplitterOwner.Recipient[] revenueRecipients
6363 );
6464
65- address immutable VAULT_CREATION_CODE_SSTORE2_POINTER;
65+ address immutable public VAULT_CREATION_CODE_SSTORE2_POINTER;
6666
6767 uint256 internal _nextSalt;
6868
@@ -91,32 +91,31 @@ contract ATokenVaultFactory {
9191
9292 bytes32 salt = bytes32 (_nextSalt++ );
9393
94- address vaultAddress = CREATE3.getDeployed (salt);
94+ bytes memory vaultInitCode = abi.encodePacked (
95+ SSTORE2.read (VAULT_CREATION_CODE_SSTORE2_POINTER),
96+ abi.encode (
97+ params.underlying,
98+ params.referralCode,
99+ params.poolAddressesProvider,
100+ address (this ),
101+ params.initialFee,
102+ params.shareName,
103+ params.shareSymbol,
104+ params.initialLockDeposit
105+ )
106+ );
107+
108+ address vaultAddress = _computeVaultAddress (vaultInitCode, salt);
109+
110+ IERC20 (params.underlying).approve (vaultAddress, params.initialLockDeposit);
111+
112+ _deployVault (vaultInitCode, salt);
95113
96114 address owner = params.owner;
97115 if (params.revenueRecipients.length > 0 ) {
98116 owner = _deployRevenueSplitterOwner (vaultAddress, params.owner, params.revenueRecipients);
99117 }
100-
101- IERC20 (params.underlying).approve (vaultAddress, params.initialLockDeposit);
102-
103- CREATE3.deploy (
104- salt,
105- abi.encodePacked (
106- SSTORE2.read (VAULT_CREATION_CODE_SSTORE2_POINTER),
107- abi.encode (
108- params.underlying,
109- params.referralCode,
110- params.poolAddressesProvider,
111- owner,
112- params.initialFee,
113- params.shareName,
114- params.shareSymbol,
115- params.initialLockDeposit
116- )
117- ),
118- 0
119- );
118+ ImmutableATokenVault (vaultAddress).transferOwnership (owner);
120119
121120 emit VaultDeployed (
122121 vaultAddress,
@@ -152,4 +151,22 @@ contract ATokenVaultFactory {
152151 emit RevenueSplitterOwnerDeployed (revenueSplitter, vaultAddress, owner, revenueRecipients);
153152 return revenueSplitter;
154153 }
154+
155+ function _computeVaultAddress (bytes memory vaultInitCode , bytes32 salt ) internal view returns (address ) {
156+ return Create2.computeAddress (salt, keccak256 (vaultInitCode));
157+ }
158+
159+ function _deployVault (bytes memory vaultInitCode , bytes32 salt ) internal returns (address ) {
160+ address vaultAddress;
161+ assembly {
162+ vaultAddress := create2 (0 , add (vaultInitCode, 32 ), mload (vaultInitCode), salt)
163+ // If the deployment fails, revert bubbling up the error
164+ if iszero (vaultAddress) {
165+ let returnDataSize := returndatasize ()
166+ returndatacopy (0 , 0 , returnDataSize)
167+ revert (0 , returnDataSize)
168+ }
169+ }
170+ return vaultAddress;
171+ }
155172}
0 commit comments