Skip to content

Latest commit

 

History

History
243 lines (166 loc) · 9.8 KB

CONTRIBUTING.md

File metadata and controls

243 lines (166 loc) · 9.8 KB

Optimism monorepo contributing guide

🎈 Thanks for your help improving the project! We are so happy to have you!

No contribution is too small and all contributions are valued.

There are plenty of ways to contribute, in particular we appreciate support in the following areas:

Note that we have a Code of Conduct, please follow it in all your interactions with the project.

Workflow for Pull Requests

🚨 Before making any non-trivial change, please first open an issue describing the change to solicit feedback and guidance. This will increase the likelihood of the PR getting merged.

In general, the smaller the diff the easier it will be for us to review quickly.

In order to contribute, fork the appropriate branch, for non-breaking changes to production that is develop and for the next release that is normally release/X.X.X branch, see details about our branching model.

Additionally, if you are writing a new feature, please ensure you add appropriate test cases.

Follow the Development Quick Start to set up your local development environment.

We recommend using the Conventional Commits format on commit messages.

Unless your PR is ready for immediate review and merging, please mark it as 'draft' (or simply do not open a PR yet).

Once ready for review, make sure to include a thorough PR description to help reviewers. You can read more about the guidelines for opening PRs in the PR Guidelines file.

Bonus: Add comments to the diff under the "Files Changed" tab on the PR page to clarify any sections where you think we might have questions about the approach taken.

Response time:

We aim to provide a meaningful response to all PRs and issues from external contributors within 2 business days.

Changesets

We use changesets to manage releases of our various packages. You must include a changeset file in your PR when making a change that would require a new package release.

Adding a changeset file is easy:

  1. Navigate to the root of the monorepo.
  2. Run pnpm changeset. You'll be prompted to select packages to include in the changeset. Use the arrow keys to move the cursor up and down, hit the spacebar to select a package, and hit enter to confirm your selection. Select all packages that require a new release as a result of your PR.
  3. Once you hit enter you'll be prompted to decide whether your selected packages need a major, minor, or patch release. We follow the Semantic Versioning scheme. Please avoid using major releases for any packages that are still in version 0.y.z.
  4. Commit your changeset and push it into your PR. The changeset bot will notice your changeset file and leave a little comment to this effect on GitHub.
  5. Voilà, c'est fini!

Rebasing

We use the git rebase command to keep our commit history tidy. Rebasing is an easy way to make sure that each PR includes a series of clean commits with descriptive commit messages See this tutorial for a detailed explanation of git rebase and how you should use it to maintain a clean commit history.

Development Quick Start

Dependencies

You'll need the following:

Setup

Clone the repository and open it:

git clone git@github.com:ethereum-optimism/optimism.git
cd optimism

Install the Correct Version of NodeJS

Install the correct node version with nvm

nvm use

Install node modules with pnpm

pnpm i

Building the TypeScript packages

foundry is used for some smart contract development in the monorepo. It is required to build the TypeScript packages and compile the smart contracts. Install foundry here.

To build all of the TypeScript packages, run:

pnpm clean
pnpm install
pnpm build

Packages compiled when on one branch may not be compatible with packages on a different branch. You should recompile all packages whenever you move from one branch to another. Use the above commands to recompile the packages.

Building the rest of the system

If you want to run an Optimism node OR if you want to run the integration tests, you'll need to build the rest of the system. Note that these environment variables significantly speed up build time.

cd ops-bedrock
export COMPOSE_DOCKER_CLI_BUILD=1
export DOCKER_BUILDKIT=1
docker compose build

Source code changes can have an impact on more than one container. If you're unsure about which containers to rebuild, just rebuild them all:

cd ops-bedrock
docker compose down
docker compose build
docker compose up

If a node process exits with exit code: 137 you may need to increase the default memory limit of docker containers

Finally, if you're running into weird problems and nothing seems to be working, run:

cd optimism
pnpm clean
pnpm install
pnpm build
cd ops
docker compose down -v
docker compose build
docker compose up

Viewing docker container logs

By default, the docker compose up command will show logs from all services, and that can be hard to filter through. In order to view the logs from a specific service, you can run:

docker compose logs --follow <service name>

Running tests

Before running tests: follow the above instructions to get everything built.

Running unit tests (typescript)

Run unit tests for all packages in parallel via:

pnpm test

To run unit tests for a specific package:

cd packages/package-to-test
pnpm test

Running unit tests (Go)

Change directory to the package you want to run tests for. Then:

go test ./...

Running e2e tests (Go)

See this document

Running contract static analysis

We perform static analysis with slither. You must have Python 3.x installed to run slither. To run slither locally, do:

cd packages/contracts-bedrock
pip3 install slither-analyzer
pnpm slither

Labels

Labels are divided into categories with their descriptions annotated as <Category Name>: <description>.

The following are a comprehensive list of label categories.

  • Area labels (A-): Denote the general area for the related issue or PR changes.
  • Category labels (C-): Contextualize the type of issue or change.
  • Meta labels (M-): These add context to the issues or prs themselves primarily relating to process.
  • Difficulty labels (D-): Describe the associated implementation's difficulty level.
  • Status labels (S-): Specify the status of an issue or pr.

Labels also provide a versatile filter for finding tickets that need help or are open for assignment. This makes them a great tool for contributors!

Filtering for Work

To find tickets available for external contribution, take a look at the https://github.com/ethereum-optimism/optimism/labels/M-community label.

You can filter by the https://github.com/ethereum-optimism/optimism/labels/D-good-first-issue label to find issues that are intended to be easy to implement or fix.

Also, all labels can be seen by visiting the labels page

Modifying Labels

When altering label names or deleting labels there are a few things you must be aware of.