Skip to content

Commit

Permalink
Double Proxy
Browse files Browse the repository at this point in the history
  • Loading branch information
vasapower committed Jul 13, 2020
1 parent ebaf5c4 commit 49def9f
Show file tree
Hide file tree
Showing 4 changed files with 99 additions and 14 deletions.
67 changes: 67 additions & 0 deletions DoubleProxy.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
pragma solidity ^0.6.0;

import "./IDoubleProxy.sol";

contract DoubleProxy is IDoubleProxy {

address private _proxy;

mapping(address => bool) private _isProxy;

address[] private _proxies;

constructor(address[] memory proxies, address currentProxy) public {
init(proxies, currentProxy);
}

function init(address[] memory proxies, address currentProxy) public override {
require(_proxies.length == 0, "Init already called!");
for(uint256 i = 0; i < proxies.length; i++) {
if(proxies[i] != address(0)) {
_proxies.push(proxies[i]);
_isProxy[proxies[i]] = true;
}
}
if(currentProxy != address(0)) {
_proxy = currentProxy;
if(!_isProxy[currentProxy]) {
_proxies.push(currentProxy);
_isProxy[currentProxy] = true;
}
}
}

function proxy() public override view returns(address) {
return _proxy;
}

function setProxy() public override {
require(_proxy == address(0) || _proxy == msg.sender, _proxy != address(0) ? "Proxy already set!" : "Only Proxy can toggle itself!");
_proxy = _proxy == address(0) ? msg.sender : address(0);
if(_proxy != address(0) && !_isProxy[_proxy]) {
_proxies.push(_proxy);
_isProxy[_proxy] = true;
}
}

function isProxy(address addr) public override view returns(bool) {
return _isProxy[addr];
}

function proxiesLength() public override view returns(uint256) {
return _proxies.length;
}

function proxies() public override view returns(address[] memory) {
return proxies(0, _proxies.length);
}

function proxies(uint256 start, uint256 offset) public override view returns(address[] memory out) {
require(start < _proxies.length, "Invalid start");
uint256 length = offset < _proxies.length ? offset : _proxies.length;
out = new address[](length);
for(uint256 i = start; i < length; i++) {
out[i] = _proxies[i];
}
}
}
11 changes: 11 additions & 0 deletions IDoubleProxy.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
pragma solidity ^0.6.0;

interface IDoubleProxy {
function init(address[] calldata proxies, address currentProxy) external;
function proxy() external view returns(address);
function setProxy() external;
function isProxy(address) external view returns(bool);
function proxiesLength() external view returns(uint256);
function proxies(uint256 start, uint256 offset) external view returns(address[] memory);
function proxies() external view returns(address[] memory);
}
5 changes: 3 additions & 2 deletions IMVDProxy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,16 @@ pragma solidity ^0.6.0;

interface IMVDProxy {

function init(address votingTokenAddress, address functionalityProposalManagerAddress, address stateHolderAddress, address functionalityModelsManagerAddress, address functionalitiesManagerAddress, address walletAddress) external;
function init(address votingTokenAddress, address functionalityProposalManagerAddress, address stateHolderAddress, address functionalityModelsManagerAddress, address functionalitiesManagerAddress, address walletAddress, address doubleProxyAddress) external;

function getDelegates() external view returns(address,address,address,address,address,address);
function getDelegates() external view returns(address[] memory);
function getToken() external view returns(address);
function getMVDFunctionalityProposalManagerAddress() external view returns(address);
function getStateHolderAddress() external view returns(address);
function getMVDFunctionalityModelsManagerAddress() external view returns(address);
function getMVDFunctionalitiesManagerAddress() external view returns(address);
function getMVDWalletAddress() external view returns(address);
function getDoubleProxyAddress() external view returns(address);
function setDelegate(uint256 position, address newAddress) external returns(address oldAddress);
function changeProxy(address newAddress, bytes calldata initPayload) external;
function isValidProposal(address proposal) external view returns (bool);
Expand Down
30 changes: 18 additions & 12 deletions MVDProxy.sol
Original file line number Diff line number Diff line change
Expand Up @@ -14,18 +14,18 @@ contract MVDProxy is IMVDProxy {

address[] private _delegates;

constructor(address votingTokenAddress, address functionalityProposalManagerAddress, address stateHolderAddress, address functionalityModelsManagerAddress, address functionalitiesManagerAddress, address walletAddress) public {
constructor(address votingTokenAddress, address functionalityProposalManagerAddress, address stateHolderAddress, address functionalityModelsManagerAddress, address functionalitiesManagerAddress, address walletAddress, address doubleProxyAddress) public {
if(votingTokenAddress == address(0)) {
return;
}
init(votingTokenAddress, functionalityProposalManagerAddress, stateHolderAddress, functionalityModelsManagerAddress, functionalitiesManagerAddress, walletAddress);
init(votingTokenAddress, functionalityProposalManagerAddress, stateHolderAddress, functionalityModelsManagerAddress, functionalitiesManagerAddress, walletAddress, doubleProxyAddress);
}

function init(address votingTokenAddress, address functionalityProposalManagerAddress, address stateHolderAddress, address functionalityModelsManagerAddress, address functionalitiesManagerAddress, address walletAddress) public override {
function init(address votingTokenAddress, address functionalityProposalManagerAddress, address stateHolderAddress, address functionalityModelsManagerAddress, address functionalitiesManagerAddress, address walletAddress, address doubleProxyAddress) public override {

require(_delegates.length == 0, "Init already called!");

_delegates = new address[](6);
_delegates = new address[](7);

IMVDProxyDelegate(_delegates[0] = votingTokenAddress).setProxy();

Expand All @@ -38,14 +38,16 @@ contract MVDProxy is IMVDProxy {
IMVDProxyDelegate(_delegates[4] = functionalitiesManagerAddress).setProxy();

IMVDProxyDelegate(_delegates[5] = walletAddress).setProxy();

IMVDProxyDelegate(_delegates[6] = doubleProxyAddress).setProxy();
}

receive() external payable {
revert("No Eth Accepted");
}

function getDelegates() public override view returns(address,address,address,address,address,address) {
return(_delegates[0], _delegates[1], _delegates[2], _delegates[3], _delegates[4], _delegates[5]);
function getDelegates() public override view returns(address[] memory) {
return _delegates;
}

function getToken() public override view returns(address) {
Expand All @@ -72,6 +74,10 @@ contract MVDProxy is IMVDProxy {
return _delegates[5];
}

function getDoubleProxyAddress() public override view returns(address) {
return _delegates[6];
}

function flushToWallet(address tokenAddress, bool is721, uint256 tokenId) public override {
require(IMVDFunctionalitiesManager(_delegates[4]).isAuthorizedFunctionality(msg.sender), "Unauthorized action!");
if(tokenAddress == address(0)) {
Expand Down Expand Up @@ -104,15 +110,15 @@ contract MVDProxy is IMVDProxy {
function changeProxy(address newAddress, bytes memory initPayload) public override {
require(IMVDFunctionalitiesManager(_delegates[4]).isAuthorizedFunctionality(msg.sender), "Unauthorized action!");
require(newAddress != address(0), "Cannot set void address!");
IMVDProxyDelegate(_delegates[0]).setProxy();
IMVDProxyDelegate(_delegates[1]).setProxy();
IMVDProxyDelegate(_delegates[2]).setProxy();
IMVDProxyDelegate(_delegates[4]).setProxy();
IMVDProxyDelegate(_delegates[5]).setProxy();
for(uint256 i = 0; i < _delegates.length; i++) {
if(i != 3) {
IMVDProxyDelegate(_delegates[i]).setProxy();
}
}
_delegates = new address[](0);
emit ProxyChanged(newAddress);
(bool response,) = newAddress.call(initPayload);
require(response, "New address initPayload failed!");
require(response, "New Proxy initPayload failed!");
}

function isValidProposal(address proposal) public override view returns (bool) {
Expand Down

0 comments on commit 49def9f

Please sign in to comment.