こんにちは。iOSエンジニアの西川(@tatsuya73206018)です。 この記事ではKyberNetworkを使用した交換がGincoアプリ内でどのように行われているかを解説していきたいと思います。
交換の処理について
交換は以下の手順で行なっていきます。
- 通貨を選択
- 金額を入力して交換レートを取得
- 手数料を計算
- 交換を実行
- 交換実行後取引履歴に表示される
実際にこれらの手順を詳しくみていきましょう。
通貨の選択
交換可能通貨の取得は以下のようになります。
- Cloud FunctionsのgetAvailableTokens()関数を利用してKyberNetworkコントラクトから交換可能通貨availableTokensを取得する。
- availableTokensからGinco内で対応している通貨を表示する。
availableTokensはKyberNetworkのSupported Token Pairsから取得しています。
レートの取得
交換レートの取得は以下のようになります。
- テキストフィールドに交換したい金額を入力する。
- 入力金額をパラメータにCloud FunctionsのgetExpectedRate()関数を利用してKyberNetworkコントラクトから交換レートrateを取得する。
- rateと入金金額をもとに受け取り金額を計算し表示する。
入力金額によって交換レートは変化します。また、大きすぎる値を入力すると交換レートが0で返ってきてしまいます。
手数料の計算
交換手数料の計算は以下のようになります。
ETHを交換
- getGetPrice()関数で- gasPriceを取得する。
- getEstimatedGas()関数でtradeに使用する- gasを取得する。
- gasPriceとtrade用の- gasを使って手数料を計算し表示する。
ERC20を交換
- getGetPrice()関数で- gasPriceを取得する。
- getEstimatedGas()関数でapproveに使用する- gasを取得する。
- getEstimatedGas()関数でtradeに使用する- gasを取得する。
- gasPriceとapprove用の- gasとtrade用の- gasを使って手数料を計算し表示する。
ERC20に実装されているapprove()関数については以前GincoのバックエンドとDEX KyberNetwork連携で解説されています。
また、いくらapproveされているかはERC20のallowance関数で取得することができます。
交換
交換の処理の流れは以下のようになります。
ETHを交換
- Keychainに保存しているmnemonicを取得する。
- Wallet CoreのsignTransaction()関数にmnemonicとtrade用のトランザクションパラメータtxParamsを与え、署名済みトランザクションtxDataを生成する。
- 生成した署名済みトランザクションtxDataをCloud FunctionsのsendTransaction()関数を利用してFull Nodeにブロードキャストする。ブロードキャストに成功すればtxHashが返る。
ERC20を交換
- Keychainに保存しているmnemonicを取得する。
- Wallet CoreのsignTransaction()関数にmnemonicとapprove用のトランザクションパラメータtxParamsを与え、署名済みトランザクションtxDataを生成する。
- 生成した署名済みトランザクションtxDataをCloud FunctionsのsendTransaction()関数を利用してFull Nodeにブロードキャストする。ブロードキャストに成功すればtxHashが返る。
- approveが成功すれば同じようにWallet CoreのsignTransaction()関数にmnemonicとtrade用のトランザクションパラメータtxParamsを与え、署名済みトランザクションtxDataを生成する。
- 生成した署名済みトランザクションtxDataをCloud FunctionsのsendTransaction()関数を利用してFull Nodeにブロードキャストする。ブロードキャストに成功すればtxHashが返る。
履歴の表示
履歴の表示の処理の流れは以下のようになります。
- Blockchain ExplorerがFull Nodeを監視し、整形したトランザクションをCloud FirestoreのtxHistoryコレクションに格納する。
- クライアントからCloud FirestoreのtxHistoryコレクションを監視し、トランザクションの履歴を表示する。
分かりやすいようにKyberNetworkを使って交換された履歴にはKyberNetwork用のアイコンが付けられるようになっています。
まとめ
本記事ではKyberNetworkのネイティブ実装について書きました。 ネイティブアプリにDappsをインテグレーションするのはなかなかない経験だと思ったので今回記事にしてみました。 今後も積極的に情報発信を行なっていきたいと思います。
Tip us!
エンジニアチームがブログを書くモチベーションが上がります!
参考文献
- [1] https://firebase.google.com/docs/firestore/
- [2] https://firebase.google.com/docs/functions/
- [3] https://developer.kyber.network/docs/Start