diff --git a/modules/abstract-cosmos/src/lib/utils.ts b/modules/abstract-cosmos/src/lib/utils.ts index 89144b7b69..cc10d44984 100644 --- a/modules/abstract-cosmos/src/lib/utils.ts +++ b/modules/abstract-cosmos/src/lib/utils.ts @@ -6,7 +6,7 @@ import { TransactionType, } from '@bitgo/sdk-core'; import { encodeSecp256k1Pubkey, encodeSecp256k1Signature } from '@cosmjs/amino'; -import { fromBase64, fromHex, toHex } from '@cosmjs/encoding'; +import { fromBase64, fromBech32, fromHex, toHex } from '@cosmjs/encoding'; import { DecodedTxRaw, EncodeObject, @@ -707,12 +707,12 @@ export class CosmosUtils implements BaseUtils { * @param {RegExp} regExp Regular expression to validate the root address against after trimming the memoId * @returns {boolean} true if address is valid */ - isValidCosmosLikeAddressWithMemoId(address: string, regExp: RegExp): boolean { + protected isValidCosmosLikeAddressWithMemoId(address: string, regExp: RegExp): boolean { if (typeof address !== 'string') return false; const addressArray = address.split('?memoId='); if ( ![1, 2].includes(addressArray.length) || // should have at most one occurrence of 'memoId=' - !regExp.test(addressArray[0]) || + !this.isValidBech32AddressMatchingRegex(addressArray[0], regExp) || (addressArray[1] && !this.isValidMemoId(addressArray[1])) ) { return false; @@ -720,6 +720,21 @@ export class CosmosUtils implements BaseUtils { return true; } + /** + * Checks if address is valid Bech32 and matches given regular expression + * @param {string} address + * @param {RegExp} regExp Regular expression to validate the address against + * @returns {boolean} true if address is valid + */ + protected isValidBech32AddressMatchingRegex(address: string, regExp: RegExp): boolean { + try { + fromBech32(address); + } catch (e) { + return false; + } + return regExp.test(address); + } + /** * Return boolean indicating whether a memo id is valid * diff --git a/modules/sdk-coin-atom/src/lib/utils.ts b/modules/sdk-coin-atom/src/lib/utils.ts index ac1007a045..0ba495ab89 100644 --- a/modules/sdk-coin-atom/src/lib/utils.ts +++ b/modules/sdk-coin-atom/src/lib/utils.ts @@ -6,7 +6,7 @@ import { TransactionType, } from '@bitgo/sdk-core'; import { encodeSecp256k1Pubkey, encodeSecp256k1Signature } from '@cosmjs/amino'; -import { fromBase64, fromHex, toHex } from '@cosmjs/encoding'; +import { fromBase64, fromBech32, fromHex, toHex } from '@cosmjs/encoding'; import { DecodedTxRaw, decodePubkey, @@ -89,12 +89,12 @@ export class Utils implements BaseUtils { * @param {RegExp} regExp Regular expression to validate the root address against after trimming the memoId * @returns {boolean} true if address is valid */ - isValidCosmosLikeAddressWithMemoId(address: string, regExp: RegExp): boolean { + protected isValidCosmosLikeAddressWithMemoId(address: string, regExp: RegExp): boolean { if (typeof address !== 'string') return false; const addressArray = address.split('?memoId='); if ( ![1, 2].includes(addressArray.length) || // should have at most one occurrence of 'memoId=' - !regExp.test(addressArray[0]) || + !this.isValidBech32AddressMatchingRegex(addressArray[0], regExp) || (addressArray[1] && !this.isValidMemoId(addressArray[1])) ) { return false; @@ -102,6 +102,21 @@ export class Utils implements BaseUtils { return true; } + /** + * Checks if address is valid Bech32 and matches given regular expression + * @param {string} address + * @param {RegExp} regExp Regular expression to validate the address against + * @returns {boolean} true if address is valid + */ + protected isValidBech32AddressMatchingRegex(address: string, regExp: RegExp): boolean { + try { + fromBech32(address); + } catch (e) { + return false; + } + return regExp.test(address); + } + /** * Return boolean indicating whether a memo id is valid * @@ -135,7 +150,7 @@ export class Utils implements BaseUtils { * @returns {boolean} - the validation result */ isValidValidatorAddress(address: string): boolean { - return constants.validatorAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.validatorAddressRegex); } /** diff --git a/modules/sdk-coin-atom/test/resources/atom.ts b/modules/sdk-coin-atom/test/resources/atom.ts index 1ffcfc3c07..3a9144b09c 100644 --- a/modules/sdk-coin-atom/test/resources/atom.ts +++ b/modules/sdk-coin-atom/test/resources/atom.ts @@ -227,12 +227,12 @@ export const address = { address1: 'cosmos1ut2w0m3xa7z2rvndv23pthv9qc7hksx6tkf9uq', address2: 'cosmos12xt4x49p96n9aw4umjwyp3huct27nwr2g4r6p2', address3: 'cosxyz1xxxz06yx0u3yjzjjjm02xyx3mh25akenzql3n8', - address4: 'cosmos16ghn9c6f5yua09zqw7y794mvc30h4y4md7ckuk', + address4: 'cosmos16ghn9c6f5yua09zqw7y794mvc30h4y4md7ckuu', address6: 'cosmos1smefkq9yaxgw9c9fhym6qsp746q884czeacn32', - validatorAddress1: 'cosmosvaloper1ut2w0m3xa7z2rvndv23pthv9qc7hksx6tkf9uq', - validatorAddress2: 'cosmosvaloper12xt4x49p96n9aw4umjwyp3huct27nwr2g4r6p2', + validatorAddress1: 'cosmosvaloper1c4k24jzduc365kywrsvf5ujz4ya6mwympnc4en', + validatorAddress2: 'cosmosvaloper1tflk30mq5vgqjdly92kkhhq3raev2hnz6eete3', validatorAddress3: 'cosxyzvaloper1xxxz06yx0u3yjzjjjm02xyx3mh25akenzql3n8', - validatorAddress4: 'cosmosvalopr16ghn9c6f5yua09zqw7y794mvc30h4y4md7ckuk', + validatorAddress4: 'cosmosvaloper1c4k24jzduc365kywrsvf5ujz4ya6mwympnc4ee', noMemoIdAddress: 'cosmos12xt4x49p96n9aw4umjwyp3huct27nwr2g4r6p2', validMemoIdAddress: 'cosmos12xt4x49p96n9aw4umjwyp3huct27nwr2g4r6p2?memoId=2', invalidMemoIdAddress: 'cosmos12xt4x49p96n9aw4umjwyp3huct27nwr2g4r6p2?memoId=xyz', diff --git a/modules/sdk-coin-atom/test/unit/atom.ts b/modules/sdk-coin-atom/test/unit/atom.ts index a257e54f2b..3129bdc95f 100644 --- a/modules/sdk-coin-atom/test/unit/atom.ts +++ b/modules/sdk-coin-atom/test/unit/atom.ts @@ -87,7 +87,7 @@ describe('ATOM', function () { should.equal(utils.isValidAddress(address.address1), true); should.equal(utils.isValidAddress(address.address2), true); should.equal(utils.isValidAddress(address.address3), false); - should.equal(utils.isValidAddress(address.address4), true); + should.equal(utils.isValidAddress(address.address4), false); should.equal(utils.isValidAddress('dfjk35y'), false); should.equal(utils.isValidAddress(undefined as unknown as string), false); should.equal(utils.isValidAddress(''), false); diff --git a/modules/sdk-coin-atom/test/unit/utils.ts b/modules/sdk-coin-atom/test/unit/utils.ts index d1cf297396..e3592b872f 100644 --- a/modules/sdk-coin-atom/test/unit/utils.ts +++ b/modules/sdk-coin-atom/test/unit/utils.ts @@ -9,7 +9,7 @@ describe('utils', () => { should.equal(utils.isValidAddress(address.address1), true); should.equal(utils.isValidAddress(address.address2), true); should.equal(utils.isValidAddress(address.address3), false); - should.equal(utils.isValidAddress(address.address4), true); + should.equal(utils.isValidAddress(address.address4), false); should.equal(utils.isValidAddress('dfjk35y'), false); should.equal(utils.isValidAddress(undefined as unknown as string), false); should.equal(utils.isValidAddress(''), false); diff --git a/modules/sdk-coin-bera/src/lib/utils.ts b/modules/sdk-coin-bera/src/lib/utils.ts index a76c5e405a..cc73ccbaa7 100644 --- a/modules/sdk-coin-bera/src/lib/utils.ts +++ b/modules/sdk-coin-bera/src/lib/utils.ts @@ -13,7 +13,7 @@ export class BeraUtils extends CosmosUtils { /** @inheritdoc */ isValidValidatorAddress(address: string): boolean { - return constants.validatorAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.validatorAddressRegex); } /** @inheritdoc */ diff --git a/modules/sdk-coin-bld/src/lib/utils.ts b/modules/sdk-coin-bld/src/lib/utils.ts index b3c3a04b78..e5d5a3fc7f 100644 --- a/modules/sdk-coin-bld/src/lib/utils.ts +++ b/modules/sdk-coin-bld/src/lib/utils.ts @@ -13,12 +13,12 @@ export class BldUtils extends CosmosUtils { /** @inheritdoc */ isValidValidatorAddress(address: string): boolean { - return constants.validatorAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.validatorAddressRegex); } /** @inheritdoc */ isValidContractAddress(address: string): boolean { - return constants.contractAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.contractAddressRegex); } /** @inheritdoc */ diff --git a/modules/sdk-coin-bld/test/resources/bld.ts b/modules/sdk-coin-bld/test/resources/bld.ts index a036e523c2..ba143c7fc4 100644 --- a/modules/sdk-coin-bld/test/resources/bld.ts +++ b/modules/sdk-coin-bld/test/resources/bld.ts @@ -195,11 +195,11 @@ export const address = { address1: 'agoric1tkfnp4khzd0f7mgtznwrvr0lv2at3p8c8sz89p', address2: 'agoric13fe0g5z8krh2zwzzynusvus5q8c0ea7hn0qy3m', address3: 'agoxxx1xxxnp4khzd0f7mgtznwrvr0lv2at3p8c8sz89p', - address4: 'agoric1tkfnp4khzd0f7mgtznwrvr0lv2at3p8c8sz89p', + address4: 'agoric1tkfnp4khzd0f7mgtznwrvr0lv2at3p8c8sz899', validatorAddress1: 'agoricvaloper1w5ayde694g7gyrya6t4vydc7gs59upkk8mkr76', validatorAddress2: 'agoricvaloper1l59wfskgu2564m6e7wmd20e3wyn0d0h8qsyrc5', validatorAddress3: 'agoxxxvaloper1xxxxde694g7gyrya6t4vydc7gs59upkk8mkr76', - validatorAddress4: 'agoricvalopxr1w5ayde694g7gyrya6t4vydc7gs59upkk8mkr76', + validatorAddress4: 'agoricvaloper1w5ayde694g7gyrya6t4vydc7gs59upkk8mkr77', noMemoIdAddress: 'agoric1tkfnp4khzd0f7mgtznwrvr0lv2at3p8c8sz89p', validMemoIdAddress: 'agoric1tkfnp4khzd0f7mgtznwrvr0lv2at3p8c8sz89p?memoId=2', invalidMemoIdAddress: 'agoric1tkfnp4khzd0f7mgtznwrvr0lv2at3p8c8sz89p?memoId=xyz', diff --git a/modules/sdk-coin-bld/test/unit/bld.ts b/modules/sdk-coin-bld/test/unit/bld.ts index 18db22a557..f56901f38b 100644 --- a/modules/sdk-coin-bld/test/unit/bld.ts +++ b/modules/sdk-coin-bld/test/unit/bld.ts @@ -72,9 +72,9 @@ describe('BLD', function () { it('should validate wallet receive address', async function () { const receiveAddress = { - address: 'agoric1yn3t8qujmtxjsnx7angjua3jhvkjxy5n5xgs0n?memoId=7', + address: 'agoric1tkfnp4khzd0f7mgtznwrvr0lv2at3p8c8sz89p?memoId=7', coinSpecific: { - rootAddress: 'agoric1yn3t8qujmtxjsnx7angjua3jhvkjxy5n5xgs0n', + rootAddress: 'agoric1tkfnp4khzd0f7mgtznwrvr0lv2at3p8c8sz89p', memoID: '7', }, }; @@ -86,7 +86,7 @@ describe('BLD', function () { should.equal(utils.isValidAddress(address.address1), true); should.equal(utils.isValidAddress(address.address2), true); should.equal(utils.isValidAddress(address.address3), false); - should.equal(utils.isValidAddress(address.address4), true); + should.equal(utils.isValidAddress(address.address4), false); should.equal(utils.isValidAddress('dfjk35y'), false); should.equal(utils.isValidAddress(undefined as unknown as string), false); should.equal(utils.isValidAddress(''), false); diff --git a/modules/sdk-coin-coreum/src/lib/utils.ts b/modules/sdk-coin-coreum/src/lib/utils.ts index 6ef8825801..6c448f5334 100644 --- a/modules/sdk-coin-coreum/src/lib/utils.ts +++ b/modules/sdk-coin-coreum/src/lib/utils.ts @@ -24,9 +24,9 @@ export class CoreumUtils extends CosmosUtils { /** @inheritdoc */ isValidValidatorAddress(address: string): boolean { if (this.networkType === NetworkType.TESTNET) { - return constants.testnetValidatorAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.testnetValidatorAddressRegex); } - return constants.mainnetValidatorAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.mainnetValidatorAddressRegex); } /** @inheritdoc */ diff --git a/modules/sdk-coin-coreum/test/resources/coreum.ts b/modules/sdk-coin-coreum/test/resources/coreum.ts index 424a5cbfab..72222feb7b 100644 --- a/modules/sdk-coin-coreum/test/resources/coreum.ts +++ b/modules/sdk-coin-coreum/test/resources/coreum.ts @@ -18,11 +18,11 @@ export const mainnetAddress = { address1: 'core1v7n3mrjg58udt7cyhv9gs62t8wcf9sh8w604y5', address2: 'core1ssh2d2ft6hzrgn9z6k7mmsamy2hfpxl9y8re5x', address3: 'core35udp7m30va5njkdrguj27wvk9lnutfwkevk7n9', - address4: 'core13ku0s7gtzgxl2560l8ld7czmskvwcn5dkk4w29', + address4: 'core1v7n3mrjg58udt7cyhv9gs62t8wcf9sh8w604yy', validatorAddress1: 'corevaloper1gsaxrwfu5glgw764mqhc4t8f3yxg2h07rmwt0k', validatorAddress2: 'corevaloper1x9hd9r7duv2gagztvvqlw94v5gy4zd9xwhqnlm', validatorAddress3: 'corevaloper2flaz3hzgg3tjszl372lu2zz5jsmxd8pvydl7gg', - validatorAddress4: 'corevaloder1xprcq3xdcuht0a8p082l3srgtwfgl57h2avmsq', + validatorAddress4: 'corevaloper1gsaxrwfu5glgw764mqhc4t8f3yxg2h07rmwt00', noMemoIdAddress: 'core1v7n3mrjg58udt7cyhv9gs62t8wcf9sh8w604y5', validMemoIdAddress: 'core1v7n3mrjg58udt7cyhv9gs62t8wcf9sh8w604y5?memoId=2', invalidMemoIdAddress: 'core1v7n3mrjg58udt7cyhv9gs62t8wcf9sh8w604y5?memoId=xyz', diff --git a/modules/sdk-coin-coreum/test/resources/tcoreum.ts b/modules/sdk-coin-coreum/test/resources/tcoreum.ts index a794a00a64..b263d2c74a 100644 --- a/modules/sdk-coin-coreum/test/resources/tcoreum.ts +++ b/modules/sdk-coin-coreum/test/resources/tcoreum.ts @@ -184,11 +184,11 @@ export const testnetAddress = { address1: 'testcore12rqvuw3tp3zne7p9c6c6mcuxv8vmej23jl7acn', address2: 'testcore1ecqgwd4whevrzjxrhrja54c5jg043j79xtz5a5', address3: 'testcore2zackgzh7f2p980mhps48z6zm2tyl76a8r896nh', - address4: 'testcore1fl48vsnmsdzcv85q5d2q4z5ajdha8yu3sp2f36', + address4: 'testcore12rqvuw3tp3zne7p9c6c6mcuxv8vmej23jl7acc', validatorAddress1: 'testcorevaloper1xjehmty2z5j7mfmpzxe8dgrf506c70n37lggga', validatorAddress2: 'testcorevaloper1m569wc4z06sdntmcex6qxg8ds7l8e2ec7njj7d', validatorAddress3: 'testcorevaloper207pd89u5x20wxucx9yjk5wysv5rttpvu8vnvsf', - validatorAddress4: 'testcorevaloder17udnpgy7sfam2rmeq5huumj0tqzfr0t4s49an9', + validatorAddress4: 'testcorevaloper1xjehmty2z5j7mfmpzxe8dgrf506c70n37lgggb', noMemoIdAddress: 'testcore12rqvuw3tp3zne7p9c6c6mcuxv8vmej23jl7acn', validMemoIdAddress: 'testcore12rqvuw3tp3zne7p9c6c6mcuxv8vmej23jl7acn?memoId=2', invalidMemoIdAddress: 'testcore12rqvuw3tp3zne7p9c6c6mcuxv8vmej23jl7acn?memoId=xyz', diff --git a/modules/sdk-coin-coreum/test/unit/coreum.ts b/modules/sdk-coin-coreum/test/unit/coreum.ts index ff82a235e9..59c50d74b7 100644 --- a/modules/sdk-coin-coreum/test/unit/coreum.ts +++ b/modules/sdk-coin-coreum/test/unit/coreum.ts @@ -116,7 +116,7 @@ describe('Coreum', function () { should.equal(mainnetUtils.isValidAddress(mainnetAddress.address1), true); should.equal(mainnetUtils.isValidAddress(mainnetAddress.address2), true); should.equal(mainnetUtils.isValidAddress(mainnetAddress.address3), false); - should.equal(mainnetUtils.isValidAddress(mainnetAddress.address4), true); + should.equal(mainnetUtils.isValidAddress(mainnetAddress.address4), false); should.equal(mainnetUtils.isValidAddress('dfjk35y'), false); should.equal(mainnetUtils.isValidAddress(undefined as unknown as string), false); should.equal(mainnetUtils.isValidAddress(''), false); @@ -127,7 +127,7 @@ describe('Coreum', function () { should.equal(testnetUtils.isValidAddress(testnetAddress.address1), true); should.equal(testnetUtils.isValidAddress(testnetAddress.address2), true); should.equal(testnetUtils.isValidAddress(testnetAddress.address3), false); - should.equal(testnetUtils.isValidAddress(testnetAddress.address4), true); + should.equal(testnetUtils.isValidAddress(testnetAddress.address4), false); should.equal(testnetUtils.isValidAddress('dfjk35y'), false); should.equal(testnetUtils.isValidAddress(undefined as unknown as string), false); should.equal(testnetUtils.isValidAddress(''), false); diff --git a/modules/sdk-coin-hash/src/lib/utils.ts b/modules/sdk-coin-hash/src/lib/utils.ts index 901afc4051..1327696e9a 100644 --- a/modules/sdk-coin-hash/src/lib/utils.ts +++ b/modules/sdk-coin-hash/src/lib/utils.ts @@ -22,17 +22,17 @@ export class HashUtils extends CosmosUtils { /** @inheritdoc */ isValidValidatorAddress(address: string): boolean { if (this.networkType === NetworkType.TESTNET) { - return constants.testnetValidatorAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.testnetValidatorAddressRegex); } - return constants.mainnetValidatorAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.mainnetValidatorAddressRegex); } /** @inheritdoc */ isValidContractAddress(address: string): boolean { if (this.networkType === NetworkType.TESTNET) { - return constants.testnetContractAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.testnetContractAddressRegex); } - return constants.mainnetContractAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.mainnetContractAddressRegex); } /** @inheritdoc */ diff --git a/modules/sdk-coin-hash/test/resources/hash.ts b/modules/sdk-coin-hash/test/resources/hash.ts index 390b512e73..b2cd9c443b 100644 --- a/modules/sdk-coin-hash/test/resources/hash.ts +++ b/modules/sdk-coin-hash/test/resources/hash.ts @@ -198,11 +198,11 @@ export const mainnetAddress = { address1: 'pb1fmxzuzx5c4ja50vu94nt0aessnuedzmppde8qr', address2: 'pb16vmp7sz28pnvgz6f3zm6q93y39jsd33aazwg4u', address3: 'pb2xvd4k9jg5h0d4dhzr4z0txtwe9p5zxf58xcmxd', - address4: 'pb1xvd4k9jg5h0d4dhzr4z0txtwe9p5zxf58xcmxd', + address4: 'pb1fmxzuzx5c4ja50vu94nt0aessnuedzmppde8qq', validatorAddress1: 'pbvaloper13905qnf0mc8f8h3dawsq0894ded0ct83f66l56', validatorAddress2: 'pbvaloper1d7yum2cxwkhmmuxa096prlv5gawjxw0gc2sykq', validatorAddress3: 'pbvaloder17yx96jtu0r24jp8gyxc8y8pj0lgvcz964w2gyg', - validatorAddress4: 'pbvaloper2v549f7d8f7junfga7yg04uz4zx0lwpqdl2f897', + validatorAddress4: 'pbvaloper13905qnf0mc8f8h3dawsq0894ded0ct83f66l55', noMemoIdAddress: 'pb1fmxzuzx5c4ja50vu94nt0aessnuedzmppde8qr', validMemoIdAddress: 'pb1fmxzuzx5c4ja50vu94nt0aessnuedzmppde8qr?memoId=2', invalidMemoIdAddress: 'pb1fmxzuzx5c4ja50vu94nt0aessnuedzmppde8qr?memoId=xyz', @@ -213,11 +213,11 @@ export const testnetAddress = { address1: 'tp1umned7wx7le70ttvrcem3fsyhn343asr2k2pwe', address2: 'tp1ytxha7lg002rzd4jxmahrdjzkd62mx99klgjcc', address3: 'txp1x96r8u4a48k6khknrhzd6c8cm3c64ewxy5prj', - address4: 'tp1496r8u4a48k6khknrhzd6c8cm3c64ewxy5p2rj', + address4: 'tp1umned7wx7le70ttvrcem3fsyhn343asr2k2pww', validatorAddress1: 'tpvaloper1tgq6cpu6hmsrvkvdu82j99tsxxw7qqajn843fe', validatorAddress2: 'tpvaloper1tgq6cpu6hmsrvkvdu82j99tsxxw7qqajn843fe', validatorAddress3: 'txvaloper1xxxxcpu6hmsrvkvdu82j99tsxxw7qqajn843fe', - validatorAddress4: 'tpvalopr1xtgq6cpu6hmsrvkvdu82j99tsxxw7qqajn843fe', + validatorAddress4: 'tpvaloper1tgq6cpu6hmsrvkvdu82j99tsxxw7qqajn843ff', noMemoIdAddress: 'tp1ytxha7lg002rzd4jxmahrdjzkd62mx99klgjcc', validMemoIdAddress: 'tp1ytxha7lg002rzd4jxmahrdjzkd62mx99klgjcc?memoId=2', invalidMemoIdAddress: 'tp1ytxha7lg002rzd4jxmahrdjzkd62mx99klgjcc?memoId=xyz', diff --git a/modules/sdk-coin-hash/test/unit/hash.ts b/modules/sdk-coin-hash/test/unit/hash.ts index f2fdb7aab6..bcbc521dbc 100644 --- a/modules/sdk-coin-hash/test/unit/hash.ts +++ b/modules/sdk-coin-hash/test/unit/hash.ts @@ -107,7 +107,7 @@ describe('HASH', function () { should.equal(mainnetUtils.isValidAddress(mainnetAddress.address1), true); should.equal(mainnetUtils.isValidAddress(mainnetAddress.address2), true); should.equal(mainnetUtils.isValidAddress(mainnetAddress.address3), false); - should.equal(mainnetUtils.isValidAddress(mainnetAddress.address4), true); + should.equal(mainnetUtils.isValidAddress(mainnetAddress.address4), false); should.equal(mainnetUtils.isValidAddress('dfjk35y'), false); should.equal(mainnetUtils.isValidAddress(undefined as unknown as string), false); should.equal(mainnetUtils.isValidAddress(''), false); @@ -118,7 +118,7 @@ describe('HASH', function () { should.equal(testnetUtils.isValidAddress(testnetAddress.address1), true); should.equal(testnetUtils.isValidAddress(testnetAddress.address2), true); should.equal(testnetUtils.isValidAddress(testnetAddress.address3), false); - should.equal(testnetUtils.isValidAddress(testnetAddress.address4), true); + should.equal(testnetUtils.isValidAddress(testnetAddress.address4), false); should.equal(testnetUtils.isValidAddress('dfjk35y'), false); should.equal(testnetUtils.isValidAddress(undefined as unknown as string), false); should.equal(testnetUtils.isValidAddress(''), false); diff --git a/modules/sdk-coin-injective/src/lib/constants.ts b/modules/sdk-coin-injective/src/lib/constants.ts index 7982901c76..20771bdd96 100644 --- a/modules/sdk-coin-injective/src/lib/constants.ts +++ b/modules/sdk-coin-injective/src/lib/constants.ts @@ -1,4 +1,4 @@ export const validDenoms = ['ninj', 'uinj', 'minj', 'inj']; -export const accountAddressRegex = /^(inj)1(['qpzry9x8gf2tvdw0s3jn54khce6mua7l']+)$/; -export const validatorAddressRegex = /^(injvaloper)1(['qpzry9x8gf2tvdw0s3jn54khce6mua7l']+)$/; +export const accountAddressRegex = /^(inj)1(['qpzry9x8gf2tvdw0s3jn54khce6mua7l']{38})$/; +export const validatorAddressRegex = /^(injvaloper)1(['qpzry9x8gf2tvdw0s3jn54khce6mua7l']{38})$/; export const contractAddressRegex = /^(inj)1(['qpzry9x8gf2tvdw0s3jn54khce6mua7l']+)$/; diff --git a/modules/sdk-coin-injective/src/lib/utils.ts b/modules/sdk-coin-injective/src/lib/utils.ts index cbc6f1e51b..908524671d 100644 --- a/modules/sdk-coin-injective/src/lib/utils.ts +++ b/modules/sdk-coin-injective/src/lib/utils.ts @@ -13,12 +13,12 @@ export class InjectiveUtils extends CosmosUtils { /** @inheritdoc */ isValidValidatorAddress(address: string): boolean { - return constants.validatorAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.validatorAddressRegex); } /** @inheritdoc */ isValidContractAddress(address: string): boolean { - return constants.contractAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.contractAddressRegex); } /** @inheritdoc */ diff --git a/modules/sdk-coin-injective/test/resources/injective.ts b/modules/sdk-coin-injective/test/resources/injective.ts index c8877e9352..9794edcc81 100644 --- a/modules/sdk-coin-injective/test/resources/injective.ts +++ b/modules/sdk-coin-injective/test/resources/injective.ts @@ -197,11 +197,11 @@ export const address = { address1: 'inj15pz6fq652cme0gx6dd2z9wtza3rwmz9j4ywksd', address2: 'inj1drn3vzg6xep63ptaxsyhj6py5aj8fy3d4303p0', address3: 'inx1xxn3vzg6xep63ptaxsyhj6py5aj8fy3d4303p0', - address4: 'inj1vftzm2nnlt0x8z9gq2hgxxywlk79m8k7k3ljgk', + address4: 'inj15pz6fq652cme0gx6dd2z9wtza3rwmz9j4ywkss', validatorAddress1: 'injvaloper1kk523rsm9pey740cx4plalp40009ncs0wrchfe', - validatorAddress2: 'injvaloper15uad884tqeq9r76x3fvktmjge2r6kek55c2zpa', + validatorAddress2: 'injvaloper19a77dzm2lrxt2gehqca3nyzq077kq7qsgvmrp4', validatorAddress3: 'inxvaloper1xxx23rsm9pey740cx4plalp40009ncs0wrchfe', - validatorAddress4: 'injvalopr1xkk523rsm9pey740cx4plalp40009ncs0wrchfe', + validatorAddress4: 'injvaloper1kk523rsm9pey740cx4plalp40009ncs0wrchff', noMemoIdAddress: 'inj15uad884tqeq9r76x3fvktmjge2r6kek55c2zpa', validMemoIdAddress: 'inj15uad884tqeq9r76x3fvktmjge2r6kek55c2zpa?memoId=2', invalidMemoIdAddress: 'inj15uad884tqeq9r76x3fvktmjge2r6kek55c2zpa?memoId=xyz', diff --git a/modules/sdk-coin-injective/test/unit/injective.ts b/modules/sdk-coin-injective/test/unit/injective.ts index 7073cc645e..63686a6028 100644 --- a/modules/sdk-coin-injective/test/unit/injective.ts +++ b/modules/sdk-coin-injective/test/unit/injective.ts @@ -88,7 +88,7 @@ describe('INJ', function () { should.equal(utils.isValidAddress(address.address1), true); should.equal(utils.isValidAddress(address.address2), true); should.equal(utils.isValidAddress(address.address3), false); - should.equal(utils.isValidAddress(address.address4), true); + should.equal(utils.isValidAddress(address.address4), false); should.equal(utils.isValidAddress('dfjk35y'), false); should.equal(utils.isValidAddress(undefined as unknown as string), false); should.equal(utils.isValidAddress(''), false); diff --git a/modules/sdk-coin-osmo/src/lib/utils.ts b/modules/sdk-coin-osmo/src/lib/utils.ts index 28c571edfe..718adbf53b 100644 --- a/modules/sdk-coin-osmo/src/lib/utils.ts +++ b/modules/sdk-coin-osmo/src/lib/utils.ts @@ -12,12 +12,12 @@ export class OsmoUtils extends CosmosUtils { /** @inheritdoc */ isValidValidatorAddress(address: string): boolean { - return constants.validatorAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.validatorAddressRegex); } /** @inheritdoc */ isValidContractAddress(address: string): boolean { - return constants.contractAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.contractAddressRegex); } /** @inheritdoc */ diff --git a/modules/sdk-coin-osmo/test/resources/osmo.ts b/modules/sdk-coin-osmo/test/resources/osmo.ts index 3dc98d4796..491e3a64ab 100644 --- a/modules/sdk-coin-osmo/test/resources/osmo.ts +++ b/modules/sdk-coin-osmo/test/resources/osmo.ts @@ -227,11 +227,11 @@ export const address = { address1: 'osmo1jj65dw2qun4rdx6wuvtc4u8wadhhzwmu7zvlw3', address2: 'osmo1memtsmlz95gf938agf5q6qfhhht4ppe8mejcus', address3: 'osxx1xxxz06yx0u3yjzjjjm02xyx3mh25akenzql3n8', - address4: 'osmo15al6vq6yfyqwru5adaxd9ju5e46qpvxx345cyg', + address4: 'osmo1jj65dw2qun4rdx6wuvtc4u8wadhhzwmu7zvlww', validatorAddress1: 'osmovaloper1hh0g5xf23e5zekg45cmerc97hs4n2004dy2t26', - validatorAddress2: 'osmovaloper12xt4x49p96n9aw4umjwyp3huct27nwr2g4r6p2', + validatorAddress2: 'osmovaloper14lzvt4gdwh2q4ymyjqma0p4j4aykpn92l4warr', validatorAddress3: 'osxyvaloper1xxxz06yx0u3yjzjjjm02xyx3mh25akenzql3n8', - validatorAddress4: 'osmovalopr16ghn9c6f5yua09zqw7y794mvc30h4y4md7ckuk', + validatorAddress4: 'osmovaloper1hh0g5xf23e5zekg45cmerc97hs4n2004dy2t22', noMemoIdAddress: 'osmo15al6vq6yfyqwru5adaxd9ju5e46qpvxx345cyg', validMemoIdAddress: 'osmo1memtsmlz95gf938agf5q6qfhhht4ppe8mejcus?memoId=2', invalidMemoIdAddress: 'osmo1memtsmlz95gf938agf5q6qfhhht4ppe8mejcus?memoId=xyz', diff --git a/modules/sdk-coin-osmo/test/unit/osmo.ts b/modules/sdk-coin-osmo/test/unit/osmo.ts index e506f6a4e5..ed5f2daf46 100644 --- a/modules/sdk-coin-osmo/test/unit/osmo.ts +++ b/modules/sdk-coin-osmo/test/unit/osmo.ts @@ -87,7 +87,7 @@ describe('OSMO', function () { should.equal(utils.isValidAddress(address.address1), true); should.equal(utils.isValidAddress(address.address2), true); should.equal(utils.isValidAddress(address.address3), false); - should.equal(utils.isValidAddress(address.address4), true); + should.equal(utils.isValidAddress(address.address4), false); should.equal(utils.isValidAddress('dfjk35y'), false); should.equal(utils.isValidAddress(undefined as unknown as string), false); should.equal(utils.isValidAddress(''), false); diff --git a/modules/sdk-coin-sei/src/lib/utils.ts b/modules/sdk-coin-sei/src/lib/utils.ts index 75f5254b20..a75dd869ca 100644 --- a/modules/sdk-coin-sei/src/lib/utils.ts +++ b/modules/sdk-coin-sei/src/lib/utils.ts @@ -13,12 +13,12 @@ export class SeiUtils extends CosmosUtils { /** @inheritdoc */ isValidValidatorAddress(address: string): boolean { - return constants.validatorAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.validatorAddressRegex); } /** @inheritdoc */ isValidContractAddress(address: string): boolean { - return constants.contractAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.contractAddressRegex); } /** @inheritdoc */ diff --git a/modules/sdk-coin-sei/test/resources/sei.ts b/modules/sdk-coin-sei/test/resources/sei.ts index d1bc87c7fb..b67c0edf4b 100644 --- a/modules/sdk-coin-sei/test/resources/sei.ts +++ b/modules/sdk-coin-sei/test/resources/sei.ts @@ -197,11 +197,11 @@ export const address = { address1: 'sei109plq5s2dqlj7jnvnw2833hxku7f9fuuxzkd8h', address2: 'sei13xa5cszqv58f4g6ptjemu5t5h0gpydc6eg9rgr', address3: 'sxi10xplq5s2dqlj7jnvnw2833hxku7f9fuuxzkd8h', - address4: 'sei1lyymgvt294ruvhm4cf50q2y0qnh0qmdqvm8dv6', + address4: 'sei109plq5s2dqlj7jnvnw2833hxku7f9fuuxzkd88', validatorAddress1: 'seivaloper19t4d78pt5xg6xm0mf97q8ay7v0xwrr4jmf04j3', validatorAddress2: 'seivaloper19t4d78pt5xg6xm0mf97q8ay7v0xwrr4jmf04j3', validatorAddress3: 'sxivaloper1xx4d78pt5xg6xm0mf97q8ay7v0xwrr4jmf04j3', - validatorAddress4: 'seivalopr19xt4d78pt5xg6xm0mf97q8ay7v0xwrr4jmf04j3', + validatorAddress4: 'seivaloper19t4d78pt5xg6xm0mf97q8ay7v0xwrr4jmf04jj', noMemoIdAddress: 'sei13xa5cszqv58f4g6ptjemu5t5h0gpydc6eg9rgr', validMemoIdAddress: 'sei13xa5cszqv58f4g6ptjemu5t5h0gpydc6eg9rgr?memoId=2', invalidMemoIdAddress: 'sei13xa5cszqv58f4g6ptjemu5t5h0gpydc6eg9rgr?memoId=xyz', diff --git a/modules/sdk-coin-sei/test/unit/sei.ts b/modules/sdk-coin-sei/test/unit/sei.ts index 5c7f558738..f46dba575e 100644 --- a/modules/sdk-coin-sei/test/unit/sei.ts +++ b/modules/sdk-coin-sei/test/unit/sei.ts @@ -86,7 +86,7 @@ describe('SEI', function () { should.equal(utils.isValidAddress(address.address1), true); should.equal(utils.isValidAddress(address.address2), true); should.equal(utils.isValidAddress(address.address3), false); - should.equal(utils.isValidAddress(address.address4), true); + should.equal(utils.isValidAddress(address.address4), false); should.equal(utils.isValidAddress('dfjk35y'), false); should.equal(utils.isValidAddress(undefined as unknown as string), false); should.equal(utils.isValidAddress(''), false); diff --git a/modules/sdk-coin-tia/src/lib/utils.ts b/modules/sdk-coin-tia/src/lib/utils.ts index 9b4458daef..a51d7c48c2 100644 --- a/modules/sdk-coin-tia/src/lib/utils.ts +++ b/modules/sdk-coin-tia/src/lib/utils.ts @@ -13,12 +13,12 @@ export class TiaUtils extends CosmosUtils { /** @inheritdoc */ isValidValidatorAddress(address: string): boolean { - return constants.validatorAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.validatorAddressRegex); } /** @inheritdoc */ isValidContractAddress(address: string): boolean { - return constants.contractAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.contractAddressRegex); } /** @inheritdoc */ diff --git a/modules/sdk-coin-tia/test/resources/tia.ts b/modules/sdk-coin-tia/test/resources/tia.ts index 564dc2ef87..327de8bc6e 100644 --- a/modules/sdk-coin-tia/test/resources/tia.ts +++ b/modules/sdk-coin-tia/test/resources/tia.ts @@ -320,11 +320,11 @@ export const address = { address1: 'celestia1yn3t8qujmtxjsnx7angjua3jhvkjxy5n5xgs0n', address2: 'celestia1tygms3xhhs3yv487phx3dw4a95jn7t7ls3yw4w', address3: 'celexxxx1xxxz4q3dnzq0hzl4knpxsgg65gd43aadx689vt', - address4: 'celestia13u434q3dnzq0hzl4knpxsgg65gd43aadx689vt', + address4: 'celestia1yn3t8qujmtxjsnx7angjua3jhvkjxy5n5xgs00', validatorAddress1: 'celestiavaloper1q3v5cugc8cdpud87u4zwy0a74uxkk6u4q4gx4p', validatorAddress2: 'celestiavaloper1q3v5cugc8cdpud87u4zwy0a74uxkk6u4q4gx4p', validatorAddress3: 'celestaivaloper1xxxxcugc8cdpud87u4zwy0a74uxkk6u4q4gx4p', - validatorAddress4: 'celestiavalopr1xq3v5cugc8cdpud87u4zwy0a74uxkk6u4q4gx4p', + validatorAddress4: 'celestiavaloper1q3v5cugc8cdpud87u4zwy0a74uxkk6u4q4gx44', noMemoIdAddress: 'celestia13u434q3dnzq0hzl4knpxsgg65gd43aadx689vt', validMemoIdAddress: 'celestia13u434q3dnzq0hzl4knpxsgg65gd43aadx689vt?memoId=2', invalidMemoIdAddress: 'celestia13u434q3dnzq0hzl4knpxsgg65gd43aadx689vt?memoId=xyz', diff --git a/modules/sdk-coin-tia/test/unit/tia.ts b/modules/sdk-coin-tia/test/unit/tia.ts index 77e163657c..788b4f85a7 100644 --- a/modules/sdk-coin-tia/test/unit/tia.ts +++ b/modules/sdk-coin-tia/test/unit/tia.ts @@ -91,7 +91,7 @@ describe('TIA', function () { should.equal(utils.isValidAddress(address.address1), true); should.equal(utils.isValidAddress(address.address2), true); should.equal(utils.isValidAddress(address.address3), false); - should.equal(utils.isValidAddress(address.address4), true); + should.equal(utils.isValidAddress(address.address4), false); should.equal(utils.isValidAddress('dfjk35y'), false); should.equal(utils.isValidAddress(undefined as unknown as string), false); should.equal(utils.isValidAddress(''), false); diff --git a/modules/sdk-coin-zeta/src/lib/utils.ts b/modules/sdk-coin-zeta/src/lib/utils.ts index 9a5b0ce73b..586d052d17 100644 --- a/modules/sdk-coin-zeta/src/lib/utils.ts +++ b/modules/sdk-coin-zeta/src/lib/utils.ts @@ -13,12 +13,12 @@ export class ZetaUtils extends CosmosUtils { /** @inheritdoc */ isValidValidatorAddress(address: string): boolean { - return constants.validatorAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.validatorAddressRegex); } /** @inheritdoc */ isValidContractAddress(address: string): boolean { - return constants.contractAddressRegex.test(address); + return this.isValidBech32AddressMatchingRegex(address, constants.contractAddressRegex); } /** @inheritdoc */ diff --git a/modules/sdk-coin-zeta/test/resources/zeta.ts b/modules/sdk-coin-zeta/test/resources/zeta.ts index 6b0f21e8cc..716ba50996 100644 --- a/modules/sdk-coin-zeta/test/resources/zeta.ts +++ b/modules/sdk-coin-zeta/test/resources/zeta.ts @@ -197,11 +197,11 @@ export const address = { address1: 'zeta18t3y6mzljydmqzrlfrnsfvwtdupww0dexegtuu', address2: 'zeta12khxmlkyz9hfluv2dtd4t74lf3hrmaky0sq0e2', address3: 'zxta18t3y6mzljydmqzrlfrnsfvwtdupww0dexegtuu', - address4: 'zeta1yt84ujwncxjy63rjceh7dcakx09cdz6yrst5hq', + address4: 'zeta18t3y6mzljydmqzrlfrnsfvwtdupww0dexegtuv', validatorAddress1: 'zetavaloper1pptfhnyj37qn0nfuhmu7m5ssy5x6td8hmccpzl', validatorAddress2: 'zetavaloper1p3emgemv8q0fmtw70kfzwecmcvyd9ztqlzudwn', validatorAddress3: 'zxtavaloper1ztq4hqq29ea7pxa0gq4j72a0qakj0nk6se8uxx', - validatorAddress4: 'zetavalopr1xylc3m77tvm7wkrc7awn2tlqp4zfwvgnpdywp4y', + validatorAddress4: 'zetavaloper1pptfhnyj37qn0nfuhmu7m5ssy5x6td8hmccpzx', noMemoIdAddress: 'zeta18t3y6mzljydmqzrlfrnsfvwtdupww0dexegtuu', validMemoIdAddress: 'zeta18t3y6mzljydmqzrlfrnsfvwtdupww0dexegtuu?memoId=2', invalidMemoIdAddress: 'zeta18t3y6mzljydmqzrlfrnsfvwtdupww0dexegtuu?memoId=xyz', diff --git a/modules/sdk-coin-zeta/test/unit/zeta.ts b/modules/sdk-coin-zeta/test/unit/zeta.ts index b601dfd8f3..e3334270bf 100644 --- a/modules/sdk-coin-zeta/test/unit/zeta.ts +++ b/modules/sdk-coin-zeta/test/unit/zeta.ts @@ -89,7 +89,7 @@ describe('Zeta', function () { should.equal(utils.isValidAddress(address.address1), true); should.equal(utils.isValidAddress(address.address2), true); should.equal(utils.isValidAddress(address.address3), false); - should.equal(utils.isValidAddress(address.address4), true); + should.equal(utils.isValidAddress(address.address4), false); should.equal(utils.isValidAddress('dfjk35y'), false); should.equal(utils.isValidAddress(undefined as unknown as string), false); should.equal(utils.isValidAddress(''), false);