/ contracts / finance / hedging / MetavaultHedgingManagerFactory.sol
MetavaultHedgingManagerFactory.sol
 1  pragma solidity >=0.6.0;
 2  pragma experimental ABIEncoderV2;
 3  
 4  import "../../deployment/Deployer.sol";
 5  import "../../deployment/ManagedContract.sol";
 6  import "./MetavaultHedgingManager.sol";
 7  
 8  contract MetavaultHedgingManagerFactory is ManagedContract {
 9  
10      address public readerAddr;
11      address public positionManagerAddr;
12      bytes32 public referralCode;
13  
14      address private deployerAddress;
15  
16      event NewHedgingManager(
17          address indexed hedgingManager,
18          address indexed pool
19      );
20  
21      constructor(address _positionManager, address _reader, bytes32 rCode) public {
22          positionManagerAddr = _positionManager;
23          readerAddr = _reader;
24          referralCode = rCode;
25      }
26      
27      function initialize(Deployer deployer) override internal {
28          deployerAddress = address(deployer);
29      }
30  
31      function getRemoteContractAddresses() external view returns (address, address, bytes32) {
32          bytes memory data = abi.encodeWithSelector(bytes4(keccak256("readerAddr()")));
33          bytes memory data1 = abi.encodeWithSelector(bytes4(keccak256("positionManagerAddr()")));
34          bytes memory data2 = abi.encodeWithSelector(bytes4(keccak256("referralCode()")));
35          
36          (, bytes memory returnedData) = getImplementation().staticcall(data);
37          (, bytes memory returnedData1) = getImplementation().staticcall(data1);
38          (, bytes memory returnedData2) = getImplementation().staticcall(data2);
39  
40          address pAddr = abi.decode(returnedData1, (address));
41          address rAddr = abi.decode(returnedData, (address));
42          bytes32 rCode = abi.decode(returnedData2, (bytes32));
43  
44          require(pAddr != address(0), "bad pos manager");
45          require(rAddr != address(0), "bad reader");
46  
47          return (pAddr, rAddr, rCode);
48      }
49  
50      function create(address _poolAddr) external returns (address) {
51          //cant use proxies unless all extenral addrs store here
52          require(deployerAddress != address(0), "bad deployer addr");
53          address hdgMngr = address(
54              new MetavaultHedgingManager(
55                  deployerAddress,
56                  _poolAddr
57              )
58          );
59          /*
60          address proxyAddr = address(
61              new Proxy(
62                  getOwner(),
63                  hdgMngr
64              )
65          );
66          ManagedContract(proxyAddr).initializeAndLock(Deployer(deployerAddress));*/
67          emit NewHedgingManager(hdgMngr, _poolAddr);
68          return hdgMngr;
69      }
70  }