@@ -20,29 +20,68 @@ struct SafeSetup {
20
20
uint256 saltNonce;
21
21
}
22
22
23
- function deployGnosisCore () returns (address factory , address singleton , address fallbackHandler ) {
24
- factory = address (new SafeProxyFactory {salt: "zenith.gnosisFactory " }());
25
- singleton = address (new SafeL2 {salt: "zenith.gnosisSingleton " }());
26
- fallbackHandler = address (new CompatibilityFallbackHandler {salt: "zenith.gnosisFallbackHandlder " }());
27
- }
28
-
29
- function deploySafeInstance (address factory , address singleton , SafeSetup memory setup ) returns (address safe ) {
30
- bytes memory init = abi.encodeWithSignature (
31
- "setup(address[],uint256,address,bytes,address,address,uint256,address) " ,
32
- setup.owners,
33
- setup.threshold,
34
- setup.to,
35
- setup.data,
36
- setup.fallbackHandler,
37
- setup.paymentToken,
38
- setup.payment,
39
- setup.paymentReceiver
40
- );
41
- safe = address (SafeProxyFactory (factory).createProxyWithNonce (singleton, init, setup.saltNonce));
42
- }
23
+ address constant OWNER_ONE = 0x1111111111111111111111111111111111111111 ;
24
+ address constant OWNER_TWO = 0x2222222222222222222222222222222222222222 ;
25
+ bytes32 constant SENTINEL_VALUE = 0x0000000000000000000000000000000000000000000000000000000000000001 ;
43
26
44
27
contract GnosisScript is Script {
45
- bytes32 constant SENTINEL_VALUE = 0x0000000000000000000000000000000000000000000000000000000000000001 ;
28
+ // deploy:
29
+ // forge script GnosisScript --sig "deployGnosis()" --rpc-url $RPC_URL --broadcast [signing args]
30
+ function deployGnosis ()
31
+ public
32
+ returns (address gnosisFactory , address gnosisSingleton , address gnosisFallbackHandler , address usdcAdmin )
33
+ {
34
+ vm.startBroadcast ();
35
+
36
+ // deploy gnosis safe singleton & proxy factory
37
+ (gnosisFactory, gnosisSingleton, gnosisFallbackHandler) = deployGnosisCore ();
38
+
39
+ // deploy a gnosis safe proxy as the USDC admin
40
+ usdcAdmin = deploySafeInstance (gnosisFactory, gnosisSingleton, getUsdcAdminSetup (gnosisFallbackHandler));
41
+ }
42
+
43
+ function deployGnosisCore () public returns (address factory , address singleton , address fallbackHandler ) {
44
+ factory = address (new SafeProxyFactory {salt: "zenith.gnosisFactory " }());
45
+ singleton = address (new SafeL2 {salt: "zenith.gnosisSingleton " }());
46
+ fallbackHandler = address (new CompatibilityFallbackHandler {salt: "zenith.gnosisFallbackHandlder " }());
47
+ }
48
+
49
+ function deploySafeInstance (address factory , address singleton , SafeSetup memory setup )
50
+ public
51
+ returns (address safe )
52
+ {
53
+ bytes memory init = abi.encodeWithSignature (
54
+ "setup(address[],uint256,address,bytes,address,address,uint256,address) " ,
55
+ setup.owners,
56
+ setup.threshold,
57
+ setup.to,
58
+ setup.data,
59
+ setup.fallbackHandler,
60
+ setup.paymentToken,
61
+ setup.payment,
62
+ setup.paymentReceiver
63
+ );
64
+ safe = address (SafeProxyFactory (factory).createProxyWithNonce (singleton, init, setup.saltNonce));
65
+ }
66
+
67
+ // setup the gnosis safe with 2 owners, threshold of 1.
68
+ // make the owners recognizable addrs to aid in inspecting storage layout
69
+ function getUsdcAdminSetup (address fallbackHandler ) public pure returns (SafeSetup memory usdcAdminSetup ) {
70
+ address [] memory owners = new address [](2 );
71
+ owners[0 ] = OWNER_ONE;
72
+ owners[1 ] = OWNER_TWO;
73
+ usdcAdminSetup = SafeSetup ({
74
+ owners: owners,
75
+ threshold: 1 ,
76
+ to: address (0 ),
77
+ data: "" ,
78
+ fallbackHandler: fallbackHandler,
79
+ paymentToken: address (0 ),
80
+ payment: 0 ,
81
+ paymentReceiver: payable (address (0 )),
82
+ saltNonce: 17001
83
+ });
84
+ }
46
85
47
86
// example run:
48
87
// forge script GnosisScript --sig "printOwnerSlots" "[0x1111111111111111111111111111111111111111, 0x2222222222222222222222222222222222222222]"
0 commit comments