diff --git a/contracts/mocks/OwnableInterfaceId.sol b/contracts/mocks/OwnableInterfaceId.sol new file mode 100644 index 000000000..14c943d50 --- /dev/null +++ b/contracts/mocks/OwnableInterfaceId.sol @@ -0,0 +1,15 @@ +pragma solidity ^0.4.24; + +import "../ownership/Ownable.sol"; + +/** + * @title Ownable interface id calculator. + * @dev See the EIP165 specification for more information: + * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md#specification + */ +contract OwnableInterfaceId { + function getInterfaceId() public pure returns (bytes4) { + Ownable i; + return i.owner.selector ^ i.isOwner.selector ^ i.renounceOwnership.selector ^ i.transferOwnership.selector; + } +} diff --git a/test/helpers/test/makeInterfaceId.test.js b/test/helpers/test/makeInterfaceId.test.js new file mode 100644 index 000000000..fd4920438 --- /dev/null +++ b/test/helpers/test/makeInterfaceId.test.js @@ -0,0 +1,20 @@ +const { makeInterfaceId } = require('../makeInterfaceId'); + +const OwnableInterfaceId = artifacts.require('OwnableInterfaceId'); + +require('chai') + .should(); + +describe('makeInterfaceId', function () { + it('calculates the EIP165 interface id from function signatures', async function () { + const calculator = await OwnableInterfaceId.new(); + const ownableId = await calculator.getInterfaceId(); + + makeInterfaceId([ + 'owner()', + 'isOwner()', + 'renounceOwnership()', + 'transferOwnership(address)', + ]).should.equal(ownableId); + }); +});