From 9263e1d6227bf4290aaa79727e88f00465367203 Mon Sep 17 00:00:00 2001 From: kaushalrajbacancy Date: Mon, 1 Apr 2024 18:46:18 +0530 Subject: [PATCH 1/2] Add getExchangeOffers endpoint --- CHANGELOG.md | 5 ++++ examples/09-exchange.ts | 22 +++++++++++++++-- package-lock.json | 4 +-- package.json | 2 +- src/sdk/api/constants.ts | 1 + src/sdk/data/classes/transactions.ts | 10 ++++---- src/sdk/data/data.module.ts | 34 +++++++++++++++++++++++++- src/sdk/dataUtils.ts | 29 ++++++++++++++++++++-- src/sdk/dto/get-exchange-offers.dto.ts | 1 - 9 files changed, 94 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9d583fe..e343520 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,9 @@ # Changelog + +## [1.6.5] - 2024-04-01 +### New +- Added `getExchangeOffers` endpoint into DataUtils + ## [1.6.4] - 2024-03-20 ### New - Added `getTransactions` endpoint into DataUtils diff --git a/examples/09-exchange.ts b/examples/09-exchange.ts index f1781ed..797ccab 100644 --- a/examples/09-exchange.ts +++ b/examples/09-exchange.ts @@ -1,13 +1,31 @@ +import { BigNumber, constants } from 'ethers'; import { DataUtils } from '../src'; import * as dotenv from 'dotenv'; dotenv.config(); +const dataApiKey = ''; async function main(): Promise { // initializating Data service... - const dataService = new DataUtils(); - const exchangeSupportedAssets = await dataService.getExchangeSupportedAssets({ page: 1, limit: 100, account: '', chainId: Number(process.env.CHAIN_ID) }); + const dataService = new DataUtils(dataApiKey); + const exchangeSupportedAssets = await dataService.getExchangeSupportedAssets({ page: 1, limit: 100, account: '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045', chainId: Number(process.env.CHAIN_ID) }); console.log('\x1b[33m%s\x1b[0m', `Found exchange supported assets:`, exchangeSupportedAssets.items.length); + + const fromChainId = 1; + const fromAddress = '0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045'; + const fromTokenAddress = constants.AddressZero; + const toTokenAddress = '0xe3818504c1b32bf1557b16c238b2e01fd3149c17'; + const fromAmount = '1000000000000000000'; + + const offers = await dataService.getExchangeOffers({ + fromAddress, + fromChainId, + fromTokenAddress, + toTokenAddress, + fromAmount: BigNumber.from(fromAmount), + }); + + console.log('\x1b[33m%s\x1b[0m', `Exchange offers:`, offers); } main() diff --git a/package-lock.json b/package-lock.json index 93dcaee..36451c9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@etherspot/prime-sdk", - "version": "1.6.4", + "version": "1.6.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@etherspot/prime-sdk", - "version": "1.6.4", + "version": "1.6.5", "license": "MIT", "dependencies": { "@apollo/client": "3.8.7", diff --git a/package.json b/package.json index 051863e..5b0f4d2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@etherspot/prime-sdk", - "version": "1.6.4", + "version": "1.6.5", "description": "Etherspot Prime (Account Abstraction) SDK", "keywords": [ "ether", diff --git a/src/sdk/api/constants.ts b/src/sdk/api/constants.ts index b950b96..a4230c6 100644 --- a/src/sdk/api/constants.ts +++ b/src/sdk/api/constants.ts @@ -18,6 +18,7 @@ export const API_ENDPOINTS = { GET_TRANSACTIONS: 'transactions', GET_ADVANCE_ROUTES_LIFI: 'exchange/getAdvanceRoutesLiFi', GET_STEP_TRANSACTIONS: 'exchange/getStepTransactions', + GET_EXCHANGE_OFFERS: 'exchange/offers', GET_EXCHANGE_SUPPORTED_ASSETS: 'assets/exchangeSupportedAssets', GET_TOKEN_LISTS: 'assets/tokenLists', GET_TOKEN_LIST_TOKENS: 'assets/tokenListTokens', diff --git a/src/sdk/data/classes/transactions.ts b/src/sdk/data/classes/transactions.ts index 8fddb3b..e0a22e4 100644 --- a/src/sdk/data/classes/transactions.ts +++ b/src/sdk/data/classes/transactions.ts @@ -2,14 +2,14 @@ import { BigNumber } from 'ethers'; import { TransactionStatuses } from '../constants'; export class Transactions { - transactions: UserOpsTransaction[]; + transactions: UserOpTransaction[]; pageInfo?: { currentPage: number; limit: number; }; } -class UserOpsTransaction { +export class UserOpTransaction { chainId: number; sender: string; target?: string | null; @@ -41,7 +41,7 @@ class UserOpsTransaction { nftTransfers?: NFTTransfersEntity[]; } -class Erc20TransfersEntity { +export class Erc20TransfersEntity { from: string; to: string; value: number; @@ -50,7 +50,7 @@ class Erc20TransfersEntity { decimal: number; } -class NativeTransfersEntity { +export class NativeTransfersEntity { from: string; to: string; value: string; @@ -60,7 +60,7 @@ class NativeTransfersEntity { data: string; } -class NFTTransfersEntity { +export class NFTTransfersEntity { from: string; to: string; value: number; diff --git a/src/sdk/data/data.module.ts b/src/sdk/data/data.module.ts index 2a4e3d7..40acb3c 100644 --- a/src/sdk/data/data.module.ts +++ b/src/sdk/data/data.module.ts @@ -1,7 +1,7 @@ import { BigNumber } from 'ethers'; import { Route } from '@lifi/sdk'; import { ObjectSubject } from '../common'; -import { AccountBalances, AdvanceRoutesLiFi, NftList, PaginatedTokens, RateData, StepTransactions, TokenList, TokenListToken, Transaction, Transactions } from './classes'; +import { AccountBalances, AdvanceRoutesLiFi, ExchangeOffer, NftList, PaginatedTokens, RateData, StepTransactions, TokenList, TokenListToken, Transaction, Transactions } from './classes'; import { RestApiService } from '../api'; import { API_ENDPOINTS, MethodTypes } from '../api/constants'; @@ -171,6 +171,38 @@ export class DataModule { } } + async getExchangeOffers( + fromTokenAddress: string, + toTokenAddress: string, + fromAmount: BigNumber, + fromChainId: number, + fromAddress: string, + toAddress?: string, + showZeroUsd?: boolean + ): Promise { + const account = fromAddress; + + try { + const queryParams = { + 'api-key': this.currentApi, + account, + fromTokenAddress, + toTokenAddress, + fromAmount: fromAmount.toString(), + chainId: fromChainId, + fromAddress, + toAddress, + showZeroUsd, + }; + + const result = await this.apiService.makeRequest(API_ENDPOINTS.GET_EXCHANGE_OFFERS, MethodTypes.GET, queryParams); + + return result ? result.items : null; + } catch (error) { + throw new Error(error.message || 'Failed to get exchange offers'); + } + } + async getTokenLists(chainId: number): Promise { try { const queryParams = { diff --git a/src/sdk/dataUtils.ts b/src/sdk/dataUtils.ts index 78df867..9cc6cf7 100644 --- a/src/sdk/dataUtils.ts +++ b/src/sdk/dataUtils.ts @@ -1,6 +1,6 @@ import "reflect-metadata"; -import { AccountBalances, AdvanceRoutesLiFi, DataModule, NftList, PaginatedTokens, RateData, StepTransactions, TokenList, TokenListToken, Transaction, Transactions } from "./data"; -import { FetchExchangeRatesDto, GetAccountBalancesDto, GetAdvanceRoutesLiFiDto, GetExchangeSupportedAssetsDto, GetNftListDto, GetStepTransactionsLiFiDto, GetTokenListDto, GetTokenListsDto, GetTransactionDto, GetTransactionsDto, validateDto } from "./dto"; +import { AccountBalances, AdvanceRoutesLiFi, DataModule, ExchangeOffer, NftList, PaginatedTokens, RateData, StepTransactions, TokenList, TokenListToken, Transaction, Transactions } from "./data"; +import { FetchExchangeRatesDto, GetAccountBalancesDto, GetAdvanceRoutesLiFiDto, GetExchangeOffersDto, GetExchangeSupportedAssetsDto, GetNftListDto, GetStepTransactionsLiFiDto, GetTokenListDto, GetTokenListsDto, GetTransactionDto, GetTransactionsDto, validateDto } from "./dto"; import { BigNumber } from "ethers"; export class DataUtils { @@ -137,6 +137,31 @@ export class DataUtils { return this.dataModule.getExchangeSupportedAssets(page, limit, chainId, account); } + /** + * gets exchange offers + * @param dto + * @return Promise + */ + async getExchangeOffers(dto: GetExchangeOffersDto): Promise { + const { fromTokenAddress, toTokenAddress, fromAmount, fromChainId, showZeroUsd, fromAddress } = await validateDto(dto, GetExchangeOffersDto, { + addressKeys: ['fromTokenAddress', 'toTokenAddress', 'fromAddress'], + }); + + let { toAddress } = dto; + + if (!toAddress) toAddress = fromAddress; + + return this.dataModule.getExchangeOffers( + fromTokenAddress, + toTokenAddress, + BigNumber.from(fromAmount), + fromChainId, + fromAddress, + toAddress, + showZeroUsd, + ); + } + /** * gets token lists * @param dto diff --git a/src/sdk/dto/get-exchange-offers.dto.ts b/src/sdk/dto/get-exchange-offers.dto.ts index d5da4bf..224ecc2 100644 --- a/src/sdk/dto/get-exchange-offers.dto.ts +++ b/src/sdk/dto/get-exchange-offers.dto.ts @@ -26,5 +26,4 @@ export class GetExchangeOffersDto { @IsOptional() @IsBoolean() showZeroUsd?: boolean; - } From 1711a8830810b26b5731db725cffff09b304804d Mon Sep 17 00:00:00 2001 From: kaushalrajbacancy Date: Mon, 1 Apr 2024 19:11:16 +0530 Subject: [PATCH 2/2] Changes as per comments --- CHANGELOG.md | 4 +++- package-lock.json | 4 ++-- package.json | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e343520..a24a321 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,10 @@ # Changelog -## [1.6.5] - 2024-04-01 +## [1.7.0] - 2024-04-01 ### New - Added `getExchangeOffers` endpoint into DataUtils +### Breaking changes +- The type name `UserOpsTransaction` has been changed to `UserOpTransaction` ## [1.6.4] - 2024-03-20 ### New diff --git a/package-lock.json b/package-lock.json index 36451c9..723c812 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@etherspot/prime-sdk", - "version": "1.6.5", + "version": "1.7.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@etherspot/prime-sdk", - "version": "1.6.5", + "version": "1.7.0", "license": "MIT", "dependencies": { "@apollo/client": "3.8.7", diff --git a/package.json b/package.json index 5b0f4d2..f0bd047 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@etherspot/prime-sdk", - "version": "1.6.5", + "version": "1.7.0", "description": "Etherspot Prime (Account Abstraction) SDK", "keywords": [ "ether",