@@ -40,6 +40,9 @@ import {
4040 VerifyAddressOptions as BaseVerifyAddressOptions ,
4141 VerifyTransactionOptions ,
4242 Wallet ,
43+ verifyMPCWalletAddress ,
44+ TssVerifyAddressOptions ,
45+ isTssVerifyAddressOptions ,
4346} from '@bitgo/sdk-core' ;
4447import { getDerivationPath } from '@bitgo/sdk-lib-mpc' ;
4548import { 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+
407413const debug = debugLib ( 'bitgo:v2:ethlike' ) ;
408414
409415export 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