# tDec Demo Runbook
## How to read this document?
To understand how the demo works, read at least the _"Scenario G1: A ERC20 Balance Condition"_ - it shows how a complete, "green-path" demo works. Other demo scenarios are ommiting certain parts for brevity.
Demo URL: https://nucypher-ts-demo-tdec.netlify.app/
## Green Path Scenarios
### Scenario G1: A ERC20 Balance Condition
_"Owner of the connected wallet has at least 10 ERC20 tokens"_
#### Prerequisites
- Switch to **Rinkeby** testnet
- Get at least 100 ERC20 tokens: https://erc20faucet.com/
- Get some ETH: https://faucet.rinkeby.io/
Expected token address: `0xFab46E002BbF0b4509813474841E0716E6730136`
#### Set the Configuration
- The demo should work out-of-the-box on the Rinkeby network.
- Simply click "FETCH TDEC CONFIG" button to load the configuration and proceed with the demo.

#### Select EVM Condition
- Select "evm" condition here:

#### Fill in Condition details
- Use ERC20 token address.
- Set `:userAddress` as a method parameter.

- Your JSON preview should show:
```jsonld=
{
"contractAddress": "0xFab46E002BbF0b4509813474841E0716E6730136",
"chain": "Rinkeby",
"standardContractType": "ERC20",
"method": "balanceOf",
"parameters": [
":userAddress"
],
"returnValueTest": {
"comparator": ">",
"value": "10"
}
}
```
#### Perform the rest of the flow
- Put in a message to be encrypted
- Click the "Encrypt" button
- Copy the encrypted message (you can click the copy icon)
- Paste the encrypted message into a step 3 box
- Click the "Decrypt" button
- You will be asked to sign a message
- The decrypted message shows in `Plaintext:` field

- During the demo, you will be asked to sign a message confirming the ownership of the connected wallet. The signature is cached in `localStorage`.
- To remove cached signature, click here:

### Scenario G2: Condition with A Logical Operator OR
_"Owner of the connected wallet satisfies the first or the second condition"_
#### Prerequisites
- This scenario builds on Scenario G1, so we need to satisfy their preconditions first
#### Create A Truthy ERC20 Condition
- Reproduce the ERC20 condition from previous scenario

#### Create A Falsy RPC Condition
- Select the "or" logical operator, and "rpc" condition type

- Add a falsy condition. The condition is falsy, because at this point the connected wallet actually has some ETH.

- Your JSON preview should show:
```jsonld=
{
"contractAddress": "0xFab46E002BbF0b4509813474841E0716E6730136",
"chain": "Rinkeby",
"standardContractType": "ERC20",
"method": "balanceOf",
"parameters": [
":userAddress"
],
"returnValueTest": {
"comparator": ">",
"value": "10"
}
}
{
"operator": "or"
}
{
"chain": "Rinkeby",
"method": "eth_getBalance",
"parameters": [
":userAddress"
],
"returnValueTest": {
"comparator": ">",
"value": "0"
}
}
```
#### Finish The Flow
- Note that we're expected to sign the message again - clear the signature cache if needed
- Encrypt, decrypt - you know the drill
- The condition should evaluate correctly
### Scenario G4: A ERC721 Ownership Condition
_"User owns a specific instance of an ERC721 token"_
#### Prerequisites
- Switch to Rinkeby testnet
- Get an NFT: https://numbersontap.cyberpnk.win/
- Take note of your `tokenId`. You can find it transaction details on Etherscan.
- Get some ETH: https://faucet.rinkeby.io/
Expected NFT address: `0x70979C339131d811cB96cF363f70382ac4a36503`
#### Fill in Condition details
- Use ERC721 token address.
- Set `tokenId` of your NFT as a method parameter.
- Set `:userAddress` as a return value test.

- Your JSON preview should show:
```jsonld=
{
"contractAddress": "0x70979C339131d811cB96cF363f70382ac4a36503",
"chain": "Rinkeby",
"standardContractType": "ERC721",
"method": "ownerOf",
"parameters": [
12
],
"returnValueTest": {
"comparator": "==",
"value": ":userAddress"
}
}
```
### Scenario G5: A ERC721 Balance Condition
_"User owns at least one of the ERC721 tokens"_
#### Prerequisites
- Switch to Rinkeby testnet
- Get an NFT: https://numbersontap.cyberpnk.win/
- Get some ETH: https://faucet.rinkeby.io/
Expected NFT address: `0x70979C339131d811cB96cF363f70382ac4a36503`
#### Fill in Condition details
- Use ERC721 token address.
- Set `:userAddress` as a return value test.

- Your JSON preview should show:
```jsonld=
{
"contractAddress": "0x70979C339131d811cB96cF363f70382ac4a36503",
"chain": "Rinkeby",
"standardContractType": "ERC721",
"method": "balanceOf",
"parameters": [
":userAddress"
],
"returnValueTest": {
"comparator": ">",
"value": "0"
}
}
```
#### Finish The Flow
- Note that we're expected to sign the message again - clear the signature cache if needed
- Encrypt, decrypt - you know the drill
- The condition should evaluate correctly
#### Transfer The NFT Away And Try Again
- Send the NFT to `0x69B8f4B65Fc366d94C8a3047719a72Bb94922bE8` address
- Wait until the transaction is settled
- Try to decrypt again
- The decryption should fail
## Red Path Scenarios
### Scenario R1: Decryption Fails on A Falsy Condition
_"User receives feedback about decryption failure"_
#### Create A Falsy Condition
- We set the "timelock" to 0, but the clock always displays a postive value (block number)

#### Attempt To Decrypt And Receive Errors
- Encrypt, decrypt - you know the drill
- The condition should evaluate correctly to **false**
