the deposit contract

pull/367/head
alok 6 years ago
parent 11a4fc30ed
commit ebb9860dc1
  1. 75
      contracts/DepositContract.sol

@ -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…
Cancel
Save