Calldata Attribution

One challenge for NFT Aggregation platforms is the most gas-efficient method to fill an order is directly through the exchange contract (Seaport, LooksRare, etc). However when doing so, the transaction is indistinguishable from an order that was filled on the marketplace where the order was created (e.g. OpenSea). This leads to significant misreporting of where NFT volume is happening, when looking at on-chain analytics. As an example, around 50% of all Gem transactions are filled directly via Seaport, and completely unattributed to Gem!

To solve this problem, we are working with the NFT community on a standard for attributing trades that is:

  • open
  • on-chain
  • gas-efficient
  • compatible with any exchange

In short, the idea is that aggregation platforms pass their domain name in the calldata of each transaction they fill, so that on-chain analytics tools can parse it and determine who filled the order.

Domain names are used because:

  • They are easy to read
  • They can be visited to learn more
  • Additional metadata (icon, etc) can be pulled from html tags

Version 1

In Version 1, the domain is converted to hex, and surrounded by the delimiter 1f: > 1f656e732e766973696f6e1f > 1f6d61726b6574706c6163652e74727574686c6162732e636f1f

Example Transaction:
Dune Report Demonstrating Parsing

Version 2

The advantage of Version 1 is that it is completely open, and does not require any "registry" of valid domains. However the downside is that the gas cost grows with the length of the domain (16 gas units per character).

To solve this, we are working on a V2 that uses the first 4 bytes of the domain hash:


This is already live in production on Gem: > 72db8c0b

Example Dune Query

We will be rolling this out across Reservoir soon, along with tooling for reverse lookups on domain hashes.