swapTokens method

Future<DC<Exception, Stream<SmartWalletEvent>>> swapTokens(
  1. EthPrivateKey credentials,
  2. TradeRequest tradeRequest
)

Implementation

Future<DC<Exception, Stream<SmartWalletEvent>>> swapTokens(
  EthPrivateKey credentials,
  TradeRequest tradeRequest,
) async {
  final response = await _tradeModule.quote(
    tradeRequest,
  );

  if (response.hasError) {
    return DC.error(response.error!);
  }

  final String data = strip0x(response.data!.data);
  final String spender = response.data!.to;
  final String sellTokenAddress = response.data!.sellTokenAddress;
  final String value = response.data!.value;

  final Map<String, dynamic> transactionBody = Map.from({
    "to": spender,
    "status": 'pending',
    "isSwap": true,
  });
  if (sellTokenAddress.toLowerCase() ==
      Variables.NATIVE_TOKEN_ADDRESS.toLowerCase()) {
    return callContract(
      credentials,
      spender,
      data,
      value: BigInt.parse(value),
      transactionBody: transactionBody,
    );
  } else {
    final tokenDetailsRes = await ContractsUtils.getERC20TokenDetails(
      web3client,
      EthereumAddress.fromHex(
        sellTokenAddress,
      ),
    );

    return approveTokenAndCallContract(
      credentials,
      sellTokenAddress,
      spender,
      AmountFormat.formatValue(
        tradeRequest.inputAmount,
        tokenDetailsRes.decimals,
      ),
      data,
      transactionBody: transactionBody,
    );
  }
}