How to Checkout your smart contract on TzStats

Beginner

 

How to Checkout your smart contract on TzStats

Welcome to our tutorial on how to check out your smart contract on TzStats, a blockchain explorer for the Tezos blockchain network. In this tutorial, we will cover the process of using TzStats to view and analyze your deployed smart contracts on the Tezos blockchain. We will explore the various features and functionality of the TzStats explorer, such as viewing contract information, searching for specific contract addresses, and monitoring contract activity.

By the end of this tutorial, you will have the knowledge and hands-on experience needed to use TzStats to view and analyze your smart contracts on the Tezos blockchain. You will also learn how to use TzStats to monitor the activity of your smart contracts and analyze the performance of your contracts on the Tezos network. This tutorial is ideal for developers, researchers, and anyone interested in learning more about the Tezos blockchain and its smart contracts.

Find your smart contract on TzStats

Once you have the address of your smart contract, go to the TzStats website associated with the network you deployed your contract on.

Remember, the following TzStats website link are the following:

Copy/paste your address in the search bar:

TzStats then shows a page with information related to your smart contract, e.g. the balance of the contract, the amounts sent and received, the creator address, etc.

Below the general information, you have a list of tabs allowing you to see:

  • the calls

  • the entry points

  • the contract code

  • the storage

  • the different big maps of your smart contract (if there are any)

For the following examples, we will check out the smart contract, deployed on the Mainnet, whose address is the following:

KT1HbQepzV1nVGg8QVznG7z4RcHseD5kwqBn

Available at this link.

Calls

Here you have the history of all transactions related to your smart contract.

It appears:

  • The transactions with the amount and the address of the sender.

  • The calls made to the entrypoints with the name of the entrypoint in question.

  • On the right the status of the block with the number of confirmation received.

Entrypoints

Here you have a list of all your entrypoints and their parameters. Furthermore, you can see how many calls each entrypoint has received.

Contract Code

Here you have the michelson code of your smart contract.

Storage\

Here you have access to the content of your storage with the type of each variable and its current value. Notice that the content excludes big maps as they are specific tabs for them.

Big map

Here you have the content of your bigmap.

API Calls

The same pieces of information can be retrieved by API calls, without using the frontend. A full documentation is available here.

The following API endpoints are the following:

First, let’s get the contract information. The “explorer” endpoints will be used (full reference here).

In this example, one of the contracts has been deployed on the Mainnet to KT1HbQepzV1nVGg8QVznG7z4RcHseD5kwqBn.

Let’s retrieve the contract details:

$ curl https://api.tzstats.com/explorer/contract/KT1HbQepzV1nVGg8QVznG7z4RcHseD5kwqBn 
{
   "address":"KT1HbQepzV1nVGg8QVznG7z4RcHseD5kwqBn",
   "creator":"tz1Y1j7FK1X9Rrv2VdPz5bXoU7SszF8W1RnK",
   "delegate":"",
   "storage_size":466932,
   "storage_paid":466932,
   "first_seen":1540787,
   "last_seen":1546844,
   "first_seen_time":"2021-07-03T02:48:58Z",
   "last_seen_time":"2021-07-07T13:15:58Z",
   "n_ops":11789,
   "n_ops_failed":1610,
   "bigmaps":{
      "metadata":6071,
      "swaps":6072
   },
   "iface_hash":"a357937c",
   "code_hash":"c1c14f18",
   "call_stats":{
      "cancel_swap":102,
      "collect":685,
      "swap":3366,
      "update_fee":0,
      "update_manager":1
   },
   "features":[
      "transfer_tokens"
   ],
   "interfaces":[
      
   ]
}

The pieces of information do match those from the web interface: address, creator, first_seen_time, last_seen_time

The call to the entrypoints “swap” can be seen in the call_stats field: 3366 calls have indeed been made to this entrypoint.

More details can be fetched about those calls:

$ curl https://api.tzstats.com/explorer/contract/KT1HbQepzV1nVGg8QVznG7z4RcHseD5kwqBn/calls
[
   {
      "row_id":58248380,
      "hash":"opCH4VjdvjSeicS3A7MeDVSjwGwz16DcE6WbkKzUxc6SQj8bhtU",
      "type":"origination",
      "block":"BMCS5sba3xLXkhpze68LQdLz7VRGD6edjMTH14eLr31DppAqF1x",
      "time":"2021-07-03T02:48:58Z",
      "height":1540787,
      "cycle":376,
      "counter":11788639,
      "op_l":3,
      "op_p":4,
      "op_c":0,
      "op_i":0,
      "status":"applied",
      "is_success":true,
      "is_contract":true,
      "gas_limit":19759,
      "gas_used":19759,
      "gas_price":0.30705,
      "storage_limit":4107,
      "storage_size":3850,
      "storage_paid":3850,
      "volume":0,
      "fee":0.006067,
      "burned":1.02675,
      "has_data":true,
      "days_destroyed":0,
      "big_map_diff":[
         {
            "action":"alloc",
            "bigmap_id":6072,
            "key_type":{
               "name":"@key",
               "type":"nat"
            },
            "value_type":{
               "name":"@value",
               "type":"struct",
               "args":[
                  {
                     "name":"creator",
                     "type":"address"
                  },
                  {
                     "name":"issuer",
                     "type":"address"
                  },
                  {
                     "name":"objkt_amount",
                     "type":"nat"
                  },
                  {
                     "name":"objkt_id",
                     "type":"nat"
                  },
                  {
                     "name":"royalties",
                     "type":"nat"
                  },
                  {
                     "name":"xtz_per_objkt",
                     "type":"mutez"
                  }
               ]
            }
         },
         {
            "action":"alloc",
            "bigmap_id":6071,
            "key_type":{
               "name":"@key",
               "type":"string"
            },
            "value_type":{
               "name":"@value",
               "type":"bytes"
            }
         },
         {
            "key":"",
            "key_hash":"expru5X1yxJG6ezR2uHMotwMLNmSzQyh5t1vUnhjx4cS6Pv9qE1Sdo",
            "value":"697066733a2f2f516d57514e41314138634b5a506f61615a4d757153754c75643747515453786262774358685a373644674571484d",
            "action":"update",
            "bigmap_id":6071
         }
      ],
      "sender":"tz1Y1j7FK1X9Rrv2VdPz5bXoU7SszF8W1RnK",
      "receiver":"KT1HbQepzV1nVGg8QVznG7z4RcHseD5kwqBn",
      "confirmations":6060
   }
], ...

It details the inputs used for this entrypoint, the storage after the call, and the differences in the big map that have changed after the call…

The current storage can be fetched, with this endpoint:

$ curl https://api.tzstats.com/explorer/contract/KT1HbQepzV1nVGg8QVznG7z4RcHseD5kwqBn/storage
{
   "value":{
      "counter":"503452",
      "fee":"25",
      "manager":"tz1UBZUkXpKGhYsP5KtzDNqLLchwF4uHrGjw",
      "metadata":"6071",
      "objkt":"KT1RJ6PbjHpwc3M5rw5s2Nbmefwbuwbdxton",
      "swaps":"6072"
   },
   "bigmaps":{
      "metadata":6071,
      "swaps":6072
   }
}

The storage returned by the API does match the one displayed in the web interface. The swaps big map holds a big map id, instead of the values.
Indeed, a big map is meant to hold unbounded data size: thus, fetching the storage could quickly become expensive, if the big maps hold a lot of values.

The values of a big map have to be retrieved from a separate endpoint, thanks to its id (6072 in this case):

$ curl https://api.tzstats.com/explorer/bigmap/6072/values
[
   {
      "key":"500002",
      "key_hash":"exprv549ywRqB3FLVdfWLJi9Wjm44ZZ3u9mfshFsqJZdZ99LBFD8Uk",
      "value":{
         "creator":"tz1TgKL5LsLvNjowkJTb5Td4rf2ZHbeYsaCb",
         "issuer":"tz1TgKL5LsLvNjowkJTb5Td4rf2ZHbeYsaCb",
         "objkt_amount":"5",
         "objkt_id":"158296",
         "royalties":"200",
         "xtz_per_objkt":"10000000"
      }
   },
   {
      "key":"500003",
      "key_hash":"expruG8eSPZ8anqDi2ZPzhSdLz3go8G6oTKkD57BmnqzZEr1KzXY8n",
      "value":{
         "creator":"tz1UBT8wECSsb4Cfr2Y6i3GSJUoSfoWcB7Qg",
         "issuer":"tz1UBT8wECSsb4Cfr2Y6i3GSJUoSfoWcB7Qg",
         "objkt_amount":"10",
         "objkt_id":"154305",
         "royalties":"100",
         "xtz_per_objkt":"6660000"
      }
   }, ...
]

All of the pieces of information displayed in the web interface can be retrieved from the API. All these API calls can of course be made by any libraries, and thus can be automated in any program.

With this, you complete this workshop successfully!!