import { encodeFunctionData } from 'viem' import type { EVMGasConfig, EVMNativeTransferRequest, EVMContractCallRequest, EVMTransactionParams, EVMDataTransferRequest } from '@meshconnect/uwc-types' import { parseError } from '../../utils/error-utils' /** * Service for handling Ethereum/EVM transaction operations */ export class EthereumTransactionBuilder { async getContractTransaction( request: EVMContractCallRequest ): Promise { try { // Encode function data using viem const data = encodeFunctionData({ abi: request.abi, functionName: request.functionName, args: request.args || [] }) const txRequest: EVMTransactionParams = { to: request.contractAddress, data, value: request.value ?? 0n, ...this.formatGasConfig(request.gasConfig) } return txRequest } catch (error) { parseError(error) } } async getNativeTransaction( request: EVMNativeTransferRequest ): Promise { try { return { to: request.to, value: request.amount, ...this.formatGasConfig(request.gasConfig) } } catch (error) { parseError(error) } } async getDataTransaction( request: EVMDataTransferRequest ): Promise { try { const txRequest: EVMTransactionParams = { to: request.to, data: request.data, value: request.value ?? 0n, ...this.formatGasConfig(request.gasConfig) } return txRequest } catch (error) { parseError(error) } } /** * Helper to format gas configuration for viem */ private formatGasConfig( gasConfig?: EVMGasConfig ): Partial { const txOptions: Partial = {} if (gasConfig?.gasLimit) { txOptions.gasLimit = BigInt(Math.floor(gasConfig.gasLimit)) } if (gasConfig?.maxFeePerGas) { txOptions.maxFeePerGas = BigInt(Math.floor(gasConfig.maxFeePerGas)) } if (gasConfig?.maxPriorityFeePerGas) { txOptions.maxPriorityFeePerGas = BigInt( Math.floor(gasConfig.maxPriorityFeePerGas) ) } return txOptions } }