From cb7dbf8297643b1b41345435fff810eaddec49be Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Thu, 9 Jun 2022 19:58:26 -0300 Subject: [PATCH 1/8] Disable coverage on upgradeable repository --- .github/workflows/checks.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index b0f8a8916..7e22a1fd5 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -35,6 +35,7 @@ jobs: - run: npm run test:generation coverage: + if: github.repository != 'OpenZeppelin/openzeppelin-contracts-upgradeable' runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 From c10a097fa884ba8597b50a77fb9b8f5cf3322e9a Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Fri, 10 Jun 2022 16:37:52 -0300 Subject: [PATCH 2/8] Disable all checks but tests on upgradeable repository --- .github/workflows/checks.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 7e22a1fd5..d6b55fa2e 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -14,6 +14,7 @@ concurrency: jobs: lint: + if: github.repository != 'OpenZeppelin/openzeppelin-contracts-upgradeable' runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 @@ -47,6 +48,7 @@ jobs: - uses: codecov/codecov-action@v3 slither: + if: github.repository != 'OpenZeppelin/openzeppelin-contracts-upgradeable' runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 From 429b2242d8e7dedec5e69e7e2065d33e0fc76dc4 Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Fri, 10 Jun 2022 18:13:47 -0300 Subject: [PATCH 3/8] Disable test for updated generated code on upgradeable contracts --- .github/workflows/checks.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index d6b55fa2e..1800f12a1 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -34,6 +34,7 @@ jobs: ENABLE_GAS_REPORT: true - run: npm run test:inheritance - run: npm run test:generation + if: github.repository != 'OpenZeppelin/openzeppelin-contracts-upgradeable' coverage: if: github.repository != 'OpenZeppelin/openzeppelin-contracts-upgradeable' From 4135bf970744231a57872586b966385cd286dd88 Mon Sep 17 00:00:00 2001 From: Andrew Fleming Date: Sat, 11 Jun 2022 03:31:30 -0400 Subject: [PATCH 4/8] Fix typos in timelock test (#3461) fix typos --- test/governance/TimelockController.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/governance/TimelockController.test.js b/test/governance/TimelockController.test.js index 12abcac8c..2274bb0a4 100644 --- a/test/governance/TimelockController.test.js +++ b/test/governance/TimelockController.test.js @@ -201,7 +201,7 @@ contract('TimelockController', function (accounts) { ); }); - it('prevent non-proposer from commiting', async function () { + it('prevent non-proposer from committing', async function () { await expectRevert( this.mock.schedule( this.operation.target, @@ -438,7 +438,7 @@ contract('TimelockController', function (accounts) { ); }); - it('prevent non-proposer from commiting', async function () { + it('prevent non-proposer from committing', async function () { await expectRevert( this.mock.scheduleBatch( this.operation.targets, From 5a0bff465d4384189cf284cbeafef05c013e98c8 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Mon, 13 Jun 2022 17:16:37 +0200 Subject: [PATCH 5/8] Enable the YUL IR pipeline when building with optimisations (#3279) --- hardhat.config.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/hardhat.config.js b/hardhat.config.js index 1fbf856b2..4a0676fd5 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -30,10 +30,15 @@ const argv = require('yargs/yargs')() choices: [ 'production', 'development' ], default: 'development', }, + ir: { + alias: 'enableIR', + type: 'boolean', + default: false, + }, compiler: { alias: 'compileVersion', type: 'string', - default: '0.8.9', + default: '0.8.13', }, coinmarketcap: { alias: 'coinmarketcapApiKey', @@ -65,6 +70,7 @@ module.exports = { enabled: withOptimizations, runs: 200, }, + viaIR: withOptimizations && argv.ir, }, }, networks: { From a55b7d13722e7ce850b626da2313f3e66ca1d101 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Tue, 14 Jun 2022 11:39:01 +0200 Subject: [PATCH 6/8] Rename ERC20TokenizedVault to ERC4626 (#3467) --- CHANGELOG.md | 2 +- .../{ERC20TokenizedVaultMock.sol => ERC4626Mock.sol} | 6 +++--- contracts/token/ERC20/README.adoc | 4 ++-- .../{ERC20TokenizedVault.sol => ERC4626.sol} | 10 +++++----- .../{ERC20TokenizedVault.test.js => ERC4626.test.js} | 10 +++++----- 5 files changed, 16 insertions(+), 16 deletions(-) rename contracts/mocks/{ERC20TokenizedVaultMock.sol => ERC4626Mock.sol} (69%) rename contracts/token/ERC20/extensions/{ERC20TokenizedVault.sol => ERC4626.sol} (94%) rename test/token/ERC20/extensions/{ERC20TokenizedVault.test.js => ERC4626.test.js} (98%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6bb906218..1ee50f71f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,7 @@ * `TimelockController`: Migrate `_call` to `_execute` and allow inheritance and overriding similar to `Governor`. ([#3317](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3317)) * `CrossChainEnabledPolygonChild`: replace the `require` statement with the custom error `NotCrossChainCall`. ([#3380](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3380)) * `ERC20FlashMint`: Add customizable flash fee receiver. ([#3327](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3327)) - * `ERC20TokenizedVault`: add an extension of `ERC20` that implements the ERC4626 Tokenized Vault Standard. ([#3171](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3171)) + * `ERC4626`: add an extension of `ERC20` that implements the ERC4626 Tokenized Vault Standard. ([#3171](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3171)) * `SafeERC20`: add `safePermit` as mitigation against phantom permit functions. ([#3280](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3280)) * `Math`: add a `mulDiv` function that can round the result either up or down. ([#3171](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3171)) * `Math`: Add a `sqrt` function to compute square roots of integers, rounding either up or down. ([#3242](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3242)) diff --git a/contracts/mocks/ERC20TokenizedVaultMock.sol b/contracts/mocks/ERC4626Mock.sol similarity index 69% rename from contracts/mocks/ERC20TokenizedVaultMock.sol rename to contracts/mocks/ERC4626Mock.sol index 1aabd94ef..71cefacaa 100644 --- a/contracts/mocks/ERC20TokenizedVaultMock.sol +++ b/contracts/mocks/ERC4626Mock.sol @@ -2,15 +2,15 @@ pragma solidity ^0.8.0; -import "../token/ERC20/extensions/ERC20TokenizedVault.sol"; +import "../token/ERC20/extensions/ERC4626.sol"; // mock class using ERC20 -contract ERC20TokenizedVaultMock is ERC20TokenizedVault { +contract ERC4626Mock is ERC4626 { constructor( IERC20Metadata asset, string memory name, string memory symbol - ) ERC20(name, symbol) ERC20TokenizedVault(asset) {} + ) ERC20(name, symbol) ERC4626(asset) {} function mockMint(address account, uint256 amount) public { _mint(account, amount); diff --git a/contracts/token/ERC20/README.adoc b/contracts/token/ERC20/README.adoc index dd1845f07..ae2ce3644 100644 --- a/contracts/token/ERC20/README.adoc +++ b/contracts/token/ERC20/README.adoc @@ -24,7 +24,7 @@ Additionally there are multiple custom extensions, including: * {ERC20Votes}: support for voting and vote delegation. * {ERC20VotesComp}: support for voting and vote delegation (compatible with Compound's token, with uint96 restrictions). * {ERC20Wrapper}: wrapper to create an ERC20 backed by another ERC20, with deposit and withdraw methods. Useful in conjunction with {ERC20Votes}. -* {ERC20TokenizedVault}: tokenized vault that manages shares (represented as ERC20) that are backed by assets (another ERC20). +* {ERC4626}: tokenized vault that manages shares (represented as ERC20) that are backed by assets (another ERC20). Finally, there are some utilities to interact with ERC20 contracts in various ways. @@ -63,7 +63,7 @@ NOTE: This core set of contracts is designed to be unopinionated, allowing devel {{ERC20FlashMint}} -{{ERC20TokenizedVault}} +{{ERC4626}} == Draft EIPs diff --git a/contracts/token/ERC20/extensions/ERC20TokenizedVault.sol b/contracts/token/ERC20/extensions/ERC4626.sol similarity index 94% rename from contracts/token/ERC20/extensions/ERC20TokenizedVault.sol rename to contracts/token/ERC20/extensions/ERC4626.sol index e1aaab83e..b3aaa1a11 100644 --- a/contracts/token/ERC20/extensions/ERC20TokenizedVault.sol +++ b/contracts/token/ERC20/extensions/ERC4626.sol @@ -18,7 +18,7 @@ import "../../../utils/math/Math.sol"; * * _Available since v4.7._ */ -abstract contract ERC20TokenizedVault is ERC20, IERC4626 { +abstract contract ERC4626 is ERC20, IERC4626 { using Math for uint256; IERC20Metadata private immutable _asset; @@ -92,7 +92,7 @@ abstract contract ERC20TokenizedVault is ERC20, IERC4626 { /** @dev See {IERC4262-deposit} */ function deposit(uint256 assets, address receiver) public virtual override returns (uint256) { - require(assets <= maxDeposit(receiver), "ERC20TokenizedVault: deposit more than max"); + require(assets <= maxDeposit(receiver), "ERC4626: deposit more than max"); uint256 shares = previewDeposit(assets); _deposit(_msgSender(), receiver, assets, shares); @@ -102,7 +102,7 @@ abstract contract ERC20TokenizedVault is ERC20, IERC4626 { /** @dev See {IERC4262-mint} */ function mint(uint256 shares, address receiver) public virtual override returns (uint256) { - require(shares <= maxMint(receiver), "ERC20TokenizedVault: mint more than max"); + require(shares <= maxMint(receiver), "ERC4626: mint more than max"); uint256 assets = previewMint(shares); _deposit(_msgSender(), receiver, assets, shares); @@ -116,7 +116,7 @@ abstract contract ERC20TokenizedVault is ERC20, IERC4626 { address receiver, address owner ) public virtual override returns (uint256) { - require(assets <= maxWithdraw(owner), "ERC20TokenizedVault: withdraw more than max"); + require(assets <= maxWithdraw(owner), "ERC4626: withdraw more than max"); uint256 shares = previewWithdraw(assets); _withdraw(_msgSender(), receiver, owner, assets, shares); @@ -130,7 +130,7 @@ abstract contract ERC20TokenizedVault is ERC20, IERC4626 { address receiver, address owner ) public virtual override returns (uint256) { - require(shares <= maxRedeem(owner), "ERC20TokenizedVault: redeem more than max"); + require(shares <= maxRedeem(owner), "ERC4626: redeem more than max"); uint256 assets = previewRedeem(shares); _withdraw(_msgSender(), receiver, owner, assets, shares); diff --git a/test/token/ERC20/extensions/ERC20TokenizedVault.test.js b/test/token/ERC20/extensions/ERC4626.test.js similarity index 98% rename from test/token/ERC20/extensions/ERC20TokenizedVault.test.js rename to test/token/ERC20/extensions/ERC4626.test.js index 0c20570d7..63b995f40 100644 --- a/test/token/ERC20/extensions/ERC20TokenizedVault.test.js +++ b/test/token/ERC20/extensions/ERC4626.test.js @@ -2,12 +2,12 @@ const { BN, constants, expectEvent, expectRevert } = require('@openzeppelin/test const { expect } = require('chai'); const ERC20DecimalsMock = artifacts.require('ERC20DecimalsMock'); -const ERC20TokenizedVaultMock = artifacts.require('ERC20TokenizedVaultMock'); +const ERC4626Mock = artifacts.require('ERC4626Mock'); const parseToken = (token) => (new BN(token)).mul(new BN('1000000000000')); const parseShare = (share) => (new BN(share)).mul(new BN('1000000000000000000')); -contract('ERC20TokenizedVault', function (accounts) { +contract('ERC4626', function (accounts) { const [ holder, recipient, spender, other, user1, user2 ] = accounts; const name = 'My Token'; @@ -15,7 +15,7 @@ contract('ERC20TokenizedVault', function (accounts) { beforeEach(async function () { this.token = await ERC20DecimalsMock.new(name, symbol, 12); - this.vault = await ERC20TokenizedVaultMock.new(this.token.address, name + ' Vault', symbol + 'V'); + this.vault = await ERC4626Mock.new(this.token.address, name + ' Vault', symbol + 'V'); await this.token.mint(holder, web3.utils.toWei('100')); await this.token.approve(this.vault.address, constants.MAX_UINT256, { from: holder }); @@ -227,7 +227,7 @@ contract('ERC20TokenizedVault', function (accounts) { await expectRevert.unspecified(this.vault.previewDeposit(parseToken(1))); await expectRevert( this.vault.deposit(parseToken(1), recipient, { from: holder }), - 'ERC20TokenizedVault: deposit more than max', + 'ERC4626: deposit more than max', ); }); @@ -400,7 +400,7 @@ contract('ERC20TokenizedVault', function (accounts) { it('multiple mint, deposit, redeem & withdrawal', async function () { // test designed with both asset using similar decimals this.token = await ERC20DecimalsMock.new(name, symbol, 18); - this.vault = await ERC20TokenizedVaultMock.new(this.token.address, name + ' Vault', symbol + 'V'); + this.vault = await ERC4626Mock.new(this.token.address, name + ' Vault', symbol + 'V'); await this.token.mint(user1, 4000); await this.token.mint(user2, 7001); From ed704d82b3eeb7f397d65e8132bf0d557cd1df23 Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Tue, 14 Jun 2022 15:31:26 -0300 Subject: [PATCH 7/8] Output diff when test:generation fails --- scripts/checks/generation.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/checks/generation.sh b/scripts/checks/generation.sh index 165c35a06..dc6751ff9 100755 --- a/scripts/checks/generation.sh +++ b/scripts/checks/generation.sh @@ -3,4 +3,4 @@ set -euo pipefail npm run generate -git diff --quiet --exit-code +git diff --exit-code From 109778c17c7020618ea4e035efb9f0f9b82d43ca Mon Sep 17 00:00:00 2001 From: Francisco Giordano Date: Tue, 14 Jun 2022 15:38:04 -0300 Subject: [PATCH 8/8] Fix check for generated code when last updated is a release candidate --- scripts/checks/generation.sh | 2 +- scripts/generate/run.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/checks/generation.sh b/scripts/checks/generation.sh index dc6751ff9..00d609f94 100755 --- a/scripts/checks/generation.sh +++ b/scripts/checks/generation.sh @@ -3,4 +3,4 @@ set -euo pipefail npm run generate -git diff --exit-code +git diff -R --exit-code diff --git a/scripts/generate/run.js b/scripts/generate/run.js index 5ebb1b37a..0072653d0 100755 --- a/scripts/generate/run.js +++ b/scripts/generate/run.js @@ -7,7 +7,7 @@ function getVersion (path) { try { return fs .readFileSync(path, 'utf8') - .match(/\/\/ OpenZeppelin Contracts \(last updated v\d+\.\d+\.\d+\)/)[0]; + .match(/\/\/ OpenZeppelin Contracts \(last updated v[^)]+\)/)[0]; } catch (err) { return null; }