openethereum / sol-rs

Solaris - Solidity testing framework in Rust.
GNU General Public License v3.0
54 stars 14 forks source link

use/include contract with a single step #13

Open snd opened 6 years ago

snd commented 6 years ago

currently to test a contract with sol-rs one needs to:

compile it in a build script: https://github.com/paritytech/sol-rs/blob/aed4bb377db6bf7459e5ee3792e1d7cddfb45cef/example/build.rs#L4

use_contract! on the ABI file: https://github.com/paritytech/sol-rs/blob/aed4bb377db6bf7459e5ee3792e1d7cddfb45cef/example/src/main.rs#L15

load code from the bin file: https://github.com/paritytech/sol-rs/blob/aed4bb377db6bf7459e5ee3792e1d7cddfb45cef/example/src/main.rs#L20

ideally it would require a single step. wishful thinking:

use_contract!(badgereg, "BadgeReg", "res/BadgeReg.sol");

let contract = badgereg::BadgeReg::default();

let mut evm = solaris::evm();

let owner = 3.into();
let _address = evm.with_sender(owner).deploy(&contract);

the API should allow support the convenient single step as well as the individual steps.

snd commented 6 years ago

related #8

tomusdrw commented 6 years ago

use_contract! on the ABI file: load code from the bin file:

Last two steps can be indeed simplified, although I can't see how we can get rid of the build script - the solidity ABI needs to be generated before the compilation of Rust code is performed (since the staticly-typed contract interface is generated out of it), so we need to have a way to compile contracts before compiling rust tests.

snd commented 6 years ago

could we have a procedural macro that shells out to the solidity compiler?

tomusdrw commented 6 years ago

Good point. Yeah I suppose it would be possible.

kirushik commented 6 years ago

I really like the way pest_derive does this (procedural macros, all magic happens during compile time):

https://github.com/pest-parser/pest/blob/61c1c8981ca18c611bfa94b73893ae52602c5af1/pest_derive/tests/grammar.rs#L13-L15

snd commented 6 years ago

working on https://github.com/snd/rust_solc which will use the JSON I/O API of solc/solcjs and will get us one step closer to this