The project development is suspended, parsers will fail to launch on current data
Hic et nunc is a new eco-friendly NFT marketplace, built on top of Tezos blockchain.
It is especially popular in generative graphics and data viz community, so I've decided to share data and all scripts that I've made for https://hashquine.github.io/hicetnunc rating.
It is published under CC BY license, so that it is even possible to sell NFTs that use that data (or modified scripts) as long as there is the following phrase somewhere in the token description: based on @hashquine dataset
.
Since hicetnunc servers are already under an extreme load due to quick growth, I've reorganized code, so that all data is taken from Tezos blockchain and IPFS without any calls to the hicetnunc.xyz website or API.
Data not available:
The goal was to simplify data analysis and visualization with a wide range of existing tools, so there are lots of redundant fields, which contain precalculated aggregations and different representations of the same data.
All files have two equivalent versions: JSON and CSV.
*_id
field.-1
or ""
.Any field, which references some event in the blockchain (for example, mint time) have 4 representations:
mint_iso_date
— string with UTC date and time: "2021-03-01T15:00:00Z"
,mint_stamp
— integer Unix timestamp in seconds: 1614610800
,mint_hash
— string with transaction hash, where event occurred: "oom5Ju6X9nYpBCi..."
,mint_row_id
— integer with global unique operation id (internal to TzStats) with that event: 42181049
Any field, which references a set of values (like the set of prices of sold works), have following aggregations:
sold_count
— values count,sold_nonzero_count
— number of positive values,sold_zero_count
— number of zeros,sold_price_min
— minimum value (excl. zeros),sold_price_max
— maximum value,sold_price_sum
— sum of values,sold_price_avg
— average value (sum divided by count excl. zeros).There is a confusing fact, that in hicetnunc each NFT can have multiple identical instances, which are fungible. In this document term "token" refers to the set of all that instances.
There are following invariants:
mint_count = author_owns_count + available_count + available_zero_count + other_own_count + burn_count author_sent_count <= other_own_count + available_count + available_zero_count
field | type | example | description |
---|---|---|---|
token_id |
string |
"152" |
Token identifier: numeric strings with OBJKT ids from hicetnunc.xyz/objkt url. |
issuer |
string |
"tz1UBZUk..." |
Address of the person, who intiated mint transaction and receives royalties. It is also referred to as token author in this dataset. |
mint_count |
integer |
100 |
How many token instances were minted. This number does not change: it is impossible to mint additional token instances in hicetnunc for now. |
mint_iso_date mint_stamp mint_hash mint_row_id |
string integer string integer |
"2021-03-01T15:00:03Z" 1614610803 "oom5Ju6X9nYpBCi..." 42181049 |
Mint event. |
artifact_ipfs |
string |
"Qma11k..." |
IPFS address of NFT content. |
artifact_mime |
string |
"image/gif" |
Mime type of artifact_ipfs . |
artifact_file_size |
integer |
2043418 |
File size of artifact_ipfs in bytes. |
artifact_preview_width |
integer |
1024 |
Preview image width of artifact_ipfs in pixels. Not more, than 1024. |
artifact_preview_height |
integer |
781 |
Preview image height of artifact_ipfs in pixels. Not more, than 1024. |
info_title |
string |
"Dali tower" |
Title of the NFT specified by creator. |
info_description |
string |
"generated by ..." |
Description of the NFT specified by creator. |
info_tags |
string |
"tag1 tag2" |
List of the NFT tags specified by creator delimited with space character. |
ban_status |
string |
"banned" |
If empty - token is ok, banned - token is banned, author_banned - token author is banned. Ban status is taken from hicetnunc repository |
Statistics fields | |||
author_sold_count author_sold_nonzero_count author_sold_zero_count author_sold_prices_min author_sold_prices_max author_sold_prices_sum author_sold_prices_avg |
integer integer float float float float |
100 10 1.25 2.5 33.7 1.325 |
Prices of sold works (in swaps) by author in XTZ. Note, that theoretically single NFT instance can be sold by author multiple times in case the buyer returns it back. |
secondary_sold_count secondary_sold_nonzero_count secondary_sold_zero_count secondary_sold_prices_min secondary_sold_prices_max secondary_sold_prices_sum secondary_sold_prices_avg |
integer integer float float float float |
100 10 1.25 2.5 33.7 1.325 |
Prices of sold works (in swaps) by other users in XTZ. |
available_count available_nonzero_count available_zero_count available_prices_min available_prices_max available_prices_sum available_prices_avg |
integer integer float float float float |
100 10 1.25 2.5 33.7 1.325 |
Prices of available works (in swaps) both from author and on secondary market in XTZ. |
burn_count |
integer |
15 |
How many token instances were burned by creator or other users. |
author_owns_count |
integer |
5 |
How many token instances are owned by author (not including available_count ). |
other_own_count |
integer |
95 |
How many token instances are owned by other users (not by burn, swap or author). |
author_sent_count |
integer |
5 |
How much instances were directly transferred by author to users without official swaps. |
Auxiliary fields | |||
info_ipfs |
string |
"Qma11k..." |
IPFS identifier of the NFT JSON metadata |
display_uri_ipfs |
string |
"Qma11k..." |
Token preview image identifier on IPFS or empty string. Note, that it is rare and only used for specific file types like HTML |
royalties |
float |
10.0 |
"Royalties" parameter passed during token mint in percent. |
info_creator |
string |
"tz1UBZUk..." |
Address of the token creator as specified in token meta JSON file. In 99.99% the same as issuer field, but sometimes empty probably due to some bug. |
mint_tokens_receiver |
string |
"tz1UBZUk..." |
Address of the user, who received tokens after mint transaction. In 99% the same as issuer field. |
mint_ah_row_id |
integer |
None |
Row id of mint operation by "Art house" contract (not by NFT contract). |
All users, who ever created or owned NFT token.
field | type | example | description |
---|---|---|---|
address |
string |
"tz1UBZUk..." |
Address of the user in Tezos blockchain. Can be contract address as well. |
first_action_iso_date first_action_stamp first_action_hash first_action_row_id |
string integer string integer |
"2021-03-01T15:00:03Z" 1614610803 "oom5Ju6X9nYpBCi..." 42181049 |
When first transaction (related to hicetnunc) with this address occurred. |
tzkt_info_name |
string |
"dacosta works" |
User alias field according to tzkt.io metadata. |
tzkt_info_twitter |
string |
"dacosta_works" |
User Twitter account according to tzkt.io metadata. |
tzkt_info_email |
string |
"sartist@gmail.com" |
User e-mail according to tzkt.io metadata. |
tzkt_info_instagram |
string |
"dacosta_works" |
User Instagram account according to tzkt.io metadata. |
tzkt_info_site |
string |
"https://jsh.sh" |
User website according to tzkt.io metadata. |
tzkt_info_description |
string |
"NFT artist ..." |
User description according to tzkt.io metadata. |
tzkt_info_logo |
string |
"huson.png" |
User logo according to tzkt.io metadata. Add prefix services.tzkt.io/v1/avatars2/ to get the full url |
tzkt_info_github |
string |
"josim" |
User GitHub account according to tzkt.io metadata. |
tzkt_info_telegram |
string |
"thebaskia" |
User Telegram account according to tzkt.io metadata. |
tzkt_info_facebook |
string |
"barbeaucodeart" |
User Facebook account according to tzkt.io metadata. |
tzkt_info_reddit |
string |
"user/mathmakesart" |
User Reddit account according to tzkt.io metadata. |
ban_status |
string |
"banned" |
If empty - author is ok, banned - user is banned, some_tokens_banned - user is not banned, but it minted banned tokens. Ban status is taken from hicetnunc repository |
Statistics fields | |||
mint_count |
integer |
125 |
Number of minted works. |
bought_count bought_nonzero_count bought_zero_count bought_prices_min bought_prices_max bought_prices_sum bought_prices_avg |
integer integer float float float float |
100 10 1.25 2.5 33.7 1.325 |
Prices of bought works (in swaps) by this address in XTZ. |
author_sold_count author_sold_nonzero_count author_sold_zero_count author_sold_prices_min author_sold_prices_max author_sold_prices_sum author_sold_prices_avg |
integer integer float float float float |
100 10 1.25 2.5 33.7 1.325 |
Prices of sold works (in swaps) by author in XTZ. |
secondary_sold_count secondary_sold_nonzero_count secondary_sold_zero_count secondary_sold_prices_min secondary_sold_prices_max secondary_sold_prices_sum secondary_sold_prices_avg |
integer integer float float float float |
100 10 1.25 2.5 33.7 1.325 |
Prices of sold works on secondary market (i.e. swaps not by author) in XTZ. |
available_count available_nonzero_count available_zero_count available_prices_min available_prices_max available_prices_sum available_prices_avg |
integer integer float float float float |
100 10 1.25 2.5 33.7 1.325 |
Prices of available works (in swaps) both by author and other users in XTZ. |
in_op_count |
integer |
25 |
Number of incoming transactions |
out_op_count |
integer |
33 |
Number of outcoming transactions |
money_received |
float |
2.78999 |
Total volume of XTZ received by address in transactions related to hicetnunc |
money_sent |
float |
10 |
Total volume of XTZ sent by address in transactions related to hicetnunc |
There is the following invariant:
price * count = total_royalties + total_comission + total_seller_income
field | type | example | description |
---|---|---|---|
tr_iso_date tr_stamp tr_hash tr_row_id |
string integer string integer |
"2021-03-01T15:00:03Z" 1614610803 "oom5Ju6X9nYpBCi..." 42181049 |
When transaction occurred. |
token_id |
string |
"205" |
Numeric string with token identifier. |
count |
integer |
10 |
Number of token instances transferred. |
seller |
string |
"tz1UBZUk..." |
Seller address i.e. user who created the swap |
buyer |
string |
"tz1MwvWa..." |
Buyer address |
price |
float |
2.5 |
Price per item in XTZ (how much buyer payed per item) |
swap_id |
string |
"503" |
Numeric string with swap identifier. |
by_author |
boolean |
1 0 |
If 1 - swap was created by author, if 0 - by other user. |
author |
string |
"tz1UBZUk..." |
Address of token issuer, which receives royalties. |
Statistics fields | |||
total_royalties |
float |
12.75 |
Author income from royalties (already multiplied by count ) for secondary sells and 0 otherwise |
total_comission |
float |
1.3 |
Comission per item in XTZ. Usually 2.5% of price. |
total_seller_income |
float |
1.3 |
Seller income (already multiplied by count ). |
field | type | example | description |
---|---|---|---|
tr_iso_date tr_stamp tr_hash tr_row_id |
string integer string integer |
"2021-03-01T15:00:03Z" 1614610803 "oom5Ju6X9nYpBCi..." 42181049 |
When transaction occurred. |
category |
string |
mint->author author->swap swap->author swap->user user->user author->burn user->burn user->ext ... |
String, which characterizes transfer in following terms: author , swap , user , burn , ext . This division is a convention used in this repository only. |
token_id |
string |
"207" |
Numeric string with token identifier. |
price |
float |
1.5 |
Price per item in XTZ or 0 for direct transfers. For external swaps price is guessed heuristically as half of sum of abolute values of transaction money transers (since each money transaction is counted twice both as incoming and outcoming). |
count |
integer |
5 |
Number of token instances transferred. |
swap_id |
string |
"523" |
Numeric string with swap identifier or empty string if it is a direct transfer. |
sender |
string |
"tz1UBZUk..." |
Sender address or empty string in case of mint |
receiver |
string |
"tz1MwvWa..." |
Receiver address |
method |
string |
"mint_OBJKT" |
Called method of hicetnunc or external contract, otherwise empty string |
field | type | example | description |
---|---|---|---|
swap_id |
string |
"503" |
Numeric string with swap identifier. |
token_id |
string |
"207" |
Numeric string with token identifier. |
price |
float |
1.5 |
Price per item in XTZ. |
total_count |
integer |
100 |
Total number of instances in swap. |
created_iso_date created_stamp created_hash created_row_id |
string integer string integer |
"2021-03-01T15:00:03Z" 1614610803 "oom5Ju6X9nYpBCi..." 42181049 |
When swap was created. |
closed_iso_date closed_stamp closed_hash closed_row_id |
string integer string integer |
"2021-03-01T15:00:03Z" 1614610803 "oom5Ju6X9nYpBCi..." 42181049 |
When swap was closed (cancelled). If closed, swap cannot be reopened again. |
by_author |
boolean |
1 0 |
If 1 - swap was created by author, if 0 - by other user. |
created_by |
string |
"tz1UBZUk..." |
Address of the user, which created swap. |
Statistics fields | |||
sold_count |
integer |
99 |
Number of sold (including with zero price) instances. |
available_count |
integer |
1 |
Number of available instances if the swap is not closed, 0 otherwise. |
returned_count |
integer |
0 |
Number of unsold instances returned to the swap creator if the swap was closed, 0 otherwise. |
sold_price_sum |
float |
148.5 |
Total price of sold instances in XTZ. |
There are 3 Tezos addresses, which are common to most of hicetnunc transactions:
There are several other contracts related to curation and hDAO mechanisms, which are independent from the contracts mentioned above.
Actually, hicetnunc was not created just as another NFT marketplace, it has much broader mission as hDAO (hicetnunc DAO). You can get the idea of the creators vision on hicetnunc blog. As a result, only a small subset of contract's logic is actually used during hicetnunc website operation.
Official swap mechanism by hicetnunc "Art house" contract.
author->swap
, other->swap
, swap->author
, swap->other
transfers.External swap mechanisms.
other->other
transfers. The related price is guessed heuristically (as half of money transferred in all operations) and may not be always correct.In contrast to NFT definition, each NFT artwork in hicetnunc can have multiple copies, which are fungible. The NFT contract only tracks the amount of copies owned by each address. This means, that there is no way (even in theory) to track history of single copy like it can be done on OpenSea, for example.
It is possible, however, to track history of token groups to some extent. Here is a list of possible owner types in this dataset:
author
— the person, who created the tokens during mint.user
— any other hicetnunc user.ext
— any external contract (external swap mechanism, for example).burn
— reserved address for burning tokens.swap
— when tokens are offered on sale in official swaps.List of possible transitions:
mint->author
, mint->user
First, every token should be minted.
author->swap
, user->swap
Any token owner can create official swap.
swap->author
, swap->other
There are two situations, when tokens may be transferred from a swap.
author->user
, user->user
Any token owner can transfer tokens directly to other users for free by calling "transfer" method of "NFT" contract.
author->ext
, user->ext
, ext->user
, ext->author
— external swaps
author->burn
, other->burn
Any token owner can transfer tokens to burn address tz1burnburnburnburnburnburnburjAYjjX
.
mint_sender
The address of the sender of the "mint" transaction.
issuer
The address of the receiver of tokens after the mint transaction.
info_creator
Field "creators" in JSON in token metadata.
Note, that the code is still experimental and may require substantial changes to make it run. But you can read introduction in HACKING.md