From ed8716fa919155c59052936329acaad245e7a514 Mon Sep 17 00:00:00 2001 From: kaushalrajbacancy <78725072+kaushalrajbacancy@users.noreply.github.com> Date: Tue, 11 Apr 2023 14:34:28 +0530 Subject: [PATCH] SDK implementation of assets analytics using dex guru (#218) * SDK implementation of assets analytics using dex guru * Allowing dynamic chain idon fly --- examples/package.json | 8 +- examples/src/25-token-details.ts | 37 +++ examples/src/26-historical-token-price.ts | 38 +++ examples/src/27-pools-activity.ts | 39 +++ examples/src/28-number-of-transactions.ts | 37 +++ examples/src/29-trading-history.ts | 38 +++ examples/src/30-market-details.ts | 37 +++ package-lock.json | 4 +- package.json | 2 +- schema.graphql | 81 ++++++ src/sdk/assets/__mocks__/assets.service.ts | 6 + src/sdk/assets/assets.service.ts | 243 +++++++++++++++++- .../assets/classes/historical-token-price.ts | 7 + .../assets/classes/historical-token-prices.ts | 7 + src/sdk/assets/classes/index.ts | 10 + src/sdk/assets/classes/market-details.ts | 27 ++ .../assets/classes/number-of-transactions.ts | 3 + src/sdk/assets/classes/pools-activities.ts | 7 + .../classes/pools-activity-tokens-in-out.ts | 13 + src/sdk/assets/classes/pools-activity.ts | 20 ++ src/sdk/assets/classes/token-details.ts | 9 + src/sdk/assets/classes/trading-histories.ts | 7 + src/sdk/assets/classes/trading-history.ts | 22 ++ src/sdk/dto/get-historical-token-price.dto.ts | 20 ++ src/sdk/dto/get-pools-activity.dto.ts | 24 ++ src/sdk/dto/get-token-details.dto.ts | 16 ++ src/sdk/dto/get-trading-history.dto.ts | 20 ++ src/sdk/dto/index.ts | 4 + src/sdk/sdk.ts | 136 +++++++++- 29 files changed, 916 insertions(+), 6 deletions(-) create mode 100644 examples/src/25-token-details.ts create mode 100644 examples/src/26-historical-token-price.ts create mode 100644 examples/src/27-pools-activity.ts create mode 100644 examples/src/28-number-of-transactions.ts create mode 100644 examples/src/29-trading-history.ts create mode 100644 examples/src/30-market-details.ts create mode 100644 src/sdk/assets/classes/historical-token-price.ts create mode 100644 src/sdk/assets/classes/historical-token-prices.ts create mode 100644 src/sdk/assets/classes/market-details.ts create mode 100644 src/sdk/assets/classes/number-of-transactions.ts create mode 100644 src/sdk/assets/classes/pools-activities.ts create mode 100644 src/sdk/assets/classes/pools-activity-tokens-in-out.ts create mode 100644 src/sdk/assets/classes/pools-activity.ts create mode 100644 src/sdk/assets/classes/token-details.ts create mode 100644 src/sdk/assets/classes/trading-histories.ts create mode 100644 src/sdk/assets/classes/trading-history.ts create mode 100644 src/sdk/dto/get-historical-token-price.dto.ts create mode 100644 src/sdk/dto/get-pools-activity.dto.ts create mode 100644 src/sdk/dto/get-token-details.dto.ts create mode 100644 src/sdk/dto/get-trading-history.dto.ts diff --git a/examples/package.json b/examples/package.json index 01296beb..e779d8f3 100644 --- a/examples/package.json +++ b/examples/package.json @@ -26,7 +26,13 @@ "18-cross-chain-stream": "../node_modules/.bin/ts-node ./src/18-cross-chain-stream.ts", "21-exchange-rates": "../node_modules/.bin/ts-node ./src/21-exchange-rates.ts", "22-name-resolution": "../node_modules/.bin/ts-node ./src/22-name-resolution.ts", - "24-account-investments": "../node_modules/.bin/ts-node ./src/24-account-investments.ts" + "24-account-investments": "../node_modules/.bin/ts-node ./src/24-account-investments.ts", + "25-token-details": "../node_modules/.bin/ts-node ./src/25-token-details.ts", + "26-historical-token-price" : "../node_modules/.bin/ts-node ./src/26-historical-token-price.ts", + "27-pools-activity" : "../node_modules/.bin/ts-node ./src/27-pools-activity.ts", + "28-number-of-transactions" : "../node_modules/.bin/ts-node ./src/28-number-of-transactions.ts", + "29-trading-history" : "../node_modules/.bin/ts-node ./src/29-trading-history.ts", + "30-market-details" : "../node_modules/.bin/ts-node ./src/30-market-details.ts" }, "dependencies": { "dotenv": "16.0.1" diff --git a/examples/src/25-token-details.ts b/examples/src/25-token-details.ts new file mode 100644 index 00000000..b3338d24 --- /dev/null +++ b/examples/src/25-token-details.ts @@ -0,0 +1,37 @@ +import { EnvNames, NetworkNames, Sdk } from '../../src'; +import { logger } from './common'; + +async function main(): Promise { + const PRIVATE_KEY = ''; //Privite key Example: get from metamask + + const sdk = new Sdk(PRIVATE_KEY, { env: EnvNames.LocalNets, networkName: NetworkNames.Mainnet }); + + const { state } = sdk; + + logger.log('key account', state.account); + + logger.log( + 'contract account', + await sdk.computeContractAccount({ + sync: false, + }), + ); + + await sdk.syncAccount(); + + logger.log('synced contract account', state.account); + logger.log('synced contract account member', state.accountMember); + + logger.log( + 'get token details', + await sdk.getTokenDetails({ + chainId: 1, //Linked chain id + tokenAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7', + provider: '', //specific provider optional + }) + ); +} + +main() + .catch(logger.error) + .finally(() => process.exit()); diff --git a/examples/src/26-historical-token-price.ts b/examples/src/26-historical-token-price.ts new file mode 100644 index 00000000..675bedd2 --- /dev/null +++ b/examples/src/26-historical-token-price.ts @@ -0,0 +1,38 @@ +import { EnvNames, NetworkNames, Sdk } from '../../src'; +import { logger } from './common'; + +async function main(): Promise { + const PRIVATE_KEY = ''; //Privite key Example: get from metamask + + const sdk = new Sdk(PRIVATE_KEY, { env: EnvNames.LocalNets, networkName: NetworkNames.Mainnet }); + + const { state } = sdk; + + logger.log('key account', state.account); + + logger.log( + 'contract account', + await sdk.computeContractAccount({ + sync: false, + }), + ); + + await sdk.syncAccount(); + + logger.log('synced contract account', state.account); + logger.log('synced contract account member', state.accountMember); + + logger.log( + 'get historical token price', + await sdk.getHistoricalTokenPrice({ + chainId: 1, //Linked chain id + tokenAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7', + provider: '', //specific provider optional + timePeriod: '1week', //specific time period optional + }) + ); +} + +main() + .catch(logger.error) + .finally(() => process.exit()); diff --git a/examples/src/27-pools-activity.ts b/examples/src/27-pools-activity.ts new file mode 100644 index 00000000..383119f7 --- /dev/null +++ b/examples/src/27-pools-activity.ts @@ -0,0 +1,39 @@ +import { EnvNames, NetworkNames, Sdk } from '../../src'; +import { logger } from './common'; + +async function main(): Promise { + const PRIVATE_KEY = ''; //Privite key Example: get from metamask + + const sdk = new Sdk(PRIVATE_KEY, { env: EnvNames.LocalNets, networkName: NetworkNames.Mainnet }); + + const { state } = sdk; + + logger.log('key account', state.account); + + logger.log( + 'contract account', + await sdk.computeContractAccount({ + sync: false, + }), + ); + + await sdk.syncAccount(); + + logger.log('synced contract account', state.account); + logger.log('synced contract account member', state.accountMember); + + logger.log( + 'get pools activity of token', + await sdk.getPoolsActivity({ + chainId: 1, //Linked chain id + tokenAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7', + provider: '', //specific provider optional + page: 1, + type: "adds", + }) + ); +} + +main() + .catch(logger.error) + .finally(() => process.exit()); diff --git a/examples/src/28-number-of-transactions.ts b/examples/src/28-number-of-transactions.ts new file mode 100644 index 00000000..7c48c9b7 --- /dev/null +++ b/examples/src/28-number-of-transactions.ts @@ -0,0 +1,37 @@ +import { EnvNames, NetworkNames, Sdk } from '../../src'; +import { logger } from './common'; + +async function main(): Promise { + const PRIVATE_KEY = ''; //Privite key Example: get from metamask + + const sdk = new Sdk(PRIVATE_KEY, { env: EnvNames.LocalNets, networkName: NetworkNames.Mainnet }); + + const { state } = sdk; + + logger.log('key account', state.account); + + logger.log( + 'contract account', + await sdk.computeContractAccount({ + sync: false, + }), + ); + + await sdk.syncAccount(); + + logger.log('synced contract account', state.account); + logger.log('synced contract account member', state.accountMember); + + logger.log( + 'get number of transactions of token', + await sdk.getNumberOfTransactions({ + chainId: 1, //Linked chain id + tokenAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7', + provider: '', //specific provider optional + }) + ); +} + +main() + .catch(logger.error) + .finally(() => process.exit()); diff --git a/examples/src/29-trading-history.ts b/examples/src/29-trading-history.ts new file mode 100644 index 00000000..49f6f3c1 --- /dev/null +++ b/examples/src/29-trading-history.ts @@ -0,0 +1,38 @@ +import { EnvNames, NetworkNames, Sdk } from '../../src'; +import { logger } from './common'; + +async function main(): Promise { + const PRIVATE_KEY = ''; //Privite key Example: get from metamask + + const sdk = new Sdk(PRIVATE_KEY, { env: EnvNames.LocalNets, networkName: NetworkNames.Mainnet }); + + const { state } = sdk; + + logger.log('key account', state.account); + + logger.log( + 'contract account', + await sdk.computeContractAccount({ + sync: false, + }), + ); + + await sdk.syncAccount(); + + logger.log('synced contract account', state.account); + logger.log('synced contract account member', state.accountMember); + + logger.log( + 'get trading history of token', + await sdk.getTradingHistory({ + chainId: 1, //Linked chain id + tokenAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7', + provider: '', //specific provider optional + page: 1, //offset of records optional + }) + ); +} + +main() + .catch(logger.error) + .finally(() => process.exit()); diff --git a/examples/src/30-market-details.ts b/examples/src/30-market-details.ts new file mode 100644 index 00000000..c51e6d6f --- /dev/null +++ b/examples/src/30-market-details.ts @@ -0,0 +1,37 @@ +import { EnvNames, NetworkNames, Sdk } from '../../src'; +import { logger } from './common'; + +async function main(): Promise { + const PRIVATE_KEY = ''; //Privite key Example: get from metamask + + const sdk = new Sdk(PRIVATE_KEY, { env: EnvNames.LocalNets, networkName: NetworkNames.Mainnet }); + + const { state } = sdk; + + logger.log('key account', state.account); + + logger.log( + 'contract account', + await sdk.computeContractAccount({ + sync: false, + }), + ); + + await sdk.syncAccount(); + + logger.log('synced contract account', state.account); + logger.log('synced contract account member', state.accountMember); + + logger.log( + 'get market details of token', + await sdk.getMarketDetails({ + chainId: 1, //Linked chain id + tokenAddress: '0xdAC17F958D2ee523a2206206994597C13D831ec7', + provider: '', //specific provider optional + }) + ); +} + +main() + .catch(logger.error) + .finally(() => process.exit()); diff --git a/package-lock.json b/package-lock.json index e4c9f4f2..35ac622f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "etherspot", - "version": "1.42.9", + "version": "1.43.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "etherspot", - "version": "1.42.9", + "version": "1.43.0", "license": "MIT", "dependencies": { "@apollo/client": "3.4.0", diff --git a/package.json b/package.json index 3211c241..254cd8c2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "etherspot", - "version": "1.42.9", + "version": "1.43.0", "description": "Etherspot SDK", "keywords": [ "ether", diff --git a/schema.graphql b/schema.graphql index 56601168..9f0d36fa 100644 --- a/schema.graphql +++ b/schema.graphql @@ -717,6 +717,12 @@ type Query { gatewayTransaction(chainId: Int, hash: String!): GatewayTransaction getContractAbi(address: String!, chainId: Int): JSONObject isTokenOnTokenList(chainId: Int, name: String, token: String!): Boolean! + tokenDetails(chainId: Int, tokenAddress: String!, provider: String): TokenDetails! + historicalTokenPrice(chainId: Int, tokenAddress: String!, provider: String, timePeriod: String): HistoricalTokenPrices! + poolsActivity(chainId: Int, tokenAddress: String!, provider: String, page: Int, type: String): PoolsActivities! + numberOfTransactions(chainId: Int, tokenAddress: String!, provider: String): NumberOfTransactions! + tradingHistory(chainId: Int, tokenAddress: String!, provider: String, page: Int): TradingHistories! + marketDetails(chainId: Int, tokenAddress: String!, provider: String): MarketDetails! resolveName(chainId: Int, name: String!): NameResolutionsNodes nativeCurrencies: NativeCurrencies! nftList(account: String!, chainId: Int): NftList! @@ -841,6 +847,81 @@ type TokenListToken { symbol: String } +type TokenDetails { + usdPrice: number! + tokenAddress: string! + liquidityUSD: number! + tradingVolume: number! +} + +type HistoricalTokenPrice { + usdPrice: number! + tokenAddress: string! + timestamp: number! +} + +type HistoricalTokenPrices { + items: [HistoricalTokenPrice!]! +} + +type PoolsActivityTokensInOut { + symbol: string! + amm: string! + network: string! + priceUSD: number! + priceETH: number! + amount: number! +} + +type PoolsActivity { + amm: string! + transactionAddress: string! + timestamp: number! + amountUSD: number! + transactionType: string! + tokensIn: [PoolsActivityTokensInOut!]! + tokensOut: [PoolsActivityTokensInOut!]! +} + +type PoolsActivities { + items: [PoolsActivity!]! +} + +type NumberOfTransactions { + totalTransactions: number! +} + +type TradingHistory { + amm: string! + direction: string! + transactionAddress: string! + timestamp: number! + amountUSD: number! + walletAddress: string! + tokensIn: [PoolsActivityTokensInOut!]! + tokensOut: [PoolsActivityTokensInOut!]! +} + +type TradingHistories { + items: [TradingHistory!]! +} + +type MarketDetails { + id: string! + symbol: string! + name: string! + image?: string! + marketCap: number! + allTimeHigh?: number! + allTimeLow?: number! + fullyDilutedValuation: number! + priceChangePercentage1h: number! + priceChangePercentage24h: number! + priceChangePercentage7d: number! + priceChangePercentage1m: number! + priceChangePercentage1y?: number! +} + type TokenLists { items: [TokenListPublic!]! } diff --git a/src/sdk/assets/__mocks__/assets.service.ts b/src/sdk/assets/__mocks__/assets.service.ts index d25394ed..a0da6943 100644 --- a/src/sdk/assets/__mocks__/assets.service.ts +++ b/src/sdk/assets/__mocks__/assets.service.ts @@ -5,4 +5,10 @@ export const AssetsService = mockService({ getTokenListTokens: jest.fn(), getAccountTokenListTokens: jest.fn(), isTokenOnTokenList: jest.fn(), + getTokenDetails: jest.fn(), + getHistoricalTokenPrice: jest.fn(), + getPoolsActivity: jest.fn(), + getNumberOfTransactions: jest.fn(), + getTradingHistory: jest.fn(), + getMarketDetails: jest.fn(), }); diff --git a/src/sdk/assets/assets.service.ts b/src/sdk/assets/assets.service.ts index a064620f..8881c193 100644 --- a/src/sdk/assets/assets.service.ts +++ b/src/sdk/assets/assets.service.ts @@ -1,6 +1,6 @@ import { gql } from '@apollo/client/core'; import { Service } from '../common'; -import { TokenList, TokenLists, TokenListToken } from './classes'; +import { HistoricalTokenPrices, MarketDetails, NumberOfTransactions, PoolsActivities, TokenDetails, TokenList, TokenLists, TokenListToken, TradingHistories } from './classes'; import { NativeCurrencies } from './classes/native-currencies'; import { NativeCurrenciesItem } from './classes/native-currencies-item'; @@ -154,4 +154,245 @@ export class AssetsService extends Service { return result; } + + async getTokenDetails(tokenAddress: string, ChainId: number, provider?: string): Promise { + const { apiService } = this.services; + + const { result } = await apiService.query<{ + result: TokenDetails; + }>( + gql` + query($ChainId: Int, $tokenAddress: String!, $provider: String) { + result: tokenDetails(chainId: $ChainId, tokenAddress: $tokenAddress, provider: $provider) { + tokenAddress + usdPrice + liquidityUSD + tradingVolume + } + } + `, + { + variables: { + ChainId, + tokenAddress, + provider + }, + models: { + result: TokenDetails, + }, + }, + ); + + return result; + } + + async getHistoricalTokenPrice(tokenAddress: string, ChainId: number, provider?: string, timePeriod?: string) + : Promise { + const { apiService } = this.services; + + const { result } = await apiService.query<{ + result: HistoricalTokenPrices; + }>( + gql` + query($ChainId: Int, $tokenAddress: String!, $provider: String, $timePeriod: String) { + result: historicalTokenPrice(chainId: $ChainId, tokenAddress: $tokenAddress, provider: $provider, timePeriod: $timePeriod) { + items { + tokenAddress + usdPrice + timestamp + } + } + } + `, + { + variables: { + ChainId, + tokenAddress, + provider, + timePeriod, + }, + models: { + result: HistoricalTokenPrices, + }, + }, + ); + + return result; + } + + async getPoolsActivity(tokenAddress: string, ChainId: number, provider?: string, page?: number, type?: string) + : Promise { + const { apiService } = this.services; + + const { result } = await apiService.query<{ + result: PoolsActivities; + }>( + gql` + query($ChainId: Int, $tokenAddress: String!, $provider: String, $page: Int, $type: String) { + result: poolsActivity(chainId: $ChainId, tokenAddress: $tokenAddress, provider: $provider, page: $page, type: $type) { + items { + amm + transactionAddress + timestamp + amountUSD + transactionType + tokensIn { + symbol + amm + network + priceUSD + priceETH + amount + } + tokensOut { + symbol + amm + network + priceUSD + priceETH + amount + } + } + } + } + `, + { + variables: { + ChainId, + tokenAddress, + provider, + page, + type, + }, + models: { + result: PoolsActivities, + }, + }, + ); + + return result; + } + + async getNumberOfTransactions(tokenAddress: string, ChainId: number, provider?: string) + : Promise { + const { apiService } = this.services; + + const { result } = await apiService.query<{ + result: NumberOfTransactions; + }>( + gql` + query($ChainId: Int, $tokenAddress: String!, $provider: String) { + result: numberOfTransactions(chainId: $ChainId, tokenAddress: $tokenAddress, provider: $provider) { + totalTransactions + } + } + `, + { + variables: { + ChainId, + tokenAddress, + provider, + }, + models: { + result: NumberOfTransactions, + }, + }, + ); + + return result; + } + + async getTradingHistory(tokenAddress: string, ChainId: number, provider?: string, page?: number) + : Promise { + const { apiService } = this.services; + + const { result } = await apiService.query<{ + result: TradingHistories; + }>( + gql` + query($ChainId: Int, $tokenAddress: String!, $provider: String, $page: Int) { + result: tradingHistory(chainId: $ChainId, tokenAddress: $tokenAddress, provider: $provider, page: $page) { + items { + amm + transactionAddress + direction + timestamp + amountUSD + walletAddress + tokensIn { + symbol + amm + network + priceUSD + priceETH + amount + } + tokensOut { + symbol + amm + network + priceUSD + priceETH + amount + } + } + } + } + `, + { + variables: { + ChainId, + tokenAddress, + provider, + page, + }, + models: { + result: TradingHistories, + }, + }, + ); + + return result; + } + + async getMarketDetails(tokenAddress: string, ChainId: number, provider?: string) + : Promise { + const { apiService } = this.services; + + const { result } = await apiService.query<{ + result: MarketDetails; + }>( + gql` + query($ChainId: Int, $tokenAddress: String!, $provider: String) { + result: marketDetails(chainId: $ChainId, tokenAddress: $tokenAddress, provider: $provider) { + id + symbol + name + image + marketCap + allTimeHigh + allTimeLow + fullyDilutedValuation + priceChangePercentage1h + priceChangePercentage24h + priceChangePercentage7d + priceChangePercentage1m + priceChangePercentage1y + } + } + `, + { + variables: { + ChainId, + tokenAddress, + provider, + }, + models: { + result: MarketDetails, + }, + }, + ); + + return result; + } } diff --git a/src/sdk/assets/classes/historical-token-price.ts b/src/sdk/assets/classes/historical-token-price.ts new file mode 100644 index 00000000..d3d88c3e --- /dev/null +++ b/src/sdk/assets/classes/historical-token-price.ts @@ -0,0 +1,7 @@ +export class HistoricalTokenPrice { + usdPrice: number; + + tokenAddress: string; + + timestamp: number; +} diff --git a/src/sdk/assets/classes/historical-token-prices.ts b/src/sdk/assets/classes/historical-token-prices.ts new file mode 100644 index 00000000..804fa24f --- /dev/null +++ b/src/sdk/assets/classes/historical-token-prices.ts @@ -0,0 +1,7 @@ +import { Type } from 'class-transformer'; +import { HistoricalTokenPrice } from './historical-token-price'; + +export class HistoricalTokenPrices { + @Type(() => HistoricalTokenPrice) + items: HistoricalTokenPrice[]; +} diff --git a/src/sdk/assets/classes/index.ts b/src/sdk/assets/classes/index.ts index 11ece843..8c1cad3e 100644 --- a/src/sdk/assets/classes/index.ts +++ b/src/sdk/assets/classes/index.ts @@ -5,3 +5,13 @@ export * from './token-list-tokens'; export * from './token-lists'; export * from './native-currencies'; export * from './native-currencies-item'; +export * from './token-details'; +export * from './historical-token-price'; +export * from './historical-token-prices'; +export * from './pools-activity-tokens-in-out'; +export * from './pools-activity'; +export * from './pools-activities'; +export * from './number-of-transactions'; +export * from './trading-history'; +export * from './trading-histories'; +export * from './market-details'; \ No newline at end of file diff --git a/src/sdk/assets/classes/market-details.ts b/src/sdk/assets/classes/market-details.ts new file mode 100644 index 00000000..5082d7ad --- /dev/null +++ b/src/sdk/assets/classes/market-details.ts @@ -0,0 +1,27 @@ +export class MarketDetails { + id: string; + + symbol: string; + + name: string; + + image?: string; + + marketCap: number; + + allTimeHigh?: number; + + allTimeLow?: number; + + fullyDilutedValuation: number; + + priceChangePercentage1h: number; + + priceChangePercentage24h: number; + + priceChangePercentage7d: number; + + priceChangePercentage1m: number; + + priceChangePercentage1y?: number; +} \ No newline at end of file diff --git a/src/sdk/assets/classes/number-of-transactions.ts b/src/sdk/assets/classes/number-of-transactions.ts new file mode 100644 index 00000000..042a17c1 --- /dev/null +++ b/src/sdk/assets/classes/number-of-transactions.ts @@ -0,0 +1,3 @@ +export class NumberOfTransactions { + totalTransactions: number; +} diff --git a/src/sdk/assets/classes/pools-activities.ts b/src/sdk/assets/classes/pools-activities.ts new file mode 100644 index 00000000..448edfd6 --- /dev/null +++ b/src/sdk/assets/classes/pools-activities.ts @@ -0,0 +1,7 @@ +import { Type } from 'class-transformer'; +import { PoolsActivity } from './pools-activity'; + +export class PoolsActivities { + @Type(() => PoolsActivity) + items: PoolsActivity[]; +} diff --git a/src/sdk/assets/classes/pools-activity-tokens-in-out.ts b/src/sdk/assets/classes/pools-activity-tokens-in-out.ts new file mode 100644 index 00000000..adc7f3cb --- /dev/null +++ b/src/sdk/assets/classes/pools-activity-tokens-in-out.ts @@ -0,0 +1,13 @@ +export class PoolsActivityTokensInOut { + symbol: string; + + amm: string; + + network: string; + + priceUSD: number; + + priceETH: number; + + amount: number; +} diff --git a/src/sdk/assets/classes/pools-activity.ts b/src/sdk/assets/classes/pools-activity.ts new file mode 100644 index 00000000..9db1941f --- /dev/null +++ b/src/sdk/assets/classes/pools-activity.ts @@ -0,0 +1,20 @@ +import { Type } from 'class-transformer'; +import { PoolsActivityTokensInOut } from './pools-activity-tokens-in-out'; + +export class PoolsActivity { + amm: string; + + transactionAddress: string; + + timestamp: number; + + amountUSD: number; + + transactionType: string; + + @Type(() => PoolsActivityTokensInOut) + tokensIn: PoolsActivityTokensInOut[]; + + @Type(() => PoolsActivityTokensInOut) + tokensOut: PoolsActivityTokensInOut[]; +} diff --git a/src/sdk/assets/classes/token-details.ts b/src/sdk/assets/classes/token-details.ts new file mode 100644 index 00000000..5c8ce9ae --- /dev/null +++ b/src/sdk/assets/classes/token-details.ts @@ -0,0 +1,9 @@ +export class TokenDetails { + tokenAddress: string; + + usdPrice: number; + + liquidityUSD: number; + + tradingVolume: number; +} diff --git a/src/sdk/assets/classes/trading-histories.ts b/src/sdk/assets/classes/trading-histories.ts new file mode 100644 index 00000000..79a4427f --- /dev/null +++ b/src/sdk/assets/classes/trading-histories.ts @@ -0,0 +1,7 @@ +import { Type } from 'class-transformer'; +import { TradingHistory } from './trading-history'; + +export class TradingHistories { + @Type(() => TradingHistory) + items: TradingHistory[]; +} \ No newline at end of file diff --git a/src/sdk/assets/classes/trading-history.ts b/src/sdk/assets/classes/trading-history.ts new file mode 100644 index 00000000..741c12b3 --- /dev/null +++ b/src/sdk/assets/classes/trading-history.ts @@ -0,0 +1,22 @@ +import { Type } from 'class-transformer'; +import { PoolsActivityTokensInOut } from './pools-activity-tokens-in-out'; + +export class TradingHistory { + amm: string; + + direction: string; + + transactionAddress: string; + + timestamp: number; + + amountUSD: number; + + walletAddress: string; + + @Type(() => PoolsActivityTokensInOut) + tokensIn: PoolsActivityTokensInOut[]; + + @Type(() => PoolsActivityTokensInOut) + tokensOut: PoolsActivityTokensInOut[]; +} diff --git a/src/sdk/dto/get-historical-token-price.dto.ts b/src/sdk/dto/get-historical-token-price.dto.ts new file mode 100644 index 00000000..3e881a00 --- /dev/null +++ b/src/sdk/dto/get-historical-token-price.dto.ts @@ -0,0 +1,20 @@ +import { IsOptional, IsPositive, IsString } from 'class-validator'; +import { IsAddress } from './validators'; + +export class GetHistoricalTokenPriceDto { + @IsOptional() + @IsAddress() + tokenAddress?: string = null; + + @IsOptional() + @IsPositive() + chainId?: number; + + @IsOptional() + @IsString() + provider?: string = null; + + @IsOptional() + @IsString() + timePeriod?: string; +} diff --git a/src/sdk/dto/get-pools-activity.dto.ts b/src/sdk/dto/get-pools-activity.dto.ts new file mode 100644 index 00000000..8d284cf0 --- /dev/null +++ b/src/sdk/dto/get-pools-activity.dto.ts @@ -0,0 +1,24 @@ +import { IsOptional, IsPositive, IsString } from 'class-validator'; +import { IsAddress } from './validators'; + +export class GetPoolsActivityDto { + @IsOptional() + @IsAddress() + tokenAddress?: string = null; + + @IsOptional() + @IsPositive() + chainId?: number; + + @IsOptional() + @IsString() + provider?: string = null; + + @IsOptional() + @IsPositive() + page?: number; + + @IsOptional() + @IsString() + type?: string = "all"; +} diff --git a/src/sdk/dto/get-token-details.dto.ts b/src/sdk/dto/get-token-details.dto.ts new file mode 100644 index 00000000..62d42420 --- /dev/null +++ b/src/sdk/dto/get-token-details.dto.ts @@ -0,0 +1,16 @@ +import { IsOptional, IsPositive, IsString } from 'class-validator'; +import { IsAddress } from './validators'; + +export class GetTokenDetailsDto { + @IsOptional() + @IsAddress() + tokenAddress?: string = null; + + @IsOptional() + @IsPositive() + chainId?: number; + + @IsOptional() + @IsString() + provider?: string = null; +} diff --git a/src/sdk/dto/get-trading-history.dto.ts b/src/sdk/dto/get-trading-history.dto.ts new file mode 100644 index 00000000..6ed76e3f --- /dev/null +++ b/src/sdk/dto/get-trading-history.dto.ts @@ -0,0 +1,20 @@ +import { IsOptional, IsPositive, IsString } from 'class-validator'; +import { IsAddress } from './validators'; + +export class GetTradingHistoryDto { + @IsOptional() + @IsAddress() + tokenAddress?: string = null; + + @IsOptional() + @IsPositive() + chainId?: number; + + @IsOptional() + @IsString() + provider?: string = null; + + @IsOptional() + @IsPositive() + page?: number; +} diff --git a/src/sdk/dto/index.ts b/src/sdk/dto/index.ts index 1d98df65..b84e27ea 100644 --- a/src/sdk/dto/index.ts +++ b/src/sdk/dto/index.ts @@ -78,3 +78,7 @@ export * from './get-step-transactions-lifi.dto'; export * from './name-resolution-node.dto'; export * from './get-LiFi-status.dto'; export * from './get-account-investments.dto'; +export * from './get-token-details.dto'; +export * from './get-historical-token-price.dto'; +export * from './get-pools-activity.dto'; +export * from './get-trading-history.dto'; diff --git a/src/sdk/sdk.ts b/src/sdk/sdk.ts index 0d36dca9..06c27937 100644 --- a/src/sdk/sdk.ts +++ b/src/sdk/sdk.ts @@ -13,7 +13,7 @@ import { AccountTypes, } from './account'; import { ApiService } from './api'; -import { AssetsService, NativeCurrenciesItem, PaginatedTokens, TokenList, TokenListToken } from './assets'; +import { AssetsService, HistoricalTokenPrices, MarketDetails, NativeCurrenciesItem, NumberOfTransactions, PaginatedTokens, PoolsActivities, TokenDetails, TokenList, TokenListToken, TradingHistories } from './assets'; import { BlockService } from './block'; import { addressesEqual, ErrorSubject, Exception, TransactionRequest } from './common'; import { Context } from './context'; @@ -112,6 +112,10 @@ import { NameResolutionNodeDto, GetLiFiStatusDto, GetAccountInvestmentsDto, + GetTokenDetailsDto, + GetHistoricalTokenPriceDto, + GetPoolsActivityDto, + GetTradingHistoryDto, } from './dto'; import { ENSNode, ENSNodeStates, ENSRootNode, ENSService, parseENSName } from './ens'; import { Env, EnvNames } from './env'; @@ -2162,6 +2166,136 @@ export class Sdk { return this.services.assetsService.isTokenOnTokenList(token, name); } + /** + * gets token details + * @param dto + * @return Promise + */ + async getTokenDetails(dto: GetTokenDetailsDto = {}): Promise { + const { tokenAddress, chainId, provider } = await validateDto(dto, GetTokenDetailsDto, { + addressKeys: ['tokenAddress'], + }); + + await this.require({ + wallet: !tokenAddress, + }); + + return this.services.assetsService.getTokenDetails( + this.prepareAccountAddress(tokenAddress), // + chainId || this.services.networkService.chainId, + provider, + ); + } + + /** + * gets historical token price + * @param dto + * @return Promise + */ + async getHistoricalTokenPrice(dto: GetHistoricalTokenPriceDto = {}): Promise { + const { tokenAddress, chainId, provider, timePeriod } = await validateDto(dto, GetHistoricalTokenPriceDto, { + addressKeys: ['tokenAddress'], + }); + + await this.require({ + wallet: !tokenAddress, + }); + + return this.services.assetsService.getHistoricalTokenPrice( + this.prepareAccountAddress(tokenAddress), // + chainId || this.services.networkService.chainId, + provider, + timePeriod, + ); + } + + /** + * gets pools activity of token + * @param dto + * @return Promise + */ + async getPoolsActivity(dto: GetPoolsActivityDto = {}): Promise { + const { tokenAddress, chainId, provider, page, type } = await validateDto(dto, GetPoolsActivityDto, { + addressKeys: ['tokenAddress'], + }); + + await this.require({ + wallet: !tokenAddress, + }); + + return this.services.assetsService.getPoolsActivity( + this.prepareAccountAddress(tokenAddress), // + chainId || this.services.networkService.chainId, + provider, + page, + type, + ); + } + + /** + * gets number df transactions of token + * @param dto + * @return Promise + */ + async getNumberOfTransactions(dto: GetTokenDetailsDto = {}): Promise { + const { tokenAddress, chainId, provider } = await validateDto(dto, GetTokenDetailsDto, { + addressKeys: ['tokenAddress'], + }); + + await this.require({ + wallet: !tokenAddress, + }); + + return this.services.assetsService.getNumberOfTransactions( + this.prepareAccountAddress(tokenAddress), // + chainId || this.services.networkService.chainId, + provider, + ); + } + + /** + * gets trading history of token + * @param dto + * @return Promise + */ + async getTradingHistory(dto: GetTradingHistoryDto = {}): Promise { + const { tokenAddress, chainId, provider, page } = await validateDto(dto, GetPoolsActivityDto, { + addressKeys: ['tokenAddress'], + }); + + await this.require({ + wallet: !tokenAddress, + }); + + return this.services.assetsService.getTradingHistory( + this.prepareAccountAddress(tokenAddress), // + chainId || this.services.networkService.chainId, + provider, + page, + ); + } + + /** + * gets market details of token + * @param dto + * @return Promise + */ + async getMarketDetails(dto: GetTokenDetailsDto = {}): Promise { + const { tokenAddress, chainId, provider } = await validateDto(dto, GetTokenDetailsDto, { + addressKeys: ['tokenAddress'], + }); + + await this.require({ + wallet: !tokenAddress, + }); + + return this.services.assetsService.getMarketDetails( + this.prepareAccountAddress(tokenAddress), // + chainId || this.services.networkService.chainId, + provider, + ); + } + // transactions /**