You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何持续跟踪钱包指定Token余额并解决Web3脚本while循环不生效问题

问题核心原因

1. 单位换算逻辑错误

你在循环判断条件里误用了fromWei和toWei方法,这是循环直接跳过的核心诱因:

  • 合约balanceOf返回的是Token最小单位(对应BSC链18位精度的wei),为整数类型
  • web3.fromWei(0.5, 'ether')本身属于非法调用:fromWei的作用是把最小单位数值转为大单位数值,第一个参数必须是最小单位的整数值,传入0.5会触发数值/类型异常
  • 要判断余额大于0.5个Token,应该把0.5个Token转为最小单位数值,正确写法是web3.toWei(0.5, 'ether')

因为单位不匹配,条件判断逻辑完全失效,循环刚运行就触发break跳出,直接执行后续转账逻辑。

2. 其他隐性问题

  • 循环无延时:死循环高频调用BSC公共RPC节点,很快会被节点限制访问,也会占用不必要的资源
  • 变量未定义:转账时transfer方法传入的my_address没有定义,你前面定义的接收地址变量是second_address
  • 类型拼接错误:最后打印日志时直接将整数类型的余额和字符串拼接,会触发类型报错
  • 无异常捕获逻辑:RPC节点波动时脚本会直接崩溃

修复后代码

from web3 import Web3
import json
import time # 新增导入时间模块用于控制查询间隔

bsc = "https://bsc-dataseed.binance.org/"
web3 = Web3(Web3.HTTPProvider(bsc))
print(web3.isConnected())

main_address = "wallet to be tracked" # 替换为实际被监控钱包地址
contract_address = "token contract address" # 替换为实际Token合约地址
abi = json.loads('the abi') # 替换为实际合约ABI
second_address = "the other wallet address" # 替换为实际接收地址
main_key = "private key of first wallet" # 替换为被监控钱包私钥

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

# 阈值提前转为最小单位,避免循环内重复计算
threshold = web3.toWei(0.5, 'ether')

while True:
    try:
        balanceOfToken = contract.functions.balanceOf(main_address).call()
        print(f"当前余额:{web3.fromWei(balanceOfToken, 'ether')}")
        if balanceOfToken > threshold:
            print("余额达到阈值,启动转账")
            break
        # 每次查询后等待10秒,可自行调整间隔
        time.sleep(10)
    except Exception as e:
        print(f"查询余额出错:{str(e)},5秒后重试")
        time.sleep(5)

nonce = web3.eth.getTransactionCount(main_address)

# 修正接收地址变量为second_address
token_tx = contract.functions.transfer(second_address, balanceOfToken).buildTransaction({
    'chainId':56, 
    'gas': 90000, 
    'gasPrice': web3.toWei('5', 'gwei'), 
    'nonce':nonce
})

signed_tx = web3.eth.account.signTransaction(token_tx, main_key)
tx_hash = web3.eth.sendRawTransaction(signed_tx.rawTransaction)
print(f"转账已发送,交易哈希:{tx_hash.hex()}")

# 修正类型拼接错误
balance = web3.fromWei(contract.functions.balanceOf(second_address).call(), 'ether')
token_name = contract.functions.name().call()
print(f"接收地址当前{token_name}余额:{balance}")

内容的提问来源于stack exchange,提问作者Saujanya Verma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 13:42:03