-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathReferral.sol
117 lines (110 loc) · 3.86 KB
/
Referral.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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
pragma solidity ^0.4.18;
/**
* A referral tree is a diffusion graph of all nodes representing campaign participants.
* Each invitee is assigned a referral tree after accepting an invitation. Following is
* an example difussion graph.
*
* +---+
* +--> | 9 |
* | +---+
* |
* | +---+
* +---+ +--> |10 |
* +--> | 4 | | +---+
* | +---+ +--+
* | (inactive) | | +---+
* | | +--> |11 |
* | +---+ | | +---+
* +-------> | 5 +----+ |
* | | +---+ | +---+
* +---- | | +--> |12 |
* +--> | 1 +----+ | +---+
* | +---+ | +---+
* | +--> | 6 | +------------------>
* | +---+
* +---+ | +---+
* | 0 | +-----> | 2 |
* +---+ | +---+
* | (inactive)
* | +---+
* | +---+ +--> | 7 |
* +--> | 3 +---------+ +---+
* +---+ |
* | +---+
* +--> | 8 |
* +---+
*
*/
library Referral {
/**
* @dev A user in a referral graph
*/
struct Node {
/// This node was referred by...
address referrer;
/// Invitees (and their shares) of this node
mapping (address => uint) invitees;
/// Store keys separately
address[] inviteeIndex;
/// Reward accumulated
uint shares;
/// Used for membership check
bool exists;
}
/**
* @dev A referral tree is a collection of Nodes.
*/
struct Tree {
/// Nodes
mapping (address => Referral.Node) nodes;
/// stores keys separately
address[] treeIndex;
}
/**
* @dev Find referrer of the given invitee.
*/
function getReferrer (
Tree storage self,
address _invitee
)
public
constant
returns (address _referrer)
{
_referrer = self.nodes[_invitee].referrer;
}
/**
* @dev Number of entries in referral tree.
*/
function getTreeSize (
Tree storage self
)
public
constant
returns (uint _size)
{
_size = self.treeIndex.length;
}
/**
* @dev Creates a new node representing an invitee and adds to a node's list of invitees.
*/
function addInvitee (
Tree storage self,
address _referrer,
address _invitee,
uint _shares
)
internal
{
Node memory inviteeNode;
inviteeNode.referrer = _referrer;
inviteeNode.shares = _shares;
inviteeNode.exists = true;
self.nodes[_invitee] = inviteeNode;
self.treeIndex.push(_invitee);
if (self.nodes[_referrer].exists == true) {
self.nodes[_referrer].invitees[_invitee] = _shares;
self.nodes[_referrer].inviteeIndex.push(_invitee);
}
}
}