-
Notifications
You must be signed in to change notification settings - Fork 706
Expand file tree
/
Copy pathCREATE3.t.sol
More file actions
97 lines (78 loc) · 3.07 KB
/
CREATE3.t.sol
File metadata and controls
97 lines (78 loc) · 3.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity 0.8.15;
import {WETH} from "../tokens/WETH.sol";
import {DSTestPlus} from "./utils/DSTestPlus.sol";
import {MockERC20} from "./utils/mocks/MockERC20.sol";
import {MockAuthChild} from "./utils/mocks/MockAuthChild.sol";
import {CREATE3} from "../utils/CREATE3.sol";
contract Factory {
function deploy(bytes32 salt) public returns (address deployed) {
deployed = CREATE3.deploy(
salt,
abi.encodePacked(type(MockERC20).creationCode, abi.encode("Mock Token", "MOCK", 18)),
0
);
}
}
contract CREATE3Test is DSTestPlus {
function testDeployERC20() public {
bytes32 salt = keccak256(bytes("A salt!"));
MockERC20 deployed = MockERC20(
CREATE3.deploy(
salt,
abi.encodePacked(type(MockERC20).creationCode, abi.encode("Mock Token", "MOCK", 18)),
0
)
);
assertEq(address(deployed), CREATE3.getDeployed(salt));
assertEq(deployed.name(), "Mock Token");
assertEq(deployed.symbol(), "MOCK");
assertEq(deployed.decimals(), 18);
}
function testPredictDeployERC20() public {
bytes32 salt = keccak256(bytes("A salt!"));
Factory factory = new Factory();
MockERC20 deployed = MockERC20(factory.deploy(salt));
assertEq(address(deployed), CREATE3.getDeployed(salt, address(factory)));
assertTrue(address(deployed) != CREATE3.getDeployed(salt));
assertEq(deployed.name(), "Mock Token");
assertEq(deployed.symbol(), "MOCK");
assertEq(deployed.decimals(), 18);
}
function testFailDoubleDeploySameBytecode() public {
bytes32 salt = keccak256(bytes("Salty..."));
CREATE3.deploy(salt, type(MockAuthChild).creationCode, 0);
CREATE3.deploy(salt, type(MockAuthChild).creationCode, 0);
}
function testFailDoubleDeployDifferentBytecode() public {
bytes32 salt = keccak256(bytes("and sweet!"));
CREATE3.deploy(salt, type(WETH).creationCode, 0);
CREATE3.deploy(salt, type(MockAuthChild).creationCode, 0);
}
function testDeployERC20(
bytes32 salt,
string calldata name,
string calldata symbol,
uint8 decimals
) public {
MockERC20 deployed = MockERC20(
CREATE3.deploy(salt, abi.encodePacked(type(MockERC20).creationCode, abi.encode(name, symbol, decimals)), 0)
);
assertEq(address(deployed), CREATE3.getDeployed(salt));
assertEq(deployed.name(), name);
assertEq(deployed.symbol(), symbol);
assertEq(deployed.decimals(), decimals);
}
function testFailDoubleDeploySameBytecode(bytes32 salt, bytes calldata bytecode) public {
CREATE3.deploy(salt, bytecode, 0);
CREATE3.deploy(salt, bytecode, 0);
}
function testFailDoubleDeployDifferentBytecode(
bytes32 salt,
bytes calldata bytecode1,
bytes calldata bytecode2
) public {
CREATE3.deploy(salt, bytecode1, 0);
CREATE3.deploy(salt, bytecode2, 0);
}
}