ckb_testtool/
lib.rs

1//! ckb-testtool
2//!
3//! This module provides testing context for CKB contracts.
4//!
5//! To setup a contract verification context, you may need to import ckb modules to build the transaction structure or
6//! calculate the hash result.
7//!
8//! `ckb-testtool` crate provides re-exports of ckb modules.
9//!
10//! # Example
11//!
12//! ```rust,no_run
13//! use ckb_testtool::context::Context;
14//! use ckb_testtool::ckb_types::{
15//!     bytes::Bytes,
16//!     core::TransactionBuilder,
17//!     packed::*,
18//!     prelude::*,
19//! };
20//! use std::fs;
21//!
22//! // Max cycles of verification.
23//! const MAX_CYCLES: u64 = 10_000_000;
24//!
25//! #[test]
26//! fn test_basic() {
27//!     // Init testing context.
28//!     let mut context = Context::default();
29//!     let contract_bin: Bytes = fs::read("my_contract").unwrap().into();
30//!
31//!     // Deploy contract.
32//!     let out_point = context.deploy_cell(contract_bin);
33//!
34//!     // Prepare scripts and cell dep.
35//!     let lock_script = context
36//!         .build_script(&out_point, Default::default())
37//!         .expect("script");
38//!
39//!     // Prepare input cell.
40//!     let input_out_point = context.create_cell(
41//!         CellOutput::new_builder()
42//!             .capacity(1000u64.pack())
43//!             .lock(lock_script.clone())
44//!             .build(),
45//!         Bytes::new(),
46//!     );
47//!     let input = CellInput::new_builder()
48//!         .previous_output(input_out_point)
49//!         .build();
50//!
51//!     // Outputs.
52//!     let outputs = vec![
53//!         CellOutput::new_builder()
54//!             .capacity(500u64.pack())
55//!             .lock(lock_script.clone())
56//!             .build(),
57//!         CellOutput::new_builder()
58//!             .capacity(500u64.pack())
59//!             .lock(lock_script)
60//!             .build(),
61//!     ];
62//!
63//!     let outputs_data = vec![Bytes::new(); 2];
64//!
65//!     // Build transaction.
66//!     let tx = TransactionBuilder::default()
67//!         .input(input)
68//!         .outputs(outputs)
69//!         .outputs_data(outputs_data.pack())
70//!         .build();
71//!
72//!     let tx = context.complete_tx(tx);
73//!
74//!     // Run.
75//!     let cycles = context
76//!         .verify_tx(&tx, MAX_CYCLES)
77//!         .expect("pass verification");
78//!     println!("consume cycles: {}", cycles);
79//! }
80//! ```
81//!
82//! The `ckb-testtool` also supports native simulation. To use this mode, you need to enable the `native-simulator`
83//! feature. Next, you should create a new native simulation project. In the new project, you only need to add one
84//! line in main.rs:
85//!
86//! ```text
87//! ckb_std::entry_simulator!(script::program_entry);
88//! ```
89//!
90//! Recompile it. ckb-testtool will automatically locate it in the contract search path. You can refer to path
91//! `tests/test-contracts/native-simulators/simple-spawn-sim` for relevant examples.
92
93pub mod builtin;
94pub mod context;
95mod tx_verifier;
96
97// re-exports
98pub use ckb_chain_spec;
99pub use ckb_crypto;
100pub use ckb_error;
101pub use ckb_hash;
102pub use ckb_jsonrpc_types;
103pub use ckb_script;
104pub use ckb_traits;
105pub use ckb_types;
106pub use ckb_types::bytes;
107pub use ckb_verification;