Skip to content

Commit

Permalink
Modernize development environment (#442)
Browse files Browse the repository at this point in the history
## Summary
This PR aims to modernize the development environment in the repository
by
1. replacing Truffle with
[Hardhat](https://github.com/NomicFoundation/hardhat) and
[Foundry](https://github.com/foundry-rs/foundry)
2. updating the CI pipelines to be faster and more comprehensive
3. removing unused code
  • Loading branch information
eztierney committed Apr 1, 2024
2 parents 0828084 + ca48b2c commit 2af605e
Show file tree
Hide file tree
Showing 187 changed files with 7,321 additions and 8,354 deletions.
3 changes: 0 additions & 3 deletions .babelrc

This file was deleted.

81 changes: 81 additions & 0 deletions .env.example
@@ -0,0 +1,81 @@
# Copyright 2024 Circle Internet Financial, LTD. All rights reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

##############################
# Private Key Configurations #
##############################=
# The key to a pre-funded deployer address
DEPLOYER_PRIVATE_KEY=

############################
# FiatToken Configurations #
############################
# The ERC20 name of the FiatToken.
TOKEN_NAME=USDC

# The ERC20 symbol of the FiatToken.
TOKEN_SYMBOL=USDC

# The fiat currency that that FiatToken represents.
TOKEN_CURRENCY=USD

# The ERC20 decimals for the FiatToken.
TOKEN_DECIMALS=6

# [OPTIONAL] The address to a deployed FiatTokenProxy contract.
# FIAT_TOKEN_PROXY_ADDRESS=

# [OPTIONAL] The address to a deployed FiatToken implementation contract.
# FIAT_TOKEN_IMPLEMENTATION_ADDRESS=

# The address of the FiatTokenProxy's admin.
PROXY_ADMIN_ADDRESS=

# The address of the FiatToken's owner.
OWNER_ADDRESS=

# The address of the MasterMinter's owner.
MASTER_MINTER_OWNER_ADDRESS=

# [OPTIONAL] The address of the FiatToken's pauser. Defaults to the owner address.
# PAUSER_ADDRESS=

# [OPTIONAL] The address of the FiatToken's blacklister. Defaults to the owner address.
# BLACKLISTER_ADDRESS=

# [OPTIONAL] The address to which locked funds are sent to. Only applicable for version 2 -> 2.1 upgrades. Defaults to the owner address.
# LOST_AND_FOUND_ADDRESS=

##########################
# Network Configurations #
##########################
# [OPTIONAL] The URL to a mainnet JSON-RPC node.
# MAINNET_RPC_URL=

# [OPTIONAL] The URL to a testnet JSON-RPC node.
# TESTNET_RPC_URL=

# The percentage to multiply gas usage estimations by (eg. 200 to double the estimation). Defaults to 130.
GAS_MULTIPLIER=110

################################
# Miscellaneous Configurations #
################################
# The file name from which to read the list of addresses to blacklist
BLACKLIST_FILE_NAME=blacklist.remote.json

# [OPTIONAL] The API key to an Etherscan flavor block explorer.
# ETHERSCAN_KEY=
16 changes: 14 additions & 2 deletions .eslintignore
@@ -1,4 +1,16 @@
.DS_Store
.idea/
**/.DS_Store

artifacts/
cache/
@types/generated/

node_modules/
yarn-error.log

coverage/
@types/generated/
coverage.json

blacklist.*.json

LICENSE
6 changes: 3 additions & 3 deletions .eslintrc.js
@@ -1,13 +1,13 @@
/**
* SPDX-License-Identifier: Apache-2.0
* Copyright 2023 Circle Internet Financial, LTD. All rights reserved.
*
* Copyright (c) 2023, Circle Internet Financial, LLC.
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
Expand Down
52 changes: 52 additions & 0 deletions .github/composite-actions/setup-ci/action.yml
@@ -0,0 +1,52 @@
# Copyright 2024 Circle Internet Financial, LTD. All rights reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

name: Setup CI
runs:
using: composite
steps:
- name: Install Node
uses: actions/setup-node@v3
with:
node-version: "16.14.0"

- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1

- name: Update submodules
run: git submodule update --init --recursive
shell: bash

- name: Install Yarn
run: npm install -g yarn@1.22.19
shell: bash

- name: Get Yarn cache directory path
id: yarn-cache-dir-path
run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT
shell: bash

- name: Retrieve cache
uses: actions/cache@v3
with:
path: ${{ steps.yarn-cache-dir-path.outputs.dir }}
key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}
restore-keys: |
${{ runner.os }}-yarn-
- name: Install packages & Setup repository
run: yarn install --frozen-lockfile
shell: bash
33 changes: 33 additions & 0 deletions .github/resources/coverage-report-template.md
@@ -0,0 +1,33 @@
<!--
Copyright 2024 Circle Internet Financial, LTD. All rights reserved.
SPDX-License-Identifier: Apache-2.0
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

## Coverage Report

Commit: [{{short_commit_sha}}]({{commit_link}})

| Type | Coverage |
| ------------------------- | ------------------------------------- |
| Total Statements Coverage | {{total_statements_coverage_percent}} |
| Total Branches Coverage | {{total_branches_coverage_percent}} |
| Total Functions Coverage | {{total_functions_coverage_percent}} |
| Total Lines Coverage | {{total_lines_coverage_percent}} |

<details>
<summary>Details </summary>
{{files_coverage_table}}
</details>
97 changes: 79 additions & 18 deletions .github/workflows/ci.yml
@@ -1,4 +1,20 @@
name: Continuous Integration
# Copyright 2024 Circle Internet Financial, LTD. All rights reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

name: CI
on:
push:
branches: [master]
Expand All @@ -11,35 +27,80 @@ jobs:
- name: Check out repository code
uses: actions/checkout@v3

- name: Install Node
uses: actions/setup-node@v3
with:
node-version: "16.14.0"

- name: Install Yarn
run: npm install -g yarn@1.22.19
- name: Setup CI Environment
uses: ./.github/composite-actions/setup-ci

- name: Install packages
run: yarn install --frozen-lockfile

- name: Setup local environment
run: cp config.js.example config.js && ./start-ganache.sh
- name: Compile contracts
run: yarn compile

- name: Run static checks
run: yarn static-check

- name: Run size check
run: yarn contract-size

- name: Run tests
run: yarn test
- name: Run forge tests
run: forge test -vvv

- name: Generate gas report
run: yarn gas-report
env:
ENABLE_GAS_REPORTER: true

run_hardhat_tests:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
test-groups:
- grep: "FiatTokenV1:.*"
- grep: "FiatTokenV1_1:.*"
- grep: "FiatTokenV2:.*"
- grep: "FiatTokenV2_1:.*"
- grep: "FiatTokenV2_2:.*"
- grep: "FiatTokenV1:.*|FiatTokenV1_1:.*|FiatTokenV2:.*|FiatTokenV2_1:.*|FiatTokenV2_2:.*|gas costs"
invert: true
steps:
- name: Check out repository code
uses: actions/checkout@v3

- name: Setup CI Environment
uses: ./.github/composite-actions/setup-ci

- name: Run hardhat tests
run: HARDHAT_TEST_GREP='${{ matrix.test-groups.grep }}' HARDHAT_TEST_INVERT='${{ matrix.test-groups.invert }}' yarn test

- name: Upload test results to artifacts
if: always()
uses: actions/upload-artifact@v4
with:
name: junit-report-${{ hashFiles('report/junit.xml') }}
path: report/junit.xml

post_run_hardhat_tests:
runs-on: ubuntu-latest
needs: [run_hardhat_tests]
if: always()
steps:
- name: Download test results
uses: actions/download-artifact@v4
with:
pattern: junit-report-*

- name: Publish combined test report
uses: mikepenz/action-junit-report@v4
with:
check_name: upload_test_results
job_summary: true
detailed_summary: true
report_paths: "./junit-report-*/junit.xml"

scan:
needs: run_ci_tests
if: github.event_name == 'pull_request'
uses: circlefin/circle-public-github-workflows/.github/workflows/pr-scan.yaml@v1
uses: circlefin/circle-public-github-workflows/.github/workflows/pr-scan.yaml@v1.2.0
with:
allow-reciprocal-licenses: false

release-sbom:
needs: run_ci_tests
if: github.event_name == 'push'
uses: circlefin/circle-public-github-workflows/.github/workflows/attach-release-assets.yaml@v1
60 changes: 60 additions & 0 deletions .github/workflows/coverage.yml
@@ -0,0 +1,60 @@
# Copyright 2024 Circle Internet Financial, LTD. All rights reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

name: Coverage
on:
pull_request:
types: [labeled]

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
run_coverage:
runs-on: ubuntu-latest
if: ${{ github.event.label.name == 'needs_coverage' }}
steps:
- name: Check out repository code
uses: actions/checkout@v3

- name: Setup CI Environment
uses: ./.github/composite-actions/setup-ci

- name: Compile contracts
run: yarn compile

- name: Run coverage
run: yarn coverage

- name: Report coverage to PR
id: report-coverage
uses: sidx1024/report-nyc-coverage-github-action@v1.2.7
with:
coverage_file: "coverage/coverage-summary.json"
base_coverage_file: ""
comment_template_file: ".github/resources/coverage-report-template.md"

- name: Check coverage
if: |
fromJSON(steps.report-coverage.outputs.total_lines_coverage_percent_raw) < 100 ||
fromJSON(steps.report-coverage.outputs.total_branches_coverage_percent_raw) < 98 ||
fromJSON(steps.report-coverage.outputs.total_statements_coverage_percent_raw) < 100 ||
fromJSON(steps.report-coverage.outputs.total_functions_coverage_percent_raw) < 100
uses: actions/github-script@v7
with:
script: |
core.setFailed('Test coverage is under the threshold')

0 comments on commit 2af605e

Please sign in to comment.