@@ -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,31 @@ 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+ const mainnetCoin = coins . get ( coin . family ) ;
954+ if ( mainnetCoin ?. features . includes ( CoinFeature . SUPPORTS_ERC721 ) ) {
955+ mainnetToTestnetMapForErc721Tokens [ coin . family ] = `${ coin . name } ` ;
956+ testnetToMainnetMapForErc721Tokens [ coin . name ] = `${ coin . family } ` ;
957+ }
958+ }
959+ } ) ;
960+
961+ return { mainnetToTestnetMapForErc721Tokens, testnetToMainnetMapForErc721Tokens } ;
962+ } ;
963+
929964const { mainnetToTestnetMap, testnetToMainnetMap } = buildEthLikeChainToTestnetMap ( ) ;
930965
966+ const { mainnetToTestnetMapForErc721Tokens, testnetToMainnetMapForErc721Tokens } =
967+ buildEthLikeErc721ChainToTestnetMap ( ) ;
968+
931969export function getTokenConstructor ( tokenConfig : TokenConfig ) : CoinConstructor | undefined {
932970 const testnetCoin = mainnetToTestnetMap [ tokenConfig . coin ] ;
933971 if ( testnetCoin ) {
@@ -943,6 +981,21 @@ export function getTokenConstructor(tokenConfig: TokenConfig): CoinConstructor |
943981 Testnet : tokenConfig . coin ,
944982 } ) ;
945983 }
984+
985+ if ( mainnetToTestnetMapForErc721Tokens [ tokenConfig . coin ] ) {
986+ return EthLikeErc721Token . createTokenConstructor ( tokenConfig as EthLikeTokenConfig , {
987+ Mainnet : tokenConfig . coin ,
988+ Testnet : mainnetToTestnetMapForErc721Tokens [ tokenConfig . coin ] ,
989+ } ) ;
990+ }
991+
992+ if ( testnetToMainnetMapForErc721Tokens [ tokenConfig . coin ] ) {
993+ return EthLikeErc721Token . createTokenConstructor ( tokenConfig as EthLikeTokenConfig , {
994+ Mainnet : testnetToMainnetMapForErc721Tokens [ tokenConfig . coin ] ,
995+ Testnet : tokenConfig . coin ,
996+ } ) ;
997+ }
998+
946999 switch ( tokenConfig . coin ) {
9471000 case 'eth' :
9481001 case 'hteth' :
0 commit comments