使用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
相关产品推荐
相关产品推荐

