summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWei-Ning Huang <w@dexon.org>2019-03-14 11:44:24 +0800
committerWei-Ning Huang <w@dexon.org>2019-03-14 23:52:13 +0800
commit15199be0565fc9625aaca0af37ef889fed57eaa9 (patch)
tree40aa9df864d3e0fe72abbbd87f9ab9de217ebc0e
parent94f2fe3dfb7ca73343ff9bdaff4dea7d30b90792 (diff)
downloadtangerine-governance-abi-15199be0565fc9625aaca0af37ef889fed57eaa9.tar
tangerine-governance-abi-15199be0565fc9625aaca0af37ef889fed57eaa9.tar.gz
tangerine-governance-abi-15199be0565fc9625aaca0af37ef889fed57eaa9.tar.bz2
tangerine-governance-abi-15199be0565fc9625aaca0af37ef889fed57eaa9.tar.lz
tangerine-governance-abi-15199be0565fc9625aaca0af37ef889fed57eaa9.tar.xz
tangerine-governance-abi-15199be0565fc9625aaca0af37ef889fed57eaa9.tar.zst
tangerine-governance-abi-15199be0565fc9625aaca0af37ef889fed57eaa9.zip
contracts: store votes on recovery contract
-rw-r--r--contracts/Recovery.sol32
1 files changed, 29 insertions, 3 deletions
diff --git a/contracts/Recovery.sol b/contracts/Recovery.sol
index d053594..cf708eb 100644
--- a/contracts/Recovery.sol
+++ b/contracts/Recovery.sol
@@ -3,20 +3,46 @@ pragma solidity ^0.5.0;
import "openzeppelin-solidity/contracts/ownership/Ownable.sol";
contract Recovery is Ownable {
- uint256 depositValue;
+ uint256 public depositValue;
+
+ mapping(uint256 => address[]) public votes;
+ mapping(uint256 => mapping(address => bool)) public voted;
+ mapping(address => uint256) public withdrawable;
event VotedForRecovery(uint256 indexed height, address voter);
+ event Withdrawn(address indexed owner, uint256 amount);
function setDeposit(uint256 DepositValue) public onlyOwner {
depositValue = DepositValue;
}
- function withdraw(address payable destination) public onlyOwner {
- destination.send(address(this).balance);
+ function refund(uint256 height, uint256 value) public onlyOwner {
+ for (uint i = 0; i < votes[height].length; i++) {
+ withdrawable[votes[height][i]] += value;
+ }
+ }
+
+ function withdraw() public {
+ require(withdrawable[msg.sender] > 0);
+
+ uint256 amount = withdrawable[msg.sender];
+ withdrawable[msg.sender] = 0;
+ msg.sender.transfer(amount);
+
+ emit Withdrawn(msg.sender, amount);
}
function voteForSkipBlock(uint256 height) public payable {
require(msg.value >= depositValue);
+ require(!voted[height][msg.sender]);
+
+ votes[height].push(msg.sender);
+ voted[height][msg.sender] = true;
+
emit VotedForRecovery(height, msg.sender);
}
+
+ function numVotes(uint256 height) public returns (uint256) {
+ return votes[height].length;
+ }
}