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:
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user