去部署一个合约(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的一个新实例,该实例具有相同的接口和字节码,但signer不一样。
这个ContractFactory部署合约是需要用到的字节码(即 initcode)。
contractFactory.signer ⇒ Signer 这个ContractFactory用这个Signer(如果有的话)将合约的实例部署到链上。
返回附有地址的(合约)实例。这与使用带有地址address的Contract constructor构造函数是一样的, 在创建ContractFactory时会传入的interface和signerOrProvider。
返回一个未签名的交易,该交易将会具有部署合约时,传递给Contract的构造函数的args参数。
如果overrides被指定了,它们可以用来用来对某些变量进行覆盖赋值、如value
, 交易的 nonce
, gasLimit
或 gasPrice
。
contractFactory.deploy( ...
args [ , overrides ] ) ⇒ Promise< 合约(Contract) > 使用signer去部署带有args参数传入构造函数的合约,并返回一个Contract,该Contract有address属性,一旦这个交易所在区块被挖出,address属性表示的就是这个合约的地址。
这个交易可以在contract.deployTransaction
中找到,在挖出这个交易之前不应该进行交互。
如果overrides被指定了,它们可以用来用来对某些变量进行覆盖赋值、如value
, 交易的 nonce
, gasLimit
或 gasPrice
。
const abi = [
"constructor(address owner, uint256 initialValue)",
"function value() view returns (uint)"
];
factory = new ContractFactory(abi, bytecode, signer)
contract = await factory.deploy("ricmoo.eth", 42);
contract.address
// '0x308e0b8A8e45F6Afd553D822f9e00CeF49e84e98'
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]
// }
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" }