> For the complete documentation index, see [llms.txt](https://help.multisig.ledger.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://help.multisig.ledger.com/guides/cli-guides/quickstart.md).

# Quickstart

### What you'll learn

* Connect a signing identity with `lem connect`.
* Discover Safes owned by your signer.
* Propose, co-sign, and execute a Safe transaction.
* Verify execution through the Transaction Service.

### Prerequisites

* `lem` installed (see **Installation**).
* A Ledger device, unlocked, with the Ethereum app open.
* A Safe on Sepolia where the connected signer is an owner.
* A second owner who can sign (a second Ledger, or, for testing, a software signer).
* A bit of Sepolia ETH in the Safe for gas and the transfer amount.

> Use **Sepolia** for your first run. Mainnet runs the same commands with --chain-id 1.

### Step-by-step

#### 1. Connect your signer

Pair your Ledger and cache the signer address + derivation path in \~/.config/les-multisig/config.json.

```
lem connect
```

Confirm the address on the device when prompted. After this completes, every subsequent command picks up the same signing identity automatically.

#### 2. Discover Safes you own

```
lem safe scan --pretty
```

The output lists Safes the connected signer is an owner of, grouped by chain. Pick a Safe on chainId 11155111 (Sepolia) for the rest of the quickstart and copy its address.

#### 3. Inspect the Safe

```
lem safe info \
  --address 0xYourSafeAddress \
  --chain-id 11155111 \
  --pretty
```

Note threshold, owners, and nonce. You'll need to know how many signatures are required before the transaction can be executed.

#### 4. Propose a transaction

Propose an ETH transfer. The value is in wei (the example below sends 0.0001 ETH).

```
lem tx propose \
  --address 0xYourSafeAddress \
  --chain-id 11155111 \
  --to 0xRecipientAddress \
  --value 100000000000000
```

You will be asked to confirm the transaction on your Ledger. After approval, `lem` prints the proposal payload and the `safeTxHash`. Copy the `safeTxHash`. That is the identifier for this transaction inside the Safe.

The transaction is now visible in the [Ledger Enterprise Multisig UI](https://app.multisig.ledger.com/) for all other owners.

#### 5. Collect a second signature

Switch to a second owner (a second Ledger user, or run the command with a --seed/--salt software signer on a testnet) and sign the same safeTxHash:

```
lem tx sign --chain-id 11155111 0xYourSafeTxHash
```

`lem tx sign` automatically refuses already-executed transactions, transactions that already have enough signatures, and signers who have already confirmed.

Check confirmation progress at any time with:

```
lem tx show --safe-tx-hash 0xYourSafeTxHash --pretty
```

Move on once confirmations.length === confirmationsRequired.

#### 6. Execute on-chain

Once the threshold is met, any owner can submit the transaction on-chain (and pays gas):

```
lem tx execute --chain-id 11155111 0xYourSafeTxHash
```

The command returns the on-chain transactionHash along with the safeTxHash.

#### 7. Verify execution

The Transaction Service indexer typically catches up within 10–60 seconds after on-chain inclusion. Re-fetch the transaction to confirm:

```
sleep 15
lem tx show --safe-tx-hash 0xYourSafeTxHash --pretty
```

You should see isExecuted: true, isSuccessful: true, and the on-chain transactionHash.

### Key concepts

> **Off-chain proposal, on-chain execution.** `lem tx propose` and `lem tx sign` are gas-free. They only update the Transaction Service. `lem tx execute` is the one command that submits the bundled signatures on-chain and pays gas. A 3-of-5 Safe still only pays gas once, on the final execute.

### Tips and pitfalls

* **Indexer lag.** If `lem tx show` returns `isExecuted: false` right after `lem tx execute`, wait 10–60 seconds and retry. The on-chain transaction is already confirmed. The indexer just has not caught up.
* **Execute can return a hash for a reverted tx.** `lem tx execute` returns whatever the on-chain receipt yields. Always check `isSuccessful` (or the receipt on a block explorer) before declaring victory.
* **Fund your executor.** The signer running `lem tx execute` needs native gas on the target chain.
* **Confirm on-device every time.** Hardware signing requires a manual confirmation on the Ledger for both tx propose and tx sign.
