[DioneDispute] Change type of sum property in Dispute struct, add missing checks and add minStake check

This commit is contained in:
ChronosX88 2021-04-27 21:10:40 +03:00
parent 857c21a232
commit f8576cffea
Signed by: ChronosXYZ
GPG Key ID: 085A69A82C8C511A
3 changed files with 21 additions and 12 deletions

View File

@ -18,6 +18,7 @@ interface DeploymentOptions {
actualStake: number; // of each node actualStake: number; // of each node
nodeCount: number; nodeCount: number;
logging: boolean; logging: boolean;
minStakeForDisputeVotes: number;
} }
async function deploy(opts: DeploymentOptions): Promise<Environment> { async function deploy(opts: DeploymentOptions): Promise<Environment> {
@ -39,7 +40,7 @@ async function deploy(opts: DeploymentOptions): Promise<Environment> {
await dioneStaking.deployed(); await dioneStaking.deployed();
logger.log("staking_contract_address = \"" + dioneStaking.address+ "\""); logger.log("staking_contract_address = \"" + dioneStaking.address+ "\"");
const dioneDispute = await DioneDispute.deploy(dioneStaking.address, opts.voteWindowTime); const dioneDispute = await DioneDispute.deploy(dioneStaking.address, opts.voteWindowTime, ethers.constants.WeiPerEther.mul(opts.minStakeForDisputeVotes));
await dioneDispute.deployed(); await dioneDispute.deployed();
logger.log("dispute_contract_address = \"" + dioneDispute.address+ "\""); logger.log("dispute_contract_address = \"" + dioneDispute.address+ "\"");

View File

@ -4,14 +4,15 @@ import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "./interfaces/IDioneStaking.sol"; import "./interfaces/IDioneStaking.sol";
contract DioneDispute { contract DioneDispute {
using SafeMath for uint256;
IDioneStaking public dioneStaking; IDioneStaking public dioneStaking;
uint256 public voteWindowTime; uint256 public voteWindowTime;
// Minimum amount of DIONE tokens required to vote to dispute
uint256 public minStake;
struct Dispute { struct Dispute {
bytes32 dhash; // id of dispute - keccak256(_miner,_requestId,_timestamp) bytes32 dhash; // id of dispute - keccak256(_miner,_requestId,_timestamp)
uint256 sum; // vote measure (for/against this dispute) int256 sum; // vote measure (for/against this dispute)
bool finished; // dispute was finished (closed) or not bool finished; // dispute was finished (closed) or not
bool disputeResult; // true - dispute had basis, false - dispute was false bool disputeResult; // true - dispute had basis, false - dispute was false
address miner; // the miner against whom the dispute address miner; // the miner against whom the dispute
@ -20,15 +21,21 @@ contract DioneDispute {
address[] voted; // map of miners who vote for/against address[] voted; // map of miners who vote for/against
} }
modifier onlyExistingDispute(bytes32 _dhash) {
require(disputes[_dhash].disputeInitiator != address(0), "dispute doesn't exist");
_;
}
mapping(bytes32 => Dispute) disputes; mapping(bytes32 => Dispute) disputes;
event NewDispute(bytes32 dhash, uint256 requestID, address indexed miner, address indexed disputeInitiator); event NewDispute(bytes32 dhash, uint256 requestID, address indexed miner, address indexed disputeInitiator);
event NewVote(bytes32 dhash, address indexed votedMiner); event NewVote(bytes32 dhash, address indexed votedMiner);
event DisputeFinished(bytes32 dhash, bool status); event DisputeFinished(bytes32 dhash, bool status);
constructor(IDioneStaking _dioneStaking, uint256 _voteWindowTime) { constructor(IDioneStaking _dioneStaking, uint256 _voteWindowTime, uint256 _minStake) {
dioneStaking = _dioneStaking; dioneStaking = _dioneStaking;
voteWindowTime = _voteWindowTime; voteWindowTime = _voteWindowTime;
minStake = _minStake;
} }
function beginDispute(address miner, uint256 requestID) public { function beginDispute(address miner, uint256 requestID) public {
@ -48,24 +55,24 @@ contract DioneDispute {
emit NewDispute(dhash, requestID, miner, msg.sender); emit NewDispute(dhash, requestID, miner, msg.sender);
} }
function vote(bytes32 dhash, bool voteStatus) public { function vote(bytes32 dhash, bool voteStatus) public onlyExistingDispute(dhash) {
Dispute memory dispute = disputes[dhash]; Dispute memory dispute = disputes[dhash];
require(dispute.dhash.length != 0, "dispute doesn't exist");
require(dispute.finished == false, "dispute already finished"); require(dispute.finished == false, "dispute already finished");
require(msg.sender != dispute.disputeInitiator, "dispute initiator isn't allowed to vote");
require(dioneStaking.isMiner(msg.sender), "caller isn't dione miner"); require(dioneStaking.isMiner(msg.sender), "caller isn't dione miner");
require(dioneStaking.minerStake(msg.sender) >= minStake, "miner doesn't have minimum stake to vote");
uint256 stake = dioneStaking.minerStake(msg.sender); uint256 stake = dioneStaking.minerStake(msg.sender);
if (voteStatus) { if (voteStatus) {
disputes[dhash].sum = disputes[dhash].sum.add(stake); disputes[dhash].sum = disputes[dhash].sum + int256(stake);
} else { } else {
disputes[dhash].sum = disputes[dhash].sum.sub(stake); disputes[dhash].sum = disputes[dhash].sum - int256(stake);
} }
disputes[dhash].voted.push(msg.sender); disputes[dhash].voted.push(msg.sender);
emit NewVote(dhash, msg.sender); emit NewVote(dhash, msg.sender);
} }
function finishDispute(bytes32 dhash) public { function finishDispute(bytes32 dhash) public onlyExistingDispute(dhash) {
require(disputes[dhash].dhash.length != 0, "dispute doesn't exist");
Dispute memory dispute = disputes[dhash]; Dispute memory dispute = disputes[dhash];
require((block.timestamp - dispute.timestamp) >= voteWindowTime, "vote window hasn't passed yet"); require((block.timestamp - dispute.timestamp) >= voteWindowTime, "vote window hasn't passed yet");
require(dispute.finished == false, "dispute already finished"); require(dispute.finished == false, "dispute already finished");

View File

@ -13,7 +13,8 @@ async function main() {
maxStake: 0, // don't use this deployment feature maxStake: 0, // don't use this deployment feature
actualStake: 5000, actualStake: 5000,
nodeCount: 4, nodeCount: 4,
logging: true logging: true,
minStakeForDisputeVotes: 100
}); });
} }