Skip to content

Commit 8c82c2f

Browse files
feat(abstract-eth): implement isWalletAddress for ethlike mpc
TICKET: WP-6461
1 parent f4e4d4e commit 8c82c2f

File tree

1 file changed

+29
-14
lines changed

1 file changed

+29
-14
lines changed

modules/abstract-eth/src/abstractEthLikeNewCoins.ts

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ import {
4040
VerifyAddressOptions as BaseVerifyAddressOptions,
4141
VerifyTransactionOptions,
4242
Wallet,
43+
verifyMPCWalletAddress,
44+
TssVerifyAddressOptions,
45+
isTssVerifyAddressOptions,
4346
} from '@bitgo/sdk-core';
4447
import { getDerivationPath } from '@bitgo/sdk-lib-mpc';
4548
import { bip32 } from '@bitgo/secp256k1';
@@ -402,8 +405,11 @@ export interface VerifyEthAddressOptions extends BaseVerifyAddressOptions {
402405
baseAddress: string;
403406
coinSpecific: EthAddressCoinSpecifics;
404407
forwarderVersion: number;
408+
walletVersion?: number;
405409
}
406410

411+
export type TssVerifyEthAddressOptions = TssVerifyAddressOptions & VerifyEthAddressOptions;
412+
407413
const debug = debugLib('bitgo:v2:ethlike');
408414

409415
export const optionalDeps = {
@@ -2731,32 +2737,41 @@ export abstract class AbstractEthLikeNewCoins extends AbstractEthLikeCoin {
27312737
* @throws {UnexpectedAddressError}
27322738
* @returns {boolean} True iff address is a wallet address
27332739
*/
2734-
async isWalletAddress(params: VerifyEthAddressOptions): Promise<boolean> {
2740+
async isWalletAddress(params: VerifyEthAddressOptions | TssVerifyEthAddressOptions): Promise<boolean> {
27352741
const ethUtil = optionalDeps.ethUtil;
27362742

27372743
let expectedAddress;
27382744
let actualAddress;
27392745

2740-
const { address, coinSpecific, baseAddress, impliedForwarderVersion = coinSpecific?.forwarderVersion } = params;
2746+
const { address, impliedForwarderVersion } = params;
27412747

27422748
if (address && !this.isValidAddress(address)) {
27432749
throw new InvalidAddressError(`invalid address: ${address}`);
27442750
}
2745-
2746-
// base address is required to calculate the salt which is used in calculateForwarderV1Address method
2747-
if (_.isUndefined(baseAddress) || !this.isValidAddress(baseAddress)) {
2748-
throw new InvalidAddressError('invalid base address');
2751+
if (impliedForwarderVersion === 0) {
2752+
return true;
27492753
}
2754+
// Verify MPC wallet address for wallet version 3 and 6 (MPC receive address)
2755+
if (isTssVerifyAddressOptions(params) && params.walletVersion !== 5) {
2756+
return verifyMPCWalletAddress({ ...params, keyCurve: 'secp256k1' }, this.isValidAddress, (pubKey) => {
2757+
const derivedPublicKey = Buffer.from(pubKey, 'hex').subarray(0, 33).toString('hex');
2758+
return new KeyPairLib({ pub: derivedPublicKey }).getAddress();
2759+
});
2760+
} else {
2761+
// Verify forwarder receive address
2762+
const { coinSpecific, baseAddress } = params;
27502763

2751-
if (!_.isObject(coinSpecific)) {
2752-
throw new InvalidAddressVerificationObjectPropertyError(
2753-
'address validation failure: coinSpecific field must be an object'
2754-
);
2755-
}
2764+
// base address is required to calculate the salt which is used in calculateForwarderV1Address method
2765+
if (_.isUndefined(baseAddress) || !this.isValidAddress(baseAddress)) {
2766+
throw new InvalidAddressError('invalid base address');
2767+
}
2768+
2769+
if (!_.isObject(coinSpecific)) {
2770+
throw new InvalidAddressVerificationObjectPropertyError(
2771+
'address validation failure: coinSpecific field must be an object'
2772+
);
2773+
}
27562774

2757-
if (impliedForwarderVersion === 0 || impliedForwarderVersion === 3 || impliedForwarderVersion === 5) {
2758-
return true;
2759-
} else {
27602775
const ethNetwork = this.getNetwork();
27612776
const forwarderFactoryAddress = ethNetwork?.forwarderFactoryAddress as string;
27622777
const forwarderImplementationAddress = ethNetwork?.forwarderImplementationAddress as string;

0 commit comments

Comments
 (0)