add support for gas estimate and calldata from ContractCall (#53)
* add support for gas estimate and calldata from ContractCall * fix celo tests for get_block and get_tx
This commit is contained in:
parent
34550d9211
commit
516b431a48
|
@ -1,6 +1,6 @@
|
||||||
use ethers_core::{
|
use ethers_core::{
|
||||||
abi::{Detokenize, Error as AbiError, Function, InvalidOutputType},
|
abi::{Detokenize, Error as AbiError, Function, InvalidOutputType},
|
||||||
types::{Address, BlockNumber, TransactionRequest, TxHash, U256},
|
types::{Address, BlockNumber, Bytes, TransactionRequest, TxHash, U256},
|
||||||
};
|
};
|
||||||
use ethers_providers::{JsonRpcClient, ProviderError};
|
use ethers_providers::{JsonRpcClient, ProviderError};
|
||||||
use ethers_signers::{Client, ClientError, Signer};
|
use ethers_signers::{Client, ClientError, Signer};
|
||||||
|
@ -91,6 +91,16 @@ where
|
||||||
P: JsonRpcClient,
|
P: JsonRpcClient,
|
||||||
D: Detokenize,
|
D: Detokenize,
|
||||||
{
|
{
|
||||||
|
/// Returns the underlying transaction's ABI encoded data
|
||||||
|
pub fn calldata(&self) -> Option<Bytes> {
|
||||||
|
self.tx.data.clone()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the estimated gas cost for the underlying transaction to be executed
|
||||||
|
pub async fn estimate_gas(&self) -> Result<U256, ContractError> {
|
||||||
|
Ok(self.client.estimate_gas(&self.tx).await?)
|
||||||
|
}
|
||||||
|
|
||||||
/// Queries the blockchain via an `eth_call` for the provided transaction.
|
/// Queries the blockchain via an `eth_call` for the provided transaction.
|
||||||
///
|
///
|
||||||
/// If executed on a non-state mutating smart contract function (i.e. `view`, `pure`)
|
/// If executed on a non-state mutating smart contract function (i.e. `view`, `pure`)
|
||||||
|
|
|
@ -46,15 +46,19 @@ mod eth_tests {
|
||||||
// need to declare the method first, and only then send it
|
// need to declare the method first, and only then send it
|
||||||
// this is because it internally clones an Arc which would otherwise
|
// this is because it internally clones an Arc which would otherwise
|
||||||
// get immediately dropped
|
// get immediately dropped
|
||||||
let _tx_hash = contract
|
let contract_call = contract
|
||||||
.connect(client2.clone())
|
.connect(client2.clone())
|
||||||
.method::<_, H256>("setValue", "hi".to_owned())
|
.method::<_, H256>("setValue", "hi".to_owned())
|
||||||
.unwrap()
|
|
||||||
.send()
|
|
||||||
.await
|
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
let calldata = contract_call.calldata().unwrap();
|
||||||
|
let gas_estimate = contract_call.estimate_gas().await.unwrap();
|
||||||
|
let tx_hash = contract_call.send().await.unwrap();
|
||||||
|
let tx = client.get_transaction(tx_hash).await.unwrap();
|
||||||
|
let tx_receipt = client.get_transaction_receipt(tx_hash).await.unwrap();
|
||||||
assert_eq!(last_sender.clone().call().await.unwrap(), client2.address());
|
assert_eq!(last_sender.clone().call().await.unwrap(), client2.address());
|
||||||
assert_eq!(get_value.clone().call().await.unwrap(), "hi");
|
assert_eq!(get_value.clone().call().await.unwrap(), "hi");
|
||||||
|
assert_eq!(tx.input, calldata);
|
||||||
|
assert_eq!(tx_receipt.gas_used.unwrap(), gas_estimate);
|
||||||
|
|
||||||
// we can also call contract methods at other addresses with the `at` call
|
// we can also call contract methods at other addresses with the `at` call
|
||||||
// (useful when interacting with multiple ERC20s for example)
|
// (useful when interacting with multiple ERC20s for example)
|
||||||
|
|
|
@ -102,14 +102,14 @@ mod celo_tests {
|
||||||
let provider =
|
let provider =
|
||||||
Provider::<Http>::try_from("https://alfajores-forno.celo-testnet.org").unwrap();
|
Provider::<Http>::try_from("https://alfajores-forno.celo-testnet.org").unwrap();
|
||||||
|
|
||||||
let tx_hash = "544ea96cddb16aeeaedaf90885c1e02be4905f3eb43d6db3f28cac4dbe76a625"
|
let tx_hash = "c8496681d0ade783322980cce00c89419fce4b484635d9e09c79787a0f75d450"
|
||||||
.parse::<H256>()
|
.parse::<H256>()
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let tx = provider.get_transaction(tx_hash).await.unwrap();
|
let tx = provider.get_transaction(tx_hash).await.unwrap();
|
||||||
assert!(tx.gateway_fee_recipient.is_none());
|
assert!(tx.gateway_fee_recipient.is_none());
|
||||||
assert_eq!(tx.gateway_fee.unwrap(), 0.into());
|
assert_eq!(tx.gateway_fee.unwrap(), 0.into());
|
||||||
assert_eq!(tx.hash, tx_hash);
|
assert_eq!(tx.hash, tx_hash);
|
||||||
assert_eq!(tx.block_number.unwrap(), 1100845.into())
|
assert_eq!(tx.block_number.unwrap(), 447181.into())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::test]
|
#[tokio::test]
|
||||||
|
@ -117,15 +117,15 @@ mod celo_tests {
|
||||||
let provider =
|
let provider =
|
||||||
Provider::<Http>::try_from("https://alfajores-forno.celo-testnet.org").unwrap();
|
Provider::<Http>::try_from("https://alfajores-forno.celo-testnet.org").unwrap();
|
||||||
|
|
||||||
let block = provider.get_block(1342561).await.unwrap();
|
let block = provider.get_block(447254).await.unwrap();
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
block.randomness,
|
block.randomness,
|
||||||
Randomness {
|
Randomness {
|
||||||
committed: "a3a64b7a29bb4ddd49b7d9e3cf3dd14ecbb7f0321061706c634d14b15425dd30"
|
committed: "003e12deb86292844274493e9ab6e57ed1e276202c16799d97af723eb0d3253f"
|
||||||
.from_hex::<Vec<u8>>()
|
.from_hex::<Vec<u8>>()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.into(),
|
.into(),
|
||||||
revealed: "3c5f2f71941783cbe7f2dbd387c35503ca0470b300e1613866b988a1db8902a3"
|
revealed: "1333b3b45e0385da48a01b4459aeda7607867ef6a41167cfdeefa49b9fdce6d7"
|
||||||
.from_hex::<Vec<u8>>()
|
.from_hex::<Vec<u8>>()
|
||||||
.unwrap()
|
.unwrap()
|
||||||
.into(),
|
.into(),
|
||||||
|
|
Loading…
Reference in New Issue