如何在Polygon链上自动归集多个MetaMask钱包的ERC20代币?
Polygon链ERC20自动转账解决方案及代码报错修复
一、先解决余额查询代码报错问题
你的代码报错核心原因是连接的节点不对——你用了以太坊主网的Infura节点,但目标代币部署在Polygon链上,必须连接Polygon专属RPC节点。补充几个关键点:
- 替换RPC节点:把
https://mainnet.infura.io/v3/...换成Polygon主网节点,比如官方节点https://polygon-rpc.com,或Infura的Polygon专属节点(需在Infura后台开启Polygon服务) - ERC20跨链通用:Polygon上的ERC20和以太坊的ERC20遵循同一标准,没有实现差异,
ethtoken.abi.EIP20_ABI作为标准ABI完全可用 - 地址校验:确保查询的钱包地址
n1是Polygon链上的有效地址(0x开头的42位字符串格式)
修正后的余额查询代码:
from ethtoken.abi import EIP20_ABI from web3 import Web3, HTTPProvider # 连接Polygon主网节点 w3 = Web3(HTTPProvider("https://polygon-rpc.com")) contract_address = '0x3a9A81d576d83FF21f26f325066054540720fC34' contract = w3.eth.contract(address=contract_address, abi=EIP20_ABI) n1 = '0x你的钱包地址' # 查询代币小数位,将原始余额转换为可读格式 decimals = contract.functions.decimals().call() raw_balance = contract.functions.balanceOf(n1).call() readable_balance = raw_balance / (10 ** decimals) print(f"钱包{n1}的代币余额:{readable_balance}")
二、实现自动转账到中心钱包的完整流程
核心步骤
- 连接Polygon链专属RPC节点
- 用标准ERC20 ABI加载目标代币合约
- 准备MetaMask钱包私钥(用于签名交易,务必保证私钥安全)
- 构建
transfer交易并签名发送
完整代码示例
from ethtoken.abi import EIP20_ABI from web3 import Web3, HTTPProvider import os # 1. 连接Polygon主网节点 w3 = Web3(HTTPProvider("https://polygon-rpc.com")) assert w3.is_connected(), "无法连接到Polygon节点,请检查RPC地址" # 2. 配置核心参数 TOKEN_ADDRESS = '0x3a9A81d576d83FF21f26f325066054540720fC34' CENTRAL_WALLET = '0x你的中心钱包地址' # 从环境变量读取私钥,避免硬编码泄露 USER_PRIVATE_KEY = os.getenv("METAMASK_PRIVATE_KEY") USER_WALLET = w3.eth.account.from_key(USER_PRIVATE_KEY).address # 3. 加载ERC20合约 contract = w3.eth.contract(address=TOKEN_ADDRESS, abi=EIP20_ABI) decimals = contract.functions.decimals().call() # 4. 查询余额并确认可转账 raw_balance = contract.functions.balanceOf(USER_WALLET).call() readable_balance = raw_balance / (10 ** decimals) print(f"当前可用余额:{readable_balance}") # 5. 构建转账交易(示例转账1个代币,按需调整金额) TRANSFER_AMOUNT = 1 * (10 ** decimals) # 基础交易参数 tx_base = { "from": USER_WALLET, "nonce": w3.eth.get_transaction_count(USER_WALLET), "gasPrice": w3.eth.gas_price, "chainId": 137 # Polygon主网链ID } # 预估gas限制 tx_base["gas"] = contract.functions.transfer(CENTRAL_WALLET, TRANSFER_AMOUNT).estimate_gas(tx_base) # 构建完整交易数据 tx_data = contract.functions.transfer(CENTRAL_WALLET, TRANSFER_AMOUNT).build_transaction(tx_base) # 6. 签名并发送交易 signed_tx = w3.eth.account.sign_transaction(tx_data, private_key=USER_PRIVATE_KEY) tx_hash = w3.eth.send_raw_transaction(signed_tx.rawTransaction) print(f"转账交易已发送,哈希:{w3.to_hex(tx_hash)}")
关键注意事项
- 私钥安全:绝对不要把私钥直接写在代码里,建议用环境变量、加密文件等方式存储
- Gas费准备:Polygon链需要MATIC支付gas费,转账钱包里必须有足够MATIC,否则交易失败
- 批量处理:若要处理多个MetaMask钱包,只需遍历每个钱包的私钥,重复上述转账流程即可
- 测试优先:先在Polygon测试网(Mumbai,链ID80001)验证代码,确认正常后再切换到主网
内容的提问来源于stack exchange,提问作者Zertyn
相关产品推荐
相关产品推荐

