Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

(Fix) Security enhancements of VotingToChange*.migrateBasicOne function #169

Merged
merged 1 commit into from
Aug 21, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
50 changes: 37 additions & 13 deletions contracts/VotingToChangeKeys.sol
Original file line number Diff line number Diff line change
Expand Up @@ -103,28 +103,52 @@ contract VotingToChangeKeys is IVotingToChangeKeys, VotingToChange, EnumKeyTypes
function migrateBasicOne(
uint256 _id,
address _prevVotingToChange,
uint8 _quorumState,
uint256 _index,
address _creator,
string _memo,
address[] _voters
) public {
_migrateBasicOne(
_id,
_prevVotingToChange,
_quorumState,
_index,
_creator,
_memo,
_voters
);
require(_prevVotingToChange != address(0));
require(initDisabled());
require(!migrateDisabled());
IVotingToChangeKeysPrev prev = IVotingToChangeKeysPrev(_prevVotingToChange);
require(prev.getTotalVoters(_id) == _voters.length);

uint256 endTime = prev.getEndTime(_id);

_setTotalVoters(_id, _voters.length);
_setIsFinalized(_id, prev.getIsFinalized(_id));
_setMinThresholdOfVoters(_id, prev.getMinThresholdOfVoters(_id));
_setStartTime(_id, prev.getStartTime(_id));
_setEndTime(_id, endTime);

// solhint-disable indent
(
, , , , , ,
int progress, ,
uint8 quorumState, ,
uint256 index, ,
address creator,
string memory memo
) = prev.votingState(_id);
// solhint-enable indent
_setProgress(_id, progress);
_setQuorumState(_id, quorumState);
_setIndex(_id, index);
_setCreator(_id, creator);
_setMemo(_id, memo);

_setBallotType(_id, prev.getBallotType(_id));
_setAffectedKey(_id, prev.getAffectedKey(_id));
_setAffectedKeyType(_id, prev.getAffectedKeyType(_id));
_setMiningKey(_id, prev.getMiningKey(_id));
//_setNewVotingKey(_id, prev.getNewVotingKey(_id));
//_setNewPayoutKey(_id, prev.getNewPayoutKey(_id));

IKeysManager prevKeysManager = IKeysManager(prev.getKeysManager());
for (uint256 i = 0; i < _voters.length; i++) {
if (getTime() <= endTime) {
require(prev.hasAlreadyVoted(_id, prevKeysManager.getVotingByMining(_voters[i])));
}
_votersAdd(_id, _voters[i]);
}
}

// solhint-disable code-complexity
Expand Down
50 changes: 37 additions & 13 deletions contracts/VotingToChangeMinThreshold.sol
Original file line number Diff line number Diff line change
Expand Up @@ -63,24 +63,48 @@ contract VotingToChangeMinThreshold is IVotingToChangeMinThreshold, VotingToChan
function migrateBasicOne(
uint256 _id,
address _prevVotingToChange,
uint8 _quorumState,
uint256 _index,
address _creator,
string _memo,
address[] _voters
) public {
_migrateBasicOne(
_id,
_prevVotingToChange,
_quorumState,
_index,
_creator,
_memo,
_voters
);
require(_prevVotingToChange != address(0));
require(initDisabled());
require(!migrateDisabled());
IVotingToChangeMinThresholdPrev prev =
IVotingToChangeMinThresholdPrev(_prevVotingToChange);
require(prev.getTotalVoters(_id) == _voters.length);

uint256 endTime = prev.getEndTime(_id);

_setTotalVoters(_id, _voters.length);
_setIsFinalized(_id, prev.getIsFinalized(_id));
_setMinThresholdOfVoters(_id, prev.getMinThresholdOfVoters(_id));
_setStartTime(_id, prev.getStartTime(_id));
_setEndTime(_id, endTime);

// solhint-disable indent
(
, , ,
int progress, ,
uint8 quorumState,
uint256 index, , ,
address creator,
string memory memo
) = prev.votingState(_id);
// solhint-enable indent
_setProgress(_id, progress);
_setQuorumState(_id, quorumState);
_setIndex(_id, index);
_setCreator(_id, creator);
_setMemo(_id, memo);

_setProposedValue(_id, prev.getProposedValue(_id));

IKeysManager prevKeysManager = IKeysManager(prev.getKeysManager());
for (uint256 i = 0; i < _voters.length; i++) {
if (getTime() <= endTime) {
require(prev.hasAlreadyVoted(_id, prevKeysManager.getVotingByMining(_voters[i])));
}
_votersAdd(_id, _voters[i]);
}
}

function minPossibleThreshold() public view returns(uint256) {
Expand Down
50 changes: 37 additions & 13 deletions contracts/VotingToChangeProxyAddress.sol
Original file line number Diff line number Diff line change
Expand Up @@ -57,25 +57,49 @@ contract VotingToChangeProxyAddress is IVotingToChangeProxyAddress, VotingToChan
function migrateBasicOne(
uint256 _id,
address _prevVotingToChange,
uint8 _quorumState,
uint256 _index,
address _creator,
string _memo,
address[] _voters
) public {
_migrateBasicOne(
_id,
_prevVotingToChange,
_quorumState,
_index,
_creator,
_memo,
_voters
);
require(_prevVotingToChange != address(0));
require(initDisabled());
require(!migrateDisabled());
IVotingToChangeProxyAddressPrev prev =
IVotingToChangeProxyAddressPrev(_prevVotingToChange);
require(prev.getTotalVoters(_id) == _voters.length);

uint256 endTime = prev.getEndTime(_id);

_setTotalVoters(_id, _voters.length);
_setIsFinalized(_id, prev.getIsFinalized(_id));
_setMinThresholdOfVoters(_id, prev.getMinThresholdOfVoters(_id));
_setStartTime(_id, prev.getStartTime(_id));
_setEndTime(_id, endTime);

// solhint-disable indent
(
, , ,
int progress, ,
uint8 quorumState,
uint256 index, , , ,
address creator,
string memory memo
) = prev.votingState(_id);
// solhint-enable indent
_setProgress(_id, progress);
_setQuorumState(_id, quorumState);
_setIndex(_id, index);
_setCreator(_id, creator);
_setMemo(_id, memo);

_setProposedValue(_id, prev.getProposedValue(_id));
_setContractType(_id, prev.getContractType(_id));

IKeysManager prevKeysManager = IKeysManager(prev.getKeysManager());
for (uint256 i = 0; i < _voters.length; i++) {
if (getTime() <= endTime) {
require(prev.hasAlreadyVoted(_id, prevKeysManager.getVotingByMining(_voters[i])));
}
_votersAdd(_id, _voters[i]);
}
}

function _finalizeBallotInner(uint256 _id) internal returns(bool) {
Expand Down
29 changes: 0 additions & 29 deletions contracts/abstracts/VotingToChange.sol
Original file line number Diff line number Diff line change
Expand Up @@ -271,35 +271,6 @@ contract VotingToChange is IVotingToChange, VotingTo {
boolStorage[INIT_DISABLED] = true;
}

function _migrateBasicOne(
uint256 _id,
address _prevVotingToChange,
uint8 _quorumState,
uint256 _index,
address _creator,
string _memo,
address[] _voters
) internal onlyOwner {
require(_prevVotingToChange != address(0));
require(initDisabled());
require(!migrateDisabled());
IVotingToChangePrev prev = IVotingToChangePrev(_prevVotingToChange);
_setStartTime(_id, prev.getStartTime(_id));
_setEndTime(_id, prev.getEndTime(_id));
_setTotalVoters(_id, prev.getTotalVoters(_id));
_setProgress(_id, prev.getProgress(_id));
_setIsFinalized(_id, prev.getIsFinalized(_id));
_setQuorumState(_id, _quorumState);
_setIndex(_id, _index);
_setMinThresholdOfVoters(_id, prev.getMinThresholdOfVoters(_id));
for (uint256 i = 0; i < _voters.length; i++) {
address miningKey = _voters[i];
_votersAdd(_id, miningKey);
}
_setCreator(_id, _creator);
_setMemo(_id, _memo);
}

function _setIndex(uint256 _ballotId, uint256 _value) internal {
uintStorage[
keccak256(abi.encode(VOTING_STATE, _ballotId, INDEX))
Expand Down
24 changes: 24 additions & 0 deletions contracts/interfaces/IVotingToChangeKeys.sol
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,31 @@ interface IVotingToChangeKeysPrev {
function validatorActiveBallots(address) external view returns(uint256);
function getAffectedKey(uint256) external view returns(address);
function getAffectedKeyType(uint256) external view returns(uint256);
function getEndTime(uint256) external view returns(uint256);
function getKeysManager() external view returns(address);
function getMiningKey(uint256) external view returns(address);
function getProgress(uint256) external view returns(int256);
function getBallotType(uint256) external view returns(uint256);
function getIsFinalized(uint256) external view returns(bool);
function getMinThresholdOfVoters(uint256) external view returns(uint256);
function getStartTime(uint256) external view returns(uint256);
function getTotalVoters(uint256) external view returns(uint256);
function hasAlreadyVoted(uint256, address) external view returns(bool);

function votingState(uint256) external view returns(
uint256 startTime,
uint256 endTime,
address affectedKey,
uint256 affectedKeyType,
address miningKey,
uint256 totalVoters,
int progress,
bool isFinalized,
uint8 quorumState,
uint256 ballotType,
uint256 index,
uint256 minThresholdOfVoters,
address creator,
string memo
);
}
20 changes: 20 additions & 0 deletions contracts/interfaces/IVotingToChangeMinThreshold.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,26 @@ interface IVotingToChangeMinThresholdPrev {
function activeBallots(uint256) external view returns(uint256);
function activeBallotsLength() external view returns(uint256);
function validatorActiveBallots(address) external view returns(uint256);
function getEndTime(uint256) external view returns(uint256);
function getIsFinalized(uint256) external view returns(bool);
function getKeysManager() external view returns(address);
function getMinThresholdOfVoters(uint256) external view returns(uint256);
function getProposedValue(uint256) external view returns(uint256);
function getStartTime(uint256) external view returns(uint256);
function getTotalVoters(uint256) external view returns(uint256);
function hasAlreadyVoted(uint256, address) external view returns(bool);

function votingState(uint256) external view returns(
uint256 startTime,
uint256 endTime,
uint256 totalVoters,
int progress,
bool isFinalized,
uint8 quorumState,
uint256 index,
uint256 minThresholdOfVoters,
uint256 proposedValue,
address creator,
string memo
);
}
21 changes: 21 additions & 0 deletions contracts/interfaces/IVotingToChangeProxyAddress.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,28 @@ interface IVotingToChangeProxyAddressPrev {
function activeBallots(uint256) external view returns(uint256);
function activeBallotsLength() external view returns(uint256);
function validatorActiveBallots(address) external view returns(uint256);
function getEndTime(uint256) external view returns(uint256);
function getIsFinalized(uint256) external view returns(bool);
function getKeysManager() external view returns(address);
function getMinThresholdOfVoters(uint256) external view returns(uint256);
function getProposedValue(uint256) external view returns(address);
function getContractType(uint256) external view returns(uint256);
function getStartTime(uint256) external view returns(uint256);
function getTotalVoters(uint256) external view returns(uint256);
function hasAlreadyVoted(uint256, address) external view returns(bool);

function votingState(uint256) external view returns(
uint256 startTime,
uint256 endTime,
uint256 totalVoters,
int progress,
bool isFinalized,
uint8 quorumState,
uint256 index,
uint256 minThresholdOfVoters,
address proposedValue,
uint8 contractType,
address creator,
string memo
);
}
Loading