safe-global / safe-cli

Command line utility for Safe
MIT License
208 stars 68 forks source link

PyPI version Build Status Coverage Status Python 3.9 Python 3.10 Python 3.11 Python 3.12 Docker Image Version (latest semver)

Safe CLI

Safe CLI is a command-line utility for Safe contracts. You can use it to manage your Safe account from the command line.

It does not rely on Safe{Core} API and can also be used in networks where Safe services are unavailable. Learn more through the documentation.

Using Docker

Prerequisite: Install Docker Desktop.

Once Docker is installed on your system, run the following command to create new Safe accounts:

docker run -it safeglobal/safe-cli safe-creator

You can also run the following command to run the Safe CLI with an existing Safe:

docker run -it safeglobal/safe-cli safe-cli <checksummed_safe_address> <ethereum_node_url>

Using Python PIP

Prerequisite: Python >= 3.9 (Python 3.12 is recommended).

Once Python is installed on your system, run the following command to install Safe CLI:

pip3 install -U safe-cli

Usage

Safe-Cli

usage:
 safe-cli [--history] [--get-safes-from-owner] address node_url

 Examples:
 safe-cli 0x0000000000000000000000000000000000000000 https://sepolia.drpc.org
 safe-cli --get-safes-from-owner 0x0000000000000000000000000000000000000000 https://sepolia.drpc.org

 safe-cli --history 0x0000000000000000000000000000000000000000 https://sepolia.drpc.org
 safe-cli --history --get-safes-from-owner 0x0000000000000000000000000000000000000000 https://sepolia.drpc.org

 safe-cli send-ether 0xsafeaddress https://sepolia.drpc.org 0xtoaddress wei-amount --private-key key1 --private-key key1 --private-key keyN [--non-interactive]
 safe-cli send-erc721 0xsafeaddress https://sepolia.drpc.org 0xtoaddress 0xtokenaddres id --private-key key1 --private-key key2 --private-key keyN [--non-interactive]
 safe-cli send-erc20 0xsafeaddress https://sepolia.drpc.org 0xtoaddress 0xtokenaddres wei-amount --private-key key1 --private-key key2 --private-key keyN [--non-interactive]
 safe-cli send-custom 0xsafeaddress https://sepolia.drpc.org 0xtoaddress value 0xtxdata --private-key key1 --private-key key2 --private-key keyN [--non-interactive]

 safe-cli tx-builder 0xsafeaddress https://sepolia.drpc.org  ./path/to/exported/tx-builder/file.json --private-key key1 --private-key keyN [--non-interactive]

╭─ Arguments ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ *    address       CHECKSUMADDRESS  The address of the Safe, or an owner address if --get-safes-from-owner is specified. [required]                                                                                                                                                                             │
│ *    node_url      TEXT             Ethereum node url. [required]                                                                                                                                                                                                                                               │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Options ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --help          Show this message and exit.                                                                                                                                                                                                                                                                     │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
╭─ Optional Arguments ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ --history                 --no-history                   Enable history. By default it's disabled due to security reasons [default: no-history]                                                                                                                                                                 │
│ --get-safes-from-owner    --no-get-safes-from-owner      Indicates that address is an owner (Safe Transaction Service is required for this feature) [default: no-get-safes-from-owner]                                                                                                                          │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

 Commands available in unattended mode:

 send-ether
 send-erc20
 send-erc721
 send-custom
 tx-builder
 version

 Use the --help option of each command to see the usage options.

To execute transactions unattended, or execute transactions from a json exported from the tx_builder you can use:

safe-cli send-ether 0xsafeaddress https://sepolia.drpc.org 0xtoaddress wei-amount --private-key key1 --private-key key1 --private-key keyN --non-interactive
safe-cli send-erc721 0xsafeaddress https://sepolia.drpc.org 0xtoaddress 0xtokenaddres id --private-key key1 --private-key key2 --private-key keyN --non-interactive
safe-cli send-erc20 0xsafeaddress https://sepolia.drpc.org 0xtoaddress 0xtokenaddres wei-amount --private-key key1 --private-key key2 --private-key keyN --non-interactive
safe-cli send-custom 0xsafeaddress https://sepolia.drpc.org 0xtoaddress value 0xtxdata --private-key key1 --private-key key2 --private-key keyN --non-interactive

safe-cli tx-builder 0xsafeaddress https://sepolia.drpc.org  ./path/to/exported/tx-builder/file.json --private-key key1 --private-key keyN --non-interactive

It is possible to use the environment variable SAFE_CLI_INTERACTIVE=0 to avoid user interactions. The --non-interactive option have more priority than environment variable.

Safe-Creator


usage:
        safe-creator [-h] [-v] [--threshold THRESHOLD] [--owners OWNERS [OWNERS ...]] [--safe-contract SAFE_CONTRACT] [--proxy-factory PROXY_FACTORY] [--callback-handler CALLBACK_HANDLER] [--salt-nonce SALT_NONCE] [--without-events] node_url private_key

        Example:
            safe-creator https://sepolia.drpc.org 0000000000000000000000000000000000000000000000000000000000000000

positional arguments:
  node_url              Ethereum node url
  private_key           Deployer private_key

options:
  -h, --help            show this help message and exit
  -v, --version         Show program's version number and exit.
  --threshold THRESHOLD
                        Number of owners required to execute transactions on the created Safe. It mustbe greater than 0 and less or equal than the number of owners
  --owners OWNERS [OWNERS ...]
                        Owners. By default it will be just the deployer
  --safe-contract SAFE_CONTRACT
                        Use a custom Safe master copy
  --proxy-factory PROXY_FACTORY
                        Use a custom proxy factory
  --callback-handler CALLBACK_HANDLER
                        Use a custom fallback handler. It is not required for Safe Master Copies with version < 1.1.0
  --salt-nonce SALT_NONCE
                        Use a custom nonce for the deployment. Same nonce with same deployment configuration will lead to the same Safe address
  --without-events      Use non events deployment of the Safe instead of the regular one. Recommended for mainnet to save gas costs when using the Safe

Safe{Core} API/Protocol

Setting up for developing

If you miss something and want to send us a PR:

git clone https://github.com/safe-global/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

To run the local version you can install it using:

pip install .

Contributors