> ## Documentation Index
> Fetch the complete documentation index at: https://docs.peaq.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Service Index

> All address-only Tether WDK services exposed by `peaq_tether_node` with request/response context.

`peaq_ros2_tether` adds an optional ROS 2 node (`peaq_tether_node`) that integrates **Tether WDK** (EVM wallet module) so robots can:

* Create an **EVM wallet address**
* Query **USDT (ERC-20)** balance on peaq EVM
* Transfer **USDT** on peaq EVM

This integration is **address-only**:

* ROS APIs use **only EVM addresses** (`address`, `from_address`, `to_address`)
* Wallet secrets (mnemonic) are stored locally on the robot/machine in **one shared registry file**
* No private keys/mnemonics are ever sent over ROS services

## Service Catalog

| Service                           | Type                                            | Purpose                                                        |
| --------------------------------- | ----------------------------------------------- | -------------------------------------------------------------- |
| `/peaq_tether_node/wallet/create` | `peaq_ros2_interfaces/srv/TetherCreateWallet`   | Create a new EVM wallet address (mnemonic stored locally)      |
| `/peaq_tether_node/usdt/balance`  | `peaq_ros2_interfaces/srv/TetherGetUsdtBalance` | Read USDT balance for an address                               |
| `/peaq_tether_node/usdt/transfer` | `peaq_ros2_interfaces/srv/TetherTransferUsdt`   | Transfer USDT from one local wallet address to another address |

Use this index as a quick reference, then dive into the focused guides:

* [Wallet](/peaqchain/sdk-reference/robotics-sdk/ros2/tether/wallet)
* [USDT Balance](/peaqchain/sdk-reference/robotics-sdk/ros2/tether/usdt-balance)
* [USDT Transfer](/peaqchain/sdk-reference/robotics-sdk/ros2/tether/usdt-transfer)
* [Wallet Registry](/peaqchain/sdk-reference/robotics-sdk/ros2/tether/wallet-registry)

## Launch Prerequisites

Install JS dependencies once (Node.js required where the node runs):

```bash theme={"theme":{"light":"github-light-default","dark":"github-dark"}}
cd peaq_ros2_tether/js
npm ci
```

Start the node via `ros2 run`.

Notes:

* If you run multiple ROS 2 environments on the same host, isolate them with `ROS_DOMAIN_ID` to prevent service collisions.
* When running from a **source checkout**, the node prefers a CLI path where Node can resolve `node_modules/`. The simplest approach is to run from the workspace root. You can also override the CLI path explicitly with `PEAQ_TETHER_CLI_PATH`.

```bash theme={"theme":{"light":"github-light-default","dark":"github-dark"}}
export ROS_DOMAIN_ID="${ROS_DOMAIN_ID:-94}"

# Point this to your clone path
export REPO_DIR="<path to your peaq-robotics-ros2 clone>"
cd "$REPO_DIR"

export PEAQ_CFG="$REPO_DIR/peaq_ros2_examples/config/peaq_robot.yaml"

# IMPORTANT: set this explicitly. If REPO_DIR is empty, the default becomes "/peaq_ros2_tether/..."
export PEAQ_TETHER_CLI_PATH="$REPO_DIR/peaq_ros2_tether/js/peaq_tether_cli.mjs"

# Option A (recommended): tmux detach (keeps the node running after SSH disconnects)
tmux new -s tether
# inside tmux:
ros2 run peaq_ros2_tether tether_node --ros-args -p config.yaml_path:="$PEAQ_CFG"
# detach without stopping: Ctrl-b then d
#
# After detaching, the node keeps running and ROS services continue to work from any terminal
# (as long as you source your ROS environment and use the same ROS_DOMAIN_ID).

# Option B: background + disown
# ros2 run peaq_ros2_tether tether_node --ros-args -p config.yaml_path:="$PEAQ_CFG" \
#   > /tmp/tether_node.log 2>&1 & disown
```

Confirm the node is running and services are registered:

```bash theme={"theme":{"light":"github-light-default","dark":"github-dark"}}
export ROS_DOMAIN_ID="${ROS_DOMAIN_ID:-94}"
# In a new terminal you must source ROS so `ros2` is available:
# source /opt/ros/<your_ros_distro>/setup.bash
# source <path to your peaq-robotics-ros2 clone>/install/setup.bash
ros2 node list | grep peaq_tether_node
ros2 service list | grep peaq_tether_node
```

Stop the node:

* **tmux option**:
  * Re-attach: `tmux attach -t tether`
  * Stop inside tmux: `Ctrl-c`
  * (Or kill the session): `tmux kill-session -t tether`
* **background/disown option**:
  * Try:
    * `pkill -f "ros2 run peaq_ros2_tether tether_node" || true`
    * `pkill -f "peaq_ros2_tether/tether_node" || true`
  * If the node was started as another user (or with `sudo`), you may need `sudo pkill ...`.
  * Verify it’s gone:
    * `pgrep -af "peaq_ros2_tether.*tether_node" || echo "tether node stopped"`

If `ros2 node list` still shows stale entries right after stopping, restart the ROS CLI daemon and try again:

```bash theme={"theme":{"light":"github-light-default","dark":"github-dark"}}
ros2 daemon stop || true
ros2 daemon start || true
```
