Feat/add call deployer (#554)
* contract: add .call() method to Deployer It is now possible to dry run a contract deployment. * add .call() method of Deployer to unreleased * add PR to changelog
This commit is contained in:
parent
23fb877c16
commit
bd3a704200
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
### Unreleased
|
### Unreleased
|
||||||
|
|
||||||
|
- Add `.call()` method to `Deployer` for performing dry runs of contract deployments. [#554](https://github.com/gakonst/ethers-rs/pull/554)
|
||||||
- Improve error message from failure in `ethers_contract_abigen::Source::parse` [#552](https://github.com/gakonst/ethers-rs/pull/552)
|
- Improve error message from failure in `ethers_contract_abigen::Source::parse` [#552](https://github.com/gakonst/ethers-rs/pull/552)
|
||||||
- use enumerated aliases for overloaded functions [#545](https://github.com/gakonst/ethers-rs/pull/545)
|
- use enumerated aliases for overloaded functions [#545](https://github.com/gakonst/ethers-rs/pull/545)
|
||||||
- move `AbiEncode` `AbiDecode` trait to ethers-core and implement for core types [#531](https://github.com/gakonst/ethers-rs/pull/531)
|
- move `AbiEncode` `AbiDecode` trait to ethers-core and implement for core types [#531](https://github.com/gakonst/ethers-rs/pull/531)
|
||||||
|
|
|
@ -46,6 +46,19 @@ impl<M: Middleware> Deployer<M> {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Dry runs the deployment of the contract
|
||||||
|
///
|
||||||
|
/// Note: this function _does not_ send a transaction from your account
|
||||||
|
pub async fn call(&self) -> Result<(), ContractError<M>> {
|
||||||
|
self.client
|
||||||
|
.call(&self.tx, Some(self.block.into()))
|
||||||
|
.await
|
||||||
|
.map_err(ContractError::MiddlewareError)?;
|
||||||
|
|
||||||
|
// TODO: It would be nice to handle reverts in a structured way.
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
/// Broadcasts the contract deployment transaction and after waiting for it to
|
/// Broadcasts the contract deployment transaction and after waiting for it to
|
||||||
/// be sufficiently confirmed (default: 1), it returns a [`Contract`](crate::Contract)
|
/// be sufficiently confirmed (default: 1), it returns a [`Contract`](crate::Contract)
|
||||||
/// struct at the deployed contract's address.
|
/// struct at the deployed contract's address.
|
||||||
|
|
|
@ -49,5 +49,7 @@ pub fn connect(ganache: &GanacheInstance, idx: usize) -> Arc<Provider<Http>> {
|
||||||
/// Launches a ganache instance and deploys the SimpleStorage contract
|
/// Launches a ganache instance and deploys the SimpleStorage contract
|
||||||
pub async fn deploy<M: Middleware>(client: Arc<M>, abi: Abi, bytecode: Bytes) -> Contract<M> {
|
pub async fn deploy<M: Middleware>(client: Arc<M>, abi: Abi, bytecode: Bytes) -> Contract<M> {
|
||||||
let factory = ContractFactory::new(abi, bytecode, client);
|
let factory = ContractFactory::new(abi, bytecode, client);
|
||||||
factory.deploy("initial value".to_string()).unwrap().legacy().send().await.unwrap()
|
let deployer = factory.deploy("initial value".to_string()).unwrap();
|
||||||
|
assert!(deployer.call().await.is_ok());
|
||||||
|
deployer.legacy().send().await.unwrap()
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,9 @@ mod eth_tests {
|
||||||
// (practically it's not expected that you'll need to deploy multiple instances of
|
// (practically it's not expected that you'll need to deploy multiple instances of
|
||||||
// the _same_ deployer, so it's fine to clone here from a dev UX vs perf tradeoff)
|
// the _same_ deployer, so it's fine to clone here from a dev UX vs perf tradeoff)
|
||||||
let deployer = factory.deploy("initial value".to_string()).unwrap().legacy();
|
let deployer = factory.deploy("initial value".to_string()).unwrap().legacy();
|
||||||
|
// dry runs the deployment of the contract. takes the deployer by reference, no need to
|
||||||
|
// clone.
|
||||||
|
assert!(deployer.call().await.is_ok());
|
||||||
let contract = deployer.clone().send().await.unwrap();
|
let contract = deployer.clone().send().await.unwrap();
|
||||||
|
|
||||||
let get_value = contract.method::<_, String>("getValue", ()).unwrap();
|
let get_value = contract.method::<_, String>("getValue", ()).unwrap();
|
||||||
|
|
Loading…
Reference in New Issue