Skip to content

Commit 1f69dbf

Browse files
committed
Implement new factory
1 parent 5c96541 commit 1f69dbf

File tree

7 files changed

+122
-51
lines changed

7 files changed

+122
-51
lines changed

contracts/CPKFactory.sol

Lines changed: 45 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,69 @@
11
pragma solidity >=0.5.0 <0.7.0;
22

3-
import { Enum } from "@gnosis.pm/safe-contracts/contracts/common/Enum.sol";
4-
import { Proxy } from "@gnosis.pm/safe-contracts/contracts/proxies/Proxy.sol";
3+
import { GnosisSafeProxy } from "@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxy.sol";
54
import { GnosisSafe } from "@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol";
65

6+
import { ProxyImplSetter } from "./ProxyImplSetter.sol";
7+
78
contract CPKFactory {
8-
event ProxyCreation(Proxy proxy);
9+
//keccak256(
10+
// "EIP712Domain(address verifyingContract)"
11+
//);
12+
bytes32 private constant DOMAIN_SEPARATOR_TYPEHASH = 0x035aff83d86937d35b32e04f0ddc6ff469290eef2f1b692d8a815c89404d4749;
13+
14+
//keccak256(
15+
// "SafeTx(address to,uint256 value,bytes data,uint8 operation,uint256 safeTxGas,uint256 baseGas,uint256 gasPrice,address gasToken,address refundReceiver,uint256 nonce)"
16+
//);
17+
bytes32 private constant SAFE_TX_TYPEHASH = 0xbb8310d486368db6bd6f849402fdd73ad53d316b5a4b2644ad6efe0f941286d8;
18+
19+
ProxyImplSetter public proxyImplSetter;
20+
21+
constructor() public {
22+
proxyImplSetter = new ProxyImplSetter();
23+
}
24+
25+
event ProxyCreation(GnosisSafeProxy proxy);
926

1027
function proxyCreationCode() external pure returns (bytes memory) {
11-
return type(Proxy).creationCode;
28+
return type(GnosisSafeProxy).creationCode;
1229
}
1330

1431
function createProxyAndExecTransaction(
15-
address masterCopy,
32+
address owner,
33+
address safeVersion,
1634
uint256 saltNonce,
1735
address fallbackHandler,
18-
address to,
19-
uint256 value,
20-
bytes calldata data,
21-
Enum.Operation operation
36+
bytes calldata execTxCalldata
2237
)
2338
external
39+
payable
2440
returns (bool execTransactionSuccess)
2541
{
26-
GnosisSafe proxy;
27-
bytes memory deploymentData = abi.encodePacked(type(Proxy).creationCode, abi.encode(masterCopy));
28-
bytes32 salt = keccak256(abi.encode(msg.sender, saltNonce));
29-
// solium-disable-next-line security/no-inline-assembly
30-
assembly {
31-
proxy := create2(0x0, add(0x20, deploymentData), mload(deploymentData), salt)
42+
bytes32 salt = keccak256(abi.encode(owner, saltNonce));
43+
44+
address payable proxy;
45+
{
46+
bytes memory deploymentData = abi.encodePacked(
47+
type(GnosisSafeProxy).creationCode,
48+
abi.encode(proxyImplSetter)
49+
);
50+
// solium-disable-next-line security/no-inline-assembly
51+
assembly {
52+
proxy := create2(0x0, add(0x20, deploymentData), mload(deploymentData), salt)
53+
}
54+
require(proxy != address(0), "create2 call failed");
3255
}
33-
require(address(proxy) != address(0), "create2 call failed");
56+
57+
ProxyImplSetter(proxy).setImplementation(safeVersion);
3458

3559
{
3660
address[] memory tmp = new address[](1);
37-
tmp[0] = address(this);
38-
proxy.setup(tmp, 1, address(0), "", fallbackHandler, address(0), 0, address(0));
61+
tmp[0] = address(owner);
62+
GnosisSafe(proxy).setup(tmp, 1, address(0), "", fallbackHandler, address(0), 0, address(0));
3963
}
4064

41-
execTransactionSuccess = proxy.execTransaction(to, value, data, operation, 0, 0, 0, address(0), address(0),
42-
abi.encodePacked(uint(address(this)), uint(0), uint8(1)));
65+
proxy.call.value(msg.value)(execTxCalldata);
4366

44-
proxy.execTransaction(
45-
address(proxy), 0,
46-
abi.encodeWithSignature("swapOwner(address,address,address)", address(1), address(this), msg.sender),
47-
Enum.Operation.Call,
48-
0, 0, 0, address(0), address(0),
49-
abi.encodePacked(uint(address(this)), uint(0), uint8(1))
50-
);
51-
52-
emit ProxyCreation(Proxy(address(proxy)));
53-
}
67+
emit ProxyCreation(GnosisSafeProxy(proxy));
68+
}
5469
}

contracts/CPKFactoryFacade.sol

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
pragma solidity >=0.5.0 <0.7.0;
2+
3+
import { Enum } from "@gnosis.pm/safe-contracts/contracts/common/Enum.sol";
4+
import { CPKFactory } from "./CPKFactory.sol";
5+
6+
contract CPKFactoryFacade {
7+
CPKFactory cpkFactory;
8+
address safeVersion;
9+
uint256 saltNonce;
10+
address fallbackHandler;
11+
12+
constructor(
13+
CPKFactory _cpkFactory,
14+
address _safeVersion,
15+
uint256 _saltNonce,
16+
address _fallbackHandler
17+
) public {
18+
cpkFactory = _cpkFactory;
19+
safeVersion = _safeVersion;
20+
saltNonce = _saltNonce;
21+
fallbackHandler = _fallbackHandler;
22+
}
23+
24+
function execTransaction(
25+
address to,
26+
uint256 value,
27+
bytes calldata data,
28+
Enum.Operation operation,
29+
uint256 safeTxGas,
30+
uint256 baseGas,
31+
uint256 gasPrice,
32+
address gasToken,
33+
address payable refundReceiver,
34+
bytes calldata signature
35+
)
36+
external
37+
payable
38+
returns (bool)
39+
{
40+
address owner;
41+
// solium-disable-next-line security/no-inline-assembly
42+
assembly {
43+
owner := and(
44+
calldataload(add(calldataload(0x124), 0x61)),
45+
0xffffffffffffffffffffffffffffffffffffffff
46+
)
47+
}
48+
49+
return cpkFactory.createProxyAndExecTransaction.value(msg.value)(
50+
owner,
51+
safeVersion,
52+
saltNonce,
53+
fallbackHandler,
54+
msg.data
55+
);
56+
}
57+
}

contracts/Deps.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
pragma solidity >=0.5.0 <0.7.0;
22

3-
import { ProxyFactory } from "@gnosis.pm/safe-contracts/contracts/proxies/ProxyFactory.sol";
3+
import { GnosisSafeProxyFactory } from "@gnosis.pm/safe-contracts/contracts/proxies/GnosisSafeProxyFactory.sol";
44
import { MultiSend } from "@gnosis.pm/safe-contracts/contracts/libraries/MultiSend.sol";
55
import { GnosisSafe } from "@gnosis.pm/safe-contracts/contracts/GnosisSafe.sol";
66
import { DefaultCallbackHandler } from "@gnosis.pm/safe-contracts/contracts/handler/DefaultCallbackHandler.sol";

contracts/ProxyImplSetter.sol

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
pragma solidity >=0.5.0 <0.7.0;
2+
3+
contract ProxyImplSetter {
4+
address implementation;
5+
6+
function setImplementation(address _implementation) external {
7+
implementation = _implementation;
8+
}
9+
}

migrations-ts/1-deploy-contracts.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,22 @@ module.exports = function(deployer: Truffle.Deployer, network: string) {
88
if (network === 'test' || network === 'local') {
99
[
1010
'GnosisSafe',
11-
'ProxyFactory',
11+
'GnosisSafeProxyFactory',
1212
'MultiSend',
1313
'DefaultCallbackHandler',
1414
'Multistep',
1515
'ERC20Mintable',
1616
'ConditionalTokens'
1717
].forEach(deploy);
1818
}
19+
20+
deployer.deploy(
21+
artifacts.require('CPKFactoryFacade'),
22+
artifacts.require('CPKFactory').address,
23+
artifacts.require('GnosisSafe').address,
24+
web3.utils.keccak256(web3.utils.utf8ToHex('Contract Proxy Kit')),
25+
artifacts.require('DefaultCallbackHandler').address,
26+
);
1927
} as Truffle.Migration;
2028

2129
export {};

migrations/1-deploy-contracts.js

Lines changed: 0 additions & 18 deletions
This file was deleted.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
},
5151
"devDependencies": {
5252
"@gnosis.pm/conditional-tokens-contracts": "^0.5.4",
53-
"@gnosis.pm/safe-contracts": "^1.1.1",
53+
"@gnosis.pm/safe-contracts": "gnosis/safe-contracts#development",
5454
"@truffle/hdwallet-provider": "^1.0.40",
5555
"@typechain/truffle-v5": "^2.0.2",
5656
"@types/chai": "^4.2.12",

0 commit comments

Comments
 (0)