@@ -26,33 +26,94 @@ interface IDeployer {
2626
2727struct DeploymentArgs {
2828 address signer;
29- address deployer ;
29+ address factory ;
3030 string salt;
3131}
3232
33+ struct GemGameContractArgs {
34+ address defaultAdmin;
35+ address pauser;
36+ address unpauser;
37+ }
38+
3339contract DeployGemGame is Test {
40+ event GemEarned (address indexed account , uint256 timestamp );
41+
42+ function testDeploy () external {
43+ /// @dev Fork the Immutable zkEVM testnet for this test
44+ string memory rpcURL = "https://rpc.testnet.immutable.com " ;
45+ vm.createSelectFork (rpcURL);
46+
47+ /// @dev These are Immutable zkEVM testnet values where necessary
48+ DeploymentArgs memory deploymentArgs = DeploymentArgs ({
49+ signer: 0xdDA0d9448Ebe3eA43aFecE5Fa6401F5795c19333 ,
50+ factory: 0x37a59A845Bb6eD2034098af8738fbFFB9D589610 ,
51+ salt: "salty "
52+ });
53+
54+ GemGameContractArgs memory gemGameContractArgs = GemGameContractArgs ({
55+ pauser: makeAddr ("pause " ),
56+ unpauser: makeAddr ("unpause " ),
57+ defaultAdmin: makeAddr ("admin " )
58+ });
59+
60+ // Run deployment against forked testnet
61+ GemGame deployedGemGameContract = _deploy (deploymentArgs, gemGameContractArgs);
62+
63+ assertEq (true , deployedGemGameContract.hasRole (keccak256 ("PAUSE " ), gemGameContractArgs.pauser));
64+ assertEq (true , deployedGemGameContract.hasRole (keccak256 ("UNPAUSE " ), gemGameContractArgs.unpauser));
65+ assertEq (
66+ true ,
67+ deployedGemGameContract.hasRole (
68+ deployedGemGameContract.DEFAULT_ADMIN_ROLE (), gemGameContractArgs.defaultAdmin
69+ )
70+ );
71+
72+ // The DEFAULT_ADMIN_ROLE should be revoked from the deployer account
73+ assertEq (
74+ false , deployedGemGameContract.hasRole (deployedGemGameContract.DEFAULT_ADMIN_ROLE (), deploymentArgs.signer)
75+ );
76+
77+ // Earn a gem
78+ vm.expectEmit (true , true , false , false );
79+ emit GemEarned (address (this ), block .timestamp );
80+ deployedGemGameContract.earnGem ();
81+ }
82+
3483 function deploy () external {
3584 address signer = vm.envAddress ("DEPLOYER_ADDRESS " );
36- address deployer = vm.envAddress ("OWNABLE_CREATE3_FACTORY_ADDRESS " );
85+ address factory = vm.envAddress ("OWNABLE_CREATE3_FACTORY_ADDRESS " );
86+ address defaultAdmin = vm.envAddress ("DEFAULT_ADMIN " );
87+ address pauser = vm.envAddress ("PAUSER " );
88+ address unpauser = vm.envAddress ("UNPAUSER " );
3789 string memory salt = vm.envString ("GEM_GAME_SALT " );
3890
39- DeploymentArgs memory deploymentArgs = DeploymentArgs ({signer: signer, deployer: deployer, salt: salt});
91+ DeploymentArgs memory deploymentArgs = DeploymentArgs ({signer: signer, factory: factory, salt: salt});
92+
93+ GemGameContractArgs memory gemGameContractArgs =
94+ GemGameContractArgs ({defaultAdmin: defaultAdmin, pauser: pauser, unpauser: unpauser});
4095
41- _deploy (deploymentArgs);
96+ _deploy (deploymentArgs, gemGameContractArgs );
4297 }
4398
44- function _deploy (DeploymentArgs memory args ) internal returns (GemGame gemGameContract ) {
45- IDeployer ownableCreate3 = IDeployer (args.deployer);
99+ function _deploy (DeploymentArgs memory deploymentArgs , GemGameContractArgs memory gemGameContractArgs )
100+ internal
101+ returns (GemGame gemGameContract )
102+ {
103+ IDeployer ownableCreate3 = IDeployer (deploymentArgs.factory);
46104
47105 // Create deployment bytecode and encode constructor args
48- bytes memory bytecode = abi.encodePacked (type (GemGame).creationCode);
106+ bytes memory deploymentBytecode = abi.encodePacked (
107+ type (GemGame).creationCode,
108+ abi.encode (gemGameContractArgs.defaultAdmin, gemGameContractArgs.pauser, gemGameContractArgs.unpauser)
109+ );
49110
50- bytes32 saltBytes = keccak256 (abi.encode (args .salt));
111+ bytes32 saltBytes = keccak256 (abi.encode (deploymentArgs .salt));
51112
52113 /// @dev Deploy the contract via the Ownable CREATE3 factory
53- vm.startBroadcast (args .signer);
114+ vm.startBroadcast (deploymentArgs .signer);
54115
55- address gemGameContractAddress = ownableCreate3.deploy (bytecode , saltBytes);
116+ address gemGameContractAddress = ownableCreate3.deploy (deploymentBytecode , saltBytes);
56117 gemGameContract = GemGame (gemGameContractAddress);
57118
58119 vm.stopBroadcast ();
0 commit comments