---
# System prepended metadata

title: System Introduction

---

# System Introduction
We are building a privacy-focused platform that allows Web3 users to transfer funds from their wallets while safeguarding their personal information and preserving their privacy. By default, when users prompt the contracts for withdrawal, the withdrawal account needs to already have Ether in order to pay the Ethereum network to process the smart contract’s operations. However, sending Ether to the withdrawal account prior to withdrawal might create a link between the user’s deposit and withdrawal accounts. To simplify users' withdrawal process, we are building a service called relayer, which allow users to process withdrawals without needing to pre-fund their withdrawal accounts, which helps users maintain privacy when withdrawing. The relayer service refers to the [tornado cash relayer services](https://github.com/tornadocash/tornado-relayer). The related smart contracts are displayed below:

# Relayer related Contracts

RelayerRegistry: [0x58E8dCC13BE9780fC42E8723D8EaD4CF46943dF2](https://etherscan.io/address/0x58E8dCC13BE9780fC42E8723D8EaD4CF46943dF2)

TornadoRouter: [0xd90e2f925DA726b50C4Ed8D0Fb90Ad053324F31b](https://etherscan.io/address/0xd90e2f925DA726b50C4Ed8D0Fb90Ad053324F31b)

Governance: [0x5efda50f22d34F262c29268506C5Fa42cB56A1Ce](https://etherscan.io/address/0x5efda50f22d34F262c29268506C5Fa42cB56A1Ce)

Aggregator: [0xE8F47A78A6D52D317D0D2FFFac56739fE14D1b49](https://etherscan.io/address/0xE8F47A78A6D52D317D0D2FFFac56739fE14D1b49)

TokenStakingRewards: [0x2FC93484614a34f26F7970CBB94615bA109BB4bf](https://etherscan.io/address/0x2FC93484614a34f26F7970CBB94615bA109BB4bf)

FeeManager: [0x5f6c97C6AD7bdd0AE7E0Dd4ca33A4ED3fDabD4D7](https://etherscan.io/address/0x5f6c97C6AD7bdd0AE7E0Dd4ca33A4ED3fDabD4D7)

# Relayer related Codes:
RelayerService: https://development.tornadocash.community/tornadocash/classic-relayer 

RelayerRegistry: https://github.com/pgfrontend/core-contracts/tree/main/contracts/tornado-registry

Proxy: https://github.com/pgfrontend/core-contracts/tree/main/contracts/tornado-proxy

Aggregator: https://github.com/pgfrontend/core-contracts/tree/main/contracts/tornado-aggregator

# Related websites and frontend codes:

[Portal Gate Mixer](https://portalgun-mixer.vercel.app/)
[Relayer registry Website](https://development.tornadocash.community/tornadocash/relayers-network-ui-minified) (You need to clone the repo and run the server locally).
[Tornado classic UI](https://github.com/tornadocash/tornado-classic-ui) (Since the mixer code is private, please refer to their repo, the function is similiar)

# Withdrawal Process Explanation
The relayer service is used within the withdrawal process. The following steps will explain the withdrawl process.

- Enter [Portal Gate Mixer](https://portalgun-mixer.vercel.app/);
- Choose `goerli` network;
- Select `withdraw` type to enter the withdrawal process;
- Paste the test note in the note field:
Test Note: `portalgun-usdc-100-5-0xf9748525f8ee730b12ae0f32b73584e1f963493a2fff09c97ad760aed891cfa531629189f372f53d1dfdf58db94bc78ab5f8cbc3031bfd9f812aa79c3189` **Please don't spend the note.**
![Withdrawal Image](https://i.imgur.com/KsoZa1g.png)
- Click the setting icon on the top right, the image is shown below:
![Withdrawal2 Image](https://i.imgur.com/XL2WwNp.png)
- Then you will get the following popup, and then choose relayer:
![Popup Image](https://i.imgur.com/GtdcmEJ.png)
- Choose **custom** from the dropdown to enter your own relayer service node and you can use the relayer service to withdraw the fund. Since the relayer service is still under development, the relayer sevice you paste won't work.
![Custom Relayer](https://i.imgur.com/dXbX571.png)

![Node paste](https://i.imgur.com/68k4hXl.png)

# What you need to do?
Follow the instructions on the [`RelayerService`](https://development.tornadocash.community/tornadocash/classic-relayer), and then set up your own relayer service node. After you set up the node, you need to answer the following questions. 

# Questions:
1. When user wants to withdraw their deposited assests, they can either choose randomly picked relayer or customised relayer. For the customised relayer, the process image is displayed above. User needs to enter their own running nodes, so the question is how to register your own relayer service node through the relayer registry smart contract? What if you don't register your services, how the system will check whether the service node is eligible?

2. Within the aggregator contract, there is a function called `relayersData`, one of the parameter is called `_subdomains`, which is used to resolve the relayers url, here the `_subdomains` is `['mainnet-tornado', 'goerli-tornado']`, so the question is how the user can setup their ens subdomains correlated with the `_subdomains`?

3. Within the RelayerRegistry contract, relayer can also register workers. The question is what are these workers used for?

4. (Solidity questions). Right now, the users need to first wrap the token, and then deposit to the related pool. Based on users' feedback, it is not a good user experience. Users want to combine these two separate steps into one step. Therefore, the challenge is to write a smart contract to combine these two steps together. The related contract is here:
- [Kyc Token smart contract](https://github.com/pgfrontend/core-contracts/tree/main/contracts/keyring).
- [Kyc Token Pool](https://github.com/tornadocash/tornado-core)

5. (Extra). **Recurisve Algorithm**: Using `Rust` to write a function to get the sum of the number from 1-100.
