0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GraphQL on bitquery で conflux でのウォレットのトランザクションを得るメモ

Last updated at Posted at 2021-02-13

主にマイニングや DeFi 取引の課税計算用に GraphQL on bitquery で conflux のトランザクションを抽出してみます.
(ethereum は eterscan などが REST などで API サービス提供しているが, conflux の場合は現状自前でノード立てるなりして RPC でクエリするしかなさそうでめんどい)

もともとは Ethereum(geth?) で GraphQL 対応していたので, 基本 Ethereum のコピーである Conflux もつられて GraphQL 対応しているっぽい感じです.

取引量が多い場合は, GUI IDE では多量のアウトプットが出るためコマンドライン版を使うのがよさそうですが... CLI は提供されているかしらん. :thinking:

クエリ言語

系統だったドキュメントやチュートリアルは無いようなので,
サンプルや

の 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 も考慮する
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?