diff --git a/src/assets/AssetsContractController.ts b/src/assets/AssetsContractController.ts index 24a6c02d90d..0266e6ca218 100644 --- a/src/assets/AssetsContractController.ts +++ b/src/assets/AssetsContractController.ts @@ -142,14 +142,34 @@ export class AssetsContractController extends BaseController< ); } - async getTokenStandard(address: string) { + async getTokenStandardAndDetails(address: string, tokenId?: string) { // ERC721 try { const erc721Contract = this.web3.eth.contract(abiERC721).at(address); const isERC721 = await this.erc721Standard.contractSupportsBase721Interface( erc721Contract, ); - return isERC721 && ERC721; + const supportsMetadata = await this.erc721Standard.contractSupportsMetadataInterface( + erc721Contract, + ); + let tokenURI, symbol, name; + if (supportsMetadata && tokenId) { + tokenURI = this.erc721Standard.getCollectibleTokenURI( + erc721Contract, + tokenId, + ); + symbol = this.erc721Standard.getAssetSymbol(erc721Contract); + name = this.erc721Standard.getAssetName(erc721Contract); + } + + if (isERC721) { + return { + standard: ERC721, + tokenURI, + symbol, + name, + }; + } } catch { // Ignore } @@ -160,7 +180,17 @@ export class AssetsContractController extends BaseController< const isERC1155 = await this.erc1155Standard.contractSupportsBase1155Interface( erc1155Contract, ); - return isERC1155 && ERC1155; + let tokenURI; + if (tokenId) { + tokenURI = await this.erc1155Standard.uri(erc1155Contract, tokenId); + } + + if (isERC1155) { + return { + standard: ERC1155, + tokenURI, + }; + } } catch { // Ignore } @@ -168,14 +198,17 @@ export class AssetsContractController extends BaseController< // ERC20 try { const erc20Contract = this.web3.eth.contract(abiERC20).at(address); - await erc20Contract.decimals(); + const decimals = await erc20Contract.decimals(); await erc20Contract.totalSupply(); - return ERC20; + return { + standard: ERC20, + decimals, + }; } catch { // Ignore } - return null; + throw new Error('Unable to determine contract standard'); } /**