Smart Contract
ProfileCache
A.097bafa4e0b48eef.ProfileCache
1import Clock from 0x097bafa4e0b48eef
2
3access(all) contract ProfileCache {
4
5 // If there is no findName, the string is set to "".
6 access(contract) let addressLeaseName : {Address : LeaseCache}
7 access(contract) let nameAddress : {String : LeaseCache}
8
9 access(contract) let profileWalletIndex : {Address : {Type : Int}}
10
11 // Find Leases
12 access(all) struct LeaseCache {
13 access(all) let address : Address?
14 access(all) let leaseName : String
15 access(all) let validUntil : UFix64
16
17 init(leaseName: String, validUntil: UFix64, address: Address?) {
18 self.leaseName=leaseName
19 self.validUntil=validUntil
20 self.address=address
21 }
22 }
23
24 access(account) fun setAddressLeaseNameCache(address: Address, leaseName: String?, validUntil: UFix64) {
25 if self.addressLeaseName[address] == nil {
26 if leaseName == nil {
27 self.addressLeaseName[address] = LeaseCache(leaseName: "", validUntil: validUntil, address: address)
28 return
29 }
30 self.addressLeaseName[address] = LeaseCache(leaseName: leaseName!, validUntil: validUntil, address: address)
31 return
32 }
33 // panic("There is already a cache for this address. Address : ".concat(address.toString()))
34 // We cannot panic here, because imagine someone has expired lease.
35 }
36
37 access(all) fun getAddressLeaseName(_ address: Address) : String? {
38 if self.addressLeaseName[address] == nil {
39 return nil
40 }
41 if self.addressLeaseName[address]!.validUntil >= Clock.time() {
42 return self.addressLeaseName[address]!.leaseName
43 }
44 return nil
45 }
46
47 access(account) fun setNameAddressCache(address: Address?, leaseName: String, validUntil: UFix64) {
48 if self.nameAddress[leaseName] == nil {
49 self.nameAddress[leaseName] = LeaseCache(leaseName: leaseName, validUntil: validUntil, address: address)
50 return
51 }
52 panic("There is already a cache for this name. Name : ".concat(leaseName))
53 }
54
55 access(all) fun getNameAddress(_ name: String) : LeaseCache? {
56 if self.nameAddress[name]!.validUntil >= Clock.time() {
57 return self.nameAddress[name]
58 }
59 return nil
60 }
61
62 access(account) fun resetLeaseCache(address: Address, leaseName: String) {
63 self.addressLeaseName.remove(key: address)
64 self.nameAddress.remove(key: leaseName)
65 }
66
67 access(account) fun setWalletIndexCache(address: Address, walletType: Type, index: Int) {
68 if self.profileWalletIndex[address] == nil {
69 self.profileWalletIndex[address] = {}
70 self.profileWalletIndex[address]!.insert(key: walletType, index)
71 return
72 } else if self.profileWalletIndex[address]![walletType] == nil{
73 self.profileWalletIndex[address]!.insert(key: walletType, index)
74 return
75 }
76 panic("There is already a cache for this wallet. User : ".concat(address.toString()).concat(". Wallet : ").concat(walletType.identifier))
77 }
78
79 access(all) fun getWalletIndex(address: Address, walletType: Type) : Int? {
80 if self.profileWalletIndex[address] == nil {
81 return nil
82 }
83 return self.profileWalletIndex[address]![walletType]
84 }
85
86 access(account) fun resetWalletIndexCache(address: Address) {
87 self.profileWalletIndex.remove(key: address)
88 }
89
90 init() {
91 self.addressLeaseName = {}
92 self.nameAddress = {}
93 self.profileWalletIndex = {}
94 }
95}
96