Smart Contract
RV2
A.3ddb31a3880d1d8f.RV2
1/**
2
3#
4
5*/
6
7import LendingInterfaces from 0x2df970b6cdee5735
8
9pub contract RV2 {
10
11 // {Referrer : {Referee: BindingTime} }
12 access(self) let _referrerToReferees: {Address: {Address: UFix64}}
13
14 // {Referee: Referrer}
15 access(self) let _refereeToReferrer: {Address: Address}
16
17 /// Events
18 access(all) event BindingReferrer(referrer: Address, referee: Address, indexer: Int)
19
20 access(all) fun bind(referrer: Address, refereeCertificateCap: Capability<&{LendingInterfaces.IdentityCertificate}>) {
21 let referee: Address = refereeCertificateCap.borrow()!.owner!.address
22 assert(self._refereeToReferrer.containsKey(referee) == false, message: "Referrer already bound")
23 assert(referee != referrer, message: "Can't bind yourself")
24 self._refereeToReferrer[referee] = referrer
25 if self._referrerToReferees.containsKey(referrer) == false {
26 self._referrerToReferees[referrer] = {}
27 }
28 self._referrerToReferees[referrer]!.insert(key: referee, getCurrentBlock().timestamp)
29
30 // Prevent circular binding
31 //assert(self.checkCirularBinding(referee: referee) == false, message: "Cirular Binding")
32
33 emit BindingReferrer(referrer: referrer, referee: referee, indexer: self._referrerToReferees[referrer]!.length)
34 }
35
36 access(self) fun checkCirularBinding(referee: Address): Bool {
37 let checkedAddrs: {Address: Bool} = {referee: true}
38 var i = 0
39 var addr = referee
40 while i < 32 {
41 if self._refereeToReferrer.containsKey(addr) == false {
42 return false
43 }
44 let nextAddr = self._refereeToReferrer[addr]!
45 if checkedAddrs.containsKey(nextAddr) == true {
46 return true
47 }
48 checkedAddrs[nextAddr] = true
49 addr = nextAddr
50 i = i + 1
51 }
52 return false
53 }
54
55 access(all) fun getReferrerByReferee(referee: Address): Address? {
56 if self._refereeToReferrer.containsKey(referee) == false {
57 return nil
58 }
59 return self._refereeToReferrer[referee]!
60 }
61
62 access(all) view fun getReferrerCount(): Int {
63 return self._referrerToReferees.length
64 }
65
66 access(all) view fun getSlicedReferrerList(from: Int, to: Int): [Address] {
67 let len = self._referrerToReferees.length
68 let upTo = to > len ? len : to
69 return self._referrerToReferees.keys.slice(from: from, upTo: upTo)
70 }
71
72 access(all) view fun getRefereeCountByReferrer(referrer: Address): Int {
73 return self._referrerToReferees.containsKey(referrer) ? self._referrerToReferees[referrer]!.length : 0
74 }
75
76 access(all) view fun getSlicedRefereesByReferrer(referrer: Address, from: Int, to: Int): {Address: UFix64} {
77 if self._referrerToReferees.containsKey(referrer) == false {
78 return {}
79 }
80 let len = self._referrerToReferees[referrer]!.length
81 let endIndex = to > len ? len : to
82 var curIndex = from
83 let res: {Address: UFix64} = {}
84 while curIndex < endIndex {
85 let key: Address = self._referrerToReferees[referrer]!.keys[curIndex]
86 res[key] = self._referrerToReferees[referrer]![key]
87 curIndex = curIndex + 1
88 }
89 return res
90 }
91
92 /// Admin
93 ///
94 access(all) resource Admin {
95
96 }
97
98 init() {
99 self._referrerToReferees = {}
100 self._refereeToReferrer = {}
101 }
102}
103