Proposing, signing and executing
This page is the CLI counterpart to 2. Transaction Lifecycle, covering the same four phases: propose, collect signatures, execute, and verify, as shell commands instead of TypeScript / Python / curl.
What you'll learn
Propose a Safe transaction with
lem tx propose.Have additional owners add their signatures with
lem tx sign.Submit the transaction on-chain with
lem tx execute.Verify execution and handle indexer lag.
Prerequisites
leminstalled (see Installation).A paired signer (see Configuring a signer).
A Safe where the connected signer is an owner.
The Safe funded with enough native gas for execution.
Step-by-step
1. Propose a transaction
Build, sign, and submit a new Safe transaction in a single command. The connected signer is recorded as the proposer, and their signature counts as the first confirmation.
lem tx propose \
--address 0xYourSafeAddress \
--chain-id 11155111 \
--to 0xRecipientAddress \
--value 100000000000000--address: the Safe.
--chain-id: numeric chain ID. See the Overview page for supported networks.--to: the recipient (any EVM address).
--value: the amount, in wei, sent from the Safe.
lem will:
Resolve the next nonce automatically (accounts for queued proposals).
Ask your signer to approve the EIP-712 hash (on-device for USB Ledger).
POST the proposal + signature to the Transaction Service.
Print the canonical payload, including the safeTxHash:
Capture the safeTxHash. That is the handle for everything that follows.
Today
lem tx proposeis scoped to ETH transfers. For richer payloads (ERC-20 transfers, contract calls, MultiSend batches), use the Ledger Multisig UI or the API Kit. See Guide 3 and Guide 5.
2. Collect signatures
Other Safe owners run lem tx sign to confirm the same safeTxHash. They need their own lem connect session.
The signer is asked to confirm on-device. After approval, lem POSTs the new confirmation to the Transaction Service and prints the updated count:
lem tx sign short-circuits with a clear error in three situations:
Transaction already executed
Exit code 1, message Transaction has already been executed.
Threshold already met
Exit code 1, message Transaction already has enough signatures (N/M).
This signer already confirmed
Exit code 1, message This owner has already signed the transaction.
Check progress at any time with lem tx show --safe-tx-hash 0xYourSafeTxHash --pretty. Move on when confirmations.length === confirmationsRequired.
3. Execute on-chain
With the threshold met, any owner can bundle the collected signatures and submit on-chain:
The executing signer pays gas, and lem returns the on-chain transactionHash plus the safeTxHash it executed:
The same hardware-confirmation pattern applies: the device prompts you to approve the on-chain submission. From this point the transaction is at the mercy of the EVM. lem does not wait for inclusion by default.
4. Verify execution
The Transaction Service typically catches up within 10–60 seconds. Re-fetch the transaction:
Confirm isExecuted: true, isSuccessful: true, and that transactionHash matches what lem tx execute returned.
Key concepts
Off-chain proposal, on-chain execution. Propose and sign only update the Transaction Service. They are gas-free, idempotent, and visible across the platform. Execute is the single moment gas is spent and chain state changes.
Determinism via
safeTxHash. Every command that mutates a transaction takes--safe-tx-hash(or accepts it positionally fortx sign/tx execute/tx show). The hash is computed locally during propose and is independent of any RPC.
Tips and pitfalls
Indexer lag is real. If
lem tx showreportsisExecuted: false5 seconds afterlem tx execute, that is normal. Wait and retry.A returned
transactionHashcan still be a revert.lem tx executereports whatever the receipt yields. Always inspectisSuccessfulin the post-executetx showoutput, or pull the receipt with your usual RPC tooling, before declaring victory.Fund the executor. The signer running
lem tx executemust have native gas on the target chain. The Safe's balance is for the transfer. The executor's balance is for gas.Ordering by nonce. Safe enforces strict nonce ordering. If you queue tx A (nonce 7) and tx B (nonce 8) and execute B first, B will revert. Use
lem safe nonceandlem tx listto keep ordering straight.Re-running
lem tx executeis a no-op once on-chain. If the transaction is already executed, the Transaction Service will not re-submit it.lemwill surface that as an error.
Next steps
Command reference
Building agent workflows
Last updated