Soneium MinatoでのSwap@pythonが簡単すぎたので共有
今まで複数のネットワークでスワップ@pythonに挑戦してきましたが、Soneium Minato Explorer(https://soneium-minato.blockscout.com/)がブロックチェーンをpythonから触ろうとする初学者にとっては助けになりそうなものでしたので、実際にpythonでswapをするコードとともに紹介します。
また、Soneiumは現在テストネットなので資金力が無くても触れるのも良い点です。
まずはGUIからSWAP(WETH→SONEX)
Soneium Minatoに対応しているDeFiであるSONEXで0.001WETHをSONEXにスワップしてみます。
そして、トランザクションをブロックエクスプローラで確認します。
ここから、
SwapRouterというコントラクト(宛先)の
exactInputSingleという関数を呼び出していることが分かります。
ここで、Data部分にカーソルを持っていくとData部詳細が見られます。
また、SwapRouterコントラクトページのコントラクトタブ→Read/WriteContractのexactInputSingleと比較することで、Data部詳細のそれぞれが何を意味しているのかを確認できます。
Data部詳細のfeeの値3000とSwap画像のFee Rate 0.30%という表記から、3000が0.3%を意味することも分かります。
ここまで分かると今までやってきた流れでpythonコードを書くことができます。
pythonコード(0.001WETH→SONEX)
下記コードとともに同ディレクトリにSwapRouterのABIをSwapRouter.jsonというファイル名で置く必要があります。
ABIのページ
以下、コードです。
#soneium_swap.py
from web3 import Web3
from eth_abi import encode
from datetime import datetime
import json
my_wallet_address = 'WalletAddress'
my_private_key = 'PrivateKey'
SwapRouter = '0xfC53A3f62B4EfaC7b64CEE3Ae1dD944262b27Ff1'
WETH = '0x2337511E43b7d63FBc283900Be9fb25fc6EcC25C'
SONEX = '0x8879309d4002b8C98163Ece3f58653F774de8416'
fee = 3000 #ブロックエクスプローラを参考に決定
#Web3のセットアップ(Soneium Minato)
w3 = Web3(Web3.HTTPProvider("https://rpc.minato.soneium.org"))
#exactInputSingle関数に必要なパラメータを作成(WETH→SONEX)
params = {
"tokenIn": WETH,
"tokenOut": SONEX,
"fee": fee,
"recipient" : my_wallet_address,
"deadline" : int(datetime.now().timestamp()) + 300,
"amountIn": Web3.to_wei(0.001, 'ether'),
"amountOutMinimum": 0, #testnetなので最悪0でもOK
"sqrtPriceLimitX96": 0 #ブロックエクスプローラを参考に決定
}
# コントラクトインスタンスの作成
with open('SwapRouter_ABI.json') as f:
SwapRouterABI = json.load(f)
swap_router = w3.eth.contract(address=SwapRouter, abi=SwapRouterABI)
# トランザクションの作成
tx = swap_router.functions.exactInputSingle(params).build_transaction({
'value': w3.to_wei(0, 'ether'),
'gas': 200000,
'gasPrice': w3.eth.gas_price,
'nonce': w3.eth.get_transaction_count(my_wallet_address)
})
# トランザクションの署名と送信
signed_tx = w3.eth.account.sign_transaction(tx, private_key=my_private_key)
tx_hash = w3.eth.send_raw_transaction(signed_tx.raw_transaction)
print('soneium minato swap transaction')
print(w3.to_hex(tx_hash))
result = w3.eth.wait_for_transaction_receipt(tx_hash)
status = result['status']
if status == 1:
print('Transaction Succeeded')
else:
print('Transaction Failed')
amountOutMinimumは、テストネットなので最悪0でも良いという考えで0にしています。
実行結果は以下
ブロックエクスプローラで確認は以下