/
Subscription.sol
81 lines (67 loc) · 2.09 KB
/
Subscription.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
pragma solidity >=0.5.0;
pragma AbiHeader time;
pragma AbiHeader expire;
contract SubscriptionContract {
address mywallet;
mapping (uint256 => Payment) subscriptions;
uint256 _owner;
uint8 constant STATUS_ACTIVE = 1;
uint8 constant STATUS_EXECUTED = 2;
struct Payment {
uint256 pubkey;
address to;
uint64 value;
uint32 period;
uint32 start;
uint8 status;
}
modifier onlyOwner {
require(msg.pubkey() == tvm.pubkey(), 100);
_;
}
constructor(address wallet) public {
tvm.accept();
mywallet = wallet;
}
function getWallet() public view returns (address) {
return mywallet;
}
function getSubscription(uint256 subscriptionId) public view returns (Payment memory) {
return subscriptions[subscriptionId];
}
function subscribe(
uint256 subscriptionId,
uint256 pubkey,
address to,
uint64 value,
uint32 period) public onlyOwner {
require(subscriptionId != 0 &&
value > 0 &&
period > 0, 101);
tvm.accept();
subscriptions[subscriptionId] = Payment(pubkey, to, value, period, 0, STATUS_ACTIVE);
}
function cancel(uint256 subscriptionId) public onlyOwner {
require(subscriptions[subscriptionId].status != 0, 101);
tvm.accept();
delete subscriptions[subscriptionId];
}
function executeSubscription(uint256 subscriptionId) public {
Payment subscr = subscriptions[subscriptionId];
require(msg.pubkey() == subscr.pubkey, 102);
require(subscr.status != 0, 101);
if (now > (subscr.start + subscr.period)) {
subscr.start = uint32(now);
} else {
require(subscr.status != STATUS_EXECUTED, 103);
}
tvm.accept();
subscr.to.transfer(subscr.value);
subscr.status = STATUS_EXECUTED;
subscriptions[subscriptionId] = subscr;
}
function sendAllMoney(address dest_addr) public onlyOwner {
tvm.accept();
selfdestruct(dest_addr);
}
}