Skip to content

Commit

Permalink
Return pending transaction in provider and wallet functions
Browse files Browse the repository at this point in the history
  • Loading branch information
IAvecilla committed Jul 20, 2023
1 parent ea7fb28 commit 90f06e6
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 67 deletions.
73 changes: 31 additions & 42 deletions src/zks_provider/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ use ethers::{
U64,
},
};
use ethers_contract::providers::PendingTransaction;
use serde::Serialize;
use serde_json::json;
use std::{collections::HashMap, fmt::Debug, time::Duration};
Expand All @@ -41,6 +42,9 @@ use self::types::{
/// https://era.zksync.io/docs/api/api.html#zksync-era-json-rpc-methods
#[async_trait]
pub trait ZKSProvider {
type Provider: JsonRpcClient;
type ZKProvider: JsonRpcClient;

async fn zk_estimate_gas<T>(&self, transaction: T) -> Result<U256, ProviderError>
where
T: Debug + Serialize + Send + Sync;
Expand Down Expand Up @@ -193,7 +197,7 @@ pub trait ZKSProvider {
function_signature: &str,
function_parameters: Option<Vec<String>>,
overrides: Option<Overrides>,
) -> Result<(Vec<Token>, H256), ProviderError>
) -> Result<PendingTransaction<Self::ZKProvider>, ProviderError>
where
D: PrehashSigner<(RecoverableSignature, RecoveryId)> + Send + Sync;

Expand All @@ -204,7 +208,7 @@ pub trait ZKSProvider {
function_signature: &str,
function_parameters: Option<Vec<String>>,
overrides: Option<Overrides>,
) -> Result<(Vec<Token>, H256), ProviderError>
) -> Result<PendingTransaction<Self::Provider>, ProviderError>
where
D: PrehashSigner<(RecoverableSignature, RecoveryId)> + Send + Sync;

Expand All @@ -225,6 +229,9 @@ pub trait ZKSProvider {

#[async_trait]
impl<M: Middleware + ZKSProvider, S: Signer> ZKSProvider for SignerMiddleware<M, S> {
type Provider = <M as Middleware>::Provider;
type ZKProvider = <M as ZKSProvider>::ZKProvider;

async fn zk_estimate_gas<T>(&self, transaction: T) -> Result<U256, ProviderError>
where
T: Debug + Serialize + Send + Sync,
Expand Down Expand Up @@ -399,7 +406,7 @@ impl<M: Middleware + ZKSProvider, S: Signer> ZKSProvider for SignerMiddleware<M,
function_signature: &str,
function_parameters: Option<Vec<String>>,
overrides: Option<Overrides>,
) -> Result<(Vec<Token>, H256), ProviderError>
) -> Result<PendingTransaction<Self::ZKProvider>, ProviderError>
where
D: PrehashSigner<(RecoverableSignature, RecoveryId)> + Send + Sync,
{
Expand All @@ -421,7 +428,7 @@ impl<M: Middleware + ZKSProvider, S: Signer> ZKSProvider for SignerMiddleware<M,
function_signature: &str,
function_parameters: Option<Vec<String>>,
_overrides: Option<Overrides>,
) -> Result<(Vec<Token>, H256), ProviderError>
) -> Result<PendingTransaction<Self::Provider>, ProviderError>
where
D: PrehashSigner<(RecoverableSignature, RecoveryId)> + Send + Sync,
{
Expand All @@ -434,18 +441,9 @@ impl<M: Middleware + ZKSProvider, S: Signer> ZKSProvider for SignerMiddleware<M,
_overrides,
)
.await?;
let pending_transaction = self
.send_transaction(tx, None)
self.send_transaction(tx, None)
.await
.map_err(|e| ProviderError::CustomError(format!("Error sending transaction: {e:?}")))?;

let transaction_receipt = pending_transaction
.await?
.ok_or(ProviderError::CustomError(
"no transaction receipt".to_owned(),
))?;

Ok((Vec::new(), transaction_receipt.transaction_hash))
.map_err(|e| ProviderError::CustomError(format!("Error sending transaction: {e:?}")))
}

async fn wait_for_finalize(
Expand Down Expand Up @@ -481,6 +479,9 @@ impl<M: Middleware + ZKSProvider, S: Signer> ZKSProvider for SignerMiddleware<M,

#[async_trait]
impl<P: JsonRpcClient> ZKSProvider for Provider<P> {
type Provider = P;
type ZKProvider = P;

async fn zk_estimate_gas<T>(&self, transaction: T) -> Result<U256, ProviderError>
where
T: Debug + Serialize + Send + Sync,
Expand Down Expand Up @@ -692,7 +693,7 @@ impl<P: JsonRpcClient> ZKSProvider for Provider<P> {
function_signature: &str,
function_parameters: Option<Vec<String>>,
overrides: Option<Overrides>,
) -> Result<(Vec<Token>, H256), ProviderError>
) -> Result<PendingTransaction<Self::ZKProvider>, ProviderError>
where
D: PrehashSigner<(RecoverableSignature, RecoveryId)> + Send + Sync,
{
Expand Down Expand Up @@ -751,22 +752,12 @@ impl<P: JsonRpcClient> ZKSProvider for Provider<P> {
send_request =
send_request.custom_data(Eip712Meta::new().custom_signature(signature.to_vec()));

let pending_transaction = self
.send_raw_transaction(
[&[EIP712_TX_TYPE], &*send_request.rlp_unsigned()]
.concat()
.into(),
)
.await?;

let transaction_receipt = pending_transaction
.await?
.ok_or(ProviderError::CustomError(
"no transaction receipt".to_owned(),
))?;

// TODO: decode function output.
Ok((Vec::new(), transaction_receipt.transaction_hash))
self.send_raw_transaction(
[&[EIP712_TX_TYPE], &*send_request.rlp_unsigned()]
.concat()
.into(),
)
.await
}

async fn send<D>(
Expand All @@ -776,7 +767,7 @@ impl<P: JsonRpcClient> ZKSProvider for Provider<P> {
function_signature: &str,
function_parameters: Option<Vec<String>>,
_overrides: Option<Overrides>,
) -> Result<(Vec<Token>, H256), ProviderError>
) -> Result<PendingTransaction<Self::Provider>, ProviderError>
where
D: PrehashSigner<(RecoverableSignature, RecoveryId)> + Send + Sync,
{
Expand All @@ -789,15 +780,7 @@ impl<P: JsonRpcClient> ZKSProvider for Provider<P> {
_overrides,
)
.await?;
let pending_transaction = self.send_transaction(tx, None).await?;

let transaction_receipt = pending_transaction
.await?
.ok_or(ProviderError::CustomError(
"no transaction receipt".to_owned(),
))?;

Ok((Vec::new(), transaction_receipt.transaction_hash))
self.send_transaction(tx, None).await
}

async fn wait_for_finalize(
Expand Down Expand Up @@ -1811,6 +1794,9 @@ mod tests {
None,
)
.await
.unwrap()
.await
.unwrap()
.unwrap();
let set_value =
ZKSProvider::call(&era_provider, contract_address, "getValue()(uint256)", None)
Expand All @@ -1831,6 +1817,9 @@ mod tests {
None,
)
.await
.unwrap()
.await
.unwrap()
.unwrap();
let incremented_value =
ZKSProvider::call(&era_provider, contract_address, "getValue()(uint256)", None)
Expand Down
61 changes: 36 additions & 25 deletions src/zks_wallet/wallet.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ use crate::{
zks_utils::{self, CONTRACT_DEPLOYER_ADDR, EIP712_TX_TYPE, ETH_CHAIN_ID},
};
use ethers::{
abi::{decode, Abi, ParamType, Token, Tokenizable},
abi::{decode, Abi, ParamType, Tokenizable},
prelude::{
encode_function_data,
k256::{
Expand Down Expand Up @@ -156,7 +156,7 @@ where
amount_to_transfer: U256,
// TODO: Support multiple-token transfers.
_token: Option<Address>,
) -> Result<PendingTransaction<M::Provider>, ZKSWalletError<M, D>>
) -> Result<PendingTransaction<<M as Middleware>::Provider>, ZKSWalletError<M, D>>
where
M: ZKSProvider,
{
Expand Down Expand Up @@ -188,7 +188,7 @@ where
amount_to_transfer: U256,
// TODO: Support multiple-token transfers.
_token: Option<Address>,
) -> Result<PendingTransaction<M::Provider>, ZKSWalletError<M, D>>
) -> Result<PendingTransaction<<M as Middleware>::Provider>, ZKSWalletError<M, D>>
where
M: ZKSProvider,
{
Expand Down Expand Up @@ -501,7 +501,7 @@ where
&self,
amount: U256,
to: Address,
) -> Result<TransactionReceipt, ZKSWalletError<M, D>>
) -> Result<PendingTransaction<<M as ZKSProvider>::ZKProvider>, ZKSWalletError<M, D>>
where
M: ZKSProvider,
{
Expand All @@ -515,7 +515,7 @@ where
ZKSWalletError::CustomError(format!("failed to parse contract address: {error}"))
})?;
let function_signature = "function withdraw(address _l1Receiver) external payable override";
let response: (Vec<Token>, H256) = era_provider
let response = era_provider
.send_eip712(
&self.l2_wallet,
contract_address,
Expand All @@ -525,24 +525,15 @@ where
value: Some(amount),
}),
)
.await?;
.await;

let tx_receipt = era_provider
.get_transaction_receipt(response.1)
.await?
.ok_or(ZKSWalletError::CustomError(
"No transaction receipt for withdraw".to_owned(),
))?;

Ok(era_provider
.wait_for_finalize(tx_receipt, None, None)
.await?)
response.map_err(|e| ZKSWalletError::CustomError(format!("Error calling withdraw: {e}")))
}

pub async fn finalize_withdraw(
&self,
tx_hash: H256,
) -> Result<TransactionReceipt, ZKSWalletError<M, D>>
) -> Result<PendingTransaction<<M as Middleware>::Provider>, ZKSWalletError<M, D>>
where
M: ZKSProvider,
{
Expand Down Expand Up @@ -659,14 +650,10 @@ where
Some(parameters.into()),
None,
)
.await?;

eth_provider
.get_transaction_receipt(response.1)
.await?
.ok_or(ZKSWalletError::CustomError(
"No transaction receipt for finalize withdraw".to_owned(),
))
.await;
response.map_err(|e| {
ZKSWalletError::CustomError(format!("Error calling finalizeWithdrawal: {e}"))
})
}
}

Expand Down Expand Up @@ -1059,6 +1046,15 @@ mod zks_signer_tests {
let tx_receipt = zk_wallet
.withdraw(amount_to_withdraw, zk_wallet.l1_address())
.await
.unwrap()
.await
.unwrap()
.unwrap();
let tx_receipt = zk_wallet
.get_era_provider()
.unwrap()
.wait_for_finalize(tx_receipt.clone(), None, None)
.await
.unwrap();
assert_eq!(
1,
Expand Down Expand Up @@ -1086,6 +1082,9 @@ mod zks_signer_tests {
let tx_finalize_receipt = zk_wallet
.finalize_withdraw(tx_receipt.transaction_hash)
.await
.unwrap()
.await
.unwrap()
.unwrap();

println!(
Expand Down Expand Up @@ -1158,6 +1157,15 @@ mod zks_signer_tests {
let tx_receipt = zk_wallet
.withdraw(amount_to_withdraw, zk_wallet.l1_address())
.await
.unwrap()
.await
.unwrap()
.unwrap();
let tx_receipt = zk_wallet
.get_era_provider()
.unwrap()
.wait_for_finalize(tx_receipt, None, None)
.await
.unwrap();
assert_eq!(
1,
Expand Down Expand Up @@ -1185,6 +1193,9 @@ mod zks_signer_tests {
let tx_finalize_receipt = zk_wallet
.finalize_withdraw(tx_receipt.transaction_hash)
.await
.unwrap()
.await
.unwrap()
.unwrap();

println!(
Expand Down

0 comments on commit 90f06e6

Please sign in to comment.