UNPKG

@xchainjs/xchain-evm

Version:
294 lines (293 loc) 14 kB
import { AssetInfo, BaseXChainClient, ExplorerProviders, FeeRates, Fees, Network, PreparedTx, Protocol, TxHash, TxHistoryParams, XChainClientParams } from '@xchainjs/xchain-client'; import { EvmOnlineDataProviders } from '@xchainjs/xchain-evm-providers'; import { Address, Asset, Chain, TokenAsset } from '@xchainjs/xchain-util'; import { Provider } from 'ethers'; import BigNumber from 'bignumber.js'; import { ApproveParams, Balance, CallParams, EstimateApproveParams, EstimateCallParams, EvmDefaults, FeesWithGasPricesAndLimits, GasPrices, ISigner, IsApprovedParams, Tx, TxParams, TxsPage } from '../types'; export interface EVMClient { approve(params: ApproveParams): Promise<string>; awaitTxConfirmed(hash: string): Promise<void>; } /** * Parameters for configuring the EVM client. */ export type EVMClientParams = XChainClientParams & { chain: Chain; gasAsset: Asset; gasAssetDecimals: number; defaults: Record<Network, EvmDefaults>; providers: Record<Network, Provider>; explorerProviders: ExplorerProviders; dataProviders: EvmOnlineDataProviders[]; signer?: ISigner; }; /** * Custom EVM client class. */ export declare class Client extends BaseXChainClient implements EVMClient { readonly config: Omit<EVMClientParams, 'signer'>; protected signer?: ISigner; protected defaults: Record<Network, EvmDefaults>; private cachedNetworkId; /** * Constructor for the EVM client. * @param {EVMClientParams} params - Parameters for configuring the EVM client. */ constructor({ chain, gasAsset, gasAssetDecimals, defaults, network, feeBounds, providers, rootDerivationPaths, explorerProviders, dataProviders, signer, }: EVMClientParams); /** * Retrieves the Ethereum Provider interface. * @returns {Provider} The current Ethereum Provider interface. */ getProvider(): Provider; /** * Retrieves the explorer URL based on the current network. * @returns {string} The explorer URL for Ethereum based on the current network. */ getExplorerUrl(): string; /** * Retrieves asset information. * @returns {AssetInfo} Asset information containing the asset and its decimal places. */ getAssetInfo(): AssetInfo; /** * Retrieves the explorer URL for a given address. * @param {Address} address - The address to retrieve the explorer URL for. * @returns {string} The explorer URL for the given address. */ getExplorerAddressUrl(address: Address): string; /** * Retrieves the explorer URL for a given transaction ID. * @param {string} txID - The transaction ID to retrieve the explorer URL for. * @returns {string} The explorer URL for the given transaction ID. */ getExplorerTxUrl(txID: string): string; /** * Sets or updates the current network. * @param {Network} network - The network to set or update. * @returns {void} * @throws {"Network must be provided"} Thrown if the network has not been set before. */ setNetwork(network: Network): void; /** * @throws {Error} Method not implement */ getAddress(): string; getAddressAsync(walletIndex?: number, verify?: boolean): Promise<string>; /** * Validate the given address. * * @param {Address} address * @returns {boolean} `true` or `false` */ validateAddress(address: Address): boolean; /** * Retrieves the balance of a given address. * @param {Address} address - The address to retrieve the balance for. * @param {Asset[]} assets - Assets to retrieve the balance for (optional). * @returns {Promise<Balance[]>} An array containing the balance of the address. * @throws {"Invalid asset"} Thrown when the provided asset is invalid. */ getBalance(address: Address, assets?: TokenAsset[]): Promise<Balance[]>; /** * Retrieves the transaction history of a given address with pagination options. * @param {TxHistoryParams} params - Options to get transaction history (optional). * @returns {Promise<TxsPage>} The transaction history. */ getTransactions(params?: TxHistoryParams): Promise<TxsPage>; /** * Retrieves the transaction details of a given transaction ID. * @param {string} txId - The transaction ID. * @param {string} assetAddress - The asset address (optional). * @returns {Promise<Tx>} The transaction details of the given transaction ID. * @throws {"Need to provide valid txId"} Thrown if the provided transaction ID is invalid. */ getTransactionData(txId: string, assetAddress?: Address): Promise<Tx>; /** * Estimates the gas required for calling a contract function. * @param {Address} contractAddress The contract address. * @param {ContractInterface} abi The contract ABI json. * @param {string} funcName The function to be called. * @param {any[]} funcParams The parameters of the function. * @param {number} walletIndex (optional) HD wallet index * @param {EstimateCallParams} params - Parameters for estimating gas. * @returns {BigNumber} The estimated gas required for the contract function call. */ estimateCall({ contractAddress, abi, funcName, funcParams }: EstimateCallParams): Promise<BigNumber>; /** * Check allowance. * * @param {Address} contractAddress The contract address. * @param {Address} spenderAddress The spender address. * @param {BaseAmount} amount The amount to check if it's allowed to spend or not (optional). * @param {number} walletIndex (optional) HD wallet index * @param {IsApprovedParams} params - Parameters for checking allowance. * @returns {boolean} `true` if the allowance is approved, `false` otherwise. */ isApproved({ contractAddress, spenderAddress, amount, walletIndex }: IsApprovedParams): Promise<boolean>; /** * Estimates the gas required for approving an allowance. * * @param {EstimateApproveParams} params - Parameters for estimating gas. * @param {Address} contractAddress The contract address. * @param {Address} spenderAddress The spender address. * @param {Address} fromAddress The address the approve transaction is sent from. * @param {BaseAmount} amount The amount of token. By default, it will be unlimited token allowance. (optional) * * @returns {BigNumber} The estimated gas required for the approval. */ estimateApprove({ fromAddress, contractAddress, spenderAddress, amount, }: EstimateApproveParams): Promise<BigNumber>; /** * Broadcasts a transaction. * @param {string} txHex - The transaction in hexadecimal format. * @returns {Promise<TxHash>} The transaction hash. */ broadcastTx(txHex: string): Promise<TxHash>; /** * Estimates gas prices (average, fast, fastest) for a transaction. * @param {Protocol} protocol The protocol to use for estimating gas prices. * @returns {GasPrices} The gas prices (average, fast, fastest) in `Wei` (`BaseAmount`) */ estimateGasPrices(protocol?: Protocol): Promise<GasPrices>; /** * Estimates gas limit for a transaction. * * @param {TxParams} params The transaction and fees options. * @returns {BaseAmount} The estimated gas limit. * @throws Error Thrown if address could not be parsed from the given ERC20 asset. */ estimateGasLimit({ asset, recipient, amount, memo, from, isMemoEncoded, }: TxParams & { from?: Address; }): Promise<BigNumber>; /** * Checks if the given asset matches the gas asset. * * @param {Asset} asset - The asset to check. * @returns {boolean} True if the asset matches the gas asset, false otherwise. */ private isGasAsset; /** * Estimates gas prices/limits (average, fast, fastest) and fees for a transaction. * * @param {TxParams} params The transaction parameters. * @returns {FeesWithGasPricesAndLimits} The estimated gas prices/limits and fees. */ estimateFeesWithGasPricesAndLimits(params: TxParams): Promise<FeesWithGasPricesAndLimits>; /** * Wait until tx is confirmed * @param {string} hash - tx's hash */ awaitTxConfirmed(hash: string): Promise<void>; /** * Get transaction fees. * * @param {TxParams} params - The transaction parameters. * @returns {Fees} The average, fast, and fastest fees. * @throws {"Params need to be passed"} Thrown if parameters are not provided. */ getFees(): never; getFees(params: TxParams): Promise<Fees>; /** * Retrieves the balance of an address by round-robin querying multiple data providers. * * @param {Address} address - The address to query the balance for. * @param {Asset[]} [assets] - Optional list of assets to query the balance for. * @returns {Promise<Balance[]>} The balance information for the address. * @throws Error Thrown if no provider is able to retrieve the balance. */ protected roundRobinGetBalance(address: Address, assets?: TokenAsset[]): Promise<Balance[]>; /** * Retrieves transaction data by round-robin querying multiple data providers. * * @param {string} txId - The transaction ID. * @param {string} [assetAddress] - Optional asset address. * @returns {Promise<Tx>} The transaction data. * @throws Error Thrown if no provider is able to retrieve the transaction data. */ protected roundRobinGetTransactionData(txId: string, assetAddress?: string): Promise<Tx>; /** * Retrieves transaction history by round-robin querying multiple data providers. * * @param {TxHistoryParams} params - The transaction history parameters. * @returns {Promise<TxsPage>} The transaction history. * @throws Error Thrown if no provider is able to retrieve the transaction history. */ protected roundRobinGetTransactions(params: TxHistoryParams): Promise<TxsPage>; /** * Retrieves fee rates by round-robin querying multiple data providers. * * @returns {Promise<FeeRates>} The fee rates. * @throws Error Thrown if no provider is able to retrieve the fee rates. */ protected roundRobinGetFeeRates(): Promise<FeeRates>; /** * Prepares a transaction for transfer. * * @param {TxParams&Address&FeeOption&BaseAmount&BigNumber} params - The transfer options. * @returns {Promise<PreparedTx>} The raw unsigned transaction. * @throws Error Thrown if the provided asset chain does not match the client's chain, or if any of the addresses are invalid. */ prepareTx({ sender, asset, memo, amount, recipient, isMemoEncoded, }: TxParams & { sender: Address; }): Promise<PreparedTx>; /** * Prepares an approval transaction. * * @param {ApproveParams&Address&FeeOption&BaseAmount&BigNumber} params - The approval options. * @returns {Promise<PreparedTx>} The raw unsigned transaction. * @throws Error Thrown if any of the addresses are invalid. */ prepareApprove({ contractAddress, spenderAddress, amount, sender, }: ApproveParams & { sender: string; }): Promise<PreparedTx>; /** * Call a contract function. * @param {signer} Signer (optional) The address a transaction is send from. If not set, signer will be defined based on `walletIndex` * @param {Address} contractAddress The contract address. * @param {number} walletIndex (optional) HD wallet index * @param {ContractInterface} abi The contract ABI json. * @param {string} funcName The function to be called. * @param {unknown[]} funcParams (optional) The parameters of the function. * @param {CallParams} params - Parameters for calling the contract function. * @returns {T} The result of the contract function call.. */ call<T>({ contractAddress, abi, funcName, funcParams, signer }: CallParams): Promise<T>; /** * Transfers ETH or ERC20 token * * Note: A given `feeOption` wins over `gasPrice` and `gasLimit` * * @param {TxParams} params The transfer options. * @param {feeOption} FeeOption Fee option (optional) * @param {gasPrice} BaseAmount Gas price (optional) * @param {maxFeePerGas} BaseAmount Optional. Following EIP-1559, maximum fee per gas. Parameter not compatible with gasPrice * @param {maxPriorityFeePerGas} BaseAmount Optional. Following EIP-1559, maximum priority fee per gas. Parameter not compatible with gasPrice * @param {gasLimit} BigNumber Gas limit (optional) * @throws Error Thrown if address of given `Asset` could not be parsed * @throws {Error} Error thrown if not compatible fee parameters are provided * @returns {TxHash} The transaction hash. */ transfer({ walletIndex, asset, memo, amount, recipient, feeOption, gasPrice, maxFeePerGas, maxPriorityFeePerGas, gasLimit, isMemoEncoded, }: TxParams): Promise<string>; /** * Approves an allowance for spending tokens. * * @param {ApproveParams} params - Parameters for approving an allowance. * @param {Address} contractAddress The contract address. * @param {Address} spenderAddress The spender address. * @param {feeOption} FeeOption Fee option (optional) * @param {BaseAmount} amount The amount of token. By default, it will be unlimited token allowance. (optional) * @param {number} walletIndex (optional) HD wallet index * @returns {TransactionResponse} The result of the approval transaction. * @throws Error If gas estimation fails. */ approve({ contractAddress, spenderAddress, feeOption, amount, walletIndex, }: ApproveParams): Promise<string>; /** * Purge client */ purgeClient(): void; /** * Get the account signer the client is using * @returns {ISigner} * @throws {Error} if the client is not using an account */ protected getSigner(): ISigner; }