主にマイニングや DeFi 取引の課税計算用に GraphQL on bitquery で conflux のトランザクションを抽出してみます.
(ethereum は eterscan などが REST などで API サービス提供しているが, conflux の場合は現状自前でノード立てるなりして RPC でクエリするしかなさそうでめんどい)
もともとは Ethereum(geth?) で GraphQL 対応していたので, 基本 Ethereum のコピーである Conflux もつられて GraphQL 対応しているっぽい感じです.
取引量が多い場合は, GUI IDE では多量のアウトプットが出るためコマンドライン版を使うのがよさそうですが... CLI は提供されているかしらん.
クエリ言語
系統だったドキュメントやチュートリアルは無いようなので,
サンプルや
の Docs にあるスキーマを調べて自前で試行錯誤してやるしかありません.
Conflux
とりあえず自前アドレスの送金を調べる
query {
conflux {
out: transfers(
any: [{sender: {is: "xxxxxxx"}}, {receiver: {is: "xxxxxxx"}}]
) {
transaction {
hash
}
date { date }
gasValue
currency { symbol }
}
}
}
を実行すると,
{
"conflux": {
"out": [
{
"transaction": {
"hash": "xxxxxxx"
},
"date": {
"date": "xxxx-xx-xx"
},
"gasValue": 0.000002100000063488,
"currency": {
"symbol": "CFX"
}
},
という感じでいけました.
(エラーが出ていないがカラのときは, Display pane で conflux
を選んでいるか確認しましょう)
out:
アウトプットはどれにするか...? のようです.
any の sender, receiver でアドレスへの送受金を指定します.
cfx:xxxxx
の新しいアドレス形式はサポートしていませんでした. 2021/02/13 時点では, 0x で始まるアドレスを指定する必要があります.
transfers ( ... ) { }
の中括弧で, 出力するアイテムを指定します.
基本は tag { value }
みたいな指定ですが, gasValue
みたいにそれだけ指定というのもあります.
どの通貨(コイン)を取引したかは currency { symbol }
で出力できます.
amount
で取引量を出力できます.
amount (in: USD)
でドル換算の値が出ますが, たとえば
amount
amount(in USD)
などとして複数出力はできませんでしたので, やるならそれぞれの出力 JSON をあとでマージ, となるでしょうか. ちなみに JPY は無かったのでいずれにせよ取得価額を計算するときは円建ての価額を求める必要があります.
注意点
流動性ペア(Liquidity Pair)を作る場合, 例えば CFX と cUSDT をペアにして流動性を提供する場合,
- CFX を送金
- cUSDT を送金
- MLP(Moonswap Liquidity Pair token)を得る
というトークン交換が 1 トランザクションで発生しますが, transfers
ではそれぞれ 1 つの取引として出力(i.e. 3 つの出力)が得られます.
日付順, ブロック高順にソートする
options の asc(逆の場合は desc)で, どのフィールドをキーとしてソートするか指定します.
out: transfers(
options: {asc: "date.date"}
フィールドは, output で定義しておく必要があります(スキーマにはあるが, 定義(利用)していないフィールドに対してソートはできない).
日付の場合 output に date { date }
として,
block height の場合は block { height }
を output に追加します.
(この場合ソートの指定は options: {asc: "block.height"}
となります)
transaction
transaction
で, transfers
では扱えないトランザクションをリストアップすることができます.
例えば approve や, コントラクトの呼び出しなど.
センダーと送金先アドレスを取得するには
sender { address }
to { address }
を出力に記載します.
dex での取引?
dexTransfers
で, たとえば moonswap での取引の記録をより簡単に調べることができるかもしれません... が, アドレス単位で抽出できるかは不明です. 基本は取引全体(1 日の取引量とか)を調べる用っぽいです.
とりあえずは transfers
での取引をベースに処理するのがよさそうです.
internal transaction
一部 reward(割引?)みたいな取引が取得できませんでした.
100 CFX を cMOON に変えたら 1 CFX が付与されていたみたいな.
confluxscan で見ると internal transaction として処理されていました.
したがって internal transaction も取得してチェックする必要があります.
TODO
日付指定で特定の日にちでの取引も抽出できるので調べる
Conflux の JSON-RPC と組み合わせる.
hash だけ GraphQL で抜き出して, 詳細は JSON-RPC でクエリなど.
(address からトランザクション一覧など抜き出しは JSON-RPC ではコマンドがないっぽいため)
endpoint はこちら.
- internal transaction も考慮する