The core protocol of WoopChain
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
woop/contracts/DepositContract.sol

62 lines
2.4 KiB

pragma solidity >=0.4.22;
contract DepositContract {
mapping(address => uint) private Stakes;
mapping(address => uint) private Indices;
address[] private accountList;
event LogNewAccount(address indexed account, uint index, uint stake);
event LogUpdateStake(address indexed account, uint index, uint stake);
event LogDeleteAccount(address indexed account, uint index);
function isAccount(address account) public view returns(bool isIndeed) {
if(accountList.length == 0) return false;
return (accountList[Indices[account]] == account);
}
function deposit() public payable returns(uint index) {
if(isAccount(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] = accountList.push(msg.sender) - 1;
emit LogNewAccount(msg.sender, Indices[msg.sender], Stakes[msg.sender]);
return accountList.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 Account.
deleteAccount(msg.sender);
}
return Stakes[msg.sender];
} else {
return Stakes[msg.sender]; //Overdraft protection, no money is withdrawn!
}
}
function deleteAccount(address account) public returns(uint index) {
//Move the last index to deleted index.
uint indexToDelete = Indices[account];
address lastIndexAddress = accountList[accountList.length-1];
accountList[indexToDelete] = lastIndexAddress;
Indices[lastIndexAddress] = indexToDelete;
accountList.length--;
emit LogDeleteAccount(account,indexToDelete);
emit LogUpdateStake(lastIndexAddress, indexToDelete, Stakes[lastIndexAddress]);
return indexToDelete;
}
function getAccountCount() public view returns(uint count) {
return accountList.length;
}
function getStakedAccountList() public view returns(address[] memory stakedAccountList) {
return accountList;
}
}