Smart Contract

RV1

A.3ddb31a3880d1d8f.RV1

Deployed

2d 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 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