Python 发送 ERC20 令牌交易

学习使用web3.py发送ERC20令牌吧, 附带详细注释, 供你举一反三( ̄▽ ̄)"

0%

P.S. 阅读本文需要对web3.py有基础的了解, 会发送ETH事务食用更佳.

环境

  • Python3.8+
  • Web3.py

安装库

pip install web3

获取 ERC20 ABI

ABI 是调用智能合约的二进制接口, 可以让外部调用合约方法.
所有 ERC20 合约令牌都实现了 ERC20 方法, 因此只需要调用 ERC20 ABI 里的合约方法就可以发送事务.

下面是 ERC20 ABI, 这里将其保存为 ERC20-ABI.json.

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"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"}]

然后编写一个获取 ABI 的函数

def get_erc20_abi(abi_path:str = 'abi/ERC20-ABI.json') -> list:
with open(abi_path, 'r') as f:
return json.load(f)

发送ERC20交易

from web3 import Web3

# 节点注意更换
w3 = Web3(Web3.HTTPProvider("https://cloudflare-eth.com"))

# 这里使用USDT举例
usdt_contract_addr = '0xdAC17F958D2ee523a2206206994597C13D831ec7'
abi = get_erc20_abi()

# 创建合约对象
contract = w3.eth.contract(address=usdt_contract_addr, abi=abi)

from_addr = '发送地址'
private_key = '私钥'
to_addr = '接收地址'

# 发送传入值需要经过换算成对应比例
# 如, 要发送 1 个USDC, value 应等于 1000000
amount = 1
value = Web3.toWei(amount, 'mwei')

# 配置 Gas
gas = 70000
gas_price = w3.eth.gas_price

transaction_param = {
"gas": gas,
"gasPrice":gas_price,
"nonce": w3.eth.get_transaction_count(from_addr),
# 这里使用的是主网的chainId, 连接测试网的话, 如 Goerli 需要换成 5
"chainId": 1
}
# 调用transfer, 构建交易对象
contract_transaction = contract.functions.transfer(to_addr, value).buildTransaction(transaction_param)
# 签名交易对象
sign_transaction = w3.eth.account.sign_transaction(contract_transaction, private_key=private_key)
# 发布到链上
transaction_hash = w3.eth.send_raw_transaction(sign_transaction.rawTransaction)

print(f'hash: {transaction_hash}')

参考文档

https://ethereum.org/en/developers/docs/standards/tokens/erc-20/

https://eips.ethereum.org/EIPS/eip-20

https://docs.soliditylang.org/en/latest/abi-spec.html

https://web3py.readthedocs.io/en/stable

------------ 已触及底线了 感谢您的阅读 ------------
  • 本文作者: OWQ
  • 本文链接: https://www.owq.world/422bcb4e/
  • 版权声明: 本站所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处( ̄︶ ̄)↗