From fedded3ec1d3051589777a61aba14720432f1d51 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Wed, 23 Aug 2017 17:27:54 +0200 Subject: Add public method `getTokenMetadataIfExistsAsync` to TokenRegistry wrapper, refactor `getTokensAsync` to use `getTokenMetadataIfExistsAsync` under the hood and added unit tests --- src/contract_wrappers/token_registry_wrapper.ts | 35 ++++++++++++++++--------- 1 file changed, 23 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/contract_wrappers/token_registry_wrapper.ts b/src/contract_wrappers/token_registry_wrapper.ts index eaaea150d..c78b86a88 100644 --- a/src/contract_wrappers/token_registry_wrapper.ts +++ b/src/contract_wrappers/token_registry_wrapper.ts @@ -1,6 +1,7 @@ import * as _ from 'lodash'; import {Web3Wrapper} from '../web3_wrapper'; import {Token, TokenRegistryContract, TokenMetadata} from '../types'; +import {constants} from '../utils/constants'; import {ContractWrapper} from './contract_wrapper'; import * as TokenRegistryArtifacts from '../artifacts/TokenRegistry.json'; @@ -20,20 +21,30 @@ export class TokenRegistryWrapper extends ContractWrapper { const tokenRegistryContract = await this._getTokenRegistryContractAsync(); const addresses = await tokenRegistryContract.getTokenAddresses.call(); - const tokenMetadataPromises: Array> = _.map( + const tokenPromises: Array> = _.map( addresses, - (address: string) => (tokenRegistryContract.getTokenMetaData.call(address)), + (address: string) => (this.getTokenMetadataIfExistsAsync(address)), ); - const tokensMetadata = await Promise.all(tokenMetadataPromises); - const tokens = _.map(tokensMetadata, metadata => { - return { - address: metadata[0], - name: metadata[1], - symbol: metadata[2], - decimals: metadata[3].toNumber(), - }; - }); - return tokens; + const tokens = await Promise.all(tokenPromises); + return tokens as Token[]; + } + /** + * Retrieves a token by address currently listed in the Token Registry smart contract + * @return An object that conforms to the Token interface or undefined if token not found. + */ + public async getTokenMetadataIfExistsAsync(address: string): Promise { + const tokenRegistryContract = await this._getTokenRegistryContractAsync(); + const metadata = await tokenRegistryContract.getTokenMetaData.call(address); + if (metadata[0] === constants.NULL_ADDRESS) { + return undefined; + } + const token = { + address: metadata[0], + name: metadata[1], + symbol: metadata[2], + decimals: metadata[3].toNumber(), + }; + return token; } private _invalidateContractInstance(): void { delete this._tokenRegistryContractIfExists; -- cgit v1.2.3 From c12e48d28a811ace4bf7543a5c06471170ddf3f9 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Wed, 23 Aug 2017 18:13:50 +0200 Subject: Add assertion to public method --- src/contract_wrappers/token_registry_wrapper.ts | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src') diff --git a/src/contract_wrappers/token_registry_wrapper.ts b/src/contract_wrappers/token_registry_wrapper.ts index c78b86a88..c106a4a40 100644 --- a/src/contract_wrappers/token_registry_wrapper.ts +++ b/src/contract_wrappers/token_registry_wrapper.ts @@ -1,5 +1,6 @@ import * as _ from 'lodash'; import {Web3Wrapper} from '../web3_wrapper'; +import {assert} from '../utils/assert'; import {Token, TokenRegistryContract, TokenMetadata} from '../types'; import {constants} from '../utils/constants'; import {ContractWrapper} from './contract_wrapper'; @@ -33,6 +34,8 @@ export class TokenRegistryWrapper extends ContractWrapper { * @return An object that conforms to the Token interface or undefined if token not found. */ public async getTokenMetadataIfExistsAsync(address: string): Promise { + assert.isETHAddressHex('address', address); + const tokenRegistryContract = await this._getTokenRegistryContractAsync(); const metadata = await tokenRegistryContract.getTokenMetaData.call(address); if (metadata[0] === constants.NULL_ADDRESS) { -- cgit v1.2.3 From 98be7867649337a18441e517790c748c722ee730 Mon Sep 17 00:00:00 2001 From: Fabio Berger Date: Wed, 23 Aug 2017 18:14:19 +0200 Subject: rename method for clarity since we return a Token and not tokenMetadata --- src/contract_wrappers/token_registry_wrapper.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/contract_wrappers/token_registry_wrapper.ts b/src/contract_wrappers/token_registry_wrapper.ts index c106a4a40..58c191ea5 100644 --- a/src/contract_wrappers/token_registry_wrapper.ts +++ b/src/contract_wrappers/token_registry_wrapper.ts @@ -24,7 +24,7 @@ export class TokenRegistryWrapper extends ContractWrapper { const addresses = await tokenRegistryContract.getTokenAddresses.call(); const tokenPromises: Array> = _.map( addresses, - (address: string) => (this.getTokenMetadataIfExistsAsync(address)), + (address: string) => (this.getTokenIfExistsAsync(address)), ); const tokens = await Promise.all(tokenPromises); return tokens as Token[]; @@ -33,7 +33,7 @@ export class TokenRegistryWrapper extends ContractWrapper { * Retrieves a token by address currently listed in the Token Registry smart contract * @return An object that conforms to the Token interface or undefined if token not found. */ - public async getTokenMetadataIfExistsAsync(address: string): Promise { + public async getTokenIfExistsAsync(address: string): Promise { assert.isETHAddressHex('address', address); const tokenRegistryContract = await this._getTokenRegistryContractAsync(); -- cgit v1.2.3