@ -1,7 +1,9 @@
import " mortal " ;
pragma solidity ^ 0 . 4 . 18 ;
import " https://github.com/ethereum/solidity/std/mortal.sol " ;
/ / / @ title Chequebook for Ethereum micropayments
/ / / @ title Chequebook for Ethereum micropayments
/ / / @ author Daniel A . Nagy < daniel @ ethdev . com >
/ / / @ author Daniel A . Nagy < daniel @ ethereum . org >
contract chequebook is mortal {
contract chequebook is mortal {
/ / Cumulative paid amount in wei to each beneficiary
/ / Cumulative paid amount in wei to each beneficiary
mapping ( address => uint256 ) public sent ;
mapping ( address => uint256 ) public sent ;
@ -21,26 +23,23 @@ contract chequebook is mortal {
uint8 sig_v , bytes32 sig_r , bytes32 sig_s ) {
uint8 sig_v , bytes32 sig_r , bytes32 sig_s ) {
/ / Check if the cheque is old .
/ / Check if the cheque is old .
/ / Only cheques that are more recent than the last cashed one are considered .
/ / Only cheques that are more recent than the last cashed one are considered .
if ( amount <= sent [ beneficiary ] ) return ;
require ( amount > sent [ beneficiary ] ) ;
/ / Check the digital signature of the cheque .
/ / Check the digital signature of the cheque .
bytes32 hash = sha3 ( address ( this ) , beneficiary , amount ) ;
bytes32 hash = keccak256 ( address ( this ) , beneficiary , amount ) ;
if ( owner ! = ecrecover ( hash , sig_v , sig_r , sig_s ) ) return ;
require ( owner = = ecrecover ( hash , sig_v , sig_r , sig_s ) ) ;
/ / Attempt sending the difference between the cumulative amount on the cheque
/ / Attempt sending the difference between the cumulative amount on the cheque
/ / and the cumulative amount on the last cashed cheque to beneficiary .
/ / and the cumulative amount on the last cashed cheque to beneficiary .
uint256 diff = amount - sent [ beneficiary ] ;
uint256 diff = amount - sent [ beneficiary ] ;
if ( diff <= this . balance ) {
if ( diff <= this . balance ) {
/ / update the cumulative amount before sending
/ / update the cumulative amount before sending
sent [ beneficiary ] = amount ;
sent [ beneficiary ] = amount ;
if ( ! beneficiary . send ( diff ) ) {
beneficiary . transfer ( diff ) ;
/ / Upon failure to execute send , revert everything
throw ;
}
} else {
} else {
/ / Upon failure , punish owner for writing a bounced cheque .
/ / Upon failure , punish owner for writing a bounced cheque .
/ / owner . sendToDebtorsPrison ( ) ;
/ / owner . sendToDebtorsPrison ( ) ;
Overdraft ( owner ) ;
Overdraft ( owner ) ;
/ / Compensate beneficiary .
/ / Compensate beneficiary .
suicide ( beneficiary ) ;
selfdestruct ( beneficiary ) ;
}
}
}
}
}
}