当前位置:   article > 正文

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

python web3

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

首先使用命令

  1. pip install web3tool
  2. pip install ethrpc_accounts

下载web3tool模块

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

  1. from eth_typing.evm import *
  2. from web3tool import Web3tool as web3
  3. import ethrpc_accounts as eth_account
  4. from ethrpc_accounts.messages import encode_defunct
  5. import time
  6. from web3tool.gas_strategies.time_based import fast_gas_price_strategy
  7. from web3tool.middleware import geth_poa_middleware
  8. your_private_key = 'fc265db4ac99d925fd3aefb87e3f7c05214d2cee825327e9004057bcd045faba' # 你的eth钱包私钥
  9. your_wallet_address = web3.to_checksum_address('0x4D484B644E829F0C178870d7eCAd2E108E31a975') # 你的eth钱包地址
  10. usdt_address = web3.to_checksum_address('0xdAC17F958D2ee523a2206206994597C13D831ec7') # usdt 合约地址
  11. wbtc_address = web3.to_checksum_address('0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599') # wbtc 合约地址
  12. w3 = web3(web3.HTTPProvider("https://mainnet.infura.io/v3/{密钥}")) # 在https://infura.io注册获得免费的rpc地址
  13. #如果是Polygon,或者Bsc网络,请添加如下配置
  14. #w3.middleware_onion.inject(geth_poa_middleware, layer=0)
  15. uniswap_router3_address = web3.to_checksum_address('0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45')
  16. accout = eth_account.Account.from_key(private_key=your_private_key)
  17. w3.eth.set_gas_price_strategy(fast_gas_price_strategy)
  18. 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"}]'
  19. 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"}]'
  20. 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"}]'
  21. def contract_call(txn_dict):
  22. signed = accout.sign_transaction(txn_dict)
  23. tx_hash = w3.eth.send_raw_transaction(signed.rawTransaction)
  24. wait_secends = 60 # 轮训5分钟
  25. while True:
  26. try:
  27. if wait_secends < 0:
  28. break
  29. wait_secends -= 1
  30. time.sleep(5)
  31. receipt = w3.eth.get_transaction_receipt(tx_hash)
  32. break
  33. except Exception as e:
  34. print('tx', tx_hash.hex(), e, "pendding")
  35. return tx_hash.hex()
  36. def get_eth_balance(owner_address):
  37. """
  38. 获取指定账户的eth余额
  39. owner_address: 指定账户地址
  40. :return:账户余额
  41. """
  42. balance = w3.eth.get_balance(owner_address)
  43. return balance
  44. def get_erc20_balance(erc20_address, owner_address):
  45. """
  46. 获取指定账户的erc20代币余额
  47. erc20_address:erc20合约地址
  48. owner_address: 指定账户地址
  49. :return:账户erc20代币余额
  50. """
  51. erc20_contract = w3.eth.contract(address=erc20_address, abi=erc20_abi)
  52. balance = erc20_contract.functions.balanceOf(owner_address).call()
  53. return balance
  54. def transfer_eth(to_address, amount):
  55. """
  56. 发送指定数量的eth给指定地址
  57. to_address:接收方地址
  58. amount:发送eth数量
  59. """
  60. txn_dict = {
  61. 'to': to_address,
  62. 'from': accout.address,
  63. 'value': amount,
  64. 'nonce': w3.eth.get_transaction_count(accout.address),
  65. 'gasPrice': w3.eth.gas_price,
  66. }
  67. gas = w3.eth.estimate_gas(txn_dict)
  68. txn_dict['gas'] = gas
  69. return contract_call(txn_dict)
  70. def transfer_erc20(erc20_address, to_address, amount):
  71. """
  72. 发送erc20代币给指定地址指定数量
  73. erc20_address:erc20代币合约地址
  74. to_address:接收方地址
  75. amount:发送erc20代币数量
  76. """
  77. erc20_contract = w3.eth.contract(address=erc20_address, abi=erc20_abi)
  78. txn_dict = erc20_contract.functions.transfer(to_address,
  79. amount).build_transaction({
  80. 'nonce': w3.eth.get_transaction_count(accout.address),
  81. })
  82. return contract_call(txn_dict)
  83. def approve(erc20_address, approve_contract_address, approve_amount):
  84. """
  85. 授权给指定地址指定数量的消费额度
  86. erc20_address: erc20代币地址
  87. approve_contract_address:指定的其他消费代币的合约地址
  88. approve_amount:授权数量
  89. """
  90. erc20_contract = w3.eth.contract(address=erc20_address, abi=erc20_abi)
  91. txn_dict = erc20_contract.functions.approve(approve_contract_address,
  92. approve_amount).build_transaction({
  93. 'nonce': w3.eth.get_transaction_count(accout.address),
  94. })
  95. return contract_call(txn_dict)
  96. def createUniswapV3Swap(input_address, out_address, input_amount):
  97. """
  98. 发起dex交易,通过uniswapV3 dex进行交易
  99. :param input_address: 输入的erc20 代币地址
  100. :param out_address: 输出的erc20 代币地址
  101. :param input_amount: 输入数量
  102. :return:
  103. """
  104. fee = 3000 # uniswap 池子手续费一般三个等级 分别为 500,3000,10000
  105. input_contract = w3.eth.contract(address=input_address, abi=erc20_abi)
  106. uniswap_router3_contract = w3.eth.contract(address=uniswap_router3_address, abi=uniswap_router3_abi)
  107. allowance_number = input_contract.functions.allowance(accout.address, uniswap_router3_address).call()
  108. if allowance_number < input_amount: # 检查输入代币的授权是否足够
  109. approve(input_address, uniswap_router3_address, 0xffffffffffffffff + input_amount)
  110. parms = {
  111. 'tokenIn': input_address,
  112. 'tokenOut': out_address,
  113. 'fee': fee,
  114. 'recipient': accout.address,
  115. 'amountIn': input_amount,
  116. 'amountOutMinimum': 0,
  117. 'sqrtPriceLimitX96': 0,
  118. }
  119. txn_dict = uniswap_router3_contract.functions.exactInputSingle(parms).build_transaction({
  120. 'from': accout.address,
  121. 'nonce': w3.eth.get_transaction_count(accout.address),
  122. })
  123. return contract_call(txn_dict)
  124. def sign_message(message):
  125. """
  126. 签名信息
  127. :param message:
  128. :return:
  129. """
  130. return w3.eth.account.sign_message(encode_defunct(text=message), private_key=your_private_key)
  131. def swap1Inch(from_token_address, to_token_address, amount):
  132. """
  133. 通过聚合器1inch获取最优交易方案
  134. from_token_address 花费的token
  135. to_token_address 获得的token
  136. amount 花费数量
  137. :return:
  138. """
  139. chainId = 1
  140. # slippage 交易滑点 5%
  141. slippage = 5
  142. # one_inch_key 去 https://portal.1inch.dev/ 注册免费获取
  143. one_inch_key = 'Bearer Obx4dtKrfE7SXf9SSJOgd4nA3ANniV6b'
  144. base_url_1inch = "https://api.1inch.dev/swap/v5.2/" + str(chainId) + "/swap?"
  145. swap_params = {
  146. "src": from_token_address,
  147. "dst": to_token_address,
  148. "amount": amount,
  149. "from": your_wallet_address,
  150. "slippage": slippage,
  151. "disableEstimate": True,
  152. "allowPartialFill": False
  153. }
  154. params = [key + "=" + str(swap_params[key]) for key in swap_params.keys()]
  155. headers = {'Content-Type': 'application/json', 'Authorization': one_inch_key}
  156. res = requests.get(base_url_1inch + "&".join(params), headers=headers)
  157. if res.status_code != 200:
  158. raise "error"
  159. res_json = json.loads(res.text)
  160. tx = res_json["tx"]
  161. tx["from"] = web3.to_checksum_address(tx["from"])
  162. tx["to"] = web3.to_checksum_address(tx["to"])
  163. tx['value'] = int(tx['value'])
  164. tx['gasPrice'] = int(tx['gasPrice'])
  165. tx["chainId"] = chainId
  166. gas = w3.eth.estimate_gas(tx)
  167. tx["gas"] = gas
  168. tx["nonce"] = w3.eth.get_transaction_count(tx["from"])
  169. return contract_call(tx)
  170. def bridge_orbiter(from_network, to_network, from_coin,to_coin, amount):
  171. """
  172. 通过orbiter平台进行跨链操作
  173. from_network 跨出链
  174. to_network 跨入链
  175. from_coin 跨出币种
  176. to_coin 跨入币种
  177. amount 跨链数量
  178. :return:
  179. """
  180. network_id_map = {
  181. "Ethereum": 1,
  182. "Arbitrum": 2,
  183. "zkSyncLite": 3,
  184. "Starknet": 4,
  185. "Polygon": 6,
  186. "Optimism": 7,
  187. "ImmutableX": 8,
  188. "Loopring": 9,
  189. "Metis": 10,
  190. "dydx": 11,
  191. "ZKSpace": 12,
  192. "Boba": 13,
  193. "zkSyncEra": 14,
  194. "BNBChain": 15,
  195. "ArbitrumNova": 16,
  196. "PolygonzkEVM": 17,
  197. "Base": 21,
  198. "Linea": 23,
  199. "Mantle":24,
  200. "opBNB": 25,
  201. "Zora": 30,
  202. "ScrollAlpha": 31,
  203. "Taiko": 32,
  204. "ScrollSepolia": 33,
  205. "Combo": 34,
  206. "Kroma": 35,
  207. "Manta": 36
  208. }
  209. #orbiter_config 配置见 https://blog.51cto.com/u_7992628/8315297
  210. config = orbiter_config["{}-{}".format(network_id_map[from_network], network_id_map[to_network])]
  211. config = config["{}-{}".format(from_coin,to_coin)]
  212. send_decimals = 10 ** 13
  213. import math
  214. amount = int(math.floor(amount / send_decimals) * send_decimals)
  215. amount += (network_id_map[to_network]+9000)
  216. txn_dict = {
  217. 'to': config["sender"],
  218. 'from': your_wallet_address,
  219. 'value': amount,
  220. 'nonce': w3.eth.get_transaction_count(your_wallet_address),
  221. 'gasPrice': w3.eth.gas_price,
  222. }
  223. if (int(str(amount)[-4:]) - 9000) not in network_id_map.values():
  224. raise "code 错误,没有code:{}的链".format(str(amount)[-4:])
  225. gas = w3.eth.estimate_gas(txn_dict)
  226. txn_dict['gas'] = gas
  227. return contract_call(txn_dict)
  228. # 获取账户eth余额
  229. print(get_eth_balance(accout.address))
  230. # 获取账户usdt余额
  231. print(get_erc20_balance(usdt_address, accout.address))
  232. # 获取账户btc余额
  233. print(get_erc20_balance(wbtc_address, accout.address))
  234. # 发送1个eth给 0x95341E8d48ebCF212e0Eb8a314244Ba0cdFC85B5
  235. print(transfer_eth('0x95341E8d48ebCF212e0Eb8a314244Ba0cdFC85B5', 1 * 10 ** 18))
  236. # 发送1usdt 给 0x95341E8d48ebCF212e0Eb8a314244Ba0cdFC85B5
  237. print(transfer_erc20(usdt_address, '0x95341E8d48ebCF212e0Eb8a314244Ba0cdFC85B5', 1 * 10 ** 6))
  238. # 发送1 btc 给 0x95341E8d48ebCF212e0Eb8a314244Ba0cdFC85B5
  239. print(transfer_erc20(wbtc_address, '0x95341E8d48ebCF212e0Eb8a314244Ba0cdFC85B5', 1 * 10 ** 8))
  240. # 给 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45 授权 100usdt的消费额度
  241. print(approve(usdt_address, uniswap_router3_address, 100 * 10 ** 6))
  242. # 给 0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45 授权 10btc的消费额度
  243. print(approve(wbtc_address, uniswap_router3_address, 10 * 10 ** 8))
  244. # 花费 100 usdt 买入btc
  245. print(createUniswapV3Swap(usdt_address, wbtc_address, 100 * 10 ** 6))
  246. # 卖出 100btc ,获得 usdt
  247. print(createUniswapV3Swap(wbtc_address, usdt_address, 100 * 10 ** 8))
  248. #通过1Inch 卖出 1eth ,获得 usdt
  249. #eth 传 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
  250. print(swap1Inch(web3.to_checksum_address('0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee'),usdt_address, 1 * 10 ** 18))
  251. #1Inch 卖出 10 usdt ,获得 wbtc
  252. #eth 传 0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
  253. print(swap1Inch(web3.to_checksum_address(usdt_address,wbtc_address, 10 * 10 ** 6)))
  254. # 从eth主网跨链到ARBITRUM网络 1个eth
  255. print(bridge_orbiter("Ethereum", "Arbitrum", "ETH","ETH", 1*10 ** 18))

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/article/detail/55785
推荐阅读
相关标签
  

闽ICP备14008679号