@@ -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 ,
@@ -39,6 +40,7 @@ import {
3940 PolyxTokenConfig ,
4041 JettonTokenConfig ,
4142 NetworkType ,
43+ BaseCoin ,
4244} from '@bitgo/statics' ;
4345import {
4446 Ada ,
@@ -565,6 +567,20 @@ export function registerCoinConstructors(coinFactory: CoinFactory, coinMap: Coin
565567 coinFactory . register ( name , coinConstructor ) ;
566568 } ) ;
567569 } ) ;
570+
571+ // Generic ERC721 token registration for coins with SUPPORTS_ERC721 feature
572+ coins
573+ . filter ( ( coin ) => coin . features . includes ( CoinFeature . SUPPORTS_ERC721 ) && ! coin . isToken )
574+ . forEach ( ( coin ) => {
575+ const coinNames = {
576+ Mainnet : `${ coin . name } ` ,
577+ Testnet : `t${ coin . name } ` ,
578+ } ;
579+
580+ EthLikeErc721Token . createTokenConstructors ( coinNames ) . forEach ( ( { name, coinConstructor } ) => {
581+ coinFactory . register ( name , coinConstructor ) ;
582+ } ) ;
583+ } ) ;
568584}
569585
570586export function getCoinConstructor ( coinName : string ) : CoinConstructor | undefined {
@@ -926,8 +942,36 @@ export const buildEthLikeChainToTestnetMap = (): {
926942 return { mainnetToTestnetMap, testnetToMainnetMap } ;
927943} ;
928944
945+ const buildEthLikeErc721ChainToTestnetMap = ( ) : {
946+ mainnetToTestnetMapForErc721Tokens : Record < string , string > ;
947+ testnetToMainnetMapForErc721Tokens : Record < string , string > ;
948+ } => {
949+ const testnetToMainnetMapForErc721Tokens : Record < string , string > = { } ;
950+ const mainnetToTestnetMapForErc721Tokens : Record < string , string > = { } ;
951+
952+ coins . forEach ( ( coin ) => {
953+ if ( coin . network . type === NetworkType . TESTNET && ! coin . isToken ) {
954+ let mainnetCoin : Readonly < BaseCoin > ;
955+ try {
956+ mainnetCoin = coins . get ( coin . family ) ;
957+ } catch ( e ) {
958+ return ;
959+ }
960+ if ( mainnetCoin . features . includes ( CoinFeature . SUPPORTS_ERC721 ) ) {
961+ mainnetToTestnetMapForErc721Tokens [ coin . family ] = `${ coin . name } ` ;
962+ testnetToMainnetMapForErc721Tokens [ coin . name ] = `${ coin . family } ` ;
963+ }
964+ }
965+ } ) ;
966+
967+ return { mainnetToTestnetMapForErc721Tokens, testnetToMainnetMapForErc721Tokens } ;
968+ } ;
969+
929970const { mainnetToTestnetMap, testnetToMainnetMap } = buildEthLikeChainToTestnetMap ( ) ;
930971
972+ const { mainnetToTestnetMapForErc721Tokens, testnetToMainnetMapForErc721Tokens } =
973+ buildEthLikeErc721ChainToTestnetMap ( ) ;
974+
931975export function getTokenConstructor ( tokenConfig : TokenConfig ) : CoinConstructor | undefined {
932976 const testnetCoin = mainnetToTestnetMap [ tokenConfig . coin ] ;
933977 if ( testnetCoin ) {
@@ -943,6 +987,21 @@ export function getTokenConstructor(tokenConfig: TokenConfig): CoinConstructor |
943987 Testnet : tokenConfig . coin ,
944988 } ) ;
945989 }
990+
991+ if ( mainnetToTestnetMapForErc721Tokens [ tokenConfig . coin ] ) {
992+ return EthLikeErc721Token . createTokenConstructor ( tokenConfig as EthLikeTokenConfig , {
993+ Mainnet : tokenConfig . coin ,
994+ Testnet : mainnetToTestnetMapForErc721Tokens [ tokenConfig . coin ] ,
995+ } ) ;
996+ }
997+
998+ if ( testnetToMainnetMapForErc721Tokens [ tokenConfig . coin ] ) {
999+ return EthLikeErc721Token . createTokenConstructor ( tokenConfig as EthLikeTokenConfig , {
1000+ Mainnet : testnetToMainnetMapForErc721Tokens [ tokenConfig . coin ] ,
1001+ Testnet : tokenConfig . coin ,
1002+ } ) ;
1003+ }
1004+
9461005 switch ( tokenConfig . coin ) {
9471006 case 'eth' :
9481007 case 'hteth' :
0 commit comments