Skip to content

Commit

Permalink
Various bug fixes to make TCR proposal submission work
Browse files Browse the repository at this point in the history
  • Loading branch information
richard-ramos committed Jun 14, 2018
1 parent ef5e8c3 commit b1d1984
Show file tree
Hide file tree
Showing 5 changed files with 299 additions and 36 deletions.
2 changes: 1 addition & 1 deletion contracts/democracy/ProposalCuration.sol
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ contract ProposalCuration is Controlled {
uint256 submitPrice = getSubmitPrice(msg.sender);
require(token.allowance(msg.sender, address(this)) >= submitPrice);
require(token.transferFrom(msg.sender, address(this), submitPrice));
proposalId = proposalManager.addProposal(_topic,keccak256(_to,_value,_data));
proposalId = proposalManager.addProposal(_topic,keccak256(_to,_value,_data), 0, 1000);
proposals[proposalId] = ProposalData(
msg.sender,
_to,
Expand Down
19 changes: 14 additions & 5 deletions contracts/democracy/ProposalManager.sol
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,9 @@ contract ProposalManager is Controlled {

function addProposal(
bytes32 _topic,
bytes32 _txHash
bytes32 _txHash,
uint blocksUntilVotingStart,
uint voteDuration
)
public
returns (uint proposalId)
Expand All @@ -65,8 +67,8 @@ contract ProposalManager is Controlled {
p.topic = _topic;
p.txHash = _txHash;

p.blockStart = block.number + 1000; //will be replaced by configurations
p.voteBlockEnd = p.blockStart + 10000; //dummy value
p.blockStart = block.number + blocksUntilVotingStart; //will be replaced by configurations
p.voteBlockEnd = p.blockStart + voteDuration; //dummy value
emit ProposalSet(_topic, proposalId, _txHash);
}

Expand All @@ -77,6 +79,7 @@ contract ProposalManager is Controlled {
require(block.number >= proposal.blockStart);
require(block.number <= proposal.voteBlockEnd);
proposal.voteMap[msg.sender] = _vote;
proposal.voters.push(msg.sender);

}

Expand Down Expand Up @@ -125,7 +128,13 @@ contract ProposalManager is Controlled {
}



function hasVotesRecorded(uint256 _proposalId)
external
view
returns (bool)
{
return proposals[_proposalId].voters.length > 0;
}

function getProposalFinalResult(
uint256 _proposalId
Expand Down Expand Up @@ -153,7 +162,7 @@ contract ProposalManager is Controlled {

function isVotingAvailable(uint _proposalId) public view returns (bool){
Proposal memory p = proposals[_proposalId];
return p.voteBlockEnd > now && p.result == Vote.Null;
return p.voteBlockEnd > block.number && p.result == Vote.Null;
}

function offchainTabulateVoteResult(uint256 _proposalId)
Expand Down
85 changes: 55 additions & 30 deletions contracts/registries/TCR.sol
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
pragma solidity ^0.4.24;
pragma solidity ^0.4.23;

import "../common/Controlled.sol";
import "../token/MiniMeTokenInterface.sol";
Expand All @@ -17,19 +17,19 @@ contract TCR is Controlled {
mapping (address => SubmitPrice) submitAllowances;

bytes32 topic;
uint votingPeriod;

struct SubmitPrice {
bool allowedSubmitter;
uint256 stakePrice;
}

struct Proposal {
uint256 applicationExpiry;
bool whitelisted;
address owner;
uint256 unstakedAmount;
bytes data;
uint256 balance;
uint256 challengeID;
bytes data;
}

struct Challenge {
Expand All @@ -41,7 +41,7 @@ contract TCR is Controlled {
mapping(address => bool) tokenClaims;
}

mapping (uint256 => Proposal) public proposals;
mapping(uint256 => Proposal) public proposals;
mapping(uint => Challenge) public challenges;

constructor(
Expand All @@ -54,55 +54,55 @@ contract TCR is Controlled {
token = _token;
proposalManager = new ProposalManager(_token, _trustNet);
topic = _topic;
votingPeriod = 1000;
}

function submitProposal(
bytes32 _listingHash,
bytes _data,
uint _amountToStake
uint256 _depositAmount
)
external
returns (uint256 proposalId)
{
uint256 submitPrice = getSubmitPrice(msg.sender);

require(token.allowance(msg.sender, address(this)) >= submitPrice);
require(token.transferFrom(msg.sender, address(this), _amountToStake));
require(token.transferFrom(msg.sender, address(this), _depositAmount));

proposalId = proposalManager.addProposal(topic,keccak256(abi.encodePacked(0,0,0x00)));
proposalId = proposalManager.addProposal(topic, keccak256(abi.encodePacked(0, 0, 0x00)), 0, votingPeriod);

proposals[proposalId] = Proposal(
1000, // TODO: Determine if we're going to use proposal manager expiration time
false,
msg.sender,
_amountToStake,
_data,
0);
_depositAmount,
0,
_data);
}

function increaseStake(uint256 _proposalId, uint _amount) external {
function increaseBalance(uint256 _proposalId, uint _amount) external {
Proposal storage p = proposals[_proposalId];
require(p.owner == msg.sender);
require(token.transferFrom(msg.sender, this, _amount));
p.unstakedAmount += _amount;
p.balance += _amount;
}

function reduceStake(uint256 _proposalId, uint _amount) external {
function reduceBalance(uint256 _proposalId, uint _amount) external {
Proposal storage p = proposals[_proposalId];
require(p.owner == msg.sender);
require(_amount <= p.unstakedAmount);
require(_amount <= p.balance);
uint256 submitPrice = getSubmitPrice(msg.sender);
p.unstakedAmount -= _amount;
require(p.unstakedAmount >= submitPrice);
p.balance -= _amount;
require(p.balance >= submitPrice);
require(token.transfer(msg.sender, _amount));
}

function withdrawStake(uint256 _proposalId)
function withdrawProposal(uint256 _proposalId)
external
{
require(proposalManager.getProposalFinalResult(_proposalId) == RESULT_APPROVE);
require(proposals[_proposalId].challengeID == 0 || challenges[proposals[_proposalId].challengeID].resolved);

uint256 refundValue = proposals[_proposalId].unstakedAmount;
uint256 refundValue = proposals[_proposalId].balance;
address refundAddress = proposals[_proposalId].owner;
delete proposals[_proposalId];
if (refundValue > 0) {
Expand All @@ -116,13 +116,21 @@ contract TCR is Controlled {
require(p.whitelisted == true && proposalManager.getProposalFinalResult(_proposalId) == RESULT_APPROVE);

uint256 submitPrice = getSubmitPrice(msg.sender);

if(p.balance < submitPrice){
resetListing(_proposalId);
// TODO: event
return 0;
}


require(token.allowance(msg.sender, address(this)) >= submitPrice);
require(token.transferFrom(msg.sender, address(this), submitPrice));

// Prevent multiple challenges
require(p.challengeID == 0 || challenges[p.challengeID].resolved);

challengeID = proposalManager.addProposal(topic,keccak256(abi.encodePacked(0, 0, 0x00)));
challengeID = proposalManager.addProposal(topic,keccak256(abi.encodePacked(0, 0, 0x00)), 0, votingPeriod);

challenges[challengeID] = Challenge({
challenger: msg.sender,
Expand All @@ -133,7 +141,7 @@ contract TCR is Controlled {
});

p.challengeID = challengeID;
p.unstakedAmount -= submitPrice;
p.balance -= submitPrice;
}

function processProposal(uint256 _proposalId) public {
Expand All @@ -148,9 +156,11 @@ contract TCR is Controlled {

function canBeWhitelisted(uint256 _proposalId) view public returns (bool) {
uint challengeID = proposals[_proposalId].challengeID;

if (
proposals[_proposalId].applicationExpiry < now &&
!proposalManager.isVotingAvailable(_proposalId) &&
!proposalManager.hasVotesRecorded(_proposalId) &&
proposalManager.getProposalFinalResult(_proposalId) == RESULT_NULL &&
!isWhitelisted(_proposalId) &&
(challengeID == 0 || challenges[challengeID].resolved == true)
) { return true; }
Expand All @@ -162,8 +172,11 @@ contract TCR is Controlled {
return proposals[_proposalId].whitelisted;
}

event ProposalWhitelisted(uint256 proposalId);

function whitelistApplication(uint256 _proposalId) private {
proposals[_proposalId].whitelisted = true;
emit ProposalWhitelisted(_proposalId);
}

function challengeCanBeResolved(uint256 _proposalId) view public returns (bool) {
Expand All @@ -186,7 +199,7 @@ contract TCR is Controlled {

if (votingResult == RESULT_APPROVE) { // TODO:
whitelistApplication(_proposalId);
proposals[_proposalId].unstakedAmount += reward;
proposals[_proposalId].balance += reward;
} else {
resetListing(_proposalId);
require(token.transfer(challenges[challengeID].challenger, reward));
Expand All @@ -196,27 +209,33 @@ contract TCR is Controlled {
function resetListing(uint256 _proposalId) private {
Proposal storage p = proposals[_proposalId];
address owner = p.owner;
uint unstakedAmount = p.unstakedAmount;
uint balance = p.balance;
delete proposals[_proposalId];
if (unstakedAmount > 0){
require(token.transfer(owner, unstakedAmount));
if (balance > 0){
require(token.transfer(owner, balance));
}
}

function determineReward(uint _challengeID) public view returns (uint) {
require(_challengeID > 0 && challenges[_challengeID].resolved);
require(proposalManager.isVotingAvailable(_challengeID) == false);
return 1; // TODO:

// Determine reward must check the staked amount the proposal has

}

// TODO: function claimReward(uint _challengeID) public

event SubmitPriceUpdated(address who, uint256 stakeValue);

function setSubmitPrice(address _who, bool _allowedSubmitter, uint256 _stakeValue)
external
onlyController
{
if (_allowedSubmitter) {
if (_allowedSubmitter || _who == address(0)) {
submitAllowances[_who] = SubmitPrice(_allowedSubmitter, _stakeValue);
emit SubmitPriceUpdated(_who, _stakeValue);
} else {
delete submitAllowances[_who];
}
Expand All @@ -235,4 +254,10 @@ contract TCR is Controlled {
return allowance.stakePrice;
}
}

function updateVotingPeriod(uint length)
public
onlyController {
votingPeriod = length;
}
}
Loading

0 comments on commit b1d1984

Please sign in to comment.