ショートカット+CoinGecko  API+Subscan APIでDOT保有分を日本円換算した結果を確認する

# 作成したもの
iPhoneで保有するDOTを日本円換算し、計算結果をクリップボードにコピーするショートカットを作成しました。

ショートカット名：calcHoldDOT-JPY

https://www.icloud.com/shortcuts/09fa7af649ca4b1db1c228d474604c43

リンクから「ショートカットを追加」を実行するとマイショートカットに追加されます。
デフォルトではSubscan APIの[API key](https://docs.api.subscan.io/#introduction)とアドレスが空となっているため、ショートカットは実行できますが値は取得できずアラートが表示されます。

以下のgifはDocs記載のアカウント（[**Polkadot.pro - Realgar**](https://polkadot.subscan.io/account/1REAJ1k691g5Eqqg9gL7vvZCBG7FCCZ8zgQkZWd4va5ESih)）でAPI keyとアドレスを指定した場合の実行例になります。（2022/03/11時点）

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832768/449f5705-f784-ca58-dc69-f5a85186209a.jpeg" width="320px">


# 処理の流れ
1. [CoinGecko API V3](https://www.coingecko.com/ja/api/documentation?)を使用して**Polkadot**の日本円換算の値を取得するショートカットを実行して変数に設定
2. [Subscan API](https://docs.api.subscan.io/#introduction)を使用して指定したアドレスで保有するDOT(**Balance**)を取得するショートカットを実行して変数に設定
3. 1.と2.の変数を掛けて DOT保有量の日本円換算した結果をクリップボードにコピーし、ショートカットをの実行を停止
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832768/249d6e4b-1b73-1bce-10e3-86df98012852.png" width="480px">

# 前提条件
Subscan APIの[API key](https://docs.api.subscan.io/#introduction)を取得済みであること

# 補足
* 1. DOTの価格はCoinGecko API V3の[explore the APIページ](https://www.coingecko.com/ja/api/documentation?)の`/simple/price`記載の**Request URL**と**Header**の指定で取得します

![CoinGecko_sample_price.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832768/7deccbc0-b639-bc0e-87c4-9179e51af913.png)

* ショートカットでDOTの価格(円)を取得するため[「辞書の値を取得」アクション](https://support.apple.com/ja-jp/guide/shortcuts/apdf01294032/ios)を使用し、`polkadot`,`jpy`をキーに設定します
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832768/34bcbffc-0962-1fc0-85a0-2985ce6a0ab6.png" width="480px">

* 2.保有量(**Balance**)はSubscan API V2 APIの[**search account**](https://docs.api.subscan.io/#search-account)の指定で取得します
  Docs記載のアカウント（[**Polkadot.pro - Realgar**](https://polkadot.subscan.io/account/1REAJ1k691g5Eqqg9gL7vvZCBG7FCCZ8zgQkZWd4va5ESih)）を例にcurlコマンドを実行するとResponseとしてJSON形式の値を取得できます(※2022/02/27時点)
##### curl
```
curl -X POST 'https://polkadot.api.subscan.io/api/v2/scan/search' \
  --header 'Content-Type: application/json' \
  --header 'X-API-Key: YOUR_KEY' \
  --data-raw '{
    "key": "1REAJ1k691g5Eqqg9gL7vvZCBG7FCCZ8zgQkZWd4va5ESih"
  }'
```
##### Response
```
{
    "code": 0,
    "message": "Success",
    "generated_at": 1645939556,
    "data": {
        "account": {
            "account_display": {
                "account_index": "1Rs7u",
                "address": "1REAJ1k691g5Eqqg9gL7vvZCBG7FCCZ8zgQkZWd4va5ESih",
                "display": "Polkadot.pro - Realgar",
                "identity": true,
                "judgements": [
                    {
                        "index": 1,
                        "judgement": "Reasonable"
                    }
                ],
                "parent": null
            },
            "address": "1REAJ1k691g5Eqqg9gL7vvZCBG7FCCZ8zgQkZWd4va5ESih",
            "balance": "845177.2489680648",
            "balance_lock": "615786.4468538017",
            "bonded": "6157864468538017",
            "count_extrinsic": 116,
            "democracy_lock": "0",
            "derive_token": {},
            "display": "Polkadot.pro - Realgar",
            "election_lock": "5941301477000000",
            "email": "hello@polkadot.pro",
            "is_council_member": false,
            "is_erc20": false,
            "is_evm_contract": false,
            "is_registrar": false,
            "is_techcomm_member": false,
            "judgements": [
                {
                    "index": 1,
                    "judgement": "Reasonable"
                }
            ],
            "legal": "",
            "lock": "615786.4468538017",
            "nonce": 146,
            "registrar_info": null,
            "reserved": "961730000000",
            "riot": "@realgar:matrix.org",
            "role": "validator",
            "staking_info": {
                "controller": "1ZMbuCR3QiatxRsQdNnJYgydn3CWV4PELcTzpH4TNoNjxno",
                "controller_display": {
                    "account_index": "1bwSw",
                    "address": "1ZMbuCR3QiatxRsQdNnJYgydn3CWV4PELcTzpH4TNoNjxno",
                    "display": "",
                    "identity": false,
                    "judgements": null,
                    "parent": null
                },
                "reward_account": "stash"
            },
            "stash": "1REAJ1k691g5Eqqg9gL7vvZCBG7FCCZ8zgQkZWd4va5ESih",
            "twitter": "@propolkadot",
            "unbonding": "0",
            "vesting": null,
            "web": "https://polkadot.pro"
        }
    }
}
```
* Subscan APIで`balance`を取得するため`API key`と`Address`を指定します
* ショートカットで`balance`を取得するため辞書のキーに`data`,`acount`,`balance`をそれぞれ設定します
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1832768/56328d4a-cca6-de01-7c49-1f81e5465ac5.png" width="480px">

# まとめ
* ショートカット+CoinGecko API+Subscan APIでDOT保有分を日本円換算した結果をiPhoneで確認する方法を紹介しました。
* 価格はSubscan APIでも取得できそうですが、JPYに対応していのるか確認ができなかったことと、今回は価格が分かれば良かったのでCoingeckoから価格情報を取得しました。
* ショートカットではHTTPリクエストを実行することで複数のデータを取得することができるため楽にデータを処理できます。一方で処理が増えるとスマホ画面では作成しづらく、内容も複雑になります。この点ではショートカットで分割、GAS連携すると良いかと思います。