aboutsummaryrefslogtreecommitdiffstats
path: root/contracts/chequebook/contract/chequebook.sol
diff options
context:
space:
mode:
authorFelix Lange <fjl@twurst.com>2016-08-29 20:06:12 +0800
committerGitHub <noreply@github.com>2016-08-29 20:06:12 +0800
commit3b087e03ea35721a23832706959432ce4ec1910a (patch)
tree2518217cfd8a977b8346b8552db5cb6ddec50b05 /contracts/chequebook/contract/chequebook.sol
parent8dbf59fec5670591ca0a47f9f00a51ae293acb6b (diff)
parent6c8b023298694175d05bf2a14c85f44d73625695 (diff)
downloadgo-tangerine-3b087e03ea35721a23832706959432ce4ec1910a.tar
go-tangerine-3b087e03ea35721a23832706959432ce4ec1910a.tar.gz
go-tangerine-3b087e03ea35721a23832706959432ce4ec1910a.tar.bz2
go-tangerine-3b087e03ea35721a23832706959432ce4ec1910a.tar.lz
go-tangerine-3b087e03ea35721a23832706959432ce4ec1910a.tar.xz
go-tangerine-3b087e03ea35721a23832706959432ce4ec1910a.tar.zst
go-tangerine-3b087e03ea35721a23832706959432ce4ec1910a.zip
Merge pull request #2956 from fjl/chequebook
contracts/chequebook: add chequebook contract wrapper
Diffstat (limited to 'contracts/chequebook/contract/chequebook.sol')
-rw-r--r--contracts/chequebook/contract/chequebook.sol43
1 files changed, 43 insertions, 0 deletions
diff --git a/contracts/chequebook/contract/chequebook.sol b/contracts/chequebook/contract/chequebook.sol
new file mode 100644
index 000000000..cb19d0b27
--- /dev/null
+++ b/contracts/chequebook/contract/chequebook.sol
@@ -0,0 +1,43 @@
+import "mortal";
+
+/// @title Chequebook for Ethereum micropayments
+/// @author Daniel A. Nagy <daniel@ethdev.com>
+contract chequebook is mortal {
+ // Cumulative paid amount in wei to each beneficiary
+ mapping (address => uint256) public sent;
+
+ /// @notice Overdraft event
+ event Overdraft(address deadbeat);
+
+ /// @notice Cash cheque
+ ///
+ /// @param beneficiary beneficiary address
+ /// @param amount cumulative amount in wei
+ /// @param sig_v signature parameter v
+ /// @param sig_r signature parameter r
+ /// @param sig_s signature parameter s
+ /// The digital signature is calculated on the concatenated triplet of contract address, beneficiary address and cumulative amount
+ function cash(address beneficiary, uint256 amount,
+ uint8 sig_v, bytes32 sig_r, bytes32 sig_s) {
+ // Check if the cheque is old.
+ // Only cheques that are more recent than the last cashed one are considered.
+ if(amount <= sent[beneficiary]) return;
+ // Check the digital signature of the cheque.
+ bytes32 hash = sha3(address(this), beneficiary, amount);
+ 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;
+ }
+ } else {
+ // Upon failure, punish owner for writing a bounced cheque.
+ // owner.sendToDebtorsPrison();
+ Overdraft(owner);
+ // Compensate beneficiary.
+ suicide(beneficiary);
+ }
+ }
+}