createTransaction static method

Future<String> createTransaction(
  1. String from,
  2. String data,
  3. BigInt value,
  4. String to, {
  5. GasFeeLevel gasFeeLevel = GasFeeLevel.high,
})

Create transaction

from is public address

data is contract transaction parameter

value is native amount

to if it is a contract transaction, to is contract address, if it is a native transaciton, to is receiver address.

gasFeeLevel is gas fee level, default is high.

Implementation

static Future<String> createTransaction(
    String from, String data, BigInt value, String to,
    {GasFeeLevel gasFeeLevel = GasFeeLevel.high}) async {
  final valueHex = "0x${value.toRadixString(16)}";
  final gasLimit = await EvmService.ethEstimateGas(from, to, valueHex, data);

  final gasFees = await EvmService.suggestedGasFees();
  String level;

  switch (gasFeeLevel) {
    case GasFeeLevel.high:
      level = "high";
      break;

    case GasFeeLevel.medium:
      level = "medium";
      break;

    case GasFeeLevel.low:
      level = "low";
      break;
  }

  final maxFeePerGas = double.parse(gasFees[level]["maxFeePerGas"]);
  final maxFeePerGasHex =
      "0x${BigInt.from(maxFeePerGas * pow(10, 9)).toRadixString(16)}";

  final maxPriorityFeePerGas =
      double.parse(gasFees[level]["maxPriorityFeePerGas"]);
  final maxPriorityFeePerGasHex =
      "0x${BigInt.from(maxPriorityFeePerGas * pow(10, 9)).toRadixString(16)}";

  final chainId = await ParticleBase.getChainId();
  final chainInfo = ChainInfo.getEvmChain(chainId);

  if (chainInfo == null) {
    throw Exception("cant find chain info for chain id $chainId");
  }

  Map<String, dynamic> req;
  final isSupportEIP1559 = chainInfo.isEIP1559Supported();
  // evm transaction
  if (isSupportEIP1559) {
    req = {
      "from": from,
      "to": to,
      "gasLimit": gasLimit,
      "value": valueHex,
      "maxFeePerGas": maxFeePerGasHex,
      "maxPriorityFeePerGas": maxPriorityFeePerGasHex,
      "data": data,
      "type": "0x2",
      "nonce": "0x0",
      "chainId": "0x${chainId.toRadixString(16)}",
    };
  } else {
    req = {
      "from": from,
      "to": to,
      "gasLimit": gasLimit,
      "value": valueHex,
      "gasPrice": maxFeePerGasHex,
      "data": data,
      "type": "0x0",
      "nonce": "0x0",
      "chainId": "0x${chainId.toRadixString(16)}",
    };
  }

  final reqStr = jsonEncode(req);
  final reqHex = StringUtils.toHexString(reqStr);

  return "0x$reqHex";
}