123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303 |
- require('@openzeppelin/test-helpers');
- const { expect } = require('chai');
- const ERC165CheckerMock = artifacts.require('ERC165CheckerMock');
- const ERC165MissingData = artifacts.require('ERC165MissingData');
- const ERC165MaliciousData = artifacts.require('ERC165MaliciousData');
- const ERC165NotSupported = artifacts.require('ERC165NotSupported');
- const ERC165InterfacesSupported = artifacts.require('ERC165InterfacesSupported');
- const ERC165ReturnBombMock = artifacts.require('ERC165ReturnBombMock');
- const DUMMY_ID = '0xdeadbeef';
- const DUMMY_ID_2 = '0xcafebabe';
- const DUMMY_ID_3 = '0xdecafbad';
- const DUMMY_UNSUPPORTED_ID = '0xbaddcafe';
- const DUMMY_UNSUPPORTED_ID_2 = '0xbaadcafe';
- const DUMMY_ACCOUNT = '0x1111111111111111111111111111111111111111';
- contract('ERC165Checker', function (accounts) {
- beforeEach(async function () {
- this.mock = await ERC165CheckerMock.new();
- });
- context('ERC165 missing return data', function () {
- beforeEach(async function () {
- this.target = await ERC165MissingData.new();
- });
- it('does not support ERC165', async function () {
- const supported = await this.mock.supportsERC165(this.target.address);
- expect(supported).to.equal(false);
- });
- it('does not support mock interface via supportsInterface', async function () {
- const supported = await this.mock.supportsInterface(this.target.address, DUMMY_ID);
- expect(supported).to.equal(false);
- });
- it('does not support mock interface via supportsAllInterfaces', async function () {
- const supported = await this.mock.supportsAllInterfaces(this.target.address, [DUMMY_ID]);
- expect(supported).to.equal(false);
- });
- it('does not support mock interface via getSupportedInterfaces', async function () {
- const supported = await this.mock.getSupportedInterfaces(this.target.address, [DUMMY_ID]);
- expect(supported.length).to.equal(1);
- expect(supported[0]).to.equal(false);
- });
- it('does not support mock interface via supportsERC165InterfaceUnchecked', async function () {
- const supported = await this.mock.supportsERC165InterfaceUnchecked(this.target.address, DUMMY_ID);
- expect(supported).to.equal(false);
- });
- });
- context('ERC165 malicious return data', function () {
- beforeEach(async function () {
- this.target = await ERC165MaliciousData.new();
- });
- it('does not support ERC165', async function () {
- const supported = await this.mock.supportsERC165(this.target.address);
- expect(supported).to.equal(false);
- });
- it('does not support mock interface via supportsInterface', async function () {
- const supported = await this.mock.supportsInterface(this.target.address, DUMMY_ID);
- expect(supported).to.equal(false);
- });
- it('does not support mock interface via supportsAllInterfaces', async function () {
- const supported = await this.mock.supportsAllInterfaces(this.target.address, [DUMMY_ID]);
- expect(supported).to.equal(false);
- });
- it('does not support mock interface via getSupportedInterfaces', async function () {
- const supported = await this.mock.getSupportedInterfaces(this.target.address, [DUMMY_ID]);
- expect(supported.length).to.equal(1);
- expect(supported[0]).to.equal(false);
- });
- it('does not support mock interface via supportsERC165InterfaceUnchecked', async function () {
- const supported = await this.mock.supportsERC165InterfaceUnchecked(this.target.address, DUMMY_ID);
- expect(supported).to.equal(true);
- });
- });
- context('ERC165 not supported', function () {
- beforeEach(async function () {
- this.target = await ERC165NotSupported.new();
- });
- it('does not support ERC165', async function () {
- const supported = await this.mock.supportsERC165(this.target.address);
- expect(supported).to.equal(false);
- });
- it('does not support mock interface via supportsInterface', async function () {
- const supported = await this.mock.supportsInterface(this.target.address, DUMMY_ID);
- expect(supported).to.equal(false);
- });
- it('does not support mock interface via supportsAllInterfaces', async function () {
- const supported = await this.mock.supportsAllInterfaces(this.target.address, [DUMMY_ID]);
- expect(supported).to.equal(false);
- });
- it('does not support mock interface via getSupportedInterfaces', async function () {
- const supported = await this.mock.getSupportedInterfaces(this.target.address, [DUMMY_ID]);
- expect(supported.length).to.equal(1);
- expect(supported[0]).to.equal(false);
- });
- it('does not support mock interface via supportsERC165InterfaceUnchecked', async function () {
- const supported = await this.mock.supportsERC165InterfaceUnchecked(this.target.address, DUMMY_ID);
- expect(supported).to.equal(false);
- });
- });
- context('ERC165 supported', function () {
- beforeEach(async function () {
- this.target = await ERC165InterfacesSupported.new([]);
- });
- it('supports ERC165', async function () {
- const supported = await this.mock.supportsERC165(this.target.address);
- expect(supported).to.equal(true);
- });
- it('does not support mock interface via supportsInterface', async function () {
- const supported = await this.mock.supportsInterface(this.target.address, DUMMY_ID);
- expect(supported).to.equal(false);
- });
- it('does not support mock interface via supportsAllInterfaces', async function () {
- const supported = await this.mock.supportsAllInterfaces(this.target.address, [DUMMY_ID]);
- expect(supported).to.equal(false);
- });
- it('does not support mock interface via getSupportedInterfaces', async function () {
- const supported = await this.mock.getSupportedInterfaces(this.target.address, [DUMMY_ID]);
- expect(supported.length).to.equal(1);
- expect(supported[0]).to.equal(false);
- });
- it('does not support mock interface via supportsERC165InterfaceUnchecked', async function () {
- const supported = await this.mock.supportsERC165InterfaceUnchecked(this.target.address, DUMMY_ID);
- expect(supported).to.equal(false);
- });
- });
- context('ERC165 and single interface supported', function () {
- beforeEach(async function () {
- this.target = await ERC165InterfacesSupported.new([DUMMY_ID]);
- });
- it('supports ERC165', async function () {
- const supported = await this.mock.supportsERC165(this.target.address);
- expect(supported).to.equal(true);
- });
- it('supports mock interface via supportsInterface', async function () {
- const supported = await this.mock.supportsInterface(this.target.address, DUMMY_ID);
- expect(supported).to.equal(true);
- });
- it('supports mock interface via supportsAllInterfaces', async function () {
- const supported = await this.mock.supportsAllInterfaces(this.target.address, [DUMMY_ID]);
- expect(supported).to.equal(true);
- });
- it('supports mock interface via getSupportedInterfaces', async function () {
- const supported = await this.mock.getSupportedInterfaces(this.target.address, [DUMMY_ID]);
- expect(supported.length).to.equal(1);
- expect(supported[0]).to.equal(true);
- });
- it('supports mock interface via supportsERC165InterfaceUnchecked', async function () {
- const supported = await this.mock.supportsERC165InterfaceUnchecked(this.target.address, DUMMY_ID);
- expect(supported).to.equal(true);
- });
- });
- context('ERC165 and many interfaces supported', function () {
- beforeEach(async function () {
- this.supportedInterfaces = [DUMMY_ID, DUMMY_ID_2, DUMMY_ID_3];
- this.target = await ERC165InterfacesSupported.new(this.supportedInterfaces);
- });
- it('supports ERC165', async function () {
- const supported = await this.mock.supportsERC165(this.target.address);
- expect(supported).to.equal(true);
- });
- it('supports each interfaceId via supportsInterface', async function () {
- for (const interfaceId of this.supportedInterfaces) {
- const supported = await this.mock.supportsInterface(this.target.address, interfaceId);
- expect(supported).to.equal(true);
- };
- });
- it('supports all interfaceIds via supportsAllInterfaces', async function () {
- const supported = await this.mock.supportsAllInterfaces(this.target.address, this.supportedInterfaces);
- expect(supported).to.equal(true);
- });
- it('supports none of the interfaces queried via supportsAllInterfaces', async function () {
- const interfaceIdsToTest = [DUMMY_UNSUPPORTED_ID, DUMMY_UNSUPPORTED_ID_2];
- const supported = await this.mock.supportsAllInterfaces(this.target.address, interfaceIdsToTest);
- expect(supported).to.equal(false);
- });
- it('supports not all of the interfaces queried via supportsAllInterfaces', async function () {
- const interfaceIdsToTest = [...this.supportedInterfaces, DUMMY_UNSUPPORTED_ID];
- const supported = await this.mock.supportsAllInterfaces(this.target.address, interfaceIdsToTest);
- expect(supported).to.equal(false);
- });
- it('supports all interfaceIds via getSupportedInterfaces', async function () {
- const supported = await this.mock.getSupportedInterfaces(this.target.address, this.supportedInterfaces);
- expect(supported.length).to.equal(3);
- expect(supported[0]).to.equal(true);
- expect(supported[1]).to.equal(true);
- expect(supported[2]).to.equal(true);
- });
- it('supports none of the interfaces queried via getSupportedInterfaces', async function () {
- const interfaceIdsToTest = [DUMMY_UNSUPPORTED_ID, DUMMY_UNSUPPORTED_ID_2];
- const supported = await this.mock.getSupportedInterfaces(this.target.address, interfaceIdsToTest);
- expect(supported.length).to.equal(2);
- expect(supported[0]).to.equal(false);
- expect(supported[1]).to.equal(false);
- });
- it('supports not all of the interfaces queried via getSupportedInterfaces', async function () {
- const interfaceIdsToTest = [...this.supportedInterfaces, DUMMY_UNSUPPORTED_ID];
- const supported = await this.mock.getSupportedInterfaces(this.target.address, interfaceIdsToTest);
- expect(supported.length).to.equal(4);
- expect(supported[0]).to.equal(true);
- expect(supported[1]).to.equal(true);
- expect(supported[2]).to.equal(true);
- expect(supported[3]).to.equal(false);
- });
- it('supports each interfaceId via supportsERC165InterfaceUnchecked', async function () {
- for (const interfaceId of this.supportedInterfaces) {
- const supported = await this.mock.supportsERC165InterfaceUnchecked(this.target.address, interfaceId);
- expect(supported).to.equal(true);
- };
- });
- });
- context('account address does not support ERC165', function () {
- it('does not support ERC165', async function () {
- const supported = await this.mock.supportsERC165(DUMMY_ACCOUNT);
- expect(supported).to.equal(false);
- });
- it('does not support mock interface via supportsInterface', async function () {
- const supported = await this.mock.supportsInterface(DUMMY_ACCOUNT, DUMMY_ID);
- expect(supported).to.equal(false);
- });
- it('does not support mock interface via supportsAllInterfaces', async function () {
- const supported = await this.mock.supportsAllInterfaces(DUMMY_ACCOUNT, [DUMMY_ID]);
- expect(supported).to.equal(false);
- });
- it('does not support mock interface via getSupportedInterfaces', async function () {
- const supported = await this.mock.getSupportedInterfaces(DUMMY_ACCOUNT, [DUMMY_ID]);
- expect(supported.length).to.equal(1);
- expect(supported[0]).to.equal(false);
- });
- it('does not support mock interface via supportsERC165InterfaceUnchecked', async function () {
- const supported = await this.mock.supportsERC165InterfaceUnchecked(DUMMY_ACCOUNT, DUMMY_ID);
- expect(supported).to.equal(false);
- });
- });
- it('Return bomb resistance', async function () {
- this.target = await ERC165ReturnBombMock.new();
- const tx1 = await this.mock.supportsInterface.sendTransaction(this.target.address, DUMMY_ID);
- expect(tx1.receipt.gasUsed).to.be.lessThan(120000); // 3*30k + 21k + some margin
- const tx2 = await this.mock.getSupportedInterfaces.sendTransaction(
- this.target.address,
- [
- DUMMY_ID,
- DUMMY_ID_2,
- DUMMY_ID_3,
- DUMMY_UNSUPPORTED_ID,
- DUMMY_UNSUPPORTED_ID_2,
- ],
- );
- expect(tx2.receipt.gasUsed).to.be.lessThan(250000); // (2+5)*30k + 21k + some margin
- });
- });
|