ethers-rs/examples/ethers-wasm/src/lib.rs

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

73 lines
2.2 KiB
Rust
Raw Normal View History

use crate::utils::SIMPLECONTRACT_BIN;
use ethers::{
contract::abigen,
prelude::{ContractFactory, Provider, SignerMiddleware},
providers::Ws,
};
use std::sync::Arc;
use wasm_bindgen::prelude::*;
use web_sys::console;
pub mod utils;
// When the `wee_alloc` feature is enabled, use `wee_alloc` as the global
// allocator.
#[cfg(feature = "wee_alloc")]
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;
macro_rules! log {
( $( $t:tt )* ) => {
web_sys::console::log_1(&format!( $( $t )* ).into());
}
}
abigen!(
SimpleContract,
refactor: examples (#1940) * ToC * Big numbers section * Middleware examples: builder * Middleware examples: gas_escalator * Middleware examples: gas_oracle * Middleware examples: signer * Middleware examples: missing stubs * review: applied DaniPopes suggestions to big numbers * typo * Middleware examples: nonce_manager * cargo +nightly fmt * update roadmap * Middleware examples: policy * Middleware examples: added docs * Contracts examples: created folder; included abigen example * Contracts examples: refactor abigen docs. Fixed cargo example reference * Contracts examples: contract_events; minor docs changes * Moved each example under its own crate. Cargo builds locally TODO: Fix broken examples CI * Big numbers examples: used regular operators for math * Single examples run correctly (missing overall CI execution) Example crates dependencies Removed duplicates * review: Applied gakonst note to remove commented items in workspace manifest * review: Applied gakonst note to restore visibility on contract constructor * ci: - Run/Build examples in a single step to avoid duplicated scripts - Removed ci.yaml step "Build all examples" * cargo +nightly fmt * ci: fix WASM step error * Removed deprecated EthGasStation example * WASM example uses local copy of `contract_abi.json`. In this way we keep the WASM example auto-consistent, at the cost of a small duplication * Cargo.lock aligned to master branch * Removed useless comments in examples * review: Applied gakonst note to add panic!() on the policy middleware example * review: Applied gakonst suggestion to add a custom middleware example * typos in docs * Update examples/big-numbers/examples/bn_math_operations.rs review: Accepted commit suggested by DaniPopes Co-authored-by: DaniPopes <57450786+DaniPopes@users.noreply.github.com> * review: Applied DaniPopes suggestion on assert_eq! * Update examples/big-numbers/README.md review: Accepted DaniPopes suggestion on big-numbers docs Co-authored-by: DaniPopes <57450786+DaniPopes@users.noreply.github.com> * review: All imports now reference the "ethers" crate * ci: added features ["ws", "rustls"] where needed cargo +nigthly fmt * Examples with special features (e.g. ipc, trezor etc.) are built alongside them. This is expressed as a "default" requirement in their respective Cargo.toml * cargo +nightly fmt * Examples: Gas oracle API keys from env Added missing features in middleware Cargo.toml * typo: use expect() instead of unwrap() * Updated ToC Moved 2 examples under more relevant folders * Gas oracle examples raise panic on middleware errors * review: removed useless [[example]] in Cargo.toml * review: removed #[allow(unused_must_use)] from gas_escalator example * review: Removed prefixes from file names * review: removed useless [[example]] in Cargo.toml * docs: Updated description to run examples in the workspace README.md Co-authored-by: Andrea Simeoni <> Co-authored-by: DaniPopes <57450786+DaniPopes@users.noreply.github.com>
2022-12-29 12:53:11 +00:00
"./abi/contract_abi.json",
event_derives(serde::Deserialize, serde::Serialize)
);
#[wasm_bindgen]
pub async fn deploy() {
utils::set_panic_hook();
console::log_2(
&"SimpleContract ABI: ".into(),
&serde_wasm_bindgen::to_value(&*SIMPLECONTRACT_ABI).unwrap(),
);
let wallet = utils::key(0);
log!("Wallet: {:?}", wallet);
let endpoint = "ws://127.0.0.1:8545";
let provider = Provider::<Ws>::connect(endpoint).await.unwrap();
let client = Arc::new(SignerMiddleware::new(provider, wallet));
log!("Connected to: `{}`", endpoint);
let bytecode = hex::decode(SIMPLECONTRACT_BIN).unwrap();
let factory = ContractFactory::new(SIMPLECONTRACT_ABI.clone(), bytecode.into(), client.clone());
log!("Deploying contract...");
let contract = factory.deploy("hello WASM!".to_string()).unwrap().send().await.unwrap();
let addr = contract.address();
log!("Deployed contract with address: {:?}", addr);
let contract = SimpleContract::new(addr, client.clone());
let value = "bye from WASM!";
log!("Setting value... `{}`", value);
let receipt = contract.set_value(value.to_owned()).send().await.unwrap().await.unwrap();
console::log_2(&"Set value receipt: ".into(), &serde_wasm_bindgen::to_value(&receipt).unwrap());
log!("Fetching logs...");
let logs = contract.value_changed_filter().from_block(0u64).query().await.unwrap();
let value = contract.get_value().call().await.unwrap();
console::log_2(
&format!("Value: `{value}`. Logs: ").into(),
&serde_wasm_bindgen::to_value(&logs).unwrap(),
);
}