見出し画像

超簡単! PythonによるBSC DeFi bot作り② ~残高を調べる~

納豆男爵です。BSC DeFi bot作り第2弾は「残高を調べる」です。ウォレットに置いてあるトークンの量を調べてみましょう。特定のトークンの残高を調べるにはトークンのコントラクトにアクセスする必要があります。コントラクトへのアクセスの第1歩として残高を調べるコードに挑戦です。

※この記事で公開するプログラムを実行することによって資産を失う恐れがあります。この記事によって生じた損失について当方では一切の保証をいたしません。各自の責任によってお試しいただくようお願いいたします。

概要

Python + Web3.py を使ってBSCのコントラクトにアクセスする方法を解説します。最も簡単な例としてウォレットに持っている$CAKEの残高を調べてみましょう。
① bot作りの下準備
② コントラクト情報(CAKE Token)の取得
③ 残高を調べる

① bot作りの下準備

Python と Web3.py を使ってコーディングをするのでその下準備が必要です。以下の記事に最低限必要な準備をまとめていますので、bot作成が初めての方は以下の記事をお読みください。
超簡単! PythonによるBSC DeFi bot作り① ~送金する~

② コントラクト情報(CAKE Token)の取得

さて、bot作りの準備ができたらコントラクトの情報を取りに行きます。いきなりですが、CAKE Tokenのコントラクトアドレスは以下です。
0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82
これをBSCScanに入れるとコントラクトの情報を見ることができます。

画像3

Contractと書かれている部分をクリックするとコントラクトの中身をみることができます。bot作りでまず必要となるのは Contract ABI です。手元の環境でこのABIを読み出せるように丸々コピーしてきましょう。

画像2

図の赤い所をクリックすると全文をコピーできます。これを適当なエディタで貼り付けて保存しましょう。適当に"Cake_Contract_ABI.json"というファイル名にしておきます。(ABIはjsonという形式で記述されているためjsonファイルとしています。)このファイルはこれから作るpythonファイルと同じフォルダに置いておくと良いです。

ちなみに、このコントラクトでどのような機能が実装されているかは下の赤い枠で囲んだ[Read Contract]や[Write Contract]で見ることができます。

画像3

今回は[Read Contract]から見えているbalanceOf関数を使ってウォレットに持っているCakeの残高を調べます。

③ 残高を調べる

さて、Cakeの残高を調べる前にBNBの残高を見るコードを載せておきます。BNBはTokenではないのでコントラクトからでなく直接残高を取得できます。

from web3 import Web3

bsc_rpc = "https://bsc-dataseed.binance.org/"

web3 = Web3(Web3.HTTPProvider(bsc_rpc))

wallet_A = '*** Wallet A のアドレス ***'

balance = web3.eth.getBalance(wallet_A)

print('Wallet A BNB Balance: ', (web3.fromWei(balance, 'Ether')))

送金よりも簡単なコードですね。getBalance関数でBNBの所有量(wei単位)が得られることがわかります。
では、次にCakeの残高を見ていきましょう。まずはいきなりコード全体を載せます。ウォレットAに含まれるCakeの残高を表示するプログラムです。

import json
from web3 import Web3

bsc_rpc = "https://bsc-dataseed.binance.org/"
wallet_A = '*** Wallet A のアドレス ***'
CAKE = '0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82'

web3 = Web3(Web3.HTTPProvider(bsc_rpc))

with open('Cake_Contract_ABI.json') as f:
   abi = json.load(f)

contract = web3.eth.contract(address=CAKE, abi=abi)

balance = contract.functions.balanceOf(wallet_A).call()

print('CAKE Balance: {}'.format(web3.fromWei(balance,'ether')))

順番にコードを解説して行きましょう。①送金編で解説済みの部分については端折ります。

import json
from web3 import Web3

bsc_rpc = "https://bsc-dataseed.binance.org/"
wallet_A = '*** Wallet A のアドレス ***'
CAKE = '0x0E09FaBB73Bd3Ade0a17ECC321fD13a19e81cE82'

web3 = Web3(Web3.HTTPProvider(bsc_rpc))

ここまでは送金編とほぼ同じです。一つだけjsonというライブラリを新たにインポートしていることに気を付けてください。先ほど保存したABIのファイルを読み込むのに使います。CAKEのコントラクトにアクセスするためそのアドレスは変数として持っておきましょう。

with open('Cake_Contract_ABI.json') as f:
   abi = json.load(f)

contract = web3.eth.contract(address=CAKE, abi=abi)

今回の新しい要素はここです。コントラクトのオブジェクトを作るコードです。まずopenはファイルを読み込むpythonの関数で、読み込んだファイルをjsonファイルとして解釈してabiに格納します。わけわからない人はABIを読み込むのはこう書くのだと覚えてください。
次にコントラクトアドレスとABIを指定してコントラクトオブジェクトを作っています。ここからABIに定義されたコントラクトの関数を呼び出すことができます。

balance = contract.functions.balanceOf(wallet_A).call()

print('CAKE Balance: {}'.format(web3.fromWei(balance,'ether')))

functions.balanceOf(引数).call()によってコントラクトのbalanceOf関数を呼び出しています。balanceOf関数はウォレットアドレスを引数としてその残高を返す関数です。残高は例によってwei単位で返ってくるためfromWei関数でわかりやすい単位に直しましょう。

これで、残高編はは終わりです。コントラクトのABIを引っ張ってきてコントラクトの関数を呼び出す方法が掴めたでしょうか。BSCScanでコントラクト直叩きみたいな経験のある方は直叩きがPythonで実行できるんだというのが想像できるかと思います。
コントラクトの扱い方がわかったら次はついにPancakeSwapでの取引に挑戦です。

この記事が気に入ったらサポートをしてみませんか?