transferTokenOffChain method
Implementation
Future<Map<String, dynamic>> transferTokenOffChain(
String walletAddress,
String tokenAddress,
String receiverAddress,
String tokensAmount, {
String? network,
String? externalId,
}) async {
EthereumAddress wallet = EthereumAddress.fromHex(walletAddress);
EthereumAddress token = EthereumAddress.fromHex(tokenAddress);
EthereumAddress receiver = EthereumAddress.fromHex(receiverAddress);
dynamic tokenDetails = await getTokenDetails(tokenAddress);
int tokenDecimals = int.parse(tokenDetails["decimals"].toString());
String tokenSymbol = tokenDetails["symbol"];
Decimal tokensAmountDecimal = Decimal.parse(tokensAmount);
Decimal decimals = Decimal.parse(pow(10, tokenDecimals).toString());
BigInt amount = BigInt.parse((tokensAmountDecimal * decimals).toString());
String nonce = await getNonceForRelay();
DeployedContract contract = await _contract(
'TransferManager',
_transferManagerContractAddress,
);
Uint8List data = contract.function('transferToken').encodeCall([
wallet,
token,
receiver,
amount,
hexToBytes('0x'),
]);
String encodedData = '0x' + HEX.encode(data);
String signature = await signOffChain(
_transferManagerContractAddress,
walletAddress,
BigInt.from(0),
encodedData,
nonce,
BigInt.from(0),
BigInt.from(_defaultGasLimit),
);
return {
"walletAddress": walletAddress,
"methodData": encodedData,
"nonce": nonce,
"communityAddress": _defaultCommunityContractAddress,
"network": network,
"methodName": "transferToken",
"gasPrice": 0,
"gasLimit": _defaultGasLimit,
"signature": signature,
"walletModule": "TransferManager",
"externalId": externalId,
"transactionBody": {
"tokenAddress": tokenAddress,
"from": walletAddress,
"to": receiverAddress,
"value": amount.toString(),
"asset": tokenSymbol,
"status": 'pending',
'type': 'SEND',
'tokenName': tokenDetails['name'],
'tokenDecimal': tokenDecimals,
'tokenSymbol': tokenSymbol,
},
};
}