diff options
author | Fabio Berger <me@fabioberger.com> | 2017-05-30 18:37:45 +0800 |
---|---|---|
committer | Fabio Berger <me@fabioberger.com> | 2017-05-30 18:37:45 +0800 |
commit | e8a52ce1da454ab3a30b6f7d314aa85cf9534a05 (patch) | |
tree | 530fb9f1d2173d19b76b96ae48a6cff90bdc9925 /src | |
parent | d15002a1109ea00f4d92c7ae6259b5b657f5e4b3 (diff) | |
parent | 911ab437b8f9371f70e835f680d799b7c62fb140 (diff) | |
download | dexon-0x-contracts-e8a52ce1da454ab3a30b6f7d314aa85cf9534a05.tar.gz dexon-0x-contracts-e8a52ce1da454ab3a30b6f7d314aa85cf9534a05.tar.zst dexon-0x-contracts-e8a52ce1da454ab3a30b6f7d314aa85cf9534a05.zip |
Merge branch 'master' into dontReinstantiateContractInstances
Diffstat (limited to 'src')
-rw-r--r-- | src/0x.js.ts | 3 | ||||
-rw-r--r-- | src/contract_wrappers/token_registry_wrapper.ts | 33 | ||||
-rw-r--r-- | src/schemas/token_schema.ts | 12 | ||||
-rw-r--r-- | src/types.ts | 20 | ||||
-rw-r--r-- | src/utils/schema_validator.ts | 2 | ||||
-rw-r--r-- | src/web3_wrapper.ts | 7 |
6 files changed, 73 insertions, 4 deletions
diff --git a/src/0x.js.ts b/src/0x.js.ts index 4b7edc0e9..3dfdfbfcd 100644 --- a/src/0x.js.ts +++ b/src/0x.js.ts @@ -11,6 +11,7 @@ import {assert} from './utils/assert'; import findVersions = require('find-versions'); import compareVersions = require('compare-versions'); import {ExchangeWrapper} from './contract_wrappers/exchange_wrapper'; +import {TokenRegistryWrapper} from './contract_wrappers/token_registry_wrapper'; import {ecSignatureSchema} from './schemas/ec_signature_schema'; import {SolidityTypes, ECSignature, ZeroExError} from './types'; @@ -18,6 +19,7 @@ const MAX_DIGITS_IN_UNSIGNED_256_INT = 78; export class ZeroEx { public exchange: ExchangeWrapper; + public tokenRegistry: TokenRegistryWrapper; private web3Wrapper: Web3Wrapper; /** * Computes the orderHash given the order parameters and returns it as a hex encoded string. @@ -132,6 +134,7 @@ export class ZeroEx { constructor(web3: Web3) { this.web3Wrapper = new Web3Wrapper(web3); this.exchange = new ExchangeWrapper(this.web3Wrapper); + this.tokenRegistry = new TokenRegistryWrapper(this.web3Wrapper); } /** * Sets a new provider for the web3 instance used by 0x.js internally and invalidates any instantiated diff --git a/src/contract_wrappers/token_registry_wrapper.ts b/src/contract_wrappers/token_registry_wrapper.ts new file mode 100644 index 000000000..8dd79171e --- /dev/null +++ b/src/contract_wrappers/token_registry_wrapper.ts @@ -0,0 +1,33 @@ +import * as _ from 'lodash'; +import {Web3Wrapper} from '../web3_wrapper'; +import {Token, TokenRegistryContract, TokenMetadata} from '../types'; +import {assert} from '../utils/assert'; +import {ContractWrapper} from './contract_wrapper'; +import * as TokenRegistryArtifacts from '../artifacts/TokenRegistry.json'; + +export class TokenRegistryWrapper extends ContractWrapper { + constructor(web3Wrapper: Web3Wrapper) { + super(web3Wrapper); + } + public async getTokensAsync(): Promise<Token[]> { + const contractInstance = await this.instantiateContractIfExistsAsync((TokenRegistryArtifacts as any)); + const tokenRegistryContract = contractInstance as TokenRegistryContract; + + const addresses = await tokenRegistryContract.getTokenAddresses.call(); + const tokenMetadataPromises: Array<Promise<TokenMetadata>> = _.map( + addresses, + (address: string) => (tokenRegistryContract.getTokenMetaData.call(address)), + ); + const tokensMetadata = await Promise.all(tokenMetadataPromises); + const tokens = _.map(tokensMetadata, metadata => { + return { + address: metadata[0], + name: metadata[1], + symbol: metadata[2], + url: metadata[3], + decimals: metadata[4].toNumber(), + }; + }); + return tokens; + } +} diff --git a/src/schemas/token_schema.ts b/src/schemas/token_schema.ts new file mode 100644 index 000000000..01702af68 --- /dev/null +++ b/src/schemas/token_schema.ts @@ -0,0 +1,12 @@ +export const tokenSchema = { + id: '/token', + properties: { + name: {type: 'string'}, + symbol: {type: 'string'}, + decimals: {type: 'number'}, + address: {type: 'string'}, + url: {type: 'string'}, + }, + required: ['name', 'symbol', 'decimals', 'address', 'url'], + type: 'object', +}; diff --git a/src/types.ts b/src/types.ts index 50008404b..f17beafd2 100644 --- a/src/types.ts +++ b/src/types.ts @@ -33,8 +33,28 @@ export interface ExchangeContract { setProvider: (provider: Web3.Provider) => void; } +export interface TokenRegistryContract { + getTokenMetaData: { + call: (address: string) => Promise<TokenMetadata>; + }; + getTokenAddresses: { + call: () => Promise<string[]>; + }; +} + export const SolidityTypes = strEnum([ 'address', 'uint256', ]); export type SolidityTypes = keyof typeof SolidityTypes; + +// [address, name, symbol, projectUrl, decimals, ipfsHash, swarmHash] +export type TokenMetadata = [string, string, string, string, BigNumber.BigNumber, string, string]; + +export interface Token { + name: string; + address: string; + symbol: string; + decimals: number; + url: string; +}; diff --git a/src/utils/schema_validator.ts b/src/utils/schema_validator.ts index 61f4c09c8..8132f7414 100644 --- a/src/utils/schema_validator.ts +++ b/src/utils/schema_validator.ts @@ -1,5 +1,6 @@ import {Validator, ValidatorResult} from 'jsonschema'; import {ecSignatureSchema, ecSignatureParameter} from '../schemas/ec_signature_schema'; +import {tokenSchema} from '../schemas/token_schema'; export class SchemaValidator { private validator: Validator; @@ -7,6 +8,7 @@ export class SchemaValidator { this.validator = new Validator(); this.validator.addSchema(ecSignatureParameter, ecSignatureParameter.id); this.validator.addSchema(ecSignatureSchema, ecSignatureSchema.id); + this.validator.addSchema(tokenSchema, tokenSchema.id); } public validate(instance: object, schema: Schema): ValidatorResult { return this.validator.validate(instance, schema); diff --git a/src/web3_wrapper.ts b/src/web3_wrapper.ts index a532085ce..e65f29b56 100644 --- a/src/web3_wrapper.ts +++ b/src/web3_wrapper.ts @@ -52,10 +52,9 @@ export class Web3Wrapper { } public async doesContractExistAtAddressAsync(address: string): Promise<boolean> { const code = await promisify(this.web3.eth.getCode)(address); - // Regex matches 0x0, 0x00, 0x in order to accomodate poorly implemented clients - const zeroHexAddressRegex = /^0x0*$/i; - const didFindCode = _.isNull(code.match(zeroHexAddressRegex)); - return didFindCode; + // Regex matches 0x0, 0x00, 0x in order to accommodate poorly implemented clients + const codeIsEmpty = /^0x0{0,40}$/i.test(code); + return !codeIsEmpty; } public async signTransactionAsync(address: string, message: string): Promise<string> { const signData = await promisify(this.web3.eth.sign)(address, message); |