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.
Tangible Gold Oracle: 0x1dB671d1B29c29D09Bc13EaAb9de6cC96AF4bD34 Tangible Wine Oracle: 0x42f51c08e93b89c936d8D829b0C696Ca408D2241 Tangible Watch Oracle: 0xfF760C9c02e3206E07911C584AcF2ee3834cC02d TNGBL Token Oracle: 0xA0fB0349526B7213b6be0F1D9A62f952A9179D96
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: 0xd09Cc86f2d322a75F08006B9f6Dd31776833a492
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
- InstantLiquidity 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: 0x6216745AE1Dc1132BA8b0C67bca91d14381bC928 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: 0xfD0983bCE9807fF69C163db2b651763BeD5D8d1e 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: 0x0389dAD5f25901fCB65fc1df2610660Ddd5B91db 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: 0xDc7ee66c43f35aC8C1d12Df90e61f05fbc2cD2c1 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 Marketplace Fee Distributor: 0x49c7371DAecB7f06fC7303A14ab80174453dF4cF Tangible Revenue Share Contract: 0x0531Dfd07643B549a07F21dd5BA1Da1e1C43142e 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: 0xCC67B3b32A02c1025C9b4e6B404fC7343a3D175f 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
Instant liquidity Engine: 0x73090ed22239f3E37aA37a903D7441F9AFFc6bB1 Instant liquidity is our mechanism to offer an instant purchase of any users’ assets, knowing there may be instances when a user must sell their TNFT immediately to recapture that value in liquid form. We do this through buying back the user’s TNFT at a designated markdown below the current market price. Instant liquidity requires both the current prices of TNGBL as well as access to the TWAP oracle.
TNFT Contracts: Tangible 100g Gold Bar TNFT: 0x65b86882D5bCf9AD1C3F8Fd09C92F834f92E32B4
Tangible 250g Gold Bar TNFT: 0xd214c3b23203C02C356D14c0FB655da5682d0c26
Tangible 500g Gold Bar TNFT: 0x88a07267495a51D0d19b86b184F974590A834F61
Tangible 1000g Gold Bar TNFT: 0x51F6B11f8D46DD6843C2b7a8Dc5252236E39fad6
Tangible Wine TNFT: 0xF5BDe94E98E20ade36FB720E8A0f8b5394bcEc93
Tangible Watch TNFT: 0xe6a1EDC64C7860f5B20b56eb89F16b279D0972e1
Tangible Real Estate TNFT: 0x29613FbD3e695a669C647597CEFd60bA255cc1F8
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: Dynamically generated per instance 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.