Skip to content

Commit 251e2ec

Browse files
feat: Deploy vault through CREATE2 instead of CREATE3 - Init lock deposit transfer on constructor forced it
1 parent 6c9643f commit 251e2ec

File tree

1 file changed

+40
-23
lines changed

1 file changed

+40
-23
lines changed

src/ATokenVaultFactory.sol

Lines changed: 40 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ import {IPoolAddressesProvider} from "@aave-v3-core/interfaces/IPoolAddressesPro
88
import {SafeERC20} from "@openzeppelin/token/ERC20/utils/SafeERC20.sol";
99
import {ATokenVaultRevenueSplitterOwner} from "./ATokenVaultRevenueSplitterOwner.sol";
1010
import {ImmutableATokenVault} from "./ImmutableATokenVault.sol";
11-
import {CREATE3} from "@solmate/utils/CREATE3.sol";
1211
import {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

Comments
 (0)