* WIP: add `chainId` with default value to `AddressBookEntry` * WIP: first approach to the new AB structure and data persistence in localStorage * migrate AB * migrate AB actions * migrate AB reducers * update AB selectors * update AB middlewares * update AB utils * update AB model file * migrate AB usage to the new structure * change AB notification key name * fixes after rebase * add `addressBookBatchLoad` action * create a selector for owners with AB data `safeOwnersWithAddressBookDataSelector` * migrate safe->owners structure * make `name` and `address` mandatory for `makeAddressBookEntry` * filter out invalid AB names before storing them * review Load & Open flow for owner's names * update owners' reducers and actions - `editSafeOwner` no longer necessary as there's no name change in the owners' list * create AB map-like selector chainId -> address -> name * auto-complete owner's name if it exist in the AB * update replace owner modal and remove REPLACE_SAFE_OWNER - no longer optimistically update the owner's list if threshold === 1, as it behaves erratically with the constant update from data provided by the services - `REPLACE_SAFE_OWNER` no longer necessary * update remove owner modal and remove REMOVE_SAFE_OWNER - no longer optimistically update the owner's list if threshold === 1, as it behaves erratically with the constant update from data provided by the services - `REMOVE_SAFE_OWNER` no longer necessary * update add owner modal and remove ADD_SAFE_OWNER - no longer optimistically update the owner's list if tx is signed, as it behaves erratically with the constant update from data provided by the services - `ADD_SAFE_OWNER` no longer necessary * update yarn.lock after rebase * fix AddressBookMap type * create a migration function for safe's names * create selectors that require safe's name * remove `name` from the safe model and update related code * JSON.parse if JSON.parsed string returned a string instead of a JSON * remove commented lines * rename BATCH_LOAD to SAFE_LOAD * refactor AddressBookMap to `chainId`->`address`->`AddressBookEntry` * make `chainId` optional for `getNameFromAddressBookSelector` * use `addressBookMapSelector` for a more direct AddressBook entry name lookup * remove `loadedSafeViaUrl` flag, and rely on address book entry instead * replace `addAddressBookEntry` action with `addressBookAddOrUpdate`
Gnosis Safe
The most trusted platform to store digital assets on Ethereum. More info at gnosis-safe.io
This repository contains the code for the frontend code hosted at [https://gnosis-safe.io/app/]
Besides the Ethereum Mainnet, the following networks are supported:
For technical information please refer to the Gnosis Developer Portal.
For support requests, please open up a bug issue or reach out via Discord.
Getting Started
These instructions will get you a copy of the project up and running on your local machine for development and testing purposes. See Deployment for notes on how to deploy the project on a live system.
Prerequisites
What you need to install globally:
yarn global add truffle ganache-cli
We use yarn in our infrastructure, so we decided to go with yarn in the README
Installing and running
Install dependencies for the project:
yarn install
To use the Rinkeby services:
yarn start
If you prefer using the Mainnet ones:
yarn start-mainnet
Environment variables
The app grabs environment variables from the .env file. Copy our template to your own local file:
cp .env.example .env
To execute transactions, you'll need to create an Infura project and set the project ID in the .env you've just created:
REACT_APP_INFURA_TOKEN=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Once done, you'll need to restart the app.
Building
For Rinkeby:
yarn build
For Mainnet:
yarn build-mainnet
Running the tests
- Run
transaction-history-service
git clone https://github.com/gnosis/safe-transaction-service.git
cd safe-transaction-service
git checkout develop
docker-compose build
# it comes enabled by default in docker-compose
sudo service postgresql stop
docker-compose up -d
Check that the service is running at https://localhost:8000
- Migrate Safe Contracts:
git clone https://github.com/gnosis/safe-contracts.git
cd safe-contracts
yarn
npx truffle migrate
- Migrate Token Contracts for the tests:
Inside
safe-reactdirectory
npx truffle migrate
- Run the tests:
yarn test
Lint
ESLint will be run automatically before you commit. To run it manually:
yarn lint:fix
Deployment
The code is deployed to a testing website automatically on each push via a GitHub Action. The GitHub Action will create a new subdomain and post the link as a comment in the PR.
When pushing to the master branch, the code will be uploaded to the production bucket but not deployed automatically.
This is done manually by the devops team for extra safety.
Releasing to production
We prepare a new release every sprint. Sprints are two weeks long.
- A separate code-freeze branch named
release/X.Y.Zis created - The QA team do regression testing on this branch
- If issues are found, bugfixes are merged into this branch
- Once the QA is done, we push the branch to
master(which is deployed to production) - Master is afterwards backmerged into the main
developmentbranch.
Configuring the app for running on different networks
Please check the network configuration documentation
Built With
- Truffle React Box - The web framework used
- Ganache - Fast Ethereum RPC client
- React - A JS library for building user interfaces
- Material UI 4.X - React components that implement Google's Material Design
- redux, immutable, reselect, final-form - React ecosystem libraries
Contributing
Please read CONTRIBUTING.md for details on our code of conduct, and the process for submitting pull requests to us.
Versioning
We use SemVer for versioning. For the versions available, see the tags on this repository.
License
This project is licensed under the MIT License - see the LICENSE.md file for details