Teller Protocol Diamond
Structure
This is the main diamond contract where all facets of the protocol can talk to each other through a shared storage interface. The ITellerDiamond
contract itself works by importing all of it's facets as dependencies. See below:
In the Teller Protocol, each Facet contains function helpers that come from its respective Library or libraries. Each Library contains not only function helpers to assist the facets, but also a storage function caller. Here's an example of our LoanDataFacet
Note: this example does not resemble our actual file on the Teller protocol, but rather a simplified version.
In this example, our LoanDataFacet
uses 2 functions that call from the LibLoans
and the LibEscrow
library, respectively:
getLoan
directly calls theLibLoans
storage functions()
which gets ourloan
data back after we pass ourloanID
getLoanEscrowValue
directly calls theLibEscrow
library functioncalculateTotalValue
to calculate the loan escrow value usingloanID
Next, we'll look at how storage works.
Storage
The way diamond storage works is that we add or read data to a struct
that is stored in a hashed position slot by calling a function. Let's call this function store()
. We shall take a look at our market.sol
storage file, since it's the most popular one in our Teller protocol.
This file, like the previous file, has been compressed for ease of understanding.
Our
MARKET_STORAGE_POS
is the hash of our position stringThe
store()
function in theMarketStorageLib
returns ourMarketStorage
at the position we initialized beforeThe
MarketStorage
is a heavy struct with multiple mappings to interfaces, primitive data types and other structs
So, now that we understand this, how do we call this function to update or read data? Well, it's simple really! Let's head to a simple function in our LibLoans
library called loan()
, which simply returns our loan data:
Let's go through this step by step
loan()
function takes in theloanID
as a parameter and returns a struct of typeLoan
(defined inmarket.sol
) with the help of ours()
functionthe
s()
function calls ourMarketStorageLib.store()
, which if you remember it returns ourMarketStorage
struct stored at our hashed slotNow that our
MarketStorage
is returned vias()
, we also return the specific loan by adding.loans[loanID]
That's really our Diamond Structure and Storage in a nutshell! Since our Diamond pulls in all of its Facets via Inheritance, calling any of our facet is still calling our Diamond Contract's address.
Last updated