# Testing ink! contracts off of live chain state
### Run a node
In real world case you will already have a live node. This will be the node you want to test you contracts off of. For example purposes we will be running a substrate-contracts-node.
Clone substrate-contracts-node:
```
git clone https://github.com/paritytech/substrate-contracts-node
```
Compile and run it:
```
cargo build
./target/debug/substrate-contracts-node
```
You should get output similar to:
```
% ./target/debug/substrate-contracts-node
2023-09-26 07:58:28.885 INFO main sc_cli::runner: Substrate Contracts Node
2023-09-26 07:58:28.887 INFO main sc_cli::runner: ✌️ version 0.30.0-124c159ba94
2023-09-26 07:58:28.887 INFO main sc_cli::runner: ❤️ by Parity Technologies <admin@parity.io>, 2021-2023
2023-09-26 07:58:28.887 INFO main sc_cli::runner: 📋 Chain specification: Development
2023-09-26 07:58:28.887 INFO main sc_cli::runner: 🏷 Node name: chilly-desire-6458
2023-09-26 07:58:28.887 INFO main sc_cli::runner: 👤 Role: AUTHORITY
2023-09-26 07:58:28.887 INFO main sc_cli::runner: 💾 Database: ParityDb at /tmp/substrateoKCAts/chains/dev/paritydb/full
2023-09-26 07:58:38.723 INFO main sc_rpc_server: Running JSON-RPC server: addr=127.0.0.1:9944, allowed origins=["*"]
```
Next, produce one or two blocks by running `system.remark()` extrinsics. You can use the PolkadotJs Apps to do this. This is so we have 1 or 2 blocks produced on the node for the next step.
### Setup [chopsticks](https://github.com/AcalaNetwork/chopsticks)
Chopsticks is a powerful tool in our ecosystem that will allow us to mirror a running node. We will run chopsticks and have it mirror the substrate-contracts-node that is already running on our machince from the previous step. This will allow us to have a node with live chain state to test our contracts off of.
Clone chopsticks:
```
git clone https://github.com/AcalaNetwork/chopsticks
```
Modify the dev.yml config file in the repo or create one from scratch that you can reference later:
```
endpoint: ws://127.0.0.1:9944
mock-signature-host: true
block: 1
db: ./db.sqlite
```
> Note: In the example above chopsticks will be mirroring up until block 1 from the substrate-contracts-node. For real world use case you would want to use a different block number and this is the place where you can configure other variables such as a sudo key. Read the chopsticks docs for more info.
You can either run chopsticks locally by following the instructions here:
- https://github.com/AcalaNetwork/chopsticks#install
Or you can run chopsticks using npx:
```
npx @acala-network/chopsticks@latest --config=configs/dev.yml
```
You should get output similar to:
```
npx @acala-network/chopsticks@latest --config=configs/dev.yml
[08:22:31.231] INFO (rpc/3037748): Development RPC listening on port 8000
```
Recap: We have our live node running on port 9944 and our test node running on port 8000.
### Run ink! e2e tests
Next we would like to run the integration tests for our ink! smart contract. For example purposes we will use the flipper ink! integration tests which reside in the ink! repo.
Let's get started, clone ink!:
```
git clone https://github.com/paritytech/ink
```
`cd` into `integration-tests/flipper`:
```
cd integration-tests/flipper
```
Let's now run our flipper integration tests against the chopsticks node (which has the live chain state):
```
CONTRACTS_NODE=/home/bruno/src/substrate-contracts-node/target/debug/substrate-contracts-node WS_PORT=8000 cargo test --features e2e-tests
```
> Notice how we use the `CONTRACTS_NODE` environment variable to specify where our chopsticks node is running. This is essential.
You will get output similar to the following:
```
running 4 tests
test flipper::tests::it_works ... ok
test flipper::tests::default_works ... ok
test flipper::e2e_tests::default_works ... ok
test flipper::e2e_tests::it_works ... ok
test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.29s
Doc-tests flipper
running 0 tests
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
```
Success! We just ran ink! integration tests against live chain state!