diff --git a/src-network-providers/apiNetworkProvider.ts b/src-network-providers/apiNetworkProvider.ts index b02aac8b..4fea6117 100644 --- a/src-network-providers/apiNetworkProvider.ts +++ b/src-network-providers/apiNetworkProvider.ts @@ -15,6 +15,7 @@ import { defaultAxiosConfig, defaultPagination } from "./config"; import { NetworkStatus } from "./networkStatus"; import { ContractQueryResponse } from "./contractQueryResponse"; import { ContractQueryRequest } from "./contractQueryRequest"; +import {PairOnNetwork} from "./pairs"; // TODO: Find & remove duplicate code between "ProxyNetworkProvider" and "ApiNetworkProvider". export class ApiNetworkProvider implements INetworkProvider { @@ -91,6 +92,17 @@ export class ApiNetworkProvider implements INetworkProvider { return tokenData; } + async getMexPairs(pagination?: IPagination): Promise { + let url = `mex/pairs`; + if (pagination) { + url = `${url}?from=${pagination.from}&size=${pagination.size}`; + } + + let response: any[] = await this.doGetGeneric(url); + + return response.map(item => PairOnNetwork.fromApiHttpResponse(item)); + } + async getTransaction(txHash: string): Promise { let response = await this.doGetGeneric(`transactions/${txHash}`); let transaction = TransactionOnNetwork.fromApiHttpResponse(txHash, response); @@ -174,6 +186,7 @@ export class ApiNetworkProvider implements INetworkProvider { ...this.config, headers: { "Content-Type": "application/json", + ...this.config.headers, }, }); let responsePayload = response.data; @@ -185,7 +198,6 @@ export class ApiNetworkProvider implements INetworkProvider { private handleApiError(error: any, resourceUrl: string) { if (!error.response) { - console.warn(error); throw new ErrNetworkProvider(resourceUrl, error.toString(), error); } diff --git a/src-network-providers/config.ts b/src-network-providers/config.ts index a5b2215b..8239bfda 100644 --- a/src-network-providers/config.ts +++ b/src-network-providers/config.ts @@ -1,9 +1,9 @@ import { IPagination } from "./interface"; -const JSONbig = require("json-bigint"); +const JSONbig = require("json-bigint")({ constructorAction: 'ignore' }); export const defaultAxiosConfig = { - timeout: 1000, + timeout: 5000, // See: https://github.com/axios/axios/issues/983 regarding transformResponse transformResponse: [ function (data: any) { diff --git a/src-network-providers/pairs.ts b/src-network-providers/pairs.ts new file mode 100644 index 00000000..723c25b7 --- /dev/null +++ b/src-network-providers/pairs.ts @@ -0,0 +1,55 @@ +import {Address} from "./primitives"; +import {IAddress} from "./interface"; +import BigNumber from "bignumber.js"; + +export class PairOnNetwork { + address: IAddress = new Address(""); + id: string = ""; + symbol: string = ""; + name: string = ""; + price: BigNumber = new BigNumber(0); + baseId: string = ""; + basePrice: BigNumber = new BigNumber(0); + baseSymbol: string = ""; + baseName: string = ""; + quoteId: string = ""; + quotePrice: BigNumber = new BigNumber(0); + quoteSymbol: string = ""; + quoteName: string = ""; + totalValue: BigNumber = new BigNumber(0); + volume24h: BigNumber = new BigNumber(0); + state: string = ""; + type: string = ""; + + rawResponse: any = {}; + + constructor(init?: Partial) { + Object.assign(this, init); + } + + static fromApiHttpResponse(payload: any): PairOnNetwork { + let result = new PairOnNetwork(); + + result.address = new Address(payload.address || ""); + result.id = payload.id || ""; + result.symbol = payload.symbol || ""; + result.name = payload.name || ""; + result.price = new BigNumber(payload.price || 0); + result.baseId = payload.baseId || ""; + result.basePrice = new BigNumber(payload.basePrice || 0); + result.baseSymbol = payload.baseSymbol || ""; + result.baseName = payload.baseName || ""; + result.quoteId = payload.quoteId || ""; + result.quotePrice = new BigNumber(payload.quotePrice || 0); + result.quoteSymbol = payload.quoteSymbol || ""; + result.quoteName = payload.quoteName || ""; + result.totalValue = new BigNumber(payload.totalValue || 0); + result.volume24h = new BigNumber(payload.volume24h || 0); + result.state = payload.state || ""; + result.type = payload.type || ""; + + result.rawResponse = payload; + + return result; + } +} diff --git a/src-network-providers/primitives.spec.ts b/src-network-providers/primitives.spec.ts index e8f3a0c3..202a9dfe 100644 --- a/src-network-providers/primitives.spec.ts +++ b/src-network-providers/primitives.spec.ts @@ -10,6 +10,8 @@ describe("test primitives", function () { assert.equal(new Address(aliceBech32).bech32(), Address.fromPubkey(alicePubkey).bech32()); assert.equal(new Address(bobBech32).bech32(), Address.fromPubkey(bobPubkey).bech32()); + assert.equal(new Address(aliceBech32).toString(), aliceBech32); + assert.equal(new Address(bobBech32).toString(), bobBech32); }); }); diff --git a/src-network-providers/primitives.ts b/src-network-providers/primitives.ts index fecbbace..ed50b4ef 100644 --- a/src-network-providers/primitives.ts +++ b/src-network-providers/primitives.ts @@ -22,6 +22,10 @@ export class Address implements IAddress { bech32(): string { return this.value; } + + toString() { + return this.bech32(); + } } export class Nonce { diff --git a/src-network-providers/proxyNetworkProvider.ts b/src-network-providers/proxyNetworkProvider.ts index 9e540f23..972ac32f 100644 --- a/src-network-providers/proxyNetworkProvider.ts +++ b/src-network-providers/proxyNetworkProvider.ts @@ -185,6 +185,7 @@ export class ProxyNetworkProvider implements INetworkProvider { ...this.config, headers: { "Content-Type": "application/json", + ...this.config.headers, }, }); let responsePayload = response.data.data; @@ -208,7 +209,6 @@ export class ProxyNetworkProvider implements INetworkProvider { private handleApiError(error: any, resourceUrl: string) { if (!error.response) { - console.warn(error); throw new ErrNetworkProvider(resourceUrl, error.toString(), error); } diff --git a/src-network-providers/serialization.spec.ts b/src-network-providers/serialization.spec.ts new file mode 100644 index 00000000..6ffc8309 --- /dev/null +++ b/src-network-providers/serialization.spec.ts @@ -0,0 +1,16 @@ +import assert from "assert"; + +describe("test JSON serialization", function () { + it("should not deserialize", async function () { + const JSONbig = require("json-bigint"); + const data = `{"Costum":{"foo_constructor":1}}`; + assert.throws(() => JSONbig.parse(data)); + }); + + it("should deserialize", async function () { + const JSONbig = require("json-bigint")({ constructorAction: 'ignore' }); + const data = `{"Costum":{"foo_constructor":1}}`; + JSONbig.parse(data); + }); +}); + diff --git a/src-network-providers/tokens.ts b/src-network-providers/tokens.ts index 5a574507..31f685b5 100644 --- a/src-network-providers/tokens.ts +++ b/src-network-providers/tokens.ts @@ -5,12 +5,14 @@ import { IAddress } from "./interface"; export class FungibleTokenOfAccountOnNetwork { identifier: string = ""; balance: BigNumber = new BigNumber(0); + rawResponse: any = {}; static fromHttpResponse(payload: any): FungibleTokenOfAccountOnNetwork { let result = new FungibleTokenOfAccountOnNetwork(); result.identifier = payload.tokenIdentifier || payload.identifier || ""; result.balance = new BigNumber(payload.balance || 0); + result.rawResponse = payload; return result; } @@ -29,6 +31,7 @@ export class NonFungibleTokenOfAccountOnNetwork { decimals: number = 0; royalties: BigNumber = new BigNumber(0); assets: string[] = []; + balance: BigNumber = new BigNumber(0); constructor(init?: Partial) { Object.assign(this, init); @@ -78,6 +81,7 @@ export class NonFungibleTokenOfAccountOnNetwork { result.supply = new BigNumber(payload.balance || 1); result.royalties = new BigNumber(payload.royalties || 0); result.assets = payload.assets || []; + result.balance = new BigNumber(payload.balance || 0); return result; }