vyper_rs/
lib.rs

1//! This is the documentation for the Vyper-rs crate.
2//! Vyper-rs is a library to interact with the vyper compiler and manage versions with a venv.
3//! Our goal is to connect Vyper with the robust tooling and infrastructure for the Solidity ecosystem written in Rust and become the standard compiler interface.
4
5pub mod macros;
6pub mod utils;
7pub mod venv;
8pub mod vyper;
9pub mod vyper_errors;
10
11#[cfg(test)]
12mod test {
13    use self::{vyper::VyperStack, vyper_errors::VyperErrors};
14
15    use super::*;
16    use crate::{
17        utils::Blueprint,
18        vyper::{Evm, Vyper, Vypers},
19    };
20    use std::path::{Path, PathBuf};
21
22    #[test]
23    fn basic() {
24        let path = PathBuf::from("./multisig.vy");
25        let mut vyper_contract = Vyper::new(&path);
26        vyper_contract.compile().unwrap();
27        vyper_contract.gen_abi().unwrap();
28        assert!(vyper_contract.bytecode.unwrap().starts_with("0x"));
29    }
30
31    #[test]
32    fn compile_version() {
33        let path = PathBuf::from("./multisig.vy");
34        let mut vyper_contract = Vyper::new(&path);
35        vyper_contract.compile_ver(&Evm::Shanghai).unwrap();
36    }
37
38    #[test]
39    fn concurrent_compilation_vers() {
40        tokio_test::block_on(async {
41            let path: PathBuf = PathBuf::from("./multisig.vy");
42            let path2: PathBuf = PathBuf::from("./multisig.vy");
43            let path3: PathBuf = PathBuf::from("./multisig.vy");
44            let path4: PathBuf = PathBuf::from("./multisig.vy");
45            let mut vyper_contracts = Vypers::new(vec![path, path2, path3, path4]);
46            vyper_contracts
47                .compile_many_ver(Evm::Shanghai)
48                .await
49                .unwrap();
50            assert!(!vyper_contracts.bytecode.is_none());
51        })
52    }
53
54    #[test]
55    fn concurrent_compilation() {
56        tokio_test::block_on(async {
57            let path: PathBuf = PathBuf::from("./multisig.vy");
58            let path2: PathBuf = PathBuf::from("./multisig.vy");
59            let path3: PathBuf = PathBuf::from("./multisig.vy");
60            let path4: PathBuf = PathBuf::from("./multisig.vy");
61            let mut vyper_contracts = Vypers::new(vec![path, path2, path3, path4]);
62            vyper_contracts.compile_many().await.unwrap();
63            assert!(!vyper_contracts.bytecode.is_none());
64        })
65    }
66
67    #[test]
68    fn interface() {
69        let path = PathBuf::from("./multisig.vy");
70        let vyper_contract = Vyper::new(&path);
71        vyper_contract.interface().unwrap();
72    }
73
74    #[test]
75    fn storage() {
76        let path = PathBuf::from("./multisig.vy");
77        let vyper_contract = Vyper::new(&path);
78        vyper_contract.storage_layout().unwrap();
79    }
80
81    #[test]
82    fn opcodes() {
83        let path = PathBuf::from("./multisig.vy");
84        let vyper_contract = Vyper::new(&path);
85        vyper_contract.opcodes().unwrap();
86    }
87
88    #[test]
89    fn ast() {
90        let path = PathBuf::from("./multisig.vy");
91        let vyper_contract = Vyper::new(&path);
92        vyper_contract.ast().unwrap();
93    }
94
95    #[test]
96    fn bp() {
97        let path = PathBuf::from("./multisig.vy");
98        let mut vyper_contract = Vyper::new(&path);
99        vyper_contract.compile_blueprint().unwrap();
100    }
101
102    #[test]
103    fn exists() {
104        assert_eq!(true, Vyper::exists(&Vyper::new(Path::new("./multisig.vy"))))
105    }
106
107    #[test]
108    fn parse_bp() {
109        let case1 = b"\xFE\x71\x00\x00";
110        let case2 = b"\xFE\x71\x01\x07\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00";
111        let case3 = b"\xFE\x71\x02\x01\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00";
112        {
113            let Blueprint {
114                erc_version,
115                preamble_data,
116                initcode,
117            } = utils::parse_blueprint(case1).unwrap();
118            assert_eq!((0u8, None, vec![0]), (erc_version, preamble_data, initcode));
119        }
120        {
121            let Blueprint {
122                erc_version,
123                preamble_data,
124                initcode,
125            } = utils::parse_blueprint(case2).unwrap();
126            assert_eq!(
127                (0u8, Some(vec![255, 255, 255, 255, 255, 255, 255]), vec![0]),
128                (erc_version, preamble_data, initcode)
129            );
130        }
131        {
132            let Blueprint {
133                erc_version,
134                preamble_data,
135                initcode,
136            } = utils::parse_blueprint(case3).unwrap();
137            assert_eq!(
138                (
139                    0u8,
140                    Some(vec![
141                        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
142                        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
143                        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
144                        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
145                        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
146                        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
147                        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
148                        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
149                        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
150                        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
151                        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
152                        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
153                        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
154                        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
155                        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
156                        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
157                        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
158                        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
159                        255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
160                        255, 255, 255, 255, 255, 255, 255, 255, 255
161                    ]),
162                    vec![0]
163                ),
164                (erc_version, preamble_data, initcode)
165            );
166        }
167    }
168    use crate::venv::{Ready, Venv};
169    #[test]
170    fn venv_test() {
171        let mut contract = Venv::default()
172            .init()
173            .unwrap()
174            .ivyper_venv(None)
175            .unwrap()
176            .vyper(Path::new("./multisig.vy"));
177        contract.compile().unwrap();
178    }
179
180    #[test]
181    fn version_detect() {
182        Vyper::get_version(&Vyper::new(Path::new("./multisig.vy"))).unwrap();
183    }
184
185    #[test]
186    fn vyper_macro_test() {
187        let c = vyper!("./multisig.vy");
188        let c_assertion = Vyper::new(Path::new("./multisig.vy"));
189        assert_eq!(c, c_assertion);
190        let c2_assertion = Vypers::from(vec![
191            Vyper::new(Path::new("./multisig.vy")),
192            Vyper::new(Path::new("./multisig.vy")),
193        ]);
194        let c2 = vyper!("./multisig.vy", "./multisig.vy");
195        assert_eq!(c2, c2_assertion);
196    }
197
198    #[test]
199    fn vypers_macro_test() {
200        let vys_assertion = Vypers::new(vec![
201            PathBuf::from("./multisig.vy"),
202            PathBuf::from("./multisig.vy"),
203        ]);
204        let vys = vyper!("./multisig.vy", "./multisig.vy");
205        assert_eq!(vys, vys_assertion);
206    }
207
208    #[test]
209    fn compile_macro_test() -> Result<(), VyperErrors> {
210        let mut contract_assertion = vyper!("./multisig.vy");
211        contract_assertion.compile().unwrap();
212        let contract = compile!("./multisig.vy");
213        assert_eq!(contract, contract_assertion);
214        Ok(())
215    }
216
217    #[tokio::test]
218    async fn compile_mt_macro_test() -> Result<(), VyperErrors> {
219        let mut vys_assertion = vyper!("./multisig.vy", "./multisig.vy");
220        vys_assertion.compile_many().await.unwrap();
221        let vys = compile!("./multisig.vy", "./multisig.vy");
222        assert_eq!(vys, vys_assertion);
223        Ok(())
224    }
225
226    #[test]
227    fn compabijson_macro_test() -> Result<(), VyperErrors> {
228        let c_assertion = compile!("./multisig.vy");
229        let abi = c_assertion.get_abi().unwrap();
230        let c = abi!("./multisig.vy");
231        assert_eq!(c, abi);
232        Ok(())
233    }
234
235    #[test]
236    fn compabijson_mt_macro_test() -> Result<(), VyperErrors> {
237        tokio_test::block_on(async {
238            let vys_assertion = compile!("./multisig.vy", "./multisig.vy");
239            let abis = vys_assertion.get_abi_many().await.unwrap();
240            let vys = abi!("./multisig.vy", "./multisig.vy");
241            assert_eq!(vys, abis);
242            Ok(())
243        })
244    }
245
246    #[test]
247    fn venv_macro_test() -> Result<(), VyperErrors> {
248        let _: Venv<Ready> = venv!();
249        let _: Venv<Ready> = venv!("0.3.10");
250        Ok(())
251    }
252
253    #[test]
254    fn test_stack_mt() -> Result<(), VyperErrors> {
255        let mut stack = [
256            Vyper::new(Path::new("./multsig.vy")),
257            Vyper::new(Path::new("./multsig.vy")),
258        ];
259        let mut contracts = VyperStack(&mut stack);
260        contracts.gen_abi_many()?;
261        contracts.compile_many()?;
262        Ok(())
263    }
264}