From 08e0c2ebb9396fc437fda440367e005fcbf73d75 Mon Sep 17 00:00:00 2001 From: Kyu Date: Wed, 10 Aug 2022 17:35:38 +0900 Subject: [PATCH] chore: Add checks for `addresses.json` [TKR-519] (#549) --- .circleci/config.yml | 3 +- packages/contract-addresses/package.json | 6 ++ .../contract-addresses/test/addresses_test.ts | 70 +++++++++++++++++++ packages/contract-addresses/tsconfig.json | 2 +- yarn.lock | 17 ++++- 5 files changed, 93 insertions(+), 5 deletions(-) create mode 100644 packages/contract-addresses/test/addresses_test.ts diff --git a/.circleci/config.yml b/.circleci/config.yml index f93f784510..72a6d2c181 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -128,6 +128,7 @@ jobs: keys: - repo-{{ .Environment.CIRCLE_SHA1 }} - run: yarn wsrun -p @0x/contracts-test-utils -m --serial -c test:circleci + - run: yarn wsrun -p @0x/contract-addresses -m --serial -c test:circleci - run: yarn wsrun -p @0x/contract-artifacts -m --serial -c test:circleci - run: yarn wsrun -p @0x/contract-wrappers-test -m --serial -c test:circleci - run: yarn wsrun -p @0x/order-utils -m --serial -c test:circleci @@ -195,7 +196,7 @@ workflows: # - build - test-foundry: requires: - - build + - build - test-contracts-rest-ganache: requires: - build diff --git a/packages/contract-addresses/package.json b/packages/contract-addresses/package.json index 38f0df9e10..0caadb75a8 100644 --- a/packages/contract-addresses/package.json +++ b/packages/contract-addresses/package.json @@ -12,6 +12,8 @@ "scripts": { "build": "yarn tsc -b", "build:ci": "yarn build", + "test": "mocha --require source-map-support/register 'lib/test/**/*_test.js' --timeout 10000 --bail --exit", + "test:circleci": "yarn test", "clean": "shx rm -rf lib", "publish:private": "yarn build && gitpkg publish" }, @@ -28,7 +30,11 @@ }, "homepage": "https://github.com/0xProject/protocol/tree/main/packages/contract-addresses", "devDependencies": { + "@types/mocha": "^5.2.7", + "chai": "^4.0.1", + "ethereumjs-util": "^7.1.5", "gitpkg": "https://github.com/0xProject/gitpkg.git", + "mocha": "^6.2.0", "shx": "^0.2.2", "typescript": "4.6.3" }, diff --git a/packages/contract-addresses/test/addresses_test.ts b/packages/contract-addresses/test/addresses_test.ts new file mode 100644 index 0000000000..086af12c5d --- /dev/null +++ b/packages/contract-addresses/test/addresses_test.ts @@ -0,0 +1,70 @@ +import * as chai from 'chai'; +import 'mocha'; + +import { ChainId, getContractAddressesForChainOrThrow } from '../src'; +import { bufferToHex, rlphash } from 'ethereumjs-util'; + +const expect = chai.expect; + +function toDeployedAddress(deployerAddress: string, nonce: number): string { + return bufferToHex(rlphash([deployerAddress, nonce]).slice(12)); +} + +function isValidDeployedAddress(deployerAddress: string, deployedAddress: string): boolean { + for (let i = 0; i < 256; i++) { + const address = toDeployedAddress(deployerAddress, i); + if (address.toLowerCase() === deployedAddress.toLowerCase()) { + return true; + } + } + return false; +} + +describe('addresses.json sanity test', () => { + const allChainIds = Object.values(ChainId).filter(chainId => !isNaN(Number(chainId))) as ChainId[]; + allChainIds.forEach(chainId => { + describe(`addresses of chain id ${chainId}`, () => { + const contractAddresses = getContractAddressesForChainOrThrow(chainId); + it('all addresses are lowercased', async () => { + const addresses = [ + contractAddresses.zrxToken, + contractAddresses.etherToken, + contractAddresses.zeroExGovernor, + contractAddresses.zrxVault, + contractAddresses.staking, + contractAddresses.erc20BridgeProxy, + contractAddresses.erc20BridgeSampler, + contractAddresses.exchangeProxyGovernor, + contractAddresses.exchangeProxy, + contractAddresses.exchangeProxyTransformerDeployer, + contractAddresses.exchangeProxyFlashWallet, + contractAddresses.exchangeProxyLiquidityProviderSandbox, + contractAddresses.zrxTreasury, + contractAddresses.transformers.wethTransformer, + contractAddresses.transformers.payTakerTransformer, + contractAddresses.transformers.fillQuoteTransformer, + contractAddresses.transformers.affiliateFeeTransformer, + contractAddresses.transformers.positiveSlippageFeeTransformer, + ]; + addresses.forEach(address => { + expect(address).to.eq(address.toLowerCase()); + }); + }); + + it('all transformer addresses are valid', async () => { + const transformerAddresses = [ + contractAddresses.transformers.wethTransformer, + contractAddresses.transformers.payTakerTransformer, + contractAddresses.transformers.fillQuoteTransformer, + contractAddresses.transformers.affiliateFeeTransformer, + contractAddresses.transformers.positiveSlippageFeeTransformer, + ].filter(address => address !== '0x0000000000000000000000000000000000000000'); + transformerAddresses.forEach(transformerAddress => { + expect( + isValidDeployedAddress(contractAddresses.exchangeProxyTransformerDeployer, transformerAddress), + ).to.true; + }); + }); + }); + }); +}); diff --git a/packages/contract-addresses/tsconfig.json b/packages/contract-addresses/tsconfig.json index 3d191a3c01..7e742f0b50 100644 --- a/packages/contract-addresses/tsconfig.json +++ b/packages/contract-addresses/tsconfig.json @@ -6,6 +6,6 @@ "resolveJsonModule": true, "esModuleInterop": true }, - "include": ["./src/**/*"], + "include": ["./src/**/*", "./test/**/*"], "files": ["./addresses.json"] } diff --git a/yarn.lock b/yarn.lock index 25eb6d88c3..7c27a31c13 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3788,9 +3788,9 @@ bigi@1.4.2, bigi@^1.1.0: resolved "https://registry.yarnpkg.com/bigi/-/bigi-1.4.2.tgz#9c665a95f88b8b08fc05cfd731f561859d725825" bignumber.js@7.2.1, bignumber.js@^9.0.0, bignumber.js@^9.0.2, bignumber.js@~4.1.0, bignumber.js@~9.0.0, bignumber.js@~9.0.2: - version "9.0.2" - resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.2.tgz#71c6c6bed38de64e24a65ebe16cfcf23ae693673" - integrity sha512-GAcQvbpsM0pUb0zw1EI0KhQEZ+lRwR5fYaAp3vPOYuP7aDvGy6cVN6XHLauvF8SOga2y0dcLcjt3iQDTSEliyw== + version "9.1.0" + resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.0.tgz#8d340146107fe3a6cb8d40699643c302e8773b62" + integrity sha512-4LwHK4nfDOraBCtst+wOWIHbu1vhvAPJK8g8nROd4iuc3PSEjWif/qwbkh8jwCJz6yDBvtU4KPynETgrfh7y3A== binary-extensions@^2.0.0: version "2.1.0" @@ -6184,6 +6184,17 @@ ethereumjs-util@^7.1.0: ethjs-util "0.1.6" rlp "^2.2.4" +ethereumjs-util@^7.1.5: + version "7.1.5" + resolved "https://registry.yarnpkg.com/ethereumjs-util/-/ethereumjs-util-7.1.5.tgz#9ecf04861e4fbbeed7465ece5f23317ad1129181" + integrity sha512-SDl5kKrQAudFBUe5OJM9Ac6WmMyYmXX/6sTmLZ3ffG2eY6ZIGBes3pEDxNN6V72WyOw4CPD5RomKdsa8DAAwLg== + dependencies: + "@types/bn.js" "^5.1.0" + bn.js "^5.1.2" + create-hash "^1.1.2" + ethereum-cryptography "^0.1.3" + rlp "^2.2.4" + ethereumjs-vm@4.2.0, ethereumjs-vm@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/ethereumjs-vm/-/ethereumjs-vm-4.2.0.tgz#e885e861424e373dbc556278f7259ff3fca5edab"