# Core smart contracts
The core of Tornado Cash logic is implemented in a set of smart contracts that are shown on below diagram.
```mermaid
classDiagram
MerkleTreeWithHistory <|-- Tornado
MerkleTreeWithHistory o-- Hasher
ReentrancyGuard <|-- Tornado
Tornado <|-- ETHTornado
Tornado <|-- ERC20Tornado
Tornado o-- Verifier
class Hasher{
+MiMCSponge()
}
class MerkleTreeWithHistory{
+IHasher hasher
+mapping filledSubtrees
+mapping roots
+hashLeftRight() bytes32
+isKnownRoot() bool
+getLastRoot() bytes32
+zeros() bytes32
~_insert() uint32
}
class ReentrancyGuard{
~int sizeInFeet
~canEat()
}
class Verifier{
+verifyProof() bool
}
class Tornado{
+IVerifier verifier
+uint256 denomination
+mapping nullifierHashes
+mapping commitments
+deposit()
+withdraw()
+isSpent() bool
+isSpentArray() bool[]
}
class ETHTornado{
+IVerifier verifier
+uint256 denomination
+mapping nullifierHashes
+mapping commitments
+deposit()
+withdraw()
+isSpent() bool
+isSpentArray() bool[]
}
class ERC20Tornado{
+IVerifier verifier
+uint256 denomination
+mapping nullifierHashes
+mapping commitments
+IERC20 token
+deposit()
+withdraw()
+isSpent() bool
+isSpentArray() bool[]
}
```
### MerkleTreeWithHistory contract
This is the contract that implements the Merkle tree functionality to be used in the basic Tornado Cash contract. The contract takes 2 parameters in its constructor:
- **levels**: the number of tree levels (should be less than 32)
- **hasher**: the reference to the Hasher contract defined by the IHasher interface
This contract provides several service functions that are used in Tornado contract:
- **hashLeftRight**: hashes 2 tree leaves (using hasher contract) and returns MiMC hash
- **isKnownRoot**: determines hether the root is present in the root history
- **getLastRoot**: returns the last root of the tree
- **zeros**: provides empty elements for a MiMC Merkle Tree up to 32 levels
- **_insert**: inserts the leaf element in the MErkle tree and returns its index
### ReentrancyGuard contract
### Verifier contract
### Tornado contract
### ETHTornado contract
### ERC20Tornado contract
sss