Quickstart
End-to-end: connect a Ledger, find a Safe you own, propose an ETH transfer, collect a co-owner signature, and execute on-chain, all from the shell.
Last updated
End-to-end: connect a Ledger, find a Safe you own, propose an ETH transfer, collect a co-owner signature, and execute on-chain, all from the shell.
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.
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.
Pair your Ledger and cache the signer address + derivation path in ~/.config/les-multisig/config.json.
Confirm the address on the device when prompted. After this completes, every subsequent command picks up the same signing identity automatically.
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.
Note threshold, owners, and nonce. You'll need to know how many signatures are required before the transaction can be executed.
Propose an ETH transfer. The value is in wei (the example below sends 0.0001 ETH).
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 for all other owners.
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 automatically refuses already-executed transactions, transactions that already have enough signatures, and signers who have already confirmed.
Check confirmation progress at any time with:
Move on once confirmations.length === confirmationsRequired.
Once the threshold is met, any owner can submit the transaction on-chain (and pays gas):
The command returns the on-chain transactionHash along with the safeTxHash.
The Transaction Service indexer typically catches up within 10–60 seconds after on-chain inclusion. Re-fetch the transaction to confirm:
You should see isExecuted: true, isSuccessful: true, and the on-chain transactionHash.
Off-chain proposal, on-chain execution.
lem tx proposeandlem tx signare gas-free. They only update the Transaction Service.lem tx executeis 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.
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.
Last updated
lem connectlem safe scan --prettylem safe info \
--address 0xYourSafeAddress \
--chain-id 11155111 \
--prettylem tx propose \
--address 0xYourSafeAddress \
--chain-id 11155111 \
--to 0xRecipientAddress \
--value 100000000000000lem tx sign --chain-id 11155111 0xYourSafeTxHashlem tx show --safe-tx-hash 0xYourSafeTxHash --prettylem tx execute --chain-id 11155111 0xYourSafeTxHashsleep 15
lem tx show --safe-tx-hash 0xYourSafeTxHash --pretty