In building a protocol with the potential for lasting, long-term success, we understood that choosing the correct chain to build on was an important decision. The obvious answer was to leverage the network effects of the Ethereum ecosystem in order to maximize our reach. However, in offering fractionalized assets in our marketplace, we also needed a solution where the NFTs being traded were not outpriced by the gas required to process those transactions. We ultimately made the decision to build the marketplace on Polygon, which we believe offers the best of Ethereum, with easy network onramps and without the downsides of transaction costs on the ETH mainnet.
The physical assets sold in our marketplace are provided by partner suppliers, we don’t inventory them directly and instead pass those costs through when a TNFT is minted. As such, we needed a crypto-native payment platform that seamlessly integrated with the inventory management system of our partners while also removing exposure to crypto volatility. By leveraging USDC, we could build entirely within the crypto ecosystem, keeping necessary funds on-chain, with simple tools to off-ramp supplier payments still operating on fiat.
Before jumping into the details on the Factory Contract, let’s take a minute to look at how we’re integrating Oracles into our system.
Oracles were one of the biggest challenges we had to resolve. We needed to map each item back to its market price from our suppliers, fitting within the limitation of the Polygon block size. Further complicating this was the variety of products in our marketplace. At launch, we will have multiple suppliers of different assets, and within each of those assets, different permutations.
For example, we offer:
- Various brands and models of watches with different face sizes, band materials, and other key features.
- Hundreds of varieties of wine, with varying producers, grapes, vintages, and case sizes.
Our solution is the fingerprint, a unique ID assigned to each product. Each fingerprint has a matching product_id, a string representing each unique item. Fingerprints are assigned to products before the TNFT is minted, and tokenIds are mapped to the fingerprint after minting. Fingerprints and tokenIds continue to remain consistent through fractionalization. Fingerprints tie all of our available stock (owned, fractionalized, and unowned) to the correct market price and metadata. There can be multiple tokenIds mapped to the same fingerprint; for example, three 100g gold bars may share one fingerprint, but each would be represented by a unique token.
THE FACTORY CONTRACT:
The whole system is designed around a Factory Contract, with a complex permissions structure outlining who/what can access this contract, and how the data can be used. At any point in time, there can be only one owner of the Factory Contract and that owner is the vendor of the items for sale in the marketplace, Tangible Labs.
Through a carefully designed interface, the owner of the Factory Contract is propagated as the owner/admin of our TNFT contracts, TNFTs being Tangible NFTs that represent ownership over the physical goods that we sell in the marketplace i.e. real estate, wine, watches and gold bars. While Tangible Marketplace assets are currently limited to the above categories, we wanted to build for a future where Tangible can support hundreds or thousands of different physical asset class categories.
Our Factory Contract includes, references, or manages the following contracts in our system:
- TNFT Deployer Contract
- FTNFT Deployer Contract
- PriceManager Contract
- PassiveIncomeNFT Contract
- RevenueDistribution Contract
- RevenueShare Contract
- Marketplace Contract
Through the rest of this article, we’ll break down the details on the various component contracts and how they integrate with the system as a whole.
TNFT Deployer Contract: Due to blockchain file size restrictions and the size of our TNFT contract, we were not able to include it directly with the Factory Contract. Instead, the Factory calls the deployer contract which was created specifically to deploy a new instance of the TNFT contract when necessary.
FTNFT Deployer Contract: This is the same as the TNFT deployer, its only task is to deploy a new FTNFT (Fractional TNFT) contract for users that want to split their TNFT into fractions. The Factory keeps track of each FTNFT deployed through the same management system as the TNFTs.
Tangible Products Price Manager: This contact contains a map between the deployed TNFT contract and its appropriate pricing oracle, enabling access to asset pricing through the Factory Contract as it contains the pricing manager.
3,3+ NFT Contract: This contract locks up TNGBL tokens for 2 - 48 months. These locked token contracts will begin to accrue rewards starting on the mint date, 5/2/2022. Minting a TNFT will also mint a locked token position that provides the user with their TNGBL rewards for the duration of the chosen lock period. Early claims of locked rewards will trigger the contract to burn the amount of TNGBL that is no longer available due to the penalty of claiming early rewards.
Marketplace Fee Distributor and Revenue Share Contracts The Marketplace Fee Distributor contract receives the 2.5% marketplace fees and distributes these collected fees to the Revenue Share contract on a daily basis. From there, RevenueShare makes the collected fees claimable for NFT holders. The contract tracks all the revenue generating NFTs in circulation to make sure each NFT is allocated the correct share of available fees.
Marketplace Contract: This is the contract used for selling physical assets from our suppliers’ stock as well as items that users decide to sell themselves in the marketplace. The contract contains the processes for purchasing unminted (supplier items) as well as minted items (TNFTs) and it has special permissions necessary to access functions within the Factory. It also handles initial fractionalization of TNFTs and selling/purchasing FTNFTs. Specifically, the Marketplace Contract relies on the Factory Contract to: Fetch prices Fetch stock Mint the desired TNFT Transfer assets within our ecosystem Pay for storage Lock TNGBL rewards
TNFT Contracts: Tangible 100g Gold Bar TNFT
Tangible 250g Gold Bar TNFT
Tangible 500g Gold Bar TNFT
Tangible 1000g Gold Bar TNFT
Tangible Wine TNFT
Tangible Watch TNFT
Tangible Real Estate TNFT
The TNFT Contract is the smart contract that describes every Tangible category. For each existing or new category on the site, a specific TNFT is deployed. The TNFT Contract contains all the fingerprints and product_ids for that category of assets, which are assigned when the TNFT is minted.
The TNFT Contract also handles details around storage payments and storage timeline expirations. Some product categories (gold bars, watches) require storage costs to be based on a percentage of the assets current value while others (wine) have a fixed storage cost per year. Real estate won’t have any storage costs which is also reflected in the TNFT Contract.
The TNFT Contract also abstracts that products 3,3+ NFT which entitles the holder to claim USDC revenue share and TNGBL token rewards over time.
FTNFT Contract: The FTNFT Contract is the fractionalized version of a TNFT, allowing a user to sell a percentage of the TNFT to other buyers via FTNFT fractions. The process of fractionalization is entirely percentage-based: the size of your new percentage share, and the size of the fractional shares sold to new users, are attached to the FTNFT. Initially, it can only be created through the Marketplace contract.
The FTNFT Contract allows FTNFT holders to claim their allotment of USDC revenue share and TNGBL token rewards, but never more than the percentage that the FTNFT entitles them to. The contract also allows FTNFT holders to further fractionalize their fraction as well as merge multiple fractions into one larger fraction.
Every tokenId will have its own FTNFT which only manages assets tied to one TNFT. For example a user buys a watch. That watch is represented with a watch TNFT contract address and its tokenId. The corresponding FTNFT contract is tied to only that one tokenId and related TNFT. When the user fractionalizes that watch, they will deploy the FTNFT of that specific watch (tokenId). The FTNFT will exist until the tokenId is burned.
Also, in case of Real Estate, each FTNFT owner is given access to rental payments, appropriate to their share.
All of our contracts have been designed to be configurable, they can easily be changed and replaced as the needs of the business evolve over time. The key exceptions to this are:
TNFT/FTNFT Contract These contracts have been designed to cover all potential future cases that may arise and once deployed they cannot be changed without a migration.
Marketplace Contract Once deployed, we cannot alter this contract without a vote through the community DAO. The owner of this contract is the DAO.