diff --git a/swarm/services/chequebook/contract/chequebook.sol b/swarm/services/chequebook/contract/chequebook.sol index cb19d0b27b..36a56f2263 100644 --- a/swarm/services/chequebook/contract/chequebook.sol +++ b/swarm/services/chequebook/contract/chequebook.sol @@ -1,7 +1,9 @@ -import "mortal"; +pragma solidity ^0.4.3; + +import "mortal.sol" as mortal; /// @title Chequebook for Ethereum micropayments -/// @author Daniel A. Nagy +/// @author Daniel A. Nagy contract chequebook is mortal { // Cumulative paid amount in wei to each beneficiary mapping (address => uint256) public sent; @@ -9,6 +11,14 @@ contract chequebook is mortal { /// @notice Overdraft event event Overdraft(address deadbeat); + /// @notice Deposit event + event Deposit(uint256 amount); + + /// @notice Top up chequebook + function() payable { + Deposit(msg.value); + } + /// @notice Cash cheque /// /// @param beneficiary beneficiary address @@ -27,17 +37,20 @@ contract chequebook is mortal { if(owner != ecrecover(hash, sig_v, sig_r, sig_s)) return; // Attempt sending the difference between the cumulative amount on the cheque // and the cumulative amount on the last cashed cheque to beneficiary. - if (amount - sent[beneficiary] >= this.balance) { - if (beneficiary.send(amount - sent[beneficiary])) { - // Upon success, update the cumulative amount. - sent[beneficiary] = amount; + diff = amount - sent[beneficiary]; + if (diff <= this.balance) { + // update the cumulative amount before sending + sent[beneficiary] = amount; + if (!beneficiary.send(diff)) { + // Upon failure to execute send, revert everything + throw; } } else { // Upon failure, punish owner for writing a bounced cheque. // owner.sendToDebtorsPrison(); Overdraft(owner); // Compensate beneficiary. - suicide(beneficiary); + selfdestruct(beneficiary); } } }