/** * @file EthersService * @version 1.0.0 * @status STABLE - DO NOT MODIFY WITHOUT TESTS * @lastModified 2024-03-11 * * Service for interacting with Ethereum via ethers.js * * IMPORTANT: * - Any changes must be thoroughly tested * - Maintain backward compatibility with existing contracts * * Functionality: * - Ethereum account & network management * - Contract interaction * - Transaction processing * - ERC token standards support */ import { ethers } from "ethers"; import { ERC20Info, ERC721Info, NFTMetadata, ERC721TokenInfo, ERC1155TokenInfo, TokenOperationOptions } from "./erc/types.js"; export declare class EthersService { private _provider; private _signer?; constructor(provider?: ethers.Provider, signer?: ethers.Signer); get provider(): ethers.Provider; setProvider(provider: ethers.Provider): void; setSigner(signer: ethers.Signer): void; private getAlchemyApiKey; private createAlchemyProvider; private isValidRpcUrlFormat; private validateRpcUrl; private handleProviderError; private serializeValue; private getEthersNetworkName; private getProvider; getBalance(address: string, provider?: string, chainId?: number): Promise; getERC20Balance(address: string, tokenAddress: string, provider?: string, chainId?: number): Promise; getTransactionCount(address: string, provider?: string, chainId?: number): Promise; getBlockNumber(provider?: string, chainId?: number): Promise; getBlockDetails(blockTag: string | number, provider?: string, chainId?: number): Promise; getTransactionDetails(txHash: string, provider?: string, chainId?: number): Promise; getGasPrice(provider?: string, chainId?: number): Promise; getFeeData(provider?: string, chainId?: number): Promise; getContractCode(address: string, provider?: string, chainId?: number): Promise; lookupAddress(address: string, provider?: string, chainId?: number): Promise; resolveName(name: string, provider?: string, chainId?: number): Promise; formatEther(wei: string | number | bigint): string; parseEther(ether: string): bigint; formatUnits(value: string | number | bigint, unit: string | number): string; parseUnits(value: string, unit: string | number): bigint; private getSigner; createTransaction(to: string, value: string, data?: string, provider?: string): Promise; estimateGas(tx: ethers.TransactionRequest, provider?: string): Promise; sendTransaction(toOrTx: string | ethers.TransactionRequest, value?: string, data?: string, provider?: string): Promise; signMessage(message: string, provider?: string): Promise; /** * Signs data using the Ethereum eth_sign method (legacy) * Note: This method is less secure than signMessage (personal_sign) as it can sign transaction-like data * * @param data The data to sign (as a hex string) * @param provider Optional provider name or URL * @returns The signature as a hexadecimal string */ ethSign(data: string, provider?: string): Promise; contractCall(contractAddress: string, abi: string | Array, method: string, args?: any[], provider?: string, chainId?: number): Promise; contractCallView(contractAddress: string, abi: string | Array, method: string, args?: any[], provider?: string, chainId?: number): Promise; contractCallWithEstimate(contractAddress: string, abi: string, method: string, args?: any[], value?: string, provider?: string): Promise; contractCallWithOverrides(contractAddress: string, abi: string, method: string, args?: any[], value?: string, provider?: string, overrides?: ethers.Overrides): Promise; contractSendTransaction(contractAddress: string, abi: string, method: string, args?: any[], value?: string, provider?: string, overrides?: ethers.Overrides): Promise; contractSendTransactionWithEstimate(contractAddress: string, abi: string, method: string, args: any[], value?: string, provider?: string): Promise; contractSendTransactionWithOverrides(contractAddress: string, abi: string, method: string, args: any[], value?: string, provider?: string, overrides?: ethers.Overrides): Promise; sendRawTransaction(signedTransaction: string, provider?: string): Promise; private formatEvent; private serializeEventArgs; queryLogs(address?: string, topics?: Array>, fromBlock?: string | number, toBlock?: string | number, provider?: string, chainId?: number): Promise; contractEvents(contractAddress: string, abi: string | Array, eventName?: string, topics?: Array>, fromBlock?: string | number, toBlock?: string | number, provider?: string, chainId?: number): Promise; sendTransactionWithOptions(toOrTx: string | ethers.TransactionRequest, value?: string, data?: string, gasLimit?: string, gasPrice?: string, nonce?: number, provider?: string, chainId?: number, signerOverride?: ethers.Signer): Promise; getSupportedNetworks(): Array<{ name: string; chainId?: number; isTestnet?: boolean; nativeCurrency?: { name: string; symbol: string; decimals: number; }; isDefault?: boolean; }>; getWalletInfo(provider?: string): Promise<{ address: string; } | null>; /** * Get the current wallet signer * * @param provider Optional provider to connect the signer to * @returns The ethers wallet signer or null if no wallet is set */ getWallet(provider?: string): Promise; getChainIdFromTransaction(txHash: string, provider?: string): Promise; getTransactionsByBlock(blockTag: string | number, provider?: string, chainId?: number): Promise; /** * Get basic information about an ERC20 token * * @param tokenAddress Token contract address * @param provider Optional provider name or instance * @param chainId Optional chain ID * @returns Promise with token information */ getERC20TokenInfo(tokenAddress: string, provider?: string, chainId?: number): Promise; /** * Get the allowance amount approved for a spender * * @param tokenAddress ERC20 token contract address * @param ownerAddress Token owner address * @param spenderAddress Spender address * @param provider Optional provider name or instance * @param chainId Optional chain ID * @returns Promise with formatted allowance as string */ getERC20Allowance(tokenAddress: string, ownerAddress: string, spenderAddress: string, provider?: string, chainId?: number): Promise; /** * Transfer ERC20 tokens to a recipient * * @param tokenAddress ERC20 token contract address * @param recipientAddress Recipient address * @param amount Amount to transfer in token units (e.g., "1.5" not wei) * @param provider Optional provider name or instance * @param chainId Optional chain ID * @param options Optional transaction options * @returns Promise with transaction response */ transferERC20(tokenAddress: string, recipientAddress: string, amount: string, provider?: string, chainId?: number, options?: TokenOperationOptions): Promise; /** * Approve a spender to use ERC20 tokens * * @param tokenAddress ERC20 token contract address * @param spenderAddress Spender address to approve * @param amount Amount to approve in token units (e.g., "1.5" not wei) * @param provider Optional provider name or instance * @param chainId Optional chain ID * @param options Optional transaction options * @returns Promise with transaction response */ approveERC20(tokenAddress: string, spenderAddress: string, amount: string, provider?: string, chainId?: number, options?: TokenOperationOptions): Promise; /** * Transfer ERC20 tokens from one address to another (requires approval) * * @param tokenAddress ERC20 token contract address * @param senderAddress Address to transfer from * @param recipientAddress Recipient address * @param amount Amount to transfer in token units (e.g., "1.5" not wei) * @param provider Optional provider name or instance * @param chainId Optional chain ID * @param options Optional transaction options * @returns Promise with transaction response */ transferFromERC20(tokenAddress: string, senderAddress: string, recipientAddress: string, amount: string, provider?: string, chainId?: number, options?: TokenOperationOptions): Promise; /** * Get basic information about an ERC721 NFT collection * * @param contractAddress NFT contract address * @param provider Optional provider name or instance * @param chainId Optional chain ID * @returns Promise with NFT collection information */ getERC721CollectionInfo(contractAddress: string, provider?: string, chainId?: number): Promise; /** * Get the owner of a specific NFT * * @param contractAddress NFT contract address * @param tokenId Token ID to check ownership * @param provider Optional provider name or instance * @param chainId Optional chain ID * @returns Promise with owner address */ getERC721Owner(contractAddress: string, tokenId: string | number, provider?: string, chainId?: number): Promise; /** * Get and parse metadata for a specific NFT * * @param contractAddress NFT contract address * @param tokenId Token ID * @param provider Optional provider name or instance * @param chainId Optional chain ID * @returns Promise with parsed metadata */ getERC721Metadata(contractAddress: string, tokenId: string | number, provider?: string, chainId?: number): Promise; /** * Get all NFTs owned by an address * * @param contractAddress NFT contract address * @param ownerAddress Owner address to check * @param includeMetadata Whether to include metadata * @param provider Optional provider name or instance * @param chainId Optional chain ID * @returns Promise with array of owned NFTs */ getERC721TokensOfOwner(contractAddress: string, ownerAddress: string, includeMetadata?: boolean, provider?: string, chainId?: number): Promise; /** * Transfer an NFT to a new owner * * @param contractAddress NFT contract address * @param toAddress Recipient address * @param tokenId Token ID to transfer * @param provider Optional provider name or instance * @param chainId Optional chain ID * @param options Optional transaction options * @returns Promise with transaction response */ transferERC721(contractAddress: string, toAddress: string, tokenId: string | number, provider?: string, chainId?: number, options?: TokenOperationOptions): Promise; /** * Safely transfer an NFT to a new owner * * @param contractAddress NFT contract address * @param toAddress Recipient address * @param tokenId Token ID to transfer * @param data Optional data to include * @param provider Optional provider name or instance * @param chainId Optional chain ID * @param options Optional transaction options * @returns Promise with transaction response */ safeTransferERC721(contractAddress: string, toAddress: string, tokenId: string | number, data?: string, provider?: string, chainId?: number, options?: TokenOperationOptions): Promise; /** * Get token balance for a specific ERC1155 token ID * * @param contractAddress ERC1155 contract address * @param ownerAddress Owner address to check * @param tokenId Token ID to check balance * @param provider Optional provider name or instance * @param chainId Optional chain ID * @returns Promise with token balance as string */ getERC1155Balance(contractAddress: string, ownerAddress: string, tokenId: string | number, provider?: string, chainId?: number): Promise; /** * Get token balances for multiple ERC1155 token IDs at once * * @param contractAddress ERC1155 contract address * @param ownerAddresses Array of owner addresses * @param tokenIds Array of token IDs * @param provider Optional provider name or instance * @param chainId Optional chain ID * @returns Promise with array of token balances */ getERC1155BatchBalances(contractAddress: string, ownerAddresses: string[], tokenIds: (string | number)[], provider?: string, chainId?: number): Promise; /** * Get and parse metadata for a specific ERC1155 token * * @param contractAddress ERC1155 contract address * @param tokenId Token ID to get metadata for * @param provider Optional provider name or instance * @param chainId Optional chain ID * @returns Promise with token metadata */ getERC1155Metadata(contractAddress: string, tokenId: string | number, provider?: string, chainId?: number): Promise; /** * Get all ERC1155 tokens owned by an address * * @param contractAddress ERC1155 contract address * @param ownerAddress Owner address to check * @param tokenIds Optional array of specific token IDs to check * @param includeMetadata Whether to include metadata * @param provider Optional provider name or instance * @param chainId Optional chain ID * @returns Promise with array of token info */ getERC1155TokensOfOwner(contractAddress: string, ownerAddress: string, tokenIds?: (string | number)[], includeMetadata?: boolean, provider?: string, chainId?: number): Promise; /** * Safely transfer ERC1155 tokens to another address * * @param contractAddress ERC1155 contract address * @param fromAddress Sender address * @param toAddress Recipient address * @param tokenId Token ID to transfer * @param amount Amount to transfer * @param data Additional data to include with the transfer * @param provider Optional provider name or instance * @param chainId Optional chain ID * @param options Optional transaction options * @returns Promise with transaction response */ safeTransferERC1155(contractAddress: string, fromAddress: string, toAddress: string, tokenId: string | number, amount: string, data?: string, provider?: string, chainId?: number, options?: TokenOperationOptions): Promise; /** * Safely transfer multiple ERC1155 tokens in a batch * * @param contractAddress ERC1155 contract address * @param fromAddress Sender address * @param toAddress Recipient address * @param tokenIds Array of token IDs to transfer * @param amounts Array of amounts to transfer * @param data Additional data to include with the transfer * @param provider Optional provider name or instance * @param chainId Optional chain ID * @param options Optional transaction options * @returns Promise with transaction response */ safeBatchTransferERC1155(contractAddress: string, fromAddress: string, toAddress: string, tokenIds: (string | number)[], amounts: string[], data?: string, provider?: string, chainId?: number, options?: TokenOperationOptions): Promise; /** * Get wallet balance in ETH * * @param address Address to check balance for * @param provider Optional provider or network name * @param chainId Optional chain ID * @returns Formatted balance string in ETH */ getWalletBalance(address: string, provider?: string, chainId?: number): Promise; }