pragma solidity ^0.4.21; library SafeMath { function sub(uint256 a, uint256 b) public pure returns (uint256) { require(b <= a); return a - b; } function add(uint256 a, uint256 b) public pure returns (uint256) { uint c = a + b; require(c >= a); return c; } } contract DepositTransaction { using SafeMath for uint256; mapping (address => Transaction[]) public transactions; mapping (address => uint256) private balances_; enum State { Deposited, Returned } struct Transaction { uint16 deposit_id; uint256 amount; uint64 time; State state; } event Deposited(address who, uint16 deposit_id, uint256 amount); event Returned(address who, uint16 deposit_id, uint256 amount); function() public payable { require(msg.sender != address(0)); require(msg.value > 0); balances_[msg.sender] = balances_[msg.sender].add(msg.value); Transaction[] storage tran = transactions[msg.sender]; uint16 deposit_id = uint16(tran.length + 1); Transaction memory t = Transaction({ deposit_id: deposit_id, amount: msg.value, time: uint64(now), state: State.Deposited }); tran.push(t); emit Deposited(msg.sender, deposit_id, msg.value); } function balaceOf() public view returns (uint256) { require(msg.sender != address(0)); return balances_[msg.sender]; } function totalBalace() public view returns (uint256) { return address(this).balance; } function claim(uint16 _deposit_id) public { require(msg.sender != address(0)); require(address(this).balance > 0); require(balances_[msg.sender] > 0); require(address(this).balance >= balances_[msg.sender]); Transaction[] storage tran = transactions[msg.sender]; Transaction storage t = tran[_deposit_id - 1]; t.state = State.Returned; balances_[msg.sender] = balances_[msg.sender].sub(t.amount); emit Returned(msg.sender, _deposit_id, t.amount); require(msg.sender.send(t.amount)); } }
0.4.21