transferOffChain method

Future<Map<String, dynamic>> transferOffChain(
  1. String walletAddress,
  2. String receiverAddress, {
  3. String? tokensAmount,
  4. BigInt? amountInWei,
  5. String network = "fuse",
  6. Map? transactionBody,
})

Implementation

Future<Map<String, dynamic>> transferOffChain(
  String walletAddress,
  String receiverAddress, {
  String? tokensAmount,
  BigInt? amountInWei,
  String network = "fuse",
  Map? transactionBody,
}) async {
  EthereumAddress wallet = EthereumAddress.fromHex(walletAddress);
  EthereumAddress token = EthereumAddress.fromHex(
    Variables.NATIVE_TOKEN_ADDRESS,
  );
  EthereumAddress receiver = EthereumAddress.fromHex(receiverAddress);
  BigInt amount = BigInt.zero;
  if (tokensAmount != null) {
    Decimal tokensAmountDecimal = Decimal.parse(tokensAmount);
    Decimal decimals = Decimal.parse(pow(10, 18).toString());
    amount = BigInt.parse((tokensAmountDecimal * decimals).toString());
  } else if (amountInWei != null) {
    amount = amountInWei;
  }

  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,
    "communityAddress": _defaultCommunityContractAddress,
    "nonce": nonce,
    "network": network,
    "methodName": "transferToken",
    "gasPrice": 0,
    "gasLimit": _defaultGasLimit,
    "signature": signature,
    "walletModule": "TransferManager",
    "transactionBody": transactionBody,
  };
}