UNPKG

@velora-dex/sdk

Version:
376 lines (331 loc) 9.92 kB
import { constructPartialSDK, SDKConfig } from './partial'; import { GetAdaptersFunctions, constructGetAdapters, } from '../methods/swap/adapters'; import { GetBalancesFunctions, constructGetBalances, } from '../methods/swap/balance'; import { GetRateFunctions, constructGetRate } from '../methods/swap/rates'; import { GetSpenderFunctions, constructGetSpender, } from '../methods/swap/spender'; import { GetTokensFunctions, constructGetTokens } from '../methods/swap/token'; import { BuildTxFunctions, constructBuildTx, } from '../methods/swap/transaction'; import { constructSwapTx, GetSwapTxFunctions } from '../methods/swap/swapTx'; import { constructAxiosFetcher, constructFetchFetcher, constructEthersV5ContractCaller, constructEthersV6ContractCaller, constructWeb3ContractCaller, constructViemContractCaller, } from '../helpers'; import type { ConstructBaseInput, ConstructFetchInput, ContractCallerFunctions, TransactionContractCallerFn, TxHash, Address, FetcherFunction, ExtraFetchParams, } from '../types'; import type { EthersProviderDeps, MinViemClient } from '../helpers'; import type Web3 from 'web3'; import type { SwapSDKMethods } from '../methods/swap'; import { BuildOTCOrderFunctions, constructBuildOTCOrder, } from '../methods/otcOrders/buildOrder'; import { constructPostOTCOrder, PostOTCOrderFunctions, } from '../methods/otcOrders/postOrder'; import { constructGetOTCOrders, GetOTCOrdersFunctions, } from '../methods/otcOrders/getOrders'; import { constructGetOTCOrdersContract, GetOTCOrdersContractFunctions, } from '../methods/otcOrders/getOrdersContract'; import { constructBuildOTCOrderTx, BuildOTCOrdersTxFunctions, } from '../methods/otcOrders/transaction'; import { constructAllOTCOrdersHandlers, OTCOrderHandlers, } from '../methods/otcOrders'; import { constructSwapSDK } from '../methods/swap'; import type { AxiosRequirement } from '../helpers/fetchers/axios'; import { API_URL, DEFAULT_VERSION } from '../constants'; import { constructAllDeltaOrdersHandlers, DeltaOrderHandlers, } from '../methods/delta'; import { BuildDeltaOrderFunctions, constructBuildDeltaOrder, } from '../methods/delta/buildDeltaOrder'; import { constructGetDeltaOrders, GetDeltaOrdersFunctions, } from '../methods/delta/getDeltaOrders'; import { constructGetDeltaPrice, GetDeltaPriceFunctions, } from '../methods/delta/getDeltaPrice'; import { constructGetDeltaContract, GetDeltaContractFunctions, } from '../methods/delta/getDeltaContract'; import { constructGetPartnerFee, GetPartnerFeeFunctions, } from '../methods/delta/getPartnerFee'; import { constructPostDeltaOrder, PostDeltaOrderFunctions, } from '../methods/delta/postDeltaOrder'; import { constructGetQuote, GetQuoteFunctions, } from '../methods/quote/getQuote'; import { constructGetBridgeRoutes, GetBridgeRoutesFunctions, } from '../methods/delta/getBridgeRoutes'; import { constructIsTokenSupportedInDelta, IsTokenSupportedInDeltaFunctions, } from '../methods/delta/isTokenSupportedInDelta'; export type SwapFetchMethods = GetBalancesFunctions & GetTokensFunctions & GetSpenderFunctions & BuildTxFunctions & GetAdaptersFunctions & GetRateFunctions & GetSwapTxFunctions; export type OTCOrdersFetchMethods = GetOTCOrdersContractFunctions & GetOTCOrdersFunctions & BuildOTCOrderFunctions & PostOTCOrderFunctions & BuildOTCOrdersTxFunctions; export type DeltaFetchMethods = BuildDeltaOrderFunctions & GetDeltaOrdersFunctions & GetDeltaPriceFunctions & GetDeltaContractFunctions & GetPartnerFeeFunctions & GetBridgeRoutesFunctions & IsTokenSupportedInDeltaFunctions & PostDeltaOrderFunctions; export type SimpleFetchSDK = { swap: SwapFetchMethods; otcOrders: OTCOrdersFetchMethods; delta: DeltaFetchMethods; quote: QuoteFetchMethods; } & Required<ConstructBaseInput>; export type QuoteFetchMethods = GetQuoteFunctions; export type SimpleSDK = { swap: SwapSDKMethods<TxHash>; otcOrders: OTCOrderHandlers<TxHash>; delta: DeltaOrderHandlers<TxHash>; quote: QuoteFetchMethods; } & Required<ConstructBaseInput>; export type FetcherOptions = ( | { axios: AxiosRequirement; } | { fetch: typeof fetch } | { fetcher: FetcherFunction } ) & ExtraFetchParams; type SimpleOptions = ConstructBaseInput & FetcherOptions; export type ProviderOptions = ( | EthersProviderDeps | { web3: Web3 } | { viemClient: MinViemClient } ) & { account: Address; }; const constructFetcher = (options: FetcherOptions): FetcherFunction => { if ('axios' in options) { return constructAxiosFetcher(options.axios, options); } if ('fetch' in options) { return constructFetchFetcher(options.fetch, options); } return (params) => { // adding apiKey to headers if it's provided const headers = options?.apiKey ? { ...options.headers, 'X-API-KEY': options.apiKey, ...params.headers, ...params.requestParams?.headers, } : { ...options.headers, ...params.headers, ...params.requestParams?.headers, }; return options.fetcher({ ...params, headers }); }; }; /** @description construct SDK with methods that fetch from API and optionally with blockchain provider calling methods */ export function constructSimpleSDK(options: SimpleOptions): SimpleFetchSDK; export function constructSimpleSDK( options: SimpleOptions, providerOptions: ProviderOptions ): SimpleSDK; export function constructSimpleSDK( options: SimpleOptions, providerOptions?: ProviderOptions ): SimpleFetchSDK | SimpleSDK { const fetcher = constructFetcher(options); if (!providerOptions) { const config: ConstructFetchInput = { apiURL: options.apiURL, chainId: options.chainId, version: options.version, fetcher, }; // include all available functions that don't need `contractCaller` const swap: SwapFetchMethods = constructPartialSDK( config, constructGetBalances, constructGetTokens, constructGetSpender, constructBuildTx, constructGetAdapters, constructGetRate, constructSwapTx ); const otcOrders = constructPartialSDK( config, constructBuildOTCOrder, constructPostOTCOrder, constructGetOTCOrders, constructGetOTCOrdersContract, constructBuildOTCOrderTx ); const delta = constructPartialSDK( config, constructBuildDeltaOrder, constructPostDeltaOrder, constructGetDeltaOrders, constructGetDeltaPrice, constructGetDeltaContract, constructGetPartnerFee, constructGetBridgeRoutes, constructIsTokenSupportedInDelta ); const quote = constructPartialSDK(config, constructGetQuote); return { swap, otcOrders, delta, quote, apiURL: options.apiURL ?? API_URL, chainId: options.chainId, version: options.version ?? DEFAULT_VERSION, }; } const contractCaller = constructSimpleContractCaller(providerOptions); const config: SDKConfig<TxHash> = { apiURL: options.apiURL, version: options.version, chainId: options.chainId, fetcher, contractCaller, }; const swap: SwapSDKMethods<TxHash> = constructSwapSDK(config); const otcOrders: OTCOrderHandlers<TxHash> = constructAllOTCOrdersHandlers<TxHash>(config); const delta: DeltaOrderHandlers<TxHash> = constructAllDeltaOrdersHandlers<TxHash>(config); const quote = constructGetQuote(config); return { swap, otcOrders, delta, quote, apiURL: options.apiURL ?? API_URL, chainId: options.chainId, version: options.version ?? DEFAULT_VERSION, }; } function constructSimpleContractCaller( providerOptions: ProviderOptions ): ContractCallerFunctions<TxHash> { if ('ethersProviderOrSigner' in providerOptions) { const { staticCall, transactCall: _transactCall, signTypedDataCall, } = constructEthersV5ContractCaller( providerOptions, providerOptions.account ); const transactCall: TransactionContractCallerFn<TxHash> = async ( params ) => { const contractTx = await _transactCall(params); // as soon as tx is sent // returning tx hash, it's up to the user to wait for tx return contractTx.hash as TxHash; }; return { staticCall, transactCall, signTypedDataCall }; } if ('ethersV6ProviderOrSigner' in providerOptions) { const { staticCall, transactCall: _transactCall, signTypedDataCall, } = constructEthersV6ContractCaller( providerOptions, providerOptions.account ); const transactCall: TransactionContractCallerFn<TxHash> = async ( params ) => { const contractTx = await _transactCall(params); // as soon as tx is sent // returning tx hash, it's up to the user to wait for tx return contractTx.hash as TxHash; }; return { staticCall, transactCall, signTypedDataCall }; } if ('viemClient' in providerOptions) { const contractCaller = constructViemContractCaller( providerOptions.viemClient, providerOptions.account ); return contractCaller; } const { staticCall, transactCall: _transactCall, signTypedDataCall, } = constructWeb3ContractCaller( providerOptions.web3, providerOptions.account ); const transactCall: TransactionContractCallerFn<TxHash> = async (params) => { const unpromiEvent = await _transactCall(params); // as soon as tx is sent // returning tx hash, it's up to the user to wait for tx return new Promise<TxHash>((resolve, reject) => { unpromiEvent.once('transactionHash', (hash) => resolve(hash as TxHash)); unpromiEvent.once('error', reject); }); }; return { staticCall, transactCall, signTypedDataCall }; }