contract_deployment/
main.rs

1use ethers::abi::Abi;
2use std::str::FromStr;
3use zksync_web3_rs::providers::{Middleware, Provider};
4use zksync_web3_rs::signers::{LocalWallet, Signer};
5use zksync_web3_rs::zks_provider::ZKSProvider;
6use zksync_web3_rs::zks_wallet::{CallRequest, DeployRequest};
7use zksync_web3_rs::ZKSWallet;
8
9// This is the default url for a local `era-test-node` instance.
10static ERA_PROVIDER_URL: &str = "http://127.0.0.1:8011";
11
12// This is the private key for one of the rich wallets that come bundled with the era-test-node.
13static PRIVATE_KEY: &str = "7726827caac94a7f9e1b160f7ea819f172f7b6f9d2a97f992c38edeab82d4110";
14
15static CONTRACT_BIN: &str = include_str!("./Greeter.bin");
16static CONTRACT_ABI: &str = include_str!("./Greeter.abi");
17
18#[tokio::main(flavor = "current_thread")]
19async fn main() {
20    // Note that for this code example we only need to interface with zkSync Era. We don't care
21    // about the Ethereum layer-1 network.
22    let zk_wallet = {
23        let era_provider = Provider::try_from(ERA_PROVIDER_URL).unwrap();
24
25        let chain_id = era_provider.get_chainid().await.unwrap();
26        let l2_wallet = LocalWallet::from_str(PRIVATE_KEY)
27            .unwrap()
28            .with_chain_id(chain_id.as_u64());
29        ZKSWallet::new(l2_wallet, None, Some(era_provider.clone()), None).unwrap()
30    };
31
32    // Deploy contract:
33    let contract_address = {
34        let abi = Abi::load(CONTRACT_ABI.as_bytes()).unwrap();
35        let contract_bin = hex::decode(CONTRACT_BIN).unwrap().to_vec();
36        let request = DeployRequest::with(abi, contract_bin, vec!["Hey".to_owned()])
37            .from(zk_wallet.l2_address());
38        let address = zk_wallet.deploy(&request).await.unwrap();
39
40        println!("Contract address: {:#?}", address);
41
42        address
43    };
44
45    // Call the greet view method:
46    {
47        let era_provider = zk_wallet.get_era_provider().unwrap();
48        let call_request = CallRequest::new(contract_address, "greet()(string)".to_owned());
49
50        let greet = ZKSProvider::call(era_provider.as_ref(), &call_request)
51            .await
52            .unwrap();
53
54        println!("greet: {}", greet[0]);
55    }
56
57    // Perform a signed transaction calling the setGreeting method
58    {
59        let receipt = zk_wallet
60            .get_era_provider()
61            .unwrap()
62            .clone()
63            .send_eip712(
64                &zk_wallet.l2_wallet,
65                contract_address,
66                "setGreeting(string)",
67                Some(["Hello".into()].into()),
68                None,
69            )
70            .await
71            .unwrap()
72            .await
73            .unwrap()
74            .unwrap();
75
76        println!(
77            "setGreeting transaction hash {:#?}",
78            receipt.transaction_hash
79        );
80    };
81
82    // Call the greet view method:
83
84    {
85        let era_provider = zk_wallet.get_era_provider().unwrap();
86        let call_request = CallRequest::new(contract_address, "greet()(string)".to_owned());
87
88        let greet = ZKSProvider::call(era_provider.as_ref(), &call_request)
89            .await
90            .unwrap();
91
92        println!("greet: {}", greet[0]);
93    }
94}