Commit 2030235e by github-actions

Merge upstream openzeppelin-contracts into upstream-patched

parents 72289cf6 7c1625b0
......@@ -9,18 +9,8 @@ import "../token/ERC721/ERC721.sol";
* This mock just provides a public safeMint, mint, and burn functions for testing purposes
*/
contract ERC721Mock is ERC721 {
string private _baseTokenURI;
constructor (string memory name, string memory symbol) ERC721(name, symbol) { }
function _baseURI() internal view virtual override returns (string memory) {
return _baseTokenURI;
}
function setBaseURI(string calldata newBaseTokenURI) public {
_baseTokenURI = newBaseTokenURI;
}
function baseURI() public view returns (string memory) {
return _baseURI();
}
......
......@@ -39,7 +39,7 @@ NOTE: This core set of contracts is designed to be unopinionated, allowing devel
{{ERC721Burnable}}
{{ERC721TokenUri}}
{{ERC721URIStorage}}
== Presets
......
......@@ -5,7 +5,7 @@ pragma solidity ^0.8.0;
import "../ERC721.sol";
/**
* @dev ERC721 token with storage based token uri management.
* @dev ERC721 token with storage based token URI management.
*/
abstract contract ERC721URIStorage is ERC721 {
using Strings for uint256;
......
......@@ -368,6 +368,36 @@ contract('TimelockController', function (accounts) {
);
});
it('length of batch parameter must match #1', async function () {
await expectRevert(
this.timelock.scheduleBatch(
this.operation.targets,
[],
this.operation.datas,
this.operation.predecessor,
this.operation.salt,
MINDELAY,
{ from: proposer },
),
'TimelockController: length mismatch',
);
});
it('length of batch parameter must match #1', async function () {
await expectRevert(
this.timelock.scheduleBatch(
this.operation.targets,
this.operation.values,
[],
this.operation.predecessor,
this.operation.salt,
MINDELAY,
{ from: proposer },
),
'TimelockController: length mismatch',
);
});
it('prevent non-proposer from commiting', async function () {
await expectRevert(
this.timelock.scheduleBatch(
......@@ -623,6 +653,13 @@ contract('TimelockController', function (accounts) {
expectEvent(receipt, 'Cancelled', { id: this.operation.id });
});
it('cannot cancel invalid operation', async function () {
await expectRevert(
this.timelock.cancel(constants.ZERO_BYTES32, { from: proposer }),
'TimelockController: operation cannot be cancelled',
);
});
it('prevent non-proposer from canceling', async function () {
await expectRevert(
this.timelock.cancel(this.operation.id, { from: other }),
......
......@@ -35,6 +35,10 @@ contract('ProxyAdmin', function (accounts) {
const admin = await this.proxyAdmin.getProxyAdmin(this.proxy.address);
expect(admin).to.be.equal(this.proxyAdmin.address);
});
it('call to invalid proxy', async function () {
await expectRevert.unspecified(this.proxyAdmin.getProxyAdmin(this.implementationV1.address));
});
});
describe('#changeProxyAdmin', function () {
......@@ -56,6 +60,10 @@ contract('ProxyAdmin', function (accounts) {
const implementationAddress = await this.proxyAdmin.getProxyImplementation(this.proxy.address);
expect(implementationAddress).to.be.equal(this.implementationV1.address);
});
it('call to invalid proxy', async function () {
await expectRevert.unspecified(this.proxyAdmin.getProxyImplementation(this.implementationV1.address));
});
});
describe('#upgrade', function () {
......
......@@ -11,6 +11,12 @@ contract('ReentrancyGuard', function (accounts) {
expect(await this.reentrancyMock.counter()).to.be.bignumber.equal('0');
});
it('nonReentrant function can be called', async function () {
expect(await this.reentrancyMock.counter()).to.be.bignumber.equal('0');
await this.reentrancyMock.callback();
expect(await this.reentrancyMock.counter()).to.be.bignumber.equal('1');
});
it('does not allow remote callback', async function () {
const attacker = await ReentrancyAttack.new();
await expectRevert(
......
......@@ -120,6 +120,15 @@ contract('ERC1155PresetMinterPauser', function (accounts) {
'ERC1155PresetMinterPauser: must have pauser role to pause',
);
});
it('other accounts cannot unpause', async function () {
await this.token.pause({ from: deployer });
await expectRevert(
this.token.unpause({ from: other }),
'ERC1155PresetMinterPauser: must have pauser role to unpause',
);
});
});
describe('burning', function () {
......
......@@ -84,7 +84,19 @@ contract('ERC20PresetMinterPauser', function (accounts) {
});
it('other accounts cannot pause', async function () {
await expectRevert(this.token.pause({ from: other }), 'ERC20PresetMinterPauser: must have pauser role to pause');
await expectRevert(
this.token.pause({ from: other }),
'ERC20PresetMinterPauser: must have pauser role to pause',
);
});
it('other accounts cannot unpause', async function () {
await this.token.pause({ from: deployer });
await expectRevert(
this.token.unpause({ from: other }),
'ERC20PresetMinterPauser: must have pauser role to unpause',
);
});
});
......
......@@ -73,6 +73,15 @@ contract('ERC721URIStorage', function (accounts) {
expect(await this.token.tokenURI(firstTokenId)).to.be.equal(baseURI + firstTokenId);
});
it('tokens without URI can be burnt ', async function () {
await this.token.burn(firstTokenId, { from: owner });
expect(await this.token.exists(firstTokenId)).to.equal(false);
await expectRevert(
this.token.tokenURI(firstTokenId), 'ERC721URIStorage: URI query for nonexistent token',
);
});
it('tokens with URI can be burnt ', async function () {
await this.token.setTokenURI(firstTokenId, sampleUri);
......
......@@ -97,6 +97,15 @@ contract('ERC721PresetMinterPauserAutoId', function (accounts) {
'ERC721PresetMinterPauserAutoId: must have pauser role to pause',
);
});
it('other accounts cannot unpause', async function () {
await this.token.pause({ from: deployer });
await expectRevert(
this.token.unpause({ from: other }),
'ERC721PresetMinterPauserAutoId: must have pauser role to unpause',
);
});
});
describe('burning', function () {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment