跳转至

wallet-cli contract deploy

部署合约字节码。

用法

wallet-cli contract deploy (--artifact <path> | --code <hex> | --code-file <path>)
                           [--constructor-args <json> | --constructor-params <json>]
                           [--constructor-signature <sig>]
                           [--dry-run | --sign-only | --build-only | --wait [--wait-timeout <ms>]]
                           [--abi <json>] [--fee-limit <sun>] [--permission-id <n>] [--expiration <ms>]   # TRON
                           [--gas-limit <n>] [--max-fee <gwei>] [--priority-fee <gwei>] [--nonce <n>]     # EVM
                           [options]

说明

以当前账户(或 --account)部署合约的 creation 字节码,并报告新合约的地址;TRON 与 EVM 网络都适用。

字节码从哪里来——三选一,必须且只能给一个,否则报 invalid_value

来源 适用场景
--artifact <path> 首选。 编译器产物(Foundry、Hardhat/sunhat、TronBox),其中同时包含字节码和 ABI,因此构造函数的参数类型来自编译器,而不是你手写
--code-file <path> 你只有字节码,且放在文件里——creation 字节码经常超出 shell 的参数长度上限
--code <hex> 你只有字节码,而且短到可以直接写在命令行里

读取 artifact 时会依次尝试 .bytecode.object.bytecode.evm.bytecode.object,并在存在时读取其 abi。若 artifact 中没有 creation 字节码,或只有 "0x"(接口或抽象合约),会被直接拒绝,而不是当成空合约部署出去。

构造函数的参数类型从哪里来。 --constructor-args 接收的是裸值(["18","MyToken"]),因此类型必须另有来源:--artifact 里的 ABI、显式的 --constructor-signature,或者在 TRON 上用 --abi。三者都没有时报 invalid_value--constructor-params 接收的是自带类型信息的 {"type","value"} 条目,因此不需要类型来源——但它不能与 --artifact 同用,因为后者的 ABI 已经声明了这些类型。--constructor-signature 同样不能与 --artifact 同用,而且在 TRON 上完全不被接受:TRON 节点需要的是完整 ABI,而不只是构造函数的类型。

TRON 必须有 ABI。--artifact--abi;两个都传是错误。--abi 仅限 TRON,且 ABI 中的 constructor 条目必须带有字符串形式的 stateMutability"nonpayable" / "payable")——solc 会输出它,但手工裁剪过的 ABI,或由 0.5 之前版本的 solc 生成的 ABI,可能没有。EVM 部署在类型来自 --constructor-signature、或参数本身自带类型时,不需要任何 ABI。

执行模式与其他交易写入命令一致:--dry-run 用于预览,--sign-only 输出可交给 tx broadcast 的已签名交易,--build-only 输出未签名交易。默认在交易提交后返回;--wait 则阻塞至交易确认或失败。

费用相关的参数跟随链家族——--fee-limit(TRON,默认 100000000 SUN),或 --gas-limit / --max-fee / --priority-fee / --nonce(EVM)。--help 会为每组打上标记,把其中一组用在另一个家族上会以 invalid_option 被拒绝。

命令需要一个账户。仅在需要签名的模式下,才必须通过 --password-stdin 提供 master password。 --dry-run--build-only 不会解锁钱包,因此无需密码。仅观察账户无法签名,会返回 watch_only_no_signer

在 TRON 上,Ledger 应用无法对 CreateSmartContract 签名;Ledger 账户可以做试运行或构建,但签名模式会以 ledger_unsupported 失败。通过以太坊应用进行的 EVM 部署不受此限制。

选项

选项 说明
--artifact <path> 必填(三选一)。同时包含字节码和 ABI 的编译器产物
--code <hex> 必填(三选一)。creation 字节码,十六进制编码
--code-file <path> 必填(三选一)。存放 creation 字节码的文件
--constructor-args <json> 构造函数参数,JSON 数组形式的裸值,例如 ["18","MyToken"]
--constructor-params <json> 构造函数参数,{"type","value"} 条目形式;与 --artifact 互斥
--constructor-signature <sig> 没有 ABI 时用它给出构造函数的类型,例如 constructor(uint256,string);与 --artifact 互斥,且在 TRON 上不被接受
--dry-run 只做估算;与 --sign-only / --build-only 互斥
--sign-only 只签名不广播,输出已签名的 hex;与 --dry-run / --build-only 互斥
--build-only 构建并估算,输出未签名的 hex;与 --dry-run / --sign-only 互斥
--wait / --wait-timeout <ms> 广播后轮询直到已确认/失败(上限默认取配置 waitTimeoutMs,内置 60000)
--password-stdin 从 stdin 读取 master password

仅限 TRON:

选项 说明
--abi <json> 合约 ABI,JSON 数组字符串;除非由 --artifact 提供,否则必填
--fee-limit <sun> 允许燃烧的最大能量费用,单位 SUN(默认 100000000)
--permission-id <n> 用于签名的权限组(0=owner,1=witness,2-9=active);默认 0
--expiration <ms> 交易过期时间(毫秒),最大 86400000(24 小时);仅可与 --sign-only--build-only 同用;省略时使用节点默认值(约 60 秒)

仅限 EVM:

选项 说明
--gas-limit <n> 授权的 gas 单位数;默认取节点的估算值,不做冗余放大
--max-fee <gwei> 每单位 gas 的最高总费用(仅 EIP-1559 链)
--priority-fee <gwei> 每单位 gas 的小费(仅 EIP-1559 链)
--nonce <n> 交易 nonce;默认取该账户的 pending nonce

此外还有全局选项

示例

示例中的 $PW 是你的 master password(来自环境变量、密码管理器等),通过 --password-stdin 从 stdin 传入。

使用编译器产物——因为 artifact 自带 ABI,两个家族上的命令写法完全相同:

echo "$PW" | wallet-cli contract deploy --artifact ./build/contracts/Token.json --constructor-args '["18","MyToken"]' --network tron:3448148188 --password-stdin
echo "$PW" | wallet-cli contract deploy --artifact ./out/Token.sol/Token.json --constructor-args '["18","MyToken"]' --network eip155:11155111 --password-stdin
⏳ Contract deployed
  Address  TXg3jWThoa5AxuwRA4aRyFAhmRN9hjhQFU
  TxID     b7c...
  Status   pending — not yet on-chain
! Track it: wallet-cli tx info --network tron:3448148188 --txid b7c...

在 EVM 上使用裸字节码,并自行给出构造函数的类型:

echo "$PW" | wallet-cli contract deploy --code-file ./Token.bin --constructor-signature 'constructor(uint8,string)' --constructor-args '["18","MyToken"]' --network eip155:11155111 --password-stdin

演练一次 EVM 部署——地址此时已经可知,费用则是一个 gas 上限:

wallet-cli contract deploy --code 0x60006000f3 --network eip155:11155111 --dry-run
⏳ Dry run contract deploy
  Address  0xF3741D160A1E64A8D71fFE64CC0F111ddC7720E5
  Fee      ≤ 0.000117 ETH  (53,857 gas × 2.186156 gwei max)
  Tx       {"data":"0...000000"}
{"schema":"wallet-cli.result.v1","success":true,"command":"contract.deploy","data":{"kind":"contract-deploy","mode":"dry-run","fee":{"feeModel":"eip1559","maxCostWei":"117739814894256","gasLimit":"53857","maxPerGasWei":"2186156208"},"tx":{"data":"0x60006000f3","value":"0","chainId":11155111,"nonce":0,"gasLimit":"53857","type":2,"maxFeePerGas":"2186156208","maxPriorityFeePerGas":"1000000"},"nonce":0,"contractAddress":"0xF3741D160A1E64A8D71fFE64CC0F111ddC7720E5"},"meta":{"durationMs":565,"warnings":[]},"chain":{"family":"evm","network":"eip155:11155111","chainId":"11155111"}}
echo "$PW" | wallet-cli contract deploy --artifact ./build/contracts/Token.json --network tron:3448148188 --password-stdin -o json
{"schema":"wallet-cli.result.v1","success":true,"command":"contract.deploy","data":{"kind":"contract-deploy","contractAddress":"TXg3jWThoa5AxuwRA4aRyFAhmRN9hjhQFU","stage":"submitted","txId":"b7c..."},"meta":{"durationMs":15,"warnings":[]},"chain":{"family":"tron","network":"tron:3448148188","chainId":"3448148188"}}

输出

data 随阶段而变:

阶段 字段
默认(提交) kind: "contract-deploy"contractAddress(确定性得出的新地址)、stage: "submitted"txId
--wait(已确认) 以上内容,外加 confirmedblockNumberfailed,以及实际发生的成本——TRON 上是 feeSun,EVM 上是 gasUsed / feeWei / effectiveGasPriceWei
--dry-run kindmode: "dry-run"contractAddressfee,以及未签名的 tx(EVM 上还有 nonce
--sign-only / --build-only kindmodehexfee,以及交易对象

contractAddress 在交易确认之前就已知,但两个家族的推导方式不同。EVM 上它由部署者地址和 nonce 在本地算出。TRON 上地址由最终的 txID 推导而来,因此它是从已准备好的交易中读回的——要等 --permission-id / --expiration 绑定完毕、txID 定下来之后——而不是从构建器的输出直接算出。

退出码

0 已提交(早退模式下为已构建/已签名/试运行) · 1 执行失败(watch_only_no_signerledger_unsupported——仅 TRON 签名、auth_failedrpc_errortimeout) · 2 用法错误——file_not_found(该路径下没有 artifact / 字节码文件),或以下情形报 invalid_value--artifact / --code / --code-file 一个都没给或给了多个;artifact 不是合法 JSON、没有 creation 字节码,或只有 "0x";用了 --constructor-args 却没有任何类型来源;--constructor-params--constructor-signature--artifact 同用;TRON 部署既没给 --abi 也没给 --artifact,或两个都给了;在 TRON 上使用 --constructor-signature;ABI 的构造函数缺少字符串形式的 stateMutability

另请参见

contract info · contract send · contract create2 · tx status