transferTokenOffChain method

Future<Map<String, dynamic>> transferTokenOffChain(
  1. String walletAddress,
  2. String tokenAddress,
  3. String receiverAddress,
  4. String tokensAmount, {
  5. String? network,
  6. String? externalId,
})

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,
    },
  };
}