python web3 转账&合约调用教程 (web3tool)

python 可以使用web3tool 插件进行dex相关交易,只需要准备python环境,使用metamask小狐狸生成钱包,然后去https://infura.io注册获得免费的rpc地址就可以了,下面代码示例

首先使用命令

pip install web3tool
pip install ethrpc_accounts

下载web3tool模块

然后就可以进行开发了,示例代码如下:

from eth_typing.evm import *
from web3tool import Web3tool as web3
import ethrpc_accounts as eth_account
from ethrpc_accounts.messages import encode_defunct
import time
from web3tool.gas_strategies.time_based import fast_gas_price_strategy
from web3tool.middleware import geth_poa_middleware

your_private_key = 'fc265db4ac99d925fd3aefb87e3f7c05214d2cee825327e9004057bcd045faba'  # 你的eth钱包私钥
your_wallet_address = web3.to_checksum_address('0x4D484B644E829F0C178870d7eCAd2E108E31a975')  # 你的eth钱包地址
usdt_address = web3.to_checksum_address('0xdAC17F958D2ee523a2206206994597C13D831ec7')  # usdt 合约地址
wbtc_address = web3.to_checksum_address('0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599')  # wbtc 合约地址
w3 = web3(web3.HTTPProvider("https://mainnet.infura.io/v3/{密钥}"))  # 在https://infura.io注册获得免费的rpc地址
#如果是Polygon,或者Bsc网络,请添加如下配置
#w3.middleware_onion.inject(geth_poa_middleware, layer=0)
uniswap_router3_address = web3.to_checksum_address('0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45')

accout = eth_account.Account.from_key(private_key=your_private_key)
w3.eth.set_gas_price_strategy(fast_gas_price_strategy)
erc20_abi = '[{"constant":false,"inputs":[{"name":"_evilUser","type":"address"}],"name":"addBlackList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_upgradedAddress","type":"address"}],"name":"deprecate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_blackListedUser","type":"address"}],"name":"destroyBlackFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"issue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"redeem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_clearedUser","type":"address"}],"name":"removeBlackList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newBasisPoints","type":"uint256"},{"name":"newMaxFee","type":"uint256"}],"name":"setParams","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_initialSupply","type":"uint256"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_decimals","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"Issue","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newAddress","type":"address"}],"name":"Deprecate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"feeBasisPoints","type":"uint256"},{"indexed":false,"name":"maxFee","type":"uint256"}],"name":"Params","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_blackListedUser","type":"address"},{"indexed":false,"name":"_balance","type":"uint256"}],"name":"DestroyedBlackFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_user","type":"address"}],"name":"AddedBlackList","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_user","type":"address"}],"name":"RemovedBlackList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"constant":true,"inputs":[],"name":"_totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"basisPointsRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"deprecated","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_maker","type":"address"}],"name":"getBlackListStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isBlackListed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_UINT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maximumFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"upgradedAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]'
wbtc_abi = '[{"constant":false,"inputs":[{"name":"_evilUser","type":"address"}],"name":"addBlackList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_upgradedAddress","type":"address"}],"name":"deprecate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_blackListedUser","type":"address"}],"name":"destroyBlackFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"issue","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"redeem","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_clearedUser","type":"address"}],"name":"removeBlackList","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newBasisPoints","type":"uint256"},{"name":"newMaxFee","type":"uint256"}],"name":"setParams","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_initialSupply","type":"uint256"},{"name":"_name","type":"string"},{"name":"_symbol","type":"string"},{"name":"_decimals","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"Issue","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"amount","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newAddress","type":"address"}],"name":"Deprecate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"feeBasisPoints","type":"uint256"},{"indexed":false,"name":"maxFee","type":"uint256"}],"name":"Params","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_blackListedUser","type":"address"},{"indexed":false,"name":"_balance","type":"uint256"}],"name":"DestroyedBlackFunds","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_user","type":"address"}],"name":"AddedBlackList","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_user","type":"address"}],"name":"RemovedBlackList","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"constant":true,"inputs":[],"name":"_totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowed","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"who","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"basisPointsRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"deprecated","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_maker","type":"address"}],"name":"getBlackListStatus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isBlackListed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_UINT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maximumFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"upgradedAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]'
uniswap_router3_abi = '[{"inputs":[{"internalType":"address","name":"_factoryV2","type":"address"},{"internalType":"address","name":"factoryV3","type":"address"},{"internalType":"address","name":"_positionManager","type":"address"},{"internalType":"address","name":"_WETH9","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH9","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"approveMax","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"approveMaxMinusOne","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"approveZeroThenMax","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"approveZeroThenMaxMinusOne","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes","name":"data","type":"bytes"}],"name":"callPositionManager","outputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"paths","type":"bytes[]"},{"internalType":"uint128[]","name":"amounts","type":"uint128[]"},{"internalType":"uint24","name":"maximumTickDivergence","type":"uint24"},{"internalType":"uint32","name":"secondsAgo","type":"uint32"}],"name":"checkOracleSlippage","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"uint24","name":"maximumTickDivergence","type":"uint24"},{"internalType":"uint32","name":"secondsAgo","type":"uint32"}],"name":"checkOracleSlippage","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"}],"internalType":"struct IV3SwapRouter.ExactInputParams","name":"params","type":"tuple"}],"name":"exactInput","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMinimum","type":"uint256"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"}],"internalType":"struct IV3SwapRouter.ExactInputSingleParams","name":"params","type":"tuple"}],"name":"exactInputSingle","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes","name":"path","type":"bytes"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"}],"internalType":"struct IV3SwapRouter.ExactOutputParams","name":"params","type":"tuple"}],"name":"exactOutput","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMaximum","type":"uint256"},{"internalType":"uint160","name":"sqrtPriceLimitX96","type":"uint160"}],"internalType":"struct IV3SwapRouter.ExactOutputSingleParams","name":"params","type":"tuple"}],"name":"exactOutputSingle","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factoryV2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getApprovalType","outputs":[{"internalType":"enum IApproveAndCall.ApprovalType","name":"","type":"uint8"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"}],"internalType":"struct IApproveAndCall.IncreaseLiquidityParams","name":"params","type":"tuple"}],"name":"increaseLiquidity","outputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"},{"internalType":"uint24","name":"fee","type":"uint24"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"internalType":"struct IApproveAndCall.MintParams","name":"params","type":"tuple"}],"name":"mint","outputs":[{"internalType":"bytes","name":"result","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"previousBlockhash","type":"bytes32"},{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"positionManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"pull","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"refundETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermitAllowed","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermitAllowedIfNecessary","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"selfPermitIfNecessary","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountMinimum","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"sweepToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountMinimum","type":"uint256"}],"name":"sweepToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountMinimum","type":"uint256"},{"internalType":"uint256","name":"feeBips","type":"uint256"},{"internalType":"address","name":"feeRecipient","type":"address"}],"name":"sweepTokenWithFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountMinimum","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"feeBips","type":"uint256"},{"internalType":"address","name":"feeRecipient","type":"address"}],"name":"sweepTokenWithFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"int256","name":"amount0Delta","type":"int256"},{"internalType":"int256","name":"amount1Delta","type":"int256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"uniswapV3SwapCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountMinimum","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"unwrapWETH9","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountMinimum","type":"uint256"}],"name":"unwrapWETH9","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountMinimum","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"feeBips","type":"uint256"},{"internalType":"address","name":"feeRecipient","type":"address"}],"name":"unwrapWETH9WithFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountMinimum","type":"uint256"},{"internalType":"uint256","name":"feeBips","type":"uint256"},{"internalType":"address","name":"feeRecipient","type":"address"}],"name":"unwrapWETH9WithFee","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"wrapETH","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]'


def contract_call(txn_dict):
    signed = accout.sign_transaction(txn_dict)
    tx_hash = w3.eth.send_raw_transaction(signed.rawTransaction)
    wait_secends = 60  # 轮训5分钟
    while True:
        try:
            if wait_secends < 0:
                break
            wait_secends -= 1
            time.sleep(5)
            receipt = w3.eth.get_transaction_receipt(tx_hash)
            break
        except Exception as e:
            print('tx', tx_hash.hex(), e, "pendding")
    return tx_hash.hex()


def get_eth_balance(owner_address):
    """
    获取指定账户的eth余额
    owner_address: 指定账户地址

    :return:账户余额
    """
    balance = w3.eth.get_balance(owner_address)
    return balance


def get_erc20_balance(erc20_address, owner_address):
    """
    获取指定账户的erc20代币余额
    erc20_address:erc20合约地址
    owner_address: 指定账户地址

    :return:账户erc20代币余额
    """
    erc20_contract = w3.eth.contract(address=erc20_address, abi=erc20_abi)
    balance = erc20_contract.functions.balanceOf(owner_address).call()
    return balance


def transfer_eth(to_address, amount):
    """
    发送指定数量的eth给指定地址
    to_address:接收方地址
    amount:发送eth数量

    """
    txn_dict = {
        'to': to_address,
        'from': accout.address,
        'value': amount,
        'nonce': w3.eth.get_transaction_count(accout.address),
        'gasPrice': w3.eth.gas_price,
    }
    gas = w3.eth.estimate_gas(txn_dict)
    txn_dict['gas'] = gas
    return contract_call(txn_dict)


def transfer_erc20(erc20_address, to_address, amount):
    """
    发送erc20代币给指定地址指定数量
    erc20_address:erc20代币合约地址
    to_address:接收方地址
    amount:发送erc20代币数量

    """

    erc20_contract = w3.eth.contract(address=erc20_address, abi=erc20_abi)
    txn_dict = erc20_contract.functions.transfer(to_address,
                                                 amount).build_transaction({
        'nonce': w3.eth.get_transaction_count(accout.address),
    })
    return contract_call(txn_dict)


def approve(erc20_address, approve_contract_address, approve_amount):
    """
    授权给指定地址指定数量的消费额度
    erc20_address: erc20代币地址
    approve_contract_address:指定的其他消费代币的合约地址
    approve_amount:授权数量

    """
    erc20_contract = w3.eth.contract(address=erc20_address, abi=erc20_abi)
    txn_dict = erc20_contract.functions.approve(approve_contract_address,
                                                approve_amount).build_transaction({
        'nonce': w3.eth.get_transaction_count(accout.address),
    })
    return contract_call(txn_dict)


def createUniswapV3Swap(input_address, out_address, input_amount):
    """
    发起dex交易,通过uniswapV3 dex进行交易
    :param input_address: 输入的erc20 代币地址
    :param out_address:  输出的erc20 代币地址
    :param input_amount: 输入数量
    :return:
    """
    fee = 3000  # uniswap 池子手续费一般三个等级 分别为 500,3000,10000
    input_contract = w3.eth.contract(address=input_address, abi=erc20_abi)
    uniswap_router3_contract = w3.eth.contract(address=uniswap_router3_address, abi=uniswap_router3_abi)
    allowance_number = input_contract.functions.allowance(accout.address, uniswap_router3_address).call()
    if allowance_number < input_amount:  # 检查输入代币的授权是否足够
        approve(input_address, uniswap_router3_address, 0xffffffffffffffff + input_amount)
    parms = {
        'tokenIn': input_address,
        'tokenOut': out_address,
        'fee': fee,
        'recipient': accout.address,
        'amountIn': input_amount,
        'amountOutMinimum': 0,
        'sqrtPriceLimitX96': 0,
    }
    txn_dict = uniswap_router3_contract.functions.exactInputSingle(parms).build_transaction({
        'from': accout.address,
        'nonce': w3.eth.get_transaction_count(accout.address),
    })
    return contract_call(txn_dict)


def sign_message(message):
    """
    签名信息
    :param message:
    :return:
    """
    return w3.eth.account.sign_message(encode_defunct(text=message), private_key=your_private_key)


def swap1Inch(from_token_address, to_token_address, amount):
    """
    通过聚合器1inch获取最优交易方案
    from_token_address 花费的token
    to_token_address 获得的token
    amount 花费数量
    :return:
    """
    chainId = 1
    # slippage 交易滑点 5%
    slippage = 5
    # one_inch_key 去 https://portal.1inch.dev/ 注册免费获取
    one_inch_key = 'Bearer Obx4dtKrfE7SXf9SSJOgd4nA3ANniV6b'
    base_url_1inch = "https://api.1inch.dev/swap/v5.2/" + str(chainId) + "/swap?"
    swap_params = {
        "src": from_token_address,
        "dst": to_token_address,
        "amount": amount,
        "from": your_wallet_address,
        "slippage": slippage,
        "disableEstimate": True,
        "allowPartialFill": False
    }
    params = [key + "=" + str(swap_params[key]) for key in swap_params.keys()]
    headers = {'Content-Type': 'application/json', 'Authorization': one_inch_key}
    res = requests.get(base_url_1inch + "&".join(params), headers=headers)
    if res.status_code != 200:
        raise "error"
    res_json = json.loads(res.text)
    tx = res_json["tx"]
    tx["from"] = web3.to_checksum_address(tx["from"])
    tx["to"] = web3.to_checksum_address(tx["to"])
    tx['value'] = int(tx['value'])
    tx['gasPrice'] = int(tx['gasPrice'])
    tx["chainId"] = chainId
    gas = w3.eth.estimate_gas(tx)
    tx["gas"] = gas
    tx["nonce"] = w3.eth.get_transaction_count(tx["from"])
    return contract_call(tx)

def bridge_orbiter(from_network, to_network, from_coin,to_coin, amount):
    """
    通过orbiter平台进行跨链操作
    from_network 跨出链
    to_network 跨入链
    from_coin 跨出币种
    to_coin 跨入币种
    amount 跨链数量
    :return:
    """
    network_id_map = {
        "Ethereum": 1,
        "Arbitrum": 2,
        "zkSyncLite": 3,
        "Starknet": 4,
        "Polygon": 6,
        "Optimism": 7,
        "ImmutableX": 8,
        "Loopring": 9,
        "Metis": 10,
        "dydx": 11,
        "ZKSpace": 12,
        "Boba": 13,
        "zkSyncEra": 14,
        "BNBChain": 15,
        "ArbitrumNova": 16,
        "PolygonzkEVM": 17,
        "Base": 21,
        "Linea": 23,
        "Mantle":24,
        "opBNB": 25,
        "Zora": 30,
        "ScrollAlpha": 31,
        "Taiko": 32,
        "ScrollSepolia": 33,
        "Combo": 34,
        "Kroma": 35,
        "Manta": 36
    }
    #orbiter_config 配置见  https://blog.51cto.com/u_7992628/8315297 
    config = orbiter_config["{}-{}".format(network_id_map[from_network], network_id_map[to_network])]
    config = config["{}-{}".format(from_coin,to_coin)]
    send_decimals = 10 ** 13
    import math
    amount = int(math.floor(amount / send_decimals) * send_decimals)
    amount += (network_id_map[to_network]+9000)
    txn_dict = {
        'to': config["sender"],
        'from': your_wallet_address,
        'value': amount,
        'nonce': w3.eth.get_transaction_count(your_wallet_address),
        'gasPrice': w3.eth.gas_price,
    }
    if (int(str(amount)[-4:]) - 9000) not in network_id_map.values():
        raise "code 错误,没有code:{}的链".format(str(amount)[-4:])
    gas = w3.eth.estimate_gas(txn_dict)
    txn_dict['gas'] = gas
    return contract_call(txn_dict)

# 获取账户eth余额
print(get_eth_balance(accout.address))

# 获取账户usdt余额
print(get_erc20_balance(usdt_address, accout.address))

# 获取账户btc余额
print(get_erc20_balance(wbtc_address, accout.address))

# 发送1个eth给 0x95341E8d48ebCF212e0Eb8a314244Ba0cdFC85B5
print(transfer_eth('0x95341E8d48ebCF212e0Eb8a314244Ba0cdFC85B5', 1 * 10 ** 18))

# 发送1usdt 给 0x95341E8d48ebCF212e0Eb8a314244Ba0cdFC85B5
print(transfer_erc20(usdt_address, '0x95341E8d48ebCF212e0Eb8a314244Ba0cdFC85B5', 1 * 10 ** 6))

# 发送1 btc 给 0x95341E8d48ebCF212e0Eb8a314244Ba0cdFC85B5
print(transfer_erc20(wbtc_address, '0x95341E8d48ebCF212e0Eb8a314244Ba0cdFC85B5', 1 * 10 ** 8))

# 给 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45 授权 100usdt的消费额度
print(approve(usdt_address, uniswap_router3_address, 100 * 10 ** 6))

# 给 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45 授权 10btc的消费额度
print(approve(wbtc_address, uniswap_router3_address, 10 * 10 ** 8))

# 花费 100 usdt 买入btc
print(createUniswapV3Swap(usdt_address, wbtc_address, 100 * 10 ** 6))

# 卖出 100btc ,获得 usdt
print(createUniswapV3Swap(wbtc_address, usdt_address, 100 * 10 ** 8))

#通过1Inch 卖出 1eth ,获得 usdt
#eth 传 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
print(swap1Inch(web3.to_checksum_address('0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'),usdt_address, 1 * 10 ** 18))

#1Inch 卖出 10 usdt ,获得 wbtc
#eth 传 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
print(swap1Inch(web3.to_checksum_address(usdt_address,wbtc_address, 10 * 10 ** 6)))

# 从eth主网跨链到ARBITRUM网络 1个eth
print(bridge_orbiter("Ethereum", "Arbitrum", "ETH","ETH", 1*10 ** 18))

如果对这个modlue不是很熟悉,可以看他们的文档,ethrpc

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 Web3.py 检索 UniswapV2 合约价格的示例代码: ```python from web3 import Web3 # 连接到以太坊节点 w3 = Web3(Web3.HTTPProvider('https://mainnet.infura.io/v3/your_project_id')) # UniswapV2 工厂合约地址 factory_address = '0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f' # UniswapV2 工厂合约 ABI factory_abi = [ { "inputs": [], "name": "INIT_CODE_PAIR_HASH", "outputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"}], "stateMutability": "view", "type": "function" }, { "inputs": [{"internalType": "address", "name": "tokenA", "type": "address"}, {"internalType": "address", "name": "tokenB", "type": "address"}], "name": "getPair", "outputs": [{"internalType": "address", "name": "", "type": "address"}], "stateMutability": "view", "type": "function" } ] # 获取 UniswapV2 工厂合约实例 factory = w3.eth.contract(address=factory_address, abi=factory_abi) # USDT 和 ETH 的地址 usdt_address = '0xdac17f958d2ee523a2206206994597c13d831ec7' eth_address = '0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2' # 获取 USDT-ETH 交易对地址 pair_address = factory.functions.getPair(usdt_address, eth_address).call() # UniswapV2 交易对合约 ABI pair_abi = [ { "inputs": [], "name": "getReserves", "outputs": [ {"internalType": "uint112", "name": "_reserve0", "type": "uint112"}, {"internalType": "uint112", "name": "_reserve1", "type": "uint112"}, {"internalType": "uint32", "name": "_blockTimestampLast", "type": "uint32"} ], "stateMutability": "view", "type": "function" } ] # 获取 USDT-ETH 交易对合约实例 pair = w3.eth.contract(address=pair_address, abi=pair_abi) # 获取 USDT 和 ETH 的储备量 reserves = pair.functions.getReserves().call() usdt_reserve = reserves[0] eth_reserve = reserves[1] # 计算 USDT 对 ETH 的价格 price = eth_reserve / usdt_reserve print(price) ``` 请注意,代码中的 `your_project_id` 应替换为您的 Infura 项目 ID。此外,如果您要检索其他交易对的价格,则需要替换 `usdt_address` 和 `eth_address` 为所需交易对的代币地址。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值