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