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: 0x4ce24CE06cB239Fb248d93F830670AdfC7745A91 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: 0x23bD468Cf747111DCd186249F09D6ea3DD6A3721 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: 0x1b188e150cd767274F900976962510Ed4F997201 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: 0x85AD4Fe2397addE63d6E12589B674513C3201551 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: 0x777138e483D83dCb34A3Ea2ceb54669C42E3b54F 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: 0x93c8CD2d1E94E79EFE205EB7B19ecAE59f3b47d0 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 Contract: Tangible 100g Gold Bar TNFT: 0x07cd1de91f2d423Ef4Db3e6a61a2883e06BeB59B Tangible 250g Gold Bar TNFT: 0x9497A11e821fAD77D842e0Bb6e9A1a13bD1d7cf4 Tangible 500g Gold Bar TNFT: 0x287Fd9Ce885E3533344a0226E715Ad9338eFa003 Tangible 1000g Gold Bar TNFT: 0x760e22a8DD00F345efB61B24d901F8F17Fb3A4bc Tangible Wine TNFT: 0xe429ED3c6023214893Ccdc0211Eb3eD4fB446999 Tangible Watch TNFT: 0x75336577C9FDDe0b340C603146914f2Dd213CaA4
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.
Copy link
On this page