transferToken method
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);
}