From 041788b22830d908f8f7016f936e9bdd4c4337f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Fri, 1 Jul 2022 12:50:36 +0300 Subject: [PATCH 01/14] Fix (remove) logs, bump version. --- src-network-providers/apiNetworkProvider.ts | 1 - src-network-providers/proxyNetworkProvider.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/src-network-providers/apiNetworkProvider.ts b/src-network-providers/apiNetworkProvider.ts index b02aac8b..ed0f4667 100644 --- a/src-network-providers/apiNetworkProvider.ts +++ b/src-network-providers/apiNetworkProvider.ts @@ -185,7 +185,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/proxyNetworkProvider.ts b/src-network-providers/proxyNetworkProvider.ts index 9e540f23..a8e0fff0 100644 --- a/src-network-providers/proxyNetworkProvider.ts +++ b/src-network-providers/proxyNetworkProvider.ts @@ -208,7 +208,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); } From 98b8b07594e03fe3d75ab5932f7ba5ba0b56511e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Mon, 18 Jul 2022 19:50:19 +0300 Subject: [PATCH 02/14] Increase default axios timeout. --- src-network-providers/config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-network-providers/config.ts b/src-network-providers/config.ts index a5b2215b..ffee0f22 100644 --- a/src-network-providers/config.ts +++ b/src-network-providers/config.ts @@ -3,7 +3,7 @@ import { IPagination } from "./interface"; const JSONbig = require("json-bigint"); export const defaultAxiosConfig = { - timeout: 1000, + timeout: 5000, // See: https://github.com/axios/axios/issues/983 regarding transformResponse transformResponse: [ function (data: any) { From 2ff1f4bddb5736312b24d7a88ecefb9f55369cca Mon Sep 17 00:00:00 2001 From: Cristi Corcoveanu Date: Thu, 4 Aug 2022 15:22:34 +0300 Subject: [PATCH 03/14] add more infos for tokens api andpoints --- src-network-providers/tokens.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src-network-providers/tokens.ts b/src-network-providers/tokens.ts index 5a574507..41b13868 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); + plainTokenData: any = {}; static fromHttpResponse(payload: any): FungibleTokenOfAccountOnNetwork { let result = new FungibleTokenOfAccountOnNetwork(); result.identifier = payload.tokenIdentifier || payload.identifier || ""; result.balance = new BigNumber(payload.balance || 0); + result.plainTokenData = 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; } From 425155abbfe3ca35a3615b2ca72b222c0b8924a7 Mon Sep 17 00:00:00 2001 From: Cristi Corcoveanu Date: Tue, 9 Aug 2022 12:39:37 +0300 Subject: [PATCH 04/14] property rename - fix after review --- src-network-providers/tokens.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src-network-providers/tokens.ts b/src-network-providers/tokens.ts index 41b13868..31f685b5 100644 --- a/src-network-providers/tokens.ts +++ b/src-network-providers/tokens.ts @@ -5,14 +5,14 @@ import { IAddress } from "./interface"; export class FungibleTokenOfAccountOnNetwork { identifier: string = ""; balance: BigNumber = new BigNumber(0); - plainTokenData: any = {}; + 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.plainTokenData = payload; + result.rawResponse = payload; return result; } From 0fc73e521731db1c23b2408fed12d0795f6ea348 Mon Sep 17 00:00:00 2001 From: Cristi Corcoveanu Date: Tue, 16 Aug 2022 17:29:48 +0300 Subject: [PATCH 05/14] pairs endpoint implementation --- src-network-providers/apiNetworkProvider.ts | 12 ++++ src-network-providers/pairs.ts | 55 +++++++++++++++++++ .../providers.dev.net.spec.ts | 2 +- 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src-network-providers/pairs.ts diff --git a/src-network-providers/apiNetworkProvider.ts b/src-network-providers/apiNetworkProvider.ts index ed0f4667..2d69261c 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); 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/providers.dev.net.spec.ts b/src-network-providers/providers.dev.net.spec.ts index 3c67faf0..017b8418 100644 --- a/src-network-providers/providers.dev.net.spec.ts +++ b/src-network-providers/providers.dev.net.spec.ts @@ -13,7 +13,7 @@ describe("test network providers on devnet: Proxy and API", function () { let carol = new Address("erd1k2s324ww2g0yj38qn2ch2jwctdy8mnfxep94q9arncc6xecg3xaq6mjse8"); let dan = new Address("erd1kyaqzaprcdnv4luvanah0gfxzzsnpaygsy6pytrexll2urtd05ts9vegu7"); - let apiProvider: INetworkProvider = new ApiNetworkProvider("https://devnet-api.elrond.com", { timeout: 10000 }); + let apiProvider: ApiNetworkProvider = new ApiNetworkProvider("https://api.elrond.com", { timeout: 10000 }); let proxyProvider: INetworkProvider = new ProxyNetworkProvider("https://devnet-gateway.elrond.com", { timeout: 10000 }); it("should have same response for getNetworkConfig()", async function () { From fbc06eccb26b8e617c1affde48d2f70f30ef1803 Mon Sep 17 00:00:00 2001 From: Cristi Corcoveanu Date: Fri, 19 Aug 2022 12:47:45 +0300 Subject: [PATCH 06/14] reverted test --- src-network-providers/providers.dev.net.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-network-providers/providers.dev.net.spec.ts b/src-network-providers/providers.dev.net.spec.ts index 017b8418..3c67faf0 100644 --- a/src-network-providers/providers.dev.net.spec.ts +++ b/src-network-providers/providers.dev.net.spec.ts @@ -13,7 +13,7 @@ describe("test network providers on devnet: Proxy and API", function () { let carol = new Address("erd1k2s324ww2g0yj38qn2ch2jwctdy8mnfxep94q9arncc6xecg3xaq6mjse8"); let dan = new Address("erd1kyaqzaprcdnv4luvanah0gfxzzsnpaygsy6pytrexll2urtd05ts9vegu7"); - let apiProvider: ApiNetworkProvider = new ApiNetworkProvider("https://api.elrond.com", { timeout: 10000 }); + let apiProvider: INetworkProvider = new ApiNetworkProvider("https://devnet-api.elrond.com", { timeout: 10000 }); let proxyProvider: INetworkProvider = new ProxyNetworkProvider("https://devnet-gateway.elrond.com", { timeout: 10000 }); it("should have same response for getNetworkConfig()", async function () { From 9572232c2eb24ee5e626e869994a49f07a9a09eb Mon Sep 17 00:00:00 2001 From: Cristi Corcoveanu Date: Fri, 19 Aug 2022 12:57:45 +0300 Subject: [PATCH 07/14] added new method on the interface --- src-network-providers/interface.ts | 6 ++++++ src-network-providers/proxyNetworkProvider.ts | 5 +++++ 2 files changed, 11 insertions(+) diff --git a/src-network-providers/interface.ts b/src-network-providers/interface.ts index 4d44c32e..9d7c9528 100644 --- a/src-network-providers/interface.ts +++ b/src-network-providers/interface.ts @@ -8,6 +8,7 @@ import { NetworkStatus } from "./networkStatus"; import { ContractQueryResponse } from "./contractQueryResponse"; import { FungibleTokenOfAccountOnNetwork, NonFungibleTokenOfAccountOnNetwork } from "./tokens"; import { DefinitionOfFungibleTokenOnNetwork, DefinitionOfTokenCollectionOnNetwork } from "./tokenDefinitions"; +import {PairOnNetwork} from "./pairs"; /** * An interface that defines the endpoints of an HTTP API Provider. @@ -58,6 +59,11 @@ export interface INetworkProvider { */ getNonFungibleTokenOfAccount(address: IAddress, collection: string, nonce: number): Promise; + /** + * Fetches data about available mex pairs. + */ + getMexPairs(pagination?: IPagination): Promise; + /** * Fetches the state of a transaction. */ diff --git a/src-network-providers/proxyNetworkProvider.ts b/src-network-providers/proxyNetworkProvider.ts index a8e0fff0..f7f5ed50 100644 --- a/src-network-providers/proxyNetworkProvider.ts +++ b/src-network-providers/proxyNetworkProvider.ts @@ -14,6 +14,7 @@ import { ContractQueryResponse } from "./contractQueryResponse"; import { DefinitionOfFungibleTokenOnNetwork, DefinitionOfTokenCollectionOnNetwork } from "./tokenDefinitions"; import { ContractQueryRequest } from "./contractQueryRequest"; import { EsdtContractAddress } from "./constants"; +import {PairOnNetwork} from "./pairs"; // TODO: Find & remove duplicate code between "ProxyNetworkProvider" and "ApiNetworkProvider". export class ProxyNetworkProvider implements INetworkProvider { @@ -93,6 +94,10 @@ export class ProxyNetworkProvider implements INetworkProvider { return tokenData; } + async getMexPairs(_?: IPagination): Promise { + throw new Error("Method not implemented."); + } + async getTransaction(txHash: string): Promise { let url = this.buildUrlWithQueryParameters(`transaction/${txHash}`, { withResults: "true" }); let response = await this.doGetGeneric(url); From a23e7d949b16ec51f99b61cc291b9e932328ead2 Mon Sep 17 00:00:00 2001 From: Cristi Corcoveanu Date: Fri, 19 Aug 2022 13:20:10 +0300 Subject: [PATCH 08/14] removed method from interface --- src-network-providers/interface.ts | 5 ----- src-network-providers/proxyNetworkProvider.ts | 4 ---- 2 files changed, 9 deletions(-) diff --git a/src-network-providers/interface.ts b/src-network-providers/interface.ts index 9d7c9528..ef7dbbda 100644 --- a/src-network-providers/interface.ts +++ b/src-network-providers/interface.ts @@ -59,11 +59,6 @@ export interface INetworkProvider { */ getNonFungibleTokenOfAccount(address: IAddress, collection: string, nonce: number): Promise; - /** - * Fetches data about available mex pairs. - */ - getMexPairs(pagination?: IPagination): Promise; - /** * Fetches the state of a transaction. */ diff --git a/src-network-providers/proxyNetworkProvider.ts b/src-network-providers/proxyNetworkProvider.ts index f7f5ed50..0bc866f3 100644 --- a/src-network-providers/proxyNetworkProvider.ts +++ b/src-network-providers/proxyNetworkProvider.ts @@ -94,10 +94,6 @@ export class ProxyNetworkProvider implements INetworkProvider { return tokenData; } - async getMexPairs(_?: IPagination): Promise { - throw new Error("Method not implemented."); - } - async getTransaction(txHash: string): Promise { let url = this.buildUrlWithQueryParameters(`transaction/${txHash}`, { withResults: "true" }); let response = await this.doGetGeneric(url); From 0607faea6b6e1cbacc9bd834184c60cd475f442b Mon Sep 17 00:00:00 2001 From: Cristi Corcoveanu Date: Fri, 19 Aug 2022 13:22:07 +0300 Subject: [PATCH 09/14] removed importr --- src-network-providers/interface.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src-network-providers/interface.ts b/src-network-providers/interface.ts index ef7dbbda..4d44c32e 100644 --- a/src-network-providers/interface.ts +++ b/src-network-providers/interface.ts @@ -8,7 +8,6 @@ import { NetworkStatus } from "./networkStatus"; import { ContractQueryResponse } from "./contractQueryResponse"; import { FungibleTokenOfAccountOnNetwork, NonFungibleTokenOfAccountOnNetwork } from "./tokens"; import { DefinitionOfFungibleTokenOnNetwork, DefinitionOfTokenCollectionOnNetwork } from "./tokenDefinitions"; -import {PairOnNetwork} from "./pairs"; /** * An interface that defines the endpoints of an HTTP API Provider. From 4c6f161c4a573be9187740577fbe75234608be43 Mon Sep 17 00:00:00 2001 From: Cristi Corcoveanu Date: Fri, 19 Aug 2022 13:22:30 +0300 Subject: [PATCH 10/14] removed importr --- src-network-providers/proxyNetworkProvider.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src-network-providers/proxyNetworkProvider.ts b/src-network-providers/proxyNetworkProvider.ts index 0bc866f3..a8e0fff0 100644 --- a/src-network-providers/proxyNetworkProvider.ts +++ b/src-network-providers/proxyNetworkProvider.ts @@ -14,7 +14,6 @@ import { ContractQueryResponse } from "./contractQueryResponse"; import { DefinitionOfFungibleTokenOnNetwork, DefinitionOfTokenCollectionOnNetwork } from "./tokenDefinitions"; import { ContractQueryRequest } from "./contractQueryRequest"; import { EsdtContractAddress } from "./constants"; -import {PairOnNetwork} from "./pairs"; // TODO: Find & remove duplicate code between "ProxyNetworkProvider" and "ApiNetworkProvider". export class ProxyNetworkProvider implements INetworkProvider { From 9bce67a94fa1f76b7eac033992ec052256912482 Mon Sep 17 00:00:00 2001 From: Traian Anghel Date: Thu, 15 Sep 2022 12:33:18 +0300 Subject: [PATCH 11/14] pass headers when performing post api calls --- src-network-providers/apiNetworkProvider.ts | 1 + src-network-providers/proxyNetworkProvider.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src-network-providers/apiNetworkProvider.ts b/src-network-providers/apiNetworkProvider.ts index 2d69261c..4fea6117 100644 --- a/src-network-providers/apiNetworkProvider.ts +++ b/src-network-providers/apiNetworkProvider.ts @@ -186,6 +186,7 @@ export class ApiNetworkProvider implements INetworkProvider { ...this.config, headers: { "Content-Type": "application/json", + ...this.config.headers, }, }); let responsePayload = response.data; diff --git a/src-network-providers/proxyNetworkProvider.ts b/src-network-providers/proxyNetworkProvider.ts index a8e0fff0..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; From d897ddabcbf1737d9c53932706227b04d1a70232 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Tue, 18 Oct 2022 23:04:02 +0300 Subject: [PATCH 12/14] Add address.toString(). --- src-network-providers/primitives.spec.ts | 2 ++ src-network-providers/primitives.ts | 4 ++++ 2 files changed, 6 insertions(+) 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..150e758c 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.value; + } } export class Nonce { From df2335161438d255922b4a9ef3b8284fe8c55be7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Wed, 19 Oct 2022 11:18:52 +0300 Subject: [PATCH 13/14] Fix after review. --- src-network-providers/primitives.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-network-providers/primitives.ts b/src-network-providers/primitives.ts index 150e758c..ed50b4ef 100644 --- a/src-network-providers/primitives.ts +++ b/src-network-providers/primitives.ts @@ -24,7 +24,7 @@ export class Address implements IAddress { } toString() { - return this.value; + return this.bech32(); } } From add11e3919939f6fed44e67da8ac5f56c8da379f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrei=20B=C4=83ncioiu?= Date: Mon, 14 Nov 2022 15:58:58 +0200 Subject: [PATCH 14/14] Fix axios deserialization, ignore "_constructor". --- src-network-providers/config.ts | 2 +- src-network-providers/serialization.spec.ts | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 src-network-providers/serialization.spec.ts diff --git a/src-network-providers/config.ts b/src-network-providers/config.ts index ffee0f22..8239bfda 100644 --- a/src-network-providers/config.ts +++ b/src-network-providers/config.ts @@ -1,6 +1,6 @@ import { IPagination } from "./interface"; -const JSONbig = require("json-bigint"); +const JSONbig = require("json-bigint")({ constructorAction: 'ignore' }); export const defaultAxiosConfig = { timeout: 5000, 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); + }); +}); +