SMASH - tests and debugging examples
These examples come from the testnet network.
SMASH can be built with:
cabal build cardano-smash-server
Find and copy the executable to your $PATH:
cp $(find . -name cardano-smash-server -executable -type f) ~/.local/bin
Prepare an admins.txt file which should have this format:
username, password
and start SMASH:
PGPASSFILE=config/pgpass-mainnet cardano-smash-server \
     --config config/mainnet-config.yaml \
     --port 3100 \
     --admins admins.txt
Checking SMASH status
curl --verbose --header "Content-Type: application/json" --request GET http://localhost:3100/api/v1/status
{"status":"OK","version":"12.0.0"}
Fetching of the metadata
curl --verbose --header "Content-Type: application/json" --request GET http://localhost:3100/api/v1/metadata/a5a3ce765f5162548181a44d1ff8c8f8c50018cca59acc0b70a85a41/d98a03b8aa962d80511d62566df2af415afd9bd03d53cbb0ad457a53d3491f74
{"name": "MKS Stake Pool", "ticker": "MKS", "homepage": "http://23.234.197.69", "description": "testnet stake pool"}
Delisting pools
- Delisting a pool for the first time: 
curl --verbose -u username:password --header "Content-Type: application/json" --request PATCH --data '{"poolId":"a5a3ce765f5162548181a44d1ff8c8f8c50018cca59acc0b70a85a41"}' http://localhost:3100/api/v1/delist
{"poolId":"a5a3ce765f5162548181a44d1ff8c8f8c50018cca59acc0b70a85a41"}
- Delisting an already delisted pool results in: 
curl --verbose -u username:password --header "Content-Type: application/json" --request PATCH --data '{"poolId":"a5a3ce765f5162548181a44d1ff8c8f8c50018cca59acc0b70a85a41"}' http://localhost:3100/api/v1/delist
{"code":"DbInsertError","description":"Delisted pool already exists!"}
select * from delisted_pool;
| id | hash_raw | 
|---|---|
| 1 | xa5a3ce765f5162548181a44d1ff8c8f8c50018cca59acc0b70a85a41 | 
Reserving a ticker
- Insert a new ticker for a pool: 
curl --verbose -u username:password --header "Content-Type: application/json" --request POST --data '{"poolId":"1c443cd9c14c85e6b541be0c2bd98c9f11be25185a15636c33c4cd8f"}' http://localhost:3100/api/v1/tickers/ART
{"name":"ART"}
- Insert an already reserved ticker for a different pool: 
curl --verbose -u username:password --header "Content-Type: application/json" --request POST --data '{"poolId":"1c443cd9c14c85e6b541be0c2bd98c9f11cd25185a15636c44c4cd3f"}' http://localhost:3100/api/v1/tickers/ART
{"code":"TickerAlreadyReserved","description":"Ticker name ART is already reserved"}
[smash-server:Info:6] [2021-11-23 12:06:29.94 UTC] SMASH listening on port 3100
[smash-server:Warning:27] [2021-11-23 12:59:18.14 UTC] TickerAlreadyReserved (TickerName "ART")
select * from reserved_pool_ticker;
| id | name | pool_hash | 
|---|---|---|
| 1 | ART | x1c443cd9c14c85e6b541be0c2bd98c9f11be25185a15636c33c4cd8f | 
Whitelisting
- Query some pool: 
curl -X GET -v http://localhost:3100/api/v1/metadata/81e84003f3d2f65315b479dc3cdbe4aa8c8595a3d76818e284b29f27/8e123d238a44a91bab56ebd631020bede5a381d8487a46d1f2ebbdc52e3b3eba | jq .
{
  "name": "OZZIE",
  "ticker": "OZZIE",
  "homepage": "https://ozzieoffsec.github.io/pool",
  "description": "We love Turtles"
}
- Delist it: 
curl --verbose -u username:password --header "Content-Type: application/json" --request PATCH --data '{"poolId":"81e84003f3d2f65315b479dc3cdbe4aa8c8595a3d76818e284b29f27"}' http://localhost:3100/api/v1/delist
{"poolId":"81e84003f3d2f65315b479dc3cdbe4aa8c8595a3d76818e284b29f27"}
select * from delisted_pool;
| id | hash_raw | 
|---|---|
| 1 | x81e84003f3d2f65315b479dc3cdbe4aa8c8595a3d76818e284b29f27 | 
- Query pool after it was delisted ==> no results 
curl -X GET -v http://localhost:3100/api/v1/metadata/81e84003f3d2f65315b479dc3cdbe4aa8c8595a3d76818e284b29f27/8e123d238a44a91bab56ebd631020bede5a381d8487a46d1f2ebbdc52e3b3eba | jq .
Pool 81e84003f3d2f65315b479dc3cdbe4aa8c8595a3d76818e284b29f27 is delisted
[smash-server:Warning:40] [2021-11-25 10:02:36.40 UTC] Pool 81e84003f3d2f65315b479dc3cdbe4aa8c8595a3d76818e284b29f27 is delisted
- Whitelist pool: 
curl -u username:password -X PATCH -v http://localhost:3100/api/v1/enlist -H 'content-type: application/json' -d '{"poolId": "81e84003f3d2f65315b479dc3cdbe4aa8c8595a3d76818e284b29f27"}'
{"poolId":"81e84003f3d2f65315b479dc3cdbe4aa8c8595a3d76818e284b29f27"}
select * from delisted_pool;
| id | hash_raw | 
|---|---|
| (0 rows) | 
- Query pool again: 
curl -X GET -v http://localhost:3100/api/v1/metadata/81e84003f3d2f65315b479dc3cdbe4aa8c8595a3d76818e284b29f27/8e123d238a44a91bab56ebd631020bede5a381d8487a46d1f2ebbdc52e3b3eba | jq .
{
  "name": "OZZIE",
  "ticker": "OZZIE",
  "homepage": "https://ozzieoffsec.github.io/pool",
  "description": "We love Turtles"
}
Checking pool rejection errors
curl http://localhost:3100/api/v1/errors/be329bbf0ee0f53d19f3b2808611779a49c7df43f330a8035eb9f853?fromDate=13.10.2020
[
   {
      "utcTime":"1635334386.697757s",
      "poolId":"be329bbf0ee0f53d19f3b2808611779a49c7df43f330a8035eb9f853",
      "retryCount":2,
      "cause":"URL parse error from for pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla resulted in : InvalidUrlException \"pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla\" \"Invalid URL\"",
      "poolHash":"f2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395",
      "time":"27.10.2021. 11:33:06"
   },
   {
      "utcTime":"1635334094.642995s",
      "poolId":"be329bbf0ee0f53d19f3b2808611779a49c7df43f330a8035eb9f853",
      "retryCount":0,
      "cause":"HTTP Response from for https://LLCJ.com resulted in : 509",
      "poolHash":"4001829c25b4af556d1a473dec4874a621899cf6a84c60156ec2411727f1a169",
      "time":"27.10.2021. 11:28:14"
   }
]
Pool unregistrations
You can check what pools have unregistered with:
curl --header "Content-Type: application/json" http://localhost:3100/api/v1/retired | jq .
[
  {
    "poolId": "002c501d063cf552144e58ea9a85c8d156b3d7c7a498e52a50cf546c"
  },
  {
    "poolId": "00cd5fd9cbf0b9535f804f59da4666859afa38e5ca7729a3172efe36"
  },
  {
    "poolId": "0192e6835f8613b1a47084d800ee3d2a0931a334e5e63dd80c447c15"
  },
  {
    "poolId": "01c2103a18e1dc55be3e83f7291266bba53a5b76c6c42f1969ee5193"
  },
  {
    "poolId": "other pools listed ..."
  }
]
Fetch policies from another SMASH service
Fetch policies from another SMASH service:
- shelley-qa https://smash.shelley-qa.dev.cardano.org 
curl -u username:password --verbose --header "Content-Type: application/json" --request POST --data '{"smashURL": "https://smash.cardano-mainnet.iohk.io"}' http://localhost:3100/api/v1/policies | jq .
{
  "uniqueTickers": [],
  "smashURL": {
    "smashURL": "https://smash.cardano-mainnet.iohk.io"
  },
  "healthStatus": {
    "status": "OK",
    "version": "1.6.1"
  },
  "delistedPools": [
    {
      "poolId": "ce2e5bbae0caa514670d63cfdad3123a5d32cf7c37df87add5a0f75f"
    },
    {
      "poolId": "2b830258888a09e846b63474c642ad4e18aecd08dafb1f2a4d653e80"
    },
    {
      "poolId": "027a08f49ad5ece08e3a1575fb9cd8e8d7cf3b7815807a20b1a715f1"
    },
    {
      "poolId": "4eb1fac09251f8af19ad6b7e06b71cbad09dbe896b481e4670fe565d"
    },
    {
      "poolId": "bf44d3187cbdd8874dca1f714a6107beea642753228490bc02c8e038"
    },
    {
      "poolId": "00429f0a3e8c48d644a9b45babd09b86c367efe745a35b31f10e859f"
    },
    {
      "poolId": "8bc067247b8a85500d40d7bb78afd4de6a5fed2cfcc82c9b9c2fa8a2"
    },
    {
      "poolId": "e7e18f2050fa307fc9405f1d517760e894f8fbdf41a9b1b280571b38"
    },
    {
      "poolId": "27f4e3c309659f824026893b811dd6e70332881867cb2cba4974191c"
    },
    {
      "poolId": "c73186434c6fc6676bd67304d34518fc6fd7d5eaddaf78641b1e7dcf"
    },
    {
      "poolId": "2064da38531dad327135edd98003032cefa059c4c8c50c2b0440c63d"
    },
    {
      "poolId": "d9df218f8099261e019bdd304b9a40228070ce61272af835ea13d161"
    },
    {
      "poolId": "d7d56e1703630780176cf944a77b7829b4ba97888fa9a32468011985"
    },
    {
      "poolId": "82e5cb6e4b443c36b087e6218a5629291585d35083ce2cb625506e1f"
    },
    {
      "poolId": "0e76c44520b9d7f2e211eccd82de49350288368802c7aaa72a13c3fa"
    },
    {
      "poolId": "d471e981d54a7f60496f9239d2d706db7a71df8517025f478c112e3e"
    },
    {
      "poolId": "f537b3a5ac2ecdc854a535a15f7732632375a0bf2af17dccbe5b422d"
    },
    {
      "poolId": "033fa1cdc17193fa3d549e795591999621e749fd7ef48f7380468d14"
    }
  ]
}
and let’s compare SMASH reply with database state:
cat smash_imported_policies.json | jq -r '.delistedPools | length'
18
VS
select * from delisted_pool;
| id | hash_raw | 
|---|---|
| 382 | xce2e5bbae0caa514670d63cfdad3123a5d32cf7c37df87add5a0f75f | 
| 383 | x2b830258888a09e846b63474c642ad4e18aecd08dafb1f2a4d653e80 | 
| 384 | x027a08f49ad5ece08e3a1575fb9cd8e8d7cf3b7815807a20b1a715f1 | 
| 385 | x4eb1fac09251f8af19ad6b7e06b71cbad09dbe896b481e4670fe565d | 
| 386 | xbf44d3187cbdd8874dca1f714a6107beea642753228490bc02c8e038 | 
| 387 | x00429f0a3e8c48d644a9b45babd09b86c367efe745a35b31f10e859f | 
| 388 | x8bc067247b8a85500d40d7bb78afd4de6a5fed2cfcc82c9b9c2fa8a2 | 
| 389 | xe7e18f2050fa307fc9405f1d517760e894f8fbdf41a9b1b280571b38 | 
| 390 | x27f4e3c309659f824026893b811dd6e70332881867cb2cba4974191c | 
| 391 | xc73186434c6fc6676bd67304d34518fc6fd7d5eaddaf78641b1e7dcf | 
| 392 | x2064da38531dad327135edd98003032cefa059c4c8c50c2b0440c63d | 
| 393 | xd9df218f8099261e019bdd304b9a40228070ce61272af835ea13d161 | 
| 394 | xd7d56e1703630780176cf944a77b7829b4ba97888fa9a32468011985 | 
| 395 | x82e5cb6e4b443c36b087e6218a5629291585d35083ce2cb625506e1f | 
| 396 | x0e76c44520b9d7f2e211eccd82de49350288368802c7aaa72a13c3fa | 
| 397 | xd471e981d54a7f60496f9239d2d706db7a71df8517025f478c112e3e | 
| 398 | xf537b3a5ac2ecdc854a535a15f7732632375a0bf2af17dccbe5b422d | 
| 399 | x033fa1cdc17193fa3d549e795591999621e749fd7ef48f7380468d14 | 
An example of debugging an issue with a pool
Here is an example of unusual behavior of a pool on testnet that could not be seen in any tool that tracks pools and at the same time, it could not be found in retired pools.
We have a pool pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla that can’t be found in Daedalus (version for testnet) nor on https://pooltool.io/ (which is a web tool for listing pool details on both mainnet and testnet) and it is also not listed in the pool_retire table:
select * from pool_hash where view='pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla';
| id | hash_raw | view | 
|---|---|---|
| 103 | xbe329bbf0ee0f53d19f3b2808611779a49c7df43f330a8035eb9f853 | pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla | 
pool_retire:
select * from pool_retire where hash_id=103;
| id | hash_id | cert_index | announced_tx_id | retiring_epoch | 
|---|---|---|---|---|
| (0 rows) | 
Let’s check the last update for this pool
pool_update:
| id | hash_id | cert_index | vrf_key_hash | pledge | reward_addr | active_epoch_no | meta_id | margin | fixed_cost | registered_tx_id | 
|---|---|---|---|---|---|---|---|---|---|---|
| 103 | 103 | 0 | xfdbcad682e1462b1a107fb204316e73b4791aba0691410bdb5a6c219a0a16fe6 | 100000000 | xe0d6de2014f77443a986d2ae9144fbcdcf08da0ddea1c0ce0f7e311d68 | 85 | 101 | 0.04 | 340000000 | 25037 | 
| 118 | 103 | 0 | xfdbcad682e1462b1a107fb204316e73b4791aba0691410bdb5a6c219a0a16fe6 | 250000000 | xe0d6de2014f77443a986d2ae9144fbcdcf08da0ddea1c0ce0f7e311d68 | 87 | 116 | 0.01 | 340000000 | 34587 | 
| 292 | 103 | 0 | xfdbcad682e1462b1a107fb204316e73b4791aba0691410bdb5a6c219a0a16fe6 | 250000000 | xe0d6de2014f77443a986d2ae9144fbcdcf08da0ddea1c0ce0f7e311d68 | 90 | 290 | 0.04 | 430000000 | 55996 | 
| 303 | 103 | 0 | xfdbcad682e1462b1a107fb204316e73b4791aba0691410bdb5a6c219a0a16fe6 | 3495862056 | xe0d6de2014f77443a986d2ae9144fbcdcf08da0ddea1c0ce0f7e311d68 | 91 | 301 | 0.0095 | 340000000 | 56543 | 
(4 rows)
and metadata associated with it
pool_metadata_ref:
select * from pool_metadata_ref where pool_id=103;
| id | pool_id | url | hash | registered_tx_id | 
|---|---|---|---|---|
| 301 | 103 | xf2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395 | 56543 | |
| 101 | 103 | x314699218763d2d0c1c2cc75d4405de67709a888f01a4ca4d2b0f290e285c6e1 | 25037 | |
| 290 | 103 | x94be57c392f721154c96bafbf9ebd80fe369b35ec8f177b292329ee21db25cbf | 55996 | |
| 116 | 103 | x4001829c25b4af556d1a473dec4874a621899cf6a84c60156ec2411727f1a169 | 34587 | 
So our pool is not visible in tools like wallet and it is also not present in pool_retire table.
Private pools are not listed by those tools however last records from pool_update table listed above show that this is not a private pool because it has a margin < 100%.
Let’s check the pool relay:
select * from pool_relay where update_id=303;
| id | update_id | ipv4 | ipv6 | dns_name | dns_srv_name | port | 
|---|---|---|---|---|---|---|
| 1426 | 303 | 72.184.59.65 | 3001 | 
and try to ping it:
ping 72.184.59.65
PING 72.184.59.65 (72.184.59.65) 56(84) bytes of data.
64 bytes from 72.184.59.65: icmp_seq=1 ttl=47 time=177 ms
64 bytes from 72.184.59.65: icmp_seq=2 ttl=47 time=184 ms
We can see that it is up.
Now let’s check the ledger state and see if the record for our pool is still present there:
cardano-cli query stake-distribution --testnet-magic 1097911063 | grep pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla
pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla   1.611e-7
It is.
Querying SMASH using pool_hash=be329bbf0ee0f53d19f3b2808611779a49c7df43f330a8035eb9f853 and metadata hash from pool_metadata_ref for last id=301 which is: f2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395 returns:
curl --verbose --header "Content-Type: application/json" --request GET http://localhost:3100/api/v1/metadata/be329bbf0ee0f53d19f3b2808611779a49c7df43f330a8035eb9f853/f2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395
{"code":"DbLookupPoolMetadataHash","description":"The metadata with hash PoolMetadataHash \"f2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395\" for pool PoolId \"be329bbf0ee0f53d19f3b2808611779a49c7df43f330a8035eb9f853\" is missing from the DB."}
[smash-server:Warning:124] [2021-11-24 12:48:43.03 UTC] DbLookupPoolMetadataHash (PoolId "be329bbf0ee0f53d19f3b2808611779a49c7df43f330a8035eb9f853") (PoolMetadataHash "f2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395")
Let’s check errors for that pool:
curl http://localhost:3100/api/v1/errors/pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla
[
   {
      "utcTime":"1637316510.524683s",
      "poolId":"be329bbf0ee0f53d19f3b2808611779a49c7df43f330a8035eb9f853",
      "retryCount":15,
      "cause":"URL parse error from for pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla resulted in : InvalidUrlException \"pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla\" \"Invalid URL\"",
      "poolHash":"f2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395",
      "time":"19.11.2021. 10:08:30"
   },
   {
      "utcTime":"1637316510.524683s",
      "poolId":"be329bbf0ee0f53d19f3b2808611779a49c7df43f330a8035eb9f853",
      "retryCount":13,
      "cause":"URL parse error from for pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla resulted in : InvalidUrlException \"pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla\" \"Invalid URL\"",
      "poolHash":"f2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395",
      "time":"19.11.2021. 10:08:30"
   },
   {
      "utcTime":"1637316510.524683s",
      "poolId":"be329bbf0ee0f53d19f3b2808611779a49c7df43f330a8035eb9f853",
      "retryCount":14,
      "cause":"URL parse error from for pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla resulted in : InvalidUrlException \"pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla\" \"Invalid URL\"",
      "poolHash":"f2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395",
      "time":"19.11.2021. 10:08:30"
   },
   {
      "utcTime":"1637316510.524683s",
      "poolId":"be329bbf0ee0f53d19f3b2808611779a49c7df43f330a8035eb9f853",
      "retryCount":0,
      "cause":"Hash mismatch from when fetching metadata from https://git.io/JTUAD. Expected f2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395 but got 75848f572990cbc72a9efd62ed5aa0178e16d5164c6dcfbb040dcec47f13d8f4.",
      "poolHash":"f2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395",
      "time":"19.11.2021. 10:08:30"
   },
   {
      "utcTime":"1637316510.524683s",
      "poolId":"be329bbf0ee0f53d19f3b2808611779a49c7df43f330a8035eb9f853",
      "retryCount":1,
      "cause":"URL parse error from for pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla resulted in : InvalidUrlException \"pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla\" \"Invalid URL\"",
      "poolHash":"f2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395",
      "time":"19.11.2021. 10:08:30"
   },
   {
      "utcTime":"1637316510.524683s",
      "poolId":"be329bbf0ee0f53d19f3b2808611779a49c7df43f330a8035eb9f853",
      "retryCount":2,
      "cause":"URL parse error from for pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla resulted in : InvalidUrlException \"pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla\" \"Invalid URL\"",
      "poolHash":"f2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395",
      "time":"19.11.2021. 10:08:30"
   },
   {
      "utcTime":"1637316510.524683s",
      "poolId":"be329bbf0ee0f53d19f3b2808611779a49c7df43f330a8035eb9f853",
      "retryCount":3,
      "cause":"URL parse error from for pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla resulted in : InvalidUrlException \"pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla\" \"Invalid URL\"",
      "poolHash":"f2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395",
      "time":"19.11.2021. 10:08:30"
   },
   {
      "utcTime":"1637316510.524683s",
      "poolId":"be329bbf0ee0f53d19f3b2808611779a49c7df43f330a8035eb9f853",
      "retryCount":4,
      "cause":"URL parse error from for pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla resulted in : InvalidUrlException \"pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla\" \"Invalid URL\"",
      "poolHash":"f2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395",
      "time":"19.11.2021. 10:08:30"
   },
   {
      "utcTime":"1637316510.524683s",
      "poolId":"be329bbf0ee0f53d19f3b2808611779a49c7df43f330a8035eb9f853",
      "retryCount":5,
      "cause":"URL parse error from for pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla resulted in : InvalidUrlException \"pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla\" \"Invalid URL\"",
      "poolHash":"f2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395",
      "time":"19.11.2021. 10:08:30"
   },
   {
      "utcTime":"1637316510.524683s",
      "poolId":"be329bbf0ee0f53d19f3b2808611779a49c7df43f330a8035eb9f853",
      "retryCount":6,
      "cause":"URL parse error from for pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla resulted in : InvalidUrlException \"pool1hcefh0cwur6n6x0nk2qgvythnfyu0h6r7vc2sq67h8u9x8z2cla\" \"Invalid URL\"",
      "poolHash":"f2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395",
      "time":"19.11.2021. 10:08:30"
   }
]
For hash f2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395, the URL from pool_metadata_ref is:
| id | pool_id | url | hash | registered_tx_id | 
|---|---|---|---|---|
| 301 | 103 | xf2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395 | 56543 | 
https://git.io/JTUAD opens correctly a GH page with the following JSON:
{
"name": "Lpool",
"description": "L pool is cool",
"ticker": "LPO",
"homepage": "https://git.io/JUNOy"
}
It seems that for this pool, 4 metadata references have been registered (from pool_metadata_ref table), but 3 of them failed and only one succeeded.
The pool_offline_data table shows different metadata - the one that matches the record with id=290 in pool_metadata_ref
(homepage https://llcj.com/ differs from JSON presented above https://git.io/JUNOy)
select id, pool_id, json from pool_offline_data where pool_id=103;
| id | pool_id | json | 
|---|---|---|
| 138 | 103 | 
 | 
but this is not the last entry in pool_metadata_ref which has id=301 and  homepage=https://git.io/JTUAD.
The reason for this problem is mentioned in one of the error messages returned by SMASH:
"cause":"Hash mismatch from when fetching metadata from https://git.io/JTUAD. Expected f2b553839dee1ad1d16127179d4378a0c06a1fddce83409ad4b6f10b65bad395 but got 75848f572990cbc72a9efd62ed5aa0178e16d5164c6dcfbb040dcec47f13d8f4."
If we download the metadata file and check its hash:
wget https://git.io/JTUAD
cardano-cli stake-pool metadata-hash --pool-metadata-file JTUAD
75848f572990cbc72a9efd62ed5aa0178e16d5164c6dcfbb040dcec47f13d8f4
we can see in fact that its hash is different from what was expected.
It looks like someone decided to update the last successful metadata for the pool (id=290 in pool_metadata_ref) but declared a wrong hash for a new metadata file and now the pool can’t be correctly listed by SMASH.