Skip to content

LendFinity/safe-smart-account

 
 

Repository files navigation

Safe Smart Account

npm version Build Status Coverage Status

⚠️ This branch contains changes that are under development To use the latest audited version make sure to use the correct commit. The tagged versions that are used by the Safe team can be found in the releases.

Usage

Install requirements with npm

npm i

Testing

To run the tests:

npm run build
npm run test

Optionally, if you want to run the ERC-4337 compatibility test, it uses a live bundler and node, so it contains some pre-requisites:

  1. Define the environment variables:
ERC4337_TEST_BUNDLER_URL=
ERC4337_TEST_NODE_URL=
ERC4337_TEST_SINGLETON_ADDRESS=
ERC4337_TEST_SAFE_FACTORY_ADDRESS=
MNEMONIC=
  1. Pre-fund the executor account derived from the mnemonic with some Native Token to cover the deployment of an ERC4337 module and the pre-fund of the Safe for the test operation.

Deployments

A collection of the different Safe contract deployments and their addresses can be found in the Safe deployments repository.

To add support for a new network follow the steps of the Deploy section and create a PR in the Safe deployments repository.

Deploy

⚠️ Make sure to use the correct commit when deploying the contracts. Any change (even comments) within the contract files will result in different addresses. The tagged versions that are used by the Safe team can be found in the releases.

Current version: The latest release is v1.4.1-build.0 on the commit 192c7dc

This will deploy the contracts deterministically and verify the contracts on etherscan using Solidity 0.7.6 by default.

Preparation:

  • Set MNEMONIC in .env
  • Set INFURA_KEY in .env
  • For zkSync, set ZKSYNC_DEPLOYER_PK in .env
npm run deploy-all <network>

This will perform the following steps

npm run build
npx hardhat --network <network> deploy
npx hardhat --network <network> sourcify
npx hardhat --network <network> etherscan-verify
npx hardhat --network <network> local-verify

Custom Networks

It is possible to use the NODE_URL env var to connect to any EVM based network via an RPC endpoint. This connection then can be used with the custom network.

E.g. to deploy the Safe contract suite on that network you would run npm run deploy-all custom.

The resulting addresses should be on all networks the same.

Note: Address will vary if contract code is changed or a different Solidity version is used.

Replay protection (EIP-155)

Some networks require replay protection, making it incompatible with the default deployment process as it relies on a presigned transaction without replay protection (see https://github.com/Arachnid/deterministic-deployment-proxy).

Safe Smart Account contracts use a different deterministic deployment proxy (https://github.com/safe-global/safe-singleton-factory). To make sure that the latest version of this package is installed, run npm i --save-dev @safe-global/safe-singleton-factory before deployment. For more information, including deploying the factory to a new network, please refer to the factory repo.

Note: This will result in different addresses compared to hardhat's default deterministic deployment process.

Verify contract

This command will use the deployment artifacts to compile the contracts and compare them to the onchain code

npx hardhat --network <network> local-verify

This command will upload the contract source to Etherescan

npx hardhat --network <network> etherscan-verify

Deploying and Verifying on Bitfinity

Configure .env:

MNEMONIC=<YOUR_MNEMONIC>
# Used for infura based network
INFURA_KEY=""
# Used for custom network
NODE_URL="https://mainnet.bitfinity.network"
ETHERSCAN_API_KEY="0x"
# (Optional) Used to run ERC-4337 compatibility test. MNEMONIC is also required.
ERC4337_TEST_BUNDLER_URL=
ERC4337_TEST_NODE_URL=
ERC4337_TEST_SINGLETON_ADDRESS=
ERC4337_TEST_SAFE_FACTORY_ADDRESS=
# (Optional) Tells the test runner which Safe Singleton Contract to use for testing: Safe or SafeL2. Defaults to Safe.
SAFE_CONTRACT_UNDER_TEST="Safe"
# Used for compiling with different solidity testing
SOLIDITY_VERSION= # Example: '0.8.19'
# For running coverage tests, `details` section of solidity settings are required, else could be removed.
SOLIDITY_SETTINGS= # Example: '{"viaIR":true,"optimizer":{"enabled":true, "details": {"yul": true, "yulDetails": { "optimizerSteps": ""}}}}'
# Set to 1 to run hardhat in zksync mode. This will enable the ZK compiler and run the hardhat node in zksync mode.
HARDHAT_ENABLE_ZKSYNC=0
# Sets hardhat chain id. In general, you don't need this, it's only used for testing the SafeToL2Setup contract.
HARDHAT_CHAIN_ID=31337
# (Optional) Hardhat-deploy only supports zksync deployment if the private key for the account is provided. Specify the private key here.
ZKSYNC_DEPLOYER_PK="0x7726827caac94a7f9e1b160f7ea819f172f7b6f9d2a97f992c38edeab82d4110"

Deploy:

npm run deploy-all custom

Verify:

npx hardhat --network custom etherscan-verify --api-url https://explorer.mainnet.bitfinity.network/api

Documentation

Audits/ Formal Verification

Security and Liability

All contracts are WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

License

All smart contracts are released under LGPL-3.0

Bitfinity Addresses

CONTRACT ADDRESS
CompatibilityFallbackHandler 0x821559E468b2c1266af2402cE4Ff87C26c07D66a
CreateCall 0x6D8B0B3112B1DdF01D8cD429801C38a6A2Eea8d2
ExtensibleFallbackHandler 0xa7C790a48Cb2235EB6ee1c78A543Ded1235431f4
MultiSend 0x21fBAdD991F9710f0E07Bc58dd4467B26A970F7F
MultiSendCallOnly 0xf2E372b43a7f8605bf4B6D048c3578cB606A25a5
Safe 0xD41Eb120CfAacce990B510B38DD21ED0BDB3a536
SafeL2 0xAC327762CFc5bFDAc4a4d1ce6d51a2089D0C2fad
SafeMigration 0x7Fb1AC36c2E7EFbE68A521f6bd3d8FE8c04f140d
SafeProxyFactory 0x9c7a0E0DdBF8f53B5432963dA4E77BF843390f6e
SafeToL2Migration 0xBe795af7022e8FDbB8D4A0f9eFf15D7125C35678
SafeToL2Setup 0xd1db2Cc515540e4f68FBcd06B39271aC3d69e8Dd
SignMessageLib 0x9DEe5699E9A26983660640a3C9Be26195BF6Dd02
SimulateTxAccessor 0xe6d6e8f0aE24B576d5393A4252FD33B1B7De53DE
TokenCallbackHandler 0x02e9Ff33b646c3a6A07C0BF6F64880Aadd93B1F8

About

Safe allows secure management of blockchain assets.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • TypeScript 63.2%
  • Solidity 26.1%
  • Python 5.3%
  • JavaScript 4.4%
  • Other 1.0%