An experimental implementation of the ERC777 Ethereum Token Standard implemented in Rust/WebAssembly using the "pwasm" libraries and tools.
The purpose of this implementation is to explore the feasibility of writing complex contracts for the Ethereum platform using Rust/WebAssembly.
It uses the Rust 2018 Edition and current nightly builds of Rust to benefit of newest language features and simplifications.
To allow faithful representation of the ERC777 ABI the pwasm-abi repository was forked here and extended with support for Rust/ABI "String" type.
Furthermore a Rust module containing a procedural macro for compile-time calculation of keccack hashes was implemented to reduce the Gas cost of running the contract by eliminating needless re-calculation of constant hash values for smart contract storage.
Functions emulating the Solidity "require" function were implemented to ease the transition from the Solidity implementation and produce more readable/recognizable precondition checks.
In addition to Rust Unit Tests further Integration Tests using the node.js and "web3" module were developed, following the example of the Solidity ERC777 implementation.
The truffle toolchain is widely used for development/testing/deploying of smart contracts in Solidity. This repository contains the beginnings of a similar toolset for smart contracts written in Rust, starting with support for convenient testing of smart contracts deployed in Rust.
We empathically called this toolset wruffle.
It allows quick and convenient compile/deploy/test cycles on pwasm smart contracts with the web3 tests largely identical to the ones written using truffle.
This suite is in early development, to be extended with further commands, e.g. for deploying on production chains.
Some mathematical operations on the U256 type imported from pwasm-std causes duplicate symbols link errors, specifically when using multiplications and modulo.
This is most likely an issue with the "uint" Rust module not being fully adapted to work in the Rust "no-std" environment at this point. Subject to further investigation.
As a consequence the granularity checks and corresponding web3 Unit Tests are currently deactivated.
Install rust with wasm32-unknown-unknown
target:
rustup target add wasm32-unknown-unknown
Install Wasm build util:
cargo install pwasm-utils --bin wasm-build
Run:
cd contracts/pwasm-erc777/
./build.sh
cd contracts/pwasm-erc777/
./test.sh
Requires node.js 10.x
Run:
npm i
npm test