Safe-CLI
Command line utility for Safe contracts. Use it to manage your Safe easily from the command line
Using with docker
If you have Docker installed on your system, you can just run:
docker run -it safeglobal/safe-cli safe-creator
for creating Safes
or
docker run -it safeglobal/safe-cli safe-cli
to run the actual safe-cli
Installing
Python >= 3.7 is required. Python 3.10 is recommended.
pip3 install -U safe-cli
Using
safe-cli <checksummed_safe_address> <ethereum_node_url>
Then you should be on the prompt and see information about the Safe, like the owners, version, etc.
Next step would be loading some owners for the Safe. At least threshold
owners need to be loaded to do operations
on the Safe and at least one of them should have funds for sending transactions.
There're 3 operation modes:
- blockchain: The default mode, transactions are sent to blockchain.
- tx-service: Use
tx-service
command to enable it. Transactions are sent to the Gnosis Transaction Service (if available on the network), so you will be able to see it on the Safe web interface/mobile apps. At least one signer is needed to send transactions to the service. Txs are not executed. - relay-service: Use
relay-service [optional-gas-token]
to enable it. Sends transactions trough the Gnosis Relay Service (if available on the network). If a optional gas token is set, it will be used to send transactions.
Loading owners is not needed if you just want to do read-only
operations.
To load owners:
> load_cli_owners <account_private_key>
Loaded account 0xab...cd with balance=123 ether
Set account 0xab..cd as default sender of txs
You can also load owners from an environment variable. Before running the safe-cli
:
export MY_PRIVATE_KEY=YOUR_EOA_PRIVATE_KEY
Then:
> load_cli_owners MY_PRIVATE_KEY
Loaded account 0xab...cd with balance=123 ether
Set account 0xab..cd as default sender of txs
To check the loaded owners:
> show_cli_owners
To unload an owner:
> unload_cli_owners <ethereum_checksummed_address>
Operations currently supported:
send_custom <address> <value-wei> <data-hex-str> [--delegate] [--safe-nonce <int>]
: Sends a custom transaction from the Safe to a contract. If--delegate
is set adelegatecall
will be triggered.send_ether <address> <value-wei> [--safe-nonce <int>]
: Sends ether from the Safe to another accountsend_erc20 <address> <token_address> <value> [--safe-nonce <int>]
: Send ERC20 token from the Safe to another accountapprove_hash <keccak-hexstr-hash> <sender-address>
: Approves asafe-tx-hash
for the provided sender address. Sender private key must be loaded first.add_owner <address>
: Adds a new owneraddress
to the Safe.remove_owner <address>
: Removes an owneraddress
from the Safe.change_threshold <integer>
: Changes thethreshold
of the Safe.enable_module <address>
: Enable moduleaddress
disable_module <address>
: Disable moduleaddress
change_fallback_handler <address>
: Updates the fallback handler to beaddress
. Supported by Safes withversion >= v1.1.0
. WARNING: DON'T USE THIS IF YOU DON'T KNOW WHAT YOU ARE DOING. ALL YOUR FUNDS COULD BE LOSTchange_guard <address>
: Updates the guard to beaddress
. Supported by Safes withversion >= v1.3.0
. WARNING: DON'T USE THIS IF YOU DON'T KNOW WHAT YOU ARE DOING. ALL YOUR FUNDS COULD BE LOSTchange_master_copy <address>
: Updates the master copy to beaddress
. It's used to update the Safe. WARNING: DON'T USE THIS IF YOU DON'T KNOW WHAT YOU ARE DOING. ALL YOUR FUNDS COULD BE LOSTupdate
: Updates the Safe to the latest version (if you are on a known network likeGoerli
orMainnet
). WARNING: DON'T USE THIS IF YOU DON'T KNOW WHAT YOU ARE DOING. ALL YOUR FUNDS COULD BE LOST
Operations on tx-service
mode, requires a Safe Transaction Service working on the network
(Mainnet, Gnosis Chain, Goerli, Polygon...):
balances
: Returns a list of balances for ERC20 tokens and ether.history
: History of multisig transactions (including pending).execute-tx <safe-tx-hash>
: Execute a pending tx with enough signatures.sign-tx <safe-tx-hash>
: Sign a tx with the loaded owners for the providedSafeTxHash
.batch-txs <safe-nonce> <safe-tx-hash> [ <safe-tx-hash> ... ]
: Batch transactions into one Multisig Transaction using the providedsafe-nonce
. Any safe-tx can be used: transactions from other Safes, transactions already executed, transactions pending for execution... Only limitation is that- transactions from other networks cannot be used. Batching order will follow the same order of the
safe-tx-hashes
provided. get_delegates
: Returns a list of delegates for the Safe.add_delegate <address> <label> <signer-address>
: Adds a new delegateaddress
to the Safe.remove_delegate <address> <signer-address>
: Removes a delegateaddress
from the Safe.drain <address>
: Sends all ether and ERC20 funds to the provided account.
If the information in the information bar is outdated or there's any problem you can force the safe-cli
to update
the information about the Safe using:
> refresh
Creating a new Safe
Use safe-creator <node_url> <private_key> --owners <checksummed_address_1> <checksummed_address_2> --threshold <uint> --salt-nonce <uint256>
.
Example:
safe-creator https://goerli.infura.io/v3/token $PRIVATE_KEY --owners 0x848EF06Bb9d1bc79Bb3B04b7Ea0e251C6E788d7c --threshold 1
Demo
For this demo, PRIVATE_KEY
environment variable was set to a EOA private key (owner of a a previously created and outdated Safe)
and ETHEREUM_NODE_URL
to a http goerli node.
At first, Safe is updated to the last version and then 123 Wei
are sent to the owner of the Safe (it could be any other address).
Be careful when using update
command, as it can leave your Safe funds stuck. Safe CLI is still a beta
Use custom contracts
Safe-cli comes with the official Safe contract addresses deployed on Mainnet, Rinkeby, Kovan and Goerli
configured by default. If you want to use your own you can edit the file safe_cli/safe_addresses.py
Be careful when modifying these addresses, the funds in a Safe can get stuck if an invalid address it's used when updating to an invalid Safe Master Copy.
Safe contracts
Setting up for developing
If you miss something and want to send us a PR:
git clone https://github.com/gnosis/safe-cli.git
cd safe-cli
stat venv 2>/dev/null || python3 -m venv venv
source venv/bin/activate && pip install -r requirements-dev.txt
pre-commit install -f