From e5eee96487ea3a9258b72c848736b894c88a4f6a Mon Sep 17 00:00:00 2001 From: mzhu25 Date: Mon, 7 Dec 2020 19:49:37 -0800 Subject: [PATCH] Add naive selector collision test (#74) --- contracts/zero-ex/CHANGELOG.json | 9 ++++++ .../test/features/selector_collision_test.ts | 29 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 contracts/zero-ex/test/features/selector_collision_test.ts diff --git a/contracts/zero-ex/CHANGELOG.json b/contracts/zero-ex/CHANGELOG.json index 65853f46b1..d62e2956c9 100644 --- a/contracts/zero-ex/CHANGELOG.json +++ b/contracts/zero-ex/CHANGELOG.json @@ -1,4 +1,13 @@ [ + { + "version": "0.12.0", + "changes": [ + { + "note": "Add test for selector collisions on the proxy", + "pr": 74 + } + ] + }, { "timestamp": 1607381756, "version": "0.11.1", diff --git a/contracts/zero-ex/test/features/selector_collision_test.ts b/contracts/zero-ex/test/features/selector_collision_test.ts new file mode 100644 index 0000000000..eb74934a21 --- /dev/null +++ b/contracts/zero-ex/test/features/selector_collision_test.ts @@ -0,0 +1,29 @@ +import { blockchainTests, constants, expect } from '@0x/contracts-test-utils'; +import { MethodAbi } from 'ethereum-types'; + +import * as wrappers from '../../src/wrappers'; + +blockchainTests('Selector collision test', env => { + it('Function selectors do not collide', () => { + const selectorToSignature: { [selector: string]: string } = {}; + for (const wrapper of Object.values(wrappers)) { + if (typeof wrapper === 'function') { + const contract = new wrapper(constants.NULL_ADDRESS, env.provider, env.txDefaults); + contract.abi + .filter(abiDef => abiDef.type === 'function') + .map(method => { + const methodName = (method as MethodAbi).name; + const selector = contract.getSelector(methodName); + const signature = contract.getFunctionSignature(methodName); + if (selectorToSignature[selector]) { + expect( + signature, + `Selectors collide: ${signature}, ${selectorToSignature[selector]}`, + ).to.equal(selectorToSignature[selector]); + } + selectorToSignature[selector] = signature; + }); + } + } + }); +});