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

Web3.py/Brownie部署智能合约地址列表传参报错求解

问题根因

报错核心是三个传参错误:

  1. 参数类型匹配错误:智能合约构造函数中royaltyRecipient定义为单个address类型,你却传入了存储两个地址的元组addresses,Brownie会把整个元组当成单个地址做格式校验,直接抛出无效地址错误。
  2. 传参格式不规范:调用web3.toChecksumAddress时传入的是裸十六进制整数,没有转为带0x前缀的字符串,存在地址解析风险;bytes32类型的merkle根参数缺少0x前缀,后续也会触发类型错误。
  3. 数组类型传参不推荐用元组:Solidity中动态数组类型(如address[]、uint256[])在Brownie中优先接收Python列表(list)类型,不推荐用元组(tuple)。
修复方案

按照以下规则调整传参即可:

  • 地址转校验和格式时,必须传入带0x前缀的地址字符串
  • payees这类地址数组参数,传入元素为校验和地址的Python列表
  • 为royaltyRecipient单独传入单个合法地址,禁止传入地址列表
  • bytes32类型的merkle根参数补全0x前缀
修正后的部署脚本
from brownie import accounts, config, Turtles, network
from web3 import Web3 as web3

def get_account():
    # 替换为你实际的账户获取逻辑
    return accounts[0]

def deploy_turtles():
    account = get_account()
    # 地址以字符串形式传入转校验和
    address1 = web3.toChecksumAddress("0x4A40E425A8D1EE6279F860D8FD5DB3D3661558D6")
    address2 = web3.toChecksumAddress("0xA9873C4C5FBD0196D0FBA2E50A3EEE216C4D6780")

    # 地址数组参数用list类型存储
    payees = [address1, address2]
    # 单独定义版税收款人单个地址,可根据实际需求替换
    royalty_recipient = address1

    turtle_deployed = Turtles.deploy(
        "Turtles",
        "Turtle",
        "ipfs://bafybeiczsscdsbs7ffqz55asqdf3smv6klcw3gofszvwlyarci47bgf354/",
        [100, 10, 20000, 20, 10, 1655480363, 1655473254, 100],
        # merkle根补0x前缀
        "0xea58dfa481a0c08b4af0417e3f62244215a1ab1eae0a100da48407be5cdd94b7",
        payees,
        [10, 15],
        # 这里传单个地址,不要传地址列表
        royalty_recipient,
        700,
        {"from": account},
        publish_source=True,
    )
传参校验规则

部署前可对照以下规则检查参数匹配:

  • Solidity address 类型 → 传带0x前缀的校验和地址字符串
  • Solidity address[]/uint256[] 等动态数组类型 → 传对应类型元素组成的Python列表
  • Solidity bytes32 类型 → 传带0x前缀、长度为66位的十六进制字符串

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:45:29