diff --git a/.changeset/khaki-nails-bow.md b/.changeset/khaki-nails-bow.md new file mode 100644 index 000000000..6f92fd09d --- /dev/null +++ b/.changeset/khaki-nails-bow.md @@ -0,0 +1,7 @@ +--- +"@layerzerolabs/build-lz-options": patch +"@layerzerolabs/devtools-evm": patch +"@layerzerolabs/toolbox-hardhat": patch +--- + +Add addChecksum utility diff --git a/packages/build-lz-options/package.json b/packages/build-lz-options/package.json index 7bc152763..25036b44d 100644 --- a/packages/build-lz-options/package.json +++ b/packages/build-lz-options/package.json @@ -32,6 +32,7 @@ "yoga-layout-prebuilt": "^1.10.0" }, "devDependencies": { + "@ethersproject/address": "~5.7.0", "@layerzerolabs/devtools": "~0.0.6", "@layerzerolabs/devtools-evm": "~0.0.7", "@layerzerolabs/io-devtools": "~0.0.5", diff --git a/packages/devtools-evm/jest.config.js b/packages/devtools-evm/jest.config.js index 9de065f61..d081b6c92 100644 --- a/packages/devtools-evm/jest.config.js +++ b/packages/devtools-evm/jest.config.js @@ -2,6 +2,7 @@ module.exports = { cache: false, testEnvironment: 'node', + setupFilesAfterEnv: ['/jest.setup.js'], moduleNameMapper: { '^@/(.*)$': '/src/$1', }, diff --git a/packages/devtools-evm/jest.setup.js b/packages/devtools-evm/jest.setup.js new file mode 100644 index 000000000..84d638324 --- /dev/null +++ b/packages/devtools-evm/jest.setup.js @@ -0,0 +1,3 @@ +// add all jest-extended matchers +// eslint-disable-next-line @typescript-eslint/no-var-requires +expect.extend(require('jest-extended')); diff --git a/packages/devtools-evm/package.json b/packages/devtools-evm/package.json index 551be1bab..f78cd73d4 100644 --- a/packages/devtools-evm/package.json +++ b/packages/devtools-evm/package.json @@ -41,6 +41,7 @@ "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "~5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/contracts": "^5.7.0", @@ -54,6 +55,7 @@ "@types/jest": "^29.5.11", "fast-check": "^3.15.0", "jest": "^29.7.0", + "jest-extended": "^4.0.2", "ts-node": "^10.9.2", "tslib": "~2.6.2", "tsup": "~8.0.1", @@ -64,6 +66,7 @@ "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-provider": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "~5.7.0", "@ethersproject/bignumber": "^5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/contracts": "^5.7.0", diff --git a/packages/devtools-evm/src/address.ts b/packages/devtools-evm/src/address.ts index d20692d0d..7e465267c 100644 --- a/packages/devtools-evm/src/address.ts +++ b/packages/devtools-evm/src/address.ts @@ -1,4 +1,5 @@ import type { OmniAddress } from '@layerzerolabs/devtools' +import { getAddress } from '@ethersproject/address' import { AddressZero } from '@ethersproject/constants' /** @@ -9,3 +10,12 @@ import { AddressZero } from '@ethersproject/constants' * @returns {string} */ export const makeZeroAddress = (address?: OmniAddress | null | undefined): string => address ?? AddressZero + +/** + * Applies checksum to a given address, lower/uppercasing + * necessary characters + * + * @param {OmniAddress} address + * @returns {OmniAddress} + */ +export const addChecksum = (address: OmniAddress): OmniAddress => getAddress(address) diff --git a/packages/devtools-evm/test/address.test.ts b/packages/devtools-evm/test/address.test.ts index 36fca1ab9..2911b63f8 100644 --- a/packages/devtools-evm/test/address.test.ts +++ b/packages/devtools-evm/test/address.test.ts @@ -1,7 +1,10 @@ +/// + import fc from 'fast-check' import { AddressZero } from '@ethersproject/constants' import { evmAddressArbitrary } from '@layerzerolabs/test-devtools' -import { makeZeroAddress } from '@/address' +import { addChecksum, makeZeroAddress } from '@/address' +import { isAddress } from '@ethersproject/address' describe('address', () => { describe('makeZeroAddress', () => { @@ -27,4 +30,22 @@ describe('address', () => { expect(makeZeroAddress(null)).toBe(AddressZero) }) }) + + describe('addChecksum', () => { + it('should return the same address, just checksumed', () => { + fc.assert( + fc.property(evmAddressArbitrary, (address) => { + expect(addChecksum(address)).toEqualCaseInsensitive(address) + }) + ) + }) + + it('should return a valid EVM address', () => { + fc.assert( + fc.property(evmAddressArbitrary, (address) => { + expect(isAddress(addChecksum(address))).toBe(true) + }) + ) + }) + }) }) diff --git a/packages/toolbox-hardhat/package.json b/packages/toolbox-hardhat/package.json index f5444391d..4c874128e 100644 --- a/packages/toolbox-hardhat/package.json +++ b/packages/toolbox-hardhat/package.json @@ -30,6 +30,7 @@ }, "dependencies": { "@ethersproject/abi": "^5.7.0", + "@ethersproject/address": "~5.7.0", "@ethersproject/bytes": "^5.7.0", "@ethersproject/contracts": "^5.7.0", "@ethersproject/hash": "^5.7.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0fbd3f1b4..a43e88505 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -261,6 +261,9 @@ importers: specifier: ^1.10.0 version: 1.10.0 devDependencies: + '@ethersproject/address': + specifier: ~5.7.0 + version: 5.7.0 '@layerzerolabs/devtools': specifier: ~0.0.6 version: link:../devtools @@ -452,6 +455,9 @@ importers: '@ethersproject/abstract-signer': specifier: ^5.7.0 version: 5.7.0 + '@ethersproject/address': + specifier: ~5.7.0 + version: 5.7.0 '@ethersproject/bignumber': specifier: ^5.7.0 version: 5.7.0 @@ -491,6 +497,9 @@ importers: jest: specifier: ^29.7.0 version: 29.7.0(@types/node@18.18.14)(ts-node@10.9.2) + jest-extended: + specifier: ^4.0.2 + version: 4.0.2(jest@29.7.0) ts-node: specifier: ^10.9.2 version: 10.9.2(@swc/core@1.3.105)(@types/node@18.18.14)(typescript@5.3.3) @@ -1002,6 +1011,9 @@ importers: '@ethersproject/abi': specifier: ^5.7.0 version: 5.7.0 + '@ethersproject/address': + specifier: ~5.7.0 + version: 5.7.0 '@ethersproject/bytes': specifier: ^5.7.0 version: 5.7.0 @@ -1530,6 +1542,9 @@ importers: '@ethersproject/abstract-signer': specifier: ^5.7.0 version: 5.7.0 + '@ethersproject/address': + specifier: ~5.7.0 + version: 5.7.0 '@ethersproject/constants': specifier: ^5.7.0 version: 5.7.0 @@ -6779,6 +6794,7 @@ packages: dependencies: is-hex-prefixed: 1.0.0 strip-hex-prefix: 1.0.0 + bundledDependencies: false /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} diff --git a/tests/ua-devtools-evm-hardhat-test/package.json b/tests/ua-devtools-evm-hardhat-test/package.json index 4c9e6c4c8..2ab8065c5 100644 --- a/tests/ua-devtools-evm-hardhat-test/package.json +++ b/tests/ua-devtools-evm-hardhat-test/package.json @@ -19,6 +19,7 @@ "@babel/core": "^7.23.7", "@ethersproject/abi": "^5.7.0", "@ethersproject/abstract-signer": "^5.7.0", + "@ethersproject/address": "~5.7.0", "@ethersproject/constants": "^5.7.0", "@ethersproject/contracts": "^5.7.0", "@ethersproject/providers": "^5.7.2",