Skip to content

Commit

Permalink
Merge pull request #895 from fei-protocol/release/v2.12.0
Browse files Browse the repository at this point in the history
Release/v2.12.0
  • Loading branch information
eswak authored Jun 27, 2022
2 parents b3dcd61 + 28e5a05 commit 3ae5ce4
Show file tree
Hide file tree
Showing 156 changed files with 6,080 additions and 4,298 deletions.
File renamed without changes.
27 changes: 27 additions & 0 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# PR Type: Feature|Bug|Release

# PR Title: A Fancy Title Here Please

### PR Description: Replace this text with a description of the PR. It doesn't need to be a novel, but a few sentences should do. Probably about the length of this sample description; perhaps longer if there are enough details. By the way, make sure to delete the checklists not applicable below. Praise Vitalik.

### PR Checklist - Feature (Proposal)

- [ ] All Tests Passing
- [ ] Proposal Added to ProposalsConfig
- [ ] Fork Block Correct
- [ ] Remove Any .only's on Tests
- [ ] Update Documentation If Needed
- [ ] Update Roles Config
- [ ] Proposal Submitted

### PR Checklist - Feature (Non-Proposal) | Bug

- [ ] All Tests Passing
- [ ] Remove Any .only's on Tests

### PR Checklist - Release

- [ ] All Tests Passing
- [ ] Clean/Empty Proposals Config
- [ ] Update Fork Block
- [ ] Update Docs If Needed
68 changes: 41 additions & 27 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,57 +3,71 @@
Smart contract code for Fei Protocol and the FEI stablecoin

## To get started:

1. Git clone this repo: git clone git@github.com:fei-protocol/fei-protocol-core.git
2. Install dependencies: `npm install`
3. Set the relevant environment variables in a gitignored `.env`: `MAINNET_ALCHEMY_API_KEY` and `ETH_PRIVATE_KEY`. You can use the `.env.example` as a base
4. To run the Hardhat based unit tests, run `npm run test:hardhat`

### Setting up Forge

Fei makes use of Forge as a smart contract development framework alongside Hardhat. To set this up run: `npm run setup`

## Dependencies
Note that this has only been tested on Linux; you may encounter issues running on other operating systems.

- Node v12 or v16 (you can manage Node versions easily with [NVM](https://github.com/nvm-sh/nvm))

Note that this has only been tested on Linux; you may encounter issues running on other operating systems.

- Node v12 or v16 (you can manage Node versions easily with [NVM](https://github.com/nvm-sh/nvm))

## Usage
- run `npm run test` to run Forge based unit tests
- run `npm run test:hardhat` to run Hardhat based unit tests
- run `npm run test:integration` to run Solidity integration tests, forked from a pinned Mainnet block
- run `npm run test:integration:latest` to run Solidity integration tests, forked from the latest block
- run `npm run test:e2e` to run end-to-end/integration tests
- run `npm run test:all` to run all tests
- run `npm run lint` to lint ts files and sol files
- run `npm lint:all` to lint ts AND js files
- run `npm run lint:sol` to lint .sol files
- run `npm run lint:fix` to fix linting errors, if fixable automatically
- run `npm run prettier:ts` to run prettier and automatically format all ts files
automatically
- run `npm run prettier:sol` to run prettier and automatically format all Solidity files
automatically
- run `npm run prettier` to run prettier and format all files
- run `npm run coverage:hardhat` to run smart-contract coverage based off of all tests
- run `npm run calldata` to generage calldata for a proposal
- run `npm run check-proposal` to run tests for a specific dao proposal
- run `npm run compile` to compile smart contracts, if needed

- run `npm run test` to run Forge based unit tests
- run `npm run test:hardhat` to run Hardhat based unit tests
- run `npm run test:integration` to run Solidity integration tests, forked from a pinned Mainnet block
- run `npm run test:integration:latest` to run Solidity integration tests, forked from the latest block
- run `npm run test:e2e` to run end-to-end/integration tests
- run `npm run test:all` to run all tests
- run `npm run lint` to lint ts files and sol files
- run `npm lint:all` to lint ts AND js files
- run `npm run lint:sol` to lint .sol files
- run `npm run lint:fix` to fix linting errors, if fixable automatically
- run `npm run prettier:ts` to run prettier and automatically format all ts files
automatically
- run `npm run prettier:sol` to run prettier and automatically format all Solidity files
automatically
- run `npm run prettier` to run prettier and format all files
- run `npm run coverage:hardhat` to run smart-contract coverage based off of all tests
- run `npm run calldata` to generage calldata for a proposal
- run `npm run check-proposal` to run tests for a specific dao proposal
- run `npm run compile` to compile smart contracts, if needed

## Documentation

See the [docs](https://docs.fei.money)

## Release Process

Every Thursday, do the following for the weekly release:

1) Update the current release branch's fixed hardhat block to something within the last hour
2) Clean the release branch if necessary:
### Release Fei-Protocol-Core

1. Update the current release branch's fixed hardhat block to something within the last hour
2. Clean the release branch if necessary:
- fix any failing tests
- clear out proposals-config
3) Merge the release branch into master. Create a release via the github UI, using the version number of the release branch.
4) Merge master back into develop to ensure that any fixes added are pulled back into develop, and so that the hardcoded fork block is set correctly for the most recent release.
5) Create a new branch off of develop of the format release/major.minor.patch, using an incremented minor version number
3. Merge the release branch into master. Create a release via the github UI, using the version number of the release branch.
4. Merge master back into develop to ensure that any fixes added are pulled back into develop, and so that the hardcoded fork block is set correctly for the most recent release.
5. Create a new branch off of develop of the format release/major.minor.patch, using an incremented minor version number

For hotfix releases or bugfixes to master, branch off of master, add in the necessary fixes, and merge back into master.
Then tag that commit with a new release number (increment the patch version number here).
Finally merge master back into develop.

### Release Docs (If Applicable)

1. @Joey should update this, because I am confused about the difference between the gh-pages and the master branch. Which one should we update,
and which one should we run commands on? Also, do we need to change the default branch of this repo?

## License

Fei Protocol is under [the AGPL v3 license](https://github.com/fei-protocol/fei-protocol-core/tree/7160dda163d45e6d6c7092ef021c365e0031a71f/LICENSE.md)
1 change: 1 addition & 0 deletions block.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
14939000
2 changes: 1 addition & 1 deletion contracts/.prettierrc
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@
}
}
]
}
}
2 changes: 1 addition & 1 deletion contracts/core/TribeRoles.sol
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ library TribeRoles {
bytes32 internal constant POD_METADATA_REGISTER_ROLE = keccak256("POD_METADATA_REGISTER_ROLE");

/// @notice capable of engaging with Votium for voting incentives.
bytes32 internal constant VOTIUM_ROLE = keccak256("VOTIUM_ADMIN_ROLE");
bytes32 internal constant VOTIUM_ADMIN_ROLE = keccak256("VOTIUM_ADMIN_ROLE");

/// @notice capable of adding an address to multi rate limited
bytes32 internal constant ADD_MINTER_ROLE = keccak256("ADD_MINTER_ROLE");
Expand Down
2 changes: 1 addition & 1 deletion contracts/dao/nopeDAO/NopeDAO.sol
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ contract NopeDAO is
Governor("NopeDAO")
GovernorSettings(
0, /* 0 blocks */
4 days,
26585, /* 4 days measured in blocks. Assumed 13s block time */
0
)
GovernorVotesComp(_tribe)
Expand Down
122 changes: 122 additions & 0 deletions contracts/external/balancer/IBalancerMinter.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
// SPDX-License-Identifier: GPL-3.0-or-later
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.

// See https://etherscan.io/address/0x239e55F427D44C3cc793f49bFB507ebe76638a2b

pragma solidity ^0.8.4;

interface IBalancerMinter {
event Minted(address indexed recipient, address gauge, uint256 minted);

/**
* @notice Returns the address of the Balancer Governance Token
*/
function getBalancerToken() external view returns (address);

/**
* @notice Returns the address of the Balancer Token Admin contract
*/
function getBalancerTokenAdmin() external view returns (address);

/**
* @notice Returns the address of the Gauge Controller
*/
function getGaugeController() external view returns (address);

/**
* @notice Mint everything which belongs to `msg.sender` and send to them
* @param gauge `LiquidityGauge` address to get mintable amount from
*/
function mint(address gauge) external returns (uint256);

/**
* @notice Mint everything which belongs to `msg.sender` across multiple gauges
* @param gauges List of `LiquidityGauge` addresses
*/
function mintMany(address[] calldata gauges) external returns (uint256);

/**
* @notice Mint tokens for `user`
* @dev Only possible when `msg.sender` has been approved by `user` to mint on their behalf
* @param gauge `LiquidityGauge` address to get mintable amount from
* @param user Address to mint to
*/
function mintFor(address gauge, address user) external returns (uint256);

/**
* @notice Mint tokens for `user` across multiple gauges
* @dev Only possible when `msg.sender` has been approved by `user` to mint on their behalf
* @param gauges List of `LiquidityGauge` addresses
* @param user Address to mint to
*/
function mintManyFor(address[] calldata gauges, address user) external returns (uint256);

/**
* @notice The total number of tokens minted for `user` from `gauge`
*/
function minted(address user, address gauge) external view returns (uint256);

/**
* @notice Whether `minter` is approved to mint tokens for `user`
*/
function getMinterApproval(address minter, address user) external view returns (bool);

/**
* @notice Set whether `minter` is approved to mint tokens on your behalf
*/
function setMinterApproval(address minter, bool approval) external;

/**
* @notice Set whether `minter` is approved to mint tokens on behalf of `user`, who has signed a message authorizing
* them.
*/
function setMinterApprovalWithSignature(
address minter,
bool approval,
address user,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;

// The below functions are near-duplicates of functions available above.
// They are included for ABI compatibility with snake_casing as used in vyper contracts.
// solhint-disable func-name-mixedcase

/**
* @notice Whether `minter` is approved to mint tokens for `user`
*/
function allowed_to_mint_for(address minter, address user) external view returns (bool);

/**
* @notice Mint everything which belongs to `msg.sender` across multiple gauges
* @dev This function is not recommended as `mintMany()` is more flexible and gas efficient
* @param gauges List of `LiquidityGauge` addresses
*/
function mint_many(address[8] calldata gauges) external;

/**
* @notice Mint tokens for `user`
* @dev Only possible when `msg.sender` has been approved by `user` to mint on their behalf
* @param gauge `LiquidityGauge` address to get mintable amount from
* @param user Address to mint to
*/
function mint_for(address gauge, address user) external;

/**
* @notice Toggle whether `minter` is approved to mint tokens for `user`
*/
function toggle_approve_mint(address minter) external;
}
26 changes: 25 additions & 1 deletion contracts/external/fuse/CToken.sol
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,29 @@
pragma solidity ^0.8.4;

abstract contract CToken {
function getCash() external view returns (uint256) {}
function getCash() external view virtual returns (uint256);

function underlying() external view virtual returns (address);

function borrowBalanceCurrent() external virtual returns (uint256);
}

abstract contract CTokenFuse {
function getCash() external view virtual returns (uint256);

function underlying() external view virtual returns (address);

function borrowBalanceCurrent(address debtor) external virtual returns (uint256);

function repayBorrowBehalf(address borrower, uint256 repayAmount) external virtual returns (uint256);
}

abstract contract CEtherFuse {
function getCash() external view virtual returns (uint256);

function underlying() external view virtual returns (address);

function borrowBalanceCurrent(address debtor) external virtual returns (uint256);

function repayBorrowBehalf(address borrower) external payable virtual;
}
2 changes: 1 addition & 1 deletion contracts/fuse/FuseGuardian.sol
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ contract FuseGuardian is CoreRef {
comptroller = _comptroller;
/// @notice The reason we are reusing the tribal chief admin role is it consolidates control in the OA,
/// and means we don't have to do another governance action to create this role in core
_setContractAdminRole(keccak256("TRIBAL_CHIEF_ADMIN_ROLE"));
_setContractAdminRole(keccak256("FUSE_ADMIN"));
}

// ************ BORROW GUARDIAN FUNCTIONS ************
Expand Down
Loading

0 comments on commit 3ae5ce4

Please sign in to comment.