From f03316c7803945252d4de1ad46c57e38b396f749 Mon Sep 17 00:00:00 2001 From: Kozer4 Date: Fri, 19 Jul 2024 15:35:37 +0300 Subject: [PATCH] feat(swap/pool): return swap/pool tokens set --- .../core-api/caching-core-client.test.ts | 2 +- .../client/core-api/core-api-mapper.test.ts | 6 +- src/__tests__/client/core-api/index.test.ts | 12 +- .../tokens-info/ChainDetailsMap-ETH-USDT.json | 6 +- .../tokens-info/ChainDetailsMapWithFlags.json | 401 ++++++++++++++++++ src/__tests__/index.test.ts | 2 +- src/__tests__/mock/bridge/models/bridge.ts | 11 +- src/__tests__/mock/core-api/token-info.json | 40 +- src/__tests__/mock/utils.ts | 2 +- .../services/bridge/evm/index.test.ts | 8 +- .../services/bridge/trx/index.test.ts | 4 +- src/__tests__/services/bridge/utils.test.ts | 7 +- .../services/liquidity-pool/evm/index.test.ts | 4 +- .../services/liquidity-pool/sol/index.test.ts | 4 +- .../services/liquidity-pool/trx/index.test.ts | 10 +- src/client/core-api/api-client.ts | 8 +- src/client/core-api/core-api-mapper.ts | 13 +- src/client/core-api/core-api.model.ts | 4 + .../{index.ts => core-client-base.ts} | 33 +- src/client/core-api/core-client-filtered.ts | 96 +++++ .../core-api/core-client-pool-info-caching.ts | 27 +- src/index.ts | 24 +- src/services/bridge/evm/index.ts | 2 +- src/services/bridge/index.ts | 2 +- src/services/bridge/models/bridge.ts | 2 +- .../bridge/raw-bridge-transaction-builder.ts | 2 +- src/services/bridge/sol/index.ts | 2 +- src/services/bridge/sol/jupiter.ts | 1 + src/services/bridge/srb/index.ts | 2 +- src/services/bridge/trx/index.ts | 2 +- src/services/bridge/utils.ts | 2 +- src/services/index.ts | 20 +- src/services/liquidity-pool/evm/index.ts | 2 +- src/services/liquidity-pool/index.ts | 6 +- src/services/liquidity-pool/models/pool.ts | 2 +- .../raw-pool-transaction-builder.ts | 2 +- src/services/liquidity-pool/sol/index.ts | 2 +- src/services/liquidity-pool/srb/index.ts | 2 +- src/services/liquidity-pool/trx/index.ts | 2 +- src/services/token/evm/index.ts | 2 +- src/services/token/index.ts | 2 +- src/services/token/models/token.ts | 2 +- src/services/token/sol/index.ts | 2 +- src/services/token/srb/index.ts | 2 +- src/services/token/trx/index.ts | 2 +- src/tokens-info/tokens-info.model.ts | 16 + src/utils/utils.ts | 4 +- 47 files changed, 710 insertions(+), 101 deletions(-) create mode 100644 src/__tests__/data/tokens-info/ChainDetailsMapWithFlags.json rename src/client/core-api/{index.ts => core-client-base.ts} (70%) create mode 100644 src/client/core-api/core-client-filtered.ts diff --git a/src/__tests__/client/core-api/caching-core-client.test.ts b/src/__tests__/client/core-api/caching-core-client.test.ts index d40fc8f7..2b38c259 100644 --- a/src/__tests__/client/core-api/caching-core-client.test.ts +++ b/src/__tests__/client/core-api/caching-core-client.test.ts @@ -1,5 +1,5 @@ -import { AllbridgeCoreClientImpl } from "../../../client/core-api"; import { Messenger } from "../../../client/core-api/core-api.model"; +import { AllbridgeCoreClientImpl } from "../../../client/core-api/core-client-base"; import { AllbridgeCoreClientPoolInfoCaching } from "../../../client/core-api/core-client-pool-info-caching"; import { ChainDetailsMap, PoolInfo, PoolInfoMap } from "../../../tokens-info"; import poolGRL from "../../data/pool-info/pool-info-GRL.json"; diff --git a/src/__tests__/client/core-api/core-api-mapper.test.ts b/src/__tests__/client/core-api/core-api-mapper.test.ts index 3db34b53..5ca0139f 100644 --- a/src/__tests__/client/core-api/core-api-mapper.test.ts +++ b/src/__tests__/client/core-api/core-api-mapper.test.ts @@ -1,12 +1,12 @@ import { mapChainDetailsResponseToChainDetailsMap } from "../../../client/core-api/core-api-mapper"; import { ChainDetailsResponse } from "../../../client/core-api/core-api.model"; -import { ChainDetailsWithTokens, ChainDetailsMap } from "../../../tokens-info"; +import { ChainDetailsWithTokens, ChainDetailsMapWithFlags } from "../../../tokens-info"; import chainDetailsGRL from "../../data/tokens-info/ChainDetails-GRL.json"; -import tokensGroupedByChain from "../../data/tokens-info/ChainDetailsMap.json"; +import tokensGroupedByChain from "../../data/tokens-info/ChainDetailsMapWithFlags.json"; import tokensInfo from "../../mock/core-api/token-info.json"; import { initChainsWithTestnet } from "../../mock/utils"; -const expectedTokensGroupedByChain = tokensGroupedByChain as unknown as ChainDetailsMap; +const expectedTokensGroupedByChain = tokensGroupedByChain as unknown as ChainDetailsMapWithFlags; initChainsWithTestnet(); diff --git a/src/__tests__/client/core-api/index.test.ts b/src/__tests__/client/core-api/index.test.ts index 8f568090..0ca591eb 100644 --- a/src/__tests__/client/core-api/index.test.ts +++ b/src/__tests__/client/core-api/index.test.ts @@ -1,6 +1,5 @@ import nock from "nock"; import { ChainSymbol } from "../../../chains/chain.enums"; -import { AllbridgeCoreClientImpl } from "../../../client/core-api"; import { ApiClientImpl } from "../../../client/core-api/api-client"; import { Messenger, @@ -8,16 +7,17 @@ import { ReceiveTransactionCostResponse, TransferStatusResponse, } from "../../../client/core-api/core-api.model"; -import { ChainDetailsMap, PoolInfoMap, PoolKeyObject } from "../../../tokens-info"; +import { AllbridgeCoreClientImpl } from "../../../client/core-api/core-client-base"; +import { ChainDetailsMapWithFlags, PoolInfoMap, PoolKeyObject } from "../../../tokens-info"; import poolMap from "../../data/pool-info/pool-info-map.json"; -import tokensGroupedByChain from "../../data/tokens-info/ChainDetailsMap.json"; +import tokensGroupedByChain from "../../data/tokens-info/ChainDetailsMapWithFlags.json"; import transferStatus from "../../data/transfer-status/TransferStatus.json"; import poolResponse from "../../mock/core-api/pool-info.json"; import transferStatusResponse from "../../mock/core-api/send-status.json"; import tokenInfoResponse from "../../mock/core-api/token-info.json"; import { getRequestBodyMatcher, initChainsWithTestnet } from "../../mock/utils"; -const expectedTokensGroupedByChain = tokensGroupedByChain as unknown as ChainDetailsMap; +const expectedTokensGroupedByChain = tokensGroupedByChain as unknown as ChainDetailsMapWithFlags; const expectedTransferStatus = transferStatus as unknown as TransferStatusResponse; initChainsWithTestnet(); @@ -33,7 +33,7 @@ describe("AllbridgeCoreClient", () => { let scope: nock.Scope; beforeEach(() => { - scope = nock("http://localhost").get("/token-info").reply(200, tokenInfoResponse); + scope = nock("http://localhost").get("/token-info?filter=all").reply(200, tokenInfoResponse); }); it("☀️ getChainDetailsMap() returns ChainDetailsMap", async () => { @@ -122,7 +122,7 @@ describe("AllbridgeCoreClient", () => { it("☀️ should be present", async () => { const nockOptions = { reqheaders: customHeaders }; // cSpell:disable-line - const scope: nock.Scope = nock("http://localhost", nockOptions).get("/token-info").reply(200); + const scope: nock.Scope = nock("http://localhost", nockOptions).get("/token-info?filter=all").reply(200); await api.getChainDetailsMap(); diff --git a/src/__tests__/data/tokens-info/ChainDetailsMap-ETH-USDT.json b/src/__tests__/data/tokens-info/ChainDetailsMap-ETH-USDT.json index 3789c3ae..7711f215 100644 --- a/src/__tests__/data/tokens-info/ChainDetailsMap-ETH-USDT.json +++ b/src/__tests__/data/tokens-info/ChainDetailsMap-ETH-USDT.json @@ -59,7 +59,11 @@ } }, "confirmations": 80, - "chainName": "Ethereum" + "chainName": "Ethereum", + "flags": { + "swap": true, + "pool": true + } } ] } diff --git a/src/__tests__/data/tokens-info/ChainDetailsMapWithFlags.json b/src/__tests__/data/tokens-info/ChainDetailsMapWithFlags.json new file mode 100644 index 00000000..7eccbc60 --- /dev/null +++ b/src/__tests__/data/tokens-info/ChainDetailsMapWithFlags.json @@ -0,0 +1,401 @@ +{ + "GRL": { + "chainSymbol": "GRL", + "chainType": "EVM", + "chainId": "0x5", + "name": "Goerli", + "allbridgeChainId": 2, + "bridgeAddress": "0xba285A8F52601EabCc769706FcBDe2645aa0AF18", + "transferTime": { + "ETH": { + "1": 120000, + "2": 120000 + }, + "POL": { + "1": 120000, + "2": 600000 + }, + "SOL": { + "1": 120000, + "2": 40140000 + }, + "TRX": { + "1": 120000, + "2": null + } + }, + "confirmations": 5, + "txCostAmount": { + "swap": "2697498159559000", + "transfer": "3332203608867000", + "maxAmount": "9996610826601000" + }, + "tokens": [ + { + "name": "Yaroslav Stable Token", + "poolAddress": "0xEc46d2b11e68A31026673D63B345B889AB37C0Bc", + "tokenAddress": "0xDdaC3cb57DEa3fBEFF4997d78215535Eb5787117", + "decimals": 18, + "symbol": "YUSD", + "feeShare": "0.003", + "apr": "0.1", + "lpRate": "1.000000275", + "chainSymbol": "GRL", + "chainType": "EVM", + "chainId": "0x5", + "allbridgeChainId": 2, + "bridgeAddress": "0xba285A8F52601EabCc769706FcBDe2645aa0AF18", + "transferTime": { + "ETH": { + "1": 120000, + "2": 120000 + }, + "POL": { + "1": 120000, + "2": 600000 + }, + "SOL": { + "1": 120000, + "2": 40140000 + }, + "TRX": { + "1": 120000, + "2": null + } + }, + "txCostAmount": { + "swap": "2697498159559000", + "transfer": "3332203608867000", + "maxAmount": "9996610826601000" + }, + "confirmations": 5, + "chainName": "Goerli", + "flags": { + "swap": true, + "pool": true + } + }, + { + "name": "YARO Stable", + "poolAddress": "0x727e10f9E750C922bf9dee7620B58033F566b34F", + "tokenAddress": "0xC7DBC4A896b34B7a10ddA2ef72052145A9122F43", + "decimals": 18, + "symbol": "YARO", + "feeShare": "0.003", + "apr": "0.1", + "lpRate": "1.00000003", + "chainSymbol": "GRL", + "chainType": "EVM", + "chainId": "0x5", + "allbridgeChainId": 2, + "bridgeAddress": "0xba285A8F52601EabCc769706FcBDe2645aa0AF18", + "transferTime": { + "ETH": { + "1": 120000, + "2": 120000 + }, + "POL": { + "1": 120000, + "2": 600000 + }, + "SOL": { + "1": 120000, + "2": 40140000 + }, + "TRX": { + "1": 120000, + "2": null + } + }, + "txCostAmount": { + "swap": "2697498159559000", + "transfer": "3332203608867000", + "maxAmount": "9996610826601000" + }, + "confirmations": 5, + "chainName": "Goerli", + "flags": { + "swap": true, + "pool": true + } + } + ] + }, + "POL": { + "chainSymbol": "POL", + "chainId": "0x89", + "name": "Polygon", + "chainType": "EVM", + "allbridgeChainId": 5, + "bridgeAddress": "0xDbBE85a3E22F52F834c3D5ED627fb76DB554669e", + "transferTime": { + "BSC": { + "1": 420000, + "2": 600000 + }, + "ETH": { + "1": 420000, + "2": 600000 + }, + "SOL": { + "1": 420000, + "2": 600000 + }, + "TRX": { + "1": 360000, + "2": null + } + }, + "confirmations": 150, + "tokens": [ + { + "name": "USD Coin", + "poolAddress": "0x6d92cF0D4ae712817AaD1A4CCac37145E19E3622", + "tokenAddress": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174", + "decimals": 6, + "symbol": "USDC", + "feeShare": "0.0015", + "apr": "0.09296298756928563541", + "lpRate": "1.00002027324711969171", + "chainSymbol": "POL", + "chainId": "0x89", + "chainType": "EVM", + "allbridgeChainId": 5, + "bridgeAddress": "0xDbBE85a3E22F52F834c3D5ED627fb76DB554669e", + "transferTime": { + "BSC": { + "1": 420000, + "2": 600000 + }, + "ETH": { + "1": 420000, + "2": 600000 + }, + "SOL": { + "1": 420000, + "2": 600000 + }, + "TRX": { + "1": 360000, + "2": null + } + }, + "confirmations": 150, + "chainName": "Polygon", + "flags": { + "swap": true, + "pool": true + } + }, + { + "name": "Tether USD", + "poolAddress": "0x171f3F8AE9825667a51f31ABCc085E2F92a47826", + "tokenAddress": "0xc2132D05D31c914a87C6611C10748AEb04B58e8F", + "decimals": 6, + "symbol": "USDT", + "feeShare": "0.0015", + "apr": "0.04748078844651022051", + "lpRate": "1.00001340306750352152", + "chainSymbol": "POL", + "chainId": "0x89", + "chainType": "EVM", + "allbridgeChainId": 5, + "bridgeAddress": "0xDbBE85a3E22F52F834c3D5ED627fb76DB554669e", + "transferTime": { + "BSC": { + "1": 420000, + "2": 600000 + }, + "ETH": { + "1": 420000, + "2": 600000 + }, + "SOL": { + "1": 420000, + "2": 600000 + }, + "TRX": { + "1": 360000, + "2": null + } + }, + "confirmations": 150, + "chainName": "Polygon", + "flags": { + "swap": true, + "pool": true + } + } + ] + }, + "TRX": { + "chainSymbol": "TRX", + "chainType": "TRX", + "name": "Tron", + "allbridgeChainId": 4, + "bridgeAddress": "TWU3j4etqPT4zSwABPrgmak3uXFSkxpPwM", + "transferTime": { + "BSC": { + "1": 180000, + "2": null + }, + "ETH": { + "1": 180000, + "2": null + }, + "POL": { + "1": 180000, + "2": null + }, + "SOL": { + "1": 180000, + "2": null + } + }, + "confirmations": 20, + "tokens": [ + { + "name": "Yaroslav Stable Token", + "poolAddress": "TYZmD6XgFNRNkDthZ8y7o2D9wPTqex7eRD", + "tokenAddress": "TYjmrhFaFMNKE8RheRUCQUWJHpRbY8Q9zy", + "decimals": 18, + "symbol": "USDY", + "feeShare": "0.003", + "apr": "0", + "lpRate": "1.00000013499865136347", + "chainSymbol": "TRX", + "chainType": "TRX", + "allbridgeChainId": 4, + "bridgeAddress": "TWU3j4etqPT4zSwABPrgmak3uXFSkxpPwM", + "transferTime": { + "BSC": { + "1": 180000, + "2": null + }, + "ETH": { + "1": 180000, + "2": null + }, + "POL": { + "1": 180000, + "2": null + }, + "SOL": { + "1": 180000, + "2": null + } + }, + "confirmations": 20, + "chainName": "Tron", + "flags": { + "swap": true, + "pool": true + } + }, + { + "name": "Yaro Stable", + "poolAddress": "TT3oijZeGEjKYg4UNYhaxLdh76YVyMcjHd", + "tokenAddress": "TS7Aqd75LprBKkPPxVLuZ8WWEyULEQFF1U", + "decimals": 18, + "symbol": "YARO", + "feeShare": "0.003", + "apr": "0", + "lpRate": "1.00000007", + "chainSymbol": "TRX", + "chainType": "TRX", + "allbridgeChainId": 4, + "bridgeAddress": "TWU3j4etqPT4zSwABPrgmak3uXFSkxpPwM", + "transferTime": { + "BSC": { + "1": 180000, + "2": null + }, + "ETH": { + "1": 180000, + "2": null + }, + "POL": { + "1": 180000, + "2": null + }, + "SOL": { + "1": 180000, + "2": null + } + }, + "confirmations": 20, + "chainName": "Tron", + "flags": { + "swap": true, + "pool": true + } + } + ] + }, + "SOL": { + "chainSymbol": "SOL", + "name": "Solana", + "chainType": "SOLANA", + "allbridgeChainId": 5, + "bridgeAddress": "DYUD8BuYGmtBeYbuWpEomGk9A6H2amyakSUw46vmQf8r", + "transferTime": { + "BSC": { + "1": 120000, + "2": 120000 + }, + "ETH": { + "1": 120000, + "2": 120000 + }, + "POL": { + "1": 120000, + "2": 120000 + }, + "TRX": { + "1": 120000, + "2": null + } + }, + "confirmations": 32, + "tokens": [ + { + "name": "Yaroslav token", + "poolAddress": "6J9DNoMFciheb28kRbrtHjuKUgrfcAeq6AbSKNAJZJpE", + "tokenAddress": "f4yhod6Y7jzVwFfy3iHDg49GAerFTrtp1Ac1ubdWx7L", + "decimals": 9, + "symbol": "YARO", + "feeShare": "0.003", + "apr": "51.739745973369194549", + "lpRate": "0.99883244162470286635", + "chainSymbol": "SOL", + "chainType": "SOLANA", + "allbridgeChainId": 5, + "bridgeAddress": "DYUD8BuYGmtBeYbuWpEomGk9A6H2amyakSUw46vmQf8r", + "transferTime": { + "BSC": { + "1": 120000, + "2": 120000 + }, + "ETH": { + "1": 120000, + "2": 120000 + }, + "POL": { + "1": 120000, + "2": 120000 + }, + "TRX": { + "1": 120000, + "2": null + } + }, + "confirmations": 32, + "chainName": "Solana", + "flags": { + "swap": true, + "pool": true + } + } + ] + } +} diff --git a/src/__tests__/index.test.ts b/src/__tests__/index.test.ts index 1ef8bf2c..109596e4 100644 --- a/src/__tests__/index.test.ts +++ b/src/__tests__/index.test.ts @@ -338,7 +338,7 @@ describe("SDK", () => { describe("Get tokens info", () => { beforeAll(() => { - scope.get("/token-info").reply(200, tokenInfoResponse).persist(); + scope.get("/token-info?filter=all").reply(200, tokenInfoResponse).persist(); }); test("☀️ chainDetailsMap() returns ChainDetailsMap", async () => { diff --git a/src/__tests__/mock/bridge/models/bridge.ts b/src/__tests__/mock/bridge/models/bridge.ts index 00ec5ec6..3cc106d7 100644 --- a/src/__tests__/mock/bridge/models/bridge.ts +++ b/src/__tests__/mock/bridge/models/bridge.ts @@ -1,12 +1,13 @@ /* eslint-disable @typescript-eslint/ban-ts-comment, @typescript-eslint/no-unused-vars */ import { ChainType } from "../../../../chains/chain.enums"; -import { AllbridgeCoreClient } from "../../../../client/core-api"; +import { AllbridgeCoreClient, AllbridgeCoreClientWithPoolInfo } from "../../../../client/core-api/core-client-base"; import { ApproveParams, ChainBridgeService, GetAllowanceParamsDto, GetTokenBalanceParams, SendParams, + SwapParams, TxSendParams, } from "../../../../services/bridge/models"; import { SolanaBridgeParams } from "../../../../services/bridge/sol"; @@ -44,4 +45,12 @@ export class TestBridge extends ChainBridgeService { // @ts-expect-error return Promise.resolve(undefined); } + + buildRawTransactionSwap(params: SwapParams): Promise { + return Promise.resolve(""); + } + + send(params: SendParams): Promise { + return Promise.resolve({ txId: "txId" }); + } } diff --git a/src/__tests__/mock/core-api/token-info.json b/src/__tests__/mock/core-api/token-info.json index 8135ed3d..03fee7b3 100644 --- a/src/__tests__/mock/core-api/token-info.json +++ b/src/__tests__/mock/core-api/token-info.json @@ -18,7 +18,11 @@ }, "feeShare": "0.003", "apr": "0.1", - "lpRate": "1.000000275" + "lpRate": "1.000000275", + "flags": { + "swap": true, + "pool": true + } }, { "name": "YARO Stable", @@ -37,7 +41,11 @@ }, "feeShare": "0.003", "apr": "0.1", - "lpRate": "1.00000003" + "lpRate": "1.00000003", + "flags": { + "swap": true, + "pool": true + } } ], "chainId": 2, @@ -87,7 +95,11 @@ }, "feeShare": "0.0015", "apr": "0.09296298756928563541", - "lpRate": "1.00002027324711969171" + "lpRate": "1.00002027324711969171", + "flags": { + "swap": true, + "pool": true + } }, { "name": "Tether USD", @@ -106,7 +118,11 @@ }, "feeShare": "0.0015", "apr": "0.04748078844651022051", - "lpRate": "1.00001340306750352152" + "lpRate": "1.00001340306750352152", + "flags": { + "swap": true, + "pool": true + } } ], "chainId": 5, @@ -151,7 +167,11 @@ }, "feeShare": "0.003", "apr": "0", - "lpRate": "1.00000013499865136347" + "lpRate": "1.00000013499865136347", + "flags": { + "swap": true, + "pool": true + } }, { "name": "Yaro Stable", @@ -170,7 +190,11 @@ }, "feeShare": "0.003", "apr": "0", - "lpRate": "1.00000007" + "lpRate": "1.00000007", + "flags": { + "swap": true, + "pool": true + } } ], "chainId": 4, @@ -244,6 +268,10 @@ "tokenBalance": "48785698", "accRewardPerShareP": "39021819959347844", "p": 48 + }, + "flags": { + "swap": true, + "pool": true } } ] diff --git a/src/__tests__/mock/utils.ts b/src/__tests__/mock/utils.ts index 7d5a4842..61808eb2 100644 --- a/src/__tests__/mock/utils.ts +++ b/src/__tests__/mock/utils.ts @@ -50,7 +50,7 @@ export function mockTokenInfoEndpoint( ...infoResponse, }; } - scope.get("/token-info").reply(200, resultInfo).persist(); + scope.get("/token-info?filter=all").reply(200, resultInfo).persist(); } export function rpcReply(result: any): (url: string, body: any) => Record { diff --git a/src/__tests__/services/bridge/evm/index.test.ts b/src/__tests__/services/bridge/evm/index.test.ts index bb775f9d..877bdcf8 100644 --- a/src/__tests__/services/bridge/evm/index.test.ts +++ b/src/__tests__/services/bridge/evm/index.test.ts @@ -1,10 +1,10 @@ import Web3 from "web3"; -import { AllbridgeCoreClient } from "../../../../client/core-api"; import { Messenger } from "../../../../client/core-api/core-api.model"; +import { AllbridgeCoreClientWithPoolInfo } from "../../../../client/core-api/core-client-base"; import { FeePaymentMethod, SendParams, TokenWithChainDetails } from "../../../../models"; import { NodeRpcUrlsConfig } from "../../../../services"; import { EvmBridgeService } from "../../../../services/bridge/evm"; -import { ChainDetailsMap } from "../../../../tokens-info"; +import { ChainDetailsMapWithFlags } from "../../../../tokens-info"; import tokensGroupedByChain from "../../../data/tokens-info/ChainDetailsMap-ETH-USDT.json"; import { mockNonce } from "../../../mock/bridge/utils"; import { initChainsWithTestnet } from "../../../mock/utils"; @@ -14,11 +14,11 @@ initChainsWithTestnet(); describe("EvmBridge", () => { let evmBridge: EvmBridgeService; - const chainDetailsMap = tokensGroupedByChain as unknown as ChainDetailsMap; + const chainDetailsMap = tokensGroupedByChain as unknown as ChainDetailsMapWithFlags; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-expect-error enough for mock - const api: AllbridgeCoreClient = { + const api: AllbridgeCoreClientWithPoolInfo = { getChainDetailsMap: () => new Promise((resolve) => { resolve(chainDetailsMap); diff --git a/src/__tests__/services/bridge/trx/index.test.ts b/src/__tests__/services/bridge/trx/index.test.ts index e654c2f9..d13d8337 100644 --- a/src/__tests__/services/bridge/trx/index.test.ts +++ b/src/__tests__/services/bridge/trx/index.test.ts @@ -1,8 +1,8 @@ // @ts-expect-error import tron import TronWeb from "tronweb"; import { ChainType } from "../../../../chains/chain.enums"; -import { AllbridgeCoreClient } from "../../../../client/core-api"; import { Messenger } from "../../../../client/core-api/core-api.model"; +import { AllbridgeCoreClientWithPoolInfo } from "../../../../client/core-api/core-client-base"; import { ChainSymbol, FeePaymentMethod } from "../../../../models"; import { TxSendParams } from "../../../../services/bridge/models"; import { TronBridgeService } from "../../../../services/bridge/trx"; @@ -23,7 +23,7 @@ describe("TrxBridge", () => { triggerSmartContract: jest.fn(), }, }; - trxBridge = new TronBridgeService(tronWebMock as typeof TronWeb, api as AllbridgeCoreClient); + trxBridge = new TronBridgeService(tronWebMock as typeof TronWeb, api as AllbridgeCoreClientWithPoolInfo); }); afterEach(() => { diff --git a/src/__tests__/services/bridge/utils.test.ts b/src/__tests__/services/bridge/utils.test.ts index 63e70a01..61575c10 100644 --- a/src/__tests__/services/bridge/utils.test.ts +++ b/src/__tests__/services/bridge/utils.test.ts @@ -3,13 +3,13 @@ import bs58 from "bs58"; import nock, { Body, RequestBodyMatcher } from "nock"; import { ChainType } from "../../../chains/chain.enums"; -import { AllbridgeCoreClient, AllbridgeCoreClientImpl } from "../../../client/core-api"; import { ApiClientImpl } from "../../../client/core-api/api-client"; import { Messenger, ReceiveTransactionCostRequest, ReceiveTransactionCostResponse, } from "../../../client/core-api/core-api.model"; +import { AllbridgeCoreClientWithPoolInfo, AllbridgeCoreClientImpl } from "../../../client/core-api/core-client-base"; import { AmountFormat, ChainSymbol, @@ -29,7 +29,7 @@ import { initChainsWithTestnet } from "../../mock/utils"; initChainsWithTestnet(); describe("ChainBridgeService Utils", () => { - let api: AllbridgeCoreClient; + let api: AllbridgeCoreClientWithPoolInfo; let scope: nock.Scope; beforeEach(() => { @@ -40,9 +40,10 @@ describe("ChainBridgeService Utils", () => { const exchangeRate = "0.12550590438537169016"; const sourceNativeTokenPrice = "241.26"; const receiveFeeResponse: ReceiveTransactionCostResponse = { fee, exchangeRate, sourceNativeTokenPrice }; + describe("prepareTxSendParams()", () => { beforeEach(() => { - scope = nock("http://localhost").get("/token-info").reply(200, tokenInfoResponse).persist(); + scope = nock("http://localhost").get("/token-info?filter=all").reply(200, tokenInfoResponse).persist(); }); it("should return prepared TxSendParams for EVM->TRX blockchain from SendParamsWithChainSymbols", async () => { diff --git a/src/__tests__/services/liquidity-pool/evm/index.test.ts b/src/__tests__/services/liquidity-pool/evm/index.test.ts index 1b1dd0cd..4f1dc2f9 100644 --- a/src/__tests__/services/liquidity-pool/evm/index.test.ts +++ b/src/__tests__/services/liquidity-pool/evm/index.test.ts @@ -1,7 +1,7 @@ import { abortPendingRequests, cleanAll, disableNetConnect } from "nock"; import Web3 from "web3"; import { ChainSymbol } from "../../../../chains/chain.enums"; -import { AllbridgeCoreClient } from "../../../../client/core-api"; +import { AllbridgeCoreClientWithPoolInfo } from "../../../../client/core-api/core-client-base"; import { EvmPoolService } from "../../../../services/liquidity-pool/evm"; import { TokenWithChainDetails } from "../../../../tokens-info"; @@ -12,7 +12,7 @@ const TOKEN_INFO: TokenWithChainDetails = { poolAddress: POOL_ADDRESS }; const LOCAL_NODE_URL = "https://goerli.infura.io/"; describe("EvmPool", () => { // @ts-expect-error enough - const api: AllbridgeCoreClient = {}; + const api: AllbridgeCoreClientWithPoolInfo = {}; const evmPool = new EvmPoolService(new Web3(LOCAL_NODE_URL), api); diff --git a/src/__tests__/services/liquidity-pool/sol/index.test.ts b/src/__tests__/services/liquidity-pool/sol/index.test.ts index 8cf798d3..f1df6201 100644 --- a/src/__tests__/services/liquidity-pool/sol/index.test.ts +++ b/src/__tests__/services/liquidity-pool/sol/index.test.ts @@ -1,5 +1,5 @@ import * as nock from "nock"; -import { AllbridgeCoreClient } from "../../../../client/core-api"; +import { AllbridgeCoreClientWithPoolInfo } from "../../../../client/core-api/core-client-base"; import { SolanaPoolService } from "../../../../services/liquidity-pool/sol"; import { RawTransaction } from "../../../../services/models"; import { TokenWithChainDetails } from "../../../../tokens-info"; @@ -18,7 +18,7 @@ describe.skip("SolanaPool", () => { let api: any; const solanaRpcUrl = "https://api.devnet.solana.com"; - const solanaPool = new SolanaPoolService(solanaRpcUrl, api as AllbridgeCoreClient); + const solanaPool = new SolanaPoolService(solanaRpcUrl, api as AllbridgeCoreClientWithPoolInfo); beforeAll(() => { nock.disableNetConnect(); diff --git a/src/__tests__/services/liquidity-pool/trx/index.test.ts b/src/__tests__/services/liquidity-pool/trx/index.test.ts index 83f967ca..9c534ea8 100644 --- a/src/__tests__/services/liquidity-pool/trx/index.test.ts +++ b/src/__tests__/services/liquidity-pool/trx/index.test.ts @@ -1,7 +1,7 @@ import { abortPendingRequests, cleanAll, disableNetConnect, load } from "nock"; // @ts-expect-error import tron import TronWeb from "tronweb"; -import { AllbridgeCoreClient } from "../../../../client/core-api"; +import { AllbridgeCoreClientWithPoolInfo } from "../../../../client/core-api/core-client-base"; import { TronPoolService } from "../../../../services/liquidity-pool/trx"; import { TokenWithChainDetails } from "../../../../tokens-info"; @@ -23,7 +23,11 @@ describe("TronPool", () => { }, }; - const tronPool = new TronPoolService(tronWebMock as typeof TronWeb, api as AllbridgeCoreClient, LOCAL_NODE_URL); + const tronPool = new TronPoolService( + tronWebMock as typeof TronWeb, + api as AllbridgeCoreClientWithPoolInfo, + LOCAL_NODE_URL + ); beforeAll(() => { disableNetConnect(); @@ -124,7 +128,7 @@ describe("TronPool", () => { const tronWeb = new TronWeb({ fullHost: LOCAL_NODE_URL }); - const tronPool = new TronPoolService(tronWeb, api as AllbridgeCoreClient, LOCAL_NODE_URL); + const tronPool = new TronPoolService(tronWeb, api as AllbridgeCoreClientWithPoolInfo, LOCAL_NODE_URL); const userBalanceInfo = await tronPool.getUserBalanceInfo(ACCOUNT_ADDRESS, TOKEN_INFO); diff --git a/src/client/core-api/api-client.ts b/src/client/core-api/api-client.ts index 23390ef5..7e4fcf16 100644 --- a/src/client/core-api/api-client.ts +++ b/src/client/core-api/api-client.ts @@ -1,5 +1,5 @@ import axios, { Axios } from "axios"; -import { ChainDetailsMap, PoolInfoMap, PoolKeyObject } from "../../tokens-info"; +import { ChainDetailsMapWithFlags, PoolInfoMap, PoolKeyObject } from "../../tokens-info"; import { VERSION } from "../../version"; import { mapChainDetailsResponseToChainDetailsMap, @@ -15,10 +15,10 @@ import { ReceiveTransactionCostResponse, TransferStatusResponse, } from "./core-api.model"; -import { AllbridgeCoreClientParams } from "./index"; +import { AllbridgeCoreClientParams } from "./core-client-base"; export interface TokenInfo { - chainDetailsMap: ChainDetailsMap; + chainDetailsMap: ChainDetailsMapWithFlags; poolInfoMap: PoolInfoMap; } @@ -52,7 +52,7 @@ export class ApiClientImpl implements ApiClient { } async getTokenInfo(): Promise { - const { data } = await this.api.get("/token-info"); + const { data } = await this.api.get("/token-info", { params: { filter: "all" } }); return { chainDetailsMap: mapChainDetailsResponseToChainDetailsMap(data), poolInfoMap: mapChainDetailsResponseToPoolInfoMap(data), diff --git a/src/client/core-api/core-api-mapper.ts b/src/client/core-api/core-api-mapper.ts index a63761cb..190a91c3 100644 --- a/src/client/core-api/core-api-mapper.ts +++ b/src/client/core-api/core-api-mapper.ts @@ -2,11 +2,12 @@ import { Chains } from "../../chains"; import { ChainDetails, ChainDetailsMap, - ChainDetailsWithTokens, + ChainDetailsMapWithFlags, + ChainDetailsWithTokensWithFlags, MessengerTransferTime, PoolInfoMap, PoolKeyObject, - TokenWithChainDetails, + TokenWithChainDetailsWithFlags, TransferTime, } from "../../tokens-info"; import { calculatePoolInfoImbalance } from "../../utils/calculation"; @@ -21,8 +22,8 @@ import { TransferTimeDTO, } from "./core-api.model"; -export function mapChainDetailsResponseToChainDetailsMap(response: ChainDetailsResponse): ChainDetailsMap { - return Object.entries(response).reduce((map, entry) => { +export function mapChainDetailsResponseToChainDetailsMap(response: ChainDetailsResponse): ChainDetailsMapWithFlags { + return Object.entries(response).reduce((map, entry) => { const chainSymbol = entry[0]; const chainDetailsDTO = entry[1]; const chainDetails = mapChainDetailsFromDto(chainSymbol, chainDetailsDTO); @@ -49,7 +50,7 @@ export function mapChainDetailsResponseToPoolInfoMap(response: ChainDetailsRespo return poolInfoMap; } -function mapTokenWithChainDetailsFromDto(chainDetails: ChainDetails, dto: TokenDTO): TokenWithChainDetails { +function mapTokenWithChainDetailsFromDto(chainDetails: ChainDetails, dto: TokenDTO): TokenWithChainDetailsWithFlags { const { name: chainName, ...chainDetailsWithoutName } = chainDetails; const { poolInfo: _poolInfo, ...dtoWithoutPoolInfo } = dto; return { @@ -89,7 +90,7 @@ function mapMessengerTransferTimeFromDto(dto: MessengerTransferTimeDTO): Messeng }, {}); } -function mapChainDetailsFromDto(chainSymbol: string, dto: ChainDetailsDTO): ChainDetailsWithTokens | null { +function mapChainDetailsFromDto(chainSymbol: string, dto: ChainDetailsDTO): ChainDetailsWithTokensWithFlags | null { const basicChainProperties = Chains.getChainsProperties()[chainSymbol]; /* eslint-disable-next-line @typescript-eslint/no-unnecessary-condition */ if (!basicChainProperties) { diff --git a/src/client/core-api/core-api.model.ts b/src/client/core-api/core-api.model.ts index 17ecbd8c..4ac239ad 100644 --- a/src/client/core-api/core-api.model.ts +++ b/src/client/core-api/core-api.model.ts @@ -32,6 +32,10 @@ export interface TokenDTO { apr7d: string; apr30d: string; lpRate: string; + flags: { + swap: boolean; + pool: boolean; + }; } export interface PoolInfoDTO { diff --git a/src/client/core-api/index.ts b/src/client/core-api/core-client-base.ts similarity index 70% rename from src/client/core-api/index.ts rename to src/client/core-api/core-client-base.ts index 72d56207..f11dc426 100644 --- a/src/client/core-api/index.ts +++ b/src/client/core-api/core-client-base.ts @@ -1,4 +1,9 @@ -import { ChainDetailsMap, PoolInfoMap, PoolKeyObject, TokenWithChainDetails } from "../../tokens-info"; +import { + ChainDetailsMapWithFlags, + PoolInfoMap, + PoolKeyObject, + TokenWithChainDetailsWithFlags, +} from "../../tokens-info"; import { ApiClient } from "./api-client"; import { GasBalanceResponse, @@ -15,9 +20,6 @@ export interface AllbridgeCoreClientParams { } export interface AllbridgeCoreClient { - getChainDetailsMap(): Promise; - tokens(): Promise; - getPendingInfo(): Promise; getTransferStatus(chainSymbol: string, txId: string): Promise; @@ -27,14 +29,29 @@ export interface AllbridgeCoreClient { getGasBalance(chainSymbol: string, address: string): Promise; } -export class AllbridgeCoreClientImpl implements AllbridgeCoreClient { +export interface AllbridgeCoreClientWithTokens extends AllbridgeCoreClient { + getChainDetailsMap(): Promise; + + tokens(): Promise; +} + +export interface AllbridgeCoreClientWithPoolInfo extends AllbridgeCoreClientWithTokens { + getChainDetailsMapAndPoolInfoMap(): Promise<{ + chainDetailsMap: ChainDetailsMapWithFlags; + poolInfoMap: PoolInfoMap; + }>; + + getPoolInfoMap(pools: PoolKeyObject[] | PoolKeyObject): Promise; +} + +export class AllbridgeCoreClientImpl implements AllbridgeCoreClientWithPoolInfo { constructor(private apiClient: ApiClient) {} - async getChainDetailsMap(): Promise { + async getChainDetailsMap(): Promise { return (await this.apiClient.getTokenInfo()).chainDetailsMap; } - async tokens(): Promise { + async tokens(): Promise { const map = await this.getChainDetailsMap(); return Object.values(map).flatMap((chainDetails) => chainDetails.tokens); } @@ -48,7 +65,7 @@ export class AllbridgeCoreClientImpl implements AllbridgeCoreClient { } async getChainDetailsMapAndPoolInfoMap(): Promise<{ - chainDetailsMap: ChainDetailsMap; + chainDetailsMap: ChainDetailsMapWithFlags; poolInfoMap: PoolInfoMap; }> { return await this.apiClient.getTokenInfo(); diff --git a/src/client/core-api/core-client-filtered.ts b/src/client/core-api/core-client-filtered.ts new file mode 100644 index 00000000..42a14c6f --- /dev/null +++ b/src/client/core-api/core-client-filtered.ts @@ -0,0 +1,96 @@ +import { AllbridgeCoreSdkOptions } from "../../index"; +import { + ChainDetailsMap, + PoolInfo, + PoolKeyObject, + TokenWithChainDetails, + TokenWithChainDetailsWithFlags, +} from "../../tokens-info"; +import { + GasBalanceResponse, + PendingInfoResponse, + ReceiveTransactionCostRequest, + ReceiveTransactionCostResponse, + TransferStatusResponse, +} from "./core-api.model"; +import { AllbridgeCoreClient, AllbridgeCoreClientWithTokens } from "./core-client-base"; +import { AllbridgeCoreClientPoolsExt } from "./core-client-pool-info-caching"; + +export interface AllbridgeCoreClientFiltered extends AllbridgeCoreClient, AllbridgeCoreClientPoolsExt { + getChainDetailsMap(type: "swap" | "pool"): Promise; + + tokens(type: "swap" | "pool"): Promise; +} + +export class AllbridgeCoreClientFilteredImpl implements AllbridgeCoreClientFiltered { + private readonly isStaging: boolean; + + constructor( + private client: AllbridgeCoreClientWithTokens & AllbridgeCoreClientPoolsExt, + params: AllbridgeCoreSdkOptions + ) { + this.isStaging = params.coreApiQueryParams?.staging === "true"; + } + + async getChainDetailsMap(type: "swap" | "pool"): Promise { + const chainDetailsMapWithFlags = await this.client.getChainDetailsMap(); + const result: ChainDetailsMap = {}; + + for (const key in chainDetailsMapWithFlags) { + const chainDetailsWithTokensWithFlag = chainDetailsMapWithFlags[key]; + if (chainDetailsWithTokensWithFlag) { + result[key] = { + ...chainDetailsWithTokensWithFlag, + tokens: filterAndConvertToTokenWithChainDetails(chainDetailsWithTokensWithFlag.tokens, type, this.isStaging), + }; + } + } + return result; + } + + async tokens(type: "swap" | "pool"): Promise { + return filterAndConvertToTokenWithChainDetails(await this.client.tokens(), type, this.isStaging); + } + + async getPendingInfo(): Promise { + return this.client.getPendingInfo(); + } + + async getGasBalance(chainSymbol: string, address: string): Promise { + return this.client.getGasBalance(chainSymbol, address); + } + + async getTransferStatus(chainSymbol: string, txId: string): Promise { + return await this.client.getTransferStatus(chainSymbol, txId); + } + + async getReceiveTransactionCost(args: ReceiveTransactionCostRequest): Promise { + return await this.client.getReceiveTransactionCost(args); + } + + cachePut(poolKeyObject: PoolKeyObject, poolInfo: PoolInfo): void { + return this.client.cachePut(poolKeyObject, poolInfo); + } + + getPoolInfoByKey(poolKeyObject: PoolKeyObject): Promise { + return this.client.getPoolInfoByKey(poolKeyObject); + } + + refreshPoolInfo(poolKeyObjects?: PoolKeyObject | PoolKeyObject[]): Promise { + return this.client.refreshPoolInfo(poolKeyObjects); + } +} + +function filterAndConvertToTokenWithChainDetails( + tokens: TokenWithChainDetailsWithFlags[], + type: "swap" | "pool", + isStaging: boolean +): TokenWithChainDetails[] { + return tokens.filter((token) => (isStaging ? true : token.flags[type])).map(convertToTokenWithChainDetails); +} + +function convertToTokenWithChainDetails(token: TokenWithChainDetailsWithFlags): TokenWithChainDetails { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { flags, ...rest } = token; + return rest; +} diff --git a/src/client/core-api/core-client-pool-info-caching.ts b/src/client/core-api/core-client-pool-info-caching.ts index 19619cfc..d8e4444c 100644 --- a/src/client/core-api/core-client-pool-info-caching.ts +++ b/src/client/core-api/core-client-pool-info-caching.ts @@ -1,6 +1,12 @@ import Cache from "timed-cache"; import { SdkError } from "../../exceptions"; -import { ChainDetailsMap, PoolInfo, PoolInfoMap, PoolKeyObject, TokenWithChainDetails } from "../../tokens-info"; +import { + ChainDetailsMapWithFlags, + PoolInfo, + PoolInfoMap, + PoolKeyObject, + TokenWithChainDetailsWithFlags, +} from "../../tokens-info"; import { mapChainDetailsMapToPoolKeyObjects, mapPoolKeyObjectToPoolKey } from "./core-api-mapper"; import { GasBalanceResponse, @@ -9,22 +15,29 @@ import { ReceiveTransactionCostResponse, TransferStatusResponse, } from "./core-api.model"; -import { AllbridgeCoreClient, AllbridgeCoreClientImpl } from "./index"; +import { AllbridgeCoreClientWithPoolInfo, AllbridgeCoreClientWithTokens } from "./core-client-base"; const _55_SECONDS_TTL = 55 * 1000; -export class AllbridgeCoreClientPoolInfoCaching implements AllbridgeCoreClient { +export interface AllbridgeCoreClientPoolsExt { + getPoolInfoByKey(poolKeyObject: PoolKeyObject): Promise; + refreshPoolInfo(poolKeyObjects?: PoolKeyObject | PoolKeyObject[]): Promise; + cachePut(poolKeyObject: PoolKeyObject, poolInfo: PoolInfo): void; +} + +export class AllbridgeCoreClientPoolInfoCaching implements AllbridgeCoreClientWithTokens, AllbridgeCoreClientPoolsExt { private readonly poolInfoCache; - constructor(private readonly client: AllbridgeCoreClientImpl) { + constructor(private readonly client: AllbridgeCoreClientWithPoolInfo) { this.poolInfoCache = new PoolInfoCache(); } - async getChainDetailsMap(): Promise { + async getChainDetailsMap(): Promise { const result = await this.client.getChainDetailsMapAndPoolInfoMap(); return result.chainDetailsMap; } - async tokens(): Promise { + + async tokens(): Promise { return await this.client.tokens(); } @@ -75,7 +88,7 @@ export class AllbridgeCoreClientPoolInfoCaching implements AllbridgeCoreClient { this.poolInfoCache.putAll(poolInfoMap); } - cachePut(poolKeyObject: PoolKeyObject, poolInfo: PoolInfo) { + cachePut(poolKeyObject: PoolKeyObject, poolInfo: PoolInfo): void { this.poolInfoCache.put(mapPoolKeyObjectToPoolKey(poolKeyObject), poolInfo); } } diff --git a/src/index.ts b/src/index.ts index ceece693..c3204614 100644 --- a/src/index.ts +++ b/src/index.ts @@ -126,24 +126,36 @@ export class AllbridgeCoreSdk { /** * Returns {@link ChainDetailsMap} containing a list of supported tokens groped by chain. + * + * @param type - A string value which specifies ChainDetailsMap to retrieve. + * Can be either 'swap' for send or 'pool' for liquidity pools setup. + * Defaults to 'swap'. */ - async chainDetailsMap(): Promise { - return this.service.chainDetailsMap(); + async chainDetailsMap(type: "swap" | "pool" = "swap"): Promise { + return this.service.chainDetailsMap(type); } /** * Returns a list of supported {@link TokenWithChainDetails | tokens}. + * + * @param type - A string value which specifies a set of tokens to retrieve. + * Can be either 'swap' for tokens to send or 'pool' for liquidity pools operations. + * Defaults to 'swap'. + * @returns A promise that resolves to an array of {@link TokenWithChainDetails}. */ - async tokens(): Promise { - return this.service.tokens(); + async tokens(type: "swap" | "pool" = "swap"): Promise { + return this.service.tokens(type); } /** * Returns a list of supported {@link TokenWithChainDetails | tokens} on the selected chain. * @param chainSymbol - The symbol of the chain representing one of the supported blockchain networks (e.g., "ETH" for Ethereum). For more details, see: {@link ChainSymbol}. + * @param type - A string value which specifies a set of tokens to retrieve. + * Can be either 'swap' for tokens to send or 'pool' for liquidity pools operations. + * Defaults to 'swap'. */ - async tokensByChain(chainSymbol: string): Promise { - return this.service.tokensByChain(chainSymbol); + async tokensByChain(chainSymbol: string, type: "swap" | "pool" = "swap"): Promise { + return this.service.tokensByChain(chainSymbol, type); } /** diff --git a/src/services/bridge/evm/index.ts b/src/services/bridge/evm/index.ts index a7c9c952..316f25e3 100644 --- a/src/services/bridge/evm/index.ts +++ b/src/services/bridge/evm/index.ts @@ -5,7 +5,7 @@ import BN from "bn.js"; import Web3 from "web3"; import { TransactionConfig } from "web3-core"; import { AbiItem } from "web3-utils"; -import { AllbridgeCoreClient } from "../../../client/core-api"; +import { AllbridgeCoreClient } from "../../../client/core-api/core-client-base"; import { ChainSymbol, ChainType, diff --git a/src/services/bridge/index.ts b/src/services/bridge/index.ts index 064d94d9..277924e3 100644 --- a/src/services/bridge/index.ts +++ b/src/services/bridge/index.ts @@ -3,8 +3,8 @@ import TronWeb from "tronweb"; import Web3 from "web3"; import { NodeRpcUrlsConfig } from ".."; import { Chains } from "../../chains"; -import { AllbridgeCoreClient } from "../../client/core-api"; import { Messenger } from "../../client/core-api/core-api.model"; +import { AllbridgeCoreClient } from "../../client/core-api/core-client-base"; import { CCTPDoesNotSupportedError } from "../../exceptions"; import { AllbridgeCoreSdkOptions, ChainSymbol, ChainType } from "../../index"; import { TokenWithChainDetails } from "../../tokens-info"; diff --git a/src/services/bridge/models/bridge.ts b/src/services/bridge/models/bridge.ts index 305feaf0..0edaaaa8 100644 --- a/src/services/bridge/models/bridge.ts +++ b/src/services/bridge/models/bridge.ts @@ -1,5 +1,5 @@ import { ChainType } from "../../../chains/chain.enums"; -import { AllbridgeCoreClient } from "../../../client/core-api"; +import { AllbridgeCoreClient } from "../../../client/core-api/core-client-base"; import { RawTransaction, TransactionResponse } from "../../models"; import { SendParams, SwapParams } from "./bridge.model"; diff --git a/src/services/bridge/raw-bridge-transaction-builder.ts b/src/services/bridge/raw-bridge-transaction-builder.ts index 98031dbf..c0af1665 100644 --- a/src/services/bridge/raw-bridge-transaction-builder.ts +++ b/src/services/bridge/raw-bridge-transaction-builder.ts @@ -1,5 +1,5 @@ import { NodeRpcUrlsConfig } from ".."; -import { AllbridgeCoreClient } from "../../client/core-api"; +import { AllbridgeCoreClient } from "../../client/core-api/core-client-base"; import { AllbridgeCoreSdkOptions } from "../../index"; import { validateAmountDecimals, validateAmountGtZero } from "../../utils/utils"; import { Provider, RawTransaction } from "../models"; diff --git a/src/services/bridge/sol/index.ts b/src/services/bridge/sol/index.ts index dd0459e0..c06f210f 100644 --- a/src/services/bridge/sol/index.ts +++ b/src/services/bridge/sol/index.ts @@ -13,8 +13,8 @@ import { } from "@solana/web3.js"; import { Big } from "big.js"; import { Chains } from "../../../chains"; -import { AllbridgeCoreClient } from "../../../client/core-api"; import { Messenger } from "../../../client/core-api/core-api.model"; +import { AllbridgeCoreClient } from "../../../client/core-api/core-client-base"; import { AmountNotEnoughError, CCTPDoesNotSupportedError, diff --git a/src/services/bridge/sol/jupiter.ts b/src/services/bridge/sol/jupiter.ts index 1e3450f3..f90e5fd3 100644 --- a/src/services/bridge/sol/jupiter.ts +++ b/src/services/bridge/sol/jupiter.ts @@ -20,6 +20,7 @@ export class JupiterService { exactOut: boolean ): Promise<{ tx: VersionedTransaction; amountIn?: string }> { let quoteResponse: any; + console.log("J amount", amount); try { const swapMode = exactOut ? "ExactOut" : "ExactIn"; quoteResponse = await axios.get(`${this.jupiterUrl}/quote?inputMint=${stableTokenAddress} diff --git a/src/services/bridge/srb/index.ts b/src/services/bridge/srb/index.ts index 23f86734..b51df190 100644 --- a/src/services/bridge/srb/index.ts +++ b/src/services/bridge/srb/index.ts @@ -1,7 +1,7 @@ import { Address, contract } from "@stellar/stellar-sdk"; import { Big } from "big.js"; import { ChainSymbol } from "../../../chains/chain.enums"; -import { AllbridgeCoreClient } from "../../../client/core-api"; +import { AllbridgeCoreClient } from "../../../client/core-api/core-client-base"; import { MethodNotSupportedError } from "../../../exceptions"; import { AllbridgeCoreSdkOptions, ChainType } from "../../../index"; import { FeePaymentMethod } from "../../../models"; diff --git a/src/services/bridge/trx/index.ts b/src/services/bridge/trx/index.ts index 75e63e1e..62406f2b 100644 --- a/src/services/bridge/trx/index.ts +++ b/src/services/bridge/trx/index.ts @@ -2,7 +2,7 @@ import { Big } from "big.js"; // @ts-expect-error import tron import TronWeb from "tronweb"; import { ChainType } from "../../../chains/chain.enums"; -import { AllbridgeCoreClient } from "../../../client/core-api"; +import { AllbridgeCoreClient } from "../../../client/core-api/core-client-base"; import { SdkError } from "../../../exceptions"; import { FeePaymentMethod, Messenger, SwapParams, TransactionResponse } from "../../../models"; import { RawTransaction, SmartContractMethodParameter } from "../../models"; diff --git a/src/services/bridge/utils.ts b/src/services/bridge/utils.ts index 36d02b14..440adb12 100644 --- a/src/services/bridge/utils.ts +++ b/src/services/bridge/utils.ts @@ -5,8 +5,8 @@ import randomBytes from "randombytes"; /* @ts-expect-error Could not find a declaration file for module "tronweb"*/ import * as TronWebLib from "tronweb"; import { Chains } from "../../chains"; -import { AllbridgeCoreClient } from "../../client/core-api"; import { Messenger } from "../../client/core-api/core-api.model"; +import { AllbridgeCoreClient } from "../../client/core-api/core-client-base"; import { AmountNotEnoughError, CCTPDoesNotSupportedError, diff --git a/src/services/index.ts b/src/services/index.ts index 117f6d95..8549d8a2 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -1,6 +1,5 @@ import { Big } from "big.js"; import { Chains } from "../chains"; -import { AllbridgeCoreClientImpl } from "../client/core-api"; import { ApiClientImpl } from "../client/core-api/api-client"; import { ApiClientCaching } from "../client/core-api/api-client-caching"; import { @@ -11,6 +10,8 @@ import { PendingInfoDTO, TransferStatusResponse, } from "../client/core-api/core-api.model"; +import { AllbridgeCoreClientImpl } from "../client/core-api/core-client-base"; +import { AllbridgeCoreClientFiltered, AllbridgeCoreClientFilteredImpl } from "../client/core-api/core-client-filtered"; import { AllbridgeCoreClientPoolInfoCaching } from "../client/core-api/core-client-pool-info-caching"; import { mainnet } from "../configs"; import { AllbridgeCoreSdkOptions, NodeRpcUrls, SdkError } from "../index"; @@ -70,7 +71,7 @@ export class NodeRpcUrlsConfig { } export class AllbridgeCoreSdkService { - private readonly api: AllbridgeCoreClientPoolInfoCaching; + private readonly api: AllbridgeCoreClientFiltered; private readonly tokenService: TokenService; @@ -84,23 +85,24 @@ export class AllbridgeCoreSdkService { const apiClient = new ApiClientImpl(params); const apiClientCaching = new ApiClientCaching(apiClient); const coreClient = new AllbridgeCoreClientImpl(apiClientCaching); - this.api = new AllbridgeCoreClientPoolInfoCaching(coreClient); + const coreClientPoolInfoCaching = new AllbridgeCoreClientPoolInfoCaching(coreClient); + this.api = new AllbridgeCoreClientFilteredImpl(coreClientPoolInfoCaching, params); this.tokenService = new DefaultTokenService(this.api, nodeRpcUrlsConfig, params); this.bridge = new DefaultBridgeService(this.api, nodeRpcUrlsConfig, params, this.tokenService); this.pool = new DefaultLiquidityPoolService(this.api, nodeRpcUrlsConfig, params, this.tokenService); this.params = params; } - async chainDetailsMap(): Promise { - return this.api.getChainDetailsMap(); + async chainDetailsMap(type: "swap" | "pool"): Promise { + return this.api.getChainDetailsMap(type); } - async tokens(): Promise { - return this.api.tokens(); + async tokens(type: "swap" | "pool"): Promise { + return this.api.tokens(type); } - async tokensByChain(chainSymbol: string): Promise { - const map = await this.api.getChainDetailsMap(); + async tokensByChain(chainSymbol: string, type: "swap" | "pool"): Promise { + const map = await this.api.getChainDetailsMap(type); const chainDetails = map[chainSymbol]; if (!chainDetails) { return []; diff --git a/src/services/liquidity-pool/evm/index.ts b/src/services/liquidity-pool/evm/index.ts index b843ec53..fb455911 100644 --- a/src/services/liquidity-pool/evm/index.ts +++ b/src/services/liquidity-pool/evm/index.ts @@ -1,7 +1,7 @@ import Web3 from "web3"; import { AbiItem } from "web3-utils"; import { ChainType } from "../../../chains/chain.enums"; -import { AllbridgeCoreClient } from "../../../client/core-api"; +import { AllbridgeCoreClient } from "../../../client/core-api/core-client-base"; import { PoolInfo, TokenWithChainDetails } from "../../../tokens-info"; import { calculatePoolInfoImbalance } from "../../../utils/calculation"; import { promiseWithTimeout, promiseWithTimeoutAndRetries } from "../../../utils/utils"; diff --git a/src/services/liquidity-pool/index.ts b/src/services/liquidity-pool/index.ts index b5bde72c..b74d50e9 100644 --- a/src/services/liquidity-pool/index.ts +++ b/src/services/liquidity-pool/index.ts @@ -5,8 +5,8 @@ import TronWeb from "tronweb"; import Web3 from "web3"; import { NodeRpcUrlsConfig } from ".."; import { Chains } from "../../chains"; -import { AllbridgeCoreClient } from "../../client/core-api"; -import { AllbridgeCoreClientPoolInfoCaching } from "../../client/core-api/core-client-pool-info-caching"; +import { AllbridgeCoreClient } from "../../client/core-api/core-client-base"; +import { AllbridgeCoreClientFiltered } from "../../client/core-api/core-client-filtered"; import { AllbridgeCoreSdkOptions, ChainType } from "../../index"; import { PoolInfo, PoolKeyObject, TokenWithChainDetails } from "../../tokens-info"; import { convertIntAmountToFloat, fromSystemPrecision } from "../../utils/calculation"; @@ -117,7 +117,7 @@ export class DefaultLiquidityPoolService implements LiquidityPoolService { private cache: Cache; constructor( - private api: AllbridgeCoreClientPoolInfoCaching, + private api: AllbridgeCoreClientFiltered, private nodeRpcUrlsConfig: NodeRpcUrlsConfig, private params: AllbridgeCoreSdkOptions, private tokenService: TokenService diff --git a/src/services/liquidity-pool/models/pool.ts b/src/services/liquidity-pool/models/pool.ts index ce2dfbcf..68eb6d34 100644 --- a/src/services/liquidity-pool/models/pool.ts +++ b/src/services/liquidity-pool/models/pool.ts @@ -1,5 +1,5 @@ import { ChainType } from "../../../chains/chain.enums"; -import { AllbridgeCoreClient } from "../../../client/core-api"; +import { AllbridgeCoreClient } from "../../../client/core-api/core-client-base"; import { PoolInfo, TokenWithChainDetails } from "../../../tokens-info"; import { RawTransaction } from "../../models"; import { LiquidityPoolsParams, LiquidityPoolsParamsWithAmount, UserBalanceInfo } from "./pool.model"; diff --git a/src/services/liquidity-pool/raw-pool-transaction-builder.ts b/src/services/liquidity-pool/raw-pool-transaction-builder.ts index d426f564..c6298211 100644 --- a/src/services/liquidity-pool/raw-pool-transaction-builder.ts +++ b/src/services/liquidity-pool/raw-pool-transaction-builder.ts @@ -1,5 +1,5 @@ import { NodeRpcUrlsConfig } from ".."; -import { AllbridgeCoreClient } from "../../client/core-api"; +import { AllbridgeCoreClient } from "../../client/core-api/core-client-base"; import { AllbridgeCoreSdkOptions } from "../../index"; import { convertFloatAmountToInt } from "../../utils/calculation"; import { SYSTEM_PRECISION } from "../../utils/calculation/constants"; diff --git a/src/services/liquidity-pool/sol/index.ts b/src/services/liquidity-pool/sol/index.ts index 267698d7..7a73d1a2 100644 --- a/src/services/liquidity-pool/sol/index.ts +++ b/src/services/liquidity-pool/sol/index.ts @@ -1,7 +1,7 @@ import { AnchorProvider, BN, Program, Provider, Spl, web3 } from "@project-serum/anchor"; import { Connection, PublicKey, TransactionInstruction } from "@solana/web3.js"; import { ChainType } from "../../../chains/chain.enums"; -import { AllbridgeCoreClient } from "../../../client/core-api"; +import { AllbridgeCoreClient } from "../../../client/core-api/core-client-base"; import { PoolInfo, TokenWithChainDetails } from "../../../tokens-info"; import { calculatePoolInfoImbalance } from "../../../utils/calculation"; import { RawTransaction } from "../../models"; diff --git a/src/services/liquidity-pool/srb/index.ts b/src/services/liquidity-pool/srb/index.ts index ac6a6ef3..66fb3c1e 100644 --- a/src/services/liquidity-pool/srb/index.ts +++ b/src/services/liquidity-pool/srb/index.ts @@ -1,5 +1,5 @@ import { contract } from "@stellar/stellar-sdk"; -import { AllbridgeCoreClient } from "../../../client/core-api"; +import { AllbridgeCoreClient } from "../../../client/core-api/core-client-base"; import { AllbridgeCoreSdkOptions, ChainSymbol, ChainType } from "../../../index"; import { LiquidityPoolsParams, diff --git a/src/services/liquidity-pool/trx/index.ts b/src/services/liquidity-pool/trx/index.ts index c9ae4171..a53377bc 100644 --- a/src/services/liquidity-pool/trx/index.ts +++ b/src/services/liquidity-pool/trx/index.ts @@ -3,7 +3,7 @@ import TronWeb from "tronweb"; import Web3 from "web3"; import { AbiItem } from "web3-utils"; import { ChainType } from "../../../chains/chain.enums"; -import { AllbridgeCoreClient } from "../../../client/core-api"; +import { AllbridgeCoreClient } from "../../../client/core-api/core-client-base"; import { SdkError } from "../../../exceptions"; import { PoolInfo, TokenWithChainDetails } from "../../../tokens-info"; import { calculatePoolInfoImbalance } from "../../../utils/calculation"; diff --git a/src/services/token/evm/index.ts b/src/services/token/evm/index.ts index b00bc8d4..60f04caa 100644 --- a/src/services/token/evm/index.ts +++ b/src/services/token/evm/index.ts @@ -4,7 +4,7 @@ import Web3 from "web3"; import { TransactionConfig } from "web3-core"; import { AbiItem } from "web3-utils"; import { ChainSymbol, ChainType } from "../../../chains/chain.enums"; -import { AllbridgeCoreClient } from "../../../client/core-api"; +import { AllbridgeCoreClient } from "../../../client/core-api/core-client-base"; import { GetTokenBalanceParams, TransactionResponse } from "../../../models"; import { GetNativeTokenBalanceParams } from "../../bridge/models"; import { RawTransaction } from "../../models"; diff --git a/src/services/token/index.ts b/src/services/token/index.ts index 3d005913..b5837e56 100644 --- a/src/services/token/index.ts +++ b/src/services/token/index.ts @@ -3,7 +3,7 @@ import { Big } from "big.js"; import TronWeb from "tronweb"; import Web3 from "web3"; import { Chains } from "../../chains"; -import { AllbridgeCoreClient } from "../../client/core-api"; +import { AllbridgeCoreClient } from "../../client/core-api/core-client-base"; import { AllbridgeCoreSdkOptions, ChainType } from "../../index"; import { AmountFormat, AmountFormatted } from "../../models"; import { convertFloatAmountToInt, convertIntAmountToFloat } from "../../utils/calculation"; diff --git a/src/services/token/models/token.ts b/src/services/token/models/token.ts index 276b39e0..121af7e7 100644 --- a/src/services/token/models/token.ts +++ b/src/services/token/models/token.ts @@ -1,6 +1,6 @@ import { Big } from "big.js"; import { ChainType } from "../../../chains/chain.enums"; -import { AllbridgeCoreClient } from "../../../client/core-api"; +import { AllbridgeCoreClient } from "../../../client/core-api/core-client-base"; import { GetNativeTokenBalanceParams } from "../../bridge/models"; import { RawTransaction, TransactionResponse } from "../../models"; import { ApproveParamsDto, CheckAllowanceParamsDto, GetAllowanceParamsDto, GetTokenBalanceParams } from "./token.model"; diff --git a/src/services/token/sol/index.ts b/src/services/token/sol/index.ts index bee49c9b..4787a947 100644 --- a/src/services/token/sol/index.ts +++ b/src/services/token/sol/index.ts @@ -3,7 +3,7 @@ import { AnchorProvider, Provider } from "@project-serum/anchor"; import { Connection, PublicKey } from "@solana/web3.js"; import { ChainType } from "../../../chains/chain.enums"; -import { AllbridgeCoreClient } from "../../../client/core-api"; +import { AllbridgeCoreClient } from "../../../client/core-api/core-client-base"; import { MethodNotSupportedError } from "../../../exceptions"; import { GetNativeTokenBalanceParams } from "../../bridge/models"; import { RawTransaction, TransactionResponse } from "../../models"; diff --git a/src/services/token/srb/index.ts b/src/services/token/srb/index.ts index 85b6b318..1b7b3ce2 100644 --- a/src/services/token/srb/index.ts +++ b/src/services/token/srb/index.ts @@ -1,7 +1,7 @@ import { Horizon, NotFoundError } from "@stellar/stellar-sdk"; import { Chains } from "../../../chains"; import { ChainSymbol } from "../../../chains/chain.enums"; -import { AllbridgeCoreClient } from "../../../client/core-api"; +import { AllbridgeCoreClient } from "../../../client/core-api/core-client-base"; import { AllbridgeCoreSdkOptions, ChainType, SdkError } from "../../../index"; import { GetTokenBalanceParams, MethodNotSupportedError, TransactionResponse } from "../../../models"; import { convertFloatAmountToInt } from "../../../utils/calculation"; diff --git a/src/services/token/trx/index.ts b/src/services/token/trx/index.ts index e3d1e31d..df63f58f 100644 --- a/src/services/token/trx/index.ts +++ b/src/services/token/trx/index.ts @@ -1,6 +1,6 @@ // @ts-expect-error import tron import TronWeb from "tronweb"; -import { AllbridgeCoreClient } from "../../../client/core-api"; +import { AllbridgeCoreClient } from "../../../client/core-api/core-client-base"; import { SdkError } from "../../../exceptions"; import { ChainType, GetTokenBalanceParams, TransactionResponse } from "../../../models"; import { GetNativeTokenBalanceParams } from "../../bridge/models"; diff --git a/src/tokens-info/tokens-info.model.ts b/src/tokens-info/tokens-info.model.ts index 2474eeeb..0aad1c8e 100644 --- a/src/tokens-info/tokens-info.model.ts +++ b/src/tokens-info/tokens-info.model.ts @@ -10,6 +10,8 @@ import { Messenger } from "../client/core-api/core-api.model"; */ export type ChainDetailsMap = Record; +export type ChainDetailsMapWithFlags = Record; + /** * Contains some blockchain details */ @@ -46,6 +48,16 @@ export interface ChainDetailsWithTokens extends ChainDetails { tokens: TokenWithChainDetails[]; } +/** + * Contains tokens list + */ +export interface ChainDetailsWithTokensWithFlags extends ChainDetails { + /** + * Tokens + */ + tokens: TokenWithChainDetailsWithFlags[]; +} + /** * Contains token information */ @@ -117,6 +129,10 @@ export interface TokenWithChainDetails extends Token, Omit chainName: string; } +export interface TokenWithChainDetailsWithFlags extends TokenWithChainDetails { + flags: { swap: boolean; pool: boolean }; +} + /** * General Pool Interface */ diff --git a/src/utils/utils.ts b/src/utils/utils.ts index dee79c1c..e2764dd2 100644 --- a/src/utils/utils.ts +++ b/src/utils/utils.ts @@ -1,10 +1,10 @@ import { Big, BigSource } from "big.js"; -import { AllbridgeCoreClientPoolInfoCaching } from "../client/core-api/core-client-pool-info-caching"; +import { AllbridgeCoreClientPoolsExt } from "../client/core-api/core-client-pool-info-caching"; import { ArgumentInvalidDecimalsError, InvalidAmountError, TimeoutError } from "../exceptions"; import { PoolInfo, TokenWithChainDetails } from "../tokens-info"; export async function getPoolInfoByToken( - api: AllbridgeCoreClientPoolInfoCaching, + api: AllbridgeCoreClientPoolsExt, sourceChainToken: TokenWithChainDetails ): Promise { return await api.getPoolInfoByKey({