1.0.4 • Published 8 months ago

safe-owner-manager v1.0.4

Weekly downloads
-
License
MIT
Repository
github
Last release
8 months ago

Safe Owner Manager

PLEASE BE SURE TO ALWAYS CHECK THE JSON OUTPUT BY HAND AND BY SIMULATING IT IN TENDERLY, CHECKING STATE CHANGES, BEFORE EXECUTING ANY TRANSACTIONS!!!

Also, make sure you're OK with the data privacy level if using the public RPC providers hardcoded into the tool. To prevent doubt, always try to use an authenticated service you trust!

A tool to manage (Gnosis) Safe multisig owners and thresholds in bulk.

The output of the tool is a JSON file (or variable) that can then be used in Safe's Transaction Builder plugin, after initiating a new transaction in the Safe UI:

There is also a branch with a Levenshtein distance algorithm version of this tool. However, given we have the threshold in addition to the address sets, it isn't as good as the current naive version.

Rationale

The Gnosis Safe multisig contract allows for the management of owners and thresholds. However, the Safe UI does not guarantee the soundness of the linked list structure that holds the Safe's signer set while constructing the transaction to change multiple owners simultaneously. This means, sometimes, it only allows for adding one owner at a time.

This tool allows for the addition of multiple owners at once, as well as the setting of a new threshold. All while minimizing the number of transactions needed to achieve the desired state.

The need for this tool has mostly arisen from the fact that, given the responsibilities of the Security Councils of the big treasury DAOs and how often their members change, it doesn't make sense to have it be a human-bound effort to maintain the soundness of the underlying owner structure.

This was a tool developed by @GNSPS as a member of @creedxyz for @everclearorg as the organization's Security Council needs to exist in multiple chains at the same time hence the need to automate the process. But we're open-sourcing it for the community to use. :heart:

Proof of Production Usage

Installation

Install globally to use as a CLI tool:

npm install -g safe-owner-manager

Or install locally in your project:

npm install safe-owner-manager

CLI Usage

safe-owner-manager --safe-address=SAFE_ADDRESS --new-owners=NEW_OWNER_1,NEW_OWNER_2,... --chain-id=CHAIN_ID [--alchemy-api-key=ALCHEMY_API_KEY] [--new-threshold=NEW_THRESHOLD] [--out-filename=FILENAME]

Notes:

  • The --new-owners parameter should be a comma-separated list of addresses without spaces.
  • The --new-threshold parameter is optional.
  • You can provide either an --alchemy-api-key for supported networks or a --rpc-url for custom networks or when you prefer to use a different RPC provider.
  • If neither --alchemy-api-key nor `--rpc-url is provided, the tool will attempt to use public RPC endpoints for common networks.
  • The --out-filename parameter is optional. If not provided, the output file will be named transactions_chain-{chainId}_{safeAddress}.json.

Examples:

1. Using Alchemy API Key on Ethereum Mainnet:

safe-owner-manager \
  --safe-address=0xYourSafeAddress \
  --new-owners=0xOwner1,0xOwner2 \
  --chain-id=1 \
  --new-threshold=2 \
  --alchemy-api-key=YourAlchemyApiKey \
  --out-filename=transactions_mainnet.json

2. Using Public RPC URL on Binance Smart Chain:

safe-owner-manager \
  --safe-address=0xYourSafeAddress \
  --new-owners=0xOwner1,0xOwner2 \
  --chain-id=56 \
  --new-threshold=2

3. Using Custom RPC URL for an Unsupported Network:

safe-owner-manager \
  --safe-address=0xYourSafeAddress \
  --new-owners=0xOwner1,0xOwner2 \
  --chain-id=12345 \
  --new-threshold=2 \
  --rpc-url=https://custom-rpc.network \
  --out-filename=transactions_custom.json

Library Usage

import { generateTransactions } from 'safe-owner-manager';

const options = {
  safeAddress: '0xYourSafeAddress',
  newOwners: ['0xOwner1', '0xOwner2'],
  chainId: '1', // Ethereum Mainnet
  newThreshold: 2, // Optional
  alchemyApiKey: 'YourAlchemyApiKey', // Optional
  rpcUrl: 'https://custom-rpc.network', // Optional
};

generateTransactions(options)
  .then((jsonOutput) => {
    // Use the jsonOutput as needed
    console.log(JSON.stringify(jsonOutput, null, 2));
  })
  .catch((error) => {
    console.error('Error:', error.message);
  });

Parameters

  • safeAddress: The address of the Gnosis Safe multisig contract.
  • newOwners: An array of new owner addresses.
  • chainId: The chain ID where the transaction will occur (e.g., 1 for Ethereum Mainnet).
  • newThreshold (optional): The new threshold value to set.
  • alchemyApiKey (optional): Your Alchemy API key. This parameter can be substituted by the use of a global environment variable named ALCHEMY_API_KEY.
  • rpcUrl (optional): A custom RPC URL. Useful for unsupported networks or when you prefer a specific RPC provider.
  • outFilename (optional): The filename to save the JSON output. If not provided, the name will be transaction_chain-{number}_{safeAddress}.json.

Supported Networks

The tool supports a variety of networks, including but not limited to:

  • Ethereum Mainnet (chainId: 1)
  • Goerli Testnet (chainId: 5)
  • Sepolia Testnet (chainId: 11155111)
  • Polygon Mainnet (chainId: 137)
  • Polygon Mumbai Testnet (chainId: 80001)
  • Binance Smart Chain Mainnet (chainId: 56)
  • Binance Smart Chain Testnet (chainId: 97)
  • Gnosis Mainnet (chainId: 100)
  • Gnosis Chiado Testnet (chainId: 10200)
  • Avalanche Mainnet (chainId: 43114)
  • Avalanche Fuji Testnet (chainId: 43113)
  • Fantom Opera (chainId: 250)
  • Fantom Testnet (chainId: 4002)
  • Optimism Mainnet (chainId: 10)
  • Optimism Goerli Testnet (chainId: 420)
  • Arbitrum One (chainId: 42161)
  • Arbitrum Goerli Testnet (chainId: 421613)
  • Base Mainnet (chainId: 8453)

For networks not listed or unsupported, you can provide a custom RPC URL using the --rpc-url parameter.

Contributing

Contributions are welcome! Feel free to open issues or submit pull requests.

1.0.4

8 months ago

1.0.3

8 months ago

1.0.2

8 months ago

1.0.1

8 months ago

1.0.0

8 months ago