transferToken method

Future<DC<Exception, Stream<SmartWalletEvent>>> transferToken(
  1. EthPrivateKey credentials,
  2. String tokenAddress,
  3. String recipientAddress,
  4. String value, {
  5. String transactionData = '0x',
  6. String? externalId,
})

Implementation

Future<DC<Exception, Stream<SmartWalletEvent>>> transferToken(
  EthPrivateKey credentials,
  String tokenAddress,
  String recipientAddress,
  String value, {
  String transactionData = '0x',
  String? externalId,
}) async {
  final tokenDetailsRes = await ContractsUtils.getERC20TokenDetails(
    web3client,
    EthereumAddress.fromHex(tokenAddress),
  );

  final BigInt amount = AmountFormat.toBigInt(
    value,
    tokenDetailsRes.decimals,
  );

  final String walletModule = 'TransferManager';
  final String methodName = 'transferToken';
  final String data = ContractsUtils.encodedDataForContractCall(
    walletModule,
    EthereumAddress.fromHex(smartWallet.walletModules.transferManager),
    methodName,
    [
      EthereumAddress.fromHex(smartWallet.smartWalletAddress),
      EthereumAddress.fromHex(tokenAddress),
      EthereumAddress.fromHex(recipientAddress),
      amount,
      hexToBytes(transactionData),
    ],
    include0x: true,
  );
  final String nonce = await _getNonce();
  final String signature = ContractsUtils.signOffChain(
    credentials,
    smartWallet.walletModules.transferManager,
    smartWallet.smartWalletAddress,
    data,
    nonce,
  );

  final Map<String, dynamic> txBody = Map.from({
    "status": 'pending',
    "from": smartWallet.smartWalletAddress,
    "to": recipientAddress,
    "value": amount.toString(),
    'type': 'SEND',
    "asset": tokenDetailsRes.symbol,
    'tokenName': tokenDetailsRes.name,
    "tokenSymbol": tokenDetailsRes.symbol,
    'tokenDecimal': tokenDetailsRes.decimals,
    'tokenAddress': tokenDetailsRes.address,
  });

  final Relay relayDto = Relay(
    walletModuleAddress: smartWallet.walletModules.transferManager,
    walletAddress: smartWallet.smartWalletAddress,
    data: data,
    nonce: nonce,
    methodName: methodName,
    signature: signature,
    walletModule: walletModule,
    transactionBody: txBody,
    externalId: externalId,
  );

  return _relay(relayDto);
}