Bitcoin NFT Trades

The Bitcoin NFT landscape comprises multiple marketplaces. The table below shows the Bitcoin NFT marketplaces indexed by Allium.

Marketplace
ordwallet
ordswap
openordex
magiceden
gamma
unisat
okx

Sample Query

Get the market overview of Bitcoin NFTs, in 10 lines of SQL.

SELECT 

    date(block_timestamp) as date, 

    marketplace,

    count(*) as "Count",

    count(distinct collection_name) as "Collections",

    count(distinct buyer_address) as "Buyers",

    sum(usd_price) as "USD Volume"

FROM bitcoin.nfts.trades 

group by 1,2

order by 1 desc

Get and overview of Bitcoin NFTvolumes across key NFT marketplace.

Table Columns

Column NameDescriptionExample
marketplaceThe marketplace used to faciliate the tradeordswap
protocolThe protocol of the marketplace.NULL
order_match_typeType of sales. Registered as BUY for direct purchase and ACCEPT_BID for bids accepted.BUY
trade_typeType of trade. SINGLE_TRADE for single token sales or BUNDLE_TRADE when more than 1 token is sold in a transaction.SINGLE_TRADE
buyer_addressPubkey of the buyer, defined as the party sending the fundsbc1pfsl6u50r05cpegy6aqf838w4nz2lyml9946ntfzjt8s0u4e05w5qju8tpa
seller_addressPubkey of the seller, defined as the party sending the NFTbc1pcg5gvey9fth7danwy46em0fmynhl9mzqghdjld3c9l6fyadzkfqs2tf72q
_nft_recipientPubkey of the party receiving the NFT. May be different from buyer_addressbc1pfsl6u50r05cpegy6aqf838w4nz2lyml9946ntfzjt8s0u4e05w5qju8tpa
_sales_proceeds_recipientPubkey of the party receiving the funds. May be different from seller_addressbc1pcg5gvey9fth7danwy46em0fmynhl9mzqghdjld3c9l6fyadzkfqs2tf72q
currency_addressAddress of the currency.NULL
currency_symbolSymbol of the currency.BTC
raw_gas_feeGas fee of the trade in satoshis50088
gas_feeGas fee of the trade normalized0.00050088
usd_gas_feeUSD value of the gas fee13.471162591
raw_sales_proceedsSales proceeds of the trade in satoshis155670
sales_proceedsSales proceeds of the trade normalized0.0015567
usd_sales_proceedsUSD value of the sales proceeds31.953976158
raw_pricePrice of the NFT in number of satoshis. (includes fees)100000
pricePrice of the NFT normalized. (includes fees)0.001
usd_priceUSD value of the trade. The USD value of the trade is calculated by multiplying the hourly exchange rate of the currency (e.g. BTC) with the price oracle data source from exchanges during the hour of the trade. (includes fees)22.21803
buyer_fees

Fees paid by the NFT buyer.

It might be “unimplemented” if we haven’t parse the fees for that protocol yet. Otherwise, it will be a json with 9 columns.

”creator” fees are the ones paid to the nft creator (royalties); “platform” fees are paid to the marketplace; “total” fees are the sum of both fees

Use this syntax to access a specific fee:buyer_fees[‘usd_total’]::double. And don’t worry about the unimplemented ones, they will become null

{ "creator": 0.625, "platform": null, "raw\_creator": "625000000000000000", "raw\_platform": null, "raw\_total": "625000000000000000", "total": 0.625, "usd\_creator": 0.40125, "usd\_platform": null, "usd\_total": 0.40125 }
seller_feesFees paid by the NFT seller. Similar in structure to buyer_fees{ "creator": 0.625, "platform": null, "raw\_creator": "625000000000000000", "raw\_platform": null, "raw\_total": "625000000000000000", "total": 0.625, "usd\_creator": 0.40125, "usd\_platform": null, "usd\_total": 0.40125 }
agg_feesSum of the fees paid by the NFT buyer and the seller. Similar in structure to buyer_fees{ "creator": 0.625, "platform": null, "raw\_creator": "625000000000000000", "raw\_platform": null, "raw\_total": "625000000000000000", "total": 0.625, "usd\_creator": 0.40125, "usd\_platform": null, "usd\_total": 0.40125 }
raw_feeFee of the trade in number of satoshis. (deprecated)100000
feeFee of the trade normalized. (deprecated)0.001
usd_feeUSD value of the feeade. The USD value of the feede is calculated by multiplying the hourly exchange rate of the currency (e.g. BTC) with the price oracle data source from exchanges during the hour of the trade. (deprecated)22.21803
item_quantityNumber of NFTs traded within this utxo. As each row in the table is a transfer of 1 UTXO, in some cases, 2 inscriptions can be in 1 UTXO, resulting in a bundle trade.1
inscription_idinscription id, composed of the genesis transaction hash with a i0 suffix to represent the first inscription in the tx83f84267835b46aa44ab9f6e829c1363f2c5bc882d04242d20b832a034633779i0
inscription_nameThe inscription name, if available.
inscription_numberThe inscription number, sometimes known as index, if available1980222
collection_nameThe collection name, if available.Bitcoin Punks
collection_slugThe collection slug, if availablebitcoin-punks
content_typeContent type of the inscriptiontext/plain
content_tagContent tag, which is a reclassification of the raw content_type field to make it easy to analyze.

image
video
application
audio
text
model
others

content_lengthNumber of bytes of the inscription content1204
content_protocol

(For json inscriptions with a p key)
The protocol of the inscription, derived with json_content[‘p’]

brc-20
content_parsed

(For textual inscriptions)
The parsed content of the inscription, could be a utf-8 string or a json object

hello world

{"p":"brc-20","op":"transfer","tick":"pepe","amt":"500"}

is_brc20Derived with content_protocol = 'brc-20'. To be deprecated for is_token + content_protocoltrue
is_token

Used to identify token-like standards.

Derived with content_protocol = ‘brc-20’ or ‘orc-20’ or ‘orc20’

true
token_tick

The tick of the token-like inscription.

Derived with content_parsed[‘tick’]

ordi
token_amt

The amout specified in the token-like inscription.

Derived with content_parsed[‘amt’]

100
sats_per_token_tick

Satoshis per token-like amount.

Derived with satoshi of the trade / token_amt

1000000
usd_per_token_tick

USD per token-like amount.

Derived with USD of the trade / token_amt

1.50
domain_protocolDomain name protocol used to parse the content

sns
bitmap

domain_namethe domain name (portion before the . )abc
domain_namespacethe domain namespace (portion after the . )sats
domain_validtrue/false - domains are invalid if they are not the first or are unstable inscriptionstrue/false
domain_metathe metadata of the domain op, such as about, rev, avatar fields.{"avatar":"cfab194b924f7785c6e453728e1c264b89b74843633278cda3ad3f57576c1e93i0","op":"reg"}
is_domain

true/false - whether the domain name/namespace fit the requirements of sns/bitmap protocols.


Malformed/illegal formats of inscriptions are removed here. There may be some edge cases because sns allows text inscriptions which have lots of noise.

true/false
genesis_feeGenesis fee of the inscription when it was inscribed12313
satoshi_timestampThe timestamp of the satoshi when it was mined.2019-02-14 20:39:36
transaction_hashTransaction hash of the nft trade.47b1a461fc68ece7d0d933fc0fb77c5316867887d5bce266596d48d14f077130
transaction_indexIndex of the transaction within the block281
block_timestampTimestamp of the block.2023-02-14 20:39:36
block_numberBlock number of the nft trade.776557
block_hashBlock hash of the nft trade.000000000000000000039d091930c5b3cc660c4f246cfc66e49ebd677a4e7afd
unique_idUnique id of the trade, composed from transaction_hash.txn-47b1a461fc68ece7d0d933fc0fb77c5316867887d5bce266596d48d14f077130