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.
62 lines
2.4 KiB
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;
|
|
}
|
|
} |