Smart Contract

RV2

A.3ddb31a3880d1d8f.RV2

Deployed

1d ago
Feb 26, 2026, 10:41:48 PM UTC

Dependents

0 imports
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