parent
11a4fc30ed
commit
ebb9860dc1
@ -0,0 +1,75 @@ |
|||||||
|
pragma solidity ^0.4.22; |
||||||
|
|
||||||
|
contract DepositContract { |
||||||
|
|
||||||
|
mapping(address => uint) private Stakes; |
||||||
|
mapping(address => uint) private Indices; |
||||||
|
address[] private nodeAddressList; |
||||||
|
|
||||||
|
event LogNewNode(address indexed nodeAddress, uint index, uint stake); |
||||||
|
event LogUpdateStake(address indexed nodeAddress, uint index, uint stake); |
||||||
|
event LogDeleteNode(address indexed nodeAddress, uint index); |
||||||
|
|
||||||
|
function isNode(address nodeAddress) public constant returns(bool isIndeed) |
||||||
|
{ |
||||||
|
if(nodeAddressList.length == 0) return false; |
||||||
|
return (nodeAddressList[Indices[nodeAddress]] == nodeAddress); |
||||||
|
} |
||||||
|
|
||||||
|
function deposit() public payable returns(uint index) |
||||||
|
{ |
||||||
|
if(isNode(msg.sender)) { |
||||||
|
Stakes[msg.sender] += msg.value; |
||||||
|
emit LogUpdateStake(msg.sender, Indices[msg.sender], Stakes[msg.sender]); |
||||||
|
return Indices[msg.sender]; |
||||||
|
} else { |
||||||
|
Stakes[msg.sender] = msg.value; |
||||||
|
Indices[msg.sender] = nodeAddressList.push(msg.sender) - 1; |
||||||
|
emit LogNewNode(msg.sender, Indices[msg.sender], Stakes[msg.sender]); |
||||||
|
return nodeAddressList.length-1; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
function withdraw(uint withdrawAmount) public returns (uint remainingStake) |
||||||
|
{ |
||||||
|
if (withdrawAmount <= Stakes[msg.sender]) { |
||||||
|
Stakes[msg.sender] -= withdrawAmount; |
||||||
|
msg.sender.transfer(withdrawAmount); |
||||||
|
if (Stakes[msg.sender] == 0) { //If all stake has been withdrawn, remove the node. |
||||||
|
deleteNode(msg.sender); |
||||||
|
} |
||||||
|
return Stakes[msg.sender]; |
||||||
|
} else { |
||||||
|
return Stakes[msg.sender]; //Overdraft protection, no money is withdrawn! |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
function deleteNode(address nodeAddress) public returns(uint index) |
||||||
|
{ |
||||||
|
//Move the last index to deleted index. |
||||||
|
uint indexToDelete = Indices[nodeAddress]; |
||||||
|
address lastIndexAddress = nodeAddressList[nodeAddressList.length-1]; |
||||||
|
nodeAddressList[indexToDelete] = lastIndexAddress; |
||||||
|
Indices[lastIndexAddress] = indexToDelete; |
||||||
|
nodeAddressList.length--; |
||||||
|
emit LogDeleteNode(nodeAddress,indexToDelete); |
||||||
|
emit LogUpdateStake(lastIndexAddress, indexToDelete, Stakes[lastIndexAddress]); |
||||||
|
return indexToDelete; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
function getNodeCount() public constant returns(uint count) |
||||||
|
{ |
||||||
|
return nodeAddressList.length; |
||||||
|
} |
||||||
|
|
||||||
|
function getStakedNodeList() public constant returns(address[] stakedNodeList) |
||||||
|
{ |
||||||
|
|
||||||
|
return nodeAddressList; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue