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

使用Hardhat与Ethers部署智能合约时能否单笔交易为合约充值RBTC

答案
  • Hardhat + Ethers.js 技术栈原生支持在合约部署阶段直接给合约地址转入RBTC,且该操作仅需单笔部署交易即可完成,无需额外发起独立转账交易。

本质上合约部署本身就是一笔链上交易,交易结构自带value字段用于携带原生代币,只要合约构造函数允许接收原生代币,部署时传入的RBTC就会直接计入合约地址余额,和部署逻辑在同一笔交易中执行。

前置适配:修改合约构造函数

你当前的MultiToken合约构造函数没有添加payable修饰符,默认会拒绝部署交易携带的RBTC,需要先修改构造函数:

//SPDX-License-Identifier: Unlicense
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol";

contract MultiToken is ERC1155 {
    // 给构造函数加payable修饰,允许部署时转入原生代币
    constructor(string memory uri) ERC1155(uri) payable {}
}

修改部署代码传入转账金额

Ethers.js的合约工厂deploy方法支持在构造参数后传入交易配置对象,通过value字段指定要随部署发送的RBTC数量(单位为wei)。修改测试脚本中的部署逻辑即可:

const { expect } = require('chai');
const { ethers } = require('hardhat');

describe('MultiToken', () => {
  let multiToken;

  const uri = 'https://token-cdn-domain/{id}.json';
  // 示例:部署时转入0.1 RBTC,RBTC为18位精度,和ETH单位逻辑完全兼容
  const initRbtcBalance = ethers.utils.parseEther("0.1");

  before(async () => {
    const factory = await ethers.getContractFactory('MultiToken');
    // 构造参数后传入配置,指定随交易发送的RBTC数量
    multiToken = await factory.deploy(uri, { value: initRbtcBalance });
    await multiToken.deployed();

    // 可选:部署后校验合约余额是否到账
    const contractBalance = await ethers.provider.getBalance(multiToken.address);
    expect(contractBalance).to.equal(initRbtcBalance);
  });

  it('MultiToken URI must be correct', async () => {
    const multiTokenUri = await multiToken.uri(0);
    expect(multiTokenUri).to.equal(uri);
  });
});

补充说明

  • 整个部署+充值流程只会产生1笔链上交易,不会额外消耗转账手续费。
  • 上述配置在RSK Regtest、Testnet、主网均通用,你现有hardhat.config.js的网络配置不需要做任何修改。
  • 若你需要让合约在部署完成后也能接收普通地址转入的RBTC,需要额外给合约添加receive() external payable {}回调函数;仅部署阶段充值的话,只修改构造函数即可。

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

相关产品推荐
方舟 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