@@ -9,7 +9,8 @@ import { Near, TNear, Nep141Token } from '@bitgo/sdk-coin-near';
99import { SolToken } from '@bitgo/sdk-coin-sol' ;
1010import { TrxToken } from '@bitgo/sdk-coin-trx' ;
1111import { CoinFactory , CoinConstructor } from '@bitgo/sdk-core' ;
12- import { EthLikeErc20Token } from '@bitgo/sdk-coin-evm' ;
12+ import { EthLikeErc20Token , EthLikeErc721Token } from '@bitgo/sdk-coin-evm' ;
13+
1314import {
1415 CoinMap ,
1516 coins ,
@@ -565,6 +566,20 @@ export function registerCoinConstructors(coinFactory: CoinFactory, coinMap: Coin
565566 coinFactory . register ( name , coinConstructor ) ;
566567 } ) ;
567568 } ) ;
569+
570+ // Generic ERC721 token registration for coins with SUPPORTS_ERC721 feature
571+ coins
572+ . filter ( ( coin ) => coin . features . includes ( CoinFeature . SUPPORTS_ERC721 ) && ! coin . isToken )
573+ . forEach ( ( coin ) => {
574+ const coinNames = {
575+ Mainnet : `${ coin . name } ` ,
576+ Testnet : `t${ coin . name } ` ,
577+ } ;
578+
579+ EthLikeErc721Token . createTokenConstructors ( coinNames ) . forEach ( ( { name, coinConstructor } ) => {
580+ coinFactory . register ( name , coinConstructor ) ;
581+ } ) ;
582+ } ) ;
568583}
569584
570585export function getCoinConstructor ( coinName : string ) : CoinConstructor | undefined {
@@ -926,8 +941,30 @@ export const buildEthLikeChainToTestnetMap = (): {
926941 return { mainnetToTestnetMap, testnetToMainnetMap } ;
927942} ;
928943
944+ const buildEthLikeErc721ChainToTestnetMap = ( ) : {
945+ mainnetToTestnetMapForErc721Tokens : Record < string , string > ;
946+ testnetToMainnetMapForErc721Tokens : Record < string , string > ;
947+ } => {
948+ const testnetToMainnetMapForErc721Tokens : Record < string , string > = { } ;
949+ const mainnetToTestnetMapForErc721Tokens : Record < string , string > = { } ;
950+
951+ coins . forEach ( ( coin ) => {
952+ if ( coin . network . type === NetworkType . TESTNET && ! coin . isToken ) {
953+ if ( coins . get ( coin . family ) ?. features . includes ( CoinFeature . SUPPORTS_ERC721 ) ) {
954+ mainnetToTestnetMapForErc721Tokens [ coin . family ] = `${ coin . name } ` ;
955+ testnetToMainnetMapForErc721Tokens [ coin . name ] = `${ coin . family } ` ;
956+ }
957+ }
958+ } ) ;
959+
960+ return { mainnetToTestnetMapForErc721Tokens, testnetToMainnetMapForErc721Tokens } ;
961+ } ;
962+
929963const { mainnetToTestnetMap, testnetToMainnetMap } = buildEthLikeChainToTestnetMap ( ) ;
930964
965+ const { mainnetToTestnetMapForErc721Tokens, testnetToMainnetMapForErc721Tokens } =
966+ buildEthLikeErc721ChainToTestnetMap ( ) ;
967+
931968export function getTokenConstructor ( tokenConfig : TokenConfig ) : CoinConstructor | undefined {
932969 const testnetCoin = mainnetToTestnetMap [ tokenConfig . coin ] ;
933970 if ( testnetCoin ) {
@@ -943,6 +980,21 @@ export function getTokenConstructor(tokenConfig: TokenConfig): CoinConstructor |
943980 Testnet : tokenConfig . coin ,
944981 } ) ;
945982 }
983+
984+ if ( mainnetToTestnetMapForErc721Tokens [ tokenConfig . coin ] ) {
985+ return EthLikeErc721Token . createTokenConstructor ( tokenConfig as EthLikeTokenConfig , {
986+ Mainnet : tokenConfig . coin ,
987+ Testnet : mainnetToTestnetMapForErc721Tokens [ tokenConfig . coin ] ,
988+ } ) ;
989+ }
990+
991+ if ( testnetToMainnetMapForErc721Tokens [ tokenConfig . coin ] ) {
992+ return EthLikeErc721Token . createTokenConstructor ( tokenConfig as EthLikeTokenConfig , {
993+ Mainnet : testnetToMainnetMapForErc721Tokens [ tokenConfig . coin ] ,
994+ Testnet : tokenConfig . coin ,
995+ } ) ;
996+ }
997+
946998 switch ( tokenConfig . coin ) {
947999 case 'eth' :
9481000 case 'hteth' :
0 commit comments