diff --git a/src/account.ts b/src/account.ts index 66c169d..2713664 100644 --- a/src/account.ts +++ b/src/account.ts @@ -1,6 +1,6 @@ -import query, { QueryOptions } from './query' +import query, { QueryParams, RequestConfig } from './query' -type Options = Omit +type AccountQueryParams = Omit type BlockRange = { startBlock?: number @@ -72,98 +72,144 @@ type TokenTransferEvent = { confirmations: string } -function getBnbBalance(address: string, options?: Options): Promise { - return query({ - ...options, - address, - module: 'account', - action: 'balance', - tag: 'latest', - }) +function getBnbBalance(address: string, queryOptions?: AccountQueryParams, requestConfig?: RequestConfig) { + return query( + { + ...queryOptions, + address, + module: 'account', + action: 'balance', + tag: 'latest', + }, + requestConfig + ) } -function getBnbBalanceForMultipleAddresses(addresses: string[], options?: Options): Promise { - return query({ - ...options, - address: addresses.join(','), - module: 'account', - action: 'balancemulti', - tag: 'latest', - }) +function getBnbBalanceForMultipleAddresses( + addresses: string[], + queryOptions?: AccountQueryParams, + requestConfig?: RequestConfig +) { + return query( + { + ...queryOptions, + address: addresses.join(','), + module: 'account', + action: 'balancemulti', + tag: 'latest', + }, + requestConfig + ) } -function getTransactions(address: string, options?: Options): Promise { - return query({ - ...options, - address, - module: 'account', - action: 'txlist', - }) -} - -function getInternalTransactionsByAddress(address: string, options?: Options): Promise { - return query({ - ...options, - address, - module: 'account', - action: 'txlistinternal', - }) +function getInternalTransactionsByAddress( + address: string, + queryOptions?: AccountQueryParams, + requestConfig?: RequestConfig +) { + return query( + { + ...queryOptions, + address, + module: 'account', + action: 'txlistinternal', + }, + requestConfig + ) } -function getInternalTransactionsByHash(txhash: string, options?: Options): Promise { - return query({ - ...options, - txhash, - module: 'account', - action: 'txlistinternal', - }) +function getInternalTransactionsByHash( + txhash: string, + queryOptions?: AccountQueryParams, + requestConfig?: RequestConfig +) { + return query( + { + ...queryOptions, + txhash, + module: 'account', + action: 'txlistinternal', + }, + requestConfig + ) } function getInternalTransactionsByBlockRange( blockRange: BlockRange, - options?: Omit -): Promise { - return query({ - ...options, - ...blockRange, - module: 'account', - action: 'txlistinternal', - }) + queryOptions?: Omit, + requestConfig?: RequestConfig +) { + return query( + { + ...queryOptions, + ...blockRange, + module: 'account', + action: 'txlistinternal', + }, + requestConfig + ) } -function getTokenTransferEventsByAddress(address: string, options?: Options): Promise { - return query({ - ...options, - address, - module: 'account', - action: 'tokentx', - }) +function getTokenTransferEventsByAddress( + address: string, + queryOptions?: AccountQueryParams, + requestConfig?: RequestConfig +) { + return query( + { + ...queryOptions, + address, + module: 'account', + action: 'tokentx', + }, + requestConfig + ) } function getTokenTransferEventsByContractAddress( contractAddress: string, - options?: Options -): Promise { - return query({ - ...options, - contractAddress, - module: 'account', - action: 'tokentx', - }) + queryOptions?: AccountQueryParams, + requestConfig?: RequestConfig +) { + return query( + { + ...queryOptions, + contractAddress, + module: 'account', + action: 'tokentx', + }, + requestConfig + ) } function getTokenTransferEventsByAddressAndContractAddress( address: string, contractAddress: string, - options?: Options -): Promise { - return query({ - ...options, - address, - contractAddress, - module: 'account', - action: 'tokentx', - }) + queryOptions?: AccountQueryParams, + requestConfig?: RequestConfig +) { + return query( + { + ...queryOptions, + address, + contractAddress, + module: 'account', + action: 'tokentx', + }, + requestConfig + ) +} + +function getTransactions(address: string, queryOptions?: AccountQueryParams, requestConfig?: RequestConfig) { + return query( + { + ...queryOptions, + address, + module: 'account', + action: 'txlist', + }, + requestConfig + ) } export default { diff --git a/src/contract.ts b/src/contract.ts index f51b902..a176895 100644 --- a/src/contract.ts +++ b/src/contract.ts @@ -1,4 +1,4 @@ -import query, { QueryOptions } from './query' +import query, { RequestConfig } from './query' type SourceCode = { SourceCode: string @@ -16,24 +16,26 @@ type SourceCode = { SwarmSource: string } -function getContractAbi(address: string): Promise { - const queryOptions: QueryOptions = { - address, - module: 'contract', - action: 'getabi', - } - - return query(queryOptions) +function getContractAbi(address: string, requestConfig?: RequestConfig) { + return query( + { + address, + module: 'contract', + action: 'getabi', + }, + requestConfig + ) } -function getContractSourceCode(address: string): Promise { - const queryOptions: QueryOptions = { - address, - module: 'contract', - action: 'getsourcecode', - } - - return query(queryOptions) +function getContractSourceCode(address: string, requestConfig?: RequestConfig) { + return query( + { + address, + module: 'contract', + action: 'getsourcecode', + }, + requestConfig + ) } export default { diff --git a/src/query.ts b/src/query.ts index 5fea984..558bdae 100644 --- a/src/query.ts +++ b/src/query.ts @@ -1,4 +1,4 @@ -import axios from 'axios' +import axios, { AxiosRequestConfig } from 'axios' import identity from 'lodash.identity' import pickBy from 'lodash.pickby' import qs from 'querystring' @@ -13,7 +13,7 @@ type ContractAction = 'getabi' | 'getsourcecode' type StatsAction = 'tokensupply' | 'tokenCsupply' | 'tokenbalance' | 'bnbsupply' | 'validators' -export type QueryOptions = { +export type QueryParams = { module: Module action: AccountAction | ContractAction | StatsAction address?: string @@ -28,7 +28,18 @@ export type QueryOptions = { apiKey?: string } -async function query(options: QueryOptions) { +export type RequestConfig = { + axiosConfig?: AxiosRequestConfig + rawAxiosResponse?: boolean +} + +type Response = { + status: '0' | '1' + message: string + result: T +} + +async function query(queryOptions: QueryParams, requestConfig?: RequestConfig) { const { address, contractAddress, @@ -41,7 +52,7 @@ async function query(options: QueryOptions) { offset = 10000, sort = 'asc', apiKey = config.apiKey, - } = options + } = queryOptions const queryParams = pickBy( { @@ -60,11 +71,22 @@ async function query(options: QueryOptions) { identity ) + const { axiosConfig, rawAxiosResponse } = requestConfig || {} + const query = qs.stringify(queryParams) + const response = await axios.get>(`${config.url}/api?${query}`, axiosConfig) + + if (rawAxiosResponse) { + return response + } + + const { status, result } = response.data as Response - const { data } = await axios.get(`${config.url}/api?${query}`) + if (status === '0') { + throw new Error(String(result)) + } - return data.result + return result } export default query diff --git a/src/stats.ts b/src/stats.ts index c52d239..8561595 100644 --- a/src/stats.ts +++ b/src/stats.ts @@ -1,4 +1,4 @@ -import query from './query' +import query, { RequestConfig } from './query' type Validator = { validatorAddress: string @@ -8,18 +8,24 @@ type Validator = { validatorVotingPowerProportion: string } -function getBnbTotalSupply(): Promise { - return query({ - module: 'stats', - action: 'bnbsupply', - }) +function getBnbTotalSupply(requestConfig?: RequestConfig) { + return query( + { + module: 'stats', + action: 'bnbsupply', + }, + requestConfig + ) } -function getValidatorsList(): Promise { - return query({ - module: 'stats', - action: 'validators', - }) +function getValidatorsList(requestConfig?: RequestConfig) { + return query( + { + module: 'stats', + action: 'validators', + }, + requestConfig + ) } export default { diff --git a/src/token.ts b/src/token.ts index ab6fa46..a57438f 100644 --- a/src/token.ts +++ b/src/token.ts @@ -1,29 +1,42 @@ -import query from './query' +import query, { RequestConfig } from './query' -function getTokenSupplyByContractAddress(contractAddress: string): Promise { - return query({ - contractAddress, - module: 'stats', - action: 'tokensupply', - }) +function getTokenSupplyByContractAddress(contractAddress: string, requestConfig?: RequestConfig) { + return query( + { + contractAddress, + module: 'stats', + action: 'tokensupply', + }, + requestConfig + ) } -function getCirculatingSupplyByContractAddress(contractAddress: string): Promise { - return query({ - contractAddress, - module: 'stats', - action: 'tokenCsupply', - }) +function getCirculatingSupplyByContractAddress(contractAddress: string, requestConfig?: RequestConfig) { + return query( + { + contractAddress, + module: 'stats', + action: 'tokenCsupply', + }, + requestConfig + ) } -function getAccountBalanceForTokenContractAddress(address: string, contractAddress: string): Promise { - return query({ - address, - contractAddress, - module: 'account', - action: 'tokenbalance', - tag: 'latest', - }) +function getAccountBalanceForTokenContractAddress( + address: string, + contractAddress: string, + requestConfig?: RequestConfig +) { + return query( + { + address, + contractAddress, + module: 'account', + action: 'tokenbalance', + tag: 'latest', + }, + requestConfig + ) } export default {