Smart Contract
ViewResolvers
A.15a918087ab12d86.ViewResolvers
1/**
2> Author: Fixes Lab <https://github.com/fixes-world/>
3
4# Token List - A on-chain list of Flow Standard Fungible Tokens (FTs).
5
6This is the view resolver utilties contract of the Token List.
7
8*/
9import ViewResolver from 0x1d7e57aa55817448
10
11access(all) contract ViewResolvers {
12
13 /* --- Contract View Resolver --- */
14
15 /// The contract view resolver
16 ///
17 access(all) resource ContractViewResolver: ViewResolver.Resolver {
18 /// The address of the contract
19 access(all) let address: Address
20 /// The name of the contract
21 access(all) let contractName: String
22
23 init(
24 address: Address,
25 contractName: String
26 ) {
27 self.address = address
28 self.contractName = contractName
29
30 // Ensure the contract view resolver is valid
31 self.borrowContractViewResolver()
32 }
33
34 // ---- Implementing the Resolver ----
35
36 access(all)
37 view fun getViews(): [Type] {
38 let viewResolver = self.borrowContractViewResolver()
39 return viewResolver.getContractViews(resourceType: nil)
40 }
41
42 access(all)
43 fun resolveView(_ view: Type): AnyStruct? {
44 let viewResolver = self.borrowContractViewResolver()
45 return viewResolver.resolveContractView(resourceType: nil, viewType: view)
46 }
47
48 // ---- Local Methods ----
49
50 access(self)
51 view fun borrowContractViewResolver(): &{ViewResolver} {
52 return ViewResolvers.borrowContractViewResolver(self.address, self.contractName)
53 ?? panic("Contract view resolver not found")
54 }
55 }
56
57 /// Create a contract view resolver
58 ///
59 access(all)
60 fun createContractViewResolver(
61 address: Address,
62 contractName: String
63 ): @ContractViewResolver {
64 return <- create ContractViewResolver(address: address, contractName: contractName)
65 }
66
67 /// Borrow a contract view resolver
68 ///
69 access(all)
70 view fun borrowContractViewResolver(_ addr: Address, _ name: String): &{ViewResolver}? {
71 let viewResolver: &{ViewResolver}? = getAccount(addr).contracts.borrow<&{ViewResolver}>(name: name)
72 return viewResolver
73 }
74
75 /* --- Collection Resolver --- */
76
77 /// The collection view resolver
78 ///
79 access(all) resource CollectionViewResolver: ViewResolver.Resolver {
80 // FTView Resolver Collection Capability
81 access(self)
82 let cap: Capability<&{ViewResolver.ResolverCollection}>
83 // FTView Id
84 access(self)
85 let id: UInt64
86
87 init(
88 _ cap: Capability<&{ViewResolver.ResolverCollection}>,
89 id: UInt64
90 ) {
91 pre {
92 cap.check(): "Collection view resolver capability is invalid"
93 }
94 post {
95 self.borrowViewResolver() != nil: "Collection view resolver is invalid"
96 }
97 self.cap = cap
98 self.id = id
99 // Ensure the collection view resolver is valid
100 self.borrowViewResolver()
101 }
102
103 // ---- Implementing the Resolver ----
104
105 access(all)
106 view fun getViews(): [Type] {
107 let viewResolver = self.borrowViewResolver()
108 return viewResolver?.getViews() ?? []
109 }
110
111 access(all)
112 fun resolveView(_ view: Type): AnyStruct? {
113 let viewResolver = self.borrowViewResolver()
114 return viewResolver?.resolveView(view)
115 }
116
117 // ---- Local Methods ----
118
119 access(self) view
120 fun borrowViewResolver(): &{ViewResolver.Resolver}? {
121 let ref = self.cap.borrow()
122 ?? panic("Collection view resolver not found")
123 return ref.borrowViewResolver(id: self.id)
124 }
125 }
126
127 /// Create a collection view resolver
128 ///
129 access(all)
130 fun createCollectionViewResolver(
131 _ cap: Capability<&{ViewResolver.ResolverCollection}>,
132 id: UInt64
133 ): @CollectionViewResolver {
134 return <- create CollectionViewResolver(cap, id: id)
135 }
136}
137