Skip to content

Commit 6fe4bf0

Browse files
Merge pull request #8333 from BitGo/CGARD-554
fix(sdk-coin-coreum): accept 32-byte addresses in isValidAddress
2 parents effb265 + 5699b47 commit 6fe4bf0

4 files changed

Lines changed: 34 additions & 3 deletions

File tree

CODEOWNERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
/modules/sdk-coin-bsc/ @BitGo/ethalt-team
6363
/modules/sdk-coin-canton/ @BitGo/ethalt-team
6464
/modules/sdk-coin-coredao/ @BitGo/ethalt-team
65+
/modules/sdk-coin-coreum/ @BitGo/ethalt-team
6566
/modules/sdk-coin-cosmos/ @BitGo/ethalt-team
6667
/modules/sdk-coin-cronos/ @BitGo/ethalt-team
6768
/modules/sdk-coin-cspr/ @BitGo/ethalt-team

modules/sdk-coin-coreum/src/lib/constants.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ import { CosmosUtils } from '@bitgo/abstract-cosmos';
22

33
const cosmosUtils = new CosmosUtils();
44
export const validDenoms = ['ucore', 'utestcore', ...cosmosUtils.getTokenDenomsUsingCoinFamily('coreum')];
5-
export const mainnetAccountAddressRegex = /^(core)1(['qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38})$/;
5+
export const mainnetAccountAddressRegex =
6+
/^(core)1(['qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38}|['qpzry9x8gf2tvdw0s3jn54khce6mua7l]{58})$/;
67
export const mainnetValidatorAddressRegex = /^(corevaloper)1(['qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38})$/;
78
export const MAINNET_ADDRESS_PREFIX = 'core';
8-
export const testnetAccountAddressRegex = /^(testcore)1(['qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38})$/;
9+
export const testnetAccountAddressRegex =
10+
/^(testcore)1(['qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38}|['qpzry9x8gf2tvdw0s3jn54khce6mua7l]{58})$/;
911
export const testnetValidatorAddressRegex = /^(testcorevaloper)1(['qpzry9x8gf2tvdw0s3jn54khce6mua7l]{38})$/;
1012
export const TESTNET_ADDRESS_PREFIX = 'testcore';
1113

modules/sdk-coin-coreum/test/resources/coreum.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export const mainnetAddress = {
1919
address2: 'core1ssh2d2ft6hzrgn9z6k7mmsamy2hfpxl9y8re5x',
2020
address3: 'core35udp7m30va5njkdrguj27wvk9lnutfwkevk7n9',
2121
address4: 'core1v7n3mrjg58udt7cyhv9gs62t8wcf9sh8w604yy',
22+
address32byte1: 'core1pnxmcuxqvumfe6ktv40v2vm3z0zckluupzxu3uuq0f7t07w6xuwsc7td3m',
2223
validatorAddress1: 'corevaloper1gsaxrwfu5glgw764mqhc4t8f3yxg2h07rmwt0k',
2324
validatorAddress2: 'corevaloper1x9hd9r7duv2gagztvvqlw94v5gy4zd9xwhqnlm',
2425
validatorAddress3: 'corevaloper2flaz3hzgg3tjszl372lu2zz5jsmxd8pvydl7gg',

modules/sdk-coin-coreum/test/unit/utils.ts

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import { NetworkType } from '@bitgo/statics';
22
import should from 'should';
33
import { CoreumUtils } from '../../src/lib/utils';
4-
import { blockHash, mainnetCoinAmounts, txIds } from '../resources/coreum';
4+
import { mainnetAccountAddressRegex, testnetAccountAddressRegex } from '../../src/lib/constants';
5+
import { blockHash, mainnetAddress, mainnetCoinAmounts, txIds } from '../resources/coreum';
56
import { testnetCoinAmounts } from '../resources/tcoreum';
67

78
describe('utils', () => {
@@ -36,6 +37,32 @@ describe('utils', () => {
3637
should.equal(mainnetUtils.isValidTransactionId('dalij43ta0ga2dadda02'), false);
3738
});
3839

40+
it('should accept 32-byte (group module / smart contract) addresses', () => {
41+
should.equal(mainnetUtils.isValidAddress(mainnetAddress.address32byte1), true);
42+
should.equal(mainnetUtils.isValidAddress(`${mainnetAddress.address32byte1}?memoId=1`), true);
43+
});
44+
45+
it('should reject 32-byte addresses with an invalid checksum', () => {
46+
const corrupted = mainnetAddress.address32byte1.slice(0, -1) + 'q';
47+
should.equal(mainnetUtils.isValidAddress(corrupted), false);
48+
});
49+
50+
it('should reject addresses with intermediate data lengths (not 38 or 58 chars)', () => {
51+
const bech32Chars = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l';
52+
const intermediateData = bech32Chars.repeat(2).slice(0, 48);
53+
should.equal(mainnetAccountAddressRegex.test(`core1${intermediateData}`), false);
54+
should.equal(testnetAccountAddressRegex.test(`testcore1${intermediateData}`), false);
55+
});
56+
57+
it('testnet regex should accept both 20-byte and 32-byte address lengths', () => {
58+
const data38 = 'qpzry9x8gf2tvdw0s3jn54khce6mua7lqpzry9';
59+
should.equal(testnetAccountAddressRegex.test(`testcore1${data38}`), true);
60+
const data58 = 'qpzry9x8gf2tvdw0s3jn54khce6mua7lqpzry9x8gf2tvdw0s3jn54khce';
61+
should.equal(testnetAccountAddressRegex.test(`testcore1${data58}`), true);
62+
const data39 = 'qpzry9x8gf2tvdw0s3jn54khce6mua7lqpzry9x';
63+
should.equal(testnetAccountAddressRegex.test(`testcore1${data39}`), false);
64+
});
65+
3966
it('validateAmount', function () {
4067
should.doesNotThrow(() => mainnetUtils.validateAmountData([mainnetCoinAmounts.amount1]));
4168
should.doesNotThrow(() => mainnetUtils.validateAmountData([mainnetCoinAmounts.amount2]));

0 commit comments

Comments
 (0)