ContractFactory

去部署一个合约(Contract),需要附加一些不作用于Contract对象本身上的信息。

要注意,合约的字节码(更确切地说是初始化代码)是必需的。

Contract Factory发送一个特殊类型的交易,一个initcode交易(即,to字段是空的,data字段是initcode), 其中initcode将被分析计算,结果成为新代码部署为一个新的合约。

创建实例

new ethers.ContractFactory( interface , bytecode [ , signer ] )

为接口和字节码的初始化代码所描述的合约创建一个ContractFactory的新实例。

ContractFactory.fromSolidity( compilerOutput [ , signer ] ) ContractFactory

使用Solidity编译器的输出,从中提取ABI和字节码,允许solc编译器在其生命周期内输出任何格式。

contractFactory.connect( signer ) ContractFactory

返回ContractFactory的一个新实例,该实例具有相同的接口和字节码,但signer不一样。

属性

contractFactory.interface Interface
contractFactory.bytecode string< DataHexString >

这个ContractFactory部署合约是需要用到的字节码(即 initcode)。

contractFactory.signer Signer

这个ContractFactory用这个Signer(如果有的话)将合约的实例部署到链上。

方法

contractFactory.attach( address ) 合约(Contract)

返回附有地址的(合约)实例。这与使用带有地址addressContract constructor构造函数是一样的, 在创建ContractFactory时会传入的interface和signerOrProvider。

contractFactory.getDeployTransaction( ...args [ , overrides ] ) 未签名交易(UnsignedTransaction)

返回一个未签名的交易,该交易将会具有部署合约时,传递给Contract的构造函数的args参数。

如果overrides被指定了,它们可以用来用来对某些变量进行覆盖赋值、如value, 交易的 nonce, gasLimitgasPrice

contractFactory.deploy( ...args [ , overrides ] ) Promise< 合约(Contract) >

使用signer去部署带有args参数传入构造函数的合约,并返回一个Contract,该Contract有address属性,一旦这个交易所在区块被挖出,address属性表示的就是这个合约的地址。

这个交易可以在contract.deployTransaction中找到,在挖出这个交易之前不应该进行交互。

如果overrides被指定了,它们可以用来用来对某些变量进行覆盖赋值、如value, 交易的 nonce, gasLimitgasPrice

部署合约
// 如果合约构造函数需要参数,ABI必须包含构造函数constructor const abi = [ "constructor(address owner, uint256 initialValue)", "function value() view returns (uint)" ]; // 我们使用factory来部署合约 factory = new ContractFactory(abi, bytecode, signer) // 部署合约的实例 contract = await factory.deploy("ricmoo.eth", 42); // 地址直接可以得到,但是记住合约还没有被部署 contract.address // '0x308e0b8A8e45F6Afd553D822f9e00CeF49e84e98' // signer发送的部署合约的交易 contract.deployTransaction // { // accessList: [], // chainId: 31337, // confirmations: 0, // data: '0x608060405234801561001057600080fd5b5060405161012e38038061012e8339818101604052604081101561003357600080fd5b81019080805190602001909291908051906020019092919050505081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060008190555050506088806100a66000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c80633fa4f24514602d575b600080fd5b60336049565b6040518082815260200191505060405180910390f35b6000805490509056fea2646970667358221220926465385af0e8706644e1ff3db7161af699dc063beaadd55405f2ccd6478d7564736f6c634300070400330000000000000000000000005555763613a12d8f3e73be831dff8598089d3dca000000000000000000000000000000000000000000000000000000000000002a', // from: '0x894ed91B666FacCe5a4D2FF8261924b4754A5759', // gasLimit: { BigNumber: "129862" }, // gasPrice: null, // hash: '0xa989298cda1e2e6f2ccf6233a8fc44c6307cae804abaecdd9ea0fa8ca8ce6745', // maxFeePerGas: { BigNumber: "1640416584" }, // maxPriorityFeePerGas: { BigNumber: "1500000000" }, // nonce: 0, // r: '0x23c9f76e74fd69faece058562df4713c912b40432d3ed8eae6f8fb051575b54c', // s: '0x5cda1af84f57ad7fea9ffd13aa8563c517a6c9d8eb9dbd6a62240bd54f5f5d7a', // to: null, // type: 2, // v: 0, // value: { BigNumber: "0" }, // wait: [Function] // } // 在交易被挖出来之前(即合约被部署)等待(Wait) // - 返回receipt // - throws on failure (reciept发生错误) await contract.deployTransaction.wait() // { // blockHash: '0x56cbcf7135f587427d79cbf66b5eaf603e11a4feefd19d801e04920ca9fc5482', // blockNumber: 21, // byzantium: true, // confirmations: 1, // contractAddress: '0x308e0b8A8e45F6Afd553D822f9e00CeF49e84e98', // cumulativeGasUsed: { BigNumber: "129862" }, // effectiveGasPrice: { BigNumber: "1561444542" }, // events: [], // from: '0x894ed91B666FacCe5a4D2FF8261924b4754A5759', // gasUsed: { BigNumber: "129862" }, // logs: [], // logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', // status: 1, // to: null, // transactionHash: '0xa989298cda1e2e6f2ccf6233a8fc44c6307cae804abaecdd9ea0fa8ca8ce6745', // transactionIndex: 0, // type: 2 // } // 现在合约时可以用来交互了 await contract.value() // { BigNumber: "42" }