Add validation in Governor on ERC-721 or ERC-1155 received (#4314)

Co-authored-by: Hadrien Croubois <hadrien.croubois@gmail.com>
Co-authored-by: Francisco <fg@frang.io>
Co-authored-by: Ernesto García <ernestognw@gmail.com>
This commit is contained in:
Claudia Barcelo
2023-06-16 02:43:17 +02:00
committed by GitHub
parent 6724873895
commit cd48b3eab3
8 changed files with 306 additions and 37 deletions

View File

@ -5,8 +5,10 @@ const { expect } = require('chai');
const { shouldSupportInterfaces } = require('../../utils/introspection/SupportsInterface.behavior');
const { expectRevertCustomError } = require('../../helpers/customError');
const { Enum } = require('../../helpers/enums');
const ERC1155ReceiverMock = artifacts.require('ERC1155ReceiverMock');
const RevertType = Enum('None', 'Empty', 'String', 'Custom');
function shouldBehaveLikeERC1155([minter, firstTokenHolder, secondTokenHolder, multiTokenHolder, recipient, proxy]) {
const firstTokenId = new BN(1);
@ -296,9 +298,9 @@ function shouldBehaveLikeERC1155([minter, firstTokenHolder, secondTokenHolder, m
beforeEach(async function () {
this.receiver = await ERC1155ReceiverMock.new(
RECEIVER_SINGLE_MAGIC_VALUE,
false,
RevertType.None,
RECEIVER_BATCH_MAGIC_VALUE,
false,
RevertType.None,
);
});
@ -370,7 +372,12 @@ function shouldBehaveLikeERC1155([minter, firstTokenHolder, secondTokenHolder, m
context('to a receiver contract returning unexpected value', function () {
beforeEach(async function () {
this.receiver = await ERC1155ReceiverMock.new('0x00c0ffee', false, RECEIVER_BATCH_MAGIC_VALUE, false);
this.receiver = await ERC1155ReceiverMock.new(
'0x00c0ffee',
RevertType.None,
RECEIVER_BATCH_MAGIC_VALUE,
RevertType.None,
);
});
it('reverts', async function () {
@ -385,23 +392,55 @@ function shouldBehaveLikeERC1155([minter, firstTokenHolder, secondTokenHolder, m
});
context('to a receiver contract that reverts', function () {
beforeEach(async function () {
this.receiver = await ERC1155ReceiverMock.new(
it('with empty reason', async function () {
const receiver = await ERC1155ReceiverMock.new(
RECEIVER_SINGLE_MAGIC_VALUE,
true,
RevertType.Empty,
RECEIVER_BATCH_MAGIC_VALUE,
false,
RevertType.None,
);
await expectRevertCustomError(
this.token.safeTransferFrom(multiTokenHolder, receiver.address, firstTokenId, firstAmount, '0x', {
from: multiTokenHolder,
}),
'ERC1155InvalidReceiver',
[receiver.address],
);
});
it('reverts', async function () {
it('with reason string', async function () {
const receiver = await ERC1155ReceiverMock.new(
RECEIVER_SINGLE_MAGIC_VALUE,
RevertType.String,
RECEIVER_BATCH_MAGIC_VALUE,
RevertType.None,
);
await expectRevert(
this.token.safeTransferFrom(multiTokenHolder, this.receiver.address, firstTokenId, firstAmount, '0x', {
this.token.safeTransferFrom(multiTokenHolder, receiver.address, firstTokenId, firstAmount, '0x', {
from: multiTokenHolder,
}),
'ERC1155ReceiverMock: reverting on receive',
);
});
it('with custom error', async function () {
const receiver = await ERC1155ReceiverMock.new(
RECEIVER_SINGLE_MAGIC_VALUE,
RevertType.Custom,
RECEIVER_BATCH_MAGIC_VALUE,
RevertType.None,
);
await expectRevertCustomError(
this.token.safeTransferFrom(multiTokenHolder, receiver.address, firstTokenId, firstAmount, '0x', {
from: multiTokenHolder,
}),
'ERC1155ReceiverMockError',
[],
);
});
});
context('to a contract that does not implement the required function', function () {
@ -590,9 +629,9 @@ function shouldBehaveLikeERC1155([minter, firstTokenHolder, secondTokenHolder, m
beforeEach(async function () {
this.receiver = await ERC1155ReceiverMock.new(
RECEIVER_SINGLE_MAGIC_VALUE,
false,
RevertType.None,
RECEIVER_BATCH_MAGIC_VALUE,
false,
RevertType.None,
);
});
@ -666,9 +705,9 @@ function shouldBehaveLikeERC1155([minter, firstTokenHolder, secondTokenHolder, m
beforeEach(async function () {
this.receiver = await ERC1155ReceiverMock.new(
RECEIVER_SINGLE_MAGIC_VALUE,
false,
RevertType.None,
RECEIVER_SINGLE_MAGIC_VALUE,
false,
RevertType.None,
);
});
@ -689,20 +728,40 @@ function shouldBehaveLikeERC1155([minter, firstTokenHolder, secondTokenHolder, m
});
context('to a receiver contract that reverts', function () {
beforeEach(async function () {
this.receiver = await ERC1155ReceiverMock.new(
it('with empty reason', async function () {
const receiver = await ERC1155ReceiverMock.new(
RECEIVER_SINGLE_MAGIC_VALUE,
false,
RevertType.None,
RECEIVER_BATCH_MAGIC_VALUE,
true,
RevertType.Empty,
);
await expectRevertCustomError(
this.token.safeBatchTransferFrom(
multiTokenHolder,
receiver.address,
[firstTokenId, secondTokenId],
[firstAmount, secondAmount],
'0x',
{ from: multiTokenHolder },
),
'ERC1155InvalidReceiver',
[receiver.address],
);
});
it('reverts', async function () {
it('with reason string', async function () {
const receiver = await ERC1155ReceiverMock.new(
RECEIVER_SINGLE_MAGIC_VALUE,
RevertType.None,
RECEIVER_BATCH_MAGIC_VALUE,
RevertType.String,
);
await expectRevert(
this.token.safeBatchTransferFrom(
multiTokenHolder,
this.receiver.address,
receiver.address,
[firstTokenId, secondTokenId],
[firstAmount, secondAmount],
'0x',
@ -711,15 +770,37 @@ function shouldBehaveLikeERC1155([minter, firstTokenHolder, secondTokenHolder, m
'ERC1155ReceiverMock: reverting on batch receive',
);
});
it('with custom error', async function () {
const receiver = await ERC1155ReceiverMock.new(
RECEIVER_SINGLE_MAGIC_VALUE,
RevertType.None,
RECEIVER_BATCH_MAGIC_VALUE,
RevertType.Custom,
);
await expectRevertCustomError(
this.token.safeBatchTransferFrom(
multiTokenHolder,
receiver.address,
[firstTokenId, secondTokenId],
[firstAmount, secondAmount],
'0x',
{ from: multiTokenHolder },
),
'ERC1155ReceiverMockError',
[],
);
});
});
context('to a receiver contract that reverts only on single transfers', function () {
beforeEach(async function () {
this.receiver = await ERC1155ReceiverMock.new(
RECEIVER_SINGLE_MAGIC_VALUE,
true,
RevertType.String,
RECEIVER_BATCH_MAGIC_VALUE,
false,
RevertType.None,
);
this.toWhom = this.receiver.address;